item_builder 0.1.16 → 0.1.21
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 +45 -5
- data/lib/item_builder/get_quantity_service.rb +21 -28
- data/lib/item_builder/modes.rb +12 -2
- data/lib/item_builder/modes/quantity/base.rb +0 -38
- data/lib/item_builder/modes/quantity_service.rb +28 -5
- data/lib/item_builder/version.rb +1 -1
- metadata +2 -3
- data/lib/item_builder/modes/quantity/blibli_service.rb +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48928bd692d1e23385b374cf0c1e488b40bde748a86a0a648148ec82cb91fce3
|
4
|
+
data.tar.gz: 34d42d47a3fe0310969409df85b1b70d29ccdcc7e6ede904d22a078bec914bfb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a17685ebc1909ec2e0156f6f2f0246c5768618ee42e650c2b63f76d78e1bfaef0d392334b6641e186ee8fd816ba324eb5cd94f427fe00a34a1dcb8f5845c7ab
|
7
|
+
data.tar.gz: cbfcc3fbc08ee067efeeafe5b02a4a6bbfb48ecc4c8d6c47c4e576ccee00a20ebae46c7cdc2b2897fc0118e6651988d2edba6d549136f106e4f5c9e18744858e
|
data/lib/item_builder.rb
CHANGED
@@ -35,20 +35,60 @@ class ItemBuilder
|
|
35
35
|
|
36
36
|
def quantity_mode
|
37
37
|
listings.map do |listing|
|
38
|
-
modes[mode].new(
|
39
|
-
listing: listing,
|
40
|
-
wh_spaces: wh_spaces,
|
41
|
-
variants: variants
|
42
|
-
).perform
|
38
|
+
modes[mode].new(qty_params(listing)).perform
|
43
39
|
end
|
44
40
|
end
|
45
41
|
|
42
|
+
def qty_params(listing)
|
43
|
+
{
|
44
|
+
listing: listing, wh_spaces: wh_spaces, variants: variants,
|
45
|
+
stock_allocs: stock_allocs, variant_listings: variant_listings,
|
46
|
+
bundles: bundles, item_bundle_variants: item_bundle_variants,
|
47
|
+
existing_alloc_stocks: existing_alloc_stocks
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
46
51
|
def default
|
47
52
|
listings.map do |listing|
|
48
53
|
modes[mode].new(listing: listing).perform
|
49
54
|
end
|
50
55
|
end
|
51
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
|
+
channel_id: listings[0].channel_id
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
def bundle_ids
|
79
|
+
@bundle_ids ||= bundles.map(&:id).uniq
|
80
|
+
end
|
81
|
+
|
82
|
+
def bundles
|
83
|
+
@bundles ||= Bundle.where(variant_id: variant_ids).group(:variant_id)
|
84
|
+
end
|
85
|
+
|
86
|
+
def stock_allocs
|
87
|
+
@stock_allocs ||= VariantListingStockAllocation.where(
|
88
|
+
variant_association_id: vl_ids
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
52
92
|
def wh_spaces
|
53
93
|
@wh_spaces ||= WarehouseSpace.where(item_variant_id: variant_ids)
|
54
94
|
end
|
@@ -9,6 +9,9 @@ class ItemBuilder
|
|
9
9
|
@listing = args.fetch(:listing)
|
10
10
|
@wh_sp = args.fetch(:wh_sp)
|
11
11
|
@variant = args.fetch(:variant)
|
12
|
+
@stock_alloc = args.fetch(:stock_alloc)
|
13
|
+
@bundle_variants = args.fetch(:bundle_variants)
|
14
|
+
@existing_allocated_stock = args.fetch(:existing_allocated_stock)
|
12
15
|
end
|
13
16
|
|
14
17
|
def perform
|
@@ -18,7 +21,7 @@ class ItemBuilder
|
|
18
21
|
# yang masuk di kondisi ini,
|
19
22
|
# artinya akun tersebut ada allocated stock yang aktif
|
20
23
|
allocated_stock
|
21
|
-
elsif existing_allocated_stock.present?
|
24
|
+
elsif @existing_allocated_stock.present?
|
22
25
|
# yang masuk di kondisi ini,
|
23
26
|
# artinya akun tersebut tidak ada allocated stock yang aktif,
|
24
27
|
# namun ada allocated stock yg aktif dari channel lain
|
@@ -35,25 +38,21 @@ class ItemBuilder
|
|
35
38
|
def check_consignment_variant?
|
36
39
|
listing.consignment? ||
|
37
40
|
(
|
38
|
-
!listing.active? && listing.channel_id
|
41
|
+
!listing.active? && [11, 12, 15].include?(listing.channel_id)
|
39
42
|
)
|
40
43
|
end
|
41
44
|
|
42
45
|
def allocated_stock_active?
|
43
|
-
listing.present? && stock_alloc.present? && allocated_start_end?
|
46
|
+
listing.present? && @stock_alloc.present? && allocated_start_end?
|
44
47
|
end
|
45
48
|
|
46
49
|
def allocated_start_end?
|
47
|
-
stock_alloc.start_at.beginning_of_day <= Time.now &&
|
48
|
-
stock_alloc.end_at.end_of_day >= Time.now
|
50
|
+
@stock_alloc.start_at.beginning_of_day <= Time.now &&
|
51
|
+
@stock_alloc.end_at.end_of_day >= Time.now
|
49
52
|
end
|
50
53
|
|
51
54
|
def allocated_stock
|
52
|
-
stock_alloc.quantity.to_i - one_alloc_rsvd_stock(stock_alloc).to_i
|
53
|
-
end
|
54
|
-
|
55
|
-
def stock_alloc
|
56
|
-
@stock_alloc ||= listing.variant_listing_stock_allocation
|
55
|
+
@stock_alloc.quantity.to_i - one_alloc_rsvd_stock(@stock_alloc).to_i
|
57
56
|
end
|
58
57
|
|
59
58
|
# warehouse_stock fungsi untuk mendapatkan available quantity
|
@@ -76,10 +75,10 @@ class ItemBuilder
|
|
76
75
|
|
77
76
|
def qty_bundle
|
78
77
|
# Quantity for bundle config
|
79
|
-
if bundle_variants.present?
|
78
|
+
if @bundle_variants.present?
|
80
79
|
qty_list = []
|
81
|
-
bundle_variants.each do |bvr|
|
82
|
-
qty =
|
80
|
+
@bundle_variants.each do |bvr|
|
81
|
+
qty = wh_space.select {|ws| ws.item_variant_id == bvr.variant_id }.first.quantity
|
83
82
|
qty ||= 0
|
84
83
|
qty = qty / bvr.unit
|
85
84
|
qty_list.push(qty)
|
@@ -90,31 +89,27 @@ class ItemBuilder
|
|
90
89
|
end
|
91
90
|
end
|
92
91
|
|
93
|
-
def
|
94
|
-
|
95
|
-
'variant_id = ?', variant.id
|
96
|
-
).first.bundle_variants.where(channel_id: listing.channel_id)
|
92
|
+
def wh_space
|
93
|
+
@wh_space ||= WarehouseSpace.where(item_variant_id: variant_ids)
|
97
94
|
end
|
98
95
|
|
99
|
-
def
|
100
|
-
@
|
96
|
+
def variant_ids
|
97
|
+
@variant_ids ||= @bundle_variants.map(&:variant_id).uniq
|
101
98
|
end
|
102
99
|
|
103
|
-
def
|
104
|
-
|
105
|
-
variant_association_id: variant.variant_listings.pluck(:id)
|
106
|
-
).where('ADDTIME(end_at, "07:00") >= NOW()')
|
100
|
+
def listing_wh_sp_quantity
|
101
|
+
@listing_wh_sp_quantity ||= wh_sp&.quantity || 0
|
107
102
|
end
|
108
103
|
|
109
104
|
def count_existing_alloc_stock
|
110
|
-
return 0 if existing_allocated_stock.blank?
|
105
|
+
return 0 if @existing_allocated_stock.blank?
|
111
106
|
|
112
|
-
existing_allocated_stock.sum(
|
107
|
+
@existing_allocated_stock.sum(&:quantity)
|
113
108
|
end
|
114
109
|
|
115
110
|
def count_alloc_rsvd_stock
|
116
111
|
stock = 0
|
117
|
-
existing_allocated_stock.each do |allocated_stock|
|
112
|
+
@existing_allocated_stock.each do |allocated_stock|
|
118
113
|
stock += one_alloc_rsvd_stock(allocated_stock).to_i
|
119
114
|
end
|
120
115
|
stock
|
@@ -135,8 +130,6 @@ class ItemBuilder
|
|
135
130
|
# allocated reserved stock
|
136
131
|
def one_alloc_rsvd_stock(allocated_stock)
|
137
132
|
RestClient.get("#{host}?#{params(allocated_stock)}")
|
138
|
-
rescue RestClient::ExceptionWithResponse => e
|
139
|
-
e.response
|
140
133
|
end
|
141
134
|
end
|
142
135
|
end
|
data/lib/item_builder/modes.rb
CHANGED
@@ -11,10 +11,20 @@ class ItemBuilder
|
|
11
11
|
attr_reader :listing
|
12
12
|
attr_reader :wh_spaces
|
13
13
|
attr_reader :variants
|
14
|
+
attr_reader :stock_allocs
|
15
|
+
attr_reader :bundles
|
16
|
+
attr_reader :item_bundle_variants
|
17
|
+
attr_reader :existing_alloc_stocks
|
18
|
+
attr_reader :variant_listings
|
14
19
|
def initialize(args)
|
15
20
|
@listing = args.fetch(:listing)
|
16
|
-
@wh_spaces = args.fetch(:wh_spaces
|
17
|
-
@variants = args.fetch(:variants
|
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, [])
|
18
28
|
end
|
19
29
|
|
20
30
|
def base
|
@@ -26,48 +26,10 @@ class ItemBuilder
|
|
26
26
|
|
27
27
|
def reserved_stock
|
28
28
|
RestClient.get("#{order_host}?#{reserved_params}")
|
29
|
-
rescue RestClient::ExceptionWithResponse => e
|
30
|
-
e.response
|
31
29
|
end
|
32
30
|
|
33
31
|
def apigateway_get
|
34
32
|
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
|
71
33
|
end
|
72
34
|
end
|
73
35
|
end
|
@@ -5,7 +5,6 @@ require 'item_builder/modes.rb'
|
|
5
5
|
require 'item_builder/get_quantity_service'
|
6
6
|
require 'item_builder/modes/quantity/base'
|
7
7
|
require 'item_builder/modes/quantity/lazada_service'
|
8
|
-
require 'item_builder/modes/quantity/blibli_service'
|
9
8
|
require 'item_builder/modes/quantity/zalora_service'
|
10
9
|
class ItemBuilder
|
11
10
|
module Modes
|
@@ -14,7 +13,6 @@ class ItemBuilder
|
|
14
13
|
|
15
14
|
QUANTITY_CHANNEL = {}.tap do |hash|
|
16
15
|
hash[3] = :Lazada
|
17
|
-
hash[9] = :Blibli
|
18
16
|
hash[13] = :Zalora
|
19
17
|
end.freeze
|
20
18
|
|
@@ -48,12 +46,37 @@ class ItemBuilder
|
|
48
46
|
|
49
47
|
def available_quantity
|
50
48
|
ItemBuilder::GetQuantityService.new(
|
51
|
-
listing: listing,
|
52
|
-
|
53
|
-
|
49
|
+
listing: listing, variant: variant,
|
50
|
+
wh_sp: warehouse, stock_alloc: stock_alloc,
|
51
|
+
bundle_variants: bundle_variants,
|
52
|
+
existing_allocated_stock: existing_allocated_stock
|
54
53
|
).perform
|
55
54
|
end
|
56
55
|
|
56
|
+
def existing_allocated_stock
|
57
|
+
existing_alloc_stocks.map do |els|
|
58
|
+
if listings.pluck(:id).include?(els.variant_association_id)
|
59
|
+
els
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def listings
|
65
|
+
variant_listings.select {|vl| vl.variant_id == listing.variant_id}
|
66
|
+
end
|
67
|
+
|
68
|
+
def bundle_variants
|
69
|
+
item_bundle_variants.select {|ibv| ibv.bundle_id == bundle.id }
|
70
|
+
end
|
71
|
+
|
72
|
+
def bundle
|
73
|
+
bundles.select {|b| b.variant_id == listing.variant_id }.first
|
74
|
+
end
|
75
|
+
|
76
|
+
def stock_alloc
|
77
|
+
stock_allocs.select {|sa| sa.variant_association_id == listing.id }.first
|
78
|
+
end
|
79
|
+
|
57
80
|
def warehouse
|
58
81
|
wh_spaces.select {|ws| ws.item_variant_id == listing.variant_id }.first
|
59
82
|
end
|
data/lib/item_builder/version.rb
CHANGED
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.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- okaaryanata
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -129,7 +129,6 @@ files:
|
|
129
129
|
- lib/item_builder/modes/price/zalora_service.rb
|
130
130
|
- lib/item_builder/modes/price_service.rb
|
131
131
|
- lib/item_builder/modes/quantity/base.rb
|
132
|
-
- lib/item_builder/modes/quantity/blibli_service.rb
|
133
132
|
- lib/item_builder/modes/quantity/lazada_service.rb
|
134
133
|
- lib/item_builder/modes/quantity/zalora_service.rb
|
135
134
|
- lib/item_builder/modes/quantity_service.rb
|
@@ -1,51 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'item_builder/modes/quantity/base'
|
4
|
-
class ItemBuilder
|
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
|