item_builder_mwh 0.1.6 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
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