item_builder 0.1.7 → 0.1.12

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: ebceb3427d68a53fb3facea200a85e32fb477039b62a0b079b10a464a1850522
4
- data.tar.gz: ed3a430d03d4cd89a8c305e57b120dd8ad674e578e3d521785e5e766f76dbedf
3
+ metadata.gz: 1ff740418480a710b0cec377cec19a6330aad599ea3fbe555280f7ad0c59f08b
4
+ data.tar.gz: 02e64890eb8054a0bf68bc613c1b3e0637450c9e2846ecad4fdd9649b29e6e01
5
5
  SHA512:
6
- metadata.gz: 0cd24fa0b83b7174c6c6000d53cfee09268637a629a6a2270d5f2342db1f2a8eddaf9e08a8936a3ab02a95d36ca158f5dd02d27d13e1fc0adcbd47e06ea04628
7
- data.tar.gz: 67749d7588053e7e69f2d62c1061eac4047a0459e15c198c7dc331a52703a17fef5a5159b1e36d5b5b886c604e2965e8fda76e6560cf1c9d2d2b2c27d1b9a7cd
6
+ metadata.gz: 40383445dc0e0b9b7a44610de2de1d8950523616f339881d0285875882dd7c50fb8d40e3680f5b100609ba8c39110d5e8d152a1d8e3d87d4fbf5b24cf4351129
7
+ data.tar.gz: fe4881bb71807c32e5a6e0d39a74afa62a3606a38e72fe1f363d08b7ec72b38b2868c3c7ed133c2947dca5c1de2ae729a809ca6d9b7413b6cac22c523a32d1cb
@@ -22,7 +22,8 @@ module ItemBuilder
22
22
  price: ItemBuilder::Modes::PriceService,
23
23
  quantity: ItemBuilder::Modes::QuantityService,
24
24
  simple: ItemBuilder::Modes::SimpleService,
25
- active: ItemBuilder::Modes::ActiveService
25
+ active: ItemBuilder::Modes::ActiveService,
26
+ update: ItemBuilder::Modes::UpdateService
26
27
  }
27
28
  end
28
29
  end
@@ -78,21 +78,16 @@ module ItemBuilder
78
78
  # Quantity for bundle config
79
79
  qty_list = []
80
80
  bundle_variants.each do |bvr|
81
- qty = 0
82
- if bundle_condition(bvr)
83
- qty = bvr.variant.warehouse_spaces.first.quantity / bvr.unit
84
- end
81
+ qty = WarehouseSpace.find_by(item_variant_id: bvr.variant_id)&.quantity
82
+ qty ||= 0
83
+ qty = qty / bvr.unit
85
84
  qty_list.push(qty)
86
85
  end
87
86
  [qty_list.min, 0].sort[1]
88
87
  end
89
88
 
90
- def bundle_condition(bvr)
91
- bvr.variant.present? && bvr.variant.warehouse_spaces.present?
92
- end
93
-
94
89
  def bundle_variants
95
- Bundle.where('variant_id = ?', variant.id).first.bundle_variant
90
+ Bundle.where('variant_id = ?', variant.id).first.bundle_variants
96
91
  end
97
92
 
98
93
  def listing_wh_sp_quantity
@@ -5,6 +5,7 @@ require 'item_builder/modes/price_service'
5
5
  require 'item_builder/modes/quantity_service'
6
6
  require 'item_builder/modes/simple_service'
7
7
  require 'item_builder/modes/active_service'
8
+ require 'item_builder/modes/update_service'
8
9
  module ItemBuilder
9
10
  module Modes
10
11
  attr_reader :listing
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder/modes.rb'
5
+ require 'item_builder/modes/price_service'
6
+ require 'item_builder/modes/price/sale_price_policy'
7
+ module ItemBuilder
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
+ ItemBuilder::Modes::Price::SalePricePolicy.new(listing: listing)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder/modes/price/base'
5
+ module ItemBuilder
6
+ module Modes
7
+ module Price
8
+ class BlibliService < Base
9
+ def perform
10
+ {
11
+ price: listing.price,
12
+ sale_price: sale_price,
13
+ sale_start_at: listing.sale_start_at,
14
+ sale_end_at: listing.sale_end_at
15
+ }
16
+ end
17
+
18
+ private
19
+
20
+ def sale_price
21
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder/modes/price/base'
5
+ module ItemBuilder
6
+ module Modes
7
+ module Price
8
+ class BukalapakService < Base
9
+ def perform
10
+ if listing.sale_price.nil?
11
+ bukalapak_price
12
+ else
13
+ deal
14
+ end
15
+ end
16
+
17
+ def bukalapak_price
18
+ {
19
+ price: listing.price,
20
+ sale_price: listing.sale_price,
21
+ sale_start_at: listing.sale_start_at,
22
+ sale_end_at: listing.sale_end_at
23
+ }
24
+ end
25
+
26
+ def deal
27
+ {
28
+ percentage: deal_percentage,
29
+ sale_start_at: sale_start_at,
30
+ sale_end_at: sale_end_at,
31
+ price: listing.price,
32
+ sale_price: listing.sale_price
33
+ }
34
+ end
35
+
36
+ def deal_percentage
37
+ price = listing.price.to_f
38
+ sale_price = listing.sale_price.to_f
39
+ 100 - (sale_price / price * 100)
40
+ end
41
+
42
+ def sale_start_at
43
+ return DateTime.now if listing.sale_start_at.nil?
44
+ return DateTime.now if listing.sale_start_at < DateTime.now
45
+
46
+ listing.sale_start_at
47
+ end
48
+
49
+ def sale_end_at
50
+ month_later = DateTime.now + 1.month
51
+ return month_later if listing.sale_end_at.nil?
52
+ return month_later if listing.sale_end_at > month_later
53
+ return month_later if listing.sale_end_at < DateTime.now
54
+
55
+ listing.sale_end_at
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder/modes/price/base'
5
+ module ItemBuilder
6
+ module Modes
7
+ module Price
8
+ class JdService < Base
9
+ def perform
10
+ {
11
+ price: listing.price,
12
+ sale_price: jd_price,
13
+ sale_start_at: listing.sale_start_at,
14
+ sale_end_at: listing.sale_end_at
15
+ }
16
+ end
17
+
18
+ def jd_price
19
+ increment_price =
20
+ if (listing.price % 1000).positive?
21
+ 1000
22
+ else
23
+ 0
24
+ end
25
+ (listing.price.to_i / 1000) * 1000 + increment_price
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder/modes.rb'
5
+ require 'item_builder/modes/price_service'
6
+ module ItemBuilder
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,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder/modes/price/base'
5
+ module ItemBuilder
6
+ module Modes
7
+ module Price
8
+ class ShopifyService < Base
9
+ def perform
10
+ {
11
+ price: listing.price,
12
+ sale_price: sale_price,
13
+ sale_start_at: listing.sale_start_at,
14
+ sale_end_at: listing.sale_end_at
15
+ }
16
+ end
17
+
18
+ private
19
+
20
+ def sale_price
21
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'item_builder/modes/price/base'
5
+ module ItemBuilder
6
+ module Modes
7
+ module Price
8
+ class ZaloraService < Base
9
+ def perform
10
+ {
11
+ price: listing.price,
12
+ sale_price: sale_price,
13
+ sale_start_at: listing.sale_start_at,
14
+ sale_end_at: listing.sale_end_at
15
+ }
16
+ end
17
+
18
+ private
19
+
20
+ def sale_price
21
+ sale_price_policy.on_sale? ? listing.sale_price : listing.price
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,22 +1,53 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'item_builder/modes.rb'
4
+ require 'item_builder/modes/price/blibli_service'
5
+ require 'item_builder/modes/price/bukalapak_service'
6
+ require 'item_builder/modes/price/zalora_service'
7
+ require 'item_builder/modes/price/shopify_service'
8
+ require 'item_builder/modes/price/jd_service'
4
9
  module ItemBuilder
5
10
  module Modes
6
11
  class PriceService
7
12
  include Modes
8
13
 
14
+ PRICE_CHANNEL = {}.tap do |hash|
15
+ hash[2] = :Shopify
16
+ hash[9] = :Blibli
17
+ hash[11] = :Bukalapak
18
+ hash[13] = :Zalora
19
+ hash[16] = :Jd
20
+ end.freeze
21
+
9
22
  def perform
10
23
  to_h.merge(base)
11
24
  end
12
25
 
13
26
  def to_h
14
- {
15
- price: listing.price,
16
- sale_price: listing.sale_price,
17
- sale_start_at: listing.sale_start_at,
18
- sale_end_at: listing.sale_end_at
19
- }
27
+ price
28
+ end
29
+
30
+ def price
31
+ if channel_name.empty?
32
+ {
33
+ price: listing.price,
34
+ sale_price: listing.sale_price,
35
+ sale_start_at: listing.sale_start_at,
36
+ sale_end_at: listing.sale_end_at
37
+ }
38
+ else
39
+ price_channel
40
+ end
41
+ end
42
+
43
+ def price_channel
44
+ class_name = "ItemBuilder::Modes::Price::#{channel_name}Service"
45
+ price_channel_service = class_name.constantize
46
+ price_channel_service.new(listing).perform
47
+ end
48
+
49
+ def channel_name
50
+ PRICE_CHANNEL[listing.channel_id].to_s
20
51
  end
21
52
  end
22
53
  end
@@ -23,7 +23,7 @@ module ItemBuilder
23
23
  if item['reservedStockLevel2'] > available_quantity
24
24
  0
25
25
  else
26
- item['availableStockLevel2'] + item['reservedStockLevel2']
26
+ available_quantity
27
27
  end
28
28
  end
29
29
 
@@ -6,7 +6,6 @@ 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/blibli_service'
9
- require 'item_builder/modes/quantity/shopee_service'
10
9
  require 'item_builder/modes/quantity/zalora_service'
11
10
  module ItemBuilder
12
11
  module Modes
@@ -16,7 +15,6 @@ module ItemBuilder
16
15
  QUANTITY_CHANNEL = {}.tap do |hash|
17
16
  hash[3] = :Lazada
18
17
  hash[9] = :Blibli
19
- hash[12] = :Shopee
20
18
  hash[13] = :Zalora
21
19
  end.freeze
22
20
 
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes.rb'
4
+ module ItemBuilder
5
+ module Modes
6
+ module Update
7
+ class Base
8
+ attr_reader :listing
9
+ attr_reader :item_listing
10
+
11
+ def initialize(listing, item_listing)
12
+ raise 'listing is not set' if listing.nil?
13
+
14
+ raise 'item listing is not set' if item_listing.nil?
15
+
16
+ @listing = listing
17
+ @item_listing = item_listing
18
+ end
19
+
20
+ def base
21
+ {
22
+ name: listing.name,
23
+ minimum_order: listing.minimum_order,
24
+ package_weight: listing.package_weight
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes/update/base'
4
+ module ItemBuilder
5
+ module Modes
6
+ module Update
7
+ class BlibliService < Base
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes/update/base'
4
+ module ItemBuilder
5
+ module Modes
6
+ module Update
7
+ class BukalapakService < Base
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes/update/base'
4
+ module ItemBuilder
5
+ module Modes
6
+ module Update
7
+ class JdService < Base
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes/update/base'
4
+ module ItemBuilder
5
+ module Modes
6
+ module Update
7
+ class LazadaService < Base
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes/update/base'
4
+ module ItemBuilder
5
+ module Modes
6
+ module Update
7
+ class ShopifyService < Base
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes/update/base'
4
+ module ItemBuilder
5
+ module Modes
6
+ module Update
7
+ class TokopediaService < Base
8
+ def perform
9
+ tokopedia_attr.merge(base)
10
+ end
11
+
12
+ def tokopedia_attr
13
+ {
14
+ condition: (listing.new_condition ? 'NEW' : 'USED')
15
+ }
16
+ end
17
+
18
+ def possible_variant_options
19
+ item_listing.item_listing_custom_fields
20
+ .where.not(value: '') # prevent unselected/empty options
21
+ .group_by(&:tokopedia_custom_field_id)
22
+ .each_with_index.map {|variant_custom_fields, index1|
23
+ variant_custom_field_sample = variant_custom_fields.first
24
+ selected_tokopedia_custom_field = tokopedia_variant(variant_custom_field_sample)
25
+ {
26
+ v: variant_custom_field_sample.tokopedia.local_id.to_i,
27
+ vu: selected_tokopedia_custom_field['unit_id'],
28
+ pos: index1 + 1,
29
+ opt: variant_custom_fields.pluck(:value).uniq.map {|custom_field_value|
30
+ # handle variant with manual value (without options)
31
+ if variant_custom_field_sample.tokopedia.input_type == 'text'
32
+ {
33
+ value: custom_field_value,
34
+ t_id: custom_field_value.bytes.sum, # set value act as option id
35
+ cstm: ''
36
+ }
37
+ else
38
+ custom_field_option = variant_custom_field_sample.tokopedia.options
39
+ .find_by(name: custom_field_value)
40
+ option_value =
41
+ if selected_tokopedia_custom_field['unit_id'] == 0
42
+ custom_field_option.name
43
+ else
44
+ custom_field_option.name
45
+ .split(" #{selected_tokopedia_custom_field['unit']}")
46
+ .first
47
+ end
48
+ {
49
+ vuv: custom_field_option.local_id, # variant unit value id
50
+ value: option_value, # original option value
51
+ t_id: custom_field_option.id,
52
+ cstm: ''
53
+ }
54
+ end
55
+ }
56
+ }
57
+ }
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes/update/base'
4
+ module ItemBuilder
5
+ module Modes
6
+ module Update
7
+ class ZaloraService < Base
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'item_builder/modes.rb'
4
+ require 'item_builder/modes/update/blibli_service'
5
+ require 'item_builder/modes/update/bukalapak_service'
6
+ require 'item_builder/modes/update/lazada_service'
7
+ require 'item_builder/modes/update/zalora_service'
8
+ require 'item_builder/modes/update/shopify_service'
9
+ require 'item_builder/modes/update/jd_service'
10
+ require 'item_builder/modes/update/tokopedia_service'
11
+ module ItemBuilder
12
+ module Modes
13
+ class UpdateService
14
+ include Modes
15
+
16
+ UPDATE_CHANNEL = {}.tap do |hash|
17
+ hash[2] = :Shopify
18
+ hash[3] = :Lazada
19
+ hash[4] = :Bhinneka
20
+ hash[5] = :Blanja
21
+ hash[9] = :Blibli
22
+ hash[11] = :Bukalapak
23
+ hash[12] = :Shopee
24
+ hash[13] = :Zalora
25
+ hash[15] = :Tokopedia
26
+ hash[16] = :Jd
27
+ end.freeze
28
+
29
+ def perform
30
+ to_h.merge(base)
31
+ end
32
+
33
+ def to_h
34
+ simple.merge(update)
35
+ end
36
+
37
+ def update
38
+ class_name = "ItemBuilder::Modes::Update::#{channel_name}Service"
39
+ update_channel_service = class_name.constantize
40
+ update_channel_service.new(listing, item_listing).perform
41
+ end
42
+
43
+ def channel_name
44
+ UPDATE_CHANNEL[listing.channel_id].to_s
45
+ end
46
+
47
+ def simple
48
+ SimpleService.new(listing: listing).to_h
49
+ end
50
+
51
+ def item_listing
52
+ @item_listing ||= ItemListing.find(listing.channel_association_id)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ItemBuilder
4
- VERSION = '0.1.7'
4
+ VERSION = '0.1.12'
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.7
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - okaaryanata
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-08 00:00:00.000000000 Z
11
+ date: 2020-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -120,19 +120,34 @@ files:
120
120
  - lib/item_builder/modes.rb
121
121
  - lib/item_builder/modes/active_service.rb
122
122
  - lib/item_builder/modes/base_service.rb
123
+ - lib/item_builder/modes/price/base.rb
124
+ - lib/item_builder/modes/price/blibli_service.rb
125
+ - lib/item_builder/modes/price/bukalapak_service.rb
126
+ - lib/item_builder/modes/price/jd_service.rb
127
+ - lib/item_builder/modes/price/sale_price_policy.rb
128
+ - lib/item_builder/modes/price/shopify_service.rb
129
+ - lib/item_builder/modes/price/zalora_service.rb
123
130
  - lib/item_builder/modes/price_service.rb
124
131
  - lib/item_builder/modes/quantity/base.rb
125
132
  - lib/item_builder/modes/quantity/blibli_service.rb
126
133
  - lib/item_builder/modes/quantity/lazada_service.rb
127
- - lib/item_builder/modes/quantity/shopee_service.rb
128
134
  - lib/item_builder/modes/quantity/zalora_service.rb
129
135
  - lib/item_builder/modes/quantity_service.rb
130
136
  - lib/item_builder/modes/simple_service.rb
137
+ - lib/item_builder/modes/update/base.rb
138
+ - lib/item_builder/modes/update/blibli_service.rb
139
+ - lib/item_builder/modes/update/bukalapak_service.rb
140
+ - lib/item_builder/modes/update/jd_service.rb
141
+ - lib/item_builder/modes/update/lazada_service.rb
142
+ - lib/item_builder/modes/update/shopify_service.rb
143
+ - lib/item_builder/modes/update/tokopedia_service.rb
144
+ - lib/item_builder/modes/update/zalora_service.rb
145
+ - lib/item_builder/modes/update_service.rb
131
146
  - lib/item_builder/version.rb
132
- homepage:
147
+ homepage:
133
148
  licenses: []
134
149
  metadata: {}
135
- post_install_message:
150
+ post_install_message:
136
151
  rdoc_options: []
137
152
  require_paths:
138
153
  - lib
@@ -148,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
163
  version: '0'
149
164
  requirements: []
150
165
  rubygems_version: 3.0.6
151
- signing_key:
166
+ signing_key:
152
167
  specification_version: 4
153
168
  summary: Item builder
154
169
  test_files: []
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'item_builder/modes/quantity/base'
4
- module ItemBuilder
5
- module Modes
6
- module Quantity
7
- class ShopeeService < Base
8
- def perform
9
- available_quantity + reserved_stock.to_i
10
- end
11
- end
12
- end
13
- end
14
- end