omniorder 0.0.3 → 0.0.4
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
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
|