lib/office_clerk/post.rb in post_clerk-0.4 vs lib/office_clerk/post.rb in post_clerk-0.5
- old
+ new
@@ -1,29 +1,20 @@
module OfficeClerk
class Post < ShippingMethod
DEFAULTS ={ :weight_table => '1 2 5 10 20' ,
:price_table => '2 5 10 15 18' ,
- :max_item_weight => "18" ,
- :max_price => "120" ,
+ :max_item_weight => "20" ,
+ :max_price => "100" ,
:handling_max => "20" ,
- :handling_fee => "2" ,
+ :handling_fee => "0" ,
:default_weight => "1" }
def initialize data
super DEFAULTS.merge(data)
- @prices = @data[:price_table].split.map(&:to_f)
- @weights = @data[:weight_table].split.map(&:to_f)
- @max_item_weight = @data[:max_item_weight].to_f || 18.0
- @max_price = @data[:max_price].to_f || 120.0
- @handling_max = @data[:handling_max].to_f || 20.0
- @handling_fee = @data[:handling_fee].to_f || 2.0
- @default_weight = @data[:default_weight].to_f || 1.0
- raise "Could not parse weights #{@data[:weight_table]} for #{key}" if @weights.empty?
- raise "Could not parse weights #{@data[:weight_table]} for #{key}" if @weights.include?(nil)
- raise "Could not parse prices #{@data[:price_table]} for #{key}" if @prices.empty?
- raise "Could not parse prices #{@data[:price_table]} for #{key}" if @prices.include?(nil)
+ set_members
+ check_values!
end
attr_reader :prices , :weights , :max_item_weight , :max_price , :handling_fee , :handling_max , :default_weight
# Determine if weight or size goes over bounds.
def available?(basket)
@@ -35,12 +26,11 @@
true
end
def price_for(basket)
total_price = basket.total_price
- return 0.0 if total_price > max_price
-
+ return 0.0 if total_price > self.max_price
total_weight = basket.items.map {|item| item.quantity * (item.product.weight || default_weight) }.reduce(:+) || 0.0
shipping = 0
while total_weight > weights.last # In several packets if need be.
total_weight -= weights.last
@@ -61,8 +51,23 @@
index + 1
end
def calc_handling_fee(total_price)
handling_max < total_price ? 0 : handling_fee
+ end
+ private
+ def set_members
+ @prices = @data[:price_table].split.map(&:to_f)
+ @weights = @data[:weight_table].split.map(&:to_f)
+ @max_item_weight = @data[:max_item_weight].to_f || 18.0
+ @max_price = @data[:max_price].to_f || 100.0
+ @handling_max = @data[:handling_max].to_f || 20.0
+ @handling_fee = @data[:handling_fee].to_f || 2.0
+ @default_weight = @data[:default_weight].to_f || 1.0
+ end
+ def check_values!
+ raise "Could not parse weights #{@weights}" if @weights.empty? or @weights.include?(nil)
+ raise "Could not parse prices #{@prices}" if @prices.empty? or @prices.include?(nil)
+ raise "Price length #{@prices.length} and weight length #{@weights.length} differ" if @weights.length != @prices.length
end
end
end