rs.ge 0.0.4 → 0.0.5

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.
@@ -30,6 +30,9 @@ module RS
30
30
  type.name = NAMES[id]
31
31
  type
32
32
  end
33
+ def self.all_types
34
+ []
35
+ end
33
36
  end
34
37
 
35
38
  # ზედნადების ერთეულების განსაზღვრა.
@@ -47,7 +50,9 @@ module RS
47
50
  AIR = 3
48
51
  OTHERS = 4
49
52
  NAMES = { VEHICLE => 'საავტომობილო', RAILWAY => 'სარკინიგზო', AIR => 'საავიაციო', OTHERS => 'სხვა' }
53
+
50
54
  attr_accessor :id, :name
55
+
51
56
  def self.create_from_id(id)
52
57
  type = TransportType.new
53
58
  type.id = id
@@ -1,4 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module RS
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
@@ -2,6 +2,28 @@
2
2
 
3
3
  module RS
4
4
 
5
+ protected
6
+
7
+ def self.append_validation_error(errors, field, error)
8
+ errors[field.to_sym] ||= []
9
+ errors[field.to_sym] << error
10
+ end
11
+
12
+ public
13
+
14
+ # ამოწმებს თუ რამდენად სწორია პირადი ნომრის ჩანაწერი.
15
+ # პირადი ნომერი უნდა შედგებოდს ზუსტად 11 ციფრისაგან.
16
+ def self.is_valid_personal_tin(tin)
17
+ tin =~ /^[0-9]{11}$/
18
+ end
19
+
20
+ # ამოწმებს თუ რამდენად სწორია საწარმოს საიდენტიფიკაციო ნომრის ჩანაწერი
21
+ # (გარდა ინდ. მეწარმისა).
22
+ # საწარმოს საიდენტიფიკაციო ნომერი უნდა შედგებოდს ზუსტად 9 ციფრისაგან.
23
+ def self.is_valid_corporate_tin(tin)
24
+ tin =~ /^[0-9]{9}$/
25
+ end
26
+
5
27
  # ეს არის ზედნადების ხაზი საქონლისთვის.
6
28
  class WaybillItem
7
29
  attr_accessor :id, :prod_name, :unit_id, :unit_name, :quantity, :price, :bar_code, :excise_id
@@ -34,6 +56,45 @@ module RS
34
56
  item.excise_id = hash[:a_id] == '0' ? nil : hash[:a_id].to_i
35
57
  item
36
58
  end
59
+
60
+ # ამოწმებს ამ კლასს შემდეგი შეცდომების არსებობაზე:
61
+ #
62
+ # 1) საქონლის დასახელება უნდა იყოს მითითებული
63
+ # 2) საქონლის ზომის ერთეული უნდა იყოს მითითებული
64
+ # 3) თუ ზომის ერთეულია "სხვა", ზომის ერთეულის სახელიც უნდა იყოს მითითებული
65
+ # 4) რაოდენობა > 0
66
+ # 5) ფასი >= 0
67
+ # 6) შტრიხ-კოდი უნდა იყოს მითითებული
68
+ def validate
69
+ @validation_errors = {}
70
+ if self.prod_name.nil? or self.prod_name.strip.empty?
71
+ RS.append_validation_error(@validation_errors, :prod_name, 'საქონლის სახელი არაა განსაზღვრული')
72
+ end
73
+ if self.unit_id.nil?
74
+ RS.append_validation_error(@validation_errors, :unit_id, 'ზომის ერთეული არაა განსაზღვრული')
75
+ end
76
+ if self.unit_id == RS::WaybillUnit::OTHERS and (self.unit_name.nil? or self.unit_name.strip.empty?)
77
+ RS.append_validation_error(@validation_errors, :unit_id, 'ზომის ერთეულის სახელი არაა განსაზღვრული')
78
+ end
79
+ if self.quantity.nil? or self.quantity <= 0
80
+ RS.append_validation_error(@validation_errors, :quantity, 'რაოდენობა უნდა იყოს მეტი 0-ზე')
81
+ end
82
+ if self.price.nil? or self.price < 0
83
+ RS.append_validation_error(@validation_errors, :price, 'ფასი არ უნდა იყოს უარყოფითი')
84
+ end
85
+ if self.bar_code.nil? or self.bar_code.strip.empty?
86
+ RS.append_validation_error(@validation_errors, :price, 'საქონლის შტრიხ-კოდი უნდა იყოს განსაზღვრული')
87
+ end
88
+ end
89
+
90
+ def validation_errors
91
+ @validation_errors
92
+ end
93
+
94
+ def valid?
95
+ self.validate
96
+ @validation_errors.empty?
97
+ end
37
98
  end
38
99
 
39
100
  # ეს არის ზედნადების კლასი.
@@ -52,10 +113,9 @@ module RS
52
113
  attr_accessor :start_address, :end_address
53
114
  attr_accessor :transportation_cost, :transportation_cost_payer, :transport_type_id, :transport_type_name, :car_number
54
115
  attr_accessor :comment
55
- attr_accessor :start_date, :delivery_date
116
+ attr_accessor :create_date, :start_date, :delivery_date, :activate_date
56
117
  attr_accessor :items
57
118
  attr_accessor :error_code
58
- attr_accessor :create_date
59
119
 
60
120
  def to_xml(xml)
61
121
  xml.WAYBILL do |b|
@@ -100,7 +160,6 @@ module RS
100
160
  end
101
161
  waybill.id = hash[:id]
102
162
  waybill.type = hash[:type].to_i
103
- waybill.create_date = hash[:create_date]
104
163
  waybill.status = hash[:status].to_i
105
164
  waybill.seller_id = hash[:seler_un_id].to_i
106
165
  waybill.buyer_tin = hash[:buyer_tin]
@@ -119,10 +178,131 @@ module RS
119
178
  waybill.transport_type_name = hash[:trans_txt]
120
179
  waybill.car_number = hash[:car_number]
121
180
  waybill.comment = hash[:comment]
181
+ waybill.create_date = hash[:create_date]
122
182
  waybill.start_date = hash[:begin_date]
123
183
  waybill.delivery_date = hash[:close_date]
184
+ waybill.activate_date = hash[:activate_date]
124
185
  waybill
125
186
  end
187
+
188
+ # ამოწმებს ამ კლასს შემდეგი შეცდომების არსებობაზე:
189
+ #
190
+ # 1) მყიდველის TIN
191
+ # 2) მყიდველის სახელი უნდა იყოს მითითებული თუ უცხოელია
192
+ # 3) თუ საავტომობილო გადაზიდვაა
193
+ # 3.1) ავტომობილის სახელმწიფო ნომერი უნდა იყოს მითითებული
194
+ # 3.2) მძღოლის TIN უნდა იყოს სწორი
195
+ # 3.3) მძღოლის სახელი უნდა იყოს მითითებული თუ უცხოელია
196
+ # 4) თუ ტრანსპორტირების სახეობაა "სხვა", უნდა იყოს მითითებული ტრანსპორტირების სახელწოდებაც
197
+ # 5) უნდა იყოს მითითებული საწყისი მისამართი
198
+ # 6) უნდა იყოს მითითებული საბოლოო მისამართი
199
+ # 7) ერთი საქონელი მაინც უნდა იყოს მითითებული
200
+ # 8) ცალკეულ საქონელზე: იხ. {WaybillItem#validate}
201
+ # 9) არ უნდა არსებობდეს საქონლის გამეორებული კოდები
202
+ def validate
203
+ @validation_errors = {}
204
+ validate_buyer # 1, 2
205
+ validate_transport # 3, 4
206
+ validate_addresses # 5, 6
207
+ validate_items # 7, 8, 9
208
+ end
209
+
210
+ def validation_errors
211
+ @validation_errors
212
+ end
213
+
214
+ def valid?
215
+ #self.validate
216
+ return false unless @validation_errors.empty?
217
+ self.items.each do |item|
218
+ item.validate
219
+ return false unless item.validation_errors.empty?
220
+ end if self.items
221
+ return true
222
+ end
223
+
224
+ def items_valid?
225
+ @items_valid != false
226
+ end
227
+
228
+ private
229
+
230
+ # მყიდველის შემოწმება
231
+ def validate_buyer
232
+ if self.buyer_tin.nil?
233
+ RS.append_validation_error(@validation_errors, :buyer_tin, 'მყიდველის საიდენტიფიკაციო ნომერი განუსაზღვრელია')
234
+ else
235
+ if self.check_buyer_tin
236
+ if !RS.is_valid_personal_tin(self.buyer_tin) and !RS.is_valid_corporate_tin(self.buyer_tin)
237
+ RS.append_validation_error(@validation_errors, :buyer_tin, 'საიდენტიფიკაციო ნომერი უნდა შედგებოდეს 9 ან 11 ციფრისაგან')
238
+ end
239
+ else
240
+ if self.buyer_name.nil? or self.buyer_name.strip.empty?
241
+ RS.append_validation_error(@validation_errors, :buyer_name, 'განსაზღვრეთ მყიდველის სახელი')
242
+ end
243
+ end
244
+ end
245
+ end
246
+
247
+ # სატრანსპორტო საშუალების შემოწმება
248
+ def validate_transport
249
+ if self.transport_type_id == RS::TransportType::VEHICLE
250
+ if self.car_number.nil? or self.car_number.strip.empty?
251
+ RS.append_validation_error(@validation_errors, :car_number, 'მიუთითეთ სატრანსპორტო საშუალების სახელმწიფო ნომერი')
252
+ end
253
+ if self.driver_tin.nil? or self.driver_tin.strip.empty?
254
+ RS.append_validation_error(@validation_errors, :driver_tin, 'მძღოლის პირადი ნომერი უნდა იყოს მითითებული')
255
+ end
256
+ if self.check_driver_tin
257
+ unless RS.is_valid_personal_tin(self.driver_tin)
258
+ RS.append_validation_error(@validation_errors, :driver_tin, 'მძღოლის პირადი ნომერი არასწორია')
259
+ end
260
+ else
261
+ if self.driver_name.nil? or self.driver_name.strip.empty?
262
+ RS.append_validation_error(@validation_errors, :driver_name, 'ჩაწერეთ მძღოლის სახელი')
263
+ end
264
+ end
265
+ elsif self.transport_type_id == RS::TransportType::OTHERS
266
+ if self.transport_type_name.nil? or self.transport_type_name.strip.empty?
267
+ RS.append_validation_error(@validation_errors, :transport_type_name, 'მიუთითეთ სატრანსპორტო საშუალების დასახელება')
268
+ end
269
+ end
270
+ end
271
+
272
+ # ამოწმებს მისამართებს
273
+ def validate_addresses
274
+ if self.start_address.nil? or self.start_address.strip.empty?
275
+ RS.append_validation_error(@validation_errors, :start_address, 'საწყისი მისამართი განუსაზღვრელია')
276
+ end
277
+ if self.end_address.nil? or self.end_address.strip.empty?
278
+ RS.append_validation_error(@validation_errors, :end_address, 'საბოლოო მისამართი განუსაზღვრელია')
279
+ end
280
+ end
281
+
282
+ # საქონლის პოზიციების შემოწმება
283
+ def validate_items
284
+ if self.items.nil? or self.items.empty?
285
+ RS.append_validation_error(@validation_errors, :items, 'ერთი საქონელი მაინც უნდა იყოს განსაზღვრული')
286
+ return
287
+ end
288
+ bar_codes = []
289
+ repeated_bar_codes = []
290
+ self.items.each do |item|
291
+ item.validate
292
+ @items_valid = false unless item.valid?
293
+ if not item.bar_code.nil? and not item.bar_code.strip.empty?
294
+ if bar_codes.include?(item.bar_code)
295
+ repeated_bar_codes << item.bar_code unless repeated_bar_codes.include?(item.bar_code)
296
+ else
297
+ bar_codes << item.bar_code
298
+ end
299
+ end
300
+ end
301
+ unless repeated_bar_codes.empty?
302
+ RS.append_validation_error(@validation_errors, :items, "დუბლირებული შტრიხ-კოდები: #{repeated_bar_codes.join(', ')}")
303
+ end
304
+ end
305
+
126
306
  end
127
307
 
128
308
  # ზედნადების შენახვის მეთოდი
@@ -2,6 +2,60 @@
2
2
  require 'spec_helper'
3
3
  require 'rs'
4
4
 
5
+ RSpec::Matchers.define :be_valid_personal_tin do #|expected|
6
+ match do |actual|
7
+ RS.is_valid_personal_tin(actual)
8
+ end
9
+ end
10
+
11
+ RSpec::Matchers.define :be_valid_corporate_tin do #|expected|
12
+ match do |actual|
13
+ RS.is_valid_corporate_tin(actual)
14
+ end
15
+ end
16
+
17
+ def validate_personal_tin(tin, valid=true)
18
+ if valid
19
+ context "#{tin} should be valid" do
20
+ subject{ tin }
21
+ it { should be_valid_personal_tin }
22
+ end
23
+ else
24
+ context "#{tin} should NOT be valid" do
25
+ subject{ tin }
26
+ it { should_not be_valid_personal_tin }
27
+ end
28
+ end
29
+ end
30
+
31
+ def validate_corporate_tin(tin, valid=true)
32
+ if valid
33
+ context "#{tin} should be valid" do
34
+ subject{ tin }
35
+ it { should be_valid_corporate_tin }
36
+ end
37
+ else
38
+ context "#{tin} should NOT be valid" do
39
+ subject{ tin }
40
+ it { should_not be_valid_corporate_tin }
41
+ end
42
+ end
43
+ end
44
+
45
+ describe 'Personal TIN validation' do
46
+ validate_personal_tin('12345678901', true)
47
+ validate_personal_tin('1234567890', false)
48
+ validate_personal_tin('123456789012', false)
49
+ validate_personal_tin('1234567890A', false)
50
+ end
51
+
52
+ describe 'Corporate TIN validation' do
53
+ validate_corporate_tin('123456789', true)
54
+ validate_corporate_tin('1234567890', false)
55
+ validate_corporate_tin('12345678', false)
56
+ validate_corporate_tin('12345678A', false)
57
+ end
58
+
5
59
  def waybill_skeleton(params = {})
6
60
  waybill = RS::Waybill.new
7
61
  waybill.id = params[:id]
@@ -0,0 +1,96 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
3
+ require 'rs'
4
+
5
+ def validable_test(cntxt, validable, field, has_errors)
6
+ describe cntxt do
7
+ before(:all) do
8
+ yield(validable) if block_given?
9
+ validable.validate
10
+ end
11
+ subject { validable.validation_errors[field] }
12
+ if has_errors
13
+ it("Errors for #{field} not nil") { should_not be_nil }
14
+ it("Errors for #{field} not empty") { should_not be_empty }
15
+ else
16
+ it("Errors for #{field} are nil") { should be_nil }
17
+ end
18
+ end
19
+ end
20
+
21
+ describe 'waybill validation' do
22
+ before(:all) do
23
+ @waybill = RS::Waybill.new
24
+ @waybill.validate
25
+ end
26
+ subject { @waybill }
27
+ it { should_not be_valid }
28
+ specify do
29
+ # buyer TIN
30
+ validable_test('buyer tin errors', @waybill, :buyer_tin, true)
31
+ validable_test('fix buyer tin errors incorrectly', @waybill, :buyer_tin, true) do |waybill|
32
+ waybill.buyer_tin = '123'
33
+ waybill.check_buyer_tin = true
34
+ end
35
+ validable_test('fix buyer tin errors correctly', @waybill, :buyer_tin, false) do |waybill|
36
+ waybill.buyer_tin = '123456789'
37
+ waybill.check_buyer_tin = true
38
+ end
39
+ # buyer name
40
+ validable_test('buyer name error', @waybill, :buyer_name, true) do |waybill|
41
+ waybill.check_buyer_tin = false
42
+ end
43
+ validable_test('fix buyer name error', @waybill, :buyer_name, false) do |waybill|
44
+ waybill.buyer_name = 'dimitri'
45
+ end
46
+ # car number
47
+ validable_test('car number error', @waybill, :car_number, true) do |waybill|
48
+ waybill.transport_type_id = RS::TransportType::VEHICLE
49
+ end
50
+ validable_test('fix car number error', @waybill, :car_number, false) do |waybill|
51
+ waybill.car_number = 'WDW842'
52
+ end
53
+ # driver name
54
+ validable_test('driver name error', @waybill, :driver_name, true) do |waybill|
55
+ waybill.transport_type_id = RS::TransportType::VEHICLE
56
+ end
57
+ validable_test('fix driver name error', @waybill, :driver_name, false) do |waybill|
58
+ waybill.driver_name = 'Dimitri Kurashvili'
59
+ end
60
+ # driver TIN
61
+ validable_test('driver tin error', @waybill, :driver_tin, true)
62
+ validable_test('driver tin error fix', @waybill, :driver_tin, false) do |waybill|
63
+ waybill.driver_tin = '123456789'
64
+ end
65
+ validable_test('driver tin error again: when checking TIN', @waybill, :driver_tin, true) do |waybill|
66
+ waybill.check_driver_tin = true
67
+ end
68
+ # transport name for RS::TransportType::OTHERS
69
+ validable_test('transport name missing', @waybill, :transport_type_name, true) do |waybill|
70
+ waybill.transport_type_id = RS::TransportType::OTHERS
71
+ end
72
+ validable_test('transport name missing: fix', @waybill, :transport_type_name, false) do |waybill|
73
+ waybill.transport_type_name = 'horse'
74
+ end
75
+ # start/end address
76
+ validable_test('start address is missing', @waybill, :start_address, true)
77
+ validable_test('end address is missing', @waybill, :end_address, true)
78
+ validable_test('fixing start address', @waybill, :start_address, false) do |waybill|
79
+ waybill.start_address = 'Tbilisi'
80
+ end
81
+ validable_test('fixing end address', @waybill, :end_address, false) do |waybill|
82
+ waybill.end_address = 'Sokhumi'
83
+ end
84
+ # items
85
+ validable_test('items are missing', @waybill, :items, true)
86
+ end
87
+ end
88
+
89
+ describe 'waybill item validation' do
90
+ before(:all) do
91
+ @item = RS::WaybillItem.new
92
+ @item.validate
93
+ end
94
+ subject { @item }
95
+ it { should_not be_valid }
96
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rs.ge
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-23 00:00:00.000000000 Z
12
+ date: 2012-02-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70208242521860 !ruby/object:Gem::Requirement
16
+ requirement: &70258561787520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '2'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70208242521860
24
+ version_requirements: *70258561787520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: simplecov
27
- requirement: &70208242521460 !ruby/object:Gem::Requirement
27
+ requirement: &70258561787120 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70208242521460
35
+ version_requirements: *70258561787120
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: savon
38
- requirement: &70208242521000 !ruby/object:Gem::Requirement
38
+ requirement: &70258561786640 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70208242521000
46
+ version_requirements: *70258561786640
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: httpi
49
- requirement: &70208242520580 !ruby/object:Gem::Requirement
49
+ requirement: &70258561786220 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70208242520580
57
+ version_requirements: *70258561786220
58
58
  description: ruby client for rs.ge web services
59
59
  email:
60
60
  - dimitri@c12.ge
@@ -77,6 +77,7 @@ files:
77
77
  - spec/rs/dict_spec.rb
78
78
  - spec/rs/sys_spec.rb
79
79
  - spec/rs/waybill_spec.rb
80
+ - spec/rs/waybill_validation_spec.rb
80
81
  - spec/spec_helper.rb
81
82
  - test.rb
82
83
  homepage: http://c12.ge
@@ -107,5 +108,6 @@ test_files:
107
108
  - spec/rs/dict_spec.rb
108
109
  - spec/rs/sys_spec.rb
109
110
  - spec/rs/waybill_spec.rb
111
+ - spec/rs/waybill_validation_spec.rb
110
112
  - spec/spec_helper.rb
111
113
  has_rdoc: