item_builder_mwh 0.1.7 → 0.1.12
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_mwh.rb +116 -14
- data/lib/item_builder_mwh/get_quantity_service.rb +132 -0
- data/lib/item_builder_mwh/modes.rb +47 -1
- data/lib/item_builder_mwh/modes/active_service.rb +1 -1
- data/lib/item_builder_mwh/modes/base_service.rb +1 -1
- data/lib/item_builder_mwh/modes/price/base.rb +1 -1
- data/lib/item_builder_mwh/modes/price/blibli_service.rb +1 -1
- data/lib/item_builder_mwh/modes/price/bukalapak_service.rb +1 -1
- data/lib/item_builder_mwh/modes/price/jd_service.rb +1 -1
- data/lib/item_builder_mwh/modes/price/sale_price_policy.rb +6 -2
- data/lib/item_builder_mwh/modes/price/shopify_service.rb +1 -1
- data/lib/item_builder_mwh/modes/price/zalora_service.rb +1 -1
- data/lib/item_builder_mwh/modes/price_service.rb +1 -1
- data/lib/item_builder_mwh/modes/quantity/base.rb +4 -58
- data/lib/item_builder_mwh/modes/quantity/lazada_service.rb +1 -1
- data/lib/item_builder_mwh/modes/quantity/zalora_service.rb +1 -1
- data/lib/item_builder_mwh/modes/quantity_service.rb +20 -10
- data/lib/item_builder_mwh/modes/simple/base.rb +2 -12
- data/lib/item_builder_mwh/modes/simple/blibli_service.rb +1 -1
- data/lib/item_builder_mwh/modes/simple/bukalapak_service.rb +3 -3
- data/lib/item_builder_mwh/modes/simple/jd_service.rb +2 -2
- data/lib/item_builder_mwh/modes/simple/lazada_service.rb +1 -1
- data/lib/item_builder_mwh/modes/simple/sale_price_policy.rb +1 -1
- data/lib/item_builder_mwh/modes/simple/shopee_service.rb +2 -2
- data/lib/item_builder_mwh/modes/simple/shopify_service.rb +2 -2
- data/lib/item_builder_mwh/modes/simple/zalora_service.rb +1 -1
- data/lib/item_builder_mwh/modes/simple_service.rb +22 -11
- data/lib/item_builder_mwh/version.rb +2 -2
- metadata +7 -8
- data/lib/item_builder_mwh/modes/quantity/blibli_service.rb +0 -51
- data/lib/item_builder_mwh/modes/quantity/shopee_service.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d1bdd2602056502397904701b901ca0e64fc1e1720d19ad6224bf2730abb35f
|
4
|
+
data.tar.gz: d38c4c58bc14bb122b5134709eb6716dd050dcd2c7bf1a6af953c4c26df06f7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e9db45fb157df0b8a978e169a0b5a54704421df77028f1996584010d407e8f8649642db4d4db2c7dd427c266d020ea3f131ae772d45ba357d4dff9935db2f63
|
7
|
+
data.tar.gz: d3014d0450be1a652e55bc0b708ed89eeed6fedc29a279a58fad42134b52b5c845bd30eeb7d7eb860ae6b70a8df22514d67124a56cdc11282b7d4f8457652f84
|
data/lib/item_builder_mwh.rb
CHANGED
@@ -8,22 +8,124 @@ require 'item_builder_mwh/modes/quantity_service'
|
|
8
8
|
require 'item_builder_mwh/modes/simple_service'
|
9
9
|
require 'item_models'
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
class ItemBuilderMwh
|
12
|
+
attr_reader :listing_ids
|
13
|
+
attr_reader :listings
|
14
|
+
attr_reader :mode
|
15
|
+
attr_reader :wh_spaces
|
16
|
+
attr_reader :variants
|
17
|
+
attr_reader :variant_ids
|
18
|
+
def initialize(listing_ids, mode)
|
19
|
+
@listing_ids = listing_ids
|
20
|
+
@mode = mode
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.build(listing_ids, mode)
|
24
|
+
new(listing_ids, mode).mode_check
|
25
|
+
end
|
26
|
+
|
27
|
+
def mode_check
|
28
|
+
if mode == :quantity || mode == :simple
|
29
|
+
quantity_simple_mode
|
30
|
+
else
|
31
|
+
default
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def quantity_simple_mode
|
36
|
+
listings.map do |listing|
|
37
|
+
modes[mode].new(qty_simple_params(listing)).perform
|
18
38
|
end
|
39
|
+
end
|
19
40
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
quantity: ItemBuilderMwh::Modes::QuantityService,
|
24
|
-
simple: ItemBuilderMwh::Modes::SimpleService,
|
25
|
-
active: ItemBuilderMwh::Modes::ActiveService
|
26
|
-
}
|
41
|
+
def default
|
42
|
+
listings.map do |listing|
|
43
|
+
modes[mode].new(listing: listing).perform
|
27
44
|
end
|
28
45
|
end
|
46
|
+
|
47
|
+
def qty_simple_params(listing)
|
48
|
+
{
|
49
|
+
listing: listing, wh_spaces: wh_spaces, variants: variants,
|
50
|
+
stock_allocs: stock_allocs, variant_listings: variant_listings,
|
51
|
+
bundles: bundles, item_bundle_variants: item_bundle_variants,
|
52
|
+
existing_alloc_stocks: existing_alloc_stocks,
|
53
|
+
reserved_stocks: reserved_stocks
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def existing_alloc_stocks
|
58
|
+
@existing_alloc_stocks ||= VariantListingStockAllocation.where(
|
59
|
+
variant_association_id: vl_ids
|
60
|
+
).where('ADDTIME(end_at, "07:00") >= NOW()')
|
61
|
+
end
|
62
|
+
|
63
|
+
def vl_ids
|
64
|
+
@vl_ids ||= variant_listings.map(&:id).uniq
|
65
|
+
end
|
66
|
+
|
67
|
+
def variant_listings
|
68
|
+
@variant_listings ||= VariantListing.where(variant_id: variant_ids)
|
69
|
+
end
|
70
|
+
|
71
|
+
def item_bundle_variants
|
72
|
+
@item_bundle_variants ||= BundleVariant.where(
|
73
|
+
bundle_id: bundle_ids
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
def bundle_ids
|
78
|
+
@bundle_ids ||= bundles.map(&:id).uniq
|
79
|
+
end
|
80
|
+
|
81
|
+
def bundles
|
82
|
+
@bundles ||= Bundle.where(variant_id: variant_ids).group(:variant_id)
|
83
|
+
end
|
84
|
+
|
85
|
+
def stock_allocs
|
86
|
+
@stock_allocs ||= VariantListingStockAllocation.where(
|
87
|
+
variant_association_id: vl_ids
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
def wh_spaces
|
92
|
+
@wh_spaces ||= WarehouseSpace.where(item_variant_id: variant_ids)
|
93
|
+
end
|
94
|
+
|
95
|
+
def variants
|
96
|
+
@variants ||= Variant.where(id: variant_ids)
|
97
|
+
end
|
98
|
+
|
99
|
+
def variant_ids
|
100
|
+
@variant_ids ||= listings.map(&:variant_id).uniq
|
101
|
+
end
|
102
|
+
|
103
|
+
def order_host
|
104
|
+
url = ENV['ORDERS_URL'] || 'orders.forstok.com'
|
105
|
+
url + '/api/v3/item_line/reserved_stock'
|
106
|
+
end
|
107
|
+
|
108
|
+
def reserved_params
|
109
|
+
"account_id=#{listings[0].profile_channel_association_id}
|
110
|
+
&item_variant_ids=#{variant_ids.join(',')}"
|
111
|
+
end
|
112
|
+
|
113
|
+
def reserved_stocks
|
114
|
+
@reserved_stocks ||= JSON.parse(RestClient.get(
|
115
|
+
"#{order_host}?#{reserved_params}"
|
116
|
+
).body) if [3,13].include?(listings[0].channel_id)
|
117
|
+
end
|
118
|
+
|
119
|
+
def modes
|
120
|
+
{
|
121
|
+
price: ItemBuilderMwh::Modes::PriceService,
|
122
|
+
quantity: ItemBuilderMwh::Modes::QuantityService,
|
123
|
+
simple: ItemBuilderMwh::Modes::SimpleService,
|
124
|
+
active: ItemBuilderMwh::Modes::ActiveService
|
125
|
+
}
|
126
|
+
end
|
127
|
+
|
128
|
+
def listings
|
129
|
+
@listings ||= VariantListing.where(id: listing_ids)
|
130
|
+
end
|
29
131
|
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'warehouse_models'
|
4
|
+
require 'item_builder_mwh/modes.rb'
|
5
|
+
class ItemBuilderMwh
|
6
|
+
class GetQuantityService
|
7
|
+
attr_reader :listing, :variant
|
8
|
+
def initialize(args)
|
9
|
+
@listing = args.fetch(:listing)
|
10
|
+
@variant = args.fetch(:variant)
|
11
|
+
@stock_alloc = args.fetch(:stock_alloc)
|
12
|
+
@bundle_variants = args.fetch(:bundle_variants)
|
13
|
+
@existing_allocated_stock = args.fetch(:existing_allocated_stock)
|
14
|
+
@listing_wh_sp_quantity = args.fetch(:listing_wh_sp_quantity)
|
15
|
+
end
|
16
|
+
|
17
|
+
def perform
|
18
|
+
return 0 if check_consignment_variant?
|
19
|
+
|
20
|
+
if allocated_stock_active?
|
21
|
+
# yang masuk di kondisi ini,
|
22
|
+
# artinya akun tersebut ada allocated stock yang aktif
|
23
|
+
allocated_stock
|
24
|
+
elsif @existing_allocated_stock.present?
|
25
|
+
# yang masuk di kondisi ini,
|
26
|
+
# artinya akun tersebut tidak ada allocated stock yang aktif,
|
27
|
+
# namun ada allocated stock yg aktif dari channel lain
|
28
|
+
warehouse_stock - count_existing_alloc_stock + count_alloc_rsvd_stock
|
29
|
+
else
|
30
|
+
# yang masuk di kondisi ini,
|
31
|
+
# artinya tidak ada allocated stock di item tersebut
|
32
|
+
warehouse_stock
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def check_consignment_variant?
|
39
|
+
listing.consignment? ||
|
40
|
+
(
|
41
|
+
!listing.active? && [11, 12, 15].include?(listing.channel_id)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def allocated_stock_active?
|
46
|
+
listing.present? && @stock_alloc.present? && allocated_start_end?
|
47
|
+
end
|
48
|
+
|
49
|
+
def allocated_start_end?
|
50
|
+
@stock_alloc.start_at.beginning_of_day <= Time.now &&
|
51
|
+
@stock_alloc.end_at.end_of_day >= Time.now
|
52
|
+
end
|
53
|
+
|
54
|
+
def allocated_stock
|
55
|
+
@stock_alloc.quantity.to_i - one_alloc_rsvd_stock(@stock_alloc).to_i
|
56
|
+
end
|
57
|
+
|
58
|
+
# warehouse_stock fungsi untuk mendapatkan available quantity
|
59
|
+
# baik itu bundle atau default
|
60
|
+
def warehouse_stock
|
61
|
+
case variant.config.downcase
|
62
|
+
when 'default'
|
63
|
+
qty_default
|
64
|
+
when 'free gift', 'combo'
|
65
|
+
qty_bundle
|
66
|
+
else
|
67
|
+
raise "config not recognize => #{variant.config}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def qty_default
|
72
|
+
# set lower limit for quantity
|
73
|
+
[@listing_wh_sp_quantity, 0].sort[1]
|
74
|
+
end
|
75
|
+
|
76
|
+
def qty_bundle
|
77
|
+
# Quantity for bundle config
|
78
|
+
if @bundle_variants.present?
|
79
|
+
qty_list = []
|
80
|
+
@bundle_variants.each do |bvr|
|
81
|
+
warehouse_space = wh_space.select {|ws| ws.item_variant_id == bvr.variant_id }.first
|
82
|
+
qty = warehouse_space.quantity if warehouse_space.present?
|
83
|
+
qty ||= 0
|
84
|
+
qty = qty / bvr.unit
|
85
|
+
qty_list.push(qty)
|
86
|
+
end
|
87
|
+
[qty_list.min, 0].sort[1]
|
88
|
+
else
|
89
|
+
qty_default
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def wh_space
|
94
|
+
@wh_space ||= WarehouseSpace.where(item_variant_id: variant_ids)
|
95
|
+
end
|
96
|
+
|
97
|
+
def variant_ids
|
98
|
+
@variant_ids ||= @bundle_variants.map(&:variant_id).uniq
|
99
|
+
end
|
100
|
+
|
101
|
+
def count_existing_alloc_stock
|
102
|
+
return 0 if @existing_allocated_stock.blank?
|
103
|
+
|
104
|
+
@existing_allocated_stock.sum(&:quantity)
|
105
|
+
end
|
106
|
+
|
107
|
+
def count_alloc_rsvd_stock
|
108
|
+
stock = 0
|
109
|
+
@existing_allocated_stock.each do |allocated_stock|
|
110
|
+
stock += one_alloc_rsvd_stock(allocated_stock).to_i
|
111
|
+
end
|
112
|
+
stock
|
113
|
+
end
|
114
|
+
|
115
|
+
def host
|
116
|
+
url = ENV['ORDERS_URL'] || 'orders.forstok.com'
|
117
|
+
url + '/api/v2/item_line/count_one_allocated_reserved_stock'
|
118
|
+
end
|
119
|
+
|
120
|
+
def params(allocated_stock)
|
121
|
+
"channel_id=#{listing.channel_id}&item_variant_id=#{listing.variant_id}
|
122
|
+
&start_at=#{allocated_stock.start_at.to_date.beginning_of_day}
|
123
|
+
&end_at=#{allocated_stock.end_at.to_date.end_of_day}"
|
124
|
+
end
|
125
|
+
|
126
|
+
# one_alloc_rsvd_stock fungsi untuk mendapatkan satu
|
127
|
+
# allocated reserved stock
|
128
|
+
def one_alloc_rsvd_stock(allocated_stock)
|
129
|
+
RestClient.get("#{host}?#{params(allocated_stock)}")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -5,11 +5,27 @@ require 'item_builder_mwh/modes/price_service'
|
|
5
5
|
require 'item_builder_mwh/modes/quantity_service'
|
6
6
|
require 'item_builder_mwh/modes/simple_service'
|
7
7
|
require 'item_builder_mwh/modes/active_service'
|
8
|
-
|
8
|
+
class ItemBuilderMwh
|
9
9
|
module Modes
|
10
10
|
attr_reader :listing
|
11
|
+
attr_reader :wh_spaces
|
12
|
+
attr_reader :variants
|
13
|
+
attr_reader :stock_allocs
|
14
|
+
attr_reader :bundles
|
15
|
+
attr_reader :item_bundle_variants
|
16
|
+
attr_reader :existing_alloc_stocks
|
17
|
+
attr_reader :variant_listings
|
18
|
+
attr_reader :reserved_stocks
|
11
19
|
def initialize(args)
|
12
20
|
@listing = args.fetch(:listing)
|
21
|
+
@wh_spaces = args.fetch(:wh_spaces, [])
|
22
|
+
@variants = args.fetch(:variants, [])
|
23
|
+
@stock_allocs = args.fetch(:stock_allocs, [])
|
24
|
+
@bundles = args.fetch(:bundles, [])
|
25
|
+
@item_bundle_variants = args.fetch(:item_bundle_variants, [])
|
26
|
+
@existing_alloc_stocks = args.fetch(:existing_alloc_stocks, [])
|
27
|
+
@variant_listings = args.fetch(:variant_listings, [])
|
28
|
+
@reserved_stocks = args.fetch(:reserved_stocks, [])
|
13
29
|
warehouse
|
14
30
|
end
|
15
31
|
|
@@ -22,6 +38,36 @@ module ItemBuilderMwh
|
|
22
38
|
}
|
23
39
|
end
|
24
40
|
|
41
|
+
def existing_allocated_stock
|
42
|
+
existing_alloc_stocks.map do |els|
|
43
|
+
if listings.pluck(:id).include?(els.variant_association_id)
|
44
|
+
els
|
45
|
+
end
|
46
|
+
end.compact
|
47
|
+
end
|
48
|
+
|
49
|
+
def listings
|
50
|
+
variant_listings.select {|vl| vl.variant_id == listing.variant_id}
|
51
|
+
end
|
52
|
+
|
53
|
+
def bundle_variants
|
54
|
+
if bundle.present?
|
55
|
+
item_bundle_variants.select {|ibv| ibv.bundle_id == bundle.id }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def bundle
|
60
|
+
bundles.select {|b| b.variant_id == listing.variant_id }.first
|
61
|
+
end
|
62
|
+
|
63
|
+
def stock_alloc
|
64
|
+
stock_allocs.select {|sa| sa.variant_association_id == listing.id }.first
|
65
|
+
end
|
66
|
+
|
67
|
+
def variant
|
68
|
+
variants.select {|v| v.id == listing.variant_id }.first
|
69
|
+
end
|
70
|
+
|
25
71
|
def warehouse
|
26
72
|
warehouse_spaces.each do |warehouse_space|
|
27
73
|
warehouses << to_h(warehouse_space)
|
@@ -3,11 +3,15 @@
|
|
3
3
|
require 'date'
|
4
4
|
require 'item_builder_mwh/modes.rb'
|
5
5
|
require 'item_builder_mwh/modes/price_service'
|
6
|
-
|
6
|
+
class ItemBuilderMwh
|
7
7
|
module Modes
|
8
8
|
module Price
|
9
9
|
class SalePricePolicy
|
10
|
-
|
10
|
+
attr_reader :listing
|
11
|
+
def initialize(args)
|
12
|
+
@listing = args.fetch(:listing)
|
13
|
+
end
|
14
|
+
|
11
15
|
def sale_price
|
12
16
|
# has sale price but no sale date defined
|
13
17
|
# then push sale price immediately
|
@@ -8,7 +8,7 @@ require 'item_builder_mwh/modes/price/zalora_service'
|
|
8
8
|
require 'item_builder_mwh/modes/price/shopify_service'
|
9
9
|
require 'item_builder_mwh/modes/price/sale_price_policy'
|
10
10
|
require 'item_builder_mwh/modes/price/jd_service'
|
11
|
-
|
11
|
+
class ItemBuilderMwh
|
12
12
|
module Modes
|
13
13
|
class PriceService
|
14
14
|
include Modes
|
@@ -1,73 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class ItemBuilderMwh
|
4
4
|
module Modes
|
5
5
|
module Quantity
|
6
6
|
class Base
|
7
7
|
attr_reader :listing
|
8
8
|
attr_reader :available_quantity
|
9
|
+
attr_reader :reserved_stock
|
9
10
|
|
10
|
-
def initialize(listing, available_quantity)
|
11
|
+
def initialize(listing, available_quantity, reserved_stock)
|
11
12
|
raise 'listing is not set' if listing.nil?
|
12
13
|
|
13
14
|
@listing = listing
|
14
15
|
@available_quantity = available_quantity
|
15
|
-
|
16
|
-
|
17
|
-
def order_host
|
18
|
-
url = ENV['ORDERS_URL'] || 'orders.forstok.com'
|
19
|
-
url + '/api/v2/item_line/reserved_stock'
|
20
|
-
end
|
21
|
-
|
22
|
-
def reserved_params
|
23
|
-
"account_id=#{listing.profile_channel_association_id}
|
24
|
-
&item_variant_id=#{listing.variant_id}"
|
25
|
-
end
|
26
|
-
|
27
|
-
def reserved_stock
|
28
|
-
RestClient.get("#{order_host}?#{reserved_params}")
|
29
|
-
rescue RestClient::ExceptionWithResponse => e
|
30
|
-
e.response
|
31
|
-
end
|
32
|
-
|
33
|
-
def apigateway_get
|
34
|
-
RestClient.get("#{host}?#{params}")
|
35
|
-
rescue RestClient::ExceptionWithResponse => e
|
36
|
-
e.response
|
37
|
-
end
|
38
|
-
|
39
|
-
def headers
|
40
|
-
{
|
41
|
-
content_type: :json,
|
42
|
-
accept: :json
|
43
|
-
}
|
44
|
-
end
|
45
|
-
|
46
|
-
def credential
|
47
|
-
account_id = listing.profile_channel_association_id
|
48
|
-
host = ENV['CREDENTIAL_URL'] || 'user.forstok.com'
|
49
|
-
begin
|
50
|
-
RestClient.get("#{host}/credential?account_id=#{account_id}")
|
51
|
-
rescue RestClient::ExceptionWithResponse => e
|
52
|
-
e.response
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def data
|
57
|
-
{
|
58
|
-
"credential": JSON.parse(credential)['credential'],
|
59
|
-
"data": request
|
60
|
-
}
|
61
|
-
end
|
62
|
-
|
63
|
-
def api_data
|
64
|
-
data.to_json
|
65
|
-
end
|
66
|
-
|
67
|
-
def apigateway_post
|
68
|
-
RestClient.post(url, api_data, headers)
|
69
|
-
rescue RestClient::ExceptionWithResponse => e
|
70
|
-
e.response
|
16
|
+
@reserved_stock = reserved_stock
|
71
17
|
end
|
72
18
|
end
|
73
19
|
end
|
@@ -2,20 +2,17 @@
|
|
2
2
|
|
3
3
|
require 'warehouse_models'
|
4
4
|
require 'item_builder_mwh/modes.rb'
|
5
|
+
require 'item_builder_mwh/get_quantity_service'
|
5
6
|
require 'item_builder_mwh/modes/quantity/base'
|
6
7
|
require 'item_builder_mwh/modes/quantity/lazada_service'
|
7
|
-
require 'item_builder_mwh/modes/quantity/blibli_service'
|
8
|
-
require 'item_builder_mwh/modes/quantity/shopee_service'
|
9
8
|
require 'item_builder_mwh/modes/quantity/zalora_service'
|
10
|
-
|
9
|
+
class ItemBuilderMwh
|
11
10
|
module Modes
|
12
11
|
class QuantityService
|
13
12
|
include Modes
|
14
13
|
|
15
14
|
QUANTITY_CHANNEL = {}.tap do |hash|
|
16
15
|
hash[3] = :Lazada
|
17
|
-
hash[9] = :Blibli
|
18
|
-
hash[12] = :Shopee
|
19
16
|
hash[13] = :Zalora
|
20
17
|
end.freeze
|
21
18
|
|
@@ -34,23 +31,36 @@ module ItemBuilderMwh
|
|
34
31
|
}
|
35
32
|
end
|
36
33
|
|
37
|
-
def qty(
|
34
|
+
def qty(qty)
|
38
35
|
if channel_name.empty?
|
39
|
-
|
36
|
+
available_quantity(qty)
|
40
37
|
else
|
41
|
-
qty_channel(
|
38
|
+
qty_channel(qty)
|
42
39
|
end
|
43
40
|
end
|
44
41
|
|
45
|
-
def qty_channel(
|
42
|
+
def qty_channel(qty)
|
46
43
|
class_name = "ItemBuilderMwh::Modes::Quantity::#{channel_name}Service"
|
47
44
|
qty_channel_service = class_name.constantize
|
48
|
-
qty_channel_service.new(listing,
|
45
|
+
qty_channel_service.new(listing, available_quantity(qty), reserved_stock).perform
|
49
46
|
end
|
50
47
|
|
51
48
|
def channel_name
|
52
49
|
QUANTITY_CHANNEL[listing.channel_id].to_s
|
53
50
|
end
|
51
|
+
|
52
|
+
def reserved_stock
|
53
|
+
reserved_stocks.find {|rs| rs['variant_id'] == listing.variant_id }['reserved_quantity']
|
54
|
+
end
|
55
|
+
|
56
|
+
def available_quantity(qty)
|
57
|
+
ItemBuilderMwh::GetQuantityService.new(
|
58
|
+
listing: listing, stock_alloc: stock_alloc,
|
59
|
+
variant: variant, bundle_variants: bundle_variants,
|
60
|
+
existing_allocated_stock: existing_allocated_stock,
|
61
|
+
listing_wh_sp_quantity: qty
|
62
|
+
).perform
|
63
|
+
end
|
54
64
|
end
|
55
65
|
end
|
56
66
|
end
|
@@ -4,7 +4,7 @@ require 'date'
|
|
4
4
|
require 'item_builder_mwh/modes.rb'
|
5
5
|
require 'item_builder_mwh/modes/simple_service'
|
6
6
|
require 'item_builder_mwh/modes/simple/sale_price_policy'
|
7
|
-
|
7
|
+
class ItemBuilderMwh
|
8
8
|
module Modes
|
9
9
|
module Simple
|
10
10
|
class Base
|
@@ -30,14 +30,10 @@ module ItemBuilderMwh
|
|
30
30
|
|
31
31
|
def reserved_stock
|
32
32
|
RestClient.get("#{order_host}?#{reserved_params}")
|
33
|
-
rescue RestClient::ExceptionWithResponse => e
|
34
|
-
e.response
|
35
33
|
end
|
36
34
|
|
37
35
|
def apigateway_get
|
38
36
|
RestClient.get("#{host}?#{params}")
|
39
|
-
rescue RestClient::ExceptionWithResponse => e
|
40
|
-
e.response
|
41
37
|
end
|
42
38
|
|
43
39
|
def headers
|
@@ -50,11 +46,7 @@ module ItemBuilderMwh
|
|
50
46
|
def credential
|
51
47
|
account_id = listing.profile_channel_association_id
|
52
48
|
host = ENV['CREDENTIAL_URL'] || 'user.forstok.com'
|
53
|
-
|
54
|
-
RestClient.get("#{host}/credential?account_id=#{account_id}")
|
55
|
-
rescue RestClient::ExceptionWithResponse => e
|
56
|
-
e.response
|
57
|
-
end
|
49
|
+
RestClient.get("#{host}/credential?account_id=#{account_id}")
|
58
50
|
end
|
59
51
|
|
60
52
|
def data
|
@@ -75,8 +67,6 @@ module ItemBuilderMwh
|
|
75
67
|
|
76
68
|
def apigateway_post
|
77
69
|
RestClient.post(url, api_data, headers)
|
78
|
-
rescue RestClient::ExceptionWithResponse => e
|
79
|
-
e.response
|
80
70
|
end
|
81
71
|
end
|
82
72
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'date'
|
4
4
|
require 'item_builder_mwh/modes.rb'
|
5
5
|
require 'item_builder_mwh/modes/simple/base'
|
6
|
-
|
6
|
+
class ItemBuilderMwh
|
7
7
|
module Modes
|
8
8
|
module Simple
|
9
9
|
class BukalapakService < Base
|
@@ -21,7 +21,7 @@ module ItemBuilderMwh
|
|
21
21
|
sale_price: listing.sale_price,
|
22
22
|
sale_start_at: listing.sale_start_at,
|
23
23
|
sale_end_at: listing.sale_end_at,
|
24
|
-
quantity: available_quantity
|
24
|
+
quantity: available_quantity,
|
25
25
|
warehouse_id: wh_mapping(
|
26
26
|
warehouse_space.warehouse_id
|
27
27
|
)
|
@@ -35,7 +35,7 @@ module ItemBuilderMwh
|
|
35
35
|
sale_end_at: sale_end_at,
|
36
36
|
price: listing.price,
|
37
37
|
sale_price: listing.sale_price,
|
38
|
-
quantity: available_quantity
|
38
|
+
quantity: available_quantity,
|
39
39
|
warehouse_id: wh_mapping(
|
40
40
|
warehouse_space.warehouse_id
|
41
41
|
)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'date'
|
4
4
|
require 'item_builder_mwh/modes.rb'
|
5
5
|
require 'item_builder_mwh/modes/simple/base'
|
6
|
-
|
6
|
+
class ItemBuilderMwh
|
7
7
|
module Modes
|
8
8
|
module Simple
|
9
9
|
class JdService < Base
|
@@ -13,7 +13,7 @@ module ItemBuilderMwh
|
|
13
13
|
sale_price: jd_price,
|
14
14
|
sale_start_at: listing.sale_start_at,
|
15
15
|
sale_end_at: listing.sale_end_at,
|
16
|
-
quantity: available_quantity
|
16
|
+
quantity: available_quantity,
|
17
17
|
warehouse_id: wh_mapping(
|
18
18
|
warehouse_space.warehouse_id
|
19
19
|
)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'date'
|
4
4
|
require 'item_builder_mwh/modes.rb'
|
5
5
|
require 'item_builder_mwh/modes/simple/base'
|
6
|
-
|
6
|
+
class ItemBuilderMwh
|
7
7
|
module Modes
|
8
8
|
module Simple
|
9
9
|
class ShopeeService < Base
|
@@ -13,7 +13,7 @@ module ItemBuilderMwh
|
|
13
13
|
sale_price: listing.sale_price,
|
14
14
|
sale_start_at: listing.sale_start_at,
|
15
15
|
sale_end_at: listing.sale_end_at,
|
16
|
-
quantity: available_quantity
|
16
|
+
quantity: available_quantity,
|
17
17
|
warehouse_id: wh_mapping(
|
18
18
|
warehouse_space.warehouse_id
|
19
19
|
)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'date'
|
4
4
|
require 'item_builder_mwh/modes.rb'
|
5
5
|
require 'item_builder_mwh/modes/simple/base'
|
6
|
-
|
6
|
+
class ItemBuilderMwh
|
7
7
|
module Modes
|
8
8
|
module Simple
|
9
9
|
class ShopifyService < Base
|
@@ -13,7 +13,7 @@ module ItemBuilderMwh
|
|
13
13
|
sale_price: sale_price,
|
14
14
|
sale_start_at: listing.sale_start_at,
|
15
15
|
sale_end_at: listing.sale_end_at,
|
16
|
-
quantity: available_quantity
|
16
|
+
quantity: available_quantity,
|
17
17
|
warehouse_id: wh_mapping(
|
18
18
|
warehouse_space.warehouse_id
|
19
19
|
)
|
@@ -9,15 +9,13 @@ require 'item_builder_mwh/modes/simple/shopify_service'
|
|
9
9
|
require 'item_builder_mwh/modes/simple/jd_service'
|
10
10
|
require 'item_builder_mwh/modes/simple/lazada_service'
|
11
11
|
require 'item_builder_mwh/modes/simple/shopee_service'
|
12
|
-
|
12
|
+
class ItemBuilderMwh
|
13
13
|
module Modes
|
14
14
|
class SimpleService
|
15
15
|
include Modes
|
16
16
|
|
17
17
|
QUANTITY_CHANNEL = {}.tap do |hash|
|
18
18
|
hash[3] = :Lazada
|
19
|
-
hash[9] = :Blibli
|
20
|
-
hash[12] = :Shopee
|
21
19
|
hash[13] = :Zalora
|
22
20
|
end.freeze
|
23
21
|
|
@@ -50,20 +48,20 @@ module ItemBuilderMwh
|
|
50
48
|
end
|
51
49
|
|
52
50
|
def simple(warehouse_space)
|
53
|
-
|
54
|
-
qty(
|
51
|
+
qty = warehouse_space.quantity
|
52
|
+
qty(qty).merge(
|
55
53
|
price
|
56
54
|
)
|
57
55
|
end
|
58
56
|
|
59
|
-
def qty(
|
57
|
+
def qty(qty)
|
60
58
|
if quantity_name.empty?
|
61
59
|
{
|
62
|
-
quantity:
|
60
|
+
quantity: available_quantity(qty)
|
63
61
|
}
|
64
62
|
else
|
65
63
|
{
|
66
|
-
quantity: qty_channel(
|
64
|
+
quantity: qty_channel(qty)
|
67
65
|
}
|
68
66
|
end
|
69
67
|
end
|
@@ -84,13 +82,26 @@ module ItemBuilderMwh
|
|
84
82
|
def price_channel
|
85
83
|
class_name = "ItemBuilderMwh::Modes::Price::#{price_name}Service"
|
86
84
|
simple_channel_service = class_name.constantize
|
87
|
-
simple_channel_service.new(listing
|
85
|
+
simple_channel_service.new(listing).perform
|
88
86
|
end
|
89
87
|
|
90
|
-
def qty_channel(
|
88
|
+
def qty_channel(qty)
|
91
89
|
class_name = "ItemBuilderMwh::Modes::Quantity::#{quantity_name}Service"
|
92
90
|
qty_channel_service = class_name.constantize
|
93
|
-
qty_channel_service.new(listing,
|
91
|
+
qty_channel_service.new(listing, available_quantity(qty), reserved_stock).perform
|
92
|
+
end
|
93
|
+
|
94
|
+
def reserved_stock
|
95
|
+
reserved_stocks.find {|rs| rs['variant_id'] == listing.variant_id }['reserved_quantity']
|
96
|
+
end
|
97
|
+
|
98
|
+
def available_quantity(qty)
|
99
|
+
ItemBuilderMwh::GetQuantityService.new(
|
100
|
+
listing: listing, stock_alloc: stock_alloc,
|
101
|
+
variant: variant, bundle_variants: bundle_variants,
|
102
|
+
existing_allocated_stock: existing_allocated_stock,
|
103
|
+
listing_wh_sp_quantity: qty
|
104
|
+
).perform
|
94
105
|
end
|
95
106
|
|
96
107
|
def price_name
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: item_builder_mwh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Ivander
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -116,6 +116,7 @@ extensions: []
|
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
118
|
- lib/item_builder_mwh.rb
|
119
|
+
- lib/item_builder_mwh/get_quantity_service.rb
|
119
120
|
- lib/item_builder_mwh/modes.rb
|
120
121
|
- lib/item_builder_mwh/modes/active_service.rb
|
121
122
|
- lib/item_builder_mwh/modes/base_service.rb
|
@@ -128,9 +129,7 @@ files:
|
|
128
129
|
- lib/item_builder_mwh/modes/price/zalora_service.rb
|
129
130
|
- lib/item_builder_mwh/modes/price_service.rb
|
130
131
|
- lib/item_builder_mwh/modes/quantity/base.rb
|
131
|
-
- lib/item_builder_mwh/modes/quantity/blibli_service.rb
|
132
132
|
- lib/item_builder_mwh/modes/quantity/lazada_service.rb
|
133
|
-
- lib/item_builder_mwh/modes/quantity/shopee_service.rb
|
134
133
|
- lib/item_builder_mwh/modes/quantity/zalora_service.rb
|
135
134
|
- lib/item_builder_mwh/modes/quantity_service.rb
|
136
135
|
- lib/item_builder_mwh/modes/simple/base.rb
|
@@ -144,10 +143,10 @@ files:
|
|
144
143
|
- lib/item_builder_mwh/modes/simple/zalora_service.rb
|
145
144
|
- lib/item_builder_mwh/modes/simple_service.rb
|
146
145
|
- lib/item_builder_mwh/version.rb
|
147
|
-
homepage:
|
146
|
+
homepage:
|
148
147
|
licenses: []
|
149
148
|
metadata: {}
|
150
|
-
post_install_message:
|
149
|
+
post_install_message:
|
151
150
|
rdoc_options: []
|
152
151
|
require_paths:
|
153
152
|
- lib
|
@@ -163,7 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
162
|
version: '0'
|
164
163
|
requirements: []
|
165
164
|
rubygems_version: 3.0.6
|
166
|
-
signing_key:
|
165
|
+
signing_key:
|
167
166
|
specification_version: 4
|
168
167
|
summary: Item Builder Multiwarehouse
|
169
168
|
test_files: []
|
@@ -1,51 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'item_builder_mwh/modes/quantity/base'
|
4
|
-
module ItemBuilderMwh
|
5
|
-
module Modes
|
6
|
-
module Quantity
|
7
|
-
class BlibliService < Base
|
8
|
-
def perform
|
9
|
-
local_variant
|
10
|
-
end
|
11
|
-
|
12
|
-
def local_variant
|
13
|
-
qty = 0
|
14
|
-
local_product['value']['items'].each do |item|
|
15
|
-
qty = total_quantity(item) if item['itemSku'] == listing.local_id
|
16
|
-
end
|
17
|
-
qty
|
18
|
-
end
|
19
|
-
|
20
|
-
def total_quantity(item)
|
21
|
-
# Make stock 0
|
22
|
-
# if local reserved quantity is bigger than available quantity
|
23
|
-
if item['reservedStockLevel2'] > available_quantity
|
24
|
-
0
|
25
|
-
else
|
26
|
-
available_quantity
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Find local product based on id
|
31
|
-
# @return [Hash] Local Blibli product
|
32
|
-
def local_product
|
33
|
-
@local_product ||= JSON.parse(apigateway_post)
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def request
|
39
|
-
{
|
40
|
-
"gdnSku": listing.local_id
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
|
-
def url
|
45
|
-
url = ENV['API_GATEWAY_URL'] || 'apigateway.forstok.com'
|
46
|
-
url + '/blibli/item'
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'item_builder_mwh/modes/quantity/base'
|
4
|
-
module ItemBuilderMwh
|
5
|
-
module Modes
|
6
|
-
module Quantity
|
7
|
-
class ShopeeService < Base
|
8
|
-
def perform
|
9
|
-
available_quantity + reserved_stock.to_i
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|