cra.ge 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -1
- data/bin/compile.sh +1 -0
- data/bin/cra.cs +45 -0
- data/bin/cra.exe +0 -0
- data/cra.gemspec +6 -2
- data/lib/cra/address.rb +18 -0
- data/lib/cra/address_info.rb +15 -0
- data/lib/cra/address_node.rb +26 -0
- data/lib/cra/base.rb +118 -0
- data/lib/cra/config.rb +4 -1
- data/lib/cra/passport_info.rb +115 -0
- data/lib/cra/person_at_address.rb +37 -0
- data/lib/cra/services.rb +112 -39
- data/lib/cra/version.rb +1 -1
- data/lib/cra.rb +8 -32
- data/spec/address_spec.rb +131 -0
- data/spec/config_spec.rb +6 -2
- data/spec/passport_spec.rb +90 -0
- data/spec/spec_helper.rb +1 -11
- metadata +52 -11
- data/lib/cra/pasport_info.rb +0 -100
- data/spec/experimental_spec.rb +0 -11
- data/spec/service_spec.rb +0 -87
data/.gitignore
CHANGED
data/bin/compile.sh
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
gmcs bin/cra.cs -reference:System.Security
|
data/bin/cra.cs
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Xml;
|
3
|
+
using System.Security.Cryptography.X509Certificates;
|
4
|
+
using System.Security.Cryptography;
|
5
|
+
|
6
|
+
using System.Security.Cryptography.Xml;
|
7
|
+
using Mono.Security;
|
8
|
+
|
9
|
+
class Program
|
10
|
+
{
|
11
|
+
static void Main(string[] args) {
|
12
|
+
if (args.Length != 4) {
|
13
|
+
Console.WriteLine("Usage: cra.exe cert-file cert-password input-path output-path");
|
14
|
+
return;
|
15
|
+
}
|
16
|
+
|
17
|
+
String certFile = args[0];
|
18
|
+
String password = args[1];
|
19
|
+
String input = args[2];
|
20
|
+
String output = args[3];
|
21
|
+
|
22
|
+
X509Certificate2 cert = new X509Certificate2(certFile, password, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
|
23
|
+
|
24
|
+
XmlDocument xmlDoc = new XmlDocument();
|
25
|
+
xmlDoc.Load(input);
|
26
|
+
|
27
|
+
var XmlToSign = new XmlDocument();
|
28
|
+
XmlToSign.LoadXml(xmlDoc.DocumentElement["Body"].OuterXml);
|
29
|
+
|
30
|
+
SignedXml signedXml = new SignedXml(XmlToSign);
|
31
|
+
signedXml.SigningKey = cert.PrivateKey;
|
32
|
+
|
33
|
+
Reference reference = new Reference();
|
34
|
+
reference.Uri = "";
|
35
|
+
|
36
|
+
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
|
37
|
+
reference.AddTransform(env);
|
38
|
+
|
39
|
+
signedXml.AddReference(reference);
|
40
|
+
signedXml.ComputeSignature();
|
41
|
+
XmlElement xmlDigitalSignature = signedXml.GetXml();
|
42
|
+
xmlDoc.DocumentElement["Body"].AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
|
43
|
+
xmlDoc.Save(output);
|
44
|
+
}
|
45
|
+
}
|
data/bin/cra.exe
ADDED
Binary file
|
data/cra.gemspec
CHANGED
@@ -13,10 +13,14 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.homepage = "http://github.com/dimakura/cra.ge"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
# gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.executables << 'cra.exe'
|
17
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
19
|
gem.require_paths = ["lib"]
|
19
20
|
|
20
21
|
gem.add_development_dependency 'rspec', '~> 2.11'
|
21
|
-
gem.add_runtime_dependency '
|
22
|
+
gem.add_runtime_dependency 'activesupport', '~> 3.2'
|
23
|
+
gem.add_runtime_dependency 'rest-client', '~> 1.6'
|
24
|
+
gem.add_runtime_dependency 'builder', '~> 3.0'
|
25
|
+
gem.add_runtime_dependency 'bundler', '~> 1.2'
|
22
26
|
end
|
data/lib/cra/address.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class CRA::Address
|
3
|
+
attr_accessor :id, :name, :old_name, :active
|
4
|
+
|
5
|
+
def self.list_from_hash(hash)
|
6
|
+
addresses = []
|
7
|
+
hash.each do |res|
|
8
|
+
address = CRA::Address.new
|
9
|
+
address.id = res['ID'].to_i
|
10
|
+
address.name = res['Name']
|
11
|
+
address.old_name = res['OldName']
|
12
|
+
address.active = res['Status'] == 'true'
|
13
|
+
addresses << address
|
14
|
+
end
|
15
|
+
addresses
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class CRA::AddressInfo
|
3
|
+
attr_accessor :id, :address, :path, :region_id, :region_name
|
4
|
+
|
5
|
+
def self.init_from_hash(hash)
|
6
|
+
address = CRA::AddressInfo.new
|
7
|
+
address.id = hash['ID'].to_i
|
8
|
+
address.address = hash['Name']
|
9
|
+
address.path = hash['Path'].split('|').map{ |p| p.to_i }
|
10
|
+
address.region_id = hash['RegionID'].to_i
|
11
|
+
address.region_name = hash['RegionName']
|
12
|
+
address
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class CRA::AddressNode
|
3
|
+
attr_accessor :id, :description, :description_full, :address
|
4
|
+
attr_accessor :identificator, :identificator_text
|
5
|
+
attr_accessor :identificator_type, :identificator_type_text
|
6
|
+
attr_accessor :active
|
7
|
+
|
8
|
+
def self.list_from_hash(hash)
|
9
|
+
nodes = []
|
10
|
+
hash.each do |res|
|
11
|
+
node = CRA::AddressNode.new
|
12
|
+
node.id = res['ID'].to_i
|
13
|
+
node.description = res['Description']
|
14
|
+
node.description_full = res['FullDescription']
|
15
|
+
node.identificator = res['Identificator'].to_i
|
16
|
+
node.identificator_text = res['IdentificatorStr']
|
17
|
+
node.identificator_type = res['IdentificatorType'].to_i
|
18
|
+
node.identificator_type_text = res['IdentificatorTypeStr']
|
19
|
+
node.address = res['NodeAdress']
|
20
|
+
node.active = res['Status'].to_i == 1
|
21
|
+
nodes << node
|
22
|
+
end
|
23
|
+
nodes
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/lib/cra/base.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'builder'
|
3
|
+
require 'bundler/cli'
|
4
|
+
|
5
|
+
class CRA::Base
|
6
|
+
attr_accessor :last_action, :last_request, :last_response
|
7
|
+
|
8
|
+
def tokenize_service(service)
|
9
|
+
case service
|
10
|
+
when 'GetDataUsingCriteriaParameter'
|
11
|
+
'ძებნა სახელით და დაბ. დღით'
|
12
|
+
when 'GetDataUsingPrivateNumberAndIdCardParameter'
|
13
|
+
'ძებნა პირადობის მოწმობით'
|
14
|
+
when 'FetchPersonInfoByPassportNumberUsingCriteriaParameter'
|
15
|
+
'ძებნა პასპორტით'
|
16
|
+
else
|
17
|
+
service
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def gov_talk_request(options)
|
22
|
+
self.last_action = tokenize_service(options[:service])
|
23
|
+
self.last_request = options[:params]
|
24
|
+
# create xml
|
25
|
+
xml = xml_generation(options)
|
26
|
+
file1 = gen_filename
|
27
|
+
file2 = gen_filename
|
28
|
+
begin
|
29
|
+
# make signature
|
30
|
+
File.open(file1, 'w') do |f|
|
31
|
+
f.write(xml)
|
32
|
+
end
|
33
|
+
if File.exists?('bin/cra.exe')
|
34
|
+
path_to_exe = 'bin/cra.exe'
|
35
|
+
else
|
36
|
+
path_to_exe = "#{Bundler::CLI.new.send(:locate_gem, 'cra.ge')}/bin/cra.exe"
|
37
|
+
end
|
38
|
+
%x[ mono #{path_to_exe} '#{CRA.config.cert_file}' '#{CRA.config.cert_password}' '#{file1}' '#{file2}' ]
|
39
|
+
# send request
|
40
|
+
xml2 = File.read(file2)
|
41
|
+
response = RestClient.post CRA.config.url, xml2, :content_type => :xml
|
42
|
+
hash = Hash.from_xml(response.body)
|
43
|
+
# manage response
|
44
|
+
if hash['GovTalkMessage']['Header']['MessageDetails']['Qualifier'] == 'error'
|
45
|
+
ex_root = hash['GovTalkMessage']['GovTalkDetails']['GovTalkErrors']['Error']
|
46
|
+
ex_text = "#{ex_root['Type'].upcase}-#{ex_root['Number']}: #{ex_root['Text']}"
|
47
|
+
self.last_response = ex_text
|
48
|
+
raise CRA::ServiceException, ex_text
|
49
|
+
elsif hash['GovTalkMessage']['Body']['ErrorResult']
|
50
|
+
ex_root = hash['GovTalkMessage']['Body']['ErrorResult']
|
51
|
+
ex_text = "#{ex_root['Message']}"
|
52
|
+
self.last_response = ex_text
|
53
|
+
raise CRA::ServiceException, ex_text
|
54
|
+
end
|
55
|
+
hash['GovTalkMessage']['Body']
|
56
|
+
self.last_response = hash['GovTalkMessage']['Body']
|
57
|
+
ensure
|
58
|
+
FileUtils.rm(file1)
|
59
|
+
FileUtils.rm(file2)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def xml_generation(options)
|
66
|
+
service_name = options[:service]
|
67
|
+
class_name = options[:class]
|
68
|
+
message_name = options[:message]
|
69
|
+
params = options[:params]
|
70
|
+
xml = Builder::XmlMarkup.new( :indent => 2 )
|
71
|
+
xml.instruct! :xml, :encoding => 'utf-8'
|
72
|
+
xml.GovTalkMessage(xmlns: 'http://www.govtalk.gov.uk/CM/envelope') do |xml|
|
73
|
+
xml.EnvelopeVersion '2.0'
|
74
|
+
xml.Header do |xml|
|
75
|
+
xml.MessageDetails do |xml|
|
76
|
+
xml.Class class_name
|
77
|
+
xml.Qualifier 'request'
|
78
|
+
xml.Function 'submit'
|
79
|
+
end
|
80
|
+
xml.SenderDetails do |xml|
|
81
|
+
xml.IDAuthentication do |xml|
|
82
|
+
xml.SenderID CRA.config.user
|
83
|
+
xml.Authentication do |xml|
|
84
|
+
xml.Method 'clear'
|
85
|
+
xml.Value CRA.config.password
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
xml.Body do |xml|
|
91
|
+
xml.Message(xmlns: "urn:g3.ge:cra:call:#{message_name}:v1") do |xml|
|
92
|
+
xml.Data do |xml|
|
93
|
+
xml.Request do |xml|
|
94
|
+
if params.size < 2
|
95
|
+
params.each do |k, v|
|
96
|
+
xml.tag!(k, v)
|
97
|
+
end
|
98
|
+
else
|
99
|
+
xml.tag! service_name do |xml|
|
100
|
+
params.each do |k, v|
|
101
|
+
xml.tag!(k, v)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
xml.Thumbprint CRA.config.cert_trace
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def gen_filename
|
114
|
+
FileUtils.mkdir_p('tmp')
|
115
|
+
"tmp/#{Digest::MD5.hexdigest "#{Time.now}#{rand(100)}"}.xml"
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
data/lib/cra/config.rb
CHANGED
@@ -5,7 +5,10 @@ module CRA
|
|
5
5
|
|
6
6
|
class Config
|
7
7
|
include Singleton
|
8
|
-
attr_accessor :
|
8
|
+
attr_accessor :user, :password, :test_mode, :cert_file, :cert_password, :cert_trace
|
9
|
+
def url
|
10
|
+
self.test_mode ? 'https://test.submission.e-government.ge/submission' : 'https://submission.e-government.ge/submission'
|
11
|
+
end
|
9
12
|
end
|
10
13
|
|
11
14
|
class << self
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
class CRA::PassportInfo
|
5
|
+
DATE_FORMAT = '%Y-%m-%dT%H:%M:%S'
|
6
|
+
|
7
|
+
attr_accessor :doc_id, :doc_type, :doc_description, :doc_status, :doc_status_text
|
8
|
+
attr_accessor :is_id_card, :id_card_serial, :id_card_number, :id_card_issuer, :id_card_issue_date, :id_card_valid_date
|
9
|
+
attr_accessor :passport_number, :passport_issuer, :passport_issue_date, :passport_valid_date
|
10
|
+
attr_accessor :person_id, :social_id, :private_number
|
11
|
+
attr_accessor :first_name, :last_name, :middle_name
|
12
|
+
attr_accessor :birth_date, :birth_place
|
13
|
+
attr_accessor :gender
|
14
|
+
attr_accessor :citizenship, :citizenship_code, :second_citizenship, :second_citizenship_code
|
15
|
+
attr_accessor :living_place_id, :living_place, :living_place_registration, :living_place_registration_end, :actual_living_place
|
16
|
+
attr_accessor :region_id, :region_name
|
17
|
+
attr_accessor :response_id, :response_code
|
18
|
+
attr_accessor :is_person_dead, :is_document_lost
|
19
|
+
attr_accessor :photos
|
20
|
+
|
21
|
+
def self.extract_date(text)
|
22
|
+
DateTime.strptime(text.to_s, DATE_FORMAT)
|
23
|
+
rescue Exception => ex
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.eval_hash(hash)
|
27
|
+
if hash['PersonInfo']
|
28
|
+
CRA::PassportInfo.init_with_hash(hash)
|
29
|
+
elsif hash['ArrayOfPersonInfo']
|
30
|
+
CRA::PassportInfo.list_with_hash(hash)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.init_with_hash(hash)
|
35
|
+
hash = hash['PersonInfo'] || hash
|
36
|
+
passport = CRA::PassportInfo.new
|
37
|
+
passport.doc_id = hash['DocumentID'].to_i
|
38
|
+
passport.doc_type = hash['DocumentTypeID'].to_i
|
39
|
+
passport.doc_description = hash['DocumentDescription']
|
40
|
+
passport.doc_status = hash['DocumentStatusEnum']
|
41
|
+
passport.doc_status_text = hash['DocumentStatusStr']
|
42
|
+
passport.is_id_card = hash['IsIdCard'].downcase == 'true'
|
43
|
+
passport.id_card_serial = hash['IdCardSerial']
|
44
|
+
passport.id_card_number = hash['IdCardNumber']
|
45
|
+
passport.id_card_issuer = hash['IdCardIssuer']
|
46
|
+
passport.id_card_issue_date = extract_date(hash['IdCardIssueDate'])
|
47
|
+
passport.id_card_valid_date = extract_date(hash['IdCardValidDate'])
|
48
|
+
passport.passport_number = hash['PaspNumber'].strip if hash['PaspNumber']
|
49
|
+
passport.passport_issuer = hash['PaspIssuer'].strip if hash['PaspIssuer']
|
50
|
+
passport.passport_issue_date = extract_date(hash['PaspIssueDate'])
|
51
|
+
passport.passport_valid_date = extract_date(hash['PaspValidDate'])
|
52
|
+
passport.person_id = hash['PersonID'].to_i
|
53
|
+
# passport.social_id = hash[:social_id].to_i
|
54
|
+
passport.private_number = hash['PrivateNumber']
|
55
|
+
passport.first_name = hash['FirstName']
|
56
|
+
passport.last_name = hash['LastName']
|
57
|
+
passport.middle_name = hash['MiddleName']
|
58
|
+
passport.birth_date = extract_date(hash['BirthDate'])
|
59
|
+
passport.birth_place = hash['BirthPlace']
|
60
|
+
passport.gender = hash['Gender'].to_i
|
61
|
+
passport.citizenship = hash['Citizenship']
|
62
|
+
passport.citizenship_code = hash['CitizenshipCode']
|
63
|
+
passport.second_citizenship = hash['DoubleCitizenship'].strip if hash['DoubleCitizenship']
|
64
|
+
passport.second_citizenship_code = hash['DoubleCitizenshipCode']
|
65
|
+
passport.living_place_id = hash['LivingPlaceID'].to_i rescue nil
|
66
|
+
passport.living_place = hash['LivingPlace']
|
67
|
+
passport.actual_living_place = hash['FaLivingPlace'].strip if hash['FaLivingPlace']
|
68
|
+
passport.living_place = passport.living_place.split(' ').join(' ') if passport.living_place
|
69
|
+
passport.actual_living_place = passport.actual_living_place.split(' ').join(' ') if passport.actual_living_place
|
70
|
+
passport.living_place_registration = extract_date(hash['LivingPlaceRegDate'])
|
71
|
+
passport.living_place_registration_end = extract_date(hash['LivingPlaceRegEndDate'])
|
72
|
+
passport.region_id = hash['RegionID'].to_i
|
73
|
+
passport.region_name = hash['RegionStr']
|
74
|
+
passport.response_id = hash['ResponseID'].to_i
|
75
|
+
passport.is_person_dead = hash['IsPersonDead'] == 'true'
|
76
|
+
passport.is_document_lost = hash['IsDocumentLost'] == 'true'
|
77
|
+
passport.photos = []
|
78
|
+
if hash['Photos'] and hash['Photos'].is_a?(Array)
|
79
|
+
hash['Photos'].each do |photo|
|
80
|
+
passport.photos.push(photo['base64Binary'])
|
81
|
+
end
|
82
|
+
elsif hash['Photos']
|
83
|
+
passport.photos.push(hash['Photos']['base64Binary'])
|
84
|
+
end
|
85
|
+
passport
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.list_with_hash(hash)
|
89
|
+
documents = []
|
90
|
+
hash['ArrayOfPersonInfo']['PersonInfo'].each do |row|
|
91
|
+
documents << CRA::PassportInfo.init_with_hash(row)
|
92
|
+
end
|
93
|
+
documents
|
94
|
+
end
|
95
|
+
|
96
|
+
def full_name(opts = {})
|
97
|
+
if opts[:with_middle_name]
|
98
|
+
"#{first_name} #{last_name} #{middle_name}"
|
99
|
+
else
|
100
|
+
"#{first_name} #{last_name}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Returns binary content of the photo.
|
105
|
+
def binary(index)
|
106
|
+
Base64.decode64(self.photos[index])
|
107
|
+
end
|
108
|
+
|
109
|
+
def write_photo(index, file = nil)
|
110
|
+
File.open(file || 'photo', 'wb') do |file|
|
111
|
+
file.write self.binary(index)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class CRA::PersonAtAddress
|
3
|
+
attr_accessor :first_name, :last_name, :birth_date, :active, :status_text, :gender, :address, :private_number
|
4
|
+
|
5
|
+
def self.extract_date(text)
|
6
|
+
DateTime.strptime(text.to_s, '%d/%m/%Y')
|
7
|
+
#rescue Exception => ex
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.init_with_hash(hash)
|
11
|
+
hash = hash['PersonsAtAddress'] || hash
|
12
|
+
person = CRA::PersonAtAddress.new
|
13
|
+
person.first_name = hash['MD_FIRST']
|
14
|
+
person.last_name = hash['MD_LAST']
|
15
|
+
person.birth_date = CRA::PersonAtAddress.extract_date(hash['MD_BIRTH_DATE'])
|
16
|
+
person.status_text = hash['APPD_STATUS_DESCRIPTION']
|
17
|
+
person.active = person.status_text == 'აქტიური'
|
18
|
+
person.gender = hash['MD_GENDER_STR']
|
19
|
+
person.address = hash['OA_RP_FULL_ADDRESS']
|
20
|
+
person.private_number = hash['PN_PRIVATE_NUMBER']
|
21
|
+
person
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.list_from_hash(hash)
|
25
|
+
persons = []
|
26
|
+
hash = hash['PersonsAtAddress']
|
27
|
+
if hash.is_a? Array
|
28
|
+
hash.each do |row|
|
29
|
+
persons << CRA::PersonAtAddress.init_with_hash(row)
|
30
|
+
end
|
31
|
+
else
|
32
|
+
persons << CRA::PersonAtAddress.init_with_hash(hash)
|
33
|
+
end
|
34
|
+
persons
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/cra/services.rb
CHANGED
@@ -1,50 +1,123 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'singleton'
|
3
|
+
require 'rest_client'
|
4
|
+
require 'active_support/core_ext/hash/conversions'
|
3
5
|
|
4
6
|
module CRA
|
7
|
+
ROOT_ID = 0
|
8
|
+
GEORGIA_ID = 1
|
9
|
+
TBILISI_ID = 4
|
5
10
|
|
6
11
|
class Services < CRA::Base
|
7
12
|
include Singleton
|
8
13
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
14
|
+
public
|
15
|
+
|
16
|
+
# Returns array of passports.
|
17
|
+
def by_name_and_dob(lname, fname, year, month, day)
|
18
|
+
body = self.gov_talk_request({
|
19
|
+
service: 'GetDataUsingCriteriaParameter',
|
20
|
+
message: 'CRAGetDataUsingCriteria',
|
21
|
+
class: 'CRAGetDataUsingCriteria',
|
22
|
+
params: {
|
23
|
+
LastName: lname,
|
24
|
+
FirstName: fname,
|
25
|
+
Year: year,
|
26
|
+
Month: month,
|
27
|
+
Day: day,
|
28
|
+
}
|
29
|
+
})
|
30
|
+
CRA::PassportInfo.list_with_hash(body)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns ID card information.
|
34
|
+
def by_id_card(private_number, id_card_serial, id_card_numb)
|
35
|
+
body = self.gov_talk_request({
|
36
|
+
service: 'GetDataUsingPrivateNumberAndIdCardParameter',
|
37
|
+
message: 'GetDataUsingPrivateNumberAndCard',
|
38
|
+
class: 'GetDataUsingPrivateNumberAndCard',
|
39
|
+
params: {
|
40
|
+
PrivateNumber: private_number,
|
41
|
+
IdCardSerial: id_card_serial,
|
42
|
+
IdCardNumber: id_card_numb,
|
43
|
+
}
|
44
|
+
})
|
45
|
+
CRA::PassportInfo.init_with_hash(body)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns passport information.
|
49
|
+
def by_passport(private_number, passport)
|
50
|
+
body = self.gov_talk_request({
|
51
|
+
service: 'FetchPersonInfoByPassportNumberUsingCriteriaParameter',
|
52
|
+
message: 'CRA_FetchInfoByPassportCriteria',
|
53
|
+
class: 'CRA_FetchInfoByPassportCriteria',
|
54
|
+
params: {
|
55
|
+
PrivateNumber: private_number,
|
56
|
+
Number: passport
|
57
|
+
}
|
58
|
+
})
|
59
|
+
CRA::PassportInfo.init_with_hash(body)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns array of addresses.
|
63
|
+
def address_by_name(parent_id, name)
|
64
|
+
body = self.gov_talk_request({
|
65
|
+
service: 'AddrFindeAddressByNameParameter',
|
66
|
+
message: 'CRA_AddrFindeAddressByName',
|
67
|
+
class: 'CRA_AddrFindeAddressByName',
|
68
|
+
params: {
|
69
|
+
Id: parent_id,
|
70
|
+
Word: name,
|
71
|
+
}
|
72
|
+
})
|
73
|
+
CRA::Address.list_from_hash(body['ArrayOfResults']['Results'])
|
74
|
+
end
|
75
|
+
|
76
|
+
# Getting address root.
|
77
|
+
def address_root
|
78
|
+
body = self.gov_talk_request({
|
79
|
+
message: 'CRA_AddrGetRootNode',
|
80
|
+
class: 'CRA_AddrGetRootNode',
|
81
|
+
params: {}
|
82
|
+
})
|
83
|
+
CRA::AddressNode.list_from_hash(body['ArrayOfNodeInfo']['NodeInfo'])
|
84
|
+
end
|
85
|
+
|
86
|
+
# Returns array of address nodes.
|
87
|
+
def address_by_parent(parent_id)
|
88
|
+
body = self.gov_talk_request({
|
89
|
+
message: 'CRA_AddrGetNodesByParentID',
|
90
|
+
class: 'CRA_AddrGetNodesByParentID',
|
91
|
+
params: {
|
92
|
+
long: parent_id,
|
93
|
+
}
|
94
|
+
})
|
95
|
+
CRA::AddressNode.list_from_hash(body['ArrayOfNodeInfo']['NodeInfo'])
|
96
|
+
end
|
97
|
+
|
98
|
+
# Get address info by it's id.
|
99
|
+
def address_info(id)
|
100
|
+
body = self.gov_talk_request({
|
101
|
+
message: 'CRA_AddrGetAddressInfoByID',
|
102
|
+
class: 'CRA_AddrGetAddressInfoByID',
|
103
|
+
params: {
|
104
|
+
long: id,
|
105
|
+
}
|
106
|
+
})
|
107
|
+
# puts body.to_s
|
108
|
+
CRA::AddressInfo.init_from_hash(body['AddressInfo'])
|
109
|
+
end
|
110
|
+
|
111
|
+
# Get persons array at the given address.
|
112
|
+
def persons_at_address(address_id)
|
113
|
+
body = self.gov_talk_request({
|
114
|
+
message: 'CRA_GetPersonsAtAddress',
|
115
|
+
class: 'CRA_GetPersonsAtAddress',
|
116
|
+
params: {
|
117
|
+
long: address_id,
|
118
|
+
}
|
119
|
+
})
|
120
|
+
CRA::PersonAtAddress.list_from_hash(body['ArrayOfPersonsAtAddress'])
|
48
121
|
end
|
49
122
|
|
50
123
|
end
|
data/lib/cra/version.rb
CHANGED
data/lib/cra.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
-
require 'savon'
|
3
2
|
require 'cra/version'
|
4
|
-
|
5
3
|
require 'cra/config'
|
6
4
|
|
7
5
|
class String
|
@@ -15,41 +13,19 @@ class String
|
|
15
13
|
end
|
16
14
|
|
17
15
|
module CRA
|
18
|
-
BASE_URL = 'http://stateinstitution.cra.ge'
|
19
|
-
WSDL_URL = 'https://stateinstitutions.cra.ge/Service.asmx?WSDL'
|
20
|
-
|
21
16
|
MALE = 1
|
22
17
|
FEMALE = 2
|
23
18
|
|
24
|
-
class
|
25
|
-
attr_accessor :last_request, :last_response, :last_action
|
26
|
-
|
27
|
-
def process_request(action, request)
|
28
|
-
soap_action = self.soap_action(action)
|
29
|
-
response = get_client.request action do
|
30
|
-
http.headers['SOAPAction'] = soap_action
|
31
|
-
soap.body = request
|
32
|
-
end
|
33
|
-
@last_action = action
|
34
|
-
@last_request = request
|
35
|
-
@last_response = response["#{action.underscore}_response".to_sym]["#{action.underscore}_result".to_sym]
|
36
|
-
end
|
37
|
-
|
38
|
-
def get_client
|
39
|
-
Savon::Client.new WSDL_URL do
|
40
|
-
http.auth.ssl.cert_file = CRA.config.pem_file
|
41
|
-
http.auth.ssl.cert_key_file = CRA.config.pem_file
|
42
|
-
http.auth.ssl.verify_mode = :peer
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def soap_action(name)
|
47
|
-
"#{BASE_URL}/#{name}"
|
48
|
-
end
|
49
|
-
|
19
|
+
class ServiceException < Exception
|
50
20
|
end
|
51
21
|
|
52
22
|
end
|
53
23
|
|
54
|
-
require 'cra/
|
24
|
+
require 'cra/address'
|
25
|
+
require 'cra/address_node'
|
26
|
+
require 'cra/address_info'
|
27
|
+
require 'cra/passport_info'
|
28
|
+
require 'cra/person_at_address'
|
29
|
+
|
30
|
+
require 'cra/base'
|
55
31
|
require 'cra/services'
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe 'Find address by name' do
|
5
|
+
before(:all) do
|
6
|
+
@addresses = CRA.serv.address_by_name(CRA::TBILISI_ID, 'ტაბიძე')
|
7
|
+
end
|
8
|
+
context do
|
9
|
+
subject { @addresses }
|
10
|
+
it { should_not be_nil }
|
11
|
+
it { should_not be_empty }
|
12
|
+
its(:size) { should == 2 }
|
13
|
+
end
|
14
|
+
context do
|
15
|
+
subject { @addresses.first }
|
16
|
+
its(:id) { should == 988572 }
|
17
|
+
its(:name) { should == 'საქართველო/თბილისი/კრწანისი/გ.ტაბიძე-შ.დადიანის/' }
|
18
|
+
its(:old_name) { should be_nil }
|
19
|
+
its(:active) { should == true }
|
20
|
+
end
|
21
|
+
context do
|
22
|
+
subject { @addresses.last }
|
23
|
+
its(:id) { should == 1989533 }
|
24
|
+
its(:name) { should == 'საქართველო/თბილისი/მთაწმინდა/კიკეთი/გ. ტაბიძე/' }
|
25
|
+
its(:old_name) { should be_nil }
|
26
|
+
its(:active) { should == true }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'Getting root node' do
|
31
|
+
before(:all) do
|
32
|
+
@nodes = CRA.serv.address_root
|
33
|
+
end
|
34
|
+
context do
|
35
|
+
subject { @nodes }
|
36
|
+
it { should_not be_nil }
|
37
|
+
it { should_not be_empty }
|
38
|
+
its(:size) { should == 3 }
|
39
|
+
end
|
40
|
+
context do
|
41
|
+
subject { @nodes.first }
|
42
|
+
its(:id) { should == 1 }
|
43
|
+
its(:description) { should == 'საქართველო' }
|
44
|
+
its(:description_full) { should == 'საქართველო' }
|
45
|
+
its(:identificator) { should == 1 }
|
46
|
+
its(:identificator_text) { should == 'ჩვენი ქვეყანა' }
|
47
|
+
its(:identificator_type) { should == 1 }
|
48
|
+
its(:identificator_type_text) { should == 'ჩვეულებრივი' }
|
49
|
+
its(:address) { should be_nil }
|
50
|
+
its(:active) { should == true }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'Find address by parent id' do
|
55
|
+
before(:all) do
|
56
|
+
@nodes = CRA.serv.address_by_parent(CRA::TBILISI_ID)
|
57
|
+
end
|
58
|
+
context do
|
59
|
+
subject { @nodes }
|
60
|
+
it { should_not be_nil }
|
61
|
+
it { should_not be_empty }
|
62
|
+
its(:size) { should == 11 }
|
63
|
+
end
|
64
|
+
context do
|
65
|
+
subject { @nodes.first }
|
66
|
+
its(:id) { should == 191 }
|
67
|
+
its(:description) { should == 'გლდანი' }
|
68
|
+
its(:description_full) { should == 'გლდანი' }
|
69
|
+
its(:identificator) { should == 32 }
|
70
|
+
its(:identificator_text) { should == 'ქალაქის რაიონი' }
|
71
|
+
its(:identificator_type) { should == 1 }
|
72
|
+
its(:identificator_type_text) { should == 'ჩვეულებრივი' }
|
73
|
+
its(:address) { should == 'თბილისი' }
|
74
|
+
its(:active) { should == true }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe 'Get address info' do
|
79
|
+
before(:all) do
|
80
|
+
@info = CRA.serv.address_info(1990702)
|
81
|
+
end
|
82
|
+
subject { @info }
|
83
|
+
it { should_not be_nil }
|
84
|
+
its(:id) { should == 1990702 }
|
85
|
+
its(:path) { should == [1, 4, 190, 10891, 1989533, 1990702] }
|
86
|
+
its(:address) { should == 'თბილისი ს. კიკეთი გ. ტაბიძე ქ. N 1' }
|
87
|
+
its(:region_id) { should == 190 }
|
88
|
+
its(:region_name) { should == 'თბილისი/მთაწმინდა' }
|
89
|
+
end
|
90
|
+
|
91
|
+
describe 'Get persons at address' do
|
92
|
+
before(:all) do
|
93
|
+
@persons = CRA.serv.persons_at_address(1982180)
|
94
|
+
end
|
95
|
+
context do
|
96
|
+
subject { @persons }
|
97
|
+
it { should_not be_nil }
|
98
|
+
it { should_not be_empty }
|
99
|
+
its(:size) { should == 1 }
|
100
|
+
end
|
101
|
+
context do
|
102
|
+
subject { @persons.first }
|
103
|
+
its(:first_name) { should == 'ირაკლი' }
|
104
|
+
its(:last_name) { should == 'ცქიტიშვილი' }
|
105
|
+
its(:birth_date) { should == Date.new(1982, 1, 23) }
|
106
|
+
its(:active) { should == true }
|
107
|
+
its(:status_text) { should == 'აქტიური' }
|
108
|
+
its(:private_number) { should == '18001008167' }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe 'Get address with multiple persons' do
|
113
|
+
before(:all) do
|
114
|
+
@persons = CRA.serv.persons_at_address(576056)
|
115
|
+
end
|
116
|
+
context do
|
117
|
+
subject { @persons }
|
118
|
+
it { should_not be_nil }
|
119
|
+
it { should_not be_empty }
|
120
|
+
its(:size) { should == 4}
|
121
|
+
end
|
122
|
+
context do
|
123
|
+
subject { @persons.first }
|
124
|
+
its(:first_name) { should == 'ნათია' }
|
125
|
+
its(:last_name) { should == 'ბოდოკია' }
|
126
|
+
its(:birth_date) { should == Date.new(1984, 5, 7) }
|
127
|
+
its(:active) { should == true }
|
128
|
+
its(:status_text) { should == 'აქტიური' }
|
129
|
+
its(:private_number) { should == '01010013915' }
|
130
|
+
end
|
131
|
+
end
|
data/spec/config_spec.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
describe
|
5
|
-
|
4
|
+
describe CRA.config do
|
5
|
+
its(:user) { should_not be_nil }
|
6
|
+
its(:password) { should_not be_nil }
|
7
|
+
its(:test_mode) { should == true }
|
8
|
+
its(:cert_file) { should_not be_nil }
|
9
|
+
its(:cert_password) { should_not be_nil }
|
6
10
|
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe 'get person info by id card' do
|
5
|
+
before(:all) do
|
6
|
+
@person_info = CRA.serv.by_id_card('02001000490', 'გ', '1355876')
|
7
|
+
end
|
8
|
+
context 'person information' do
|
9
|
+
subject { @person_info }
|
10
|
+
it { should_not be_nil }
|
11
|
+
its(:doc_id) { should > 0 }
|
12
|
+
its(:doc_type) { should == 1 }
|
13
|
+
its(:doc_description) { should == 'პირადობის მოწმობა' }
|
14
|
+
its(:doc_status) { should == 'Active' }
|
15
|
+
its(:doc_status_text) { should == 'აქტიური' }
|
16
|
+
its(:is_id_card) { should == true }
|
17
|
+
its(:id_card_serial) { should == 'გ' }
|
18
|
+
its(:id_card_number) { should == '1355876' }
|
19
|
+
its(:id_card_issuer) { should == 'სამოქალაქო რეესტრის სააგენტოს მთაწმინდა-კრწანისის სამსახური' }
|
20
|
+
its(:id_card_issue_date) { should_not be_nil }
|
21
|
+
its(:id_card_valid_date) { should_not be_nil }
|
22
|
+
its(:passport_number) { should be_blank }
|
23
|
+
its(:passport_issuer) { should be_blank }
|
24
|
+
its(:passport_issue_date) { should be_nil }
|
25
|
+
its(:person_id) { should == 969036 }
|
26
|
+
its(:private_number) { should == '02001000490' }
|
27
|
+
its(:first_name) { should == 'დიმიტრი' }
|
28
|
+
its(:last_name) { should == 'ყურაშვილი' }
|
29
|
+
its(:middle_name) { should == 'ალბერტი' }
|
30
|
+
its(:birth_date) { should_not be_nil }
|
31
|
+
its(:birth_place) { should == 'საქართველო, აბაშა' }
|
32
|
+
its(:gender) { should == CRA::MALE }
|
33
|
+
its(:citizenship) { should == 'საქართველო' }
|
34
|
+
its(:citizenship_code) { should == 'GEO' }
|
35
|
+
its(:second_citizenship) { should be_blank }
|
36
|
+
its(:second_citizenship_code) { should be_blank }
|
37
|
+
its(:living_place_id) { should == 920434 }
|
38
|
+
its(:living_place) { should == 'თბილისი მისამართის გარეშე' }
|
39
|
+
its(:living_place_registration) { should_not be_nil }
|
40
|
+
its(:living_place_registration_end) { should be_nil }
|
41
|
+
its(:actual_living_place) { should == 'თბილისი აკ.ხორავას ჩიხი N 8' }
|
42
|
+
its(:is_person_dead) { should == false }
|
43
|
+
its(:is_document_lost) { should == false }
|
44
|
+
its(:photos) { should_not be_empty }
|
45
|
+
specify { subject.photos.size.should == 1 }
|
46
|
+
specify { subject.photos.first.should_not be_blank }
|
47
|
+
end
|
48
|
+
context 'last response' do
|
49
|
+
specify { CRA.serv.last_action.should == 'ძებნა პირადობის მოწმობით' }
|
50
|
+
specify { CRA.serv.last_request.is_a?(Hash).should == true }
|
51
|
+
specify { CRA.serv.last_response.is_a?(Hash).should == true }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'get person info by name and date' do
|
56
|
+
before(:all) do
|
57
|
+
@person_info = CRA.serv.by_name_and_dob('ყურაშვილი', 'დიმიტრი', 1979, 4, 4)
|
58
|
+
end
|
59
|
+
context 'documents list' do
|
60
|
+
subject { @person_info }
|
61
|
+
it { should_not be_nil }
|
62
|
+
it { should_not be_empty }
|
63
|
+
its(:size) { should == 5 }
|
64
|
+
end
|
65
|
+
context 'last response' do
|
66
|
+
specify { CRA.serv.last_action.should == 'ძებნა სახელით და დაბ. დღით' }
|
67
|
+
specify { CRA.serv.last_request.is_a?(Hash).should == true }
|
68
|
+
specify { CRA.serv.last_response.is_a?(Hash).should == true }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe 'get person info by passport' do
|
73
|
+
before(:all) do
|
74
|
+
@person_info = CRA.serv.by_passport('01008017948', '07PB00777')
|
75
|
+
end
|
76
|
+
context 'passport info' do
|
77
|
+
subject { @person_info }
|
78
|
+
it { should_not be_nil }
|
79
|
+
its(:first_name) { should == 'დავით' }
|
80
|
+
its(:last_name) { should == 'ფრუიძე' }
|
81
|
+
its(:private_number) { should == '01008017948' }
|
82
|
+
its(:passport_number) { should == '07PB00777' }
|
83
|
+
its(:is_id_card) { should == false }
|
84
|
+
end
|
85
|
+
context 'last response' do
|
86
|
+
specify { CRA.serv.last_action.should == 'ძებნა პასპორტით' }
|
87
|
+
specify { CRA.serv.last_request.is_a?(Hash).should == true }
|
88
|
+
specify { CRA.serv.last_response.is_a?(Hash).should == true }
|
89
|
+
end
|
90
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,14 +1,5 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
|
-
# Savon
|
4
|
-
|
5
|
-
require 'savon'
|
6
|
-
|
7
|
-
HTTPI.log = false
|
8
|
-
Savon.configure do |config|
|
9
|
-
config.log = false
|
10
|
-
end
|
11
|
-
|
12
3
|
# RSpec
|
13
4
|
|
14
5
|
require 'rspec'
|
@@ -20,5 +11,4 @@ end
|
|
20
11
|
# Test options.
|
21
12
|
|
22
13
|
require 'cra'
|
23
|
-
|
24
|
-
CRA.config.pem_file = 'spec/data/telasi.pem'
|
14
|
+
require 'spec_helper_private'
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: cra.ge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Dimitri Kurashvili
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-12-11 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -24,21 +24,54 @@ dependencies:
|
|
24
24
|
type: :development
|
25
25
|
version_requirements: *id001
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
|
-
name:
|
27
|
+
name: activesupport
|
28
28
|
prerelease: false
|
29
29
|
requirement: &id002 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: "
|
34
|
+
version: "3.2"
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rest-client
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "1.6"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: builder
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ~>
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "3.0"
|
57
|
+
type: :runtime
|
58
|
+
version_requirements: *id004
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: bundler
|
61
|
+
prerelease: false
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ~>
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "1.2"
|
68
|
+
type: :runtime
|
69
|
+
version_requirements: *id005
|
37
70
|
description: CRA services
|
38
71
|
email:
|
39
72
|
- dimitri@c12.ge
|
40
|
-
executables:
|
41
|
-
|
73
|
+
executables:
|
74
|
+
- cra.exe
|
42
75
|
extensions: []
|
43
76
|
|
44
77
|
extra_rdoc_files: []
|
@@ -51,16 +84,24 @@ files:
|
|
51
84
|
- LICENSE.txt
|
52
85
|
- README.md
|
53
86
|
- Rakefile
|
87
|
+
- bin/compile.sh
|
88
|
+
- bin/cra.cs
|
54
89
|
- cra.gemspec
|
55
90
|
- lib/cra.rb
|
91
|
+
- lib/cra/address.rb
|
92
|
+
- lib/cra/address_info.rb
|
93
|
+
- lib/cra/address_node.rb
|
94
|
+
- lib/cra/base.rb
|
56
95
|
- lib/cra/config.rb
|
57
|
-
- lib/cra/
|
96
|
+
- lib/cra/passport_info.rb
|
97
|
+
- lib/cra/person_at_address.rb
|
58
98
|
- lib/cra/services.rb
|
59
99
|
- lib/cra/version.rb
|
100
|
+
- spec/address_spec.rb
|
60
101
|
- spec/config_spec.rb
|
61
|
-
- spec/
|
62
|
-
- spec/service_spec.rb
|
102
|
+
- spec/passport_spec.rb
|
63
103
|
- spec/spec_helper.rb
|
104
|
+
- bin/cra.exe
|
64
105
|
homepage: http://github.com/dimakura/cra.ge
|
65
106
|
licenses: []
|
66
107
|
|
@@ -89,7 +130,7 @@ signing_key:
|
|
89
130
|
specification_version: 3
|
90
131
|
summary: Ruby client for C(ivil)R(egistry)A(gency) services
|
91
132
|
test_files:
|
133
|
+
- spec/address_spec.rb
|
92
134
|
- spec/config_spec.rb
|
93
|
-
- spec/
|
94
|
-
- spec/service_spec.rb
|
135
|
+
- spec/passport_spec.rb
|
95
136
|
- spec/spec_helper.rb
|
data/lib/cra/pasport_info.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'base64'
|
3
|
-
|
4
|
-
class CRA::PasportInfo
|
5
|
-
|
6
|
-
attr_accessor :doc_id, :doc_type, :doc_description, :doc_status, :doc_status_text
|
7
|
-
attr_accessor :is_id_card, :id_card_serial, :id_card_number, :id_card_issuer, :id_card_issue_date, :id_card_valid_date
|
8
|
-
attr_accessor :pasport_number, :passport_issuer, :passport_issue_date, :passport_valid_date
|
9
|
-
attr_accessor :person_id, :social_id, :private_number
|
10
|
-
attr_accessor :first_name, :last_name, :middle_name
|
11
|
-
attr_accessor :birth_date, :birth_place
|
12
|
-
attr_accessor :gender
|
13
|
-
attr_accessor :citizenship, :citizenship_code, :second_citizenship, :second_citizenship_code
|
14
|
-
attr_accessor :living_place_id, :living_place, :living_place_registration, :living_place_registration_end, :actual_living_place
|
15
|
-
attr_accessor :region_id, :region_name
|
16
|
-
attr_accessor :response_id, :response_code
|
17
|
-
attr_accessor :is_person_dead, :is_document_lost
|
18
|
-
attr_accessor :photos
|
19
|
-
|
20
|
-
def self.init_with_hash(hash)
|
21
|
-
passport = CRA::PasportInfo.new
|
22
|
-
passport.doc_id = hash[:document_id].to_i
|
23
|
-
passport.doc_type = hash[:document_type_id].to_i
|
24
|
-
passport.doc_description = hash[:document_description]
|
25
|
-
passport.doc_status = hash[:document_status_enum]
|
26
|
-
passport.doc_status_text = hash[:document_status_str]
|
27
|
-
passport.is_id_card = hash[:is_id_card]
|
28
|
-
passport.id_card_serial = hash[:id_card_serial]
|
29
|
-
passport.id_card_number = hash[:id_card_number]
|
30
|
-
passport.id_card_issuer = hash[:id_card_issuer]
|
31
|
-
passport.id_card_issue_date = hash[:id_card_issue_date]
|
32
|
-
passport.id_card_valid_date = hash[:id_card_valid_date]
|
33
|
-
passport.pasport_number = hash[:pasport_number]
|
34
|
-
passport.passport_issuer = hash[:passport_issuer]
|
35
|
-
passport.passport_issue_date = hash[:passport_issue_date]
|
36
|
-
passport.passport_valid_date = hash[:passport_valid_date]
|
37
|
-
passport.person_id = hash[:person_id].to_i
|
38
|
-
passport.social_id = hash[:social_id].to_i
|
39
|
-
passport.private_number = hash[:private_number]
|
40
|
-
passport.first_name = hash[:first_name]
|
41
|
-
passport.last_name = hash[:last_name]
|
42
|
-
passport.middle_name = hash[:middle_name]
|
43
|
-
passport.birth_date = hash[:birth_date]
|
44
|
-
passport.birth_place = hash[:birth_place]
|
45
|
-
passport.gender = hash[:gender].to_i
|
46
|
-
passport.citizenship = hash[:citizenship]
|
47
|
-
passport.citizenship_code = hash[:citizenship_code]
|
48
|
-
passport.second_citizenship = hash[:double_citizenship]
|
49
|
-
passport.second_citizenship_code = hash[:double_citizenship_code]
|
50
|
-
passport.living_place_id = hash[:living_place_id].to_i
|
51
|
-
passport.living_place = hash[:living_place]
|
52
|
-
passport.actual_living_place = hash[:fa_living_place]
|
53
|
-
passport.living_place = passport.living_place.split(' ').join(' ') if passport.living_place
|
54
|
-
passport.actual_living_place = passport.actual_living_place.split(' ').join(' ') if passport.actual_living_place
|
55
|
-
passport.living_place_registration = hash[:living_place_reg_date]
|
56
|
-
passport.living_place_registration_end = hash[:living_place_reg_end_date]
|
57
|
-
passport.region_id = hash[:region_id].to_i
|
58
|
-
passport.region_name = hash[:region_str_]
|
59
|
-
passport.response_id = hash[:response_id].to_i
|
60
|
-
passport.is_person_dead = hash[:is_person_dead]
|
61
|
-
passport.is_document_lost = hash[:is_document_lost]
|
62
|
-
passport.photos = []
|
63
|
-
if hash[:photos] and hash[:photos].is_a?(Array)
|
64
|
-
hash[:photos].each do |photo|
|
65
|
-
passport.photos.push(photo[:base64_binary])
|
66
|
-
end
|
67
|
-
elsif hash[:photos]
|
68
|
-
passport.photos.push(hash[:photos][:base64_binary])
|
69
|
-
end
|
70
|
-
passport
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.list_with_hash(hash)
|
74
|
-
documents = []
|
75
|
-
hash[:person_info].each do |row|
|
76
|
-
documents << CRA::PasportInfo.init_with_hash(row)
|
77
|
-
end
|
78
|
-
documents
|
79
|
-
end
|
80
|
-
|
81
|
-
def full_name(opts = {})
|
82
|
-
if opts[:with_middle_name]
|
83
|
-
"#{first_name} #{last_name} #{middle_name}"
|
84
|
-
else
|
85
|
-
"#{first_name} #{last_name}"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# Returns binary content of the photo.
|
90
|
-
def binary(index)
|
91
|
-
Base64.decode64(self.photos[index])
|
92
|
-
end
|
93
|
-
|
94
|
-
def write_photo(index, file = nil)
|
95
|
-
File.open(file || 'photo', 'wb') do |file|
|
96
|
-
file.write self.binary(index)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|
data/spec/experimental_spec.rb
DELETED
data/spec/service_spec.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'spec_helper'
|
3
|
-
require 'cra'
|
4
|
-
|
5
|
-
describe 'my UPN' do
|
6
|
-
before(:all) do
|
7
|
-
@upn = CRA.serv.my_upn
|
8
|
-
end
|
9
|
-
context do
|
10
|
-
subject { @upn }
|
11
|
-
it { should == 'CRA\telasi' }
|
12
|
-
end
|
13
|
-
context do
|
14
|
-
subject { CRA.serv }
|
15
|
-
its(:last_request) { should == {} }
|
16
|
-
its(:last_response) { should == 'CRA\telasi' }
|
17
|
-
its(:last_action) { should == 'GetMyUPN' }
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'get person info by id' do
|
22
|
-
before(:all) do
|
23
|
-
@person_info = CRA.serv.by_personal_id('02001000490')
|
24
|
-
end
|
25
|
-
subject { @person_info }
|
26
|
-
its(:doc_id) { should > 0 }
|
27
|
-
its(:doc_type) { should == 1 }
|
28
|
-
its(:doc_description) { should == 'პირადობის მოწმობა' }
|
29
|
-
its(:doc_status) { should == 'Active' }
|
30
|
-
its(:doc_status_text) { should == 'აქტიური' }
|
31
|
-
its(:is_id_card) { should == true }
|
32
|
-
its(:id_card_serial) { should == 'გ' }
|
33
|
-
its(:id_card_number) { should == '1355876' }
|
34
|
-
its(:id_card_issuer) { should == 'სამოქალაქო რეესტრის სააგენტოს მთაწმინდა-კრწანისის სამსახური' }
|
35
|
-
its(:id_card_issue_date) { should_not be_nil }
|
36
|
-
its(:id_card_valid_date) { should_not be_nil }
|
37
|
-
its(:pasport_number) { should be_nil }
|
38
|
-
its(:passport_issuer) { should be_nil }
|
39
|
-
its(:passport_issue_date) { should be_nil }
|
40
|
-
its(:passport_valid_date) { should be_nil }
|
41
|
-
its(:person_id) { should == 969036 }
|
42
|
-
its(:private_number) { should == '02001000490' }
|
43
|
-
its(:first_name) { should == 'დიმიტრი' }
|
44
|
-
its(:last_name) { should == 'ყურაშვილი' }
|
45
|
-
its(:middle_name) { should == 'ალბერტი' }
|
46
|
-
its(:birth_date) { should_not be_nil }
|
47
|
-
its(:birth_place) { should == 'საქართველო, აბაშა' }
|
48
|
-
its(:gender) { should == CRA::MALE }
|
49
|
-
its(:citizenship) { should == 'საქართველო' }
|
50
|
-
its(:citizenship_code) { should == 'GEO' }
|
51
|
-
its(:second_citizenship) { should be_nil }
|
52
|
-
its(:second_citizenship_code) { should be_nil }
|
53
|
-
its(:living_place_id) { should == 920434 }
|
54
|
-
its(:living_place) { should == 'თბილისი მისამართის გარეშე' }
|
55
|
-
its(:living_place_registration) { should_not be_nil }
|
56
|
-
its(:living_place_registration_end) { should be_nil }
|
57
|
-
its(:actual_living_place) { should == 'თბილისი აკ.ხორავას ჩიხი N 8' }
|
58
|
-
its(:is_person_dead) { should == false }
|
59
|
-
its(:is_document_lost) { should == false }
|
60
|
-
its(:photos) { should_not be_empty }
|
61
|
-
end
|
62
|
-
|
63
|
-
describe 'get person info by id card' do
|
64
|
-
before(:all) do
|
65
|
-
@person_info = CRA.serv.by_id_card('გ', '1355876')
|
66
|
-
end
|
67
|
-
subject { @person_info }
|
68
|
-
its(:doc_id) { should > 0 }
|
69
|
-
its(:first_name) { should == 'დიმიტრი' }
|
70
|
-
its(:last_name) { should == 'ყურაშვილი' }
|
71
|
-
its(:private_number) { should == '02001000490' }
|
72
|
-
end
|
73
|
-
|
74
|
-
describe 'find person documents by name and dob' do
|
75
|
-
before(:all) do
|
76
|
-
@documents = CRA.serv.list_by_name_and_dob('ყურაშვილი', 'დიმიტრი', 1979, 4, 4)
|
77
|
-
end
|
78
|
-
context do
|
79
|
-
subject { @documents }
|
80
|
-
its(:size) { should == 5 }
|
81
|
-
end
|
82
|
-
context do
|
83
|
-
subject { @documents.first }
|
84
|
-
its(:person_id) { should == 969036 }
|
85
|
-
its(:private_number) { should == '02001000490' }
|
86
|
-
end
|
87
|
-
end
|