goca-spree-core 3.1.14.rails.5.0

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.
Files changed (594) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +26 -0
  4. data/Rakefile +15 -0
  5. data/app/assets/images/logo/spree_50.png +0 -0
  6. data/app/assets/images/noimage/large.png +0 -0
  7. data/app/assets/images/noimage/mini.png +0 -0
  8. data/app/assets/images/noimage/product.png +0 -0
  9. data/app/assets/images/noimage/small.png +0 -0
  10. data/app/assets/javascripts/spree.js.coffee.erb +59 -0
  11. data/app/controllers/spree/base_controller.rb +15 -0
  12. data/app/helpers/spree/base_helper.rb +123 -0
  13. data/app/helpers/spree/products_helper.rb +91 -0
  14. data/app/mailers/spree/base_mailer.rb +27 -0
  15. data/app/mailers/spree/order_mailer.rb +17 -0
  16. data/app/mailers/spree/reimbursement_mailer.rb +10 -0
  17. data/app/mailers/spree/shipment_mailer.rb +10 -0
  18. data/app/mailers/spree/test_mailer.rb +8 -0
  19. data/app/models/concerns/spree/adjustment_source.rb +53 -0
  20. data/app/models/concerns/spree/calculated_adjustments.rb +34 -0
  21. data/app/models/concerns/spree/default_price.rb +40 -0
  22. data/app/models/concerns/spree/display_money.rb +32 -0
  23. data/app/models/concerns/spree/named_type.rb +12 -0
  24. data/app/models/concerns/spree/ransackable_attributes.rb +24 -0
  25. data/app/models/concerns/spree/user_address.rb +30 -0
  26. data/app/models/concerns/spree/user_api_authentication.rb +19 -0
  27. data/app/models/concerns/spree/user_methods.rb +57 -0
  28. data/app/models/concerns/spree/user_payment_source.rb +19 -0
  29. data/app/models/concerns/spree/user_reporting.rb +22 -0
  30. data/app/models/concerns/spree/vat_price_calculation.rb +47 -0
  31. data/app/models/friendly_id/slug_decorator.rb +3 -0
  32. data/app/models/spree/ability.rb +80 -0
  33. data/app/models/spree/address.rb +145 -0
  34. data/app/models/spree/adjustable/adjuster/base.rb +25 -0
  35. data/app/models/spree/adjustable/adjuster/promotion.rb +41 -0
  36. data/app/models/spree/adjustable/adjuster/tax.rb +26 -0
  37. data/app/models/spree/adjustable/adjustments_updater.rb +47 -0
  38. data/app/models/spree/adjustable/promotion_accumulator.rb +75 -0
  39. data/app/models/spree/adjustment.rb +104 -0
  40. data/app/models/spree/app_configuration.rb +74 -0
  41. data/app/models/spree/asset.rb +6 -0
  42. data/app/models/spree/base.rb +24 -0
  43. data/app/models/spree/calculator/default_tax.rb +59 -0
  44. data/app/models/spree/calculator/flat_percent_item_total.rb +22 -0
  45. data/app/models/spree/calculator/flat_rate.rb +20 -0
  46. data/app/models/spree/calculator/flexi_rate.rb +33 -0
  47. data/app/models/spree/calculator/free_shipping.rb +22 -0
  48. data/app/models/spree/calculator/percent_on_line_item.rb +15 -0
  49. data/app/models/spree/calculator/percent_per_item.rb +50 -0
  50. data/app/models/spree/calculator/price_sack.rb +29 -0
  51. data/app/models/spree/calculator/returns/default_refund_amount.rb +36 -0
  52. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +22 -0
  53. data/app/models/spree/calculator/shipping/flat_rate.rb +18 -0
  54. data/app/models/spree/calculator/shipping/flexi_rate.rb +35 -0
  55. data/app/models/spree/calculator/shipping/per_item.rb +22 -0
  56. data/app/models/spree/calculator/shipping/price_sack.rb +28 -0
  57. data/app/models/spree/calculator/tiered_flat_rate.rb +37 -0
  58. data/app/models/spree/calculator/tiered_percent.rb +44 -0
  59. data/app/models/spree/calculator.rb +47 -0
  60. data/app/models/spree/classification.rb +15 -0
  61. data/app/models/spree/country.rb +40 -0
  62. data/app/models/spree/credit_card.rb +166 -0
  63. data/app/models/spree/customer_return.rb +67 -0
  64. data/app/models/spree/exchange.rb +46 -0
  65. data/app/models/spree/gateway/bogus.rb +91 -0
  66. data/app/models/spree/gateway/bogus_simple.rb +26 -0
  67. data/app/models/spree/gateway.rb +80 -0
  68. data/app/models/spree/image.rb +43 -0
  69. data/app/models/spree/inventory_unit.rb +105 -0
  70. data/app/models/spree/legacy_user.rb +13 -0
  71. data/app/models/spree/line_item.rb +158 -0
  72. data/app/models/spree/log_entry.rb +17 -0
  73. data/app/models/spree/option_type.rb +32 -0
  74. data/app/models/spree/option_type_prototype.rb +9 -0
  75. data/app/models/spree/option_value.rb +26 -0
  76. data/app/models/spree/option_value_variant.rb +6 -0
  77. data/app/models/spree/order/checkout.rb +336 -0
  78. data/app/models/spree/order/currency_updater.rb +40 -0
  79. data/app/models/spree/order/payments.rb +66 -0
  80. data/app/models/spree/order/store_credit.rb +96 -0
  81. data/app/models/spree/order.rb +685 -0
  82. data/app/models/spree/order_contents.rb +120 -0
  83. data/app/models/spree/order_inventory.rb +103 -0
  84. data/app/models/spree/order_merger.rb +65 -0
  85. data/app/models/spree/order_promotion.rb +6 -0
  86. data/app/models/spree/order_updater.rb +177 -0
  87. data/app/models/spree/payment/gateway_options.rb +90 -0
  88. data/app/models/spree/payment/processing.rb +175 -0
  89. data/app/models/spree/payment.rb +276 -0
  90. data/app/models/spree/payment_capture_event.rb +9 -0
  91. data/app/models/spree/payment_method/check.rb +43 -0
  92. data/app/models/spree/payment_method/store_credit.rb +130 -0
  93. data/app/models/spree/payment_method.rb +71 -0
  94. data/app/models/spree/preference.rb +5 -0
  95. data/app/models/spree/preferences/configuration.rb +71 -0
  96. data/app/models/spree/preferences/preferable.rb +133 -0
  97. data/app/models/spree/preferences/preferable_class_methods.rb +51 -0
  98. data/app/models/spree/preferences/scoped_store.rb +33 -0
  99. data/app/models/spree/preferences/store.rb +98 -0
  100. data/app/models/spree/price.rb +53 -0
  101. data/app/models/spree/product/scopes.rb +271 -0
  102. data/app/models/spree/product.rb +384 -0
  103. data/app/models/spree/product_option_type.rb +12 -0
  104. data/app/models/spree/product_promotion_rule.rb +9 -0
  105. data/app/models/spree/product_property.rb +28 -0
  106. data/app/models/spree/promotion/actions/create_adjustment.rb +21 -0
  107. data/app/models/spree/promotion/actions/create_item_adjustments.rb +24 -0
  108. data/app/models/spree/promotion/actions/create_line_items.rb +62 -0
  109. data/app/models/spree/promotion/actions/free_shipping.rb +18 -0
  110. data/app/models/spree/promotion/rules/first_order.rb +37 -0
  111. data/app/models/spree/promotion/rules/item_total.rb +61 -0
  112. data/app/models/spree/promotion/rules/one_use_per_user.rb +24 -0
  113. data/app/models/spree/promotion/rules/option_value.rb +50 -0
  114. data/app/models/spree/promotion/rules/product.rb +65 -0
  115. data/app/models/spree/promotion/rules/taxon.rb +70 -0
  116. data/app/models/spree/promotion/rules/user.rb +30 -0
  117. data/app/models/spree/promotion/rules/user_logged_in.rb +18 -0
  118. data/app/models/spree/promotion.rb +198 -0
  119. data/app/models/spree/promotion_action.rb +25 -0
  120. data/app/models/spree/promotion_action_line_item.rb +6 -0
  121. data/app/models/spree/promotion_category.rb +6 -0
  122. data/app/models/spree/promotion_handler/cart.rb +51 -0
  123. data/app/models/spree/promotion_handler/coupon.rb +107 -0
  124. data/app/models/spree/promotion_handler/free_shipping.rb +33 -0
  125. data/app/models/spree/promotion_handler/page.rb +24 -0
  126. data/app/models/spree/promotion_rule.rb +43 -0
  127. data/app/models/spree/promotion_rule_taxon.rb +9 -0
  128. data/app/models/spree/promotion_rule_user.rb +9 -0
  129. data/app/models/spree/property.rb +23 -0
  130. data/app/models/spree/property_prototype.rb +9 -0
  131. data/app/models/spree/prototype.rb +14 -0
  132. data/app/models/spree/prototype_taxon.rb +9 -0
  133. data/app/models/spree/refund.rb +89 -0
  134. data/app/models/spree/refund_reason.rb +13 -0
  135. data/app/models/spree/reimbursement/credit.rb +25 -0
  136. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +56 -0
  137. data/app/models/spree/reimbursement/reimbursement_type_validator.rb +15 -0
  138. data/app/models/spree/reimbursement.rb +164 -0
  139. data/app/models/spree/reimbursement_performer.rb +43 -0
  140. data/app/models/spree/reimbursement_tax_calculator.rb +44 -0
  141. data/app/models/spree/reimbursement_type/credit.rb +13 -0
  142. data/app/models/spree/reimbursement_type/exchange.rb +9 -0
  143. data/app/models/spree/reimbursement_type/original_payment.rb +13 -0
  144. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +67 -0
  145. data/app/models/spree/reimbursement_type/store_credit.rb +28 -0
  146. data/app/models/spree/reimbursement_type.rb +16 -0
  147. data/app/models/spree/return_authorization.rb +98 -0
  148. data/app/models/spree/return_authorization_reason.rb +7 -0
  149. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +24 -0
  150. data/app/models/spree/return_item/eligibility_validator/default.rb +30 -0
  151. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +16 -0
  152. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +16 -0
  153. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +16 -0
  154. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +17 -0
  155. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +16 -0
  156. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +34 -0
  157. data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +9 -0
  158. data/app/models/spree/return_item.rb +236 -0
  159. data/app/models/spree/returns_calculator.rb +8 -0
  160. data/app/models/spree/role.rb +8 -0
  161. data/app/models/spree/role_user.rb +6 -0
  162. data/app/models/spree/shipment.rb +419 -0
  163. data/app/models/spree/shipment_handler.rb +43 -0
  164. data/app/models/spree/shipping_calculator.rb +22 -0
  165. data/app/models/spree/shipping_category.rb +11 -0
  166. data/app/models/spree/shipping_method.rb +69 -0
  167. data/app/models/spree/shipping_method_category.rb +6 -0
  168. data/app/models/spree/shipping_method_zone.rb +6 -0
  169. data/app/models/spree/shipping_rate.rb +44 -0
  170. data/app/models/spree/state.rb +41 -0
  171. data/app/models/spree/state_change.rb +10 -0
  172. data/app/models/spree/stock/adjuster.rb +27 -0
  173. data/app/models/spree/stock/availability_validator.rb +30 -0
  174. data/app/models/spree/stock/content_item.rb +54 -0
  175. data/app/models/spree/stock/coordinator.rb +65 -0
  176. data/app/models/spree/stock/differentiator.rb +44 -0
  177. data/app/models/spree/stock/estimator.rb +70 -0
  178. data/app/models/spree/stock/inventory_unit_builder.rb +22 -0
  179. data/app/models/spree/stock/package.rb +104 -0
  180. data/app/models/spree/stock/packer.rb +48 -0
  181. data/app/models/spree/stock/prioritizer.rb +47 -0
  182. data/app/models/spree/stock/quantifier.rb +29 -0
  183. data/app/models/spree/stock/splitter/backordered.rb +23 -0
  184. data/app/models/spree/stock/splitter/base.rb +28 -0
  185. data/app/models/spree/stock/splitter/shipping_category.rb +32 -0
  186. data/app/models/spree/stock/splitter/weight.rb +34 -0
  187. data/app/models/spree/stock_item.rb +90 -0
  188. data/app/models/spree/stock_location.rb +115 -0
  189. data/app/models/spree/stock_movement.rb +35 -0
  190. data/app/models/spree/stock_transfer.rb +50 -0
  191. data/app/models/spree/store.rb +48 -0
  192. data/app/models/spree/store_credit.rb +252 -0
  193. data/app/models/spree/store_credit_category.rb +22 -0
  194. data/app/models/spree/store_credit_event.rb +38 -0
  195. data/app/models/spree/store_credit_type.rb +6 -0
  196. data/app/models/spree/tax_category.rb +18 -0
  197. data/app/models/spree/tax_rate.rb +110 -0
  198. data/app/models/spree/taxon.rb +102 -0
  199. data/app/models/spree/taxonomy.rb +24 -0
  200. data/app/models/spree/tracker.rb +19 -0
  201. data/app/models/spree/validations/db_maximum_length_validator.rb +23 -0
  202. data/app/models/spree/variant.rb +312 -0
  203. data/app/models/spree/zone.rb +190 -0
  204. data/app/models/spree/zone_member.rb +12 -0
  205. data/app/validators/db_maximum_length_validator.rb +11 -0
  206. data/app/views/layouts/spree/base_mailer.html.erb +41 -0
  207. data/app/views/spree/admin/orders/customer_details/_autocomplete.js.erb +19 -0
  208. data/app/views/spree/order_mailer/_adjustment.html.erb +8 -0
  209. data/app/views/spree/order_mailer/_subtotal.html.erb +8 -0
  210. data/app/views/spree/order_mailer/_total.html.erb +8 -0
  211. data/app/views/spree/order_mailer/cancel_email.html.erb +30 -0
  212. data/app/views/spree/order_mailer/cancel_email.text.erb +16 -0
  213. data/app/views/spree/order_mailer/confirm_email.html.erb +70 -0
  214. data/app/views/spree/order_mailer/confirm_email.text.erb +38 -0
  215. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +22 -0
  216. data/app/views/spree/shared/_base_mailer_footer.html.erb +20 -0
  217. data/app/views/spree/shared/_base_mailer_header.html.erb +29 -0
  218. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +777 -0
  219. data/app/views/spree/shared/_error_messages.html.erb +11 -0
  220. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  221. data/app/views/spree/shipment_mailer/shipped_email.html.erb +41 -0
  222. data/app/views/spree/shipment_mailer/shipped_email.text.erb +16 -0
  223. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  224. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  225. data/config/initializers/assets.rb +1 -0
  226. data/config/initializers/friendly_id.rb +88 -0
  227. data/config/initializers/premailer_assets.rb +1 -0
  228. data/config/initializers/premailer_rails.rb +3 -0
  229. data/config/initializers/user_class_extensions.rb +10 -0
  230. data/config/locales/en.yml +1499 -0
  231. data/config/routes.rb +8 -0
  232. data/db/default/spree/countries.rb +29 -0
  233. data/db/default/spree/default_reimbursement_type.rb +1 -0
  234. data/db/default/spree/roles.rb +2 -0
  235. data/db/default/spree/states.rb +28 -0
  236. data/db/default/spree/stores.rb +9 -0
  237. data/db/default/spree/zones.rb +11 -0
  238. data/db/migrate/20120831092320_spree_one_two.rb +481 -0
  239. data/db/migrate/20120831092359_spree_promo_one_two.rb +45 -0
  240. data/db/migrate/20120905145253_add_tax_rate_label.rb +5 -0
  241. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +5 -0
  242. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +8 -0
  243. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +5 -0
  244. data/db/migrate/20121010142909_add_states_required_to_countries.rb +5 -0
  245. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +6 -0
  246. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +11 -0
  247. data/db/migrate/20121031162139_split_prices_from_variants.rb +31 -0
  248. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +9 -0
  249. data/db/migrate/20121107184631_add_currency_to_line_items.rb +5 -0
  250. data/db/migrate/20121107194006_add_currency_to_orders.rb +5 -0
  251. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +5 -0
  252. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +5 -0
  253. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +5 -0
  254. data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +5 -0
  255. data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +6 -0
  256. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +9 -0
  257. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +6 -0
  258. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +5 -0
  259. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +9 -0
  260. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +5 -0
  261. data/db/migrate/20130211190146_create_spree_stock_items.rb +14 -0
  262. data/db/migrate/20130211191120_create_spree_stock_locations.rb +11 -0
  263. data/db/migrate/20130213191427_create_default_stock.rb +33 -0
  264. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +5 -0
  265. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +5 -0
  266. data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +5 -0
  267. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +6 -0
  268. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +6 -0
  269. data/db/migrate/20130228210442_create_shipping_method_zone.rb +21 -0
  270. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +5 -0
  271. data/db/migrate/20130301162924_create_shipping_method_categories.rb +13 -0
  272. data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +5 -0
  273. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +24 -0
  274. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +7 -0
  275. data/db/migrate/20130305143310_create_stock_movements.rb +12 -0
  276. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +22 -0
  277. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +5 -0
  278. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +5 -0
  279. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +5 -0
  280. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +8 -0
  281. data/db/migrate/20130319062004_change_orders_total_precision.rb +8 -0
  282. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +7 -0
  283. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +7 -0
  284. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +7 -0
  285. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +7 -0
  286. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +15 -0
  287. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +9 -0
  288. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +5 -0
  289. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +15 -0
  290. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +9 -0
  291. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +14 -0
  292. data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +5 -0
  293. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +13 -0
  294. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +5 -0
  295. data/db/migrate/20130417120035_update_adjustment_states.rb +16 -0
  296. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +15 -0
  297. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +14 -0
  298. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +5 -0
  299. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +5 -0
  300. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +23 -0
  301. data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +5 -0
  302. data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +5 -0
  303. data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +5 -0
  304. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +5 -0
  305. data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +5 -0
  306. data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +9 -0
  307. data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +9 -0
  308. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +6 -0
  309. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +5 -0
  310. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +7 -0
  311. data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +5 -0
  312. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +6 -0
  313. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +5 -0
  314. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +6 -0
  315. data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +5 -0
  316. data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +5 -0
  317. data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +5 -0
  318. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +10 -0
  319. data/db/migrate/20130806022521_drop_spree_mail_methods.rb +12 -0
  320. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +8 -0
  321. data/db/migrate/20130807024301_upgrade_adjustments.rb +40 -0
  322. data/db/migrate/20130807024302_rename_adjustment_fields.rb +14 -0
  323. data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +5 -0
  324. data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +5 -0
  325. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +5 -0
  326. data/db/migrate/20130813140619_expand_order_number_size.rb +9 -0
  327. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +5 -0
  328. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +5 -0
  329. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +5 -0
  330. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +16 -0
  331. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +8 -0
  332. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +15 -0
  333. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +19 -0
  334. data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +5 -0
  335. data/db/migrate/20130909115621_change_states_required_for_countries.rb +9 -0
  336. data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +5 -0
  337. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +5 -0
  338. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +7 -0
  339. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +16 -0
  340. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +5 -0
  341. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +6 -0
  342. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +5 -0
  343. data/db/migrate/20131118043959_add_included_to_adjustments.rb +5 -0
  344. data/db/migrate/20131118050234_rename_tax_total_fields.rb +11 -0
  345. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +21 -0
  346. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +5 -0
  347. data/db/migrate/20131127001002_add_position_to_classifications.rb +5 -0
  348. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +8 -0
  349. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +24 -0
  350. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +5 -0
  351. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +8 -0
  352. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +5 -0
  353. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +5 -0
  354. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +6 -0
  355. data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +5 -0
  356. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +6 -0
  357. data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +5 -0
  358. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +5 -0
  359. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +12 -0
  360. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +5 -0
  361. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +11 -0
  362. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +5 -0
  363. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +5 -0
  364. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +6 -0
  365. data/db/migrate/20140213184916_add_more_indexes.rb +13 -0
  366. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +5 -0
  367. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +8 -0
  368. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +13 -0
  369. data/db/migrate/20140309023735_migrate_old_preferences.rb +23 -0
  370. data/db/migrate/20140309024355_create_spree_stores.rb +25 -0
  371. data/db/migrate/20140309033438_create_store_from_preferences.rb +37 -0
  372. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +6 -0
  373. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +8 -0
  374. data/db/migrate/20140331100557_add_additional_store_fields.rb +8 -0
  375. data/db/migrate/20140410141842_add_many_missing_indexes.rb +18 -0
  376. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +66 -0
  377. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +5 -0
  378. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +8 -0
  379. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +5 -0
  380. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +29 -0
  381. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +10 -0
  382. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +6 -0
  383. data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +6 -0
  384. data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +5 -0
  385. data/db/migrate/20140625214618_create_spree_refunds.rb +12 -0
  386. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +12 -0
  387. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +5 -0
  388. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +10 -0
  389. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +55 -0
  390. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +7 -0
  391. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +5 -0
  392. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +28 -0
  393. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +14 -0
  394. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +5 -0
  395. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +11 -0
  396. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +9 -0
  397. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +6 -0
  398. data/db/migrate/20140717155155_create_default_refund_reason.rb +9 -0
  399. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +7 -0
  400. data/db/migrate/20140718133010_create_spree_customer_returns.rb +9 -0
  401. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +6 -0
  402. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +15 -0
  403. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +5 -0
  404. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +13 -0
  405. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +15 -0
  406. data/db/migrate/20140725131539_create_spree_reimbursements.rb +21 -0
  407. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +5 -0
  408. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +7 -0
  409. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +5 -0
  410. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +20 -0
  411. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +10 -0
  412. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +5 -0
  413. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +10 -0
  414. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +9 -0
  415. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +10 -0
  416. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +7 -0
  417. data/db/migrate/20140911173301_add_kind_to_zone.rb +11 -0
  418. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +5 -0
  419. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +6 -0
  420. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +5 -0
  421. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +6 -0
  422. data/db/migrate/20141009204607_add_store_id_to_orders.rb +8 -0
  423. data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +8 -0
  424. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +5 -0
  425. data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +13 -0
  426. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +13 -0
  427. data/db/migrate/20141105213646_update_classifications_positions.rb +9 -0
  428. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +5 -0
  429. data/db/migrate/20141215232040_remove_token_permissions_table.rb +6 -0
  430. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +5 -0
  431. data/db/migrate/20141217215630_update_product_slug_index.rb +6 -0
  432. data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +5 -0
  433. data/db/migrate/20150118210639_create_spree_store_credits.rb +24 -0
  434. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +8 -0
  435. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +17 -0
  436. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +10 -0
  437. data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +6 -0
  438. data/db/migrate/20150122145607_add_resellable_to_return_items.rb +5 -0
  439. data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +5 -0
  440. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +6 -0
  441. data/db/migrate/20150128060325_remove_spree_configurations.rb +16 -0
  442. data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +13 -0
  443. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +9 -0
  444. data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +67 -0
  445. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
  446. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +14 -0
  447. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +70 -0
  448. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +5 -0
  449. data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +6 -0
  450. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +16 -0
  451. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
  452. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
  453. data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +6 -0
  454. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +12 -0
  455. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
  456. data/db/migrate/20150727191614_spree_store_credit_types.rb +11 -0
  457. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
  458. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +13 -0
  459. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
  460. data/db/migrate/20160219165458_add_indexes.rb +14 -0
  461. data/db/seeds.rb +5 -0
  462. data/lib/generators/spree/custom_user/custom_user_generator.rb +56 -0
  463. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +36 -0
  464. data/lib/generators/spree/custom_user/templates/initializer.rb.tt +1 -0
  465. data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -0
  466. data/lib/generators/spree/dummy/dummy_generator.rb +140 -0
  467. data/lib/generators/spree/dummy/templates/initializers/custom_user.rb +1 -0
  468. data/lib/generators/spree/dummy/templates/initializers/devise.rb +3 -0
  469. data/lib/generators/spree/dummy/templates/rails/application.rb +10 -0
  470. data/lib/generators/spree/dummy/templates/rails/boot.rb +6 -0
  471. data/lib/generators/spree/dummy/templates/rails/database.yml +72 -0
  472. data/lib/generators/spree/dummy/templates/rails/routes.rb +2 -0
  473. data/lib/generators/spree/dummy/templates/rails/script/rails +6 -0
  474. data/lib/generators/spree/dummy/templates/rails/test.rb +35 -0
  475. data/lib/generators/spree/install/install_generator.rb +233 -0
  476. data/lib/generators/spree/install/templates/config/initializers/spree.rb +18 -0
  477. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +17 -0
  478. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +17 -0
  479. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +16 -0
  480. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +16 -0
  481. data/lib/spree/core/controller_helpers/auth.rb +84 -0
  482. data/lib/spree/core/controller_helpers/common.rb +74 -0
  483. data/lib/spree/core/controller_helpers/order.rb +103 -0
  484. data/lib/spree/core/controller_helpers/respond_with.rb +65 -0
  485. data/lib/spree/core/controller_helpers/search.rb +14 -0
  486. data/lib/spree/core/controller_helpers/store.rb +51 -0
  487. data/lib/spree/core/controller_helpers/strong_parameters.rb +42 -0
  488. data/lib/spree/core/delegate_belongs_to.rb +95 -0
  489. data/lib/spree/core/engine.rb +134 -0
  490. data/lib/spree/core/environment/calculators.rb +12 -0
  491. data/lib/spree/core/environment.rb +15 -0
  492. data/lib/spree/core/environment_extension.rb +25 -0
  493. data/lib/spree/core/importer/order.rb +284 -0
  494. data/lib/spree/core/importer/product.rb +62 -0
  495. data/lib/spree/core/importer.rb +9 -0
  496. data/lib/spree/core/number_generator.rb +52 -0
  497. data/lib/spree/core/product_duplicator.rb +74 -0
  498. data/lib/spree/core/product_filters.rb +194 -0
  499. data/lib/spree/core/routes.rb +46 -0
  500. data/lib/spree/core/search/base.rb +102 -0
  501. data/lib/spree/core/token_generator.rb +22 -0
  502. data/lib/spree/core/validators/email.rb +11 -0
  503. data/lib/spree/core/version.rb +5 -0
  504. data/lib/spree/core.rb +96 -0
  505. data/lib/spree/i18n/base.rb +17 -0
  506. data/lib/spree/i18n/initializer.rb +1 -0
  507. data/lib/spree/i18n.rb +37 -0
  508. data/lib/spree/localized_number.rb +22 -0
  509. data/lib/spree/migrations.rb +77 -0
  510. data/lib/spree/money.rb +61 -0
  511. data/lib/spree/permitted_attributes.rb +115 -0
  512. data/lib/spree/promo/environment.rb +9 -0
  513. data/lib/spree/responder.rb +45 -0
  514. data/lib/spree/testing_support/ability_helpers.rb +105 -0
  515. data/lib/spree/testing_support/authorization_helpers.rb +63 -0
  516. data/lib/spree/testing_support/bar_ability.rb +14 -0
  517. data/lib/spree/testing_support/caching.rb +47 -0
  518. data/lib/spree/testing_support/capybara_ext.rb +179 -0
  519. data/lib/spree/testing_support/common_rake.rb +39 -0
  520. data/lib/spree/testing_support/controller_requests.rb +93 -0
  521. data/lib/spree/testing_support/extension_rake.rb +10 -0
  522. data/lib/spree/testing_support/factories/address_factory.rb +22 -0
  523. data/lib/spree/testing_support/factories/adjustment_factory.rb +26 -0
  524. data/lib/spree/testing_support/factories/calculator_factory.rb +20 -0
  525. data/lib/spree/testing_support/factories/country_factory.rb +9 -0
  526. data/lib/spree/testing_support/factories/credit_card_factory.rb +10 -0
  527. data/lib/spree/testing_support/factories/customer_return_factory.rb +31 -0
  528. data/lib/spree/testing_support/factories/image_factory.rb +5 -0
  529. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +10 -0
  530. data/lib/spree/testing_support/factories/line_item_factory.rb +12 -0
  531. data/lib/spree/testing_support/factories/options_factory.rb +13 -0
  532. data/lib/spree/testing_support/factories/order_factory.rb +91 -0
  533. data/lib/spree/testing_support/factories/payment_factory.rb +28 -0
  534. data/lib/spree/testing_support/factories/payment_method_factory.rb +23 -0
  535. data/lib/spree/testing_support/factories/price_factory.rb +7 -0
  536. data/lib/spree/testing_support/factories/product_factory.rb +36 -0
  537. data/lib/spree/testing_support/factories/product_option_type_factory.rb +6 -0
  538. data/lib/spree/testing_support/factories/product_property_factory.rb +6 -0
  539. data/lib/spree/testing_support/factories/promotion_category_factory.rb +6 -0
  540. data/lib/spree/testing_support/factories/promotion_factory.rb +52 -0
  541. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +5 -0
  542. data/lib/spree/testing_support/factories/property_factory.rb +6 -0
  543. data/lib/spree/testing_support/factories/prototype_factory.rb +11 -0
  544. data/lib/spree/testing_support/factories/refund_factory.rb +22 -0
  545. data/lib/spree/testing_support/factories/reimbursement_factory.rb +16 -0
  546. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +7 -0
  547. data/lib/spree/testing_support/factories/return_authorization_factory.rb +20 -0
  548. data/lib/spree/testing_support/factories/return_item_factory.rb +14 -0
  549. data/lib/spree/testing_support/factories/role_factory.rb +9 -0
  550. data/lib/spree/testing_support/factories/shipment_factory.rb +23 -0
  551. data/lib/spree/testing_support/factories/shipping_category_factory.rb +5 -0
  552. data/lib/spree/testing_support/factories/shipping_method_factory.rb +21 -0
  553. data/lib/spree/testing_support/factories/state_factory.rb +13 -0
  554. data/lib/spree/testing_support/factories/stock_factory.rb +31 -0
  555. data/lib/spree/testing_support/factories/stock_item_factory.rb +9 -0
  556. data/lib/spree/testing_support/factories/stock_location_factory.rb +28 -0
  557. data/lib/spree/testing_support/factories/stock_movement_factory.rb +11 -0
  558. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +9 -0
  559. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -0
  560. data/lib/spree/testing_support/factories/store_credit_factory.rb +17 -0
  561. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +11 -0
  562. data/lib/spree/testing_support/factories/store_factory.rb +8 -0
  563. data/lib/spree/testing_support/factories/tax_category_factory.rb +6 -0
  564. data/lib/spree/testing_support/factories/tax_rate_factory.rb +8 -0
  565. data/lib/spree/testing_support/factories/taxon_factory.rb +7 -0
  566. data/lib/spree/testing_support/factories/taxonomy_factory.rb +5 -0
  567. data/lib/spree/testing_support/factories/tracker_factory.rb +6 -0
  568. data/lib/spree/testing_support/factories/user_factory.rb +22 -0
  569. data/lib/spree/testing_support/factories/variant_factory.rb +39 -0
  570. data/lib/spree/testing_support/factories/zone_factory.rb +25 -0
  571. data/lib/spree/testing_support/factories/zone_member_factory.rb +6 -0
  572. data/lib/spree/testing_support/factories.rb +19 -0
  573. data/lib/spree/testing_support/flash.rb +27 -0
  574. data/lib/spree/testing_support/i18n.rb +97 -0
  575. data/lib/spree/testing_support/microdata.rb +189 -0
  576. data/lib/spree/testing_support/order_walkthrough.rb +72 -0
  577. data/lib/spree/testing_support/preferences.rb +31 -0
  578. data/lib/spree/testing_support/url_helpers.rb +9 -0
  579. data/lib/spree_core.rb +1 -0
  580. data/lib/tasks/core.rake +169 -0
  581. data/lib/tasks/email.rake +10 -0
  582. data/lib/tasks/exchanges.rake +70 -0
  583. data/script/rails +9 -0
  584. data/spec/fixtures/microdata.html +22 -0
  585. data/spec/fixtures/microdata_itemref.html +15 -0
  586. data/spec/fixtures/microdata_no_itemscope.html +20 -0
  587. data/spec/fixtures/thinking-cat.jpg +0 -0
  588. data/spree_core.gemspec +47 -0
  589. data/vendor/assets/javascripts/jquery-migrate-1.0.0.js +498 -0
  590. data/vendor/assets/javascripts/jquery.payment.js +652 -0
  591. data/vendor/assets/javascripts/jsuri.js +2 -0
  592. data/vendor/assets/stylesheets/normalize.css +375 -0
  593. data/vendor/assets/stylesheets/skeleton.css +242 -0
  594. metadata +971 -0
@@ -0,0 +1,419 @@
1
+ require 'ostruct'
2
+
3
+ module Spree
4
+ class Shipment < Spree::Base
5
+ include Spree::Core::NumberGenerator.new(prefix: 'H', length: 11)
6
+
7
+ extend FriendlyId
8
+ friendly_id :number, slug_column: :number, use: :slugged
9
+
10
+ with_options inverse_of: :shipments do
11
+ belongs_to :address, class_name: 'Spree::Address'
12
+ belongs_to :order, class_name: 'Spree::Order', touch: true
13
+ end
14
+ belongs_to :stock_location, class_name: 'Spree::StockLocation'
15
+
16
+ with_options dependent: :delete_all do
17
+ has_many :adjustments, as: :adjustable
18
+ has_many :inventory_units, inverse_of: :shipment
19
+ has_many :shipping_rates, -> { order(:cost) }
20
+ has_many :state_changes, as: :stateful
21
+ end
22
+ has_many :shipping_methods, through: :shipping_rates
23
+
24
+ after_save :update_adjustments
25
+
26
+ before_validation :set_cost_zero_when_nil
27
+
28
+ validates :stock_location, presence: true
29
+
30
+ attr_accessor :special_instructions
31
+
32
+ accepts_nested_attributes_for :address
33
+ accepts_nested_attributes_for :inventory_units
34
+
35
+ scope :pending, -> { with_state('pending') }
36
+ scope :ready, -> { with_state('ready') }
37
+ scope :shipped, -> { with_state('shipped') }
38
+ scope :trackable, -> { where("tracking IS NOT NULL AND tracking != ''") }
39
+ scope :with_state, ->(*s) { where(state: s) }
40
+ # sort by most recent shipped_at, falling back to created_at. add "id desc" to make specs that involve this scope more deterministic.
41
+ scope :reverse_chronological, -> { order('coalesce(spree_shipments.shipped_at, spree_shipments.created_at) desc', id: :desc) }
42
+
43
+ # shipment state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
44
+ state_machine initial: :pending, use_transactions: false do
45
+ event :ready do
46
+ transition from: :pending, to: :ready, if: lambda { |shipment|
47
+ # Fix for #2040
48
+ shipment.determine_state(shipment.order) == 'ready'
49
+ }
50
+ end
51
+
52
+ event :pend do
53
+ transition from: :ready, to: :pending
54
+ end
55
+
56
+ event :ship do
57
+ transition from: [:ready, :canceled], to: :shipped
58
+ end
59
+ after_transition to: :shipped, do: :after_ship
60
+
61
+ event :cancel do
62
+ transition to: :canceled, from: [:pending, :ready]
63
+ end
64
+ after_transition to: :canceled, do: :after_cancel
65
+
66
+ event :resume do
67
+ transition from: :canceled, to: :ready, if: lambda { |shipment|
68
+ shipment.determine_state(shipment.order) == 'ready'
69
+ }
70
+ transition from: :canceled, to: :pending
71
+ end
72
+ after_transition from: :canceled, to: [:pending, :ready, :shipped], do: :after_resume
73
+
74
+ after_transition do |shipment, transition|
75
+ shipment.state_changes.create!(
76
+ previous_state: transition.from,
77
+ next_state: transition.to,
78
+ name: 'shipment',
79
+ )
80
+ end
81
+ end
82
+
83
+ self.whitelisted_ransackable_attributes = ['number']
84
+
85
+ extend DisplayMoney
86
+ money_methods :cost, :discounted_cost, :final_price, :item_cost
87
+ alias display_amount display_cost
88
+
89
+ def add_shipping_method(shipping_method, selected = false)
90
+ shipping_rates.create(shipping_method: shipping_method, selected: selected, cost: cost)
91
+ end
92
+
93
+ def after_cancel
94
+ manifest.each { |item| manifest_restock(item) }
95
+ end
96
+
97
+ def after_resume
98
+ manifest.each { |item| manifest_unstock(item) }
99
+ end
100
+
101
+ def backordered?
102
+ inventory_units.any? { |inventory_unit| inventory_unit.backordered? }
103
+ end
104
+
105
+ def currency
106
+ order ? order.currency : Spree::Config[:currency]
107
+ end
108
+
109
+ # Determines the appropriate +state+ according to the following logic:
110
+ #
111
+ # pending unless order is complete and +order.payment_state+ is +paid+
112
+ # shipped if already shipped (ie. does not change the state)
113
+ # ready all other cases
114
+ def determine_state(order)
115
+ return 'canceled' if order.canceled?
116
+ return 'pending' unless order.can_ship?
117
+ return 'pending' if inventory_units.any? &:backordered?
118
+ return 'shipped' if shipped?
119
+ order.paid? || Spree::Config[:auto_capture_on_dispatch] ? 'ready' : 'pending'
120
+ end
121
+
122
+ def discounted_cost
123
+ cost + promo_total
124
+ end
125
+ alias discounted_amount discounted_cost
126
+
127
+ def editable_by?(user)
128
+ !shipped?
129
+ end
130
+
131
+ def final_price
132
+ cost + adjustment_total
133
+ end
134
+
135
+ def final_price_with_items
136
+ item_cost + final_price
137
+ end
138
+
139
+ def finalize!
140
+ InventoryUnit.finalize_units!(inventory_units)
141
+ after_resume
142
+ end
143
+
144
+ def include?(variant)
145
+ inventory_units_for(variant).present?
146
+ end
147
+
148
+ def inventory_units_for(variant)
149
+ inventory_units.where(variant_id: variant.id)
150
+ end
151
+
152
+ def inventory_units_for_item(line_item, variant = nil)
153
+ inventory_units.where(line_item_id: line_item.id, variant_id: line_item.variant.id || variant.id)
154
+ end
155
+
156
+ def item_cost
157
+ manifest.map { |m| (m.line_item.price + (m.line_item.adjustment_total / m.line_item.quantity)) * m.quantity }.sum
158
+ end
159
+
160
+ def line_items
161
+ inventory_units.includes(:line_item).map(&:line_item).uniq
162
+ end
163
+
164
+ ManifestItem = Struct.new(:line_item, :variant, :quantity, :states)
165
+
166
+ def manifest
167
+ # Grouping by the ID means that we don't have to call out to the association accessor
168
+ # This makes the grouping by faster because it results in less SQL cache hits.
169
+ inventory_units.group_by(&:variant_id).map do |variant_id, units|
170
+ units.group_by(&:line_item_id).map do |line_item_id, units|
171
+
172
+ states = {}
173
+ units.group_by(&:state).each { |state, iu| states[state] = iu.size }
174
+
175
+ line_item = units.first.line_item
176
+ variant = units.first.variant
177
+ ManifestItem.new(line_item, variant, units.length, states)
178
+ end
179
+ end.flatten
180
+ end
181
+
182
+ def process_order_payments
183
+ pending_payments = order.pending_payments
184
+ .sort_by(&:uncaptured_amount).reverse
185
+
186
+ shipment_to_pay = final_price_with_items
187
+ payments_amount = 0
188
+
189
+ payments_pool = pending_payments.each_with_object([]) do |payment, pool|
190
+ break if payments_amount >= shipment_to_pay
191
+ payments_amount += payment.uncaptured_amount
192
+ pool << payment
193
+ end
194
+
195
+ payments_pool.each do |payment|
196
+ capturable_amount = if payment.amount >= shipment_to_pay
197
+ shipment_to_pay
198
+ else
199
+ payment.amount
200
+ end
201
+
202
+ cents = (capturable_amount * 100).to_i
203
+ payment.capture!(cents)
204
+ shipment_to_pay -= capturable_amount
205
+ end
206
+ end
207
+
208
+ def ready_or_pending?
209
+ self.ready? || self.pending?
210
+ end
211
+
212
+ def refresh_rates(shipping_method_filter = ShippingMethod::DISPLAY_ON_FRONT_END)
213
+ return shipping_rates if shipped?
214
+ return [] unless can_get_rates?
215
+
216
+ # StockEstimator.new assigment below will replace the current shipping_method
217
+ original_shipping_method_id = shipping_method.try(:id)
218
+
219
+ self.shipping_rates = Stock::Estimator.new(order).
220
+ shipping_rates(to_package, shipping_method_filter)
221
+
222
+ if shipping_method
223
+ selected_rate = shipping_rates.detect { |rate|
224
+ rate.shipping_method_id == original_shipping_method_id
225
+ }
226
+ self.selected_shipping_rate_id = selected_rate.id if selected_rate
227
+ end
228
+
229
+ shipping_rates
230
+ end
231
+
232
+ def selected_shipping_rate
233
+ shipping_rates.where(selected: true).first
234
+ end
235
+
236
+ def selected_shipping_rate_id
237
+ selected_shipping_rate.try(:id)
238
+ end
239
+
240
+ def selected_shipping_rate_id=(id)
241
+ shipping_rates.update_all(selected: false)
242
+ shipping_rates.update(id, selected: true)
243
+ self.save!
244
+ end
245
+
246
+ def set_up_inventory(state, variant, order, line_item)
247
+ self.inventory_units.create(
248
+ state: state,
249
+ variant_id: variant.id,
250
+ order_id: order.id,
251
+ line_item_id: line_item.id
252
+ )
253
+ end
254
+
255
+ def shipped=(value)
256
+ return unless value == '1' && shipped_at.nil?
257
+ self.shipped_at = Time.current
258
+ end
259
+
260
+ def shipping_method
261
+ selected_shipping_rate.try(:shipping_method) || shipping_rates.first.try(:shipping_method)
262
+ end
263
+
264
+ def tax_category
265
+ selected_shipping_rate.try(:tax_rate).try(:tax_category)
266
+ end
267
+
268
+ # Only one of either included_tax_total or additional_tax_total is set
269
+ # This method returns the total of the two. Saves having to check if
270
+ # tax is included or additional.
271
+ def tax_total
272
+ included_tax_total + additional_tax_total
273
+ end
274
+
275
+ def to_package
276
+ package = Stock::Package.new(stock_location)
277
+ inventory_units.includes(:variant).joins(:variant).group_by(&:state).each do |state, state_inventory_units|
278
+ package.add_multiple state_inventory_units, state.to_sym
279
+ end
280
+ package
281
+ end
282
+
283
+ def tracking_url
284
+ @tracking_url ||= shipping_method.build_tracking_url(tracking)
285
+ end
286
+
287
+ def update_amounts
288
+ if selected_shipping_rate
289
+ self.update_columns(
290
+ cost: selected_shipping_rate.cost,
291
+ adjustment_total: adjustments.additional.map(&:update!).compact.sum,
292
+ updated_at: Time.current,
293
+ )
294
+ end
295
+ end
296
+
297
+ # Update Shipment and make sure Order states follow the shipment changes
298
+ def update_attributes_and_order(params = {})
299
+ if self.update_attributes params
300
+ if params.has_key? :selected_shipping_rate_id
301
+ # Changing the selected Shipping Rate won't update the cost (for now)
302
+ # so we persist the Shipment#cost before calculating order shipment
303
+ # total and updating payment state (given a change in shipment cost
304
+ # might change the Order#payment_state)
305
+ self.update_amounts
306
+
307
+ order.updater.update_shipment_total
308
+ order.updater.update_payment_state
309
+
310
+ # Update shipment state only after order total is updated because it
311
+ # (via Order#paid?) affects the shipment state (YAY)
312
+ self.update_columns(
313
+ state: determine_state(order),
314
+ updated_at: Time.current
315
+ )
316
+
317
+ # And then it's time to update shipment states and finally persist
318
+ # order changes
319
+ order.updater.update_shipment_state
320
+ order.updater.persist_totals
321
+ end
322
+
323
+ true
324
+ end
325
+ end
326
+
327
+ # Updates various aspects of the Shipment while bypassing any callbacks. Note that this method takes an explicit reference to the
328
+ # Order object. This is necessary because the association actually has a stale (and unsaved) copy of the Order and so it will not
329
+ # yield the correct results.
330
+ def update!(order)
331
+ old_state = state
332
+ new_state = determine_state(order)
333
+ update_columns(
334
+ state: new_state,
335
+ updated_at: Time.current,
336
+ )
337
+ after_ship if new_state == 'shipped' and old_state != 'shipped'
338
+ end
339
+
340
+ def transfer_to_location(variant, quantity, stock_location)
341
+ if quantity <= 0
342
+ raise ArgumentError
343
+ end
344
+
345
+ transaction do
346
+ new_shipment = order.shipments.create!(stock_location: stock_location)
347
+
348
+ order.contents.remove(variant, quantity, {shipment: self})
349
+ order.contents.add(variant, quantity, {shipment: new_shipment})
350
+
351
+ refresh_rates
352
+ save!
353
+ new_shipment.save!
354
+ end
355
+ end
356
+
357
+ def transfer_to_shipment(variant, quantity, shipment_to_transfer_to)
358
+ quantity_already_shipment_to_transfer_to = shipment_to_transfer_to.manifest.find{|mi| mi.line_item.variant == variant}.try(:quantity) || 0
359
+ final_quantity = quantity + quantity_already_shipment_to_transfer_to
360
+
361
+ if (quantity <= 0 || self == shipment_to_transfer_to)
362
+ raise ArgumentError
363
+ end
364
+
365
+ transaction do
366
+ order.contents.remove(variant, quantity, {shipment: self})
367
+ order.contents.add(variant, quantity, {shipment: shipment_to_transfer_to})
368
+
369
+ refresh_rates
370
+ save!
371
+ shipment_to_transfer_to.refresh_rates
372
+ shipment_to_transfer_to.save!
373
+ end
374
+ end
375
+
376
+ private
377
+
378
+ def after_ship
379
+ ShipmentHandler.factory(self).perform
380
+ end
381
+
382
+ def can_get_rates?
383
+ order.ship_address && order.ship_address.valid?
384
+ end
385
+
386
+ def manifest_restock(item)
387
+ if item.states["on_hand"].to_i > 0
388
+ stock_location.restock item.variant, item.states["on_hand"], self
389
+ end
390
+
391
+ if item.states["backordered"].to_i > 0
392
+ stock_location.restock_backordered item.variant, item.states["backordered"]
393
+ end
394
+ end
395
+
396
+ def manifest_unstock(item)
397
+ stock_location.unstock item.variant, item.quantity, self
398
+ end
399
+
400
+ def recalculate_adjustments
401
+ Adjustable::AdjustmentsUpdater.update(self)
402
+ end
403
+
404
+ def send_shipped_email
405
+ ShipmentMailer.shipped_email(id).deliver_later
406
+ end
407
+
408
+ def set_cost_zero_when_nil
409
+ self.cost = 0 unless self.cost
410
+ end
411
+
412
+ def update_adjustments
413
+ if cost_changed? && state != 'shipped'
414
+ recalculate_adjustments
415
+ end
416
+ end
417
+
418
+ end
419
+ end
@@ -0,0 +1,43 @@
1
+ module Spree
2
+ class ShipmentHandler
3
+ class << self
4
+ def factory(shipment)
5
+ # Do we have a specialized shipping-method-specific handler? e.g:
6
+ # Given shipment.shipping_method = Spree::ShippingMethod::DigitalDownload
7
+ # do we have Spree::ShipmentHandler::DigitalDownload?
8
+ if sm_handler = "Spree::ShipmentHandler::#{shipment.shipping_method.name.split('::').last}".safe_constantize
9
+ sm_handler.new(shipment)
10
+ else
11
+ new(shipment)
12
+ end
13
+ end
14
+ end
15
+
16
+ def initialize(shipment)
17
+ @shipment = shipment
18
+ end
19
+
20
+ def perform
21
+ @shipment.inventory_units.each &:ship!
22
+ @shipment.process_order_payments if Spree::Config[:auto_capture_on_dispatch]
23
+ @shipment.touch :shipped_at
24
+ update_order_shipment_state
25
+ send_shipped_email
26
+ end
27
+
28
+ private
29
+ def send_shipped_email
30
+ ShipmentMailer.shipped_email(@shipment.id).deliver_later
31
+ end
32
+
33
+ def update_order_shipment_state
34
+ order = @shipment.order
35
+
36
+ new_state = OrderUpdater.new(order).update_shipment_state
37
+ order.update_columns(
38
+ shipment_state: new_state,
39
+ updated_at: Time.current,
40
+ )
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,22 @@
1
+ module Spree
2
+ class ShippingCalculator < Calculator
3
+
4
+ def compute_shipment(shipment)
5
+ raise NotImplementedError, "Please implement 'compute_shipment(shipment)' in your calculator: #{self.class.name}"
6
+ end
7
+
8
+ def compute_package(package)
9
+ raise NotImplementedError, "Please implement 'compute_package(package)' in your calculator: #{self.class.name}"
10
+ end
11
+
12
+ def available?(package)
13
+ true
14
+ end
15
+
16
+ private
17
+ def total(content_items)
18
+ content_items.map(&:amount).sum
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ class ShippingCategory < Spree::Base
3
+ validates :name, presence: true, uniqueness: { allow_blank: true }
4
+
5
+ with_options inverse_of: :shipping_category do
6
+ has_many :products
7
+ has_many :shipping_method_categories
8
+ end
9
+ has_many :shipping_methods, through: :shipping_method_categories
10
+ end
11
+ end
@@ -0,0 +1,69 @@
1
+ module Spree
2
+ class ShippingMethod < Spree::Base
3
+ acts_as_paranoid
4
+ include Spree::CalculatedAdjustments
5
+ DISPLAY = [:both, :front_end, :back_end]
6
+
7
+ # Used for #refresh_rates
8
+ DISPLAY_ON_FRONT_AND_BACK_END = 0
9
+ DISPLAY_ON_FRONT_END = 1
10
+ DISPLAY_ON_BACK_END = 2
11
+
12
+ default_scope { where(deleted_at: nil) }
13
+
14
+ has_many :shipping_method_categories, dependent: :destroy
15
+ has_many :shipping_categories, through: :shipping_method_categories
16
+ has_many :shipping_rates, inverse_of: :shipping_method
17
+ has_many :shipments, through: :shipping_rates
18
+
19
+ has_many :shipping_method_zones, class_name: 'Spree::ShippingMethodZone',
20
+ foreign_key: 'shipping_method_id'
21
+ has_many :zones, through: :shipping_method_zones, class_name: 'Spree::Zone'
22
+
23
+ belongs_to :tax_category, class_name: 'Spree::TaxCategory'
24
+
25
+ validates :name, presence: true
26
+
27
+ validate :at_least_one_shipping_category
28
+
29
+ def include?(address)
30
+ return false unless address
31
+ zones.includes(:zone_members).any? do |zone|
32
+ zone.include?(address)
33
+ end
34
+ end
35
+
36
+ def build_tracking_url(tracking)
37
+ return if tracking.blank? || tracking_url.blank?
38
+ tracking_url.gsub(/:tracking/, ERB::Util.url_encode(tracking)) # :url_encode exists in 1.8.7 through 2.1.0
39
+ end
40
+
41
+ def self.calculators
42
+ spree_calculators.send(model_name_without_spree_namespace)
43
+ .select { |c| c.to_s.constantize < Spree::ShippingCalculator }
44
+ end
45
+
46
+ # Some shipping methods are only meant to be set via backend
47
+ def frontend?
48
+ self.display_on != "back_end"
49
+ end
50
+
51
+ def tax_category
52
+ Spree::TaxCategory.unscoped { super }
53
+ end
54
+
55
+ def available_to_display(display_filter)
56
+ display_filter == DISPLAY_ON_FRONT_AND_BACK_END ||
57
+ (frontend? && display_filter == DISPLAY_ON_FRONT_END) ||
58
+ (!frontend? && display_filter == DISPLAY_ON_BACK_END)
59
+ end
60
+
61
+ private
62
+
63
+ def at_least_one_shipping_category
64
+ if shipping_categories.empty?
65
+ errors.add(:base, :required_shipping_category)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class ShippingMethodCategory < Spree::Base
3
+ belongs_to :shipping_method, class_name: 'Spree::ShippingMethod'
4
+ belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :shipping_method_categories
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class ShippingMethodZone < Spree::Base
3
+ belongs_to :shipping_method
4
+ belongs_to :zone
5
+ end
6
+ end
@@ -0,0 +1,44 @@
1
+ module Spree
2
+ class ShippingRate < Spree::Base
3
+ belongs_to :shipment, class_name: 'Spree::Shipment'
4
+ belongs_to :shipping_method, class_name: 'Spree::ShippingMethod', inverse_of: :shipping_rates
5
+ belongs_to :tax_rate, class_name: 'Spree::TaxRate'
6
+
7
+ delegate :order, :currency, to: :shipment
8
+ delegate :name, to: :shipping_method
9
+ delegate :code, to: :shipping_method, prefix: true
10
+
11
+ extend Spree::DisplayMoney
12
+
13
+ money_methods :base_price, :tax_amount
14
+
15
+ def base_price
16
+ cost
17
+ end
18
+
19
+ def display_price
20
+ price = display_base_price.to_s
21
+
22
+ return price if tax_rate.nil? || tax_amount == 0
23
+
24
+ Spree.t tax_rate.included_in_price? ? :including_tax : :excluding_tax,
25
+ scope: "shipping_rates.display_price",
26
+ price: price,
27
+ tax_amount: display_tax_amount,
28
+ tax_rate_name: tax_rate.name
29
+ end
30
+ alias_method :display_cost, :display_price
31
+
32
+ def tax_amount
33
+ @_tax_amount ||= tax_rate.calculator.compute_shipping_rate(self)
34
+ end
35
+
36
+ def shipping_method
37
+ Spree::ShippingMethod.unscoped { super }
38
+ end
39
+
40
+ def tax_rate
41
+ Spree::TaxRate.unscoped { super }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,41 @@
1
+ module Spree
2
+ class State < Spree::Base
3
+ belongs_to :country, class_name: 'Spree::Country'
4
+ has_many :addresses, dependent: :restrict_with_error
5
+
6
+ has_many :zone_members,
7
+ -> { where(zoneable_type: 'Spree::State') },
8
+ class_name: 'Spree::ZoneMember',
9
+ dependent: :destroy,
10
+ foreign_key: :zoneable_id
11
+
12
+ has_many :zones, through: :zone_members, class_name: 'Spree::Zone'
13
+
14
+ validates :country, :name, presence: true
15
+ validates :name, :abbr, uniqueness: { case_sensitive: false, scope: :country_id }, allow_blank: true
16
+
17
+ self.whitelisted_ransackable_attributes = %w(abbr)
18
+
19
+ def self.find_all_by_name_or_abbr(name_or_abbr)
20
+ where('name = ? OR abbr = ?', name_or_abbr, name_or_abbr)
21
+ end
22
+
23
+ # table of { country.id => [ state.id , state.name ] }, arrays sorted by name
24
+ # blank is added elsewhere, if needed
25
+ def self.states_group_by_country_id
26
+ state_info = Hash.new { |h, k| h[k] = [] }
27
+ self.order(:name).each { |state|
28
+ state_info[state.country_id.to_s].push [state.id, state.name]
29
+ }
30
+ state_info
31
+ end
32
+
33
+ def <=>(other)
34
+ name <=> other.name
35
+ end
36
+
37
+ def to_s
38
+ name
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ class StateChange < Spree::Base
3
+ belongs_to :user, class_name: Spree.user_class
4
+ belongs_to :stateful, polymorphic: true
5
+
6
+ def <=>(other)
7
+ created_at <=> other.created_at
8
+ end
9
+ end
10
+ end