item_builder 0.1.16 → 0.1.21

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
  SHA256:
3
- metadata.gz: c73662d1db692cc3c0356465e141d519e3880f2f57ecf9934e8c14b431fad8ba
4
- data.tar.gz: a210f12fb2665cbb4275816c7dd10d8483dacd70a9bcbc066634ec7fdeeddec0
3
+ metadata.gz: 48928bd692d1e23385b374cf0c1e488b40bde748a86a0a648148ec82cb91fce3
4
+ data.tar.gz: 34d42d47a3fe0310969409df85b1b70d29ccdcc7e6ede904d22a078bec914bfb
5
5
  SHA512:
6
- metadata.gz: d7cee35582b4506ec8762dbccb7681c1cfbb93c17f9c30c86b0cc607bde60e479ee8e973a444ae30f3a36f619dbac97c424629ea3e0e2a3afeeb0b2a3c53d710
7
- data.tar.gz: 670770117728b939f832b038849a82a33041c53677e6b211f154aa684bb215e192a0af7dc21022815e79d10f93e55c6578db17dd6cfb61a7284300c8cda45fbd
6
+ metadata.gz: 4a17685ebc1909ec2e0156f6f2f0246c5768618ee42e650c2b63f76d78e1bfaef0d392334b6641e186ee8fd816ba324eb5cd94f427fe00a34a1dcb8f5845c7ab
7
+ data.tar.gz: cbfcc3fbc08ee067efeeafe5b02a4a6bbfb48ecc4c8d6c47c4e576ccee00a20ebae46c7cdc2b2897fc0118e6651988d2edba6d549136f106e4f5c9e18744858e
@@ -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 == 12
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 = WarehouseSpace.find_by(item_variant_id: bvr.variant_id)&.quantity
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 bundle_variants
94
- Bundle.where(
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 listing_wh_sp_quantity
100
- @listing_wh_sp_quantity ||= wh_sp&.quantity || 0
96
+ def variant_ids
97
+ @variant_ids ||= @bundle_variants.map(&:variant_id).uniq
101
98
  end
102
99
 
103
- def existing_allocated_stock
104
- VariantListingStockAllocation.where(
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(:quantity)
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
@@ -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
- variant: variant,
53
- wh_sp: warehouse
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ItemBuilder
4
- VERSION = '0.1.16'
4
+ VERSION = '0.1.21'
5
5
  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.16
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-14 00:00:00.000000000 Z
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