axiomus_api 0.1

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.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +3 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +10 -0
  6. data/Gemfile +10 -0
  7. data/Gemfile.lock +67 -0
  8. data/LICENSE +21 -0
  9. data/README.md +119 -0
  10. data/axiomus_api.gemspec +19 -0
  11. data/lib/axiomus_api/actions.rb +32 -0
  12. data/lib/axiomus_api/address/dpd_address.rb +8 -0
  13. data/lib/axiomus_api/address/ems_address.rb +8 -0
  14. data/lib/axiomus_api/address/post_address.rb +7 -0
  15. data/lib/axiomus_api/address/region_courier_address.rb +8 -0
  16. data/lib/axiomus_api/address/region_pickup_address.rb +7 -0
  17. data/lib/axiomus_api/base.rb +69 -0
  18. data/lib/axiomus_api/base_auth.rb +9 -0
  19. data/lib/axiomus_api/errors.rb +14 -0
  20. data/lib/axiomus_api/item/export_item.rb +5 -0
  21. data/lib/axiomus_api/item/item.rb +7 -0
  22. data/lib/axiomus_api/order/base_order.rb +53 -0
  23. data/lib/axiomus_api/order/carry_order.rb +7 -0
  24. data/lib/axiomus_api/order/dpd_order.rb +11 -0
  25. data/lib/axiomus_api/order/ems_order.rb +12 -0
  26. data/lib/axiomus_api/order/export_order.rb +14 -0
  27. data/lib/axiomus_api/order/order.rb +8 -0
  28. data/lib/axiomus_api/order/post_order.rb +12 -0
  29. data/lib/axiomus_api/order/region_courier_order.rb +8 -0
  30. data/lib/axiomus_api/order/region_order.rb +8 -0
  31. data/lib/axiomus_api/order/region_pickup_order.rb +8 -0
  32. data/lib/axiomus_api/order/self_export_order.rb +15 -0
  33. data/lib/axiomus_api/request/order_request.rb +17 -0
  34. data/lib/axiomus_api/request/request.rb +10 -0
  35. data/lib/axiomus_api/request/status_request.rb +5 -0
  36. data/lib/axiomus_api/response/order_response.rb +29 -0
  37. data/lib/axiomus_api/response/regions_response.rb +54 -0
  38. data/lib/axiomus_api/response/status_response.rb +84 -0
  39. data/lib/axiomus_api/response_codes.rb +24 -0
  40. data/lib/axiomus_api/serializable.rb +55 -0
  41. data/lib/axiomus_api/services/export_services.rb +7 -0
  42. data/lib/axiomus_api/services/post_services.rb +7 -0
  43. data/lib/axiomus_api/services/region_services.rb +7 -0
  44. data/lib/axiomus_api/services/services.rb +7 -0
  45. data/lib/axiomus_api/session.rb +109 -0
  46. data/lib/axiomus_api/validated.rb +32 -0
  47. data/lib/axiomus_api/version.rb +3 -0
  48. data/lib/axiomus_api.rb +34 -0
  49. data/spec/factories.rb +200 -0
  50. data/spec/integration/axiomus_api/session_spec.rb +130 -0
  51. data/spec/lib/axiomus_api/base_order_spec.rb +55 -0
  52. data/spec/lib/axiomus_api/session_spec.rb +47 -0
  53. data/spec/lib/axiomus_api_spec.rb +5 -0
  54. data/spec/spec_helper.rb +19 -0
  55. data/spec/support/dummy_data.rb +61 -0
  56. data/spec/support/http_mocking.rb +21 -0
  57. metadata +113 -0
@@ -0,0 +1,5 @@
1
+ require_relative 'request'
2
+
3
+ class AxiomusApi::StatusRequest < AxiomusApi::Request
4
+ xml_field :okey
5
+ end
@@ -0,0 +1,29 @@
1
+ require 'nokogiri'
2
+
3
+ class AxiomusApi::OrderResponse
4
+ attr_accessor :okey
5
+ attr_accessor :object_id
6
+ attr_accessor :code
7
+ attr_accessor :description
8
+ attr_accessor :price
9
+ attr_accessor :request
10
+
11
+ def initialize(xml)
12
+ doc = Nokogiri::XML(xml)
13
+ @request = doc.xpath('response/request').text
14
+ @okey = doc.xpath('response/auth').text
15
+ @object_id = doc.xpath('response/auth/@objectid').text
16
+ @code = doc.xpath('response/status/@code').text.to_i
17
+ @description = doc.xpath('response/status').text
18
+ @price = doc.xpath('response/status/@price').text
19
+ end
20
+
21
+ def error_message
22
+ @description unless success?
23
+ end
24
+
25
+ def success?
26
+ @code == AxiomusApi::ResponseCodes::SUCCESS
27
+ end
28
+ end
29
+
@@ -0,0 +1,54 @@
1
+ require 'nokogiri'
2
+
3
+ class AxiomusApi::RegionsResponse
4
+ class City
5
+ attr_accessor :code
6
+ attr_accessor :name
7
+
8
+ def initialize(node)
9
+ @code = node.xpath('@city_code').text.to_i
10
+ @name = node.text
11
+ end
12
+ end
13
+
14
+ class Office
15
+ attr_accessor :code
16
+ attr_accessor :city_code
17
+ attr_accessor :name
18
+
19
+ def initialize(node)
20
+ @code = node.xpath('@office_code').text.to_i
21
+ @city_code = node.xpath('@city_code').text.to_i
22
+ @name = node.text
23
+ end
24
+ end
25
+
26
+ class Region
27
+ attr_accessor :code
28
+ attr_accessor :name
29
+ attr_accessor :courier
30
+ attr_accessor :pickup
31
+
32
+ def initialize(node)
33
+ @code = node.xpath('@region_code').text
34
+ @name = node.xpath('@name').text
35
+ @courier = node.xpath('courier/city').map do |n|
36
+ City.new(n)
37
+ end
38
+
39
+ @pickup = node.xpath('pickup/office').map do |n|
40
+ Office.new(n)
41
+ end
42
+ end
43
+ end
44
+
45
+ attr_accessor :regions
46
+
47
+ def initialize(xml)
48
+ doc = Nokogiri::XML(xml)
49
+
50
+ @regions = doc.xpath('response/region').map do |node|
51
+ Region.new(node)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,84 @@
1
+ require 'nokogiri'
2
+
3
+ class AxiomusApi::StatusResponse
4
+ class Order
5
+ attr_accessor :id
6
+ attr_accessor :inner_id
7
+ attr_accessor :price
8
+
9
+ def initialize(node)
10
+ @id = node.xpath('@id').text
11
+ @inner_id = node.xpath('@inner_id').text
12
+ @price = node.xpath('@price').text.to_f
13
+ end
14
+ end
15
+
16
+ class Status
17
+ attr_accessor :code
18
+ attr_accessor :description
19
+
20
+ def initialize(node)
21
+ @code = node.xpath('@code').text.to_i
22
+ @description = node.text
23
+ end
24
+ end
25
+
26
+ class PostStatus
27
+ attr_accessor :tracking
28
+ attr_accessor :postprice
29
+
30
+ def initialize(node)
31
+ @tracking = node.xpath('@tracking').text
32
+ @postprice = node.xpath('@postprice').text.to_f
33
+ end
34
+ end
35
+
36
+ class Pack
37
+ attr_accessor :number
38
+ attr_accessor :places
39
+ attr_accessor :status
40
+
41
+ def initialize(node)
42
+ @number = node.xpath('@number').text
43
+ @places = node.xpath('@places').text.to_i
44
+ @status = node.xpath('@status').text.to_i
45
+ end
46
+ end
47
+
48
+ class Item
49
+ attr_accessor :name
50
+ attr_accessor :quantity
51
+ attr_accessor :price
52
+
53
+ def initialize(node)
54
+ @name = node.xpath('@name').text
55
+ @quantity = node.xpath('@quantity').text.to_i
56
+ @price = node.xpath('@price').text.to_f
57
+ end
58
+ end
59
+
60
+ attr_accessor :d_date
61
+ attr_accessor :refused_items
62
+ attr_accessor :poststatus
63
+ attr_accessor :packs
64
+ attr_accessor :order
65
+ attr_accessor :status
66
+ attr_accessor :code
67
+
68
+ def initialize(xml)
69
+ doc = Nokogiri::XML(xml)
70
+
71
+ xml_date = doc.xpath('response/d_date')
72
+ @d_date = Date.parse(xml_date.text) unless xml_date.empty?
73
+ @order = Order.new(doc.xpath('response/order'))
74
+ @refused_items = doc.xpath('response/refused_items/item').map do |node|
75
+ Item.new(node)
76
+ end
77
+ @poststatus = PostStatus.new(doc.xpath('response/poststatus'))
78
+ @packs = doc.xpath('response/packs/pack').map do |node|
79
+ Pack.new(node)
80
+ end
81
+ @status = Status.new(doc.xpath('response/status'))
82
+ end
83
+ end
84
+
@@ -0,0 +1,24 @@
1
+ module AxiomusApi::ResponseCodes
2
+ SUCCESS = 0
3
+ ERR_AUTH_UKEY = 1
4
+ ERR_CHECKSUM = 2
5
+ ERR_NAME_ADDR_MKAD = 3
6
+ ERR_DELIVERY_DATE = 4
7
+ ERR_CONTACTS = 5
8
+ ERR_SERVICES = 6
9
+ ERR_ITEMS = 7
10
+ ERR_WRONG_XML = 8
11
+ ERR_AUTH_NO_AUTH = 9
12
+ ERR_AUTH_WRONG_AUTH = 10
13
+ ERR_AUTH_UID = 11
14
+ ERR_DETAIL_INVOICE_NOT_FOUND = 12
15
+ ERR_WRONG_CLIENT_PROFILE = 13
16
+ ERR_RECEPIENT = 14
17
+ ERR_SMS_NUM = 15
18
+ ERR_PHONE_NUM = 16
19
+ ERR_CONTRACT = 17
20
+ ERR_POSTAL_CODE = 18
21
+ ERR_NO_AGENT_CONTRACT = 19
22
+ ERR_INVOICE_NOT_FOUND = 20
23
+ ERR_QUOTE_EXCEEDED = 21
24
+ end
@@ -0,0 +1,55 @@
1
+ require 'nokogiri'
2
+
3
+ module AxiomusApi::Serializable
4
+ def to_xml(xml_header = false, tag_name = nil)
5
+ serializable_fields = self.class.attribute_meta
6
+ attribute_fields = serializable_fields.select{|k,v| v[:xml_type] == :attribute}
7
+
8
+ attributes = Hash[attribute_fields.map do |k,v|
9
+ [v[:xml_name] || k, self.send(k).to_s]
10
+ end].reject{|k,v| v.nil? || v.empty?}
11
+
12
+ builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
13
+ xml.send(tag_name || self.tag_name, attributes) {
14
+ serializable_fields.each do |f, opt|
15
+ next if opt[:xml_type] == :attribute
16
+ xml_name = opt[:xml_name] || f
17
+ xml_type = opt[:xml_type] || :element
18
+ val = self.send(f)
19
+
20
+ next if val.nil?
21
+
22
+ case xml_type
23
+ when :element
24
+ obj_to_xml(xml, val, xml_name)
25
+ when :text
26
+ xml.text(val)
27
+ end
28
+ end
29
+ }
30
+ end
31
+
32
+ if xml_header
33
+ builder.to_xml
34
+ else
35
+ builder.doc.root.to_xml
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def obj_to_xml(xml, obj, xml_name = nil)
42
+ if obj.respond_to?(:to_xml)
43
+ xml << obj.to_xml(false, xml_name)
44
+ elsif obj.kind_of?(Array)
45
+ xml.send(xml_name) {
46
+ obj.each{|el| obj_to_xml(xml, el)}
47
+ }
48
+ else
49
+ xml.send(xml_name) {
50
+ xml.text(obj.to_s)
51
+ }
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,7 @@
1
+ require_relative '../base'
2
+
3
+ class AxiomusApi::ExportServices < AxiomusApi::Base
4
+
5
+ xml_attribute :transit, :warrant, optional: true
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative '../base'
2
+
3
+ class AxiomusApi::PostServices < AxiomusApi::Base
4
+
5
+ xml_attribute :valuation, :fragile, :cod, :big, optional: true
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative '../base'
2
+
3
+ class AxiomusApi::RegionServices < AxiomusApi::Base
4
+
5
+ xml_attribute :cheque, :not_open, :extrapack, :big, optional: true
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative '../base'
2
+
3
+ class AxiomusApi::Services < AxiomusApi::Base
4
+
5
+ xml_attribute :cash, :cheque, :card, :big, optional: true
6
+
7
+ end
@@ -0,0 +1,109 @@
1
+ require 'net/http'
2
+ require_relative 'actions'
3
+ require_relative 'response/regions_response'
4
+ require_relative 'response/status_response'
5
+ require_relative 'response/order_response'
6
+
7
+ class AxiomusApi::Session
8
+ include AxiomusApi::Actions
9
+
10
+ attr_reader :test
11
+
12
+ def initialize(uid, ukey, test = true)
13
+ @test = test
14
+ @uid = uid
15
+ @ukey = ukey
16
+
17
+ if(block_given?)
18
+ yield self
19
+ end
20
+ end
21
+
22
+ ['', '_carry', '_export', '_self_export', '_post', '_dpd',
23
+ '_ems', '_region_courier', '_region_pickup'].each do |suffix|
24
+ [:new, :update].each do |prefix|
25
+ m_name = "#{prefix}#{suffix}".to_sym
26
+ define_method("#{prefix}#{suffix}") do |order|
27
+ send_order_request(m_name, order)
28
+ end
29
+ end
30
+ end
31
+
32
+ def get_regions()
33
+ xml_request = create_request(:get_regions)
34
+ xml_request.auth.ukey = @ukey
35
+ response = send_request(xml_request)
36
+ AxiomusApi::RegionsResponse.new (response.body)
37
+ end
38
+
39
+ def status(okey)
40
+ xml_request = create_request(:status)
41
+ xml_request.auth = nil
42
+ xml_request.okey = okey
43
+ response = send_request(xml_request)
44
+ status_response = AxiomusApi::StatusResponse.new(response.body)
45
+ status_response
46
+ end
47
+
48
+ def send_order_request(mode, order)
49
+ if(!order.valid?)
50
+ error_msg = order.validation_errors.join('\n')
51
+ logger.error(error_msg)
52
+ raise AxiomusApi::Errors::ValidationError.new, order.validation_errors.join(error_msg)
53
+ end
54
+
55
+ xml_request = get_order_request(mode, order)
56
+ response = send_request(xml_request)
57
+ order_response = AxiomusApi::OrderResponse.new(response.body)
58
+
59
+ if !order_response.success?
60
+ log_response_error(order_response.error_message, xml_request.to_xml, response.body)
61
+ raise AxiomusApi::Errors::RequestError.new(order_response.code), order_response.error_message
62
+ end
63
+
64
+ order_response
65
+ end
66
+
67
+ private
68
+
69
+ def get_order_request(mode, order)
70
+ xml_request = create_request(mode)
71
+ xml_request.auth.ukey = @ukey
72
+ xml_request.order = order
73
+ xml_request.prepare_checksum(@uid)
74
+ xml_request
75
+ end
76
+
77
+ def send_request(xml_request)
78
+ connection = Net::HTTP.new(AxiomusApi::AXIOMUS_HOST, AxiomusApi::AXIOMUS_PORT)
79
+ http_request = get_http_request(xml_request)
80
+ logger.info("Request to #{xml_request.mode}")
81
+ logger.debug("Request body: #{xml_request.to_xml}")
82
+ response = connection.request(http_request)
83
+ response.body.gsub!(/^.*<?xml/, '<?xml')
84
+ logger.info("Response: #{response.code}")
85
+ logger.debug("Response raw: #{response.body}")
86
+ response
87
+ end
88
+
89
+ def api_path
90
+ @test ? AxiomusApi::AXIOMUS_TEST_PATH : AxiomusApi::AXIOMUS_PROD_PATH
91
+ end
92
+
93
+ def get_http_request(xml_request)
94
+ res = ::Net::HTTP::Post.new(api_path)
95
+ res.body = "data=#{xml_request.to_xml(true)}"
96
+ res
97
+ end
98
+
99
+ def logger
100
+ ::AxiomusApi.logger
101
+ end
102
+
103
+ def log_response_error(description, xml_request, xml_response)
104
+ logger.error(description)
105
+ logger.error("Request body: #{xml_request}")
106
+ logger.error("Response raw: #{xml_response}")
107
+ end
108
+
109
+ end
@@ -0,0 +1,32 @@
1
+ module AxiomusApi::Validated
2
+ attr_reader :validation_errors
3
+
4
+ def valid?
5
+ @validation_errors = []
6
+ return true unless kind_of? ::AxiomusApi::Base
7
+
8
+ self.class.attribute_meta.each do |k, v|
9
+ val = self.send(k)
10
+ validate_field(k, val, v)
11
+ end
12
+
13
+ return !@validation_errors.any?
14
+ end
15
+
16
+ private
17
+
18
+ def validate_field(field, value, options)
19
+ if value.nil? || (value.respond_to?(:empty?) && value.empty?)
20
+ if !options[:optional]
21
+ @validation_errors << "Field #{field} is required"
22
+ end
23
+ else
24
+ if !(options[:type].nil? || value.is_a?(options[:type]))
25
+ @validation_errors << "Field #{field} must be of type #{options[:type]}"
26
+ elsif value.respond_to?(:valid?) && !value.valid?
27
+ @validation_errors += value.validation_errors.map{|ve| "#{field} -> #{ve}"}
28
+ end
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,3 @@
1
+ module AxiomusApi
2
+ VERSION = '0.1'
3
+ end
@@ -0,0 +1,34 @@
1
+ require 'logger'
2
+
3
+ module AxiomusApi
4
+ AXIOMUS_PROD_PATH = '/hydra/api_xml.php'
5
+ AXIOMUS_TEST_PATH = '/test/api_xml_test.php'
6
+ AXIOMUS_HOST = 'axiomus.ru'
7
+ AXIOMUS_PORT = 80
8
+ AXIOMUS_TEST_CREDENTIALS = {ukey: 'XXcd208495d565ef66e7dff9f98764XX', uid: '92'}
9
+
10
+ @logger = Logger.new($stdout)
11
+ @logger.level = Logger::INFO
12
+
13
+ def self.logger=(val)
14
+ @logger = val
15
+ end
16
+
17
+ def self.logger
18
+ @logger
19
+ end
20
+
21
+ def self.test_session(&block)
22
+ session = AxiomusApi::Session.new(AXIOMUS_TEST_CREDENTIALS[:uid], AXIOMUS_TEST_CREDENTIALS[:ukey], true, &block)
23
+ end
24
+
25
+ end
26
+
27
+ require_relative('axiomus_api/actions')
28
+ require_relative('axiomus_api/errors')
29
+ require_relative('axiomus_api/response_codes')
30
+
31
+ Dir.glob(File.join(File.dirname(__FILE__),'axiomus_api/**/*.rb')).each do |file|
32
+ require_relative(file)
33
+ end
34
+
data/spec/factories.rb ADDED
@@ -0,0 +1,200 @@
1
+ #coding: utf-8
2
+
3
+ FactoryGirl.define do
4
+ sequence :inner_id do |n|
5
+ n
6
+ end
7
+
8
+ sequence :sms do |n|
9
+ (79030000000+n).to_s
10
+ end
11
+
12
+ sequence :boolean do
13
+ ['yes', 'no'][rand(0..1)]
14
+ end
15
+
16
+ factory :item, class: AxiomusApi::Item do
17
+ name {"Product #{rand(1..1000)}"}
18
+ weight {rand(0.1..10.0)}
19
+ quantity {rand(1..10)}
20
+ price {rand(0.5..10000.0)}
21
+ end
22
+
23
+ factory :export_item, class: AxiomusApi::ExportItem, parent: :item do
24
+ oid {rand(10000..99999)}
25
+ end
26
+
27
+ factory :services, class: AxiomusApi::Services do
28
+ cash {generate :boolean}
29
+ cheque {generate :boolean}
30
+ card {generate :boolean}
31
+ big {generate :boolean}
32
+ end
33
+
34
+ factory :export_services, class: AxiomusApi::ExportServices do
35
+ transit {generate :boolean}
36
+ warrant {generate :boolean}
37
+ end
38
+
39
+ factory :post_services, class: AxiomusApi::PostServices do
40
+ valuation {generate :boolean}
41
+ fragile {generate :boolean}
42
+ cod {generate :boolean}
43
+ big {generate :boolean}
44
+ end
45
+
46
+ factory :region_services, class: AxiomusApi::RegionServices do
47
+ cheque {generate :boolean}
48
+ not_open {generate :boolean}
49
+ extrapack {generate :boolean}
50
+ big {generate :boolean}
51
+ end
52
+
53
+ factory :base_order, class: AxiomusApi::BaseOrder do
54
+ contacts 'John Galt'
55
+ description 'Awesome description'
56
+ inner_id {rand(1..2)==2 ? generate(:inner_id) : nil}
57
+ name 'John Galt'
58
+
59
+ trait :has_okey do
60
+ okey '2e3023c3e78f4f0c8cbb81257743c2d7'
61
+ end
62
+
63
+ places {rand(1..2)}
64
+ services {build(:services)}
65
+
66
+ after(:build) do |order|
67
+ rand(1..10).times do
68
+ order.items << build(:item)
69
+ end
70
+ end
71
+ end
72
+
73
+ factory :post_address, class: AxiomusApi::PostAddress do
74
+ index '344018'
75
+ region 'обл Ростовская'
76
+ area 'Ростов-на-Дону'
77
+ p_address 'пер. Соборный, д61, кв21'
78
+ end
79
+
80
+ factory :ems_address, class: AxiomusApi::EmsAddress do
81
+ index '344018'
82
+ area 'Ростов-на-Дону'
83
+ street 'пер Соборный'
84
+ house '61'
85
+ apartment '21'
86
+ end
87
+
88
+ factory :dpd_address, class: AxiomusApi::DpdAddress, parent: :ems_address do
89
+ region 'обл Ростовская'
90
+ end
91
+
92
+ factory :region_courier_address, class: AxiomusApi::RegionCourierAddress do
93
+ region_code 33
94
+ city_code 29
95
+ index '344018'
96
+ street 'пер. Соборный'
97
+ house 61
98
+ apartment 21
99
+ end
100
+
101
+ factory :region_pickup_address, class: AxiomusApi::RegionPickupAddress do
102
+ office_code 32
103
+ end
104
+
105
+ factory :order, class: AxiomusApi::Order, parent: :base_order do
106
+ trait :incl_delivery_sum do
107
+ incl_delivery_sum rand(100.0..200.00)
108
+ end
109
+
110
+ sms {rand(1..2) ? generate(:sms) : nil}
111
+ d_date {Time.now + rand(1..10)*24*60*60}
112
+ b_time {rand(10..19)}
113
+ e_time {b_time + 3}
114
+ address 'Москва, Живописная, д4 корп1, кв 16'
115
+ city 0
116
+ garden_ring {generate :boolean}
117
+ from_mkad {rand(1..2) == 2 && garden_ring !='yes' && city > 0 ? rand(1..40) : nil}
118
+ end
119
+
120
+ factory :carry_order, class: AxiomusApi::CarryOrder, parent: :base_order do
121
+ sms {rand(1..2) ? generate(:sms) : nil}
122
+ office {[0, 1, nil][rand(0..2)]}
123
+ b_date {Time.now + rand(5..10)*24*60*60}
124
+ e_date {b_date + 7*24*60*60}
125
+ end
126
+
127
+ factory :export_order, class: AxiomusApi::ExportOrder, parent: :base_order do
128
+ export_quantity {rand(1..3)}
129
+ transit {generate :boolean}
130
+ d_date {Time.now + rand(1..10)*24*60*60}
131
+ b_time {rand(10..19)}
132
+ e_time {b_time + 3}
133
+ services {build(:export_services)}
134
+ address 'Москва, Живописная, д4 корп1, кв 16'
135
+ garden_ring {generate :boolean}
136
+ from_mkad {garden_ring == 'yes' ? nil : rand(1..40)}
137
+
138
+ after(:build) do |order|
139
+ order.items = []
140
+ rand(1..10).times do
141
+ order.items << build(:export_item)
142
+ end
143
+ end
144
+ end
145
+
146
+ factory :self_export_order, class: AxiomusApi::SelfExportOrder, parent: :base_order do
147
+ car 'с065мк61'
148
+ d_date {Time.now + rand(1..10)*24*60*60}
149
+ b_time {rand(10..19)}
150
+ e_time {b_time + 3}
151
+ quantity {rand(1..3)}
152
+
153
+ after(:build) do |order|
154
+ order.items = []
155
+ rand(1..10).times do
156
+ order.items << build(:export_item)
157
+ end
158
+ end
159
+ end
160
+
161
+ factory :post_order, class: AxiomusApi::PostOrder, parent: :base_order do
162
+ d_date {Time.now + rand(1..10)*24*60*60}
163
+ post_type {rand(1..2)}
164
+ address {build(:post_address)}
165
+ services {build(:post_services)}
166
+ contacts {generate(:sms)}
167
+ end
168
+
169
+ factory :ems_order, class: AxiomusApi::EmsOrder, parent: :base_order do
170
+ d_date {Time.now + rand(1..10)*24*60*60}
171
+ address {build(:ems_address)}
172
+ services {build(:post_services)}
173
+ contacts {generate(:sms)}
174
+ end
175
+
176
+ factory :region_order, class: AxiomusApi::RegionOrder, parent: :base_order do
177
+ d_date {(Time.now + rand(5..15)*24*60*60).strftime('%Y-%m-%d')}
178
+ b_time {rand(10..17)}
179
+ e_time {b_time + 1}
180
+ services {build(:region_services)}
181
+ end
182
+
183
+ factory :region_courier_order, class: AxiomusApi::RegionCourierOrder, parent: :region_order do
184
+ address {build(:region_courier_address)}
185
+ end
186
+
187
+ factory :region_pickup_order, class: AxiomusApi::RegionPickupOrder, parent: :region_order do
188
+ address {build(:region_pickup_address)}
189
+ end
190
+
191
+ factory :dpd_order, class: AxiomusApi::DpdOrder, parent: :base_order do
192
+ post_type {rand(1..2)}
193
+ services {build(:post_services)}
194
+ address {build(:dpd_address)}
195
+ d_date {(Time.now + rand(5..15)*24*60*60).strftime('%Y-%m-%d')}
196
+ b_time {rand(10..17)}
197
+ e_time {b_time + 1}
198
+ end
199
+
200
+ end