rs.ge 0.0.17 → 0.1.0.beta1

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.
@@ -1,483 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
-
3
- module RS
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
-
27
- # ეს არის ზედნადების ხაზი საქონლისთვის.
28
- class WaybillItem
29
- attr_accessor :id, :prod_name, :unit_id, :unit_name, :quantity, :price, :bar_code, :excise_id, :vat_type
30
-
31
- # აბრუნებს ამ ხაზის XML წარმოდგენას.
32
- # @param xml XML builder-ის კლასი
33
- def to_xml(xml)
34
- xml.GOODS do |b|
35
- b.ID (self.id ? self.id : 0)
36
- b.W_NAME self.prod_name
37
- b.UNIT_ID self.unit_id
38
- b.UNIT_TXT self.unit_name
39
- b.QUANTITY self.quantity
40
- b.PRICE self.price
41
- b.AMOUNT self.quantity * self.price
42
- b.BAR_CODE self.bar_code
43
- b.A_ID (self.excise_id ? self.excise_id : 0)
44
- b.VAT_TYPE (self.vat_type || Waybill::VAT_COMMON)
45
- end
46
- end
47
-
48
- def self.init_from_hash(hash)
49
- item = WaybillItem.new
50
- item.id = hash[:id]
51
- item.prod_name = hash[:w_name]
52
- item.unit_id = hash[:unit_id].to_i
53
- item.unit_name = hash[:unit_txt]
54
- item.quantity = hash[:quantity].to_f
55
- item.price = hash[:price].to_f
56
- item.bar_code = hash[:bar_code]
57
- item.excise_id = hash[:a_id] == '0' ? nil : hash[:a_id].to_i
58
- item
59
- end
60
-
61
- # ამოწმებს ამ კლასს შემდეგი შეცდომების არსებობაზე:
62
- #
63
- # # საქონლის დასახელება უნდა იყოს მითითებული
64
- # # შტრიხ-კოდი უნდა იყოს მითითებული
65
- # # საქონლის ზომის ერთეული უნდა იყოს მითითებული
66
- # # თუ ზომის ერთეულია "სხვა", ზომის ერთეულის სახელიც უნდა იყოს მითითებული
67
- # # რაოდენობა > 0
68
- # # ფასი >= 0
69
- def validate
70
- @validation_errors = {}
71
- if self.prod_name.nil? or self.prod_name.strip.empty?
72
- RS.append_validation_error(@validation_errors, :prod_name, 'საქონლის სახელი არაა განსაზღვრული')
73
- end
74
- if self.unit_id.nil?
75
- RS.append_validation_error(@validation_errors, :unit_id, 'ზომის ერთეული არაა განსაზღვრული')
76
- end
77
- if self.unit_id == RS::WaybillUnit::OTHERS and (self.unit_name.nil? or self.unit_name.strip.empty?)
78
- RS.append_validation_error(@validation_errors, :unit_name, 'ზომის ერთეულის სახელი არაა განსაზღვრული')
79
- end
80
- if self.quantity.nil? or self.quantity <= 0
81
- RS.append_validation_error(@validation_errors, :quantity, 'რაოდენობა უნდა იყოს მეტი 0-ზე')
82
- end
83
- if self.price.nil? or self.price < 0
84
- RS.append_validation_error(@validation_errors, :price, 'ფასი არ უნდა იყოს უარყოფითი')
85
- end
86
- if self.bar_code.nil? or self.bar_code.strip.empty?
87
- RS.append_validation_error(@validation_errors, :bar_code, 'საქონლის შტრიხ-კოდი უნდა იყოს განსაზღვრული')
88
- end
89
- end
90
-
91
- def validation_errors
92
- @validation_errors
93
- end
94
-
95
- def valid?
96
- self.validate
97
- @validation_errors.empty?
98
- end
99
- end
100
-
101
- # ეს არის ზედნადების კლასი.
102
- class Waybill
103
- TRANSPORTATION_PAID_BY_BUYER = 1
104
- TRANSPORTATION_PAID_BY_SELLER = 2
105
- STATUS_DELETED = -1
106
- STATUS_DEACTIVATED = -2
107
- STATUS_SAVED = 0
108
- STATUS_ACTIVE = 1
109
- STATUS_CLOSED = 2
110
- # ჩვეულებრივი
111
- VAT_COMMON = 0
112
- # ნულოვანი
113
- VAT_ZERO = 1
114
- # დაუბეგრავი
115
- VAT_NONE = 2
116
- attr_accessor :id, :type, :status, :parent_id, :number
117
- attr_accessor :seller_id # გამყიდველის უნიკალური კოდი
118
- attr_accessor :seller_tin, :seller_name
119
- attr_accessor :buyer_tin, :check_buyer_tin, :buyer_name
120
- attr_accessor :seller_info, :buyer_info # გამყიდველის/მყიდველის თანამდებობა, სახელი და გვარი
121
- attr_accessor :driver_tin, :check_driver_tin, :driver_name
122
- attr_accessor :start_address, :end_address
123
- attr_accessor :transportation_cost, :transportation_cost_payer, :transport_type_id, :transport_type_name, :car_number
124
- attr_accessor :comment
125
- attr_accessor :create_date, :start_date, :delivery_date, :activate_date
126
- attr_accessor :items
127
- attr_accessor :error_code
128
- attr_accessor :invoice_id
129
-
130
- def to_xml(xml)
131
- xml.WAYBILL do |b|
132
- b.GOODS_LIST do |g|
133
- (self.items || []).each do |item|
134
- item.to_xml g
135
- end
136
- end
137
- b.ID (self.id ? self.id : 0)
138
- b.TYPE self.type
139
- b.BUYER_TIN self.buyer_tin
140
- b.CHEK_BUYER_TIN (self.check_buyer_tin ? 1 : 0)
141
- b.BUYER_NAME self.buyer_name
142
- b.START_ADDRESS self.start_address
143
- b.END_ADDRESS self.end_address
144
- b.DRIVER_TIN self.driver_tin
145
- b.CHEK_DRIVER_TIN (self.check_driver_tin ? 1 : 0)
146
- b.DRIVER_NAME self.driver_name
147
- b.TRANSPORT_COAST (self.transportation_cost ? self.transportation_cost : 0)
148
- b.RECEPTION_INFO self.seller_info
149
- b.RECEIVER_INFO self.buyer_info
150
- b.DELIVERY_DATE (self.delivery_date ? self.delivery_date.strftime('%Y-%m-%dT%H:%M:%S') : '')
151
- b.STATUS self.status
152
- b.SELER_UN_ID self.seller_id
153
- b.PAR_ID (self.parent_id ? self.parent_id : '')
154
- b.CAR_NUMBER self.car_number
155
- b.BEGIN_DATE (self.start_date ? self.start_date.strftime('%Y-%m-%dT%H:%M:%S') : '')
156
- b.TRAN_COST_PAYER (self.transportation_cost_payer ? self.transportation_cost_payer : Waybill::TRANSPORTATION_PAID_BY_BUYER)
157
- b.TRANS_ID self.transport_type_id
158
- b.TRANS_TXT self.transport_type_name
159
- b.COMMENT self.comment
160
- end
161
- end
162
-
163
- def self.init_from_hash(hash)
164
- waybill = Waybill.new
165
- items_hash = hash[:goods_list][:goods]
166
- items_hash = [items_hash] if items_hash.instance_of? Hash
167
- waybill.items = []
168
- items_hash.each do |item_hash|
169
- waybill.items << WaybillItem.init_from_hash(item_hash)
170
- end
171
- waybill.id = hash[:id]
172
- waybill.type = hash[:type].to_i
173
- waybill.status = hash[:status].to_i
174
- waybill.number = hash[:waybill_number]
175
- waybill.seller_id = hash[:seler_un_id].to_i
176
- waybill.buyer_tin = hash[:buyer_tin]
177
- waybill.check_buyer_tin = hash[:chek_buyer_tin].to_i == 1
178
- waybill.buyer_name = hash[:buyer_name]
179
- waybill.seller_info = hash[:reception_info]
180
- waybill.buyer_info = hash[:receiver_info]
181
- waybill.driver_tin = hash[:driver_tin]
182
- waybill.check_driver_tin = hash[:chek_driver_tin].to_i == 1
183
- waybill.driver_name = hash[:driver_name]
184
- waybill.start_address = hash[:start_address]
185
- waybill.end_address = hash[:end_address]
186
- waybill.transportation_cost = hash[:transport_coast].to_f
187
- waybill.transportation_cost_payer = hash[:tran_cost_payer] ? hash[:tran_cost_payer].to_i : nil
188
- waybill.transport_type_id = hash[:trans_id].to_i
189
- waybill.transport_type_name = hash[:trans_txt]
190
- waybill.car_number = hash[:car_number]
191
- waybill.comment = hash[:comment]
192
- waybill.create_date = hash[:create_date]
193
- waybill.start_date = hash[:begin_date]
194
- waybill.delivery_date = hash[:close_date]
195
- waybill.activate_date = hash[:activate_date]
196
- waybill
197
- end
198
-
199
- # ამოწმებს ამ კლასს შემდეგი შეცდომების არსებობაზე:
200
- #
201
- # # მყიდველის TIN
202
- # # მყიდველის სახელი უნდა იყოს მითითებული თუ უცხოელია
203
- # # თუ საავტომობილო გადაზიდვაა
204
- # * ავტომობილის სახელმწიფო ნომერი უნდა იყოს მითითებული
205
- # * მძღოლის TIN უნდა იყოს სწორი
206
- # * მძღოლის სახელი უნდა იყოს მითითებული თუ უცხოელია
207
- # # თუ ტრანსპორტირების სახეობაა "სხვა", უნდა იყოს მითითებული ტრანსპორტირების სახელწოდებაც
208
- # # უნდა იყოს მითითებული საწყისი მისამართი
209
- # # უნდა იყოს მითითებული საბოლოო მისამართი
210
- # # ერთი საქონელი მაინც უნდა იყოს მითითებული
211
- # # ცალკეულ საქონელზე: იხ. {WaybillItem#validate}
212
- # # არ უნდა არსებობდეს საქონლის გამეორებული კოდები
213
- #
214
- # ოპციებში შეგვიძლია მიუთითოთ "ძლიერი" შემოწმების ოპცია, როდესაც
215
- # დამატებით მოწმდება მძღოლის და მყიდველი სახელები მონაცემთა ბაზის
216
- # მეშვეობით.
217
- def validate(opts = {})
218
- @validation_errors = {}
219
- validate_buyer # 1, 2
220
- validate_transport # 3, 4
221
- validate_addresses # 5, 6
222
- validate_items # 7, 8, 9
223
- validate_remote(opts) if opts[:remote]
224
- end
225
-
226
- def validation_errors
227
- @validation_errors
228
- end
229
-
230
- def valid?
231
- #self.validate
232
- return false unless @validation_errors.empty?
233
- self.items.each do |item|
234
- item.validate
235
- return false unless item.validation_errors.empty?
236
- end if self.items
237
- return true
238
- end
239
-
240
- def items_valid?
241
- @items_valid != false
242
- end
243
-
244
- private
245
-
246
- # მყიდველის შემოწმება
247
- def validate_buyer
248
- if self.buyer_tin.nil? or self.buyer_tin.strip.empty?
249
- RS.append_validation_error(@validation_errors, :buyer_tin, 'მყიდველის საიდენტიფიკაციო ნომერი განუსაზღვრელია')
250
- else
251
- if self.check_buyer_tin
252
- if !RS.is_valid_personal_tin(self.buyer_tin) and !RS.is_valid_corporate_tin(self.buyer_tin)
253
- RS.append_validation_error(@validation_errors, :buyer_tin, 'საიდენტიფიკაციო ნომერი უნდა შედგებოდეს 9 ან 11 ციფრისაგან')
254
- end
255
- else
256
- if self.buyer_name.nil? or self.buyer_name.strip.empty?
257
- RS.append_validation_error(@validation_errors, :buyer_name, 'განსაზღვრეთ მყიდველის სახელი')
258
- end
259
- end
260
- end
261
- end
262
-
263
- # სატრანსპორტო საშუალების შემოწმება
264
- def validate_transport
265
- if self.transport_type_id == RS::TransportType::VEHICLE
266
- if self.car_number.nil? or self.car_number.strip.empty?
267
- RS.append_validation_error(@validation_errors, :car_number, 'მიუთითეთ სატრანსპორტო საშუალების სახელმწიფო ნომერი')
268
- end
269
- if self.driver_tin.nil? or self.driver_tin.strip.empty?
270
- RS.append_validation_error(@validation_errors, :driver_tin, 'მძღოლის პირადი ნომერი უნდა იყოს მითითებული')
271
- end
272
- if self.check_driver_tin
273
- unless RS.is_valid_personal_tin(self.driver_tin)
274
- RS.append_validation_error(@validation_errors, :driver_tin, 'მძღოლის პირადი ნომერი არასწორია')
275
- end
276
- unless RS.valid_vehicle_number?(self.car_number)
277
- RS.append_validation_error(@validation_errors, :car_number, 'არასწორი მანქანის ნომერი: ჩაწერეთ ABC123 ფორმატში!')
278
- end
279
- else
280
- if self.driver_name.nil? or self.driver_name.strip.empty?
281
- RS.append_validation_error(@validation_errors, :driver_name, 'ჩაწერეთ მძღოლის სახელი')
282
- end
283
- end
284
- elsif self.transport_type_id == RS::TransportType::OTHERS
285
- if self.transport_type_name.nil? or self.transport_type_name.strip.empty?
286
- RS.append_validation_error(@validation_errors, :transport_type_name, 'მიუთითეთ სატრანსპორტო საშუალების დასახელება')
287
- end
288
- end
289
- end
290
-
291
- # ამოწმებს მისამართებს
292
- def validate_addresses
293
- if self.start_address.nil? or self.start_address.strip.empty?
294
- RS.append_validation_error(@validation_errors, :start_address, 'საწყისი მისამართი განუსაზღვრელია')
295
- end
296
- if self.end_address.nil? or self.end_address.strip.empty?
297
- RS.append_validation_error(@validation_errors, :end_address, 'საბოლოო მისამართი განუსაზღვრელია')
298
- end
299
- if not self.start_address.nil? and not self.end_address.nil? and
300
- self.start_address.strip != self.end_address.strip and self.type == RS::WaybillType::WITHOUT_TRANSPORTATION
301
- RS.append_validation_error(@validation_errors, :type, '"ტრანსპორტირების გარეშე" დაუშვებელია, როდესაც საწყისი მისამართი არ ემთხვევა საბოლოოს.')
302
- end
303
- end
304
-
305
- # საქონლის პოზიციების შემოწმება
306
- def validate_items
307
- if self.items.nil? or self.items.empty?
308
- RS.append_validation_error(@validation_errors, :items, 'ერთი საქონელი მაინც უნდა იყოს განსაზღვრული')
309
- return
310
- end
311
- #bar_codes = []
312
- #repeated_bar_codes = []
313
- self.items.each do |item|
314
- item.validate
315
- @items_valid = false unless item.valid?
316
- #if not item.bar_code.nil? and not item.bar_code.strip.empty?
317
- # if bar_codes.include?(item.bar_code)
318
- # repeated_bar_codes << item.bar_code unless repeated_bar_codes.include?(item.bar_code)
319
- # else
320
- # bar_codes << item.bar_code
321
- # end
322
- #end
323
- end
324
- #unless repeated_bar_codes.empty?
325
- # RS.append_validation_error(@validation_errors, :items, "დუბლირებული შტრიხ-კოდები: #{repeated_bar_codes.join(', ')}")
326
- #end
327
- end
328
-
329
- # ამოწმებს მყიდველის და მძღოლის შესაბამისობას მათ საიდენტიფიკაციო კოდებთან.
330
- def validate_remote(opts)
331
- # driver validation
332
- if self.transport_type_id == RS::TransportType::VEHICLE and self.check_driver_tin
333
- unless self.driver_tin.nil? or self.driver_tin.strip.empty?
334
- driver_name = RS.get_name_from_tin('su' => opts['su'], 'sp' => opts['sp'], 'tin' => self.driver_tin)
335
- RS.append_validation_error(@validation_errors, :driver_tin, "საიდ. ნომერი ვერ მოიძებნა: #{self.driver_tin}") if driver_name.nil?
336
- RS.append_validation_error(@validation_errors, :driver_name, "მძღოლის სახელია: #{driver_name}") if driver_name and driver_name.split.join(' ') != self.driver_name.split.join(' ')
337
- else
338
- RS.append_validation_error(@validation_errors, :driver_tin, "მძღოლის პირადი ნომერი არაა მითითებული.")
339
- end
340
- end
341
- # buyer validation
342
- if self.check_buyer_tin
343
- unless self.buyer_tin.nil? or self.buyer_tin.strip.empty?
344
- buyer_name = RS.get_name_from_tin('su' => opts['su'], 'sp' => opts['sp'], 'tin' => self.buyer_tin)
345
- RS.append_validation_error(@validation_errors, :buyer_tin, "საიდ. ნომერი ვერ მოიძებნა: #{self.buyer_tin}") if buyer_name.nil?
346
- RS.append_validation_error(@validation_errors, :buyer_name, "მყიდველის სახელია: #{buyer_name}") if buyer_name and buyer_name.split.join(' ') != self.buyer_name.split.join(' ')
347
- else
348
- RS.append_validation_error(@validation_errors, :buyer_tin, "მყიდველის პირადი ნომერი არაა მითითებული.")
349
- end
350
- end
351
- end
352
-
353
- end
354
-
355
- # ზედნადების შენახვის მეთოდი
356
- #
357
- # გადაეცემა:
358
- # waybill -- ზედნადები
359
- # params -- პარამეტრები
360
- #
361
- # პარამეტრების შემდეგი მნიშვნელობებია დასაშვები:
362
- # su -- სერვისის მომხმარებლის სახელი
363
- # sp -- სერვისის მომხმარებლის პაროლი
364
- #
365
- # ინახავს ამ ზედნადებს და განაახლებს მის მონაცემებს.
366
- def self.save_waybill(waybill, params)
367
- RS.validate_presence_of(params, 'su', 'sp')
368
- client = RS.waybill_service
369
- response = client.request 'save_waybill' do |soap|
370
- soap.body do |xml|
371
- xml.ins0 :su, params['su']
372
- xml.ins0 :sp, params['sp']
373
- xml.ins0 :waybill do |b|
374
- waybill.to_xml b
375
- end
376
- end
377
- end
378
- hash_results = response.to_hash[:save_waybill_response][:save_waybill_result][:result]
379
- if hash_results[:status].to_i == 0
380
- waybill.id = hash_results[:id].to_i == 0 ? nil : hash_results[:id].to_i
381
- waybill.error_code = 0
382
- items_hash = hash_results[:goods_list][:goods]
383
- items_hash = [items_hash] if items_hash.instance_of? Hash
384
- (0..items_hash.size-1).each do |i|
385
- waybill.items[i].id = items_hash[i][:id].to_i
386
- #waybill.items[i].error_code = items_hash[i][:error].to_i
387
- end
388
- else
389
- waybill.error_code = hash_results[:status].to_i
390
- end
391
- end
392
-
393
- # ზედნადების გამოტანა.
394
- #
395
- # გადაცემა შემდეგი პარამეტრები:
396
- # waybill_id -- ზედნადების ID
397
- # su -- სერვისის მომხმარებელი
398
- # sp -- სერვისის მომხმარებლის პაროლი
399
- def self.get_waybill(params)
400
- RS.validate_presence_of(params, 'waybill_id', 'su', 'sp')
401
- client = RS.waybill_service
402
- response = client.request 'get_waybill' do |soap|
403
- soap.body = params.merge({:order => ['su', 'sp', 'waybill_id']})
404
- end
405
- #puts response.to_hash[:get_waybill_response][:get_waybill_result][:waybill]
406
- Waybill.init_from_hash(response.to_hash[:get_waybill_response][:get_waybill_result][:waybill])
407
- end
408
-
409
- # ზედნადების აქტივაცია.
410
- #
411
- # გადაეცემა შემდეგი პარამეტრები:
412
- # waybill_id -- ზედნადების ID
413
- # su -- სერვისის მომხმარებელი
414
- # sp -- სერვისის მომხმარებლის პაროლი
415
- #
416
- # აბრუნებს ამ ზედნადების ID-ს
417
- def self.activate_waybill(params)
418
- RS.validate_presence_of(params, 'waybill_id', 'su', 'sp')
419
- client = RS.waybill_service
420
- response = client.request 'send_waybill' do |soap|
421
- soap.body = params.merge({:order => ['su', 'sp', 'waybill_id']})
422
- end
423
- #puts response.to_hash[:send_waybill_response][:send_waybill_result].to_i
424
- response.to_hash[:send_waybill_response][:send_waybill_result].to_i
425
- end
426
-
427
- # ზედნადების დახურვა.
428
- #
429
- # გადაეცემა შემდეგი პარამეტრები:
430
- # waybill_id -- ზედნადების ID
431
- # su -- სერვისის მომხმარებელი
432
- # sp -- სერვისის მომხმარებლის პაროლი
433
- #
434
- # აბრუნებს <code>true</code> თუ დაიხურა.
435
- def self.close_waybill(params)
436
- RS.validate_presence_of(params, 'waybill_id', 'su', 'sp')
437
- client = RS.waybill_service
438
- response = client.request 'close_waybill' do |soap|
439
- soap.body = params.merge({:order => ['su', 'sp', 'waybill_id']})
440
- end
441
- #puts response.to_hash
442
- response.to_hash[:close_waybill_response][:close_waybill_result].to_i == 1
443
- end
444
-
445
- # ზედნადების წაშლა.
446
- # ეს მეთოდი არ გამოდგება აქტიური/დასრულებული ზედნადების წასაშლელად.
447
- #
448
- # გადაეცემა შემდეგი პარამეტრები:
449
- # waybill_id -- ზედნადების ID
450
- # su -- სერვისის მომხმარებელი
451
- # sp -- სერვისის მომხმარებლის პაროლი
452
- #
453
- # აბრუნებს <code>true</code> თუ წაიშალა.
454
- def self.delete_waybill(params)
455
- RS.validate_presence_of(params, 'waybill_id', 'su', 'sp')
456
- client = RS.waybill_service
457
- response = client.request 'del_waybill' do |soap|
458
- soap.body = params.merge({:order => ['su', 'sp', 'waybill_id']})
459
- end
460
- #puts response.to_hash
461
- response.to_hash[:del_waybill_response][:del_waybill_result].to_i == 1
462
- end
463
-
464
- # აქტიური/დასრულებული ზედნადების გაუქმება.
465
- # ეს მეთოდი არ გამოდგება შენახული ზედნადების გასაუქმებლად.
466
- #
467
- # გადაეცემა შემდეგი პარამეტრები:
468
- # waybill_id -- ზედნადების ID
469
- # su -- სერვისის მომხმარებელი
470
- # sp -- სერვისის მომხმარებლის პაროლი
471
- #
472
- # აბრუნებს <code>true</code> თუ წაიშალა.
473
- def self.deactivate_waybill(params)
474
- RS.validate_presence_of(params, 'waybill_id', 'su', 'sp')
475
- client = RS.waybill_service
476
- response = client.request 'ref_waybill' do |soap|
477
- soap.body = params.merge({:order => ['su', 'sp', 'waybill_id']})
478
- end
479
- #puts response.to_hash
480
- response.to_hash[:ref_waybill_response][:ref_waybill_result].to_i == 1
481
- end
482
-
483
- end