item_builder 0.1.35 → 0.1.40
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 +4 -4
- data/lib/item_builder.rb +22 -7
- data/lib/item_builder/get_quantity_service.rb +1 -1
- data/lib/item_builder/modes.rb +10 -8
- data/lib/item_builder/modes/active_service.rb +3 -3
- data/lib/item_builder/modes/quantity/base.rb +3 -3
- data/lib/item_builder/modes/quantity/lazada_service.rb +1 -1
- data/lib/item_builder/modes/quantity/zalora_service.rb +1 -1
- data/lib/item_builder/modes/quantity/zilingo_service.rb +1 -1
- data/lib/item_builder/modes/quantity_service.rb +22 -9
- data/lib/item_builder/modes/simple_service.rb +2 -2
- data/lib/item_builder/shopify_quantity_service.rb +118 -0
- data/lib/item_builder/version.rb +1 -1
- data/lib/item_builder/zalora_quantity_service.rb +13 -7
- data/lib/item_builder/zilingo_quantity_service.rb +3 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9105f19ab628cbee42342b843bb2900ecb3d99d80036b2412c094d0a7386f2a1
|
4
|
+
data.tar.gz: 52910c9fc720ea5932874ea1ea4fbb7d20eab29ccb3deb4b1f2a79f70e971725
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 664f4c500f1b02523cec53db670303b0222d7fac1f160fac419a0f44dfa96c8cbcf386879ce6cdab42a8a41540a5339c651242e719684ed661ca21e2391e2499
|
7
|
+
data.tar.gz: 0fd76898fc7610770498cbb58fa7d62d078189e6ed75f81df83db07e48c92c32af717bbf7dd0328b62b718628a0202e8fc13349b8802ba33ce75852c16a3300d
|
data/lib/item_builder.rb
CHANGED
@@ -10,7 +10,7 @@ require 'item_builder/modes/active_service'
|
|
10
10
|
require 'item_models'
|
11
11
|
require 'item_builder/zilingo_quantity_service'
|
12
12
|
require 'item_builder/zalora_quantity_service'
|
13
|
-
|
13
|
+
require 'item_builder/shopify_quantity_service'
|
14
14
|
class ItemBuilder
|
15
15
|
def self.build(listing_ids, mode)
|
16
16
|
new(listing_ids, mode).mode_check
|
@@ -29,7 +29,7 @@ class ItemBuilder
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def mode_check
|
32
|
-
if mode == :quantity || mode == :simple
|
32
|
+
if mode == :quantity || mode == :simple
|
33
33
|
quantity_simple_mode
|
34
34
|
else
|
35
35
|
default
|
@@ -40,12 +40,17 @@ class ItemBuilder
|
|
40
40
|
listings.map do |listing|
|
41
41
|
if listing.channel_id == 18
|
42
42
|
new_param = qty_simple_params(listing)
|
43
|
-
.merge(
|
43
|
+
.merge(zilingo_quantity: zilingo_quantity)
|
44
44
|
|
45
45
|
modes[mode].new(new_param).perform
|
46
46
|
elsif listing.channel_id == 13
|
47
47
|
new_param = qty_simple_params(listing)
|
48
|
-
.merge(
|
48
|
+
.merge(zalora_reserved_stock: zalora_reserved_stock)
|
49
|
+
|
50
|
+
modes[mode].new(new_param).perform
|
51
|
+
elsif listing.channel_id == 2
|
52
|
+
new_param = qty_simple_params(listing)
|
53
|
+
.merge({shopify_inventory_location: shopify_inventory_location})
|
49
54
|
|
50
55
|
modes[mode].new(new_param).perform
|
51
56
|
else
|
@@ -60,7 +65,7 @@ class ItemBuilder
|
|
60
65
|
stock_allocs: stock_allocs, variant_listings: variant_listings,
|
61
66
|
bundles: bundles, item_bundle_variants: item_bundle_variants,
|
62
67
|
existing_alloc_stocks: existing_alloc_stocks,
|
63
|
-
reserved_stocks: reserved_stocks
|
68
|
+
reserved_stocks: reserved_stocks
|
64
69
|
}
|
65
70
|
end
|
66
71
|
|
@@ -68,6 +73,10 @@ class ItemBuilder
|
|
68
73
|
listings.map do |listing|
|
69
74
|
if listing.channel_id == 2 && mode == :active
|
70
75
|
modes[mode].new(qty_simple_params(listing)).perform
|
76
|
+
elsif listing.channel_id == 18 && mode == :active
|
77
|
+
modes[mode].new(qty_simple_params(listing)
|
78
|
+
.merge(zilingo_quantity: zilingo_quantity)
|
79
|
+
).perform
|
71
80
|
else
|
72
81
|
modes[mode].new(listing: listing).perform
|
73
82
|
end
|
@@ -128,8 +137,8 @@ class ItemBuilder
|
|
128
137
|
@skus ||= listings.map(&:local_id).uniq
|
129
138
|
end
|
130
139
|
|
131
|
-
def
|
132
|
-
@
|
140
|
+
def zilingo_quantity
|
141
|
+
@zilingo_quantity ||= ItemBuilder::ZilingoQuantityService.new(
|
133
142
|
listings: listings, skus: skus
|
134
143
|
).perform
|
135
144
|
end
|
@@ -140,6 +149,12 @@ class ItemBuilder
|
|
140
149
|
).perform
|
141
150
|
end
|
142
151
|
|
152
|
+
def shopify_inventory_location
|
153
|
+
@shopify_inventory_location ||= ItemBuilder::ShopifyQuantityService.new(
|
154
|
+
listings: listings, skus: skus
|
155
|
+
).perform
|
156
|
+
end
|
157
|
+
|
143
158
|
def modes
|
144
159
|
{
|
145
160
|
price: ItemBuilder::Modes::PriceService,
|
data/lib/item_builder/modes.rb
CHANGED
@@ -17,8 +17,9 @@ class ItemBuilder
|
|
17
17
|
attr_reader :existing_alloc_stocks
|
18
18
|
attr_reader :variant_listings
|
19
19
|
attr_reader :reserved_stocks
|
20
|
-
attr_reader :
|
20
|
+
attr_reader :zilingo_quantity
|
21
21
|
attr_reader :zalora_reserved_stock
|
22
|
+
attr_reader :shopify_inventory_location
|
22
23
|
def initialize(args)
|
23
24
|
@listing = args.fetch(:listing)
|
24
25
|
@wh_spaces = args.fetch(:wh_spaces, [])
|
@@ -29,8 +30,9 @@ class ItemBuilder
|
|
29
30
|
@existing_alloc_stocks = args.fetch(:existing_alloc_stocks, [])
|
30
31
|
@variant_listings = args.fetch(:variant_listings, [])
|
31
32
|
@reserved_stocks = args.fetch(:reserved_stocks, [])
|
32
|
-
@
|
33
|
+
@zilingo_quantity = args.fetch(:zilingo_quantity, [])
|
33
34
|
@zalora_reserved_stock = args.fetch(:zalora_reserved_stock, [])
|
35
|
+
@shopify_inventory_location = args.fetch(:shopify_inventory_location, [])
|
34
36
|
end
|
35
37
|
|
36
38
|
def base
|
@@ -51,29 +53,29 @@ class ItemBuilder
|
|
51
53
|
end
|
52
54
|
|
53
55
|
def listings
|
54
|
-
variant_listings.select {|vl| vl.variant_id == listing.variant_id}
|
56
|
+
variant_listings.select { |vl| vl.variant_id == listing.variant_id}
|
55
57
|
end
|
56
58
|
|
57
59
|
def bundle_variants
|
58
60
|
if bundle.present?
|
59
|
-
item_bundle_variants.select {|ibv| ibv.bundle_id == bundle.id }
|
61
|
+
item_bundle_variants.select { |ibv| ibv.bundle_id == bundle.id }
|
60
62
|
end
|
61
63
|
end
|
62
64
|
|
63
65
|
def bundle
|
64
|
-
bundles.select {|b| b.variant_id == listing.variant_id }.first
|
66
|
+
bundles.select { |b| b.variant_id == listing.variant_id }.first
|
65
67
|
end
|
66
68
|
|
67
69
|
def stock_alloc
|
68
|
-
stock_allocs.select {|sa| sa.variant_association_id == listing.id }.first
|
70
|
+
stock_allocs.select { |sa| sa.variant_association_id == listing.id }.first
|
69
71
|
end
|
70
72
|
|
71
73
|
def warehouse
|
72
|
-
wh_spaces.select {|ws| ws.item_variant_id == listing.variant_id }.first
|
74
|
+
wh_spaces.select { |ws| ws.item_variant_id == listing.variant_id }.first
|
73
75
|
end
|
74
76
|
|
75
77
|
def variant
|
76
|
-
variants.select {|v| v.id == listing.variant_id }.first
|
78
|
+
variants.select { |v| v.id == listing.variant_id }.first
|
77
79
|
end
|
78
80
|
end
|
79
81
|
end
|
@@ -8,7 +8,7 @@ class ItemBuilder
|
|
8
8
|
include Modes
|
9
9
|
|
10
10
|
def perform
|
11
|
-
if listing.channel_id == 2
|
11
|
+
if listing.channel_id == 2 || listing.channel_id == 18
|
12
12
|
to_h.merge(base).merge(quantity)
|
13
13
|
else
|
14
14
|
to_h.merge(base)
|
@@ -28,8 +28,8 @@ class ItemBuilder
|
|
28
28
|
stock_allocs: stock_allocs, variant_listings: variant_listings,
|
29
29
|
bundles: bundles, item_bundle_variants: item_bundle_variants,
|
30
30
|
existing_alloc_stocks: existing_alloc_stocks,
|
31
|
-
reserved_stocks: reserved_stocks,
|
32
|
-
|
31
|
+
reserved_stocks: reserved_stocks,
|
32
|
+
zilingo_quantity: zilingo_quantity,
|
33
33
|
zalora_reserved_stock: zalora_reserved_stock
|
34
34
|
).to_h
|
35
35
|
end
|
@@ -6,14 +6,14 @@ class ItemBuilder
|
|
6
6
|
class Base
|
7
7
|
attr_reader :listing
|
8
8
|
attr_reader :available_quantity
|
9
|
-
attr_reader :
|
9
|
+
attr_reader :local_qty
|
10
10
|
|
11
|
-
def initialize(listing, available_quantity,
|
11
|
+
def initialize(listing, available_quantity, local_qty)
|
12
12
|
raise 'listing is not set' if listing.nil?
|
13
13
|
|
14
14
|
@listing = listing
|
15
15
|
@available_quantity = available_quantity
|
16
|
-
@
|
16
|
+
@local_qty = local_qty
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -14,22 +14,31 @@ class ItemBuilder
|
|
14
14
|
|
15
15
|
QUANTITY_CHANNEL = {}.tap do |hash|
|
16
16
|
hash[3] = :Lazada
|
17
|
+
hash[2] = :Shopify
|
17
18
|
hash[13] = :Zalora
|
18
19
|
hash[18] = :Zilingo
|
19
20
|
end.freeze
|
20
21
|
|
21
22
|
def perform
|
22
|
-
|
23
|
+
if channel_name == "Shopify"
|
24
|
+
base.merge(to_h, shopify_inventory_location[listing.local_id])
|
25
|
+
else
|
26
|
+
to_h.merge(base)
|
27
|
+
end
|
23
28
|
end
|
24
29
|
|
25
30
|
def to_h
|
26
|
-
|
27
|
-
quantity:
|
28
|
-
|
31
|
+
if channel_name == "Zilingo"
|
32
|
+
{ quantity: qty }
|
33
|
+
else
|
34
|
+
{
|
35
|
+
quantity: [qty, 0].sort[1]
|
36
|
+
}
|
37
|
+
end
|
29
38
|
end
|
30
39
|
|
31
40
|
def qty
|
32
|
-
if channel_name.empty?
|
41
|
+
if channel_name.empty? || channel_name == "Shopify"
|
33
42
|
available_quantity
|
34
43
|
else
|
35
44
|
qty_channel
|
@@ -39,20 +48,24 @@ class ItemBuilder
|
|
39
48
|
def qty_channel
|
40
49
|
class_name = "ItemBuilder::Modes::Quantity::#{channel_name}Service"
|
41
50
|
qty_channel_service = class_name.constantize
|
42
|
-
qty_channel_service.new(listing, available_quantity,
|
51
|
+
qty_channel_service.new(listing, available_quantity, local_qty.to_i).perform
|
43
52
|
end
|
44
53
|
|
45
54
|
def channel_name
|
46
55
|
QUANTITY_CHANNEL[listing.channel_id].to_s
|
47
56
|
end
|
48
57
|
|
49
|
-
def
|
58
|
+
def local_qty
|
50
59
|
if channel_name == 'Zilingo'
|
51
|
-
|
60
|
+
return 0 if zilingo_quantity.blank?
|
61
|
+
|
62
|
+
zilingo_quantity[listing.local_id].to_i
|
52
63
|
elsif channel_name == 'Zalora'
|
64
|
+
return 0 if zalora_reserved_stock.blank?
|
65
|
+
|
53
66
|
zalora_reserved_stock[listing.local_id].to_i
|
54
67
|
else
|
55
|
-
reserved_stocks.find {|rs| rs['variant_id'] == listing.variant_id }['reserved_quantity']
|
68
|
+
reserved_stocks.find { |rs| rs['variant_id'] == listing.variant_id }['reserved_quantity']
|
56
69
|
end
|
57
70
|
end
|
58
71
|
|
@@ -22,8 +22,8 @@ class ItemBuilder
|
|
22
22
|
stock_allocs: stock_allocs, variant_listings: variant_listings,
|
23
23
|
bundles: bundles, item_bundle_variants: item_bundle_variants,
|
24
24
|
existing_alloc_stocks: existing_alloc_stocks,
|
25
|
-
reserved_stocks: reserved_stocks,
|
26
|
-
|
25
|
+
reserved_stocks: reserved_stocks,
|
26
|
+
zilingo_quantity: zilingo_quantity
|
27
27
|
).to_h
|
28
28
|
end
|
29
29
|
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'item_builder/modes.rb'
|
4
|
+
class ItemBuilder
|
5
|
+
class ShopifyQuantityService
|
6
|
+
attr_reader :listings, :skus
|
7
|
+
def initialize(args)
|
8
|
+
@listings = args.fetch(:listings)
|
9
|
+
@skus = args.fetch(:skus)
|
10
|
+
@account_id = listings[0].profile_channel_association_id
|
11
|
+
@variant_listings = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def perform
|
15
|
+
datas = {}
|
16
|
+
|
17
|
+
@listings.each do |listing|
|
18
|
+
@listing = listing
|
19
|
+
@sku = listing.local_id
|
20
|
+
datas[@sku] = response_process
|
21
|
+
end
|
22
|
+
|
23
|
+
# update variant real_local_id database icava
|
24
|
+
VariantListing.update(@variant_listings.keys, @variant_listings.values)
|
25
|
+
datas
|
26
|
+
end
|
27
|
+
|
28
|
+
def inventory_item_id
|
29
|
+
real_local_id = @listing.real_local_id
|
30
|
+
listing_id = @listing.id
|
31
|
+
|
32
|
+
if real_local_id.nil? || real_local_id.blank?
|
33
|
+
# get data from shopify
|
34
|
+
args = {method: :post, url: url_variant, payload: data_variant, headers: headers}
|
35
|
+
|
36
|
+
resp = JSON.parse(rest_client(args, [200, 500, 406]))
|
37
|
+
|
38
|
+
hash = { listing_id => { "real_local_id" => resp['inventory_item_id'] } }
|
39
|
+
@variant_listings = @variant_listings.merge(hash)
|
40
|
+
|
41
|
+
resp['inventory_item_id']
|
42
|
+
else
|
43
|
+
# real_local_id exists
|
44
|
+
real_local_id
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def location_id
|
49
|
+
cred = JSON.parse(credential)['credential']
|
50
|
+
if cred['primary_warehouse_id'].present?
|
51
|
+
cred['primary_warehouse_id']
|
52
|
+
else
|
53
|
+
# get data from shopify
|
54
|
+
args = {
|
55
|
+
method: :post, url: url_location, payload: data_location, headers: headers
|
56
|
+
}
|
57
|
+
|
58
|
+
resp = JSON.parse(rest_client(args, [200, 500, 406]))
|
59
|
+
resp['id']
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def headers
|
64
|
+
{ content_type: :json, accept: :json }
|
65
|
+
end
|
66
|
+
|
67
|
+
def data_location
|
68
|
+
{
|
69
|
+
"credential": JSON.parse(credential)['credential']
|
70
|
+
}.to_json
|
71
|
+
end
|
72
|
+
|
73
|
+
def data_variant
|
74
|
+
{
|
75
|
+
"credential": JSON.parse(credential)['credential'],
|
76
|
+
"data": { "local_id": @sku }
|
77
|
+
}.to_json
|
78
|
+
end
|
79
|
+
|
80
|
+
def credential
|
81
|
+
return @credential if @credential
|
82
|
+
|
83
|
+
host = ENV['CREDENTIAL_URL'] || raise('credential url is not set')
|
84
|
+
url = "#{host}/credential?account_id=#{@account_id}"
|
85
|
+
@credential = rest_client(method: :get, url: url)
|
86
|
+
end
|
87
|
+
|
88
|
+
def url_variant
|
89
|
+
url = ENV['API_GATEWAY_URL'] || raise('api gateway is not set')
|
90
|
+
url + "/shopify/data_variant"
|
91
|
+
end
|
92
|
+
|
93
|
+
def url_location
|
94
|
+
url = ENV['API_GATEWAY_URL'] || raise('api gateway is not set')
|
95
|
+
url + "/shopify/data_location"
|
96
|
+
end
|
97
|
+
|
98
|
+
def response_process
|
99
|
+
hash = Hash.new
|
100
|
+
|
101
|
+
hash[:inventory_item_id] = inventory_item_id.to_i
|
102
|
+
hash[:location_id] = location_id.to_i
|
103
|
+
|
104
|
+
hash
|
105
|
+
end
|
106
|
+
|
107
|
+
def rest_client(params, rescued_codes = 200)
|
108
|
+
RestClient::Request.execute(params.merge(timeout: 3)) do |response|
|
109
|
+
code = response.code
|
110
|
+
unless Array.wrap(rescued_codes).include?(code)
|
111
|
+
raise "Response Code is #{code}"
|
112
|
+
end
|
113
|
+
|
114
|
+
response
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
data/lib/item_builder/version.rb
CHANGED
@@ -6,7 +6,7 @@ class ItemBuilder
|
|
6
6
|
attr_reader :listings, :skus
|
7
7
|
def initialize(args)
|
8
8
|
@listings = args.fetch(:listings)
|
9
|
-
@skus = args.fetch(:skus)
|
9
|
+
@skus = args.fetch(:skus)
|
10
10
|
end
|
11
11
|
|
12
12
|
def perform
|
@@ -39,16 +39,22 @@ class ItemBuilder
|
|
39
39
|
|
40
40
|
def url
|
41
41
|
url = ENV['API_GATEWAY_URL'] || raise('api gateway is not set')
|
42
|
-
url +
|
42
|
+
url + '/zalora/product_stocks'
|
43
43
|
end
|
44
44
|
|
45
45
|
def response_process(resp)
|
46
|
-
if resp.dig(
|
47
|
-
raise "Response Code is #{resp.dig(
|
48
|
-
|
46
|
+
if resp.dig('response_code') && resp.dig('response_code') != 200
|
47
|
+
raise "Response Code is #{resp.dig('response_code')}"
|
48
|
+
elsif resp.dig('ErrorResponse', 'Head', 'ErrorMessage') == 'E009: Access Denied'
|
49
|
+
return nil
|
50
|
+
end
|
51
|
+
|
52
|
+
success_handle(resp)
|
53
|
+
end
|
49
54
|
|
50
|
-
|
51
|
-
|
55
|
+
def success_handle(resp)
|
56
|
+
hash = {}
|
57
|
+
resp.dig('SuccessResponse', 'Body', 'ProductStocks', 'ProductStock').each do |sku|
|
52
58
|
hash[sku['SellerSku']] = sku['ReservedStock']
|
53
59
|
end
|
54
60
|
hash
|
@@ -6,7 +6,7 @@ class ItemBuilder
|
|
6
6
|
attr_reader :listings, :skus
|
7
7
|
def initialize(args)
|
8
8
|
@listings = args.fetch(:listings)
|
9
|
-
@skus = args.fetch(:skus)
|
9
|
+
@skus = args.fetch(:skus)
|
10
10
|
end
|
11
11
|
|
12
12
|
def perform
|
@@ -39,11 +39,11 @@ class ItemBuilder
|
|
39
39
|
|
40
40
|
def url
|
41
41
|
url = ENV['API_GATEWAY_URL'] || raise('api gateway is not set')
|
42
|
-
url +
|
42
|
+
url + '/zilingo/item_quantity_by_sku'
|
43
43
|
end
|
44
44
|
|
45
45
|
def response_process(resp)
|
46
|
-
hash =
|
46
|
+
hash = {}
|
47
47
|
resp['zilingoSKUQuantities'].each do |sku|
|
48
48
|
hash[sku['zilingoSKUId']] = sku['quantity'] + sku['frozenQuantity']
|
49
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: item_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.40
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- okaaryanata
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -143,6 +143,7 @@ files:
|
|
143
143
|
- lib/item_builder/modes/update/tokopedia_service.rb
|
144
144
|
- lib/item_builder/modes/update/zalora_service.rb
|
145
145
|
- lib/item_builder/modes/update_service.rb
|
146
|
+
- lib/item_builder/shopify_quantity_service.rb
|
146
147
|
- lib/item_builder/version.rb
|
147
148
|
- lib/item_builder/zalora_quantity_service.rb
|
148
149
|
- lib/item_builder/zilingo_quantity_service.rb
|