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.
@@ -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 7px; border-radius:16px; margin-top:9px; margin-right:10px;}
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.1);
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 #aaa;
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 #aaa;
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 #aaa;
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 #aaa;
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 #aaa;
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 #5897fb;
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 #aaa;
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 #5897fb;
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"] {
@@ -18,7 +18,7 @@
18
18
  background-color:#40454D;
19
19
  display:inline-block;
20
20
  &:active {
21
- background:#40454D;
21
+ background:#535963;
22
22
  }
23
23
 
24
24
  &.green {
@@ -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
@@ -41,7 +41,7 @@ class Shoppe::TaxRatesController < Shoppe::ApplicationController
41
41
  private
42
42
 
43
43
  def safe_params
44
- params[:tax_rate].permit(:name, :rate)
44
+ params[:tax_rate].permit(:name, :rate, :country_ids => [])
45
45
  end
46
46
 
47
47
  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"
@@ -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
- (delivery_service_price && delivery_service_price.tax_rate ? delivery_price / BigDecimal(100) * delivery_service_price.tax_rate.rate : 0.0) ||
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(:rate) ||
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
- if self.product
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= link_to "Back to delivery services", :delivery_services, :class => 'button'
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 products list", :products, :class => 'button'
5
+ = link_to "Back to product list", :products, :class => 'button'
6
6
  %h2.products Products
7
7
  = render 'form'
@@ -1,5 +1,5 @@
1
1
  - @page_title = "Products"
2
2
  = content_for :header do
3
- %p.buttons= link_to "back to products list", :products, :class => 'button'
3
+ %p.buttons= link_to "Back to product list", :products, :class => 'button'
4
4
  %h2.products Products
5
5
  = 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?"}
@@ -0,0 +1,6 @@
1
+ class AddCountriesToTaxRatesAndDeliveryPrices < ActiveRecord::Migration
2
+ def change
3
+ add_column :shoppe_delivery_service_prices, :country_ids, :text
4
+ add_column :shoppe_tax_rates, :country_ids, :text
5
+ end
6
+ end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Shoppe
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
@@ -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: 20131017165222) do
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.decimal "tax_rate", precision: 8, scale: 2
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.decimal "tax_rate", precision: 8, scale: 2, default: 0.0
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
   (0.8ms) DROP TABLE `shoppe_countries`
1055
1055
  SQL (1.6ms) DELETE FROM `schema_migrations` WHERE `schema_migrations`.`version` = '20131017180920'
1056
1056
  ActiveRecord::SchemaMigration Load (0.2ms) SELECT `schema_migrations`.* FROM `schema_migrations`
1057
+ ActiveRecord::SchemaMigration Load (0.7ms) SELECT `schema_migrations`.* FROM `schema_migrations`
1058
+ Migrating to CreateShoppeCountries (20131017180920)
1059
+  (16.5ms) 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
+  (24.1ms) ALTER TABLE `shoppe_orders` ADD `country_id` int(11) AFTER `postcode`
1061
+  (20.5ms) ALTER TABLE `shoppe_orders` DROP `country`
1062
+  (0.1ms) BEGIN
1063
+ SQL (1.9ms) INSERT INTO `schema_migrations` (`version`) VALUES ('20131017180920')
1064
+  (0.3ms) COMMIT
1065
+ Migrating to CreateShoppeTaxRates (20131017183211)
1066
+  (8.9ms) 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
+  (24.2ms) ALTER TABLE `shoppe_products` ADD `tax_rate_id` int(11) AFTER `tax_rate`
1068
+  (17.3ms) ALTER TABLE `shoppe_products` DROP `tax_rate`
1069
+  (14.6ms) ALTER TABLE `shoppe_delivery_service_prices` ADD `tax_rate_id` int(11) AFTER `tax_rate`
1070
+  (16.9ms) ALTER TABLE `shoppe_delivery_service_prices` DROP `tax_rate`
1071
+  (0.1ms) BEGIN
1072
+ SQL (0.2ms) INSERT INTO `schema_migrations` (`version`) VALUES ('20131017183211')
1073
+  (0.3ms) COMMIT
1074
+ Migrating to AddCountriesToTaxRatesAndDeliveryPrices (20131020204719)
1075
+  (19.4ms) ALTER TABLE `shoppe_delivery_service_prices` ADD `country_ids` text
1076
+  (19.5ms) ALTER TABLE `shoppe_tax_rates` ADD `country_ids` text
1077
+  (0.1ms) BEGIN
1078
+ SQL (0.2ms) INSERT INTO `schema_migrations` (`version`) VALUES ('20131020204719')
1079
+  (0.3ms) COMMIT
1080
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT `schema_migrations`.* FROM `schema_migrations`
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.11
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-17 00:00:00.000000000 Z
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: 2209799675854067542
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: 2209799675854067542
476
+ hash: -2288796444690138098
475
477
  requirements: []
476
478
  rubyforge_project:
477
479
  rubygems_version: 1.8.23