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,685 @@
1
+ require 'spree/core/validators/email'
2
+ require 'spree/order/checkout'
3
+
4
+ module Spree
5
+ class Order < Spree::Base
6
+ PAYMENT_STATES = %w(balance_due credit_owed failed paid void)
7
+ SHIPMENT_STATES = %w(backorder canceled partial pending ready shipped)
8
+
9
+ extend FriendlyId
10
+ friendly_id :number, slug_column: :number, use: :slugged
11
+
12
+ include Spree::Order::Checkout
13
+ include Spree::Order::CurrencyUpdater
14
+ include Spree::Order::Payments
15
+ include Spree::Order::StoreCredit
16
+ include Spree::Core::NumberGenerator.new(prefix: 'R')
17
+ include Spree::Core::TokenGenerator
18
+
19
+ extend Spree::DisplayMoney
20
+ money_methods :outstanding_balance, :item_total, :adjustment_total,
21
+ :included_tax_total, :additional_tax_total, :tax_total,
22
+ :shipment_total, :promo_total, :total
23
+
24
+ alias :display_ship_total :display_shipment_total
25
+ alias_attribute :ship_total, :shipment_total
26
+
27
+ MONEY_THRESHOLD = 100_000_000
28
+ MONEY_VALIDATION = {
29
+ presence: true,
30
+ numericality: {
31
+ greater_than: -MONEY_THRESHOLD,
32
+ less_than: MONEY_THRESHOLD,
33
+ allow_blank: true
34
+ },
35
+ format: { with: /\A-?\d+(?:\.\d{1,2})?\z/, allow_blank: true }
36
+ }.freeze
37
+
38
+ POSITIVE_MONEY_VALIDATION = MONEY_VALIDATION.deep_dup.tap do |validation|
39
+ validation.fetch(:numericality)[:greater_than_or_equal_to] = 0
40
+ end.freeze
41
+
42
+ NEGATIVE_MONEY_VALIDATION = MONEY_VALIDATION.deep_dup.tap do |validation|
43
+ validation.fetch(:numericality)[:less_than_or_equal_to] = 0
44
+ end.freeze
45
+
46
+ checkout_flow do
47
+ go_to_state :address
48
+ go_to_state :delivery
49
+ go_to_state :payment, if: ->(order) { order.payment_required? }
50
+ go_to_state :confirm, if: ->(order) { order.confirmation_required? }
51
+ go_to_state :complete
52
+ remove_transition from: :delivery, to: :confirm
53
+ end
54
+
55
+ self.whitelisted_ransackable_associations = %w[shipments user promotions bill_address ship_address line_items]
56
+ self.whitelisted_ransackable_attributes = %w[completed_at email number state payment_state shipment_state total considered_risky]
57
+
58
+ attr_reader :coupon_code
59
+ attr_accessor :temporary_address, :temporary_credit_card
60
+
61
+ if Spree.user_class
62
+ belongs_to :user, class_name: Spree.user_class.to_s
63
+ belongs_to :created_by, class_name: Spree.user_class.to_s
64
+ belongs_to :approver, class_name: Spree.user_class.to_s
65
+ belongs_to :canceler, class_name: Spree.user_class.to_s
66
+ else
67
+ belongs_to :user
68
+ belongs_to :created_by
69
+ belongs_to :approver
70
+ belongs_to :canceler
71
+ end
72
+
73
+ belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
74
+ alias_attribute :billing_address, :bill_address
75
+
76
+ belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
77
+ alias_attribute :shipping_address, :ship_address
78
+
79
+ belongs_to :store, class_name: 'Spree::Store'
80
+
81
+ with_options dependent: :destroy do
82
+ has_many :state_changes, as: :stateful
83
+ has_many :line_items, -> { order(:created_at) }, inverse_of: :order
84
+ has_many :payments
85
+ has_many :return_authorizations, inverse_of: :order
86
+ has_many :adjustments, -> { order(:created_at) }, as: :adjustable
87
+ end
88
+ has_many :reimbursements, inverse_of: :order
89
+ has_many :line_item_adjustments, through: :line_items, source: :adjustments
90
+ has_many :shipment_adjustments, through: :shipments, source: :adjustments
91
+ has_many :inventory_units, inverse_of: :order
92
+ has_many :products, through: :variants
93
+ has_many :variants, through: :line_items
94
+ has_many :refunds, through: :payments
95
+ has_many :all_adjustments,
96
+ class_name: 'Spree::Adjustment',
97
+ foreign_key: :order_id,
98
+ dependent: :destroy,
99
+ inverse_of: :order
100
+
101
+ has_many :order_promotions, class_name: 'Spree::OrderPromotion'
102
+ has_many :promotions, through: :order_promotions, class_name: 'Spree::Promotion'
103
+
104
+ has_many :shipments, dependent: :destroy, inverse_of: :order do
105
+ def states
106
+ pluck(:state).uniq
107
+ end
108
+ end
109
+
110
+ accepts_nested_attributes_for :line_items
111
+ accepts_nested_attributes_for :bill_address
112
+ accepts_nested_attributes_for :ship_address
113
+ accepts_nested_attributes_for :payments
114
+ accepts_nested_attributes_for :shipments
115
+
116
+ # Needs to happen before save_permalink is called
117
+ before_validation :set_currency
118
+ before_validation :clone_billing_address, if: :use_billing?
119
+ attr_accessor :use_billing
120
+
121
+ before_create :create_token
122
+ before_create :link_by_email
123
+ before_update :homogenize_line_item_currencies, if: :currency_changed?
124
+
125
+ with_options presence: true do
126
+ validates :number, length: { maximum: 32, allow_blank: true }, uniqueness: { allow_blank: true }
127
+ validates :email, length: { maximum: 254, allow_blank: true }, email: { allow_blank: true }, if: :require_email
128
+ validates :item_count, numericality: { greater_than_or_equal_to: 0, less_than: 2**31, only_integer: true, allow_blank: true }
129
+ end
130
+ validates :payment_state, inclusion: { in: PAYMENT_STATES, allow_blank: true }
131
+ validates :shipment_state, inclusion: { in: SHIPMENT_STATES, allow_blank: true }
132
+ validates :item_total, POSITIVE_MONEY_VALIDATION
133
+ validates :adjustment_total, MONEY_VALIDATION
134
+ validates :included_tax_total, POSITIVE_MONEY_VALIDATION
135
+ validates :additional_tax_total, POSITIVE_MONEY_VALIDATION
136
+ validates :payment_total, MONEY_VALIDATION
137
+ validates :shipment_total, MONEY_VALIDATION
138
+ validates :promo_total, NEGATIVE_MONEY_VALIDATION
139
+ validates :total, MONEY_VALIDATION
140
+
141
+ delegate :update_totals, :persist_totals, to: :updater
142
+ delegate :merge!, to: :merger
143
+ delegate :firstname, :lastname, to: :bill_address, prefix: true, allow_nil: true
144
+
145
+ class_attribute :update_hooks
146
+ self.update_hooks = Set.new
147
+
148
+ class_attribute :line_item_comparison_hooks
149
+ self.line_item_comparison_hooks = Set.new
150
+
151
+ scope :created_between, ->(start_date, end_date) { where(created_at: start_date..end_date) }
152
+ scope :completed_between, ->(start_date, end_date) { where(completed_at: start_date..end_date) }
153
+ scope :complete, -> { where.not(completed_at: nil) }
154
+ scope :incomplete, -> { where(completed_at: nil) }
155
+
156
+ # shows completed orders first, by their completed_at date, then uncompleted orders by their created_at
157
+ scope :reverse_chronological, -> { order('spree_orders.completed_at IS NULL', completed_at: :desc, created_at: :desc) }
158
+
159
+ # Use this method in other gems that wish to register their own custom logic
160
+ # that should be called after Order#update
161
+ def self.register_update_hook(hook)
162
+ self.update_hooks.add(hook)
163
+ end
164
+
165
+ # Use this method in other gems that wish to register their own custom logic
166
+ # that should be called when determining if two line items are equal.
167
+ def self.register_line_item_comparison_hook(hook)
168
+ self.line_item_comparison_hooks.add(hook)
169
+ end
170
+
171
+ # For compatiblity with Calculator::PriceSack
172
+ def amount
173
+ line_items.inject(0.0) { |sum, li| sum + li.amount }
174
+ end
175
+
176
+ # Sum of all line item amounts pre-tax
177
+ def pre_tax_item_amount
178
+ line_items.to_a.sum(&:pre_tax_amount)
179
+ end
180
+
181
+ def currency
182
+ self[:currency] || Spree::Config[:currency]
183
+ end
184
+
185
+ def shipping_discount
186
+ shipment_adjustments.eligible.sum(:amount) * - 1
187
+ end
188
+
189
+ def completed?
190
+ completed_at.present?
191
+ end
192
+
193
+ # Indicates whether or not the user is allowed to proceed to checkout.
194
+ # Currently this is implemented as a check for whether or not there is at
195
+ # least one LineItem in the Order. Feel free to override this logic in your
196
+ # own application if you require additional steps before allowing a checkout.
197
+ def checkout_allowed?
198
+ line_items.count > 0
199
+ end
200
+
201
+ # Is this a free order in which case the payment step should be skipped
202
+ def payment_required?
203
+ total.to_f > 0.0
204
+ end
205
+
206
+ # If true, causes the confirmation step to happen during the checkout process
207
+ def confirmation_required?
208
+ Spree::Config[:always_include_confirm_step] ||
209
+ payments.valid.map(&:payment_method).compact.any?(&:payment_profiles_supported?) ||
210
+ # Little hacky fix for #4117
211
+ # If this wasn't here, order would transition to address state on confirm failure
212
+ # because there would be no valid payments any more.
213
+ confirm?
214
+ end
215
+
216
+ def backordered?
217
+ shipments.any?(&:backordered?)
218
+ end
219
+
220
+ # Returns the relevant zone (if any) to be used for taxation purposes.
221
+ # Uses default tax zone unless there is a specific match
222
+ def tax_zone
223
+ @tax_zone ||= Zone.match(tax_address) || Zone.default_tax
224
+ end
225
+
226
+ # Returns the address for taxation based on configuration
227
+ def tax_address
228
+ Spree::Config[:tax_using_ship_address] ? ship_address : bill_address
229
+ end
230
+
231
+ def updater
232
+ @updater ||= OrderUpdater.new(self)
233
+ end
234
+
235
+ def update_with_updater!
236
+ updater.update
237
+ end
238
+
239
+ def update!
240
+ warn "`update!` is deprecated as it conflicts with update! method of rails. Use `update_with_updater!` instead."
241
+ update_with_updater!
242
+ end
243
+
244
+ def merger
245
+ @merger ||= Spree::OrderMerger.new(self)
246
+ end
247
+
248
+ def clone_billing_address
249
+ if bill_address and self.ship_address.nil?
250
+ self.ship_address = bill_address.clone
251
+ else
252
+ self.ship_address.attributes = bill_address.attributes.except('id', 'updated_at', 'created_at')
253
+ end
254
+ true
255
+ end
256
+
257
+ def allow_cancel?
258
+ return false if !completed? || canceled?
259
+ shipment_state.nil? || %w{ready backorder pending}.include?(shipment_state)
260
+ end
261
+
262
+ def all_inventory_units_returned?
263
+ inventory_units.all? { |inventory_unit| inventory_unit.returned? }
264
+ end
265
+
266
+ def contents
267
+ @contents ||= Spree::OrderContents.new(self)
268
+ end
269
+
270
+ # Associates the specified user with the order.
271
+ def associate_user!(user, override_email = true)
272
+ self.user = user
273
+ self.email = user.email if override_email
274
+ self.created_by ||= user
275
+ self.bill_address ||= user.bill_address.try(:clone)
276
+ self.ship_address ||= user.ship_address.try(:clone)
277
+
278
+ changes = slice(:user_id, :email, :created_by_id, :bill_address_id, :ship_address_id)
279
+
280
+ # immediately persist the changes we just made, but don't use save
281
+ # since we might have an invalid address associated
282
+ self.class.unscoped.where(id: self).update_all(changes)
283
+ end
284
+
285
+ def quantity_of(variant, options = {})
286
+ line_item = find_line_item_by_variant(variant, options)
287
+ line_item ? line_item.quantity : 0
288
+ end
289
+
290
+ def find_line_item_by_variant(variant, options = {})
291
+ line_items.detect { |line_item|
292
+ line_item.variant_id == variant.id &&
293
+ line_item_options_match(line_item, options)
294
+ }
295
+ end
296
+
297
+ # This method enables extensions to participate in the
298
+ # "Are these line items equal" decision.
299
+ #
300
+ # When adding to cart, an extension would send something like:
301
+ # params[:product_customizations]={...}
302
+ #
303
+ # and would provide:
304
+ #
305
+ # def product_customizations_match
306
+ def line_item_options_match(line_item, options)
307
+ return true unless options
308
+
309
+ self.line_item_comparison_hooks.all? { |hook|
310
+ self.send(hook, line_item, options)
311
+ }
312
+ end
313
+
314
+ # Creates new tax charges if there are any applicable rates. If prices already
315
+ # include taxes then price adjustments are created instead.
316
+ def create_tax_charge!
317
+ Spree::TaxRate.adjust(self, line_items)
318
+ Spree::TaxRate.adjust(self, shipments) if shipments.any?
319
+ end
320
+
321
+ def update_line_item_prices!
322
+ transaction do
323
+ line_items.each(&:update_price)
324
+ save!
325
+ end
326
+ end
327
+
328
+ def outstanding_balance
329
+ if canceled?
330
+ -1 * payment_total
331
+ elsif reimbursements.includes(:refunds).size > 0
332
+ reimbursed = reimbursements.includes(:refunds).inject(0) do |sum, reimbursement|
333
+ sum + reimbursement.refunds.sum(:amount)
334
+ end
335
+ # If reimbursement has happened add it back to total to prevent balance_due payment state
336
+ # See: https://github.com/spree/spree/issues/6229
337
+ total - (payment_total + reimbursed)
338
+ else
339
+ total - payment_total
340
+ end
341
+ end
342
+
343
+ def outstanding_balance?
344
+ self.outstanding_balance != 0
345
+ end
346
+
347
+ def name
348
+ if (address = bill_address || ship_address)
349
+ address.full_name
350
+ end
351
+ end
352
+
353
+ def can_ship?
354
+ self.complete? || self.resumed? || self.awaiting_return? || self.returned?
355
+ end
356
+
357
+ def credit_cards
358
+ credit_card_ids = payments.from_credit_card.pluck(:source_id).uniq
359
+ CreditCard.where(id: credit_card_ids)
360
+ end
361
+
362
+ def valid_credit_cards
363
+ credit_card_ids = payments.from_credit_card.valid.pluck(:source_id).uniq
364
+ CreditCard.where(id: credit_card_ids)
365
+ end
366
+
367
+ # Finalizes an in progress order after checkout is complete.
368
+ # Called after transition to complete state when payments will have been processed
369
+ def finalize!
370
+ # lock all adjustments (coupon promotions, etc.)
371
+ all_adjustments.each{|a| a.close}
372
+
373
+ # update payment and shipment(s) states, and save
374
+ updater.update_payment_state
375
+ shipments.each do |shipment|
376
+ shipment.update!(self)
377
+ shipment.finalize!
378
+ end
379
+
380
+ updater.update_shipment_state
381
+ save!
382
+ updater.run_hooks
383
+
384
+ touch :completed_at
385
+
386
+ deliver_order_confirmation_email unless confirmation_delivered?
387
+
388
+ consider_risk
389
+ end
390
+
391
+ def fulfill!
392
+ shipments.each { |shipment| shipment.update!(self) if shipment.persisted? }
393
+ updater.update_shipment_state
394
+ save!
395
+ end
396
+
397
+ def deliver_order_confirmation_email
398
+ OrderMailer.confirm_email(id).deliver_later
399
+ update_column(:confirmation_delivered, true)
400
+ end
401
+
402
+ # Helper methods for checkout steps
403
+ def paid?
404
+ payment_state == 'paid' || payment_state == 'credit_owed'
405
+ end
406
+
407
+ def available_payment_methods
408
+ @available_payment_methods ||= PaymentMethod.available_on_front_end
409
+ end
410
+
411
+ def insufficient_stock_lines
412
+ line_items.select(&:insufficient_stock?)
413
+ end
414
+
415
+ ##
416
+ # Check to see if any line item variants are discontinued.
417
+ # If so add error and restart checkout.
418
+ def ensure_line_item_variants_are_not_discontinued
419
+ if line_items.any?{ |li| !li.variant || li.variant.discontinued? }
420
+ restart_checkout_flow
421
+ errors.add(:base, Spree.t(:discontinued_variants_present))
422
+ false
423
+ else
424
+ true
425
+ end
426
+ end
427
+
428
+ def ensure_line_items_are_in_stock
429
+ if insufficient_stock_lines.present?
430
+ restart_checkout_flow
431
+ errors.add(:base, Spree.t(:insufficient_stock_lines_present))
432
+ false
433
+ else
434
+ true
435
+ end
436
+ end
437
+
438
+ def empty!
439
+ if completed?
440
+ raise Spree.t(:cannot_empty_completed_order)
441
+ else
442
+ line_items.destroy_all
443
+ updater.update_item_count
444
+ adjustments.destroy_all
445
+ shipments.destroy_all
446
+ state_changes.destroy_all
447
+ order_promotions.destroy_all
448
+
449
+ update_totals
450
+ persist_totals
451
+ restart_checkout_flow
452
+ self
453
+ end
454
+ end
455
+
456
+ def has_step?(step)
457
+ checkout_steps.include?(step)
458
+ end
459
+
460
+ def state_changed(name)
461
+ state = "#{name}_state"
462
+ if persisted?
463
+ old_state = self.send("#{state}_was")
464
+ new_state = self.send(state)
465
+ unless old_state == new_state
466
+ self.state_changes.create(
467
+ previous_state: old_state,
468
+ next_state: new_state,
469
+ name: name,
470
+ user_id: self.user_id
471
+ )
472
+ end
473
+ end
474
+ end
475
+
476
+ def coupon_code=(code)
477
+ @coupon_code = code.strip.downcase rescue nil
478
+ end
479
+
480
+ def can_add_coupon?
481
+ Spree::Promotion.order_activatable?(self)
482
+ end
483
+
484
+
485
+ def shipped?
486
+ %w(partial shipped).include?(shipment_state)
487
+ end
488
+
489
+ def create_proposed_shipments
490
+ all_adjustments.shipping.delete_all
491
+ shipments.destroy_all
492
+ self.shipments = Spree::Stock::Coordinator.new(self).shipments
493
+ end
494
+
495
+ def apply_free_shipping_promotions
496
+ Spree::PromotionHandler::FreeShipping.new(self).activate
497
+ shipments.each { |shipment| Adjustable::AdjustmentsUpdater.update(shipment) }
498
+ updater.update_shipment_total
499
+ persist_totals
500
+ end
501
+
502
+ # Clean shipments and make order back to address state
503
+ #
504
+ # At some point the might need to force the order to transition from address
505
+ # to delivery again so that proper updated shipments are created.
506
+ # e.g. customer goes back from payment step and changes order items
507
+ def ensure_updated_shipments
508
+ if shipments.any? && !self.completed?
509
+ self.shipments.destroy_all
510
+ self.update_column(:shipment_total, 0)
511
+ restart_checkout_flow
512
+ end
513
+ end
514
+
515
+ def restart_checkout_flow
516
+ self.update_columns(
517
+ state: 'cart',
518
+ updated_at: Time.current,
519
+ )
520
+ self.next! if self.line_items.size > 0
521
+ end
522
+
523
+ def refresh_shipment_rates(shipping_method_filter = ShippingMethod::DISPLAY_ON_FRONT_END)
524
+ shipments.map { |s| s.refresh_rates(shipping_method_filter) }
525
+ end
526
+
527
+ def shipping_eq_billing_address?
528
+ (bill_address.empty? && ship_address.empty?) || bill_address.same_as?(ship_address)
529
+ end
530
+
531
+ def set_shipments_cost
532
+ shipments.each(&:update_amounts)
533
+ updater.update_shipment_total
534
+ persist_totals
535
+ end
536
+
537
+ def is_risky?
538
+ payments.risky.size > 0
539
+ end
540
+
541
+ def canceled_by(user)
542
+ self.transaction do
543
+ cancel!
544
+ self.update_columns(
545
+ canceler_id: user.id,
546
+ canceled_at: Time.current,
547
+ )
548
+ end
549
+ end
550
+
551
+ def approved_by(user)
552
+ self.transaction do
553
+ approve!
554
+ self.update_columns(
555
+ approver_id: user.id,
556
+ approved_at: Time.current,
557
+ )
558
+ end
559
+ end
560
+
561
+ def approved?
562
+ !!self.approved_at
563
+ end
564
+
565
+ def can_approve?
566
+ !approved?
567
+ end
568
+
569
+ def consider_risk
570
+ if is_risky? && !approved?
571
+ considered_risky!
572
+ end
573
+ end
574
+
575
+ def considered_risky!
576
+ update_column(:considered_risky, true)
577
+ end
578
+
579
+ def approve!
580
+ update_column(:considered_risky, false)
581
+ end
582
+
583
+ def reload(options=nil)
584
+ remove_instance_variable(:@tax_zone) if defined?(@tax_zone)
585
+ super
586
+ end
587
+
588
+ def tax_total
589
+ included_tax_total + additional_tax_total
590
+ end
591
+
592
+ def quantity
593
+ line_items.sum(:quantity)
594
+ end
595
+
596
+ def has_non_reimbursement_related_refunds?
597
+ refunds.non_reimbursement.exists? ||
598
+ payments.offset_payment.exists? # how old versions of spree stored refunds
599
+ end
600
+
601
+ # determines whether the inventory is fully discounted
602
+ #
603
+ # Returns
604
+ # - true if inventory amount is the exact negative of inventory related adjustments
605
+ # - false otherwise
606
+ def fully_discounted?
607
+ adjustment_total + line_items.map(&:final_amount).sum == 0.0
608
+ end
609
+ alias_method :fully_discounted, :fully_discounted?
610
+
611
+ def payments_attributes=(attributes)
612
+ validate_payments_attributes(attributes)
613
+ super(attributes)
614
+ end
615
+
616
+ def validate_payments_attributes(attributes)
617
+ # Ensure the payment methods specified are allowed for this user
618
+ payment_methods = Spree::PaymentMethod.where(id: available_payment_methods.map(&:id))
619
+ attributes.each do |payment_attributes|
620
+ payment_method_id = payment_attributes[:payment_method_id]
621
+
622
+ # raise RecordNotFound unless it is an allowed payment method
623
+ payment_methods.find(payment_method_id) if payment_method_id
624
+ end
625
+ end
626
+
627
+ private
628
+
629
+ def link_by_email
630
+ self.email = user.email if self.user
631
+ end
632
+
633
+ # Determine if email is required (we don't want validation errors before we hit the checkout)
634
+ def require_email
635
+ true unless new_record? or ['cart', 'address'].include?(state)
636
+ end
637
+
638
+ def ensure_line_items_present
639
+ unless line_items.present?
640
+ errors.add(:base, Spree.t(:there_are_no_items_for_this_order)) and return false
641
+ end
642
+ end
643
+
644
+ def ensure_available_shipping_rates
645
+ if shipments.empty? || shipments.any? { |shipment| shipment.shipping_rates.blank? }
646
+ # After this point, order redirects back to 'address' state and asks user to pick a proper address
647
+ # Therefore, shipments are not necessary at this point.
648
+ shipments.destroy_all
649
+ errors.add(:base, Spree.t(:items_cannot_be_shipped)) and return false
650
+ end
651
+ end
652
+
653
+ def after_cancel
654
+ shipments.each { |shipment| shipment.cancel! }
655
+ payments.completed.each { |payment| payment.cancel! }
656
+
657
+ # Free up authorized store credits
658
+ payments.store_credits.pending.each(&:void!)
659
+
660
+ send_cancel_email
661
+ self.update_with_updater!
662
+ end
663
+
664
+ def send_cancel_email
665
+ OrderMailer.cancel_email(id).deliver_later
666
+ end
667
+
668
+ def after_resume
669
+ shipments.each { |shipment| shipment.resume! }
670
+ consider_risk
671
+ end
672
+
673
+ def use_billing?
674
+ use_billing.in?([true, 'true', '1'])
675
+ end
676
+
677
+ def set_currency
678
+ self.currency = Spree::Config[:currency] if self[:currency].nil?
679
+ end
680
+
681
+ def create_token
682
+ self.guest_token ||= generate_guest_token
683
+ end
684
+ end
685
+ end