omniorder 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 08acaaeabef190021f9adb0423a59faec3783c73
|
4
|
+
data.tar.gz: 8e77e461b790a6bb3ecbe8e133551eb5e3075c07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2ee79b57210e4fedc5966a7ffd2b7d5cb3cde9db21bd37c456dadcdbca22c83ef93d7ed7650b9fb1cc9d4810f1f5831e4660c0110e2e805544ce3fa03c7367d
|
7
|
+
data.tar.gz: b8d070076a5600e7f03a9ea79737644c9e7808e7e0c3d79c53e617502b86aad411e232a1087e015f4997549bed21ef76c34957ba0574c8dd30da18c143a59dcc
|
@@ -3,6 +3,8 @@ module Omniorder
|
|
3
3
|
# Groupon Import Strategy
|
4
4
|
# See: https://scm.commerceinterface.com/api-doc/v2/
|
5
5
|
class Groupon < Base
|
6
|
+
require 'json'
|
7
|
+
|
6
8
|
API_URL = "https://scm.commerceinterface.com/api/v2/"
|
7
9
|
|
8
10
|
attr_accessor :supplier_id, :access_token
|
@@ -33,6 +35,35 @@ module Omniorder
|
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
38
|
+
def update_order_tracking!(orders)
|
39
|
+
orders = [*orders].select do |order|
|
40
|
+
if order.respond_to?(:shipping_reference) && !order.shipping_reference.nil?
|
41
|
+
if order.external_carrier_reference.nil? || order.external_carrier_reference == ''
|
42
|
+
raise "Cannot send tracking info for Groupon order ##{order.order_number} since it has no external_carrier_reference"
|
43
|
+
end
|
44
|
+
|
45
|
+
if order.order_products.any? { |op| op.external_reference.to_i == 0 }
|
46
|
+
raise "Cannot send tracking info for Groupon order ##{order.order_number} since a line item has no external_reference"
|
47
|
+
end
|
48
|
+
|
49
|
+
true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
unless orders.empty?
|
54
|
+
result = Crack::JSON.parse do_request(tracking_notification_url(orders), :post)
|
55
|
+
end
|
56
|
+
|
57
|
+
if result && result['success'].nil?
|
58
|
+
# Include order number too if there is only one order
|
59
|
+
if orders.count == 1
|
60
|
+
raise "Failed to update Groupon tracking data for order ##{orders.first.order_number} (#{result['reason']})"
|
61
|
+
else
|
62
|
+
raise "Failed to update Groupon tracking data (#{result['reason']})"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
36
67
|
def get_orders_url
|
37
68
|
URI.join(API_URL, "get_orders?supplier_id=#{supplier_id}&token=#{access_token}")
|
38
69
|
end
|
@@ -42,6 +73,20 @@ module Omniorder
|
|
42
73
|
URI.join(API_URL, "mark_exported?supplier_id=#{supplier_id}&token=#{access_token}&ci_lineitem_ids=[#{lids.join(',')}]")
|
43
74
|
end
|
44
75
|
|
76
|
+
def tracking_notification_url(orders)
|
77
|
+
tracking_info = orders.map do |order|
|
78
|
+
order.order_products.map do |line_item|
|
79
|
+
{
|
80
|
+
"carrier" => order.external_carrier_reference,
|
81
|
+
"ci_lineitem_id" => line_item.external_reference.to_i,
|
82
|
+
"tracking" => order.shipping_reference
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end.flatten
|
86
|
+
|
87
|
+
File.join(API_URL, "tracking_notification?supplier_id=#{supplier_id}&token=#{access_token}&tracking_info=#{tracking_info.to_json}")
|
88
|
+
end
|
89
|
+
|
45
90
|
private
|
46
91
|
|
47
92
|
def create_order(order_info)
|
@@ -54,7 +99,11 @@ module Omniorder
|
|
54
99
|
order.customer = create_customer(order, order_info['customer'])
|
55
100
|
|
56
101
|
order_info['line_items'].each do |line_item_info|
|
57
|
-
order.add_product_by_code(
|
102
|
+
order.add_product_by_code(
|
103
|
+
line_item_info['sku'].to_s,
|
104
|
+
line_item_info['quantity'].to_i,
|
105
|
+
line_item_info['ci_lineitemid'].to_i
|
106
|
+
)
|
58
107
|
end
|
59
108
|
|
60
109
|
after_build_order order, order_info
|
@@ -82,7 +131,8 @@ module Omniorder
|
|
82
131
|
private
|
83
132
|
|
84
133
|
def do_request(url, type = :get)
|
85
|
-
|
134
|
+
host_and_path, query = url.to_s.split('?')
|
135
|
+
uri = URI(type == :get ? url : host_and_path)
|
86
136
|
http = Net::HTTP.new(uri.host, 443)
|
87
137
|
http.use_ssl = true
|
88
138
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
@@ -91,8 +141,8 @@ module Omniorder
|
|
91
141
|
if type == :get
|
92
142
|
http.request(Net::HTTP::Get.new(uri.request_uri)).body
|
93
143
|
else
|
94
|
-
request = Net::HTTP::Post.new(
|
95
|
-
request.body =
|
144
|
+
request = Net::HTTP::Post.new(host_and_path)
|
145
|
+
request.body = query
|
96
146
|
http.request(request).body
|
97
147
|
end
|
98
148
|
end
|
data/lib/omniorder/order.rb
CHANGED
@@ -2,7 +2,8 @@ module Omniorder
|
|
2
2
|
class Order < Entity
|
3
3
|
include Orderable
|
4
4
|
|
5
|
-
attributes :customer, :order_products, :order_number, :total_price, :date
|
5
|
+
attributes :customer, :order_products, :order_number, :total_price, :date, :shipping_reference,
|
6
|
+
:external_carrier_reference
|
6
7
|
|
7
8
|
def initialize(attributes = {})
|
8
9
|
super
|
data/lib/omniorder/orderable.rb
CHANGED
@@ -7,19 +7,23 @@ module Omniorder
|
|
7
7
|
Omniorder.customer_type.new(attributes)
|
8
8
|
end
|
9
9
|
|
10
|
-
def add_product(product, quantity = 1)
|
10
|
+
def add_product(product, quantity = 1, external_reference = nil)
|
11
11
|
order_product = order_products.to_a.find { |op| op.product == product }
|
12
12
|
|
13
13
|
if order_product.nil?
|
14
|
-
order_products << Omniorder.order_product_type.new(
|
14
|
+
order_products << Omniorder.order_product_type.new(
|
15
|
+
:product => product,
|
16
|
+
:quantity => quantity,
|
17
|
+
:external_reference => external_reference
|
18
|
+
)
|
15
19
|
else
|
16
20
|
order_product.quantity += quantity
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
20
|
-
def add_product_by_code(code, quantity = 1)
|
24
|
+
def add_product_by_code(code, quantity = 1, external_reference = nil)
|
21
25
|
Omniorder.product_type.find_by_code(code).tap do |product|
|
22
|
-
add_product product, quantity unless product.nil?
|
26
|
+
add_product product, quantity, external_reference unless product.nil?
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
data/lib/omniorder/version.rb
CHANGED
@@ -44,6 +44,7 @@ describe Omniorder::ImportStrategy::Groupon do
|
|
44
44
|
order_product = order.order_products.first
|
45
45
|
expect(order_product.quantity).to eq(3)
|
46
46
|
expect(order_product.product.code).to eq('03658246')
|
47
|
+
expect(order_product.external_reference).to eq(54553918)
|
47
48
|
|
48
49
|
customer = order.customer
|
49
50
|
expect(customer.name).to eq("SOME BODY HERE")
|
@@ -87,4 +88,85 @@ describe Omniorder::ImportStrategy::Groupon do
|
|
87
88
|
end
|
88
89
|
end
|
89
90
|
end
|
91
|
+
|
92
|
+
describe '#update_order_tracking!' do
|
93
|
+
let(:tracking_notification_result) { '{ "success": true }' }
|
94
|
+
let!(:tracking_notification_stub) do
|
95
|
+
stub_request(
|
96
|
+
:post,
|
97
|
+
"https://scm.commerceinterface.com/api/v2/tracking_notification"
|
98
|
+
).with(
|
99
|
+
body: "supplier_id=1&token=xYRPKcoakMoiRzWgKLV5TqPSdNAaZQT&tracking_info=[{\"carrier\":\"4SL\",\"ci_lineitem_id\":54553918,\"tracking\":\"SR123451\"},{\"carrier\":\"DHL\",\"ci_lineitem_id\":54553920,\"tracking\":\"SR123452\"}]"
|
100
|
+
).to_return(
|
101
|
+
body: tracking_notification_result,
|
102
|
+
status: 200
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'updates Groupon tracking information from orders' do
|
107
|
+
orders = [
|
108
|
+
Omniorder::Order.new(
|
109
|
+
:shipping_reference => 'SR123451',
|
110
|
+
:external_carrier_reference => '4SL',
|
111
|
+
:order_products => [Omniorder::OrderProduct.new(:external_reference => '54553918')]
|
112
|
+
),
|
113
|
+
Omniorder::Order.new(
|
114
|
+
:shipping_reference => 'SR123452',
|
115
|
+
:external_carrier_reference => 'DHL',
|
116
|
+
:order_products => [Omniorder::OrderProduct.new(:external_reference => '54553920')]
|
117
|
+
)
|
118
|
+
]
|
119
|
+
|
120
|
+
strategy.update_order_tracking!(orders)
|
121
|
+
expect(tracking_notification_stub).to have_been_requested.once
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'does nothing when an order has no shipping_reference' do
|
125
|
+
order = Omniorder::Order.new(
|
126
|
+
:order_number => 'ORD1',
|
127
|
+
:external_carrier_reference => '4SL',
|
128
|
+
:order_products => [Omniorder::OrderProduct.new(:external_reference => '54553918')]
|
129
|
+
)
|
130
|
+
|
131
|
+
# Exception would be raised on request as single-order stub does not exist
|
132
|
+
strategy.update_order_tracking!(order)
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'raises an exception when an order has no external_carrier_reference' do
|
136
|
+
orders = [
|
137
|
+
Omniorder::Order.new(
|
138
|
+
:order_number => 'ORD1',
|
139
|
+
:shipping_reference => 'SR123451',
|
140
|
+
:order_products => [Omniorder::OrderProduct.new(:external_reference => '54553918')]
|
141
|
+
),
|
142
|
+
Omniorder::Order.new(
|
143
|
+
:shipping_reference => 'SR123452',
|
144
|
+
:external_carrier_reference => 'DHL',
|
145
|
+
:order_products => [Omniorder::OrderProduct.new(:external_reference => '54553920')]
|
146
|
+
)
|
147
|
+
]
|
148
|
+
|
149
|
+
expect { strategy.update_order_tracking!(orders) }.
|
150
|
+
to raise_exception "Cannot send tracking info for Groupon order #ORD1 since it has no external_carrier_reference"
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'raises an exception when and order line item has no external_reference' do
|
154
|
+
orders = [
|
155
|
+
Omniorder::Order.new(
|
156
|
+
:order_number => 'ORD1',
|
157
|
+
:shipping_reference => 'SR123451',
|
158
|
+
:external_carrier_reference => '4SL',
|
159
|
+
:order_products => [Omniorder::OrderProduct.new]
|
160
|
+
),
|
161
|
+
Omniorder::Order.new(
|
162
|
+
:shipping_reference => 'SR123452',
|
163
|
+
:external_carrier_reference => 'DHL',
|
164
|
+
:order_products => [Omniorder::OrderProduct.new(:external_reference => '54553920')]
|
165
|
+
)
|
166
|
+
]
|
167
|
+
|
168
|
+
expect { strategy.update_order_tracking!(orders) }.
|
169
|
+
to raise_exception "Cannot send tracking info for Groupon order #ORD1 since a line item has no external_reference"
|
170
|
+
end
|
171
|
+
end
|
90
172
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniorder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Howard Wilson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: crack
|