valken-shipping 2.0.8 → 3.0.0.pre

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: b68ecff826d216873de1e906063c2c349d0a9d3c0e23581a90eb05831c67e5a7
4
- data.tar.gz: 4967817ff6b397f68a9ad7237acd167d9c3ffe8e3e0434dd053864ddc5539ec5
3
+ metadata.gz: 146a3ad0dd1b020312bcf880257b2d080cadd3bdfcb6205c1a63a79247ea080f
4
+ data.tar.gz: 02edb837e0c27d4fba3ebce3f2e9545dd896c67f11dd00c865768144147977ea
5
5
  SHA512:
6
- metadata.gz: 123282661e08331848b3442c0ae389c86efd1ae767df922c70a1b7b93b4a90bb40317948b941dc30a588838d20c60baadfd351d98ce564eec95df35f1ef88997
7
- data.tar.gz: 6c4c59add44238adecee109dc536897fab93a1c73dfb670f313a100713f0721b19c71affd633ae853cd6d45f7a0cc95cdb285b7206e1d4310308bd4748922377
6
+ metadata.gz: ff8e88fc94268f6ea84ff2eb1d0d01ca4ea0f39609f92492feec006a9a01ea1e3fe9f2b4aaf50afa59badb0d1c9df3501f98bd468302c6b43be4e5a3065d90a7
7
+ data.tar.gz: 67a511096848ef71c7a422d56342e63908f118b20f71ed5dc0196156c68355e2d8e3e537f36d13368c272920fb50c3f7dcfb8cf6fc82a6fd343fc8c4d678f64a
@@ -37,81 +37,28 @@ module Workarea
37
37
  carrier_data = []
38
38
 
39
39
  packaging = Packaging.new(order, shipping)
40
- return [] if packaging.packages.blank?
40
+ return [] if packaging.packages.blank? || address.blank?
41
41
 
42
- return default_options(packaging.packages) if Workarea.config.gateways.ups_carrier.class == ActiveShipping::Workarea
43
-
44
- shipping_options_api = get_final_shipping_options(collect_carrier_data)
45
- return [] if @error.present?
46
-
47
- carrier_data.push(shipping_options_api) if shipping_options_api.present? && shipping_options_api.any?
48
-
49
- if Workarea.config.gateways.ups_carrier.class != ActiveShipping::Workarea
50
- carrier_data.push(get_ltl_shipping)
51
- carrier_data.push(get_free_shipping) if Workarea.config.show_free_shipping
52
- else
53
- return []
54
- end
55
-
56
- carrier_data.flatten.reverse
57
- end
58
-
59
- def get_final_shipping_options(rates)
60
- options = []
61
-
62
- if is_ground
63
- ground_rate = rates.detect{|rate| rate.service_code == "GROUND_HOME_DELIVERY" || rate.service_code == "03" }
64
- return [] if ground_rate.blank?
65
-
66
- description = "#{ground_rate.delivery_date.strftime('%A, %B %d, %Y')}"
67
- days_to_deliver = (ground_rate.delivery_date - Date.today).to_i
68
-
69
- label = Workarea.config.shipping_rates[(days_to_deliver - 1)]
70
- return options.push(create_shipping_options(ground_rate, label, description))
71
- end
72
-
73
- rates.each_with_index do |rate, index|
74
- description = "#{rate.delivery_date.strftime('%A, %B %d, %Y')}"
75
- label = Workarea.config.shipping_rates[index]
76
- options.push(create_shipping_options(rate, label, description))
42
+ shipping_option = Workarea.config.gateways.shipping
43
+ origin = ActiveShipping::Location.new(Workarea.config.shipping_origin)
44
+ response = shipping_option.find_rates(
45
+ origin,
46
+ address.to_active_shipping,
47
+ packaging.packages,
48
+ {
49
+ ground: is_ground,
50
+ special_region: is_special_region?,
51
+ free_shipping: is_free_ship
52
+ }
53
+ )
54
+ shipping_options = response.rates.sort_by(&:price).map do |rate|
55
+ ShippingOption.from_rate_estimate(rate)
77
56
  end
78
- options
79
- end
80
-
81
- # If the carrier is ups then it will print ups data...or if carrier is fedex then prinnt fedex data...
82
- # else if it is not both then choose cheapest price.
83
- def collect_carrier_data
84
- return get_ups_data
85
- # Temporarily disabling fedex and cheaper
86
- # return get_fedex_data if is_fedex
87
- # return get_none_data unless is_ups && is_fedex
88
- end
89
57
 
90
- # UPS data.
91
- def get_ups_data
92
- @ups_options ||= get_options(Workarea.config.gateways.ups_carrier, Workarea.config.shipping_rates)
58
+ shipping_options.unshift(get_free_shipping) if is_free_ship
59
+ shipping_options
93
60
  end
94
61
 
95
- # FedEx data.
96
- def get_fedex_data
97
- @fedex_response ||= get_options(Workarea.config.gateways.fedex_carrier, Workarea.config.shipping_rates)
98
- end
99
-
100
- # If the product is not ups or fedex then it will choose the cheapest price among ups and fedex annd print the value.
101
- def get_none_data
102
- return [] if get_ups_data.blank? || get_fedex_data.blank?
103
- final_options = []
104
- temp_options = get_fedex_data + get_ups_data
105
- return [] unless temp_options.any?
106
-
107
- delivery_dates = temp_options.map(&:delivery_date).uniq.sort
108
- delivery_dates.each_with_index do |date, index|
109
- selected_rates = temp_options.select {|rate| rate.delivery_date == date}
110
- final_options.push(selected_rates.sort_by(&:price).first)
111
- end
112
- return final_options
113
-
114
- end
115
62
 
116
63
  # Free shipping option.
117
64
  def get_free_shipping
@@ -120,140 +67,42 @@ module Workarea
120
67
  name: "Valken Economy",
121
68
  sub_name: "5 - 9 Business Days",
122
69
  service_code: "Free",
123
- price: Money.new(0.0, "USD"),
70
+ price: Money.new(0.0, Money.default_currency.to_s),
124
71
  tax_code: "TAX01"
125
72
  )
126
73
  end
127
74
 
128
- # Calculating the ltl shipping rates based on the conditions.
129
- def get_ltl_shipping
130
- weight_price = 0
131
- case weight_convertion
132
- when 0..2
133
- weight_price = 5
134
- when 2..15
135
- weight_price = 15
136
- when 15..200
137
- weight_price = (1 * weight_convertion)
138
- when 200..2500
139
- weight_price = 200
140
- else
141
- weight_price = ((weight_convertion / 2500).ceil()) * 200
142
- end
143
-
144
- ShippingOption.new(
145
- carrier: "LTL Shipping",
146
- name: "Valken Standard",
147
- sub_name: "3 - 5 Business Days",
148
- service_code: "LTL01",
149
- price: Money.new(weight_price * 100, "USD"),
150
- tax_code: "TAX01"
151
- )
75
+ def is_ground
76
+ ground_ship_attribute = Workarea.config.shipping_attributes[:ground_shipping_only]
77
+ product_carrier_type = product_details.map{ |item| item[:en][ground_ship_attribute] }.flatten
78
+ product_carrier_type.include?("true")
152
79
  end
153
-
154
- # Returns the total weight.
155
- def weight_convertion
156
- packaging = Packaging.new(order, shipping)
157
- return 0 if packaging.packages.blank?
158
- full_weight = 0
159
- packaging.packages.each do |item_package|
160
- new_weight = item_package.weight.convert_to(:lb)
161
- full_weight += new_weight.value
162
- end
163
- full_weight
80
+
81
+ def is_special_region?
82
+ Workarea.config.special_region.include?(@shipping.address.region)
164
83
  end
165
84
 
166
- # 1. Sending a call to carrier and get shipping rates
167
- # 2. Based on service codes in config, filter the shipping rates
168
- # 3. If error, return empty array
169
- def get_options(carrier, service_code)
170
- packaging = Packaging.new(order, shipping)
171
- return [] if @shipping.address.blank? || packaging.packages.blank?
172
- shipping_option = carrier || Workarea.config.gateways.shipping
173
-
174
- origin = ActiveShipping::Location.new(Workarea.config.shipping_origin)
175
- begin
176
- response = shipping_option.find_rates(
177
- origin,
178
- @shipping.address.to_active_shipping,
179
- packaging.packages
180
- )
181
- if carrier.class == ActiveShipping::Workarea
182
- response.rates.sort_by(&:price).map do |rate|
183
- ShippingOption.from_rate_estimate(rate)
184
- end
185
- else
186
- filter_shipping_rates(response.rates, service_code)
187
- end
188
- rescue ActiveShipping::ResponseError => e
189
- @error = e
190
- return []
191
- end
192
- end
85
+ # if any of the product is NO FREE SHIPPING = TRUE then return false
86
+ # if free shipping config is then return true
87
+ # if user applies free shipping promo code then return true
88
+ def is_free_ship
89
+ free_ship_attribute = Workarea.config.shipping_attributes[:no_free_shipping]
90
+ product_carrier_type = product_details.map{ |item| item[:en][free_ship_attribute] }.flatten
91
+ return false if product_carrier_type.include?("true")
193
92
 
194
- # Sort rates by delevry date and pick 1st three rates
195
- # Find cheapest rate for those three rates
196
- # Push all the cheap option for 1, 2, & 3 days into an array and return
197
- def filter_shipping_rates(rates, service_code)
198
- filtered_rates = []
199
- # find and sort all delivery dates and pick 1st three
200
- all_delivery_dates = rates.map { |rate| rate.delivery_date }
201
- # sorting the uniq delivery dates and reversing those delivery dates.
202
- uniq_delivery_dates = all_delivery_dates.compact.sort.uniq[0..2]
203
-
204
- # removing overnight. Assuming the 3rd option is always overnight
205
- uniq_delivery_dates.pop if uniq_delivery_dates.length == 3
93
+ return true if Workarea.config.show_free_shipping
206
94
 
207
- # For each delivery dates, find cheapest rates and create shipping option and push
208
- uniq_delivery_dates.each_with_index do |date, index|
209
- selected_rates = rates.select {|rate| rate.delivery_date.present? && rate.delivery_date == date}
210
- cheap_rate = selected_rates.sort_by(&:price).first
211
- description = "#{cheap_rate.delivery_date.strftime('%A, %B %d, %Y')}"
95
+ test_order = order.clone
96
+ test_shipping = shipping.clone
97
+ test_shipping.apply_shipping_service(get_free_shipping.to_h)
212
98
 
213
- filtered_rates.push(cheap_rate)
214
- end
215
- filtered_rates
216
- end
217
-
218
- # creating a ShippingOption
219
- def create_shipping_options(rate, rate_label = nil, description = nil)
220
- ShippingOption.new(
221
- carrier: rate.carrier,
222
- name: rate_label.keys.join || rate.service_name,
223
- sub_name: rate_label.values.join,
224
- service_code: rate.service_code,
225
- description: description,
226
- delivery_date: rate.delivery_date,
227
- price: Money.new(rate.price, rate.currency),
228
- tax_code: Shipping::Service.find_tax_code(
229
- rate.carrier,
230
- rate.service_name
231
- )
232
- )
233
- end
234
-
235
- # Selecting the shipping carrier based on order items
236
- #
237
- # If the product is type hazmat then it returns ups...or if product is type gun then it returns fedex
238
- # else if product is not both type then it returns none
239
- def is_fedex
240
- carrier_type_attribute = Workarea.config.shipping_attributes[:carrier_type]
241
- product_carrier_type = product_details.map{ |item| item[:en][carrier_type_attribute] }.flatten
242
- product_carrier_type.include?("FEDEX")
243
- end
244
-
245
- def is_ups
246
- carrier_type_attribute = Workarea.config.shipping_attributes[:carrier_type]
247
- product_carrier_type = product_details.map{ |item| item[:en][carrier_type_attribute] }.flatten
248
- product_carrier_type.include?("UPS")
99
+ price_adjustments = Pricing.find_shipping_discounts(
100
+ test_order,
101
+ test_shipping
102
+ )
103
+ return price_adjustments.present? && price_adjustments.any?
249
104
  end
250
105
 
251
- def is_ground
252
- ground_ship_attribute = Workarea.config.shipping_attributes[:ground_shipping_only]
253
- product_carrier_type = product_details.map{ |item| item[:en][ground_ship_attribute] }.flatten
254
- product_carrier_type.include?("true")
255
- end
256
-
257
106
  def product_details
258
107
  # product_attributes = @order.items.map(&:product_attributes)
259
108
 
@@ -0,0 +1,12 @@
1
+ module Workarea
2
+ decorate Shipping::Rate, with: :valken_shipping do
3
+ decorated do
4
+ field :tier_weight_min, type: Float
5
+ field :tier_weight_max, type: Float
6
+ end
7
+
8
+ def weight_tiered?
9
+ !tier_weight_min.nil? || !tier_weight_max.nil?
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ module Workarea
2
+ decorate Shipping::RateLookup, with: :valken_shipping do
3
+
4
+ def total_weight
5
+ full_weight = 0
6
+ packages.each do |item_package|
7
+ new_weight = item_package.weight.convert_to(:lb)
8
+ full_weight += new_weight.value
9
+ end
10
+ full_weight
11
+ end
12
+
13
+ def response
14
+ ActiveShipping::RateResponse.new(
15
+ true, # success
16
+ 'success', # message
17
+ {}, # params
18
+ rates: valid_services.map do |service|
19
+ total = service.find_rate(subtotal, total_weight).try(:price)
20
+ next unless total.present?
21
+
22
+ ActiveShipping::RateEstimate.new(
23
+ origin,
24
+ destination,
25
+ service.carrier,
26
+ service.name,
27
+ description: service.description,
28
+ service_code: service.service_code,
29
+ total_price: total.cents,
30
+ currency: total.currency.to_s
31
+ )
32
+ end.compact
33
+ )
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,50 @@
1
+ module Workarea
2
+ decorate Shipping::Service, with: :valken_shipping do
3
+ decorated do
4
+ field :description, type: String
5
+ end
6
+
7
+ def find_rate(price = 0.to_m, weight = 0)
8
+ if tiered? && weight_tiered?
9
+ rates.detect do |rate|
10
+ (rate.tier_min.nil? || rate.tier_min <= price) &&
11
+ (rate.tier_max.nil? || rate.tier_max >= price) &&
12
+ (rate.tier_weight_min.nil? || rate.tier_weight_min <= weight) &&
13
+ (rate.tier_weight_max.nil? || rate.tier_weight_max >= weight)
14
+ end
15
+ elsif weight_tiered?
16
+ rates.detect do |rate|
17
+ (rate.tier_weight_min.nil? || rate.tier_weight_min <= weight) &&
18
+ (rate.tier_weight_max.nil? || rate.tier_weight_max >= weight)
19
+ end
20
+ elsif tiered?
21
+ rates.detect do |rate|
22
+ (rate.tier_min.nil? || rate.tier_min <= price) &&
23
+ (rate.tier_max.nil? || rate.tier_max >= price)
24
+ end
25
+ else
26
+ rates.first
27
+ end
28
+ end
29
+
30
+ def tiered?
31
+ rates.any?(&:tiered?)
32
+ end
33
+
34
+ def weight_tiered?
35
+ rates.any?(&:weight_tiered?)
36
+ end
37
+
38
+ private
39
+ def rate_tiering
40
+ non_tiered_rates = rates.reject(&:tiered?).reject(&:weight_tiered?)
41
+
42
+ if non_tiered_rates.length > 1
43
+ errors.add(
44
+ :rates,
45
+ I18n.t('workarea.errors.messages.exceeds_non_tiered_rate_limit')
46
+ )
47
+ end
48
+ end
49
+ end
50
+ end
@@ -5,6 +5,21 @@ module Workarea
5
5
  end
6
6
 
7
7
  class_methods do
8
+ def from_rate_estimate(rate)
9
+ new(
10
+ carrier: rate.carrier,
11
+ name: rate.service_name,
12
+ service_code: rate.service_code,
13
+ price: Money.new(rate.price, rate.currency),
14
+ tax_code: Shipping::Service.find_tax_code(
15
+ rate.carrier,
16
+ rate.service_name
17
+ ),
18
+ sub_name: rate.description,
19
+ description: rate.delivery_date&.strftime('%A, %B %d, %Y'),
20
+ delivery_date: rate.delivery_date
21
+ )
22
+ end
8
23
  end
9
24
  end
10
25
  end
@@ -3,6 +3,20 @@ module Workarea
3
3
  decorated do
4
4
  end
5
5
 
6
+ def packages
7
+ Array(1..no_of_packs).map do |i|
8
+ ActiveShipping::Package.new(
9
+ Measured::Weight.new(total_weight_lb/no_of_packs, :lb),
10
+ total_dimensions,
11
+ Workarea.config.shipping_options.merge(value: total_value)
12
+ )
13
+ end
14
+ end
15
+
16
+ def no_of_packs
17
+ (total_weight_lb / Workarea.config.max_weight_per_pack).ceil
18
+ end
19
+
6
20
  def find_shipping_sku(sku)
7
21
  shipping_skus.detect { |s| s.id == sku } || Shipping::Sku.new(id: sku, weight: find_sku_weight(sku))
8
22
  end
@@ -10,16 +24,20 @@ module Workarea
10
24
  def find_sku_weight(sku)
11
25
  product_by_sku = Catalog::Product.find_by_sku(sku).variants
12
26
  sku_data = product_by_sku.detect {|variant| variant.sku == sku }
13
- sku_weight = is_pounds(sku_data) ? convert_to_lb(sku_data.weight || 0) : (sku_data.weight || 0)
27
+ sku_weight = is_pounds(sku_data) ? convert_to_oz(sku_data.weight || 0) : (sku_data.weight || 0)
14
28
  sku_weight
15
29
  end
16
30
 
17
- def convert_to_lb(weight)
31
+ def convert_to_oz(weight)
18
32
  unit = Measured::Weight.new(weight, :lb)
19
33
  ounce_unit = unit.convert_to(:oz)
20
34
  ounce_unit.value
21
35
  end
22
36
 
37
+ def total_weight_lb
38
+ @total_weight_lb ||= Measured::Weight.new(total_weight, :oz).convert_to(:lb).value
39
+ end
40
+
23
41
  def is_pounds(sku_data)
24
42
  sku_data.weight_unit == "lb"
25
43
  end
@@ -0,0 +1,6 @@
1
+ .property
2
+ = label_tag 'service_description', "Carrier Name", class: 'property__name'
3
+ = text_field_tag "service[carrier]", @service.carrier, class: 'text-box'
4
+ .property
5
+ = label_tag 'service_description', "Description", class: 'property__name'
6
+ = text_field_tag "service[description]", @service.description, class: 'text-box'
@@ -0,0 +1,79 @@
1
+ - @page_title = t('workarea.admin.shipping_services.edit.title', service: @service.name)
2
+
3
+ .view
4
+ .view__header
5
+ .grid.grid--middle.grid--center
6
+ .grid__cell.grid__cell--50
7
+ .view__heading
8
+ = link_to_index_for(@service)
9
+ %h1= @service.name
10
+
11
+ .view__container
12
+ - if @service.errors.present?
13
+ - @service.errors.full_messages.each do |message|
14
+ = render_message 'error', message
15
+
16
+ = form_tag shipping_service_path(@service), method: :patch, id: 'shipping_service_form', data: { unsaved_changes: '' } do
17
+
18
+ .section
19
+
20
+ .property.property--required
21
+ = label_tag 'service_name', t('workarea.admin.fields.name'), class: 'property__name'
22
+ = text_field_tag 'service[name]', @service.name, class: 'text-box text-box--i18n', required: true
23
+
24
+ .property
25
+ = label_tag 'service_tax_code', t('workarea.admin.fields.tax_code'), class: 'property__name'
26
+ = text_field_tag 'service[tax_code]', @service.tax_code, class: 'text-box'
27
+
28
+ .property
29
+ = label_tag 'service_service_code', t('workarea.admin.fields.service_code'), class: 'property__name'
30
+ = text_field_tag 'service[service_code]', @service.service_code, class: 'text-box'
31
+
32
+ .property
33
+ = label_tag 'service_country', t('workarea.admin.fields.country'), class: 'property__name'
34
+ = select_tag "service[country]", options_for_select(country_options, @service.country.try(:alpha2)), prompt: t('workarea.admin.shipping_services.options.not_specified')
35
+
36
+ .property
37
+ = label_tag 'service_regions', t('workarea.admin.fields.regions'), class: 'property__name'
38
+ = text_field_tag "service[regions_list]", @service.regions_list, class: 'text-box'
39
+ %span.property__note= t('workarea.admin.shipping_services.regions_note')
40
+
41
+ = append_partials('admin.shipping_service_fields', service: @service)
42
+
43
+ .section
44
+
45
+ %h2= t('workarea.admin.shipping_services.shipping_rates.title')
46
+
47
+ %table
48
+ %thead
49
+ %tr
50
+ %th= t('workarea.admin.shipping_services.shipping_rates.price')
51
+ %th= "Min Weight (lb)"
52
+ %th= "Max Weight (lb)"
53
+ %th= t('workarea.admin.shipping_services.shipping_rates.min_value')
54
+ %th= t('workarea.admin.shipping_services.shipping_rates.max_value')
55
+ %th= t('workarea.admin.actions.remove')
56
+ %tbody
57
+ - @service.rates.each do |rate|
58
+ %tr
59
+ %td=text_field_tag "rates[#{rate.id}][price]", rate.price, class: 'text-box'
60
+ %td= text_field_tag "rates[#{rate.id}][tier_weight_min]", rate.tier_weight_min, class: 'text-box'
61
+ %td= text_field_tag "rates[#{rate.id}][tier_weight_max]", rate.tier_weight_max, class: 'text-box'
62
+ %td= text_field_tag "rates[#{rate.id}][tier_min]", rate.tier_min, class: 'text-box'
63
+ %td= text_field_tag "rates[#{rate.id}][tier_max]", rate.tier_max, class: 'text-box'
64
+ %td= check_box_tag 'rates_to_remove[]', rate.id
65
+ %tr{ data: { cloneable_row: '' } }
66
+ %td= text_field_tag 'new_rates[][price]', '', placeholder: 'New Price Tier', class: 'text-box'
67
+ %td= text_field_tag 'new_rates[][tier_weight_min]', '', placeholder: 'Min Weight Value', class: 'text-box'
68
+ %td= text_field_tag 'new_rates[][tier_weight_max]', '', placeholder: 'Max Weight Value', class: 'text-box'
69
+ %td= text_field_tag 'new_rates[][tier_min]', '', placeholder: 'Min Value', class: 'text-box'
70
+ %td= text_field_tag 'new_rates[][tier_min]', '', placeholder: 'Min Value', class: 'text-box'
71
+ %td
72
+
73
+ .workflow-bar
74
+ .grid
75
+ .grid__cell.grid__cell--50
76
+ = link_to t('workarea.admin.actions.delete'), shipping_service_path(@service), class: 'workflow-bar__button workflow-bar__button--delete', data: { method: 'delete', confirm: t('workarea.admin.actions.delete_confirmation') }
77
+ .grid__cell.grid__cell--50
78
+ .align-right
79
+ = button_tag t('workarea.admin.shipping_services.edit.button'), value: 'save_shipping_service', class: 'workflow-bar__button workflow-bar__button--update'
@@ -0,0 +1,65 @@
1
+ - @page_title = t('workarea.admin.shipping_services.new.title')
2
+
3
+ .view
4
+ .view__header
5
+ .grid.grid--middle.grid--center
6
+ .grid__cell.grid__cell--50
7
+ .view__heading
8
+ = link_to_index_for(@service)
9
+ %h1= t('workarea.admin.shipping_services.new.title')
10
+
11
+ .view__container
12
+ - if @service.errors.present?
13
+ - @service.errors.full_messages.each do |message|
14
+ = render_message 'error', message
15
+
16
+ = form_tag shipping_services_path(@service), method: :post, id: 'shipping_service_form', data: { unsaved_changes: '' } do
17
+
18
+ .section
19
+
20
+ .property.property--required
21
+ = label_tag 'service_name', t('workarea.admin.fields.name'), class: 'property__name'
22
+ = text_field_tag 'service[name]', @service.name, class: 'text-box text-box--i18n', required: true
23
+
24
+ .property
25
+ = label_tag 'service_tax_code', t('workarea.admin.fields.tax_code'), class: 'property__name'
26
+ = text_field_tag 'service[tax_code]', @service.tax_code, class: 'text-box'
27
+
28
+ .property
29
+ = label_tag 'service_service_code', t('workarea.admin.fields.service_code'), class: 'property__name'
30
+ = text_field_tag 'service[service_code]', @service.service_code, class: 'text-box'
31
+
32
+ .property
33
+ = label_tag 'service_country', t('workarea.admin.fields.country'), class: 'property__name'
34
+ = select_tag "service[country]", options_for_select(country_options, @service.country.try(:alpha2)), prompt: t('workarea.admin.shipping_services.options.not_specified')
35
+
36
+ .property
37
+ = label_tag 'service_regions', t('workarea.admin.fields.regions'), class: 'property__name'
38
+ = text_field_tag "service[regions_list]", @service.regions_list, class: 'text-box'
39
+ %span.property__note= t('workarea.admin.shipping_services.regions_note')
40
+
41
+ = append_partials('admin.shipping_service_fields', service: @service)
42
+
43
+ .section
44
+
45
+ %h2= t('workarea.admin.shipping_services.shipping_rates.title')
46
+
47
+ %table
48
+ %thead
49
+ %tr
50
+ %th= t('workarea.admin.shipping_services.shipping_rates.price')
51
+ %th= "Min Weight (lb)"
52
+ %th= "Max Weight (lb)"
53
+ %th= t('workarea.admin.shipping_services.shipping_rates.min_value')
54
+ %th= t('workarea.admin.shipping_services.shipping_rates.max_value')
55
+ %tbody
56
+ %tr{ data: { cloneable_row: '' } }
57
+ %td= text_field_tag 'new_rates[][price]', '', placeholder: 'New Price Tier', class: 'text-box', title: 'New Price Tier'
58
+ %td= text_field_tag 'new_rates[][tier_weight_min]', '', placeholder: 'Min Weight Value', class: 'text-box'
59
+ %td= text_field_tag 'new_rates[][tier_weight_max]', '', placeholder: 'Max Weight Value', class: 'text-box'
60
+ %td= text_field_tag 'new_rates[][tier_min]', '', placeholder: 'Min Value', class: 'text-box', title: 'Min Value'
61
+ %td= text_field_tag 'new_rates[][tier_max]', '', placeholder: 'Max Value', class: 'text-box', title: 'Max Value'
62
+
63
+ .workflow-bar
64
+ .grid.grid--auto.grid--right.grid--middle
65
+ .grid__cell= button_tag t('workarea.admin.shipping_services.new.create_shipping_service'), value: 'create_shipping_service', class: 'workflow-bar__button workflow-bar__button--create'
@@ -0,0 +1,4 @@
1
+ Workarea.append_partials(
2
+ 'admin.shipping_service_fields',
3
+ 'workarea/admin/shipping_services/addtional_service_fields'
4
+ )
@@ -5,7 +5,8 @@ Workarea::Configuration.define_fields do
5
5
  default: {
6
6
  'usa_only' => 'usa only',
7
7
  'carrier_type' => 'Type',
8
- 'ground_shipping_only' => 'ground shipping only'
8
+ 'ground_shipping_only' => 'ground shipping only',
9
+ 'no_free_shipping' => 'no free shipping'
9
10
  },
10
11
  description: 'Mapping of product details keys with shipping logic. Note: This maps only the keys not the values.'
11
12
 
@@ -1,17 +1,10 @@
1
1
  Workarea.configure do |config|
2
2
 
3
- config.countries = [Country['US']]
3
+ config.countries = [Country['US'], Country['CA']]
4
4
 
5
5
  ActiveShipping::Carriers.register :UPS, 'active_shipping/carriers/ups'
6
+ ActiveShipping::Carriers.register :VALKEN, 'active_shipping/carriers/valken'
6
7
 
7
- config.weight_table = {"2": 5, "15": 15, "200": 1, "2500": 200}
8
-
9
- config.shipping_rates = [
10
- {"Valken Overnight" => "Overnight"},
11
- {"Valken Express 2-Day" => "2 Business Days"},
12
- {"Valken Express 3-Day" => "3 Business Days"}
13
- ]
14
- config.ups_options = {"12"=> "Valken Express 3-Day", "01"=> "Valken Overnight", "02"=> "Valken Express 2-Day"}
15
- config.fedex_options = {"STANDARD_OVERNIGHT"=> "Valken Overnight", "FEDEX_2_DAY"=> "Valken Express 2-Day", "GROUND_HOME_DELIVERY"=> "Valken Express 3-Day"}
8
+ config.max_weight_per_pack = 150
16
9
  end
17
10
  Valken::Shipping.auto_initialize_gateway
@@ -0,0 +1,90 @@
1
+ require 'active_shipping'
2
+
3
+ module ActiveShipping
4
+ class VALKEN < UPS
5
+
6
+ def find_rates(origin, destination, packages, options = {})
7
+ return get_workarea_rates(origin, destination, packages, options) if options[:ground]
8
+ super
9
+ end
10
+
11
+ def parse_rate_response(origin, destination, packages, response, options = {})
12
+ xml = build_document(response, 'RatingServiceSelectionResponse')
13
+ success = response_success?(xml)
14
+ message = response_message(xml)
15
+ filtered_rates = []
16
+ if success
17
+ rate_estimates = xml.root.css('> RatedShipment').map do |rated_shipment|
18
+ service_code = rated_shipment.at('Service/Code').text
19
+ days_to_delivery = rated_shipment.at('GuaranteedDaysToDelivery').text.to_i
20
+ days_to_delivery = nil if days_to_delivery == 0
21
+ warning_messages = rate_warning_messages(rated_shipment)
22
+ RateEstimate.new(origin, destination, @@name, service_name_for(origin, service_code),
23
+ total_price: rated_shipment.at('TotalCharges/MonetaryValue').text.to_f,
24
+ insurance_price: rated_shipment.at('ServiceOptionsCharges/MonetaryValue').text.to_f,
25
+ currency: rated_shipment.at('TotalCharges/CurrencyCode').text,
26
+ service_code: service_code,
27
+ packages: packages,
28
+ delivery_range: [timestamp_from_business_day(days_to_delivery)],
29
+ negotiated_rate: rated_shipment.at('NegotiatedRates/NetSummaryCharges/GrandTotal/MonetaryValue').try(:text).to_f,
30
+ messages: warning_messages
31
+ )
32
+ end
33
+ filtered_rates = filter_rates(rate_estimates)
34
+ end
35
+
36
+ workarea_rates = get_workarea_services(origin, destination, packages, options).rates
37
+ if message == "Failure: Maximum number of packages exceeded (200)"
38
+ RateResponse.new(true, "Only workarea shipping service", {}, rates: workarea_rates, xml: "", request: "")
39
+ else
40
+ RateResponse.new(success, message, Hash.from_xml(response).values.first, rates:(filtered_rates + workarea_rates).flatten, xml: response, request: last_request)
41
+ end
42
+ end
43
+
44
+ def get_workarea_services(*args)
45
+ ::Workarea::Shipping::RateLookup.new(*args).response
46
+ end
47
+
48
+ def filter_rates(rates)
49
+ filtered_rates = []
50
+ # find and sort all delivery dates and pick 1st three
51
+ all_delivery_dates = rates.map { |rate| rate.delivery_date }
52
+ # sorting the uniq delivery dates and reversing those delivery dates.
53
+ uniq_delivery_dates = all_delivery_dates.compact.sort.uniq[0..2]
54
+
55
+ # For each delivery dates, find cheapest rates and create shipping option and push
56
+ uniq_delivery_dates.each_with_index do |date, index|
57
+ selected_rates = rates.select {|rate| rate.delivery_date.present? && rate.delivery_date == date}
58
+ cheap_rate = selected_rates.sort_by(&:price).first
59
+ filtered_rates.push(cheap_rate)
60
+ end
61
+
62
+ if filtered_rates[-1].present?
63
+ filtered_rates[-1].service_name = "Valken Express 3-Day"
64
+ filtered_rates[-1].description = "3 Business Days"
65
+ end
66
+
67
+ if filtered_rates[-2].present?
68
+ filtered_rates[-2].service_name = "Valken Express 2-Day"
69
+ filtered_rates[-2].description = "2 Business Days"
70
+ end
71
+
72
+ if filtered_rates[-3].present?
73
+ filtered_rates[-3].service_name = "Valken Overnight"
74
+ filtered_rates[-3].description = "Overnight"
75
+ end
76
+
77
+ return filtered_rates
78
+ end
79
+
80
+ def weight_convertion(packages)
81
+ full_weight = 0
82
+ packages.each do |item_package|
83
+ new_weight = item_package.weight.convert_to(:lb)
84
+ full_weight += new_weight.value
85
+ end
86
+ full_weight
87
+ end
88
+
89
+ end
90
+ end
@@ -24,18 +24,15 @@ module Valken
24
24
  Workarea.config.gateways.fedex_carrier = gateway
25
25
  end
26
26
 
27
- def self.auto_initialize_gateway
28
- if ups_credentials.present? && fedex_credentials.present?
27
+ def self.auto_initialize_gateway
28
+ if ups_credentials.present? && !Workarea.config.default_shipping
29
29
  if Rails.env.test?
30
- self.ups_gateway = ActiveShipping::Workarea.new
31
- self.fedex_gateway = ActiveShipping::Workarea.new
30
+ Workarea.config.gateways.shipping = ActiveShipping::Workarea.new
32
31
  else
33
- self.ups_gateway = ActiveShipping::UPS.new ups_credentials
34
- self.fedex_gateway = ActiveShipping::FedEx.new fedex_credentials
32
+ Workarea.config.gateways.shipping = ActiveShipping::VALKEN.new ups_credentials
35
33
  end
36
34
  else
37
- self.ups_gateway = ActiveShipping::Workarea.new
38
- self.fedex_gateway = ActiveShipping::Workarea.new
35
+ Workarea.config.gateways.shipping = ActiveShipping::Workarea.new
39
36
  end
40
37
  end
41
38
  end
@@ -1,5 +1,5 @@
1
1
  module Valken
2
2
  module Shipping
3
- VERSION = '2.0.8'
3
+ VERSION = '3.0.0.pre'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: valken-shipping
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.8
4
+ version: 3.0.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - sushmitha02
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-22 00:00:00.000000000 Z
11
+ date: 2020-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -44,11 +44,19 @@ files:
44
44
  - app/helpers/workarea/addresses_helper.rb
45
45
  - app/models/workarea/checkout/shipping_options.decorator
46
46
  - app/models/workarea/shipping.decorator
47
+ - app/models/workarea/shipping/rate.decorator
48
+ - app/models/workarea/shipping/rate_lookup.decorator
49
+ - app/models/workarea/shipping/service.decorator
47
50
  - app/models/workarea/shipping_option.decorator
48
51
  - app/services/workarea/packaging.decorator
52
+ - app/views/workarea/admin/shipping_services/_addtional_service_fields.html.haml
53
+ - app/views/workarea/admin/shipping_services/edit.html.haml
54
+ - app/views/workarea/admin/shipping_services/new.html.haml
55
+ - config/initializers/appends.rb
49
56
  - config/initializers/shipping_configuration.rb
50
57
  - config/initializers/workarea.rb
51
58
  - config/routes.rb
59
+ - lib/active_shipping/carriers/valken.rb
52
60
  - lib/tasks/valken/shipping_tasks.rake
53
61
  - lib/valken/shipping.rb
54
62
  - lib/valken/shipping/engine.rb
@@ -57,7 +65,7 @@ homepage: https://github.com/sushmitha02
57
65
  licenses:
58
66
  - MIT
59
67
  metadata: {}
60
- post_install_message:
68
+ post_install_message:
61
69
  rdoc_options: []
62
70
  require_paths:
63
71
  - lib
@@ -68,12 +76,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
68
76
  version: '0'
69
77
  required_rubygems_version: !ruby/object:Gem::Requirement
70
78
  requirements:
71
- - - ">="
79
+ - - ">"
72
80
  - !ruby/object:Gem::Version
73
- version: '0'
81
+ version: 1.3.1
74
82
  requirements: []
75
- rubygems_version: 3.0.6
76
- signing_key:
83
+ rubygems_version: 3.0.3
84
+ signing_key:
77
85
  specification_version: 4
78
86
  summary: shipping options
79
87
  test_files: []