piggybak 0.6.10 → 0.6.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.
- data/Gemfile.lock +1 -1
- data/app/assets/javascripts/piggybak/piggybak.js +6 -5
- data/app/helpers/piggybak_helper.rb +1 -1
- data/app/models/piggybak/cart.rb +12 -11
- data/app/models/piggybak/order.rb +15 -16
- data/app/models/piggybak/tax_calculator/percent.rb +1 -9
- data/app/views/piggybak/cart/_items.html.erb +2 -2
- data/app/views/piggybak/cart/show.html.erb +1 -1
- data/lib/piggybak.rb +12 -10
- data/lib/piggybak/version.rb +1 -1
- metadata +4 -4
data/Gemfile.lock
CHANGED
@@ -6,7 +6,6 @@ var shipping_field;
|
|
6
6
|
$(function() {
|
7
7
|
piggybak.prevent_double_click();
|
8
8
|
shipping_field = $('#piggybak_order_line_items_attributes_0_shipment_attributes_shipping_method_id');
|
9
|
-
shipping_els = $('#piggybak_order_shipping_address_attributes_state_id,#piggybak_order_shipping_address_attributes_country_id,#piggybak_order_shipping_address_attributes_zip');
|
10
9
|
piggybak.initialize_listeners();
|
11
10
|
piggybak.update_shipping_options($('#piggybak_order_shipping_address_attributes_state_id'), function() {
|
12
11
|
$('#piggybak_order_shipments_attributes_0_shipping_method_id').val(previous_shipping);
|
@@ -15,6 +14,7 @@ $(function() {
|
|
15
14
|
});
|
16
15
|
|
17
16
|
var piggybak = {
|
17
|
+
shipping_els: $('#piggybak_order_shipping_address_attributes_state_id,#piggybak_order_shipping_address_attributes_country_id,#piggybak_order_shipping_address_attributes_zip'),
|
18
18
|
prevent_double_click: function() {
|
19
19
|
$('#new_piggybak_order').find('input:submit').removeAttr('disabled');
|
20
20
|
$('#new_piggybak_order').submit(function() {
|
@@ -22,7 +22,7 @@ var piggybak = {
|
|
22
22
|
});
|
23
23
|
},
|
24
24
|
initialize_listeners: function() {
|
25
|
-
shipping_els.live('change', function() {
|
25
|
+
piggybak.shipping_els.live('change', function() {
|
26
26
|
piggybak.update_shipping_options($(this));
|
27
27
|
});
|
28
28
|
$('#piggybak_order_billing_address_attributes_state_id').live('change', function() {
|
@@ -123,11 +123,12 @@ var piggybak = {
|
|
123
123
|
shipping_total = $('#shipping select option:selected').data('rate');
|
124
124
|
}
|
125
125
|
$('#shipping_total').html('$' + shipping_total.toFixed(2));
|
126
|
-
var order_total = subtotal + tax_total + shipping_total;
|
126
|
+
var order_total = parseFloat((subtotal + tax_total + shipping_total).toFixed(2));
|
127
127
|
$.each($('.extra_totals'), function(i, el) {
|
128
128
|
order_total += parseFloat($(el).html().replace(/\$/, ''));
|
129
|
-
});
|
130
|
-
$('#order_total').html('$' + order_total.toFixed(2));
|
129
|
+
});
|
130
|
+
$('#order_total').html('$' + order_total.toFixed(2));
|
131
|
+
return order_total;
|
131
132
|
},
|
132
133
|
retrieve_shipping_data: function() {
|
133
134
|
var shipping_data = {};
|
@@ -4,7 +4,7 @@ module PiggybakHelper
|
|
4
4
|
end
|
5
5
|
def cart_link
|
6
6
|
cart = Piggybak::Cart.new(request.cookies["cart"])
|
7
|
-
nitems = cart.
|
7
|
+
nitems = cart.sellables.inject(0) { |nitems, item| nitems + item[:quantity] }
|
8
8
|
if nitems > 0 && !["piggybak/orders", "piggybak/cart"].include?(params[:controller])
|
9
9
|
link_to "#{pluralize(nitems, 'item')}: #{number_to_currency(cart.total)}", piggybak.cart_url
|
10
10
|
end
|
data/app/models/piggybak/cart.rb
CHANGED
@@ -1,22 +1,23 @@
|
|
1
1
|
module Piggybak
|
2
2
|
class Cart
|
3
|
-
attr_accessor :
|
3
|
+
attr_accessor :sellables
|
4
4
|
attr_accessor :total
|
5
5
|
attr_accessor :errors
|
6
6
|
attr_accessor :extra_data
|
7
7
|
alias :subtotal :total
|
8
|
+
alias :items :sellables
|
8
9
|
|
9
10
|
def initialize(cookie='')
|
10
|
-
self.
|
11
|
+
self.sellables = []
|
11
12
|
self.errors = []
|
12
13
|
cookie ||= ''
|
13
14
|
cookie.split(';').each do |item|
|
14
15
|
item_sellable = Piggybak::Sellable.find_by_id(item.split(':')[0])
|
15
16
|
if item_sellable.present?
|
16
|
-
self.
|
17
|
+
self.sellables << { :sellable => item_sellable, :quantity => (item.split(':')[1]).to_i }
|
17
18
|
end
|
18
19
|
end
|
19
|
-
self.total = self.
|
20
|
+
self.total = self.sellables.sum { |item| item[:quantity]*item[:sellable].price }
|
20
21
|
|
21
22
|
self.extra_data = {}
|
22
23
|
end
|
@@ -58,7 +59,7 @@ module Piggybak
|
|
58
59
|
|
59
60
|
def to_cookie
|
60
61
|
cookie = ''
|
61
|
-
self.
|
62
|
+
self.sellables.each do |item|
|
62
63
|
cookie += "#{item[:sellable].id.to_s}:#{item[:quantity].to_s};" if item[:quantity].to_i > 0
|
63
64
|
end
|
64
65
|
cookie
|
@@ -66,22 +67,22 @@ module Piggybak
|
|
66
67
|
|
67
68
|
def update_quantities
|
68
69
|
self.errors = []
|
69
|
-
|
70
|
-
self.
|
70
|
+
new_sellables = []
|
71
|
+
self.sellables.each do |item|
|
71
72
|
if !item[:sellable].active
|
72
73
|
self.errors << ["Sorry, #{item[:sellable].description} is no longer for sale"]
|
73
74
|
elsif item[:sellable].unlimited_inventory || item[:sellable].quantity >= item[:quantity]
|
74
|
-
|
75
|
+
new_sellables << item
|
75
76
|
elsif item[:sellable].quantity == 0
|
76
77
|
self.errors << ["Sorry, #{item[:sellable].description} is no longer available"]
|
77
78
|
else
|
78
79
|
self.errors << ["Sorry, only #{item[:sellable].quantity} available for #{item[:sellable].description}"]
|
79
80
|
item[:quantity] = item[:sellable].quantity
|
80
|
-
|
81
|
+
new_sellables << item if item[:quantity] > 0
|
81
82
|
end
|
82
83
|
end
|
83
|
-
self.
|
84
|
-
self.total = self.
|
84
|
+
self.sellables = new_sellables
|
85
|
+
self.total = self.sellables.sum { |item| item[:quantity]*item[:sellable].price }
|
85
86
|
end
|
86
87
|
|
87
88
|
def set_extra_data(form_params)
|
@@ -46,10 +46,10 @@ module Piggybak
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def number_payments
|
49
|
-
|
50
|
-
if
|
49
|
+
new_payments = self.line_items.payments.select { |li| li.new_record? }
|
50
|
+
if new_payments.size > 1
|
51
51
|
self.errors.add(:base, "Only one payment may be created at a time.")
|
52
|
-
|
52
|
+
new_payments.each do |li|
|
53
53
|
li.errors.add(:line_item_type, "Only one payment may be created at a time.")
|
54
54
|
end
|
55
55
|
end
|
@@ -75,15 +75,15 @@ module Piggybak
|
|
75
75
|
# If a tax line item doesn't, create
|
76
76
|
# If tax is 0, destroy tax line item
|
77
77
|
tax = TaxMethod.calculate_tax(self)
|
78
|
-
tax_line_item = self.line_items.
|
78
|
+
tax_line_item = self.line_items.taxes
|
79
79
|
if tax > 0
|
80
|
-
if tax_line_item
|
81
|
-
tax_line_item.price = tax
|
80
|
+
if tax_line_item.any?
|
81
|
+
tax_line_item.first.price = tax
|
82
82
|
else
|
83
83
|
self.line_items << LineItem.new({ :line_item_type => "tax", :description => "Tax Charge", :price => tax })
|
84
84
|
end
|
85
|
-
elsif tax_line_item
|
86
|
-
tax_line_item.mark_for_destruction
|
85
|
+
elsif tax_line_item.any?
|
86
|
+
tax_line_item.first.mark_for_destruction
|
87
87
|
end
|
88
88
|
|
89
89
|
# Postprocess everything but payments first
|
@@ -107,11 +107,10 @@ module Piggybak
|
|
107
107
|
self.total_due = self.total
|
108
108
|
|
109
109
|
# Postprocess payment last
|
110
|
-
self.line_items.each do |line_item|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
if !line_item.send(method)
|
110
|
+
self.line_items.payments.each do |line_item|
|
111
|
+
method = "postprocess_payment"
|
112
|
+
if line_item.respond_to?("postprocess_payment")
|
113
|
+
if !line_item.postprocess_payment
|
115
114
|
return false
|
116
115
|
end
|
117
116
|
end
|
@@ -155,7 +154,7 @@ module Piggybak
|
|
155
154
|
def add_line_items(cart)
|
156
155
|
cart.update_quantities
|
157
156
|
|
158
|
-
cart.
|
157
|
+
cart.sellables.each do |item|
|
159
158
|
self.line_items << Piggybak::LineItem.new({ :sellable_id => item[:sellable].id,
|
160
159
|
:unit_price => item[:sellable].price,
|
161
160
|
:price => item[:sellable].price*item[:quantity],
|
@@ -172,9 +171,9 @@ module Piggybak
|
|
172
171
|
else
|
173
172
|
if self.to_be_cancelled
|
174
173
|
self.status = "cancelled"
|
175
|
-
elsif line_items.
|
174
|
+
elsif line_items.shipments.any? && line_items.shipments.all? { |li| li.shipment.status == "shipped" }
|
176
175
|
self.status = "shipped"
|
177
|
-
elsif line_items.
|
176
|
+
elsif line_items.shipments.any? && line_items.shipments.all? { |li| li.shipment.status == "processing" }
|
178
177
|
self.status = "processing"
|
179
178
|
else
|
180
179
|
self.status = "new"
|
@@ -19,15 +19,7 @@ module Piggybak
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.rate(method, object)
|
22
|
-
|
23
|
-
|
24
|
-
if object.is_a?(Cart)
|
25
|
-
taxable_total = object.total
|
26
|
-
else
|
27
|
-
taxable_total = object.subtotal
|
28
|
-
end
|
29
|
-
|
30
|
-
(method.metadata.detect { |m| m.key == "rate" }.value.to_f * taxable_total).to_c
|
22
|
+
(method.metadata.detect { |m| m.key == "rate" }.value.to_f * object.subtotal).to_c
|
31
23
|
end
|
32
24
|
end
|
33
25
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% if @cart.
|
1
|
+
<% if @cart.sellables.any? -%>
|
2
2
|
<%= form_tag piggybak.cart_update_url do -%>
|
3
3
|
<table cellpadding="5" cellspacing="0" width="100%">
|
4
4
|
<tr>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<th></th>
|
11
11
|
<% end -%>
|
12
12
|
</tr>
|
13
|
-
<% @cart.
|
13
|
+
<% @cart.sellables.each do |item| %>
|
14
14
|
<tr>
|
15
15
|
<td><%= item[:sellable].description %></td>
|
16
16
|
<td><%= number_to_currency item[:sellable].price %></td>
|
data/lib/piggybak.rb
CHANGED
@@ -46,22 +46,24 @@ module Piggybak
|
|
46
46
|
attr_accessible "#{k}_attributes".to_sym
|
47
47
|
end
|
48
48
|
end
|
49
|
-
Piggybak::LineItem.class_eval do
|
50
|
-
scope plural_k, where(:line_item_type => "#{k}" )
|
51
|
-
end
|
52
49
|
Piggybak::Order.class_eval do
|
53
50
|
define_method "#{k}_charge" do
|
54
|
-
|
55
|
-
self.line_items.each do |li|
|
56
|
-
next if li._destroy || li.line_item_type.to_sym != k
|
57
|
-
charge += li.price
|
58
|
-
end
|
59
|
-
charge
|
51
|
+
self.line_items.send(plural_k).map(&:price).reduce(:+) || 0
|
60
52
|
end
|
61
53
|
end
|
62
54
|
end
|
63
|
-
# Define method subtotal on order, alias to sellable_charge
|
64
55
|
Piggybak::Order.class_eval do
|
56
|
+
has_many :line_items, :inverse_of => :order do
|
57
|
+
Piggybak.config.line_item_types.each do |k, v|
|
58
|
+
# Define proxy association method for line items
|
59
|
+
# e.g. self.line_items.sellables
|
60
|
+
# e.g. self.line_items.taxes
|
61
|
+
define_method "#{k.to_s.pluralize}" do
|
62
|
+
proxy_association.proxy.select { |li| li.line_item_type == "#{k}" }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
# Define method subtotal on order, alias to sellable_charge
|
65
67
|
alias :subtotal :sellable_charge
|
66
68
|
end
|
67
69
|
end
|
data/lib/piggybak/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: piggybak
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-10-
|
14
|
+
date: 2012-10-30 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rails
|
@@ -212,7 +212,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
212
212
|
version: '0'
|
213
213
|
segments:
|
214
214
|
- 0
|
215
|
-
hash:
|
215
|
+
hash: 151945934985011992
|
216
216
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
217
217
|
none: false
|
218
218
|
requirements:
|
@@ -221,7 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
221
|
version: '0'
|
222
222
|
segments:
|
223
223
|
- 0
|
224
|
-
hash:
|
224
|
+
hash: 151945934985011992
|
225
225
|
requirements: []
|
226
226
|
rubyforge_project:
|
227
227
|
rubygems_version: 1.8.23
|