item_builder_mwh 0.1.6 → 0.1.11

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/item_builder_mwh.rb +116 -14
  3. data/lib/item_builder_mwh/get_quantity_service.rb +132 -0
  4. data/lib/item_builder_mwh/modes.rb +47 -1
  5. data/lib/item_builder_mwh/modes/active_service.rb +1 -1
  6. data/lib/item_builder_mwh/modes/base_service.rb +1 -1
  7. data/lib/item_builder_mwh/modes/price/base.rb +26 -0
  8. data/lib/item_builder_mwh/modes/price/blibli_service.rb +27 -0
  9. data/lib/item_builder_mwh/modes/price/bukalapak_service.rb +61 -0
  10. data/lib/item_builder_mwh/modes/price/jd_service.rb +31 -0
  11. data/lib/item_builder_mwh/modes/price/sale_price_policy.rb +40 -0
  12. data/lib/item_builder_mwh/modes/price/shopify_service.rb +28 -0
  13. data/lib/item_builder_mwh/modes/price/zalora_service.rb +27 -0
  14. data/lib/item_builder_mwh/modes/price_service.rb +45 -5
  15. data/lib/item_builder_mwh/modes/quantity/base.rb +4 -58
  16. data/lib/item_builder_mwh/modes/quantity/lazada_service.rb +1 -1
  17. data/lib/item_builder_mwh/modes/quantity/zalora_service.rb +1 -1
  18. data/lib/item_builder_mwh/modes/quantity_service.rb +21 -11
  19. data/lib/item_builder_mwh/modes/simple/base.rb +74 -0
  20. data/lib/item_builder_mwh/modes/{quantity → simple}/blibli_service.rb +19 -4
  21. data/lib/item_builder_mwh/modes/simple/bukalapak_service.rb +69 -0
  22. data/lib/item_builder_mwh/modes/simple/jd_service.rb +35 -0
  23. data/lib/item_builder_mwh/modes/simple/lazada_service.rb +25 -0
  24. data/lib/item_builder_mwh/modes/simple/sale_price_policy.rb +39 -0
  25. data/lib/item_builder_mwh/modes/simple/shopee_service.rb +25 -0
  26. data/lib/item_builder_mwh/modes/simple/shopify_service.rb +31 -0
  27. data/lib/item_builder_mwh/modes/simple/zalora_service.rb +31 -0
  28. data/lib/item_builder_mwh/modes/simple_service.rb +93 -8
  29. data/lib/item_builder_mwh/version.rb +2 -2
  30. metadata +23 -8
  31. data/lib/item_builder_mwh/modes/quantity/shopee_service.rb +0 -14
@@ -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
+ class 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
+ class 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
+ class 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
+ class 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
- module ItemBuilderMwh
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'
11
+ class 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
@@ -1,73 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ItemBuilderMwh
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
- 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
16
+ @reserved_stock = reserved_stock
71
17
  end
72
18
  end
73
19
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'item_builder_mwh/modes/quantity/base'
4
- module ItemBuilderMwh
4
+ class ItemBuilderMwh
5
5
  module Modes
6
6
  module Quantity
7
7
  class LazadaService < Base
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'item_builder_mwh/modes/quantity/base'
4
- module ItemBuilderMwh
4
+ class ItemBuilderMwh
5
5
  module Modes
6
6
  module Quantity
7
7
  class ZaloraService < Base
@@ -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
- module ItemBuilderMwh
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(available_qty)
34
+ def qty(qty)
38
35
  if channel_name.empty?
39
- available_qty
36
+ available_quantity(qty)
40
37
  else
41
- qty_channel(available_qty)
38
+ qty_channel(qty)
42
39
  end
43
40
  end
44
41
 
45
- def qty_channel(available_qty)
46
- class_name = "ItemBuilder::Modes::Quantity::#{channel_name}Service"
42
+ def qty_channel(qty)
43
+ class_name = "ItemBuilderMwh::Modes::Quantity::#{channel_name}Service"
47
44
  qty_channel_service = class_name.constantize
48
- qty_channel_service.new(listing, available_qty).perform
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
@@ -0,0 +1,74 @@
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
+ class 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
+ end
34
+
35
+ def apigateway_get
36
+ RestClient.get("#{host}?#{params}")
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
+ RestClient.get("#{host}/credential?account_id=#{account_id}")
50
+ end
51
+
52
+ def data
53
+ {
54
+ "credential": JSON.parse(credential)['credential'],
55
+ "data": request
56
+ }
57
+ end
58
+
59
+ def api_data
60
+ data.to_json
61
+ end
62
+
63
+ def sale_price_policy
64
+ @sale_price_policy ||=
65
+ ItemBuilderMwh::Modes::Simple::SalePricePolicy.new(listing: listing)
66
+ end
67
+
68
+ def apigateway_post
69
+ RestClient.post(url, api_data, headers)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end