rs.ge 0.0.17 → 0.1.0.beta1

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