spree 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of spree might be problematic. Click here for more details.

Files changed (182) hide show
  1. data/CHANGELOG +35 -0
  2. data/CONTRIBUTORS +2 -1
  3. data/README.markdown +8 -52
  4. data/app/controllers/account_controller.rb +1 -1
  5. data/app/controllers/addresses_controller.rb +5 -1
  6. data/app/controllers/admin/inventory_settings_controller.rb +13 -0
  7. data/app/controllers/admin/option_types_controller.rb +1 -1
  8. data/app/controllers/admin/orders_controller.rb +14 -8
  9. data/app/controllers/admin/products_controller.rb +2 -0
  10. data/app/controllers/admin/variants_controller.rb +7 -0
  11. data/app/controllers/content_controller.rb +5 -0
  12. data/app/controllers/creditcard_payments_controller.rb +2 -2
  13. data/app/controllers/orders_controller.rb +18 -2
  14. data/app/helpers/admin/inventory_settings_helper.rb +5 -0
  15. data/app/helpers/admin/product_properties_helper.rb +10 -2
  16. data/app/helpers/products_helper.rb +2 -2
  17. data/app/models/address.rb +2 -2
  18. data/app/models/app_configuration.rb +1 -0
  19. data/app/models/creditcard_payment.rb +6 -14
  20. data/app/models/order.rb +6 -12
  21. data/app/models/order_filter.rb +1 -0
  22. data/app/models/product.rb +9 -0
  23. data/app/models/product_property.rb +1 -0
  24. data/app/models/property.rb +0 -1
  25. data/app/models/zone.rb +17 -3
  26. data/app/views/account/login.html.erb +2 -14
  27. data/app/views/admin/configurations/index.html.erb +4 -0
  28. data/app/views/admin/inventory_settings/edit.html.erb +18 -0
  29. data/app/views/admin/inventory_settings/show.html.erb +11 -0
  30. data/app/views/admin/orders/_address.html.erb +1 -1
  31. data/app/views/admin/orders/index.html.erb +5 -1
  32. data/app/views/admin/orders/show.html.erb +3 -3
  33. data/app/views/admin/product_properties/_product_property.html.erb +6 -3
  34. data/app/views/admin/products/_form.html.erb +9 -1
  35. data/app/views/admin/prototypes/select.rjs +3 -1
  36. data/app/views/admin/variants/_form.html.erb +6 -0
  37. data/app/views/admin/variants/index.html.erb +7 -1
  38. data/app/views/creditcard_payments/_form_credit_card.html.erb +1 -1
  39. data/app/views/creditcard_payments/new.html.erb +7 -2
  40. data/app/views/products/show.html.erb +8 -2
  41. data/app/views/shared/_login.html.erb +17 -0
  42. data/app/views/shared/_products.html.erb +1 -1
  43. data/app/views/users/_form.html.erb +1 -1
  44. data/app/views/users/new.html.erb +19 -8
  45. data/config/boot.rb +1 -1
  46. data/config/database.yml +7 -3
  47. data/config/environment.rb +16 -2
  48. data/config/routes.rb +4 -0
  49. data/db/migrate/20081016002224_remove_defunct_order_fields.rb +10 -0
  50. data/db/migrate/20081016162924_drop_category_id_from_products.rb +9 -0
  51. data/db/sample/addresses.yml +14 -0
  52. data/db/sample/orders.yml +0 -1
  53. data/lang/ui/de-DE.yml +2 -1
  54. data/lang/ui/en-US.yml +50 -25
  55. data/lang/ui/es-ES.yml +2 -1
  56. data/lang/ui/it-IT.yml +2 -1
  57. data/lang/ui/pl-PL.yml +1 -0
  58. data/lang/ui/pt-BR.yml +5 -2
  59. data/lib/authenticated_system.rb +1 -1
  60. data/lib/generators/extension/extension_generator.rb +1 -0
  61. data/lib/generators/extension/templates/extension.rb +4 -5
  62. data/lib/generators/extension/templates/tasks.rake +12 -0
  63. data/lib/generators/extension_migration/extension_migration_generator.rb +32 -0
  64. data/lib/generators/extension_migration/templates/migration.rb +7 -0
  65. data/lib/spree.rb +2 -2
  66. data/lib/spree/extension.rb +0 -7
  67. data/lib/spree/extension_loader.rb +0 -8
  68. data/lib/tasks/extensions.rake +47 -0
  69. data/public/javascripts/application.js +34 -0
  70. data/public/javascripts/spree-yui.js +2 -2
  71. data/public/stylesheets/spree.css +11 -1
  72. data/spec/fixtures/preferences.yml +14 -6
  73. data/spec/models/address_spec.rb +78 -0
  74. data/spec/models/country_spec.rb +29 -0
  75. data/spec/models/option_type_spec.rb +36 -0
  76. data/spec/models/option_value_spec.rb +39 -0
  77. data/spec/models/product_option_type_spec.rb +38 -0
  78. data/spec/models/product_property_spec.rb +36 -0
  79. data/spec/models/product_spec.rb +109 -32
  80. data/spec/models/property_spec.rb +38 -0
  81. data/spec/models/prototype_spec.rb +35 -0
  82. data/spec/models/state_spec.rb +28 -0
  83. data/spec/models/taxon_spec.rb +38 -0
  84. data/spec/models/taxonomy_spec.rb +37 -0
  85. data/spec/models/variant_spec.rb +73 -12
  86. data/spec/models/zone_spec.rb +35 -15
  87. data/spec/spec_helper.rb +15 -0
  88. data/spec/views/admin/configurations/index.html.erb_spec.rb +29 -0
  89. data/spec/views/admin/mail_settings/show.html.erb_spec.rb +3 -3
  90. data/spec/views/products/index.html.erb_spec.rb +46 -0
  91. data/spec/views/products/show.html.erb_spec.rb +46 -0
  92. data/vendor/extensions/flat_rate_shipping/README.markdown +3 -0
  93. data/vendor/extensions/flat_rate_shipping/Rakefile +120 -0
  94. data/vendor/extensions/flat_rate_shipping/flat_rate_shipping_extension.rb +17 -0
  95. data/vendor/extensions/flat_rate_shipping/lib/flat_rate_shipping_configuration.rb +7 -0
  96. data/vendor/extensions/flat_rate_shipping/lib/spree/flat_rate_shipping/calculator.rb +9 -0
  97. data/vendor/extensions/flat_rate_shipping/lib/spree/flat_rate_shipping/config.rb +22 -0
  98. data/vendor/extensions/flat_rate_shipping/lib/tasks/flat_rate_shipping_extension_tasks.rake +29 -0
  99. data/vendor/extensions/flat_rate_shipping/spec/spec.opts +6 -0
  100. data/vendor/extensions/flat_rate_shipping/spec/spec_helper.rb +37 -0
  101. data/vendor/extensions/localization/localization_extension.rb +1 -6
  102. data/vendor/extensions/payment_gateway/lib/gateway_config.rb +7 -0
  103. data/vendor/extensions/payment_gateway/lib/spree/gateway/config.rb +22 -0
  104. data/vendor/extensions/payment_gateway/lib/spree/payment_gateway.rb +27 -3
  105. data/vendor/extensions/payment_gateway/payment_gateway_extension.rb +0 -4
  106. data/vendor/extensions/shipping/README.markdown +3 -0
  107. data/vendor/extensions/shipping/Rakefile +120 -0
  108. data/vendor/extensions/shipping/app/controllers/admin/shipping_categories_controller.rb +17 -0
  109. data/vendor/extensions/shipping/app/controllers/admin/shipping_methods_controller.rb +21 -0
  110. data/vendor/extensions/shipping/app/controllers/shipments_controller.rb +84 -0
  111. data/vendor/extensions/shipping/app/helpers/admin/shipping_categories_helper.rb +2 -0
  112. data/vendor/extensions/shipping/app/helpers/admin/shipping_methods_helper.rb +2 -0
  113. data/vendor/extensions/shipping/app/helpers/shipments_helper.rb +20 -0
  114. data/vendor/extensions/shipping/app/models/shipment.rb +11 -0
  115. data/vendor/extensions/shipping/app/models/shipping_category.rb +3 -0
  116. data/vendor/extensions/shipping/app/models/shipping_method.rb +12 -0
  117. data/vendor/extensions/shipping/app/views/admin/shipping_categories/_form.html.erb +6 -0
  118. data/vendor/extensions/shipping/app/views/admin/shipping_categories/edit.html.erb +8 -0
  119. data/vendor/extensions/shipping/app/views/admin/shipping_categories/index.html.erb +24 -0
  120. data/vendor/extensions/shipping/app/views/admin/shipping_categories/new.html.erb +10 -0
  121. data/vendor/extensions/shipping/app/views/admin/shipping_methods/_form.html.erb +14 -0
  122. data/vendor/extensions/shipping/app/views/admin/shipping_methods/edit.html.erb +8 -0
  123. data/vendor/extensions/shipping/app/views/admin/shipping_methods/index.html.erb +28 -0
  124. data/vendor/extensions/shipping/app/views/admin/shipping_methods/new.html.erb +10 -0
  125. data/vendor/extensions/shipping/app/views/orders/fatal_shipping.html.erb +6 -0
  126. data/vendor/extensions/shipping/app/views/shipments/_form.html.erb +46 -0
  127. data/vendor/extensions/shipping/app/views/shipments/edit.html.erb +8 -0
  128. data/vendor/extensions/shipping/app/views/shipments/new.html.erb +8 -0
  129. data/vendor/extensions/shipping/db/migrate/20081003211336_create_shipping_methods.rb +14 -0
  130. data/vendor/extensions/shipping/db/migrate/20081003233427_create_shipping_categories.rb +15 -0
  131. data/vendor/extensions/shipping/db/migrate/20081015001711_create_shipments.rb +14 -0
  132. data/vendor/extensions/shipping/db/migrate/20081023134446_add_product_dimensions.rb +19 -0
  133. data/vendor/extensions/shipping/db/sample/shipping_categories.yml +2 -0
  134. data/vendor/extensions/shipping/db/sample/shipping_methods.yml +12 -0
  135. data/vendor/extensions/shipping/db/sample/zone_members.yml +8 -0
  136. data/vendor/extensions/shipping/db/sample/zones.yml +3 -0
  137. data/vendor/extensions/shipping/lang/en-US.yml +9 -0
  138. data/vendor/extensions/shipping/lib/spree/shipping_calculator.rb +37 -0
  139. data/vendor/extensions/shipping/lib/spree/shipping_error.rb +3 -0
  140. data/vendor/extensions/shipping/lib/tasks/shipping_extension_tasks.rake +29 -0
  141. data/vendor/extensions/shipping/shipping_extension.rb +39 -0
  142. data/vendor/extensions/shipping/spec/controllers/admin/shipping_categories_controller_spec.rb +10 -0
  143. data/vendor/extensions/shipping/spec/controllers/admin/shipping_methods_controller_spec.rb +10 -0
  144. data/vendor/extensions/shipping/spec/models/order_spec.rb +98 -0
  145. data/vendor/extensions/shipping/spec/models/shipment_spec.rb +26 -0
  146. data/vendor/extensions/shipping/spec/models/shipping_category_spec.rb +8 -0
  147. data/vendor/extensions/shipping/spec/models/shipping_method_spec.rb +53 -0
  148. data/vendor/extensions/shipping/spec/spec.opts +6 -0
  149. data/vendor/extensions/shipping/spec/spec_helper.rb +37 -0
  150. data/vendor/extensions/tax_calculator/lib/spree/sales_tax_calculator.rb +12 -4
  151. data/vendor/extensions/tax_calculator/spec/controllers/tax_calculator_spec.rb +0 -4
  152. data/vendor/extensions/tax_calculator/spec/models/sales_tax_calculator_spec.rb +14 -14
  153. data/vendor/extensions/tax_calculator/tax_calculator_extension.rb +0 -4
  154. data/vendor/plugins/resource_controller/README.rdoc +38 -6
  155. data/vendor/plugins/resource_controller/Rakefile +7 -20
  156. data/vendor/plugins/resource_controller/TODO +0 -1
  157. data/vendor/plugins/resource_controller/lib/resource_controller/helpers/current_objects.rb +71 -69
  158. data/vendor/plugins/resource_controller/lib/resource_controller/helpers/internal.rb +69 -65
  159. data/vendor/plugins/resource_controller/lib/resource_controller/helpers/nested.rb +62 -57
  160. data/vendor/plugins/resource_controller/lib/resource_controller/helpers/singleton_customizations.rb +50 -46
  161. data/vendor/plugins/resource_controller/lib/resource_controller/helpers/urls.rb +73 -69
  162. data/vendor/plugins/resource_controller/resource_controller.gemspec +4 -3
  163. data/vendor/plugins/resource_controller/test/app/controllers/cms/personnel_controller.rb +2 -0
  164. data/vendor/plugins/resource_controller/test/app/controllers/cms/photos_controller.rb +6 -0
  165. data/vendor/plugins/resource_controller/test/app/models/personnel.rb +3 -0
  166. data/vendor/plugins/resource_controller/test/app/models/photo.rb +1 -0
  167. data/vendor/plugins/resource_controller/test/app/views/cms/photos/edit.rhtml +17 -0
  168. data/vendor/plugins/resource_controller/test/app/views/cms/photos/index.rhtml +20 -0
  169. data/vendor/plugins/resource_controller/test/app/views/cms/photos/new.rhtml +16 -0
  170. data/vendor/plugins/resource_controller/test/app/views/cms/photos/show.rhtml +8 -0
  171. data/vendor/plugins/resource_controller/test/config/database.yml +9 -0
  172. data/vendor/plugins/resource_controller/test/config/environment.rb +1 -18
  173. data/vendor/plugins/resource_controller/test/config/initializers/inflections.rb +14 -0
  174. data/vendor/plugins/resource_controller/test/config/routes.rb +3 -0
  175. data/vendor/plugins/resource_controller/test/db/migrate/013_create_personnel.rb +11 -0
  176. data/vendor/plugins/resource_controller/test/db/migrate/014_add_personnel_id_to_photos.rb +9 -0
  177. data/vendor/plugins/resource_controller/test/test/fixtures/personnel.yml +5 -0
  178. data/vendor/plugins/resource_controller/test/test/functional/cms/photos_controller_test.rb +43 -0
  179. metadata +136 -6
  180. data/app/models/spree/extension_meta.rb +0 -5
  181. data/app/models/variants.rb +0 -2
  182. data/vendor/plugins/resource_controller/lib/resource_controller/version.rb +0 -9
@@ -0,0 +1,20 @@
1
+ module ShipmentsHelper
2
+ # Creates a radio button to represent a choice of shipping method. The choice will be disabled if for some
3
+ # reason the rate is nil (perhaps the web service didn't return a quote for that method for some reason.)
4
+ def shipping_radio(shipping_method, order)
5
+ cost = shipping_method.calculate_shipping(@order)
6
+ checked = @shipment.shipping_method == shipping_method || @default_method == shipping_method
7
+ if cost
8
+ radio = "<input type='radio' name='method_id' value='#{shipping_method.id}' #{"checked='true'" if checked} onclick='calculate_order_total(this);'/>"
9
+ radio += shipping_method.name
10
+ radio += "&nbsp; (Cost: #{number_to_currency(cost)})"
11
+ else
12
+ radio = "<input type='radio' name='method_id' disabled='true' onclick='calculate_order_total(this);'/>"
13
+ radio += "<span class='disabled'>#{shipping_method.name}</span>"
14
+ end
15
+
16
+ radio += "<script type=""text/javascript"">shipping_costs.set('#{shipping_method.id}',#{cost});</script>"
17
+
18
+ radio
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ class Shipment < ActiveRecord::Base
2
+ belongs_to :order
3
+ belongs_to :shipping_method
4
+ before_save :calculate_shipping
5
+
6
+ private
7
+ def calculate_shipping
8
+ calculator = shipping_method.shipping_calculator.constantize.new
9
+ order.update_attribute(:ship_amount, calculator.calculate_shipping(order))
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ class ShippingCategory < ActiveRecord::Base
2
+ validates_presence_of :name
3
+ end
@@ -0,0 +1,12 @@
1
+ class ShippingMethod < ActiveRecord::Base
2
+ belongs_to :zone
3
+
4
+ def available?(order)
5
+ zone.include?(order.address)
6
+ end
7
+
8
+ def calculate_shipping(order)
9
+ return 0 unless zone.include?(order.address)
10
+ return shipping_calculator.constantize.new.send(:calculate_shipping, order)
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ <table>
2
+ <tr>
3
+ <td><%=t("Name")%>:</td>
4
+ <td><%= f.text_field :name, {"style" => "width:200px"} %></td>
5
+ </tr>
6
+ </table>
@@ -0,0 +1,8 @@
1
+ <h1><%= t("Editing Shipping Category") %></h1>
2
+ <%= error_messages_for :shipping_category %>
3
+ <% form_for(:shipping_category, :url => object_url, :html => { :method => :put }) do |f| %>
4
+ <%= render :partial => "form", :locals => { :f => f } %>
5
+ <p>
6
+ <%=submit_tag t("Update")%>
7
+ </p>
8
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <h1><%=t("Shipping Categories") %></h1>
2
+ <table class="admin-report" width="545">
3
+ <thead>
4
+ <tr>
5
+ <th><%=t("Name")%></th>
6
+ <th><%=t("Action")%></th>
7
+ </tr>
8
+ </thead>
9
+ <tbody>
10
+ <% @shipping_categories.each do |shipping_category| %>
11
+ <tr class="<%= cycle('even', 'odd') %>">
12
+ <td><%=shipping_category.name %></td>
13
+ <td>
14
+ <%=link_to t("Edit"), edit_object_url(shipping_category) %> |
15
+ <%=link_to t("Delete"), object_url(shipping_category), :method => :delete %>
16
+ </td>
17
+ </tr>
18
+ <% end %>
19
+ <% if @shipping_categories.empty? %>
20
+ <tr><td colspan="5">None.</td></tr>
21
+ <% end %>
22
+ </tbody>
23
+ </table>
24
+ <%= link_to t("New Shipping Category"), new_object_url %>
@@ -0,0 +1,10 @@
1
+ <h1><%= t("New Shipping Category") %></h1>
2
+
3
+ <%= error_messages_for :shipping_category %>
4
+
5
+ <% form_for(:shipping_category, :url => collection_url) do |f| %>
6
+ <%= render :partial => "form", :locals => { :f => f } %>
7
+ <p>
8
+ <%= submit_tag t("Create") %>
9
+ </p>
10
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <table>
2
+ <tr>
3
+ <td><%=t("Name")%>:</td>
4
+ <td><%= f.text_field :name, {"style" => "width:200px"} %></td>
5
+ </tr>
6
+ <tr>
7
+ <td><%=t("Zone")%>:</td>
8
+ <td><%= collection_select(:shipping_method, :zone_id, @available_zones, :id, :name, {}, {"style" => "width:200px"}) %></td>
9
+ </tr>
10
+ <tr>
11
+ <td><%=t("Shipping Calculator")%>:</td>
12
+ <td><%= f.text_field :shipping_calculator, {"style" => "width:200px"} %></td>
13
+ </tr>
14
+ </table>
@@ -0,0 +1,8 @@
1
+ <h1><%= t("Editing Shipping Method") %></h1>
2
+ <%= error_messages_for :shipping_rate %>
3
+ <% form_for(:shipping_method, :url => object_url, :html => { :method => :put }) do |f| %>
4
+ <%= render :partial => "form", :locals => { :f => f } %>
5
+ <p>
6
+ <%=submit_tag t("Update")%>
7
+ </p>
8
+ <% end %>
@@ -0,0 +1,28 @@
1
+ <h1><%=t("Shipping Methods") %></h1>
2
+ <table class="admin-report" width="545">
3
+ <thead>
4
+ <tr>
5
+ <th><%=t("Name")%></th>
6
+ <th><%=t("Zone")%></th>
7
+ <th><%=t("Calculator")%></th>
8
+ <th><%=t("Action")%></th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <% @shipping_methods.each do |shipping_method| %>
13
+ <tr class="<%= cycle('even', 'odd') %>">
14
+ <td><%=shipping_method.name %></td>
15
+ <td><%=shipping_method.zone.name %></td>
16
+ <td><%=shipping_method.shipping_calculator %></td>
17
+ <td>
18
+ <%=link_to t("Edit"), edit_object_url(shipping_method) %> |
19
+ <%=link_to t("Delete"), object_url(shipping_method), :method => :delete %>
20
+ </td>
21
+ </tr>
22
+ <% end %>
23
+ <% if @shipping_methods.empty? %>
24
+ <tr><td colspan="5">None.</td></tr>
25
+ <% end %>
26
+ </tbody>
27
+ </table>
28
+ <%= link_to t("New Shipping Method"), new_object_url %>
@@ -0,0 +1,10 @@
1
+ <h1><%= t("New Shipping Method") %></h1>
2
+
3
+ <%= error_messages_for :shipping_method %>
4
+
5
+ <% form_for(:shipping_method, :url => collection_url) do |f| %>
6
+ <%= render :partial => "form", :locals => { :f => f } %>
7
+ <p>
8
+ <%= submit_tag t("Create") %>
9
+ </p>
10
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <!-- NOTE: Hopefull this page is never seen. Its suggested that you customize it for each application anyways so we're
2
+ not bothering with translation (the flash error message will be translated.)_ -->
3
+ <p>
4
+ We are experiencing technical difficulties obtaining a shipping quote from one or more carriers. Your order has been
5
+ saved and we hope to resolve the issue shortly. We appologize for the inconvenience.
6
+ </p>
@@ -0,0 +1,46 @@
1
+ <table class="order-summary" style="width:100%;">
2
+ <tr>
3
+ <th><%= t('Item Description') %></th>
4
+ <th><%= t('Price') %></th>
5
+ <th><%= t('Qty') %></th>
6
+ <th width="250" align="right"><%= t('Total') %></th>
7
+ </tr>
8
+ <% @order.line_items.each do |item| %>
9
+ <tr >
10
+ <td width="300"><%=item.variant.product.name-%> <%= "(" + variant_options(item.variant) + ")" unless item.variant .option_values.empty? %></td>
11
+ <td valign="top"><%= number_to_currency item.price -%></td>
12
+ <td valign="top"><%=item.quantity-%></td>
13
+ <td valign="top" align="right"><%= number_to_currency (item.price * item.quantity)-%></td>
14
+ </tr>
15
+ <% end %>
16
+ <tr id="subtotal-row">
17
+ <td colspan="3" align="right"><b><%= t('Subtotal') %>:</b></td>
18
+ <td align="right"><%= number_to_currency @order.item_total -%></td>
19
+ </tr>
20
+ <tr>
21
+ <td colspan="3" align="right"><b><%= t('Tax') %>:</b></td>
22
+ <td align="right"><%= number_to_currency @order.tax_amount -%></td>
23
+ </tr>
24
+ <tr><th colspan="4"/></tr>
25
+ <tr>
26
+ <th colspan="4"><%= t('Select preferred shipping option') %></th>
27
+ </tr>
28
+ <tr>
29
+ <td class="simple-radios">
30
+ <% @shipping_methods.each do |shipping_method| %>
31
+ <li>
32
+ <%= shipping_radio(shipping_method, @order) %>
33
+ </li>
34
+ <% end%>
35
+ </td>
36
+ </tr>
37
+ <tr>
38
+ <td colspan="3" align="right"><b><%= t('Order Total') %>:</b></td>
39
+ <td id="order_total_cell" align="right"><%= number_to_currency(@order.total + @default_method.calculate_shipping(@order))%></td>
40
+ </tr>
41
+ </table>
42
+ <script type="text/javascript">
43
+ var order_total_without_shipping = <%= @order.total %>;
44
+ </script>
45
+
46
+
@@ -0,0 +1,8 @@
1
+ <%= error_messages_for :shipment %>
2
+ <h1><%= t("Shipment") %></h1>
3
+ <% form_for(:shipment, :url => object_url, :html => { :method => :put }) do |f| %>
4
+ <%= render :partial => "form", :locals => { :f => f } %>
5
+ <div align="right">
6
+ <%= submit_tag t('Continue') %>
7
+ </div>
8
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%=error_messages_for :shipment%>
2
+ <h1><%= t("Shipment")%></h1>
3
+ <% form_for(:shipment, :url => order_shipments_url(@order)) do |f| %>
4
+ <%= render :partial => 'form', :locals => {:f => f} %>
5
+ <div align="right">
6
+ <%= submit_tag t('Continue') %>
7
+ </div>
8
+ <% end %>
@@ -0,0 +1,14 @@
1
+ class CreateShippingMethods < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :shipping_methods do |t|
4
+ t.references :zone
5
+ t.string :shipping_calculator
6
+ t.string :name
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :shipping_methods
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ class CreateShippingCategories < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :shipping_categories do |t|
4
+ t.string :name
5
+ t.timestamps
6
+ end
7
+
8
+ add_column :products, :shipping_category_id, :integer, :default => nil
9
+ end
10
+
11
+ def self.down
12
+ drop_table :shipping_categories
13
+ remove_column :products, :shipping_category_id
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ class CreateShipments < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :shipments do |t|
4
+ t.references :order
5
+ t.references :shipping_method
6
+ t.string :tracking
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :shipments
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ class AddProductDimensions < ActiveRecord::Migration
2
+ def self.up
3
+ change_table :variants do |t|
4
+ t.decimal :weight, :precision => 8, :scale => 2
5
+ t.decimal :height, :precision => 8, :scale => 2
6
+ t.decimal :width, :precision => 8, :scale => 2
7
+ t.decimal :depth, :precision => 8, :scale => 2
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ change_table :variants do |t|
13
+ t.remove :weight
14
+ t.remove :height
15
+ t.remove :width
16
+ t.remove :depth
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,2 @@
1
+ default_shipping:
2
+ name: Default Shipping
@@ -0,0 +1,12 @@
1
+ ups_ground:
2
+ name: UPS Ground
3
+ zone: available_shipping
4
+ shipping_calculator: Spree::FlatRateShipping::Calculator
5
+ ups_two_day:
6
+ name: UPS Two Day
7
+ zone: available_shipping
8
+ shipping_calculator: Spree::FlatRateShipping::Calculator
9
+ ups_one_day:
10
+ name: UPS One Day
11
+ zone: available_shipping
12
+ shipping_calculator: Spree::FlatRateShipping::Calculator
@@ -0,0 +1,8 @@
1
+ usa_member:
2
+ parent: available_shipping
3
+ member_id: 214
4
+ member_type: Country
5
+ canada_member:
6
+ parent: available_shipping
7
+ member_id: 35
8
+ member_type: Country
@@ -0,0 +1,3 @@
1
+ available_shipping:
2
+ name: North America
3
+ description: USA + Canada
@@ -0,0 +1,9 @@
1
+ ext_shipping_shipping_methods: Shipping Methods
2
+ ext_shipping_shipping_methods_description: Manage shipping methods
3
+ ext_shipping_calculator: Calculator
4
+ ext_shipping_new_shipping_method: New Shipping Method
5
+ ext_shipping_editing_shipping_method: Editing Shipping Method
6
+ ext_shipping_shipping_categories: Shipping Categories
7
+ ext_shipping_shipping_categories_description: Manage shipping categories to identify which products can be shipped via which method
8
+ ext_shipping_new_shipping_category: New Shipping Category
9
+ ext_shipping_editing_shipping_category: Editing Shipping Category
@@ -0,0 +1,37 @@
1
+ module Spree #:nodoc:
2
+ module ShippingCalculator
3
+
4
+ # modify the transitions in core - go to shipping after address (instead of cc payment)
5
+ Order.state_machines['state'].states << "shipment"
6
+ Order.state_machines['state'].events['next'].transitions.delete_if { |t| t.options[:to] == "creditcard_payment" && t.options[:from] == "address" }
7
+ Order.state_machines['state'].events['next'].transition(:to => 'shipment', :from => 'address')
8
+ Order.state_machines['state'].events['next'].transition(:to => 'creditcard_payment', :from => 'shipment')
9
+ Order.state_machines['state'].events['previous'].transition(:to => 'address', :from => 'shipment')
10
+ Order.state_machines['state'].after_transition :to => 'shipment', :do => :before_shipment
11
+ Order.state_machines['state'].events['edit'].transition(:to => 'in_progress', :from => 'shipment')
12
+ Order.state_machines['state'].after_transition(:to => 'shipment', :do => lambda {|order| order.update_attribute(:tax_amount, order.calculate_tax)})
13
+
14
+ def shipping_methods
15
+ methods = ShippingMethod.all
16
+ methods.select { |method| method.zone.include?(address) }
17
+ end
18
+
19
+ # collection of available shipping countries
20
+ def shipping_countries
21
+ ShippingMethod.all.collect { |method| method.zone.country_list }.flatten.uniq.sort_by {|item| item.send 'name'}
22
+ end
23
+
24
+ private
25
+ def before_shipment
26
+ # skip this step if there are no shipping methods
27
+ update_attribute(:state, "creditcard_payment") if shipping_methods.empty?
28
+ # automatically calculate shipping if there is only a single shipping method
29
+ if shipping_methods.size == 1
30
+ self.shipments << Shipment.create(:order => self, :shipping_method => shipping_methods.first)
31
+ self.state = "creditcard_payment"
32
+ save
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Spree
2
+ class ShippingError < RuntimeError; end
3
+ end
@@ -0,0 +1,29 @@
1
+ namespace :db do
2
+ desc "Bootstrap your database for Spree."
3
+ task :bootstrap => :environment do
4
+ # load initial database fixtures (in db/sample/*.yml) into the current environment's database
5
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
6
+ Dir.glob(File.join(ShippingExtension.root, "db", 'sample', '*.{yml,csv}')).each do |fixture_file|
7
+ Fixtures.create_fixtures("#{ShippingExtension.root}/db/sample", File.basename(fixture_file, '.*'))
8
+ end
9
+
10
+ end
11
+ end
12
+
13
+ namespace :spree do
14
+ namespace :extensions do
15
+ namespace :shipping do
16
+ desc "Copies public assets of the Shipping to the instance public/ directory."
17
+ task :update => :environment do
18
+ is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
19
+ Dir[ShippingExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
20
+ path = file.sub(ShippingExtension.root, '')
21
+ directory = File.dirname(path)
22
+ puts "Copying #{path}..."
23
+ mkdir_p RAILS_ROOT + directory
24
+ cp file, RAILS_ROOT + path
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end