cra.ge 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|