item_builder_mwh 0.1.0 → 0.1.8

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.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/lib/item_builder_mwh/modes.rb +9 -1
  3. data/lib/item_builder_mwh/modes/active_service.rb +1 -0
  4. data/lib/item_builder_mwh/modes/price/base.rb +26 -0
  5. data/lib/item_builder_mwh/modes/price/blibli_service.rb +27 -0
  6. data/lib/item_builder_mwh/modes/price/bukalapak_service.rb +61 -0
  7. data/lib/item_builder_mwh/modes/price/jd_service.rb +31 -0
  8. data/lib/item_builder_mwh/modes/price/sale_price_policy.rb +40 -0
  9. data/lib/item_builder_mwh/modes/price/shopify_service.rb +28 -0
  10. data/lib/item_builder_mwh/modes/price/zalora_service.rb +27 -0
  11. data/lib/item_builder_mwh/modes/price_service.rb +44 -4
  12. data/lib/item_builder_mwh/modes/quantity/base.rb +75 -0
  13. data/lib/item_builder_mwh/modes/quantity/blibli_service.rb +51 -0
  14. data/lib/item_builder_mwh/modes/quantity/lazada_service.rb +14 -0
  15. data/lib/item_builder_mwh/modes/quantity/zalora_service.rb +14 -0
  16. data/lib/item_builder_mwh/modes/quantity_service.rb +29 -1
  17. data/lib/item_builder_mwh/modes/simple/base.rb +84 -0
  18. data/lib/item_builder_mwh/modes/simple/blibli_service.rb +66 -0
  19. data/lib/item_builder_mwh/modes/simple/bukalapak_service.rb +69 -0
  20. data/lib/item_builder_mwh/modes/simple/jd_service.rb +35 -0
  21. data/lib/item_builder_mwh/modes/simple/lazada_service.rb +25 -0
  22. data/lib/item_builder_mwh/modes/simple/sale_price_policy.rb +39 -0
  23. data/lib/item_builder_mwh/modes/simple/shopee_service.rb +25 -0
  24. data/lib/item_builder_mwh/modes/simple/shopify_service.rb +31 -0
  25. data/lib/item_builder_mwh/modes/simple/zalora_service.rb +31 -0
  26. data/lib/item_builder_mwh/modes/simple_service.rb +81 -7
  27. data/lib/item_builder_mwh/version.rb +1 -1
  28. metadata +28 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d9eb7de591df58991fd11afa321890fdcda2de363302653e079efd789922ef1
4
- data.tar.gz: d60cfce8433ea9d09ffb39a5ebd46429505ad01d90166ff4187aa49a6844f3fc
3
+ metadata.gz: b7959404e655216093aa4627d166ee6c18b7651b7c4d92d37b6cd1ce69e8825d
4
+ data.tar.gz: 224d6f83a4a52895337aed2680813907d9393f8509242c70475852b638d68f98
5
5
  SHA512:
6
- metadata.gz: ea60884bc05fa80363aead8ee18ea5c6d2081f9add3be3075205f7bc2237dd0b46a3aff74b6be86ca10d01af9f115d66f72fcc27b4443e71038986a0bed119c4
7
- data.tar.gz: 31a6cc75433e2ed1f2d48e836ad9c71a69a2a8e59cc53111fc64ea85efdbbb4cce19ce32766df9564a9f836493f038e62a11a903caef83b9002cf0577521a671
6
+ metadata.gz: 6859bbde6689fe1b762166a2eec5b88a4922bd00a95f8b81912447ab31ebecc57e269e6c33e61edd872b623ebf635b77ee6c852e0c580170b977b71b9caef5c3
7
+ data.tar.gz: 4b5006d249a5754af1d80d438cc1a2d1de86518a954ef2d277d81238f029e95435dc2079adad96d84ae4b95e93f0b9d8d804b39b227f70529bd974f80ea0a8b8
@@ -29,7 +29,15 @@ module ItemBuilderMwh
29
29
  end
30
30
 
31
31
  def warehouse_spaces
32
- WarehouseSpace.where(item_variant_id: listing.variant_id)
32
+ WarehouseSpace
33
+ .joins('JOIN warehouse_mappings ON
34
+ warehouse_spaces.warehouse_id = warehouse_mappings.warehouse_id')
35
+ .where("warehouse_mappings.profile_channel_association_id=#{pca}")
36
+ .where("warehouse_spaces.item_variant_id=#{listing.variant_id}")
37
+ end
38
+
39
+ def pca
40
+ listing.profile_channel_association_id.to_s
33
41
  end
34
42
 
35
43
  def warehouse_mapping(warehouse_id)
@@ -15,6 +15,7 @@ module ItemBuilderMwh
15
15
  def to_h(warehouse_space)
16
16
  {
17
17
  active: listing.active,
18
+ quantity: warehouse_space.quantity,
18
19
  warehouse_id: wh_mapping(
19
20
  warehouse_space.warehouse_id
20
21
  )
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/price_service'
6
+ require 'item_builder_mwh/modes/price/sale_price_policy'
7
+ module ItemBuilderMwh
8
+ module Modes
9
+ module Price
10
+ class Base
11
+ attr_reader :listing
12
+
13
+ def initialize(listing)
14
+ raise 'listing is not set' if listing.nil?
15
+
16
+ @listing = listing
17
+ end
18
+
19
+ def sale_price_policy
20
+ @sale_price_policy ||=
21
+ ItemBuilderMwh::Modes::Price::SalePricePolicy.new(listing: listing)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/price/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Price
9
+ class BlibliService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: sale_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at
16
+ }
17
+ end
18
+
19
+ private
20
+
21
+ def sale_price
22
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/price/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Price
9
+ class BukalapakService < Base
10
+ def perform
11
+ if listing.sale_price.nil?
12
+ bukalapak_price
13
+ else
14
+ deal
15
+ end
16
+ end
17
+
18
+ def bukalapak_price
19
+ {
20
+ price: listing.price,
21
+ sale_price: listing.sale_price,
22
+ sale_start_at: listing.sale_start_at,
23
+ sale_end_at: listing.sale_end_at
24
+ }
25
+ end
26
+
27
+ def deal
28
+ {
29
+ percentage: deal_percentage,
30
+ sale_start_at: sale_start_at,
31
+ sale_end_at: sale_end_at,
32
+ price: listing.price,
33
+ sale_price: listing.sale_price
34
+ }
35
+ end
36
+
37
+ def deal_percentage
38
+ price = listing.price.to_f
39
+ sale_price = listing.sale_price.to_f
40
+ 100 - (sale_price / price * 100)
41
+ end
42
+
43
+ def sale_start_at
44
+ return DateTime.now if listing.sale_start_at.nil?
45
+ return DateTime.now if listing.sale_start_at < DateTime.now
46
+
47
+ listing.sale_start_at
48
+ end
49
+
50
+ def sale_end_at
51
+ month_later = DateTime.now + 1.month
52
+ return month_later if listing.sale_end_at.nil?
53
+ return month_later if listing.sale_end_at > month_later
54
+ return month_later if listing.sale_end_at < DateTime.now
55
+
56
+ listing.sale_end_at
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/price/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Price
9
+ class JdService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: jd_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at
16
+ }
17
+ end
18
+
19
+ def jd_price
20
+ increment_price =
21
+ if (listing.price % 1000).positive?
22
+ 1000
23
+ else
24
+ 0
25
+ end
26
+ (listing.price.to_i / 1000) * 1000 + increment_price
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/price_service'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Price
9
+ class SalePricePolicy
10
+ include Modes
11
+ def sale_price
12
+ # has sale price but no sale date defined
13
+ # then push sale price immediately
14
+ # assuming it starts today and no end date specified
15
+ return listing.sale_price if sale_price? && !sale_date?
16
+
17
+ # has sale price and today is on sale then push sale price immediately
18
+ listing.sale_price if sale_price? && on_sale?
19
+ # don't push / don't return anything if 2 rules above unfulfilled
20
+ end
21
+
22
+ def sale_price?
23
+ listing.sale_price
24
+ end
25
+
26
+ def sale_date?
27
+ listing.sale_start_at && listing.sale_end_at
28
+ end
29
+
30
+ def on_sale?
31
+ return false unless sale_price?
32
+
33
+ sale_start_at = listing.sale_start_at || DateTime.now
34
+ sale_end_at = listing.sale_end_at || DateTime.now + 1_000_000.years
35
+ sale_start_at <= DateTime.now && sale_end_at >= DateTime.now
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/price/base'
6
+ require 'item_builder_mwh/modes/price/sale_price_policy'
7
+ module ItemBuilderMwh
8
+ module Modes
9
+ module Price
10
+ class ShopifyService < Base
11
+ def perform
12
+ {
13
+ price: listing.price,
14
+ sale_price: sale_price,
15
+ sale_start_at: listing.sale_start_at,
16
+ sale_end_at: listing.sale_end_at
17
+ }
18
+ end
19
+
20
+ private
21
+
22
+ def sale_price
23
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/price/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Price
9
+ class ZaloraService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: sale_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at
16
+ }
17
+ end
18
+
19
+ private
20
+
21
+ def sale_price
22
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,11 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'item_builder_mwh/modes.rb'
4
+ require 'item_builder_mwh/modes/price/base'
5
+ require 'item_builder_mwh/modes/price/blibli_service'
6
+ require 'item_builder_mwh/modes/price/bukalapak_service'
7
+ require 'item_builder_mwh/modes/price/zalora_service'
8
+ require 'item_builder_mwh/modes/price/shopify_service'
9
+ require 'item_builder_mwh/modes/price/sale_price_policy'
10
+ require 'item_builder_mwh/modes/price/jd_service'
4
11
  module ItemBuilderMwh
5
12
  module Modes
6
13
  class PriceService
7
14
  include Modes
8
15
 
16
+ PRICE_CHANNEL = {}.tap do |hash|
17
+ hash[2] = :Shopify
18
+ hash[9] = :Blibli
19
+ hash[11] = :Bukalapak
20
+ hash[13] = :Zalora
21
+ hash[16] = :Jd
22
+ end.freeze
23
+
9
24
  def perform
10
25
  base.merge!(
11
26
  warehouse: warehouses
@@ -13,16 +28,41 @@ module ItemBuilderMwh
13
28
  end
14
29
 
15
30
  def to_h(warehouse_space)
31
+ warehouse_ids(warehouse_space).merge(
32
+ price
33
+ )
34
+ end
35
+
36
+ def warehouse_ids(warehouse_space)
16
37
  {
17
- price: listing.price,
18
- sale_price: listing.sale_price,
19
- sale_start_at: listing.sale_start_at,
20
- sale_end_at: listing.sale_end_at,
21
38
  warehouse_id: wh_mapping(
22
39
  warehouse_space.warehouse_id
23
40
  )
24
41
  }
25
42
  end
43
+
44
+ def price
45
+ if channel_name.empty?
46
+ {
47
+ price: listing.price,
48
+ sale_price: listing.sale_price,
49
+ sale_start_at: listing.sale_start_at,
50
+ sale_end_at: listing.sale_end_at
51
+ }
52
+ else
53
+ price_channel
54
+ end
55
+ end
56
+
57
+ def price_channel
58
+ class_name = "ItemBuilderMwh::Modes::Price::#{channel_name}Service"
59
+ price_channel_service = class_name.constantize
60
+ price_channel_service.new(listing).perform
61
+ end
62
+
63
+ def channel_name
64
+ PRICE_CHANNEL[listing.channel_id].to_s
65
+ end
26
66
  end
27
67
  end
28
68
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ItemBuilderMwh
4
+ module Modes
5
+ module Quantity
6
+ class Base
7
+ attr_reader :listing
8
+ attr_reader :available_quantity
9
+
10
+ def initialize(listing, available_quantity)
11
+ raise 'listing is not set' if listing.nil?
12
+
13
+ @listing = listing
14
+ @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
+ 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
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,51 @@
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
@@ -0,0 +1,14 @@
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 LazadaService < Base
8
+ def perform
9
+ available_quantity + reserved_stock.to_i
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
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 ZaloraService < Base
8
+ def perform
9
+ available_quantity + reserved_stock.to_i
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -2,11 +2,21 @@
2
2
 
3
3
  require 'warehouse_models'
4
4
  require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/quantity/base'
6
+ require 'item_builder_mwh/modes/quantity/lazada_service'
7
+ require 'item_builder_mwh/modes/quantity/blibli_service'
8
+ require 'item_builder_mwh/modes/quantity/zalora_service'
5
9
  module ItemBuilderMwh
6
10
  module Modes
7
11
  class QuantityService
8
12
  include Modes
9
13
 
14
+ QUANTITY_CHANNEL = {}.tap do |hash|
15
+ hash[3] = :Lazada
16
+ hash[9] = :Blibli
17
+ hash[13] = :Zalora
18
+ end.freeze
19
+
10
20
  def perform
11
21
  base.merge!(
12
22
  warehouse: warehouses
@@ -15,12 +25,30 @@ module ItemBuilderMwh
15
25
 
16
26
  def to_h(warehouse_space)
17
27
  {
18
- quantity: warehouse_space.quantity,
28
+ quantity: qty(warehouse_space.quantity),
19
29
  warehouse_id: wh_mapping(
20
30
  warehouse_space.warehouse_id
21
31
  )
22
32
  }
23
33
  end
34
+
35
+ def qty(available_qty)
36
+ if channel_name.empty?
37
+ available_qty
38
+ else
39
+ qty_channel(available_qty)
40
+ end
41
+ end
42
+
43
+ def qty_channel(available_qty)
44
+ class_name = "ItemBuilderMwh::Modes::Quantity::#{channel_name}Service"
45
+ qty_channel_service = class_name.constantize
46
+ qty_channel_service.new(listing, available_qty).perform
47
+ end
48
+
49
+ def channel_name
50
+ QUANTITY_CHANNEL[listing.channel_id].to_s
51
+ end
24
52
  end
25
53
  end
26
54
  end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple_service'
6
+ require 'item_builder_mwh/modes/simple/sale_price_policy'
7
+ module ItemBuilderMwh
8
+ module Modes
9
+ module Simple
10
+ class Base
11
+ attr_reader :listing
12
+ attr_reader :available_quantity
13
+
14
+ def initialize(listing, available_quantity)
15
+ raise 'listing is not set' if listing.nil?
16
+
17
+ @listing = listing
18
+ @available_quantity = available_quantity
19
+ end
20
+
21
+ def order_host
22
+ url = ENV['ORDERS_URL'] || 'orders.forstok.com'
23
+ url + '/api/v2/item_line/reserved_stock'
24
+ end
25
+
26
+ def reserved_params
27
+ "account_id=#{listing.profile_channel_association_id}
28
+ &item_variant_id=#{listing.variant_id}"
29
+ end
30
+
31
+ def reserved_stock
32
+ RestClient.get("#{order_host}?#{reserved_params}")
33
+ rescue RestClient::ExceptionWithResponse => e
34
+ e.response
35
+ end
36
+
37
+ def apigateway_get
38
+ RestClient.get("#{host}?#{params}")
39
+ rescue RestClient::ExceptionWithResponse => e
40
+ e.response
41
+ end
42
+
43
+ def headers
44
+ {
45
+ content_type: :json,
46
+ accept: :json
47
+ }
48
+ end
49
+
50
+ def credential
51
+ account_id = listing.profile_channel_association_id
52
+ host = ENV['CREDENTIAL_URL'] || 'user.forstok.com'
53
+ begin
54
+ RestClient.get("#{host}/credential?account_id=#{account_id}")
55
+ rescue RestClient::ExceptionWithResponse => e
56
+ e.response
57
+ end
58
+ end
59
+
60
+ def data
61
+ {
62
+ "credential": JSON.parse(credential)['credential'],
63
+ "data": request
64
+ }
65
+ end
66
+
67
+ def api_data
68
+ data.to_json
69
+ end
70
+
71
+ def sale_price_policy
72
+ @sale_price_policy ||=
73
+ ItemBuilderMwh::Modes::Simple::SalePricePolicy.new(listing: listing)
74
+ end
75
+
76
+ def apigateway_post
77
+ RestClient.post(url, api_data, headers)
78
+ rescue RestClient::ExceptionWithResponse => e
79
+ e.response
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Simple
9
+ class BlibliService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: sale_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at,
16
+ quantity: local_variant,
17
+ warehouse_id: wh_mapping(
18
+ warehouse_space.warehouse_id
19
+ )
20
+ }
21
+ end
22
+
23
+ def local_variant
24
+ qty = 0
25
+ local_product['value']['items'].each do |item|
26
+ qty = total_quantity(item) if item['itemSku'] == listing.local_id
27
+ end
28
+ qty
29
+ end
30
+
31
+ def total_quantity(item)
32
+ # Make stock 0
33
+ # if local reserved quantity is bigger than available quantity
34
+ if item['reservedStockLevel2'] > available_quantity
35
+ 0
36
+ else
37
+ item['availableStockLevel2'] + item['reservedStockLevel2']
38
+ end
39
+ end
40
+
41
+ # Find local product based on id
42
+ # @return [Hash] Local Blibli product
43
+ def local_product
44
+ @local_product ||= JSON.parse(apigateway_post)
45
+ end
46
+
47
+ private
48
+
49
+ def request
50
+ {
51
+ "gdnSku": listing.local_id
52
+ }
53
+ end
54
+
55
+ def url
56
+ url = ENV['API_GATEWAY_URL'] || 'apigateway.forstok.com'
57
+ url + '/blibli/item'
58
+ end
59
+
60
+ def sale_price
61
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Simple
9
+ class BukalapakService < Base
10
+ def perform
11
+ if listing.sale_price.nil?
12
+ bukalapak_price
13
+ else
14
+ deal
15
+ end
16
+ end
17
+
18
+ def bukalapak_price
19
+ {
20
+ price: listing.price,
21
+ sale_price: listing.sale_price,
22
+ sale_start_at: listing.sale_start_at,
23
+ sale_end_at: listing.sale_end_at,
24
+ quantity: available_quantity,
25
+ warehouse_id: wh_mapping(
26
+ warehouse_space.warehouse_id
27
+ )
28
+ }
29
+ end
30
+
31
+ def deal
32
+ {
33
+ percentage: deal_percentage,
34
+ sale_start_at: sale_start_at,
35
+ sale_end_at: sale_end_at,
36
+ price: listing.price,
37
+ sale_price: listing.sale_price,
38
+ quantity: available_quantity,
39
+ warehouse_id: wh_mapping(
40
+ warehouse_space.warehouse_id
41
+ )
42
+ }
43
+ end
44
+
45
+ def deal_percentage
46
+ price = listing.price.to_f
47
+ sale_price = listing.sale_price.to_f
48
+ 100 - (sale_price / price * 100)
49
+ end
50
+
51
+ def sale_start_at
52
+ return DateTime.now if listing.sale_start_at.nil?
53
+ return DateTime.now if listing.sale_start_at < DateTime.now
54
+
55
+ listing.sale_start_at
56
+ end
57
+
58
+ def sale_end_at
59
+ month_later = DateTime.now + 1.month
60
+ return month_later if listing.sale_end_at.nil?
61
+ return month_later if listing.sale_end_at > month_later
62
+ return month_later if listing.sale_end_at < DateTime.now
63
+
64
+ listing.sale_end_at
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Simple
9
+ class JdService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: jd_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at,
16
+ quantity: available_quantity,
17
+ warehouse_id: wh_mapping(
18
+ warehouse_space.warehouse_id
19
+ )
20
+ }
21
+ end
22
+
23
+ def jd_price
24
+ increment_price =
25
+ if (listing.price % 1000).positive?
26
+ 1000
27
+ else
28
+ 0
29
+ end
30
+ (listing.price.to_i / 1000) * 1000 + increment_price
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Simple
9
+ class LazadaService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: listing.sale_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at,
16
+ quantity: available_quantity + reserved_stock.to_i,
17
+ warehouse_id: wh_mapping(
18
+ warehouse_space.warehouse_id
19
+ )
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes/simple_service'
5
+ module ItemBuilderMwh
6
+ module Modes
7
+ module Simple
8
+ class SalePricePolicy
9
+ include Modes
10
+ def sale_price
11
+ # has sale price but no sale date defined
12
+ # then push sale price immediately
13
+ # assuming it starts today and no end date specified
14
+ return listing.sale_price if sale_price? && !sale_date?
15
+
16
+ # has sale price and today is on sale then push sale price immediately
17
+ listing.sale_price if sale_price? && on_sale?
18
+ # don't push / don't return anything if 2 rules above unfulfilled
19
+ end
20
+
21
+ def sale_price?
22
+ listing.sale_price
23
+ end
24
+
25
+ def sale_date?
26
+ listing.sale_start_at && listing.sale_end_at
27
+ end
28
+
29
+ def on_sale?
30
+ return false unless sale_price?
31
+
32
+ sale_start_at = listing.sale_start_at || DateTime.now
33
+ sale_end_at = listing.sale_end_at || DateTime.now + 1_000_000.years
34
+ sale_start_at <= DateTime.now && sale_end_at >= DateTime.now
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Simple
9
+ class ShopeeService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: listing.sale_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at,
16
+ quantity: available_quantity,
17
+ warehouse_id: wh_mapping(
18
+ warehouse_space.warehouse_id
19
+ )
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Simple
9
+ class ShopifyService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: sale_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at,
16
+ quantity: available_quantity,
17
+ warehouse_id: wh_mapping(
18
+ warehouse_space.warehouse_id
19
+ )
20
+ }
21
+ end
22
+
23
+ private
24
+
25
+ def sale_price
26
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple/base'
6
+ module ItemBuilderMwh
7
+ module Modes
8
+ module Simple
9
+ class ZaloraService < Base
10
+ def perform
11
+ {
12
+ price: listing.price,
13
+ sale_price: sale_price,
14
+ sale_start_at: listing.sale_start_at,
15
+ sale_end_at: listing.sale_end_at,
16
+ quantity: available_quantity + reserved_stock.to_i,
17
+ warehouse_id: wh_mapping(
18
+ warehouse_space.warehouse_id
19
+ )
20
+ }
21
+ end
22
+
23
+ private
24
+
25
+ def sale_price
26
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,13 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'item_builder_mwh/modes/quantity_service.rb'
4
- require 'item_builder_mwh/modes/price_service.rb'
3
+ require 'warehouse_models'
5
4
  require 'item_builder_mwh/modes.rb'
5
+ require 'item_builder_mwh/modes/simple/blibli_service'
6
+ require 'item_builder_mwh/modes/simple/bukalapak_service'
7
+ require 'item_builder_mwh/modes/simple/zalora_service'
8
+ require 'item_builder_mwh/modes/simple/shopify_service'
9
+ require 'item_builder_mwh/modes/simple/jd_service'
10
+ require 'item_builder_mwh/modes/simple/lazada_service'
11
+ require 'item_builder_mwh/modes/simple/shopee_service'
6
12
  module ItemBuilderMwh
7
13
  module Modes
8
14
  class SimpleService
9
15
  include Modes
10
16
 
17
+ QUANTITY_CHANNEL = {}.tap do |hash|
18
+ hash[3] = :Lazada
19
+ hash[9] = :Blibli
20
+ hash[12] = :Shopee
21
+ hash[13] = :Zalora
22
+ end.freeze
23
+
24
+ PRICE_CHANNEL = {}.tap do |hash|
25
+ hash[2] = :Shopify
26
+ hash[9] = :Blibli
27
+ hash[11] = :Bukalapak
28
+ hash[13] = :Zalora
29
+ hash[16] = :Jd
30
+ end.freeze
31
+
11
32
  def perform
12
33
  base.merge!(
13
34
  warehouse: warehouses
@@ -15,17 +36,70 @@ module ItemBuilderMwh
15
36
  end
16
37
 
17
38
  def to_h(warehouse_space)
39
+ warehouse_ids(warehouse_space).merge(
40
+ simple(warehouse_space)
41
+ )
42
+ end
43
+
44
+ def warehouse_ids(warehouse_space)
18
45
  {
19
- quantity: warehouse_space.quantity,
20
- price: listing.price,
21
- sale_price: listing.sale_price,
22
- sale_start_at: listing.sale_start_at,
23
- sale_end_at: listing.sale_end_at,
24
46
  warehouse_id: wh_mapping(
25
47
  warehouse_space.warehouse_id
26
48
  )
27
49
  }
28
50
  end
51
+
52
+ def simple(warehouse_space)
53
+ available_qty = warehouse_space.quantity
54
+ qty(available_qty).merge(
55
+ price
56
+ )
57
+ end
58
+
59
+ def qty(available_qty)
60
+ if quantity_name.empty?
61
+ {
62
+ quantity: available_qty
63
+ }
64
+ else
65
+ {
66
+ quantity: qty_channel(available_qty)
67
+ }
68
+ end
69
+ end
70
+
71
+ def price
72
+ if price_name.empty?
73
+ {
74
+ price: listing.price,
75
+ sale_price: listing.sale_price,
76
+ sale_start_at: listing.sale_start_at,
77
+ sale_end_at: listing.sale_end_at
78
+ }
79
+ else
80
+ price_channel
81
+ end
82
+ end
83
+
84
+ def price_channel
85
+ class_name = "ItemBuilderMwh::Modes::Price::#{price_name}Service"
86
+ simple_channel_service = class_name.constantize
87
+ simple_channel_service.new(listing, available_qty).perform
88
+ end
89
+
90
+ def qty_channel(available_qty)
91
+ class_name = "ItemBuilderMwh::Modes::Quantity::#{quantity_name}Service"
92
+ qty_channel_service = class_name.constantize
93
+ qty_channel_service.new(listing, available_qty).perform
94
+ end
95
+
96
+ def price_name
97
+ PRICE_CHANNEL[listing.channel_id].to_s
98
+ end
99
+
100
+ def quantity_name
101
+ QUANTITY_CHANNEL[listing.channel_id].to_s
102
+ end
29
103
  end
30
104
  end
31
105
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ItemBuilderMwh
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.8'
5
5
  end
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.0
4
+ version: 0.1.8
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: 2020-06-04 00:00:00.000000000 Z
11
+ date: 2020-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.0.7
89
+ version: 0.0.11
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.0.7
96
+ version: 0.0.11
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: warehouse_models
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -119,14 +119,34 @@ files:
119
119
  - lib/item_builder_mwh/modes.rb
120
120
  - lib/item_builder_mwh/modes/active_service.rb
121
121
  - lib/item_builder_mwh/modes/base_service.rb
122
+ - lib/item_builder_mwh/modes/price/base.rb
123
+ - lib/item_builder_mwh/modes/price/blibli_service.rb
124
+ - lib/item_builder_mwh/modes/price/bukalapak_service.rb
125
+ - lib/item_builder_mwh/modes/price/jd_service.rb
126
+ - lib/item_builder_mwh/modes/price/sale_price_policy.rb
127
+ - lib/item_builder_mwh/modes/price/shopify_service.rb
128
+ - lib/item_builder_mwh/modes/price/zalora_service.rb
122
129
  - lib/item_builder_mwh/modes/price_service.rb
130
+ - lib/item_builder_mwh/modes/quantity/base.rb
131
+ - lib/item_builder_mwh/modes/quantity/blibli_service.rb
132
+ - lib/item_builder_mwh/modes/quantity/lazada_service.rb
133
+ - lib/item_builder_mwh/modes/quantity/zalora_service.rb
123
134
  - lib/item_builder_mwh/modes/quantity_service.rb
135
+ - lib/item_builder_mwh/modes/simple/base.rb
136
+ - lib/item_builder_mwh/modes/simple/blibli_service.rb
137
+ - lib/item_builder_mwh/modes/simple/bukalapak_service.rb
138
+ - lib/item_builder_mwh/modes/simple/jd_service.rb
139
+ - lib/item_builder_mwh/modes/simple/lazada_service.rb
140
+ - lib/item_builder_mwh/modes/simple/sale_price_policy.rb
141
+ - lib/item_builder_mwh/modes/simple/shopee_service.rb
142
+ - lib/item_builder_mwh/modes/simple/shopify_service.rb
143
+ - lib/item_builder_mwh/modes/simple/zalora_service.rb
124
144
  - lib/item_builder_mwh/modes/simple_service.rb
125
145
  - lib/item_builder_mwh/version.rb
126
- homepage:
146
+ homepage:
127
147
  licenses: []
128
148
  metadata: {}
129
- post_install_message:
149
+ post_install_message:
130
150
  rdoc_options: []
131
151
  require_paths:
132
152
  - lib
@@ -142,7 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
162
  version: '0'
143
163
  requirements: []
144
164
  rubygems_version: 3.0.6
145
- signing_key:
165
+ signing_key:
146
166
  specification_version: 4
147
167
  summary: Item Builder Multiwarehouse
148
168
  test_files: []