rs.ge 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: