item_builder 0.1.24 → 0.1.29

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
  SHA256:
3
- metadata.gz: e84c717790a58f223fe7c45bb48a5bd4af6cdddac870d065bd706ad2274bccc5
4
- data.tar.gz: 57963c302c7f68816e6976d0eba8095407a403cf820c6e72eac04c42bc7bbb7a
3
+ metadata.gz: 99df6cad1a31d94df70b1deb5aa40b57d48eb6fab7a27c36a2843a0d81710aa9
4
+ data.tar.gz: e07088f915c42ce126e8ce943113d272312c65dd1961b703b9210ef4b6459da8
5
5
  SHA512:
6
- metadata.gz: 9bb7b47d6e283efd1d301726532a3929661d520640c600b3e42c74b5d1e58a6cf81d24c3577164d937a3919f1ca2ffe015554fb0b5357849c92bfe758a51b60f
7
- data.tar.gz: 6854dd8d599eed25c3ab1b74e8a1c14437e74e80ea22f04d43bb2d54ce7cb0db0ab9a1f0adb368173cfb4830963206a98f62cfad0651bc562a420ab5d5b7fb8a
6
+ metadata.gz: 996034fe165910db1cc1d7431492329383068effe64f8f014a98b333b1b6a94c8a166b19a9a113c84afe2eb4d7a95c4992a93e5104a3f3f59efb82b322619e4e
7
+ data.tar.gz: 20ffc61ea320c64af957763e8c69bc6aea2aebe0c3b62b99f38029d8d5f9df904b210125b0430965e0de4d9051ad5f2b78d7e67107d10590970a3709b8f0d74b
data/lib/item_builder.rb CHANGED
@@ -26,25 +26,26 @@ class ItemBuilder
26
26
  end
27
27
 
28
28
  def mode_check
29
- if mode == :quantity
30
- quantity_mode
29
+ if mode == :quantity || mode == :simple
30
+ quantity_simple_mode
31
31
  else
32
32
  default
33
33
  end
34
34
  end
35
35
 
36
- def quantity_mode
36
+ def quantity_simple_mode
37
37
  listings.map do |listing|
38
- modes[mode].new(qty_params(listing)).perform
38
+ modes[mode].new(qty_simple_params(listing)).perform
39
39
  end
40
40
  end
41
41
 
42
- def qty_params(listing)
42
+ def qty_simple_params(listing)
43
43
  {
44
44
  listing: listing, wh_spaces: wh_spaces, variants: variants,
45
45
  stock_allocs: stock_allocs, variant_listings: variant_listings,
46
46
  bundles: bundles, item_bundle_variants: item_bundle_variants,
47
- existing_alloc_stocks: existing_alloc_stocks
47
+ existing_alloc_stocks: existing_alloc_stocks,
48
+ reserved_stocks: reserved_stocks
48
49
  }
49
50
  end
50
51
 
@@ -70,8 +71,7 @@ class ItemBuilder
70
71
 
71
72
  def item_bundle_variants
72
73
  @item_bundle_variants ||= BundleVariant.where(
73
- bundle_id: bundle_ids,
74
- channel_id: listings[0].channel_id
74
+ bundle_id: bundle_ids
75
75
  )
76
76
  end
77
77
 
@@ -114,4 +114,20 @@ class ItemBuilder
114
114
  update: ItemBuilder::Modes::UpdateService
115
115
  }
116
116
  end
117
+
118
+ def order_host
119
+ url = ENV['ORDERS_URL'] || 'orders.forstok.com'
120
+ url + '/api/v3/item_line/reserved_stock'
121
+ end
122
+
123
+ def reserved_params
124
+ "account_id=#{listings[0].profile_channel_association_id}
125
+ &item_variant_ids=#{variant_ids.join(',')}"
126
+ end
127
+
128
+ def reserved_stocks
129
+ @reserved_stocks ||= JSON.parse(RestClient.get(
130
+ "#{order_host}?#{reserved_params}"
131
+ ).body) if [3,13,18].include?(listings[0].channel_id)
132
+ end
117
133
  end
@@ -16,6 +16,7 @@ class ItemBuilder
16
16
  attr_reader :item_bundle_variants
17
17
  attr_reader :existing_alloc_stocks
18
18
  attr_reader :variant_listings
19
+ attr_reader :reserved_stocks
19
20
  def initialize(args)
20
21
  @listing = args.fetch(:listing)
21
22
  @wh_spaces = args.fetch(:wh_spaces, [])
@@ -25,6 +26,7 @@ class ItemBuilder
25
26
  @item_bundle_variants = args.fetch(:item_bundle_variants, [])
26
27
  @existing_alloc_stocks = args.fetch(:existing_alloc_stocks, [])
27
28
  @variant_listings = args.fetch(:variant_listings, [])
29
+ @reserved_stocks = args.fetch(:reserved_stocks, [])
28
30
  end
29
31
 
30
32
  def base
@@ -35,5 +37,39 @@ class ItemBuilder
35
37
  sku: listing.sku
36
38
  }
37
39
  end
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 warehouse
68
+ wh_spaces.select {|ws| ws.item_variant_id == listing.variant_id }.first
69
+ end
70
+
71
+ def variant
72
+ variants.select {|v| v.id == listing.variant_id }.first
73
+ end
38
74
  end
39
75
  end
@@ -6,30 +6,14 @@ class ItemBuilder
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
- end
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
- end
30
-
31
- def apigateway_get
32
- RestClient.get("#{host}?#{params}")
16
+ @reserved_stock = reserved_stock
33
17
  end
34
18
  end
35
19
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes/quantity/base'
4
+ class ItemBuilder
5
+ module Modes
6
+ module Quantity
7
+ class ZilingoService < Base
8
+ def perform
9
+ available_quantity - local_quantity.to_i
10
+ end
11
+
12
+ def local_quantity
13
+ quantities = sku_quantities(listing.local_item_id)
14
+ quantities[listing.local_id]
15
+ end
16
+
17
+ def headers
18
+ { content_type: :json, accept: :json }
19
+ end
20
+
21
+ def data(item_id)
22
+ {
23
+ "credential": JSON.parse(credential)['credential'],
24
+ "data": { "item_id": item_id }
25
+ }.to_json
26
+ end
27
+
28
+ def credential
29
+ return @credential if @credential
30
+
31
+ account_id = listing.profile_channel_association_id
32
+ host = ENV['CREDENTIAL_URL'] || raise('credential url is not set')
33
+ url = "#{host}/credential?account_id=#{account_id}"
34
+ @credential = rest_client(method: :get, url: url)
35
+ end
36
+
37
+ def url
38
+ url = ENV['API_GATEWAY_URL'] || raise('api gateway is not set')
39
+ url + "/zilingo/item_quantities"
40
+ end
41
+
42
+ def sku_quantities(item_id)
43
+ args = {
44
+ method: :post, url: url, payload: data(item_id), headers: headers
45
+ }
46
+ resp = JSON.parse(rest_client(args, [200, 500, 406]))
47
+ response_process(resp)
48
+ end
49
+
50
+ def response_process(resp)
51
+ hash = Hash.new
52
+ resp['zilingoSKUQuantities'].each do |sku|
53
+ hash[sku['zilingoSKUId']] = sku['quantity'] + sku['frozenQuantity']
54
+ end
55
+ hash
56
+ end
57
+
58
+ def rest_client(params, rescued_codes = 200)
59
+ RestClient::Request.execute(params.merge(timeout: 3)) do |response|
60
+ code = response.code
61
+ unless Array.wrap(rescued_codes).include?(code)
62
+ raise "Response Code is #{code}"
63
+ end
64
+
65
+ response
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -6,6 +6,7 @@ require 'item_builder/get_quantity_service'
6
6
  require 'item_builder/modes/quantity/base'
7
7
  require 'item_builder/modes/quantity/lazada_service'
8
8
  require 'item_builder/modes/quantity/zalora_service'
9
+ require 'item_builder/modes/quantity/zilingo_service'
9
10
  class ItemBuilder
10
11
  module Modes
11
12
  class QuantityService
@@ -14,6 +15,7 @@ class ItemBuilder
14
15
  QUANTITY_CHANNEL = {}.tap do |hash|
15
16
  hash[3] = :Lazada
16
17
  hash[13] = :Zalora
18
+ hash[18] = :Zilingo
17
19
  end.freeze
18
20
 
19
21
  def perform
@@ -37,13 +39,17 @@ class ItemBuilder
37
39
  def qty_channel
38
40
  class_name = "ItemBuilder::Modes::Quantity::#{channel_name}Service"
39
41
  qty_channel_service = class_name.constantize
40
- qty_channel_service.new(listing, available_quantity).perform
42
+ qty_channel_service.new(listing, available_quantity, reserved_stock).perform
41
43
  end
42
44
 
43
45
  def channel_name
44
46
  QUANTITY_CHANNEL[listing.channel_id].to_s
45
47
  end
46
48
 
49
+ def reserved_stock
50
+ reserved_stocks.find {|rs| rs['variant_id'] == listing.variant_id }['reserved_quantity']
51
+ end
52
+
47
53
  def available_quantity
48
54
  ItemBuilder::GetQuantityService.new(
49
55
  listing: listing, variant: variant,
@@ -52,40 +58,6 @@ class ItemBuilder
52
58
  existing_allocated_stock: existing_allocated_stock
53
59
  ).perform
54
60
  end
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.compact
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
- if bundle.present?
70
- item_bundle_variants.select {|ibv| ibv.bundle_id == bundle.id }
71
- end
72
- end
73
-
74
- def bundle
75
- bundles.select {|b| b.variant_id == listing.variant_id }.first
76
- end
77
-
78
- def stock_alloc
79
- stock_allocs.select {|sa| sa.variant_association_id == listing.id }.first
80
- end
81
-
82
- def warehouse
83
- wh_spaces.select {|ws| ws.item_variant_id == listing.variant_id }.first
84
- end
85
-
86
- def variant
87
- variants.select {|v| v.id == listing.variant_id }.first
88
- end
89
61
  end
90
62
  end
91
63
  end
@@ -17,7 +17,13 @@ class ItemBuilder
17
17
  end
18
18
 
19
19
  def quantity
20
- QuantityService.new(listing: listing).to_h
20
+ QuantityService.new(
21
+ listing: listing, wh_spaces: wh_spaces, variants: variants,
22
+ stock_allocs: stock_allocs, variant_listings: variant_listings,
23
+ bundles: bundles, item_bundle_variants: item_bundle_variants,
24
+ existing_alloc_stocks: existing_alloc_stocks,
25
+ reserved_stocks: reserved_stocks
26
+ ).to_h
21
27
  end
22
28
 
23
29
  def price
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ItemBuilder
4
- VERSION = '0.1.24'
4
+ VERSION = '0.1.29'
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.24
4
+ version: 0.1.29
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-28 00:00:00.000000000 Z
11
+ date: 2021-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -131,6 +131,7 @@ files:
131
131
  - lib/item_builder/modes/quantity/base.rb
132
132
  - lib/item_builder/modes/quantity/lazada_service.rb
133
133
  - lib/item_builder/modes/quantity/zalora_service.rb
134
+ - lib/item_builder/modes/quantity/zilingo_service.rb
134
135
  - lib/item_builder/modes/quantity_service.rb
135
136
  - lib/item_builder/modes/simple_service.rb
136
137
  - lib/item_builder/modes/update/base.rb