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.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +10 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +67 -0
- data/LICENSE +21 -0
- data/README.md +119 -0
- data/axiomus_api.gemspec +19 -0
- data/lib/axiomus_api/actions.rb +32 -0
- data/lib/axiomus_api/address/dpd_address.rb +8 -0
- data/lib/axiomus_api/address/ems_address.rb +8 -0
- data/lib/axiomus_api/address/post_address.rb +7 -0
- data/lib/axiomus_api/address/region_courier_address.rb +8 -0
- data/lib/axiomus_api/address/region_pickup_address.rb +7 -0
- data/lib/axiomus_api/base.rb +69 -0
- data/lib/axiomus_api/base_auth.rb +9 -0
- data/lib/axiomus_api/errors.rb +14 -0
- data/lib/axiomus_api/item/export_item.rb +5 -0
- data/lib/axiomus_api/item/item.rb +7 -0
- data/lib/axiomus_api/order/base_order.rb +53 -0
- data/lib/axiomus_api/order/carry_order.rb +7 -0
- data/lib/axiomus_api/order/dpd_order.rb +11 -0
- data/lib/axiomus_api/order/ems_order.rb +12 -0
- data/lib/axiomus_api/order/export_order.rb +14 -0
- data/lib/axiomus_api/order/order.rb +8 -0
- data/lib/axiomus_api/order/post_order.rb +12 -0
- data/lib/axiomus_api/order/region_courier_order.rb +8 -0
- data/lib/axiomus_api/order/region_order.rb +8 -0
- data/lib/axiomus_api/order/region_pickup_order.rb +8 -0
- data/lib/axiomus_api/order/self_export_order.rb +15 -0
- data/lib/axiomus_api/request/order_request.rb +17 -0
- data/lib/axiomus_api/request/request.rb +10 -0
- data/lib/axiomus_api/request/status_request.rb +5 -0
- data/lib/axiomus_api/response/order_response.rb +29 -0
- data/lib/axiomus_api/response/regions_response.rb +54 -0
- data/lib/axiomus_api/response/status_response.rb +84 -0
- data/lib/axiomus_api/response_codes.rb +24 -0
- data/lib/axiomus_api/serializable.rb +55 -0
- data/lib/axiomus_api/services/export_services.rb +7 -0
- data/lib/axiomus_api/services/post_services.rb +7 -0
- data/lib/axiomus_api/services/region_services.rb +7 -0
- data/lib/axiomus_api/services/services.rb +7 -0
- data/lib/axiomus_api/session.rb +109 -0
- data/lib/axiomus_api/validated.rb +32 -0
- data/lib/axiomus_api/version.rb +3 -0
- data/lib/axiomus_api.rb +34 -0
- data/spec/factories.rb +200 -0
- data/spec/integration/axiomus_api/session_spec.rb +130 -0
- data/spec/lib/axiomus_api/base_order_spec.rb +55 -0
- data/spec/lib/axiomus_api/session_spec.rb +47 -0
- data/spec/lib/axiomus_api_spec.rb +5 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/support/dummy_data.rb +61 -0
- data/spec/support/http_mocking.rb +21 -0
- metadata +113 -0
@@ -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,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
|
data/lib/axiomus_api.rb
ADDED
@@ -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
|