shoppe 0.0.11 → 0.0.12
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/app/assets/stylesheets/shoppe/application.scss +3 -2
- data/app/assets/stylesheets/shoppe/chosen.css +8 -8
- data/app/assets/stylesheets/shoppe/elements.scss +1 -1
- data/app/controllers/shoppe/delivery_service_prices_controller.rb +1 -1
- data/app/controllers/shoppe/tax_rates_controller.rb +1 -1
- data/app/models/shoppe/delivery_service_price.rb +3 -0
- data/app/models/shoppe/order.rb +10 -3
- data/app/models/shoppe/order_item.rb +27 -13
- data/app/models/shoppe/tax_rate.rb +11 -0
- data/app/views/shoppe/delivery_service_prices/_form.html.haml +6 -0
- data/app/views/shoppe/delivery_services/edit.html.haml +3 -1
- data/app/views/shoppe/products/edit.html.haml +1 -1
- data/app/views/shoppe/products/new.html.haml +1 -1
- data/app/views/shoppe/products/stock_levels.html.haml +2 -2
- data/app/views/shoppe/tax_rates/form.html.haml +7 -2
- data/db/migrate/20131020204719_add_countries_to_tax_rates_and_delivery_prices.rb +6 -0
- data/db/seeds.rb +17 -17
- data/lib/shoppe/associated_countries.rb +20 -0
- data/lib/shoppe/version.rb +1 -1
- data/test/dummy/db/schema.rb +23 -4
- data/test/dummy/log/development.log +24 -0
- metadata +6 -4
@@ -41,7 +41,7 @@ nav.sidebar {
|
|
41
41
|
|
42
42
|
ul {
|
43
43
|
li {
|
44
|
-
span.pending { float:right; font-size:0.9em; font-weight:bold;background:#5B6270; color:#fff;padding:2px
|
44
|
+
span.pending { float:right; font-size:0.9em; font-weight:bold;background:#5B6270; color:#fff; padding:2px 10px; border-radius:16px; margin-top:9px; margin-right:10px;}
|
45
45
|
a {
|
46
46
|
display:block;
|
47
47
|
border-bottom:1px solid rgba(255,255,255,0.05);
|
@@ -50,11 +50,12 @@ nav.sidebar {
|
|
50
50
|
padding:10px 20px;
|
51
51
|
font-size:1.1em;
|
52
52
|
&:hover {
|
53
|
-
background:rgba(0,0,0,0.
|
53
|
+
background:rgba(0,0,0,0.05);
|
54
54
|
}
|
55
55
|
&.active {
|
56
56
|
font-weight:bold;
|
57
57
|
color:#fff;
|
58
|
+
background:rgba(0,0,0,0.08);
|
58
59
|
}
|
59
60
|
}
|
60
61
|
}
|
@@ -19,7 +19,7 @@
|
|
19
19
|
-moz-box-sizing: border-box;
|
20
20
|
box-sizing: border-box;
|
21
21
|
width: 100%;
|
22
|
-
border: 1px solid #
|
22
|
+
border: 1px solid #ccc;
|
23
23
|
border-top: 0;
|
24
24
|
background: #fff;
|
25
25
|
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
|
@@ -39,7 +39,7 @@
|
|
39
39
|
overflow: hidden;
|
40
40
|
padding: 0 0 0 8px;
|
41
41
|
height: 23px;
|
42
|
-
border: 1px solid #
|
42
|
+
border: 1px solid #ccc;
|
43
43
|
border-radius: 5px;
|
44
44
|
background-color: #fff;
|
45
45
|
background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
|
@@ -113,7 +113,7 @@
|
|
113
113
|
width: 100%;
|
114
114
|
height: auto;
|
115
115
|
outline: 0;
|
116
|
-
border: 1px solid #
|
116
|
+
border: 1px solid #ccc;
|
117
117
|
background: white url('chosen-sprite.png') no-repeat 100% -20px;
|
118
118
|
background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
119
119
|
background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
@@ -201,7 +201,7 @@
|
|
201
201
|
width: 100%;
|
202
202
|
height: auto !important;
|
203
203
|
height: 1%;
|
204
|
-
border: 1px solid #
|
204
|
+
border: 1px solid #ccc;
|
205
205
|
background-color: #fff;
|
206
206
|
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
207
207
|
background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
@@ -240,7 +240,7 @@
|
|
240
240
|
position: relative;
|
241
241
|
margin: 3px 0 3px 5px;
|
242
242
|
padding: 3px 20px 3px 5px;
|
243
|
-
border: 1px solid #
|
243
|
+
border: 1px solid #ccc;
|
244
244
|
border-radius: 3px;
|
245
245
|
background-color: #e4e4e4;
|
246
246
|
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
|
@@ -297,11 +297,11 @@
|
|
297
297
|
/* @end */
|
298
298
|
/* @group Active */
|
299
299
|
.chosen-container-active .chosen-single {
|
300
|
-
border: 1px solid #
|
300
|
+
border: 1px solid #9AC835;
|
301
301
|
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
302
302
|
}
|
303
303
|
.chosen-container-active.chosen-with-drop .chosen-single {
|
304
|
-
border: 1px solid #
|
304
|
+
border: 1px solid #ccc;
|
305
305
|
-moz-border-radius-bottomright: 0;
|
306
306
|
border-bottom-right-radius: 0;
|
307
307
|
-moz-border-radius-bottomleft: 0;
|
@@ -321,7 +321,7 @@
|
|
321
321
|
background-position: -18px 2px;
|
322
322
|
}
|
323
323
|
.chosen-container-active .chosen-choices {
|
324
|
-
border: 1px solid #
|
324
|
+
border: 1px solid #9AC835;
|
325
325
|
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
326
326
|
}
|
327
327
|
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
|
@@ -36,7 +36,7 @@ class Shoppe::DeliveryServicePricesController < Shoppe::ApplicationController
|
|
36
36
|
private
|
37
37
|
|
38
38
|
def safe_params
|
39
|
-
params[:delivery_service_price].permit(:price, :cost_price, :tax_rate_id, :min_weight, :max_weight, :code)
|
39
|
+
params[:delivery_service_price].permit(:price, :cost_price, :tax_rate_id, :min_weight, :max_weight, :code, :country_ids => [])
|
40
40
|
end
|
41
41
|
|
42
42
|
end
|
@@ -3,6 +3,9 @@ class Shoppe::DeliveryServicePrice < ActiveRecord::Base
|
|
3
3
|
# Set the table name
|
4
4
|
self.table_name = 'shoppe_delivery_service_prices'
|
5
5
|
|
6
|
+
# Tax rates are associated with countries
|
7
|
+
include Shoppe::AssociatedCountries
|
8
|
+
|
6
9
|
# Relationships
|
7
10
|
belongs_to :delivery_service, :class_name => 'Shoppe::DeliveryService'
|
8
11
|
belongs_to :tax_rate, :class_name => "Shoppe::TaxRate"
|
data/app/models/shoppe/order.rb
CHANGED
@@ -36,6 +36,11 @@ class Shoppe::Order < ActiveRecord::Base
|
|
36
36
|
order.validates :email_address, :format => {:with => /\A\b[A-Z0-9\.\_\%\-\+]+@(?:[A-Z0-9\-]+\.)+[A-Z]{2,6}\b\z/i}
|
37
37
|
order.validates :phone_number, :format => {:with => /\A[\d\ ]{7,}\z/}
|
38
38
|
end
|
39
|
+
validate do
|
40
|
+
unless available_delivery_services.include?(self.delivery_service)
|
41
|
+
errors.add :delivery_service_id, "is not suitable for this order"
|
42
|
+
end
|
43
|
+
end
|
39
44
|
|
40
45
|
# Scopes
|
41
46
|
scope :received, -> {where("received_at is not null")}
|
@@ -153,7 +158,9 @@ class Shoppe::Order < ActiveRecord::Base
|
|
153
158
|
# An array of all the delivery service prices which can be applied to this order.
|
154
159
|
def delivery_service_prices
|
155
160
|
@delivery_service_prices ||= begin
|
156
|
-
Shoppe::DeliveryServicePrice.joins(:delivery_service).where(:shoppe_delivery_services => {:active => true}).order("`default` desc, price asc").for_weight(total_weight)
|
161
|
+
prices = Shoppe::DeliveryServicePrice.joins(:delivery_service).where(:shoppe_delivery_services => {:active => true}).order("`default` desc, price asc").for_weight(total_weight)
|
162
|
+
prices = prices.select { |p| p.countries.empty? || p.country?(self.country) }
|
163
|
+
prices
|
157
164
|
end
|
158
165
|
end
|
159
166
|
|
@@ -189,7 +196,7 @@ class Shoppe::Order < ActiveRecord::Base
|
|
189
196
|
def delivery_tax_amount
|
190
197
|
@delivery_tax_amount ||= begin
|
191
198
|
read_attribute(:delivery_tax_amount) ||
|
192
|
-
|
199
|
+
delivery_price / BigDecimal(100) * delivery_tax_rate ||
|
193
200
|
0.0
|
194
201
|
end
|
195
202
|
end
|
@@ -198,7 +205,7 @@ class Shoppe::Order < ActiveRecord::Base
|
|
198
205
|
def delivery_tax_rate
|
199
206
|
@delivery_tax_rate ||= begin
|
200
207
|
read_attribute(:delivery_tax_rate) ||
|
201
|
-
delivery_service_price.try(:tax_rate).try(:
|
208
|
+
delivery_service_price.try(:tax_rate).try(:rate_for, self) ||
|
202
209
|
0.0
|
203
210
|
end
|
204
211
|
end
|
@@ -13,19 +13,7 @@ class Shoppe::OrderItem < ActiveRecord::Base
|
|
13
13
|
|
14
14
|
# Set some values based on the selected product on validation
|
15
15
|
before_validation do
|
16
|
-
|
17
|
-
self.unit_price = self.product.price if self.unit_price.blank?
|
18
|
-
self.unit_cost_price = self.product.cost_price if self.unit_cost_price.blank?
|
19
|
-
self.tax_rate = self.product.tax_rate.rate if self.tax_rate.blank? && self.product.tax_rate
|
20
|
-
|
21
|
-
if unit_price_changed? || quantity_changed? || tax_rate_changed?
|
22
|
-
self.tax_amount = (self.sub_total / BigDecimal(100)) * self.tax_rate
|
23
|
-
end
|
24
|
-
|
25
|
-
if product_id_changed? || quantity_changed?
|
26
|
-
self.weight = self.quantity * self.product.weight
|
27
|
-
end
|
28
|
-
end
|
16
|
+
self.weight = self.quantity * self.product.weight
|
29
17
|
end
|
30
18
|
|
31
19
|
# This allows you to add a product to the scoped order. For example Order.first.order_items.add_product(...).
|
@@ -75,6 +63,26 @@ class Shoppe::OrderItem < ActiveRecord::Base
|
|
75
63
|
end
|
76
64
|
end
|
77
65
|
|
66
|
+
# Return the unit price for the item
|
67
|
+
def unit_price
|
68
|
+
@unit_price ||= read_attribute(:unit_price) || product.try(:price) || 0.0
|
69
|
+
end
|
70
|
+
|
71
|
+
# Return the cost price for the item
|
72
|
+
def unit_cost_price
|
73
|
+
@unit_cost_price ||= read_attribute(:unit_cost_price) || product.try(:cost_price) || 0.0
|
74
|
+
end
|
75
|
+
|
76
|
+
# Return the tax rate for the item
|
77
|
+
def tax_rate
|
78
|
+
@tax_rate ||= read_attribute(:tax_rate) || product.try(:tax_rate).try(:rate_for, self.order) || 0.0
|
79
|
+
end
|
80
|
+
|
81
|
+
# Return the total tax for the item
|
82
|
+
def tax_amount
|
83
|
+
@tax_amount ||= read_attribute(:tax_amount) || (self.sub_total / BigDecimal(100)) * self.tax_rate
|
84
|
+
end
|
85
|
+
|
78
86
|
# Return the total cost for the product
|
79
87
|
def total_cost
|
80
88
|
quantity * unit_cost_price
|
@@ -93,6 +101,12 @@ class Shoppe::OrderItem < ActiveRecord::Base
|
|
93
101
|
# This method will be triggered when the parent order is confirmed. This should automatically
|
94
102
|
# update the stock levels on the source product.
|
95
103
|
def confirm!
|
104
|
+
write_attribute :unit_price, self.unit_price
|
105
|
+
write_attribute :unit_cost_price, self.unit_cost_price
|
106
|
+
write_attribute :tax_rate, self.tax_rate
|
107
|
+
write_attribute :tax_amount, self.tax_amount
|
108
|
+
save!
|
109
|
+
|
96
110
|
if self.product.stock_control?
|
97
111
|
self.product.stock_level_adjustments.create(:parent => self, :adjustment => 0 - self.quantity, :description => "Order ##{self.order.number} deduction")
|
98
112
|
end
|
@@ -4,6 +4,9 @@ module Shoppe
|
|
4
4
|
# Set the table name
|
5
5
|
self.table_name = 'shoppe_tax_rates'
|
6
6
|
|
7
|
+
# Tax rates are associated with countries
|
8
|
+
include Shoppe::AssociatedCountries
|
9
|
+
|
7
10
|
# Validations
|
8
11
|
validates :name, :presence => true
|
9
12
|
validates :rate, :numericality => true
|
@@ -19,5 +22,13 @@ module Shoppe
|
|
19
22
|
"#{name} (#{rate}%)"
|
20
23
|
end
|
21
24
|
|
25
|
+
def rate_for(order)
|
26
|
+
if countries.empty? || order.country.nil? || country?(order.country)
|
27
|
+
self.rate
|
28
|
+
else
|
29
|
+
0.0
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
22
33
|
end
|
23
34
|
end
|
@@ -25,6 +25,12 @@
|
|
25
25
|
%dt= f.label :tax_rate_id
|
26
26
|
%dd= f.collection_select :tax_rate_id, Shoppe::TaxRate.ordered, :id, :description, {:include_blank => true}, {:class => 'chosen-with-deselect', :data => {:placeholder => "No tax"}}
|
27
27
|
|
28
|
+
= field_set_tag "Countries" do
|
29
|
+
%dl
|
30
|
+
%dd
|
31
|
+
= f.collection_select :country_ids, Shoppe::Country.ordered, :id, :name, {}, {:class => 'chosen', :multiple => true, :data => {:placeholder => "All countries"}}
|
32
|
+
%p.help This delivery rate will only be available to orders where the country selected is listed here.
|
33
|
+
|
28
34
|
%p.submit
|
29
35
|
- unless @delivery_service_price.new_record?
|
30
36
|
%span.right= link_to "Delete", [@delivery_service, @delivery_service_price], :class => 'button purple', :method => :delete, :data => {:confirm => "Are you sure you wish to remove this price?"}
|
@@ -1,5 +1,7 @@
|
|
1
1
|
- @page_title = "Delivery Services"
|
2
2
|
= content_for :header do
|
3
|
-
%p.buttons
|
3
|
+
%p.buttons
|
4
|
+
= link_to "Prices", [@delivery_service, :delivery_service_prices], :class => 'button'
|
5
|
+
= link_to "Back to delivery services", :delivery_services, :class => 'button'
|
4
6
|
%h2.delivery_services Delivery Services
|
5
7
|
= render 'form'
|
@@ -2,6 +2,6 @@
|
|
2
2
|
= content_for :header do
|
3
3
|
%p.buttons
|
4
4
|
= link_to "Stock levels", [:stock_levels, @product], :class => 'button'
|
5
|
-
= link_to "Back to
|
5
|
+
= link_to "Back to product list", :products, :class => 'button'
|
6
6
|
%h2.products Products
|
7
7
|
= render 'form'
|
@@ -1,8 +1,8 @@
|
|
1
1
|
- @page_title = "Stock Levels - #{@product.title}"
|
2
2
|
= content_for :header do
|
3
3
|
%p.buttons
|
4
|
-
= link_to "Edit", [:edit, @product], :class => 'button'
|
5
|
-
= link_to "Back to list", :products, :class => 'button'
|
4
|
+
= link_to "Edit product", [:edit, @product], :class => 'button'
|
5
|
+
= link_to "Back to product list", :products, :class => 'button'
|
6
6
|
%h2.products= @product.title
|
7
7
|
|
8
8
|
.table
|
@@ -13,8 +13,13 @@
|
|
13
13
|
%dl.half
|
14
14
|
%dt= f.label :rate
|
15
15
|
%dd= f.text_field :rate
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
= field_set_tag "Countries" do
|
18
|
+
%dl
|
19
|
+
%dd
|
20
|
+
= f.collection_select :country_ids, Shoppe::Country.ordered, :id, :name, {}, {:class => 'chosen', :multiple => true, :data => {:placeholder => "All countries"}}
|
21
|
+
%p.help This tax rate will only apply to orders which are billed to addresses of the countries listed above.
|
22
|
+
|
18
23
|
%p.submit
|
19
24
|
- unless @tax_rate.new_record?
|
20
25
|
%span.right= link_to "Delete", @tax_rate, :class => 'button purple', :method => :delete, :data => {:confirm => "Are you sure you wish to remove this tax_rate?"}
|
data/db/seeds.rb
CHANGED
@@ -1,36 +1,36 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
# tax rates
|
4
|
-
tax_rate = Shoppe::TaxRate.create(:name => "Standard UK VAT", :rate => 20.0)
|
5
|
-
exempt_tax = Shoppe::TaxRate.create(:name => "Exempt VAT", :rate => 0.0)
|
4
|
+
tax_rate = Shoppe::TaxRate.create(:name => "Standard UK VAT", :rate => 20.0, :country_ids => Shoppe::Country.where(:eu_member => true).pluck(:id))
|
5
|
+
exempt_tax = Shoppe::TaxRate.create(:name => "Exempt VAT", :rate => 0.0, :country_ids => Shoppe::Country.where(:eu_member => true).pluck(:id))
|
6
6
|
|
7
7
|
# delivery services
|
8
8
|
|
9
9
|
ds = Shoppe::DeliveryService.create!(:name => "Royal Mail (1st class)", :code => 'RMFC', :courier => 'Royal Mail', :tracking_url => 'http://royalmail.com/track/{{consignment_number}}')
|
10
|
-
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 0.050, :price => 0.60, :cost_price => 0.55, :tax_rate => exempt_tax)
|
10
|
+
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 0.050, :price => 0.60, :cost_price => 0.55, :tax_rate => exempt_tax, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
11
11
|
|
12
12
|
|
13
13
|
ds = Shoppe::DeliveryService.create!(:name => "Royal Mail (signed for)", :code => 'RMSF', :courier => 'Royal Mail', :tracking_url => 'http://royalmail.com/track/{{consignment_number}}')
|
14
|
-
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 1, :price => 5.0, :cost_price => 4.5, :tax_rate => tax_rate)
|
15
|
-
ds.delivery_service_prices.create!(:min_weight => 1, :max_weight => 5, :price => 8.0, :cost_price => 7.5, :tax_rate => tax_rate)
|
16
|
-
ds.delivery_service_prices.create!(:min_weight => 5, :max_weight => 10, :price => 10.0, :cost_price => 9.5, :tax_rate => tax_rate)
|
17
|
-
ds.delivery_service_prices.create!(:min_weight => 10, :max_weight => 25, :price => 12.0, :cost_price => 11.5, :tax_rate => tax_rate)
|
18
|
-
ds.delivery_service_prices.create!(:min_weight => 25, :max_weight => 50, :price => 16.25, :cost_price => 13.5, :tax_rate => tax_rate)
|
14
|
+
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 1, :price => 5.0, :cost_price => 4.5, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
15
|
+
ds.delivery_service_prices.create!(:min_weight => 1, :max_weight => 5, :price => 8.0, :cost_price => 7.5, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
16
|
+
ds.delivery_service_prices.create!(:min_weight => 5, :max_weight => 10, :price => 10.0, :cost_price => 9.5, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
17
|
+
ds.delivery_service_prices.create!(:min_weight => 10, :max_weight => 25, :price => 12.0, :cost_price => 11.5, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
18
|
+
ds.delivery_service_prices.create!(:min_weight => 25, :max_weight => 50, :price => 16.25, :cost_price => 13.5, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
19
19
|
|
20
20
|
ds = Shoppe::DeliveryService.create!(:name => "Next Day Delivery (before 4pm)", :default => true, :code => 'ND16', :courier => 'UPS', :tracking_url => 'http://trackingurl.com/track/{{consignment_number}}')
|
21
|
-
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 1, :price => 7.0, :cost_price => 5.5, :tax_rate => tax_rate)
|
22
|
-
ds.delivery_service_prices.create!(:min_weight => 1, :max_weight => 5, :price => 9.0, :cost_price => 7.6, :tax_rate => tax_rate)
|
23
|
-
ds.delivery_service_prices.create!(:min_weight => 5, :max_weight => 20, :price => 11.50, :cost_price => 8.9, :tax_rate => tax_rate)
|
21
|
+
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 1, :price => 7.0, :cost_price => 5.5, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
22
|
+
ds.delivery_service_prices.create!(:min_weight => 1, :max_weight => 5, :price => 9.0, :cost_price => 7.6, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
23
|
+
ds.delivery_service_prices.create!(:min_weight => 5, :max_weight => 20, :price => 11.50, :cost_price => 8.9, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
24
24
|
|
25
25
|
ds = Shoppe::DeliveryService.create!(:name => "Next Day Delivery (before 10am)", :code => 'NS10', :courier => 'UPS', :tracking_url => 'http://trackingurl.com/track/{{consignment_number}}')
|
26
|
-
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 1, :price => 17.0, :cost_price => 14.00, :tax_rate => tax_rate)
|
27
|
-
ds.delivery_service_prices.create!(:min_weight => 1, :max_weight => 5, :price => 19.0, :cost_price => 16.00, :tax_rate => tax_rate)
|
28
|
-
ds.delivery_service_prices.create!(:min_weight => 5, :max_weight => 20, :price => 27.0, :cost_price => 22.00, :tax_rate => tax_rate)
|
26
|
+
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 1, :price => 17.0, :cost_price => 14.00, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
27
|
+
ds.delivery_service_prices.create!(:min_weight => 1, :max_weight => 5, :price => 19.0, :cost_price => 16.00, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
28
|
+
ds.delivery_service_prices.create!(:min_weight => 5, :max_weight => 20, :price => 27.0, :cost_price => 22.00, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
29
29
|
|
30
30
|
ds = Shoppe::DeliveryService.create!(:name => "Saturday Delivery", :code => 'NDSA16', :courier => 'UPS', :tracking_url => 'http://trackingurl.com/track/{{consignment_number}}')
|
31
|
-
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 1, :price => 27.0, :cost_price => 24.00, :tax_rate => tax_rate)
|
32
|
-
ds.delivery_service_prices.create!(:min_weight => 1, :max_weight => 5, :price => 29.0, :cost_price => 20.00, :tax_rate => tax_rate)
|
33
|
-
ds.delivery_service_prices.create!(:min_weight => 5, :max_weight => 20, :price => 37.0, :cost_price => 32.00,:tax_rate => tax_rate)
|
31
|
+
ds.delivery_service_prices.create!(:min_weight => 0, :max_weight => 1, :price => 27.0, :cost_price => 24.00, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
32
|
+
ds.delivery_service_prices.create!(:min_weight => 1, :max_weight => 5, :price => 29.0, :cost_price => 20.00, :tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
33
|
+
ds.delivery_service_prices.create!(:min_weight => 5, :max_weight => 20, :price => 37.0, :cost_price => 32.00,:tax_rate => tax_rate, :country_ids => Shoppe::Country.where(:name => 'United Kingdom').pluck(:id))
|
34
34
|
|
35
35
|
# categories
|
36
36
|
cat1 = Shoppe::ProductCategory.create!(:name => 'VoIP Phones')
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Shoppe
|
2
|
+
module AssociatedCountries
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.serialize :country_ids, Array
|
6
|
+
base.before_validation { self.country_ids = self.country_ids.map(&:to_i).select { |i| i > 0} if self.country_ids.is_a?(Array) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def country?(id)
|
10
|
+
id = id.id if id.is_a?(Shoppe::Country)
|
11
|
+
self.country_ids.is_a?(Array) && self.country_ids.include?(id.to_i)
|
12
|
+
end
|
13
|
+
|
14
|
+
def countries
|
15
|
+
return [] unless self.country_ids.is_a?(Array) && !self.country_ids.empty?
|
16
|
+
Shoppe::Country.where(:id => self.country_ids)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
data/lib/shoppe/version.rb
CHANGED
data/test/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20131020204719) do
|
15
15
|
|
16
16
|
create_table "nifty_attachments", force: true do |t|
|
17
17
|
t.integer "parent_id"
|
@@ -34,16 +34,27 @@ ActiveRecord::Schema.define(version: 20131017165222) do
|
|
34
34
|
t.string "value"
|
35
35
|
end
|
36
36
|
|
37
|
+
create_table "shoppe_countries", force: true do |t|
|
38
|
+
t.string "name"
|
39
|
+
t.string "code2"
|
40
|
+
t.string "code3"
|
41
|
+
t.string "continent"
|
42
|
+
t.string "tld"
|
43
|
+
t.string "currency"
|
44
|
+
t.boolean "eu_member", default: false
|
45
|
+
end
|
46
|
+
|
37
47
|
create_table "shoppe_delivery_service_prices", force: true do |t|
|
38
48
|
t.integer "delivery_service_id"
|
39
49
|
t.string "code"
|
40
50
|
t.decimal "price", precision: 8, scale: 2
|
41
|
-
t.
|
51
|
+
t.integer "tax_rate_id"
|
42
52
|
t.decimal "min_weight", precision: 8, scale: 2
|
43
53
|
t.decimal "max_weight", precision: 8, scale: 2
|
44
54
|
t.datetime "created_at"
|
45
55
|
t.datetime "updated_at"
|
46
56
|
t.decimal "cost_price", precision: 8, scale: 2
|
57
|
+
t.text "country_ids"
|
47
58
|
end
|
48
59
|
|
49
60
|
create_table "shoppe_delivery_services", force: true do |t|
|
@@ -80,6 +91,7 @@ ActiveRecord::Schema.define(version: 20131017165222) do
|
|
80
91
|
t.string "address3"
|
81
92
|
t.string "address4"
|
82
93
|
t.string "postcode"
|
94
|
+
t.integer "country_id"
|
83
95
|
t.string "email_address"
|
84
96
|
t.string "phone_number"
|
85
97
|
t.string "status"
|
@@ -99,7 +111,6 @@ ActiveRecord::Schema.define(version: 20131017165222) do
|
|
99
111
|
t.datetime "rejected_at"
|
100
112
|
t.integer "rejected_by"
|
101
113
|
t.string "ip_address"
|
102
|
-
t.string "country"
|
103
114
|
t.string "payment_reference"
|
104
115
|
t.string "payment_method"
|
105
116
|
t.decimal "delivery_cost_price", precision: 8, scale: 2
|
@@ -134,7 +145,7 @@ ActiveRecord::Schema.define(version: 20131017165222) do
|
|
134
145
|
t.boolean "active", default: true
|
135
146
|
t.decimal "weight", precision: 8, scale: 3, default: 0.0
|
136
147
|
t.decimal "price", precision: 8, scale: 2, default: 0.0
|
137
|
-
t.
|
148
|
+
t.integer "tax_rate_id"
|
138
149
|
t.datetime "created_at"
|
139
150
|
t.datetime "updated_at"
|
140
151
|
t.boolean "featured", default: false
|
@@ -153,6 +164,14 @@ ActiveRecord::Schema.define(version: 20131017165222) do
|
|
153
164
|
t.datetime "updated_at"
|
154
165
|
end
|
155
166
|
|
167
|
+
create_table "shoppe_tax_rates", force: true do |t|
|
168
|
+
t.string "name"
|
169
|
+
t.decimal "rate", precision: 8, scale: 2
|
170
|
+
t.datetime "created_at"
|
171
|
+
t.datetime "updated_at"
|
172
|
+
t.text "country_ids"
|
173
|
+
end
|
174
|
+
|
156
175
|
create_table "shoppe_users", force: true do |t|
|
157
176
|
t.string "first_name"
|
158
177
|
t.string "last_name"
|
@@ -1054,3 +1054,27 @@ Migrating to CreateShoppeCountries (20131017180920)
|
|
1054
1054
|
[1m[36m (0.8ms)[0m [1mDROP TABLE `shoppe_countries`[0m
|
1055
1055
|
[1m[35mSQL (1.6ms)[0m DELETE FROM `schema_migrations` WHERE `schema_migrations`.`version` = '20131017180920'
|
1056
1056
|
[1m[36mActiveRecord::SchemaMigration Load (0.2ms)[0m [1mSELECT `schema_migrations`.* FROM `schema_migrations`[0m
|
1057
|
+
[1m[36mActiveRecord::SchemaMigration Load (0.7ms)[0m [1mSELECT `schema_migrations`.* FROM `schema_migrations`[0m
|
1058
|
+
Migrating to CreateShoppeCountries (20131017180920)
|
1059
|
+
[1m[35m (16.5ms)[0m CREATE TABLE `shoppe_countries` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255), `code2` varchar(255), `code3` varchar(255), `continent` varchar(255), `tld` varchar(255), `currency` varchar(255), `eu_member` tinyint(1) DEFAULT 0) ENGINE=InnoDB
|
1060
|
+
[1m[36m (24.1ms)[0m [1mALTER TABLE `shoppe_orders` ADD `country_id` int(11) AFTER `postcode`[0m
|
1061
|
+
[1m[35m (20.5ms)[0m ALTER TABLE `shoppe_orders` DROP `country`
|
1062
|
+
[1m[36m (0.1ms)[0m [1mBEGIN[0m
|
1063
|
+
[1m[35mSQL (1.9ms)[0m INSERT INTO `schema_migrations` (`version`) VALUES ('20131017180920')
|
1064
|
+
[1m[36m (0.3ms)[0m [1mCOMMIT[0m
|
1065
|
+
Migrating to CreateShoppeTaxRates (20131017183211)
|
1066
|
+
[1m[35m (8.9ms)[0m CREATE TABLE `shoppe_tax_rates` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255), `rate` decimal(8,2), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB
|
1067
|
+
[1m[36m (24.2ms)[0m [1mALTER TABLE `shoppe_products` ADD `tax_rate_id` int(11) AFTER `tax_rate`[0m
|
1068
|
+
[1m[35m (17.3ms)[0m ALTER TABLE `shoppe_products` DROP `tax_rate`
|
1069
|
+
[1m[36m (14.6ms)[0m [1mALTER TABLE `shoppe_delivery_service_prices` ADD `tax_rate_id` int(11) AFTER `tax_rate`[0m
|
1070
|
+
[1m[35m (16.9ms)[0m ALTER TABLE `shoppe_delivery_service_prices` DROP `tax_rate`
|
1071
|
+
[1m[36m (0.1ms)[0m [1mBEGIN[0m
|
1072
|
+
[1m[35mSQL (0.2ms)[0m INSERT INTO `schema_migrations` (`version`) VALUES ('20131017183211')
|
1073
|
+
[1m[36m (0.3ms)[0m [1mCOMMIT[0m
|
1074
|
+
Migrating to AddCountriesToTaxRatesAndDeliveryPrices (20131020204719)
|
1075
|
+
[1m[35m (19.4ms)[0m ALTER TABLE `shoppe_delivery_service_prices` ADD `country_ids` text
|
1076
|
+
[1m[36m (19.5ms)[0m [1mALTER TABLE `shoppe_tax_rates` ADD `country_ids` text[0m
|
1077
|
+
[1m[35m (0.1ms)[0m BEGIN
|
1078
|
+
[1m[36mSQL (0.2ms)[0m [1mINSERT INTO `schema_migrations` (`version`) VALUES ('20131020204719')[0m
|
1079
|
+
[1m[35m (0.3ms)[0m COMMIT
|
1080
|
+
[1m[36mActiveRecord::SchemaMigration Load (0.2ms)[0m [1mSELECT `schema_migrations`.* FROM `schema_migrations`[0m
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shoppe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
12
|
+
date: 2013-10-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -378,6 +378,7 @@ files:
|
|
378
378
|
- db/migrate/20131017144430_create_shoppe_stock_level_adjustments.rb
|
379
379
|
- db/migrate/20131017180920_create_shoppe_countries.rb
|
380
380
|
- db/migrate/20131017183211_create_shoppe_tax_rates.rb
|
381
|
+
- db/migrate/20131020204719_add_countries_to_tax_rates_and_delivery_prices.rb
|
381
382
|
- db/seeds.rb
|
382
383
|
- db/seeds_data/poe400.jpg
|
383
384
|
- db/seeds_data/snom-870-blk.jpg
|
@@ -392,6 +393,7 @@ files:
|
|
392
393
|
- db/seeds_data/t46gn.jpg
|
393
394
|
- db/seeds_data/w52p.jpg
|
394
395
|
- db/seeds_data/yhs32.jpg
|
396
|
+
- lib/shoppe/associated_countries.rb
|
395
397
|
- lib/shoppe/country_importer.rb
|
396
398
|
- lib/shoppe/engine.rb
|
397
399
|
- lib/shoppe/errors/inappropriate_delivery_service.rb
|
@@ -462,7 +464,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
462
464
|
version: '0'
|
463
465
|
segments:
|
464
466
|
- 0
|
465
|
-
hash:
|
467
|
+
hash: -2288796444690138098
|
466
468
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
467
469
|
none: false
|
468
470
|
requirements:
|
@@ -471,7 +473,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
471
473
|
version: '0'
|
472
474
|
segments:
|
473
475
|
- 0
|
474
|
-
hash:
|
476
|
+
hash: -2288796444690138098
|
475
477
|
requirements: []
|
476
478
|
rubyforge_project:
|
477
479
|
rubygems_version: 1.8.23
|