solidus_core_devise_token_auth 2.8.0.alpha.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 (815) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/LICENSE +26 -0
  4. data/README.md +69 -0
  5. data/Rakefile +37 -0
  6. data/app/assets/config/solidus_core_manifest.js +1 -0
  7. data/app/assets/images/logo/solidus_logo.png +0 -0
  8. data/app/assets/images/noimage/large.png +0 -0
  9. data/app/assets/images/noimage/mini.png +0 -0
  10. data/app/assets/images/noimage/product.png +0 -0
  11. data/app/assets/images/noimage/small.png +0 -0
  12. data/app/assets/javascripts/spree.js.erb +72 -0
  13. data/app/controllers/spree/base_controller.rb +15 -0
  14. data/app/helpers/spree/base_helper.rb +160 -0
  15. data/app/helpers/spree/checkout_helper.rb +33 -0
  16. data/app/helpers/spree/products_helper.rb +74 -0
  17. data/app/helpers/spree/store_helper.rb +23 -0
  18. data/app/helpers/spree/taxons_helper.rb +22 -0
  19. data/app/jobs/spree/promotion_code_batch_job.rb +26 -0
  20. data/app/mailers/spree/base_mailer.rb +18 -0
  21. data/app/mailers/spree/carton_mailer.rb +29 -0
  22. data/app/mailers/spree/order_mailer.rb +36 -0
  23. data/app/mailers/spree/promotion_code_batch_mailer.rb +15 -0
  24. data/app/mailers/spree/reimbursement_mailer.rb +13 -0
  25. data/app/mailers/spree/test_mailer.rb +11 -0
  26. data/app/models/concerns/spree/adjustment_source.rb +27 -0
  27. data/app/models/concerns/spree/calculated_adjustments.rb +40 -0
  28. data/app/models/concerns/spree/default_price.rb +27 -0
  29. data/app/models/concerns/spree/display_money.rb +34 -0
  30. data/app/models/concerns/spree/named_type.rb +14 -0
  31. data/app/models/concerns/spree/ordered_property_value_list.rb +28 -0
  32. data/app/models/concerns/spree/ransackable_attributes.rb +22 -0
  33. data/app/models/concerns/spree/user_address_book.rb +149 -0
  34. data/app/models/concerns/spree/user_methods.rb +77 -0
  35. data/app/models/concerns/spree/user_payment_source.rb +26 -0
  36. data/app/models/concerns/spree/user_reporting.rb +24 -0
  37. data/app/models/spree/ability.rb +64 -0
  38. data/app/models/spree/address.rb +222 -0
  39. data/app/models/spree/adjustment.rb +168 -0
  40. data/app/models/spree/adjustment_reason.rb +12 -0
  41. data/app/models/spree/asset.rb +8 -0
  42. data/app/models/spree/base.rb +46 -0
  43. data/app/models/spree/billing_integration.rb +23 -0
  44. data/app/models/spree/calculator/default_tax.rb +60 -0
  45. data/app/models/spree/calculator/distributed_amount.rb +33 -0
  46. data/app/models/spree/calculator/flat_percent_item_total.rb +20 -0
  47. data/app/models/spree/calculator/flat_rate.rb +18 -0
  48. data/app/models/spree/calculator/flexi_rate.rb +27 -0
  49. data/app/models/spree/calculator/free_shipping.rb +21 -0
  50. data/app/models/spree/calculator/percent_on_line_item.rb +13 -0
  51. data/app/models/spree/calculator/percent_per_item.rb +49 -0
  52. data/app/models/spree/calculator/price_sack.rb +27 -0
  53. data/app/models/spree/calculator/returns/default_refund_amount.rb +34 -0
  54. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +21 -0
  55. data/app/models/spree/calculator/shipping/flat_rate.rb +17 -0
  56. data/app/models/spree/calculator/shipping/flexi_rate.rb +34 -0
  57. data/app/models/spree/calculator/shipping/per_item.rb +21 -0
  58. data/app/models/spree/calculator/shipping/price_sack.rb +27 -0
  59. data/app/models/spree/calculator/tiered_flat_rate.rb +52 -0
  60. data/app/models/spree/calculator/tiered_percent.rb +61 -0
  61. data/app/models/spree/calculator.rb +49 -0
  62. data/app/models/spree/carton.rb +59 -0
  63. data/app/models/spree/classification.rb +13 -0
  64. data/app/models/spree/country.rb +28 -0
  65. data/app/models/spree/credit_card.rb +197 -0
  66. data/app/models/spree/customer_return.rb +78 -0
  67. data/app/models/spree/distributed_amounts_handler.rb +43 -0
  68. data/app/models/spree/exchange.rb +45 -0
  69. data/app/models/spree/fulfilment_changer.rb +135 -0
  70. data/app/models/spree/gallery/product_gallery.rb +18 -0
  71. data/app/models/spree/gallery/variant_gallery.rb +18 -0
  72. data/app/models/spree/gateway/bogus.rb +13 -0
  73. data/app/models/spree/gateway/bogus_simple.rb +13 -0
  74. data/app/models/spree/gateway.rb +14 -0
  75. data/app/models/spree/image.rb +56 -0
  76. data/app/models/spree/inventory_unit.rb +159 -0
  77. data/app/models/spree/legacy_user.rb +26 -0
  78. data/app/models/spree/line_item.rb +206 -0
  79. data/app/models/spree/line_item_action.rb +8 -0
  80. data/app/models/spree/log_entry.rb +11 -0
  81. data/app/models/spree/option_type.rb +32 -0
  82. data/app/models/spree/option_value.rb +33 -0
  83. data/app/models/spree/option_values_variant.rb +8 -0
  84. data/app/models/spree/order/checkout.rb +243 -0
  85. data/app/models/spree/order/number_generator.rb +45 -0
  86. data/app/models/spree/order/payments.rb +55 -0
  87. data/app/models/spree/order.rb +914 -0
  88. data/app/models/spree/order_cancellations.rb +125 -0
  89. data/app/models/spree/order_capturing.rb +50 -0
  90. data/app/models/spree/order_contents.rb +126 -0
  91. data/app/models/spree/order_inventory.rb +115 -0
  92. data/app/models/spree/order_merger.rb +143 -0
  93. data/app/models/spree/order_mutex.rb +35 -0
  94. data/app/models/spree/order_promotion.rb +27 -0
  95. data/app/models/spree/order_shipping.rb +89 -0
  96. data/app/models/spree/order_taxation.rb +81 -0
  97. data/app/models/spree/order_update_attributes.rb +41 -0
  98. data/app/models/spree/order_updater.rb +271 -0
  99. data/app/models/spree/payment/cancellation.rb +62 -0
  100. data/app/models/spree/payment/processing.rb +225 -0
  101. data/app/models/spree/payment.rb +284 -0
  102. data/app/models/spree/payment_capture_event.rb +11 -0
  103. data/app/models/spree/payment_create.rb +93 -0
  104. data/app/models/spree/payment_method/bogus_credit_card.rb +90 -0
  105. data/app/models/spree/payment_method/check.rb +40 -0
  106. data/app/models/spree/payment_method/credit_card.rb +43 -0
  107. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +26 -0
  108. data/app/models/spree/payment_method/store_credit.rb +122 -0
  109. data/app/models/spree/payment_method.rb +281 -0
  110. data/app/models/spree/payment_source.rb +47 -0
  111. data/app/models/spree/preference.rb +7 -0
  112. data/app/models/spree/price.rb +89 -0
  113. data/app/models/spree/product/scopes.rb +259 -0
  114. data/app/models/spree/product.rb +400 -0
  115. data/app/models/spree/product_option_type.rb +9 -0
  116. data/app/models/spree/product_promotion_rule.rb +8 -0
  117. data/app/models/spree/product_property.rb +14 -0
  118. data/app/models/spree/promotion/actions/create_adjustment.rb +80 -0
  119. data/app/models/spree/promotion/actions/create_item_adjustments.rb +102 -0
  120. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +142 -0
  121. data/app/models/spree/promotion/actions/free_shipping.rb +57 -0
  122. data/app/models/spree/promotion/rules/first_order.rb +40 -0
  123. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +36 -0
  124. data/app/models/spree/promotion/rules/item_total.rb +45 -0
  125. data/app/models/spree/promotion/rules/nth_order.rb +45 -0
  126. data/app/models/spree/promotion/rules/one_use_per_user.rb +25 -0
  127. data/app/models/spree/promotion/rules/option_value.rb +50 -0
  128. data/app/models/spree/promotion/rules/product.rb +74 -0
  129. data/app/models/spree/promotion/rules/store.rb +22 -0
  130. data/app/models/spree/promotion/rules/taxon.rb +103 -0
  131. data/app/models/spree/promotion/rules/user.rb +30 -0
  132. data/app/models/spree/promotion/rules/user_logged_in.rb +20 -0
  133. data/app/models/spree/promotion/rules/user_role.rb +45 -0
  134. data/app/models/spree/promotion.rb +260 -0
  135. data/app/models/spree/promotion_action.rb +53 -0
  136. data/app/models/spree/promotion_category.rb +8 -0
  137. data/app/models/spree/promotion_chooser.rb +34 -0
  138. data/app/models/spree/promotion_code/batch_builder.rb +78 -0
  139. data/app/models/spree/promotion_code.rb +44 -0
  140. data/app/models/spree/promotion_code_batch.rb +27 -0
  141. data/app/models/spree/promotion_handler/cart.rb +55 -0
  142. data/app/models/spree/promotion_handler/coupon.rb +92 -0
  143. data/app/models/spree/promotion_handler/free_shipping.rb +9 -0
  144. data/app/models/spree/promotion_handler/page.rb +26 -0
  145. data/app/models/spree/promotion_handler/shipping.rb +61 -0
  146. data/app/models/spree/promotion_rule.rb +51 -0
  147. data/app/models/spree/promotion_rule_role.rb +8 -0
  148. data/app/models/spree/promotion_rule_store.rb +10 -0
  149. data/app/models/spree/promotion_rule_taxon.rb +8 -0
  150. data/app/models/spree/promotion_rule_user.rb +10 -0
  151. data/app/models/spree/property.rb +20 -0
  152. data/app/models/spree/refund.rb +90 -0
  153. data/app/models/spree/refund_reason.rb +15 -0
  154. data/app/models/spree/reimbursement/credit.rb +29 -0
  155. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +56 -0
  156. data/app/models/spree/reimbursement/reimbursement_type_validator.rb +17 -0
  157. data/app/models/spree/reimbursement.rb +186 -0
  158. data/app/models/spree/reimbursement_performer.rb +40 -0
  159. data/app/models/spree/reimbursement_tax_calculator.rb +35 -0
  160. data/app/models/spree/reimbursement_type/credit.rb +15 -0
  161. data/app/models/spree/reimbursement_type/exchange.rb +11 -0
  162. data/app/models/spree/reimbursement_type/original_payment.rb +15 -0
  163. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +72 -0
  164. data/app/models/spree/reimbursement_type/store_credit.rb +29 -0
  165. data/app/models/spree/reimbursement_type.rb +18 -0
  166. data/app/models/spree/return_authorization.rb +90 -0
  167. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +30 -0
  168. data/app/models/spree/return_item/eligibility_validator/default.rb +36 -0
  169. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +22 -0
  170. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +22 -0
  171. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +22 -0
  172. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +22 -0
  173. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +22 -0
  174. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +47 -0
  175. data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +13 -0
  176. data/app/models/spree/return_item.rb +320 -0
  177. data/app/models/spree/return_reason.rb +14 -0
  178. data/app/models/spree/returns_calculator.rb +9 -0
  179. data/app/models/spree/role.rb +14 -0
  180. data/app/models/spree/role_user.rb +11 -0
  181. data/app/models/spree/shipment.rb +431 -0
  182. data/app/models/spree/shipping_calculator.rb +23 -0
  183. data/app/models/spree/shipping_category.rb +10 -0
  184. data/app/models/spree/shipping_manifest.rb +30 -0
  185. data/app/models/spree/shipping_method.rb +133 -0
  186. data/app/models/spree/shipping_method_category.rb +8 -0
  187. data/app/models/spree/shipping_method_stock_location.rb +6 -0
  188. data/app/models/spree/shipping_method_zone.rb +8 -0
  189. data/app/models/spree/shipping_rate.rb +48 -0
  190. data/app/models/spree/shipping_rate_tax.rb +39 -0
  191. data/app/models/spree/state.rb +40 -0
  192. data/app/models/spree/state_change.rb +17 -0
  193. data/app/models/spree/stock/availability.rb +72 -0
  194. data/app/models/spree/stock/availability_validator.rb +36 -0
  195. data/app/models/spree/stock/content_item.rb +50 -0
  196. data/app/models/spree/stock/differentiator.rb +47 -0
  197. data/app/models/spree/stock/estimator.rb +71 -0
  198. data/app/models/spree/stock/inventory_unit_builder.rb +23 -0
  199. data/app/models/spree/stock/inventory_validator.rb +16 -0
  200. data/app/models/spree/stock/location_sorter/base.rb +38 -0
  201. data/app/models/spree/stock/location_sorter/default_first.rb +15 -0
  202. data/app/models/spree/stock/location_sorter/unsorted.rb +14 -0
  203. data/app/models/spree/stock/package.rb +142 -0
  204. data/app/models/spree/stock/quantifier.rb +49 -0
  205. data/app/models/spree/stock/shipping_rate_selector.rb +17 -0
  206. data/app/models/spree/stock/shipping_rate_sorter.rb +17 -0
  207. data/app/models/spree/stock/simple_coordinator.rb +119 -0
  208. data/app/models/spree/stock/splitter/backordered.rb +23 -0
  209. data/app/models/spree/stock/splitter/base.rb +35 -0
  210. data/app/models/spree/stock/splitter/shipping_category.rb +35 -0
  211. data/app/models/spree/stock/splitter/weight.rb +32 -0
  212. data/app/models/spree/stock/splitter_chain.rb +34 -0
  213. data/app/models/spree/stock_item.rb +128 -0
  214. data/app/models/spree/stock_location.rb +127 -0
  215. data/app/models/spree/stock_movement.rb +28 -0
  216. data/app/models/spree/stock_quantities.rb +83 -0
  217. data/app/models/spree/store.rb +83 -0
  218. data/app/models/spree/store_credit.rb +293 -0
  219. data/app/models/spree/store_credit_category.rb +18 -0
  220. data/app/models/spree/store_credit_event.rb +66 -0
  221. data/app/models/spree/store_credit_type.rb +10 -0
  222. data/app/models/spree/store_credit_update_reason.rb +4 -0
  223. data/app/models/spree/store_payment_method.rb +8 -0
  224. data/app/models/spree/store_selector/by_server_name.rb +32 -0
  225. data/app/models/spree/store_selector/legacy.rb +50 -0
  226. data/app/models/spree/store_shipping_method.rb +8 -0
  227. data/app/models/spree/tax/item_tax.rb +22 -0
  228. data/app/models/spree/tax/order_adjuster.rb +22 -0
  229. data/app/models/spree/tax/order_tax.rb +20 -0
  230. data/app/models/spree/tax/shipping_rate_taxer.rb +24 -0
  231. data/app/models/spree/tax/tax_helpers.rb +17 -0
  232. data/app/models/spree/tax/tax_location.rb +39 -0
  233. data/app/models/spree/tax_calculator/default.rb +85 -0
  234. data/app/models/spree/tax_calculator/shipping_rate.rb +58 -0
  235. data/app/models/spree/tax_category.rb +30 -0
  236. data/app/models/spree/tax_rate.rb +147 -0
  237. data/app/models/spree/tax_rate_tax_category.rb +8 -0
  238. data/app/models/spree/taxon.rb +144 -0
  239. data/app/models/spree/taxonomy.rb +29 -0
  240. data/app/models/spree/unit_cancel.rb +36 -0
  241. data/app/models/spree/user_address.rb +23 -0
  242. data/app/models/spree/user_class_handle.rb +28 -0
  243. data/app/models/spree/user_stock_location.rb +8 -0
  244. data/app/models/spree/validations/db_maximum_length_validator.rb +23 -0
  245. data/app/models/spree/variant/price_selector.rb +37 -0
  246. data/app/models/spree/variant/pricing_options.rb +98 -0
  247. data/app/models/spree/variant/scopes.rb +42 -0
  248. data/app/models/spree/variant/vat_price_generator.rb +63 -0
  249. data/app/models/spree/variant.rb +465 -0
  250. data/app/models/spree/variant_property_rule.rb +44 -0
  251. data/app/models/spree/variant_property_rule_condition.rb +10 -0
  252. data/app/models/spree/variant_property_rule_value.rb +12 -0
  253. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +40 -0
  254. data/app/models/spree/wallet/default_payment_builder.rb +28 -0
  255. data/app/models/spree/wallet.rb +78 -0
  256. data/app/models/spree/wallet_payment_source.rb +19 -0
  257. data/app/models/spree/zone.rb +148 -0
  258. data/app/models/spree/zone_member.rb +10 -0
  259. data/app/views/layouts/spree/base_mailer.html.erb +784 -0
  260. data/app/views/spree/carton_mailer/shipped_email.html.erb +34 -0
  261. data/app/views/spree/carton_mailer/shipped_email.text.erb +16 -0
  262. data/app/views/spree/order_mailer/cancel_email.html.erb +45 -0
  263. data/app/views/spree/order_mailer/cancel_email.text.erb +16 -0
  264. data/app/views/spree/order_mailer/confirm_email.html.erb +84 -0
  265. data/app/views/spree/order_mailer/confirm_email.text.erb +38 -0
  266. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +26 -0
  267. data/app/views/spree/order_mailer/inventory_cancellation_email.text.erb +10 -0
  268. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
  269. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
  270. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +39 -0
  271. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +17 -0
  272. data/app/views/spree/shared/_base_mailer_footer.html.erb +1 -0
  273. data/app/views/spree/shared/_base_mailer_header.html.erb +1 -0
  274. data/app/views/spree/shared/_error_messages.html.erb +11 -0
  275. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  276. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  277. data/config/initializers/assets.rb +5 -0
  278. data/config/initializers/friendly_id.rb +90 -0
  279. data/config/locales/en.yml +2107 -0
  280. data/db/default/spree/countries.rb +45 -0
  281. data/db/default/spree/refund_reasons.rb +3 -0
  282. data/db/default/spree/return_reasons.rb +11 -0
  283. data/db/default/spree/roles.rb +3 -0
  284. data/db/default/spree/shipping_categories.rb +3 -0
  285. data/db/default/spree/states.rb +14 -0
  286. data/db/default/spree/stock_locations.rb +4 -0
  287. data/db/default/spree/store_credit.rb +22 -0
  288. data/db/default/spree/stores.rb +10 -0
  289. data/db/default/spree/zones.rb +13 -0
  290. data/db/migrate/20160101010000_solidus_one_four.rb +1102 -0
  291. data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +27 -0
  292. data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +29 -0
  293. data/db/migrate/20160924135758_remove_is_default_from_prices.rb +7 -0
  294. data/db/migrate/20161009141333_remove_currency_from_line_items.rb +7 -0
  295. data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +30 -0
  296. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +38 -0
  297. data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +22 -0
  298. data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +7 -0
  299. data/db/migrate/20170223235001_remove_spree_store_credits_column.rb +7 -0
  300. data/db/migrate/20170317035819_add_lft_and_rgt_indexes_to_taxons.rb +8 -0
  301. data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +30 -0
  302. data/db/migrate/20170412103617_transform_tax_rate_category_relation.rb +50 -0
  303. data/db/migrate/20170422134804_add_roles_unique_constraints.rb +8 -0
  304. data/db/migrate/20170522143442_add_time_range_to_tax_rate.rb +8 -0
  305. data/db/migrate/20170608074534_rename_bogus_gateways.rb +17 -0
  306. data/db/migrate/20170831201542_remove_default_tax_from_spree_zones.rb +7 -0
  307. data/db/migrate/20180202190713_create_promotion_rule_stores.rb +12 -0
  308. data/db/migrate/20180202222641_create_store_shipping_methods.rb +12 -0
  309. data/db/migrate/20180313220213_add_available_locales_to_stores.rb +9 -0
  310. data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +61 -0
  311. data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +11 -0
  312. data/db/seeds.rb +17 -0
  313. data/lib/generators/spree/custom_user/custom_user_generator.rb +43 -0
  314. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +40 -0
  315. data/lib/generators/spree/custom_user/templates/migration.rb.tt +30 -0
  316. data/lib/generators/spree/dummy/dummy_generator.rb +148 -0
  317. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +10 -0
  318. data/lib/generators/spree/dummy/templates/rails/boot.rb +6 -0
  319. data/lib/generators/spree/dummy/templates/rails/database.yml +71 -0
  320. data/lib/generators/spree/dummy/templates/rails/routes.rb +2 -0
  321. data/lib/generators/spree/dummy/templates/rails/script/rails +6 -0
  322. data/lib/generators/spree/dummy/templates/rails/test.rb +33 -0
  323. data/lib/generators/spree/install/install_generator.rb +189 -0
  324. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +67 -0
  325. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +10 -0
  326. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +10 -0
  327. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +9 -0
  328. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +9 -0
  329. data/lib/solidus/migrations/rename_gateways.rb +39 -0
  330. data/lib/solidus_core.rb +3 -0
  331. data/lib/spree/app_configuration.rb +529 -0
  332. data/lib/spree/config.rb +5 -0
  333. data/lib/spree/core/active_merchant_dependencies.rb +13 -0
  334. data/lib/spree/core/class_constantizer.rb +33 -0
  335. data/lib/spree/core/controller_helpers/auth.rb +83 -0
  336. data/lib/spree/core/controller_helpers/common.rb +82 -0
  337. data/lib/spree/core/controller_helpers/order.rb +107 -0
  338. data/lib/spree/core/controller_helpers/payment_parameters.rb +221 -0
  339. data/lib/spree/core/controller_helpers/pricing.rb +30 -0
  340. data/lib/spree/core/controller_helpers/search.rb +16 -0
  341. data/lib/spree/core/controller_helpers/store.rb +19 -0
  342. data/lib/spree/core/controller_helpers/strong_parameters.rb +63 -0
  343. data/lib/spree/core/current_store.rb +24 -0
  344. data/lib/spree/core/engine.rb +61 -0
  345. data/lib/spree/core/environment/calculators.rb +18 -0
  346. data/lib/spree/core/environment.rb +22 -0
  347. data/lib/spree/core/environment_extension.rb +31 -0
  348. data/lib/spree/core/importer/order.rb +203 -0
  349. data/lib/spree/core/importer/product.rb +65 -0
  350. data/lib/spree/core/importer.rb +11 -0
  351. data/lib/spree/core/permalinks.rb +67 -0
  352. data/lib/spree/core/product_duplicator.rb +75 -0
  353. data/lib/spree/core/product_filters.rb +197 -0
  354. data/lib/spree/core/role_configuration.rb +88 -0
  355. data/lib/spree/core/search/base.rb +120 -0
  356. data/lib/spree/core/search/variant.rb +66 -0
  357. data/lib/spree/core/stock_configuration.rb +26 -0
  358. data/lib/spree/core/validators/email.rb +30 -0
  359. data/lib/spree/core/version.rb +11 -0
  360. data/lib/spree/core.rb +92 -0
  361. data/lib/spree/deprecation.rb +7 -0
  362. data/lib/spree/i18n.rb +35 -0
  363. data/lib/spree/localized_number.rb +30 -0
  364. data/lib/spree/mailer_previews/carton_preview.rb +13 -0
  365. data/lib/spree/mailer_previews/order_preview.rb +25 -0
  366. data/lib/spree/mailer_previews/reimbursement_preview.rb +13 -0
  367. data/lib/spree/migration_helpers.rb +21 -0
  368. data/lib/spree/migrations.rb +85 -0
  369. data/lib/spree/money.rb +133 -0
  370. data/lib/spree/paranoia_deprecations.rb +21 -0
  371. data/lib/spree/permission_sets/base.rb +32 -0
  372. data/lib/spree/permission_sets/configuration_display.rb +25 -0
  373. data/lib/spree/permission_sets/configuration_management.rb +25 -0
  374. data/lib/spree/permission_sets/dashboard_display.rb +11 -0
  375. data/lib/spree/permission_sets/default_customer.rb +37 -0
  376. data/lib/spree/permission_sets/order_display.rb +21 -0
  377. data/lib/spree/permission_sets/order_management.rb +22 -0
  378. data/lib/spree/permission_sets/product_display.rb +19 -0
  379. data/lib/spree/permission_sets/product_management.rb +21 -0
  380. data/lib/spree/permission_sets/promotion_display.rb +15 -0
  381. data/lib/spree/permission_sets/promotion_management.rb +14 -0
  382. data/lib/spree/permission_sets/restricted_stock_display.rb +18 -0
  383. data/lib/spree/permission_sets/restricted_stock_management.rb +18 -0
  384. data/lib/spree/permission_sets/stock_display.rb +12 -0
  385. data/lib/spree/permission_sets/stock_management.rb +12 -0
  386. data/lib/spree/permission_sets/super_user.rb +11 -0
  387. data/lib/spree/permission_sets/user_display.rb +13 -0
  388. data/lib/spree/permission_sets/user_management.rb +21 -0
  389. data/lib/spree/permission_sets.rb +20 -0
  390. data/lib/spree/permitted_attributes.rb +133 -0
  391. data/lib/spree/preferences/configuration.rb +107 -0
  392. data/lib/spree/preferences/preferable.rb +180 -0
  393. data/lib/spree/preferences/preferable_class_methods.rb +88 -0
  394. data/lib/spree/preferences/scoped_store.rb +36 -0
  395. data/lib/spree/preferences/static_model_preferences.rb +49 -0
  396. data/lib/spree/preferences/statically_configurable.rb +39 -0
  397. data/lib/spree/preferences/store.rb +91 -0
  398. data/lib/spree/promo/environment.rb +13 -0
  399. data/lib/spree/testing_support/ability_helpers.rb +107 -0
  400. data/lib/spree/testing_support/authorization_helpers.rb +69 -0
  401. data/lib/spree/testing_support/bar_ability.rb +19 -0
  402. data/lib/spree/testing_support/caching.rb +33 -0
  403. data/lib/spree/testing_support/capybara_ext.rb +147 -0
  404. data/lib/spree/testing_support/common_rake.rb +38 -0
  405. data/lib/spree/testing_support/controller_requests.rb +108 -0
  406. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +10 -0
  407. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +10 -0
  408. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/backend/all.css +9 -0
  409. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +9 -0
  410. data/lib/spree/testing_support/dummy_app/database.yml +33 -0
  411. data/lib/spree/testing_support/dummy_app/migrations.rb +47 -0
  412. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +67 -0
  413. data/lib/spree/testing_support/dummy_app/routes.rb +5 -0
  414. data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +1 -0
  415. data/lib/spree/testing_support/dummy_app.rb +120 -0
  416. data/lib/spree/testing_support/extension_rake.rb +11 -0
  417. data/lib/spree/testing_support/factories/address_factory.rb +45 -0
  418. data/lib/spree/testing_support/factories/adjustment_factory.rb +45 -0
  419. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +8 -0
  420. data/lib/spree/testing_support/factories/calculator_factory.rb +26 -0
  421. data/lib/spree/testing_support/factories/carton_factory.rb +26 -0
  422. data/lib/spree/testing_support/factories/country_factory.rb +21 -0
  423. data/lib/spree/testing_support/factories/credit_card_factory.rb +17 -0
  424. data/lib/spree/testing_support/factories/customer_return_factory.rb +35 -0
  425. data/lib/spree/testing_support/factories/image_factory.rb +7 -0
  426. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +26 -0
  427. data/lib/spree/testing_support/factories/line_item_factory.rb +18 -0
  428. data/lib/spree/testing_support/factories/option_type_factory.rb +8 -0
  429. data/lib/spree/testing_support/factories/option_value_factory.rb +10 -0
  430. data/lib/spree/testing_support/factories/order_factory.rb +160 -0
  431. data/lib/spree/testing_support/factories/order_promotion_factory.rb +11 -0
  432. data/lib/spree/testing_support/factories/payment_factory.rb +51 -0
  433. data/lib/spree/testing_support/factories/payment_method_factory.rb +32 -0
  434. data/lib/spree/testing_support/factories/price_factory.rb +11 -0
  435. data/lib/spree/testing_support/factories/product_factory.rb +50 -0
  436. data/lib/spree/testing_support/factories/product_option_type_factory.rb +11 -0
  437. data/lib/spree/testing_support/factories/product_property_factory.rb +11 -0
  438. data/lib/spree/testing_support/factories/promotion_category_factory.rb +7 -0
  439. data/lib/spree/testing_support/factories/promotion_code_factory.rb +11 -0
  440. data/lib/spree/testing_support/factories/promotion_factory.rb +64 -0
  441. data/lib/spree/testing_support/factories/property_factory.rb +8 -0
  442. data/lib/spree/testing_support/factories/refund_factory.rb +21 -0
  443. data/lib/spree/testing_support/factories/refund_reason_factory.rb +7 -0
  444. data/lib/spree/testing_support/factories/reimbursement_factory.rb +21 -0
  445. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +9 -0
  446. data/lib/spree/testing_support/factories/return_authorization_factory.rb +20 -0
  447. data/lib/spree/testing_support/factories/return_item_factory.rb +23 -0
  448. data/lib/spree/testing_support/factories/return_reason_factory.rb +7 -0
  449. data/lib/spree/testing_support/factories/role_factory.rb +11 -0
  450. data/lib/spree/testing_support/factories/shipment_factory.rb +37 -0
  451. data/lib/spree/testing_support/factories/shipping_category_factory.rb +7 -0
  452. data/lib/spree/testing_support/factories/shipping_method_factory.rb +42 -0
  453. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +11 -0
  454. data/lib/spree/testing_support/factories/state_factory.rb +28 -0
  455. data/lib/spree/testing_support/factories/stock_item_factory.rb +14 -0
  456. data/lib/spree/testing_support/factories/stock_location_factory.rb +41 -0
  457. data/lib/spree/testing_support/factories/stock_movement_factory.rb +15 -0
  458. data/lib/spree/testing_support/factories/stock_package_factory.rb +28 -0
  459. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +7 -0
  460. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +30 -0
  461. data/lib/spree/testing_support/factories/store_credit_factory.rb +16 -0
  462. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +13 -0
  463. data/lib/spree/testing_support/factories/store_credit_update_reason_factory.rb +7 -0
  464. data/lib/spree/testing_support/factories/store_factory.rb +10 -0
  465. data/lib/spree/testing_support/factories/tax_category_factory.rb +10 -0
  466. data/lib/spree/testing_support/factories/tax_rate_factory.rb +14 -0
  467. data/lib/spree/testing_support/factories/taxon_factory.rb +11 -0
  468. data/lib/spree/testing_support/factories/taxonomy_factory.rb +7 -0
  469. data/lib/spree/testing_support/factories/user_factory.rb +21 -0
  470. data/lib/spree/testing_support/factories/variant_factory.rb +43 -0
  471. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +11 -0
  472. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +22 -0
  473. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +11 -0
  474. data/lib/spree/testing_support/factories/zone_factory.rb +24 -0
  475. data/lib/spree/testing_support/factories.rb +7 -0
  476. data/lib/spree/testing_support/flash.rb +29 -0
  477. data/lib/spree/testing_support/order_walkthrough.rb +87 -0
  478. data/lib/spree/testing_support/preferences.rb +34 -0
  479. data/lib/spree/testing_support/sequences.rb +8 -0
  480. data/lib/spree/testing_support/shared_examples/gallery.rb +18 -0
  481. data/lib/spree/testing_support/url_helpers.rb +11 -0
  482. data/lib/spree_core.rb +3 -0
  483. data/lib/tasks/core.rake +104 -0
  484. data/lib/tasks/email.rake +9 -0
  485. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +115 -0
  486. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +20 -0
  487. data/lib/tasks/migrations/migrate_user_addresses.rake +31 -0
  488. data/lib/tasks/migrations/rename_gateways.rake +21 -0
  489. data/lib/tasks/order_capturing.rake +25 -0
  490. data/script/rails +10 -0
  491. data/solidus_core.gemspec +48 -0
  492. data/spec/fixtures/thinking-cat.jpg +0 -0
  493. data/spec/helpers/base_helper_spec.rb +168 -0
  494. data/spec/helpers/products_helper_spec.rb +200 -0
  495. data/spec/helpers/taxons_helper_spec.rb +41 -0
  496. data/spec/jobs/promotion_code_batch_job_spec.rb +96 -0
  497. data/spec/lib/calculated_adjustments_spec.rb +133 -0
  498. data/spec/lib/i18n_spec.rb +92 -0
  499. data/spec/lib/search/base_spec.rb +87 -0
  500. data/spec/lib/search/variant_spec.rb +115 -0
  501. data/spec/lib/spree/core/class_constantizer_spec.rb +71 -0
  502. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +69 -0
  503. data/spec/lib/spree/core/controller_helpers/order_spec.rb +126 -0
  504. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +195 -0
  505. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +81 -0
  506. data/spec/lib/spree/core/controller_helpers/search_spec.rb +21 -0
  507. data/spec/lib/spree/core/controller_helpers/store_spec.rb +18 -0
  508. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +41 -0
  509. data/spec/lib/spree/core/current_store_spec.rb +33 -0
  510. data/spec/lib/spree/core/environment_extension_spec.rb +36 -0
  511. data/spec/lib/spree/core/importer/order_spec.rb +484 -0
  512. data/spec/lib/spree/core/role_configuration_spec.rb +155 -0
  513. data/spec/lib/spree/core/stock_configuration_spec.rb +59 -0
  514. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +61 -0
  515. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +20 -0
  516. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +14 -0
  517. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +44 -0
  518. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +14 -0
  519. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +14 -0
  520. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +14 -0
  521. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +39 -0
  522. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +14 -0
  523. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +14 -0
  524. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +14 -0
  525. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +14 -0
  526. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +14 -0
  527. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +376 -0
  528. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +14 -0
  529. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +40 -0
  530. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +32 -0
  531. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +14 -0
  532. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +32 -0
  533. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +14 -0
  534. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +14 -0
  535. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +14 -0
  536. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +14 -0
  537. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +32 -0
  538. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +14 -0
  539. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +14 -0
  540. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +14 -0
  541. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +20 -0
  542. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +14 -0
  543. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +14 -0
  544. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +20 -0
  545. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +14 -0
  546. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +20 -0
  547. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +14 -0
  548. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +14 -0
  549. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +44 -0
  550. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +14 -0
  551. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +59 -0
  552. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +14 -0
  553. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +35 -0
  554. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +14 -0
  555. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +28 -0
  556. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +14 -0
  557. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +43 -0
  558. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +14 -0
  559. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +20 -0
  560. data/spec/lib/spree/core/testing_support/factories/store_credit_update_reason_factory_spec.rb +14 -0
  561. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +14 -0
  562. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +14 -0
  563. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +14 -0
  564. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +14 -0
  565. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +14 -0
  566. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +24 -0
  567. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +56 -0
  568. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +14 -0
  569. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +14 -0
  570. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +14 -0
  571. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +20 -0
  572. data/spec/lib/spree/core/testing_support/preferences_spec.rb +28 -0
  573. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  574. data/spec/lib/spree/core/version_spec.rb +19 -0
  575. data/spec/lib/spree/localized_number_spec.rb +45 -0
  576. data/spec/lib/spree/migrations_spec.rb +32 -0
  577. data/spec/lib/spree/money_spec.rb +305 -0
  578. data/spec/lib/spree/permission_sets/default_customer_spec.rb +22 -0
  579. data/spec/lib/tasks/dummy_task.rake +12 -0
  580. data/spec/lib/tasks/dummy_task_spec.rb +30 -0
  581. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +19 -0
  582. data/spec/mailers/carton_mailer_spec.rb +44 -0
  583. data/spec/mailers/order_mailer_spec.rb +117 -0
  584. data/spec/mailers/promotion_code_batch_mailer_spec.rb +47 -0
  585. data/spec/mailers/reimbursement_mailer_spec.rb +36 -0
  586. data/spec/mailers/test_mailer_spec.rb +11 -0
  587. data/spec/models/spree/ability_spec.rb +279 -0
  588. data/spec/models/spree/address_spec.rb +375 -0
  589. data/spec/models/spree/adjustment_reason_spec.rb +11 -0
  590. data/spec/models/spree/adjustment_spec.rb +339 -0
  591. data/spec/models/spree/app_configuration_spec.rb +55 -0
  592. data/spec/models/spree/asset_spec.rb +25 -0
  593. data/spec/models/spree/calculator/default_tax_spec.rb +260 -0
  594. data/spec/models/spree/calculator/distributed_amount_spec.rb +82 -0
  595. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +30 -0
  596. data/spec/models/spree/calculator/flat_rate_spec.rb +52 -0
  597. data/spec/models/spree/calculator/flexi_rate_spec.rb +158 -0
  598. data/spec/models/spree/calculator/free_shipping_spec.rb +8 -0
  599. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +20 -0
  600. data/spec/models/spree/calculator/percent_per_item_spec.rb +12 -0
  601. data/spec/models/spree/calculator/price_sack_spec.rb +35 -0
  602. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +70 -0
  603. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +39 -0
  604. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +18 -0
  605. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +56 -0
  606. data/spec/models/spree/calculator/shipping/per_item_spec.rb +25 -0
  607. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +35 -0
  608. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +99 -0
  609. data/spec/models/spree/calculator/tiered_percent_spec.rb +191 -0
  610. data/spec/models/spree/calculator_spec.rb +43 -0
  611. data/spec/models/spree/carton_spec.rb +137 -0
  612. data/spec/models/spree/classification_spec.rb +114 -0
  613. data/spec/models/spree/concerns/display_money_spec.rb +44 -0
  614. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +52 -0
  615. data/spec/models/spree/concerns/user_address_book_spec.rb +358 -0
  616. data/spec/models/spree/concerns/user_methods_spec.rb +121 -0
  617. data/spec/models/spree/country_spec.rb +78 -0
  618. data/spec/models/spree/credit_card_spec.rb +373 -0
  619. data/spec/models/spree/customer_return_spec.rb +293 -0
  620. data/spec/models/spree/distributed_amounts_handler_spec.rb +83 -0
  621. data/spec/models/spree/exchange_spec.rb +76 -0
  622. data/spec/models/spree/fulfilment_changer_spec.rb +307 -0
  623. data/spec/models/spree/gallery/product_gallery_spec.rb +21 -0
  624. data/spec/models/spree/gallery/variant_gallery_spec.rb +21 -0
  625. data/spec/models/spree/gateway/bogus_simple.rb +14 -0
  626. data/spec/models/spree/gateway/bogus_spec.rb +14 -0
  627. data/spec/models/spree/gateway_spec.rb +14 -0
  628. data/spec/models/spree/image_spec.rb +25 -0
  629. data/spec/models/spree/inventory_unit_spec.rb +312 -0
  630. data/spec/models/spree/line_item_spec.rb +240 -0
  631. data/spec/models/spree/option_type_spec.rb +16 -0
  632. data/spec/models/spree/option_value_spec.rb +52 -0
  633. data/spec/models/spree/order/address_spec.rb +52 -0
  634. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  635. data/spec/models/spree/order/callbacks_spec.rb +44 -0
  636. data/spec/models/spree/order/checkout_spec.rb +744 -0
  637. data/spec/models/spree/order/finalizing_spec.rb +111 -0
  638. data/spec/models/spree/order/number_generator_spec.rb +47 -0
  639. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +137 -0
  640. data/spec/models/spree/order/payment_spec.rb +280 -0
  641. data/spec/models/spree/order/risk_assessment_spec.rb +70 -0
  642. data/spec/models/spree/order/state_machine_spec.rb +122 -0
  643. data/spec/models/spree/order/totals_spec.rb +26 -0
  644. data/spec/models/spree/order/updating_spec.rb +18 -0
  645. data/spec/models/spree/order/validations_spec.rb +17 -0
  646. data/spec/models/spree/order_cancellations_spec.rb +192 -0
  647. data/spec/models/spree/order_capturing_spec.rb +16 -0
  648. data/spec/models/spree/order_contents_spec.rb +362 -0
  649. data/spec/models/spree/order_inventory_spec.rb +278 -0
  650. data/spec/models/spree/order_merger_spec.rb +159 -0
  651. data/spec/models/spree/order_mutex_spec.rb +89 -0
  652. data/spec/models/spree/order_promotion_spec.rb +33 -0
  653. data/spec/models/spree/order_shipping_spec.rb +247 -0
  654. data/spec/models/spree/order_spec.rb +1633 -0
  655. data/spec/models/spree/order_taxation_spec.rb +128 -0
  656. data/spec/models/spree/order_update_attributes_spec.rb +49 -0
  657. data/spec/models/spree/order_updater_spec.rb +560 -0
  658. data/spec/models/spree/payment/cancellation_spec.rb +83 -0
  659. data/spec/models/spree/payment_create_spec.rb +205 -0
  660. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +10 -0
  661. data/spec/models/spree/payment_method/check_spec.rb +80 -0
  662. data/spec/models/spree/payment_method/credit_card_spec.rb +68 -0
  663. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +20 -0
  664. data/spec/models/spree/payment_method/store_credit_spec.rb +325 -0
  665. data/spec/models/spree/payment_method_spec.rb +408 -0
  666. data/spec/models/spree/payment_spec.rb +1274 -0
  667. data/spec/models/spree/permission_sets/base_spec.rb +14 -0
  668. data/spec/models/spree/permission_sets/configuration_display.rb +79 -0
  669. data/spec/models/spree/permission_sets/configuration_management_spec.rb +49 -0
  670. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +23 -0
  671. data/spec/models/spree/permission_sets/order_display_spec.rb +56 -0
  672. data/spec/models/spree/permission_sets/order_management_spec.rb +43 -0
  673. data/spec/models/spree/permission_sets/product_display_spec.rb +57 -0
  674. data/spec/models/spree/permission_sets/product_management_spec.rb +39 -0
  675. data/spec/models/spree/permission_sets/promotion_display_spec.rb +41 -0
  676. data/spec/models/spree/permission_sets/promotion_management_spec.rb +27 -0
  677. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +42 -0
  678. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +42 -0
  679. data/spec/models/spree/permission_sets/stock_display_spec.rb +25 -0
  680. data/spec/models/spree/permission_sets/stock_management_spec.rb +23 -0
  681. data/spec/models/spree/permission_sets/user_display_spec.rb +39 -0
  682. data/spec/models/spree/permission_sets/user_management_spec.rb +56 -0
  683. data/spec/models/spree/preference_spec.rb +79 -0
  684. data/spec/models/spree/preferences/configuration_spec.rb +27 -0
  685. data/spec/models/spree/preferences/preferable_spec.rb +334 -0
  686. data/spec/models/spree/preferences/scoped_store_spec.rb +62 -0
  687. data/spec/models/spree/preferences/static_model_preferences_spec.rb +79 -0
  688. data/spec/models/spree/preferences/statically_configurable_spec.rb +67 -0
  689. data/spec/models/spree/preferences/store_spec.rb +40 -0
  690. data/spec/models/spree/price_spec.rb +150 -0
  691. data/spec/models/spree/product/scopes_spec.rb +164 -0
  692. data/spec/models/spree/product_duplicator_spec.rb +92 -0
  693. data/spec/models/spree/product_filter_spec.rb +28 -0
  694. data/spec/models/spree/product_property_spec.rb +20 -0
  695. data/spec/models/spree/product_spec.rb +584 -0
  696. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +126 -0
  697. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +198 -0
  698. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +298 -0
  699. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +61 -0
  700. data/spec/models/spree/promotion/rules/first_order_spec.rb +77 -0
  701. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +71 -0
  702. data/spec/models/spree/promotion/rules/item_total_spec.rb +113 -0
  703. data/spec/models/spree/promotion/rules/nth_order_spec.rb +72 -0
  704. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +44 -0
  705. data/spec/models/spree/promotion/rules/option_value_spec.rb +96 -0
  706. data/spec/models/spree/promotion/rules/product_spec.rb +178 -0
  707. data/spec/models/spree/promotion/rules/store_spec.rb +35 -0
  708. data/spec/models/spree/promotion/rules/taxon_spec.rb +174 -0
  709. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +28 -0
  710. data/spec/models/spree/promotion/rules/user_role_spec.rb +88 -0
  711. data/spec/models/spree/promotion/rules/user_spec.rb +39 -0
  712. data/spec/models/spree/promotion_action_spec.rb +44 -0
  713. data/spec/models/spree/promotion_category_spec.rb +19 -0
  714. data/spec/models/spree/promotion_code/batch_builder_spec.rb +107 -0
  715. data/spec/models/spree/promotion_code_batch_spec.rb +54 -0
  716. data/spec/models/spree/promotion_code_spec.rb +206 -0
  717. data/spec/models/spree/promotion_handler/cart_spec.rb +132 -0
  718. data/spec/models/spree/promotion_handler/coupon_spec.rb +365 -0
  719. data/spec/models/spree/promotion_handler/page_spec.rb +45 -0
  720. data/spec/models/spree/promotion_handler/shipping_spec.rb +96 -0
  721. data/spec/models/spree/promotion_rule_spec.rb +34 -0
  722. data/spec/models/spree/promotion_spec.rb +834 -0
  723. data/spec/models/spree/refund_spec.rb +199 -0
  724. data/spec/models/spree/reimbursement/credit_spec.rb +38 -0
  725. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +144 -0
  726. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +85 -0
  727. data/spec/models/spree/reimbursement_performer_spec.rb +32 -0
  728. data/spec/models/spree/reimbursement_spec.rb +253 -0
  729. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +52 -0
  730. data/spec/models/spree/reimbursement_type/credit_spec.rb +55 -0
  731. data/spec/models/spree/reimbursement_type/exchange_spec.rb +47 -0
  732. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +109 -0
  733. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +99 -0
  734. data/spec/models/spree/return_authorization_spec.rb +226 -0
  735. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +79 -0
  736. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +59 -0
  737. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +86 -0
  738. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +35 -0
  739. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +31 -0
  740. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +42 -0
  741. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +66 -0
  742. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  743. data/spec/models/spree/return_item_spec.rb +776 -0
  744. data/spec/models/spree/returns_calculator_spec.rb +16 -0
  745. data/spec/models/spree/shipment_spec.rb +907 -0
  746. data/spec/models/spree/shipping_calculator_spec.rb +57 -0
  747. data/spec/models/spree/shipping_manifest_spec.rb +110 -0
  748. data/spec/models/spree/shipping_method_spec.rb +260 -0
  749. data/spec/models/spree/shipping_rate_spec.rb +154 -0
  750. data/spec/models/spree/shipping_rate_tax_spec.rb +79 -0
  751. data/spec/models/spree/state_spec.rb +43 -0
  752. data/spec/models/spree/stock/availability_spec.rb +143 -0
  753. data/spec/models/spree/stock/availability_validator_spec.rb +140 -0
  754. data/spec/models/spree/stock/content_item_spec.rb +70 -0
  755. data/spec/models/spree/stock/differentiator_spec.rb +41 -0
  756. data/spec/models/spree/stock/estimator_spec.rb +240 -0
  757. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +34 -0
  758. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +20 -0
  759. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +19 -0
  760. data/spec/models/spree/stock/package_spec.rb +182 -0
  761. data/spec/models/spree/stock/quantifier_spec.rb +113 -0
  762. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +18 -0
  763. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +18 -0
  764. data/spec/models/spree/stock/simple_coordinator_spec.rb +247 -0
  765. data/spec/models/spree/stock/splitter/backordered_spec.rb +31 -0
  766. data/spec/models/spree/stock/splitter/base_spec.rb +22 -0
  767. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +48 -0
  768. data/spec/models/spree/stock/splitter/weight_spec.rb +31 -0
  769. data/spec/models/spree/stock/splitter_chain_spec.rb +66 -0
  770. data/spec/models/spree/stock_item_spec.rb +347 -0
  771. data/spec/models/spree/stock_location_spec.rb +288 -0
  772. data/spec/models/spree/stock_movement_spec.rb +58 -0
  773. data/spec/models/spree/stock_quantities_spec.rb +249 -0
  774. data/spec/models/spree/store_credit_category_spec.rb +19 -0
  775. data/spec/models/spree/store_credit_event_spec.rb +328 -0
  776. data/spec/models/spree/store_credit_spec.rb +900 -0
  777. data/spec/models/spree/store_selector/by_server_name_spec.rb +28 -0
  778. data/spec/models/spree/store_selector/legacy_spec.rb +46 -0
  779. data/spec/models/spree/store_spec.rb +156 -0
  780. data/spec/models/spree/tax/order_adjuster_spec.rb +35 -0
  781. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +59 -0
  782. data/spec/models/spree/tax/tax_location_spec.rb +79 -0
  783. data/spec/models/spree/tax/taxation_integration_spec.rb +815 -0
  784. data/spec/models/spree/tax_calculator/default_spec.rb +56 -0
  785. data/spec/models/spree/tax_category_spec.rb +29 -0
  786. data/spec/models/spree/tax_rate_spec.rb +316 -0
  787. data/spec/models/spree/taxon_spec.rb +169 -0
  788. data/spec/models/spree/taxonomy_spec.rb +15 -0
  789. data/spec/models/spree/unit_cancel_spec.rb +61 -0
  790. data/spec/models/spree/user_spec.rb +247 -0
  791. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +33 -0
  792. data/spec/models/spree/variant/price_selector_spec.rb +90 -0
  793. data/spec/models/spree/variant/pricing_options_spec.rb +181 -0
  794. data/spec/models/spree/variant/scopes_spec.rb +94 -0
  795. data/spec/models/spree/variant/vat_price_generator_spec.rb +77 -0
  796. data/spec/models/spree/variant_property_rule_condition_spec.rb +17 -0
  797. data/spec/models/spree/variant_property_rule_spec.rb +85 -0
  798. data/spec/models/spree/variant_property_rule_value_spec.rb +20 -0
  799. data/spec/models/spree/variant_spec.rb +822 -0
  800. data/spec/models/spree/wallet_payment_source_spec.rb +48 -0
  801. data/spec/models/spree/wallet_spec.rb +155 -0
  802. data/spec/models/spree/zone_spec.rb +248 -0
  803. data/spec/rails_helper.rb +45 -0
  804. data/spec/shared_examples/calculator_shared_examples.rb +10 -0
  805. data/spec/spec_helper.rb +39 -0
  806. data/spec/support/big_decimal.rb +7 -0
  807. data/spec/support/concerns/default_price.rb +36 -0
  808. data/spec/support/concerns/payment_source.rb +66 -0
  809. data/spec/support/concerns/working_factories.rb +15 -0
  810. data/spec/support/dummy_ability.rb +7 -0
  811. data/spec/support/shared_contexts/rake.rb +32 -0
  812. data/vendor/assets/javascripts/jquery.payment.js +648 -0
  813. data/vendor/assets/javascripts/jsuri.js +2 -0
  814. data/vendor/assets/stylesheets/normalize.css +375 -0
  815. metadata +1226 -0
@@ -0,0 +1,914 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spree/order/checkout'
4
+ require 'spree/order/number_generator'
5
+
6
+ module Spree
7
+ # The customers cart until completed, then acts as permanent record of the transaction.
8
+ #
9
+ # `Spree::Order` is the heart of the Solidus system, as it acts as the customer's
10
+ # cart as they shop. Once an order is complete, it serves as the
11
+ # permanent record of their purchase. It has many responsibilities:
12
+ #
13
+ # * Records and validates attributes like `total` and relationships like
14
+ # `Spree::LineItem` as an ActiveRecord model.
15
+ #
16
+ # * Implements a customizable state machine to manage the lifecycle of an order.
17
+ #
18
+ # * Implements business logic to provide a single interface for quesitons like
19
+ # `checkout_allowed?` or `payment_required?`.
20
+ #
21
+ # * Implements an interface for mutating the order with methods like
22
+ # `empty!` and `fulfill!`.
23
+ #
24
+ class Order < Spree::Base
25
+ ORDER_NUMBER_LENGTH = 9
26
+ ORDER_NUMBER_LETTERS = false
27
+ ORDER_NUMBER_PREFIX = 'R'
28
+
29
+ include Spree::Order::Checkout
30
+ include Spree::Order::Payments
31
+
32
+ class InsufficientStock < StandardError; end
33
+ class CannotRebuildShipments < StandardError; end
34
+
35
+ extend Spree::DisplayMoney
36
+ money_methods :outstanding_balance, :item_total, :adjustment_total,
37
+ :included_tax_total, :additional_tax_total, :tax_total,
38
+ :shipment_total, :total, :order_total_after_store_credit, :total_available_store_credit
39
+ alias :display_ship_total :display_shipment_total
40
+
41
+ checkout_flow do
42
+ go_to_state :address
43
+ go_to_state :delivery
44
+ go_to_state :payment, if: ->(order) { order.payment_required? }
45
+ go_to_state :confirm
46
+ end
47
+
48
+ self.whitelisted_ransackable_associations = %w[shipments user order_promotions promotions bill_address ship_address line_items]
49
+ self.whitelisted_ransackable_attributes = %w[completed_at created_at email number state payment_state shipment_state total store_id]
50
+
51
+ attr_reader :coupon_code
52
+ attr_accessor :temporary_address
53
+
54
+ attr_accessor :temporary_payment_source
55
+ alias_method :temporary_credit_card, :temporary_payment_source
56
+ alias_method :temporary_credit_card=, :temporary_payment_source=
57
+ deprecate temporary_credit_card: :temporary_payment_source, deprecator: Spree::Deprecation
58
+ deprecate :temporary_credit_card= => :temporary_payment_source=, deprecator: Spree::Deprecation
59
+
60
+ # Customer info
61
+ belongs_to :user, class_name: Spree::UserClassHandle.new
62
+ belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
63
+ alias_attribute :billing_address, :bill_address
64
+
65
+ belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
66
+ alias_attribute :shipping_address, :ship_address
67
+ alias_attribute :ship_total, :shipment_total
68
+
69
+ belongs_to :store, class_name: 'Spree::Store'
70
+
71
+ # Items
72
+ has_many :line_items, -> { order(:created_at, :id) }, dependent: :destroy, inverse_of: :order
73
+ has_many :variants, through: :line_items
74
+ has_many :products, through: :variants
75
+
76
+ # Shipping
77
+ has_many :shipments, dependent: :destroy, inverse_of: :order do
78
+ def states
79
+ pluck(:state).uniq
80
+ end
81
+ end
82
+ has_many :inventory_units, through: :shipments
83
+ has_many :cartons, -> { distinct }, through: :inventory_units
84
+
85
+ # Adjustments and promotions
86
+ has_many :adjustments, -> { order(:created_at) }, as: :adjustable, inverse_of: :adjustable, dependent: :destroy
87
+ has_many :line_item_adjustments, through: :line_items, source: :adjustments
88
+ has_many :shipment_adjustments, through: :shipments, source: :adjustments
89
+ has_many :all_adjustments,
90
+ class_name: 'Spree::Adjustment',
91
+ foreign_key: :order_id,
92
+ dependent: :destroy,
93
+ inverse_of: :order
94
+ has_many :order_promotions, class_name: 'Spree::OrderPromotion'
95
+ has_many :promotions, through: :order_promotions
96
+
97
+ # Payments
98
+ has_many :payments, dependent: :destroy, inverse_of: :order
99
+
100
+ # Returns
101
+ has_many :return_authorizations, dependent: :destroy, inverse_of: :order
102
+ has_many :reimbursements, inverse_of: :order
103
+ has_many :refunds, through: :payments
104
+
105
+ # Logging
106
+ has_many :state_changes, as: :stateful
107
+ belongs_to :created_by, class_name: Spree::UserClassHandle.new
108
+ belongs_to :approver, class_name: Spree::UserClassHandle.new
109
+ belongs_to :canceler, class_name: Spree::UserClassHandle.new
110
+
111
+ accepts_nested_attributes_for :line_items
112
+ accepts_nested_attributes_for :bill_address
113
+ accepts_nested_attributes_for :ship_address
114
+ accepts_nested_attributes_for :payments
115
+ accepts_nested_attributes_for :shipments
116
+
117
+ # Needs to happen before save_permalink is called
118
+ before_validation :associate_store
119
+ before_validation :set_currency
120
+ before_validation :generate_order_number, on: :create
121
+ before_validation :assign_billing_to_shipping_address, if: :use_billing?
122
+ attr_accessor :use_billing
123
+
124
+ before_create :create_token
125
+ before_create :link_by_email
126
+
127
+ validates :email, presence: true, if: :require_email
128
+ validates :email, 'spree/email' => true, allow_blank: true
129
+ validates :guest_token, presence: { allow_nil: true }
130
+ validates :number, presence: true, uniqueness: { allow_blank: true }
131
+ validates :store_id, presence: true
132
+
133
+ def self.find_by_param(value)
134
+ find_by number: value
135
+ end
136
+
137
+ def self.find_by_param!(value)
138
+ find_by! number: value
139
+ end
140
+
141
+ delegate :update_totals, :persist_totals, to: :updater
142
+ delegate :firstname, :lastname, to: :bill_address, prefix: true, allow_nil: true
143
+ alias_method :billing_firstname, :bill_address_firstname
144
+ alias_method :billing_lastname, :bill_address_lastname
145
+
146
+ class_attribute :update_hooks
147
+ self.update_hooks = Set.new
148
+
149
+ class_attribute :line_item_comparison_hooks
150
+ self.line_item_comparison_hooks = Set.new
151
+
152
+ scope :created_between, ->(start_date, end_date) { where(created_at: start_date..end_date) }
153
+ scope :completed_between, ->(start_date, end_date) { where(completed_at: start_date..end_date) }
154
+
155
+ scope :by_store, ->(store) { where(store_id: store.id) }
156
+
157
+ # shows completed orders first, by their completed_at date, then uncompleted orders by their created_at
158
+ scope :reverse_chronological, -> { order(Arel.sql('spree_orders.completed_at IS NULL'), completed_at: :desc, created_at: :desc) }
159
+
160
+ def self.by_customer(customer)
161
+ joins(:user).where("#{Spree.user_class.table_name}.email" => customer)
162
+ end
163
+
164
+ def self.by_state(state)
165
+ where(state: state)
166
+ end
167
+
168
+ def self.complete
169
+ where.not(completed_at: nil)
170
+ end
171
+
172
+ def self.incomplete
173
+ where(completed_at: nil)
174
+ end
175
+
176
+ def self.canceled
177
+ where(state: 'canceled')
178
+ end
179
+
180
+ def self.not_canceled
181
+ where.not(state: 'canceled')
182
+ end
183
+
184
+ # Use this method in other gems that wish to register their own custom logic
185
+ # that should be called after Order#update
186
+ def self.register_update_hook(hook)
187
+ update_hooks.add(hook)
188
+ end
189
+
190
+ # Use this method in other gems that wish to register their own custom logic
191
+ # that should be called when determining if two line items are equal.
192
+ def self.register_line_item_comparison_hook(hook)
193
+ line_item_comparison_hooks.add(hook)
194
+ end
195
+
196
+ # For compatiblity with Calculator::PriceSack
197
+ def amount
198
+ line_items.map(&:amount).sum
199
+ end
200
+
201
+ # Sum of all line item amounts after promotions, before added tax
202
+ def discounted_item_amount
203
+ line_items.to_a.sum(&:discounted_amount)
204
+ end
205
+ deprecate discounted_item_amount: :item_total_before_tax, deprecator: Spree::Deprecation
206
+
207
+ def item_total_before_tax
208
+ line_items.to_a.sum(&:total_before_tax)
209
+ end
210
+
211
+ # Sum of all line item amounts pre-tax
212
+ def item_total_excluding_vat
213
+ line_items.to_a.sum(&:total_excluding_vat)
214
+ end
215
+ alias pre_tax_item_amount item_total_excluding_vat
216
+ deprecate pre_tax_item_amount: :item_total_excluding_vat, deprecator: Spree::Deprecation
217
+
218
+ def currency
219
+ self[:currency] || Spree::Config[:currency]
220
+ end
221
+
222
+ def shipping_discount
223
+ shipment_adjustments.eligible.sum(:amount) * - 1
224
+ end
225
+
226
+ def to_param
227
+ number
228
+ end
229
+
230
+ def completed?
231
+ completed_at.present?
232
+ end
233
+
234
+ # Indicates whether or not the user is allowed to proceed to checkout.
235
+ # Currently this is implemented as a check for whether or not there is at
236
+ # least one LineItem in the Order. Feel free to override this logic in your
237
+ # own application if you require additional steps before allowing a checkout.
238
+ def checkout_allowed?
239
+ line_items.count > 0
240
+ end
241
+
242
+ # Is this a free order in which case the payment step should be skipped
243
+ def payment_required?
244
+ total > 0
245
+ end
246
+
247
+ def confirmation_required?
248
+ true
249
+ end
250
+ deprecate :confirmation_required?, deprecator: Spree::Deprecation
251
+
252
+ def backordered?
253
+ shipments.any?(&:backordered?)
254
+ end
255
+
256
+ # Returns the address for taxation based on configuration
257
+ def tax_address
258
+ if Spree::Config[:tax_using_ship_address]
259
+ ship_address
260
+ else
261
+ bill_address
262
+ end || store.default_cart_tax_location
263
+ end
264
+
265
+ def updater
266
+ @updater ||= Spree::OrderUpdater.new(self)
267
+ end
268
+
269
+ def recalculate
270
+ updater.update
271
+ end
272
+
273
+ def update!(*args)
274
+ if args.empty?
275
+ Spree::Deprecation.warn "Calling order.update! with no arguments as a way to invoke the OrderUpdater is deprecated, since it conflicts with AR::Base#update! Please use order.recalculate instead"
276
+ recalculate
277
+ else
278
+ super
279
+ end
280
+ end
281
+
282
+ def assign_billing_to_shipping_address
283
+ self.ship_address = bill_address if bill_address
284
+ true
285
+ end
286
+
287
+ def allow_cancel?
288
+ return false unless completed? && state != 'canceled'
289
+ shipment_state.nil? || %w{ready backorder pending}.include?(shipment_state)
290
+ end
291
+
292
+ def all_inventory_units_returned?
293
+ inventory_units.all?(&:returned?)
294
+ end
295
+
296
+ def contents
297
+ @contents ||= Spree::OrderContents.new(self)
298
+ end
299
+
300
+ def shipping
301
+ @shipping ||= Spree::OrderShipping.new(self)
302
+ end
303
+
304
+ def cancellations
305
+ @cancellations ||= Spree::OrderCancellations.new(self)
306
+ end
307
+
308
+ # Associates the specified user with the order.
309
+ def associate_user!(user, override_email = true)
310
+ self.user = user
311
+ attrs_to_set = { user_id: user.try(:id) }
312
+ attrs_to_set[:email] = user.try(:email) if override_email
313
+ attrs_to_set[:created_by_id] = user.try(:id) if created_by.blank?
314
+
315
+ if persisted?
316
+ # immediately persist the changes we just made, but don't use save since we might have an invalid address associated
317
+ self.class.unscoped.where(id: id).update_all(attrs_to_set)
318
+ end
319
+
320
+ assign_attributes(attrs_to_set)
321
+ end
322
+
323
+ def generate_order_number(options = nil)
324
+ if options
325
+ Spree::Deprecation.warn \
326
+ "Passing options to Order#generate_order_number is deprecated. " \
327
+ "Please add your own instance of the order number generator " \
328
+ "with your options (#{options.inspect}) and store it as " \
329
+ "Spree::Config.order_number_generator in your stores config."
330
+ end
331
+ self.number ||= Spree::Config.order_number_generator.generate
332
+ end
333
+
334
+ def shipped_shipments
335
+ shipments.shipped
336
+ end
337
+
338
+ def contains?(variant, options = {})
339
+ find_line_item_by_variant(variant, options).present?
340
+ end
341
+
342
+ def quantity_of(variant, options = {})
343
+ line_item = find_line_item_by_variant(variant, options)
344
+ line_item ? line_item.quantity : 0
345
+ end
346
+
347
+ def find_line_item_by_variant(variant, options = {})
348
+ line_items.detect { |line_item|
349
+ line_item.variant_id == variant.id &&
350
+ line_item_options_match(line_item, options)
351
+ }
352
+ end
353
+
354
+ # This method enables extensions to participate in the
355
+ # "Are these line items equal" decision.
356
+ #
357
+ # When adding to cart, an extension would send something like:
358
+ # params[:product_customizations]=...
359
+ #
360
+ # and would provide:
361
+ #
362
+ # def product_customizations_match
363
+ def line_item_options_match(line_item, options)
364
+ return true unless options
365
+
366
+ line_item_comparison_hooks.all? { |hook|
367
+ send(hook, line_item, options)
368
+ }
369
+ end
370
+
371
+ # Creates new tax charges if there are any applicable rates. If prices already
372
+ # include taxes then price adjustments are created instead.
373
+ # @deprecated This now happens during #update!
374
+ def create_tax_charge!
375
+ Spree::Config.tax_adjuster_class.new(self).adjust!
376
+ end
377
+ deprecate create_tax_charge!: :update!, deprecator: Spree::Deprecation
378
+
379
+ def reimbursement_total
380
+ reimbursements.sum(:total)
381
+ end
382
+
383
+ def outstanding_balance
384
+ # If reimbursement has happened add it back to total to prevent balance_due payment state
385
+ # See: https://github.com/spree/spree/issues/6229
386
+
387
+ if state == 'canceled'
388
+ -1 * payment_total
389
+ else
390
+ total - reimbursement_total - payment_total
391
+ end
392
+ end
393
+
394
+ def outstanding_balance?
395
+ outstanding_balance != 0
396
+ end
397
+
398
+ def refund_total
399
+ payments.flat_map(&:refunds).sum(&:amount)
400
+ end
401
+
402
+ def name
403
+ if (address = bill_address || ship_address)
404
+ "#{address.firstname} #{address.lastname}"
405
+ end
406
+ end
407
+
408
+ def can_ship?
409
+ complete? || resumed? || awaiting_return? || returned?
410
+ end
411
+
412
+ def credit_cards
413
+ credit_card_ids = payments.from_credit_card.pluck(:source_id).uniq
414
+ Spree::CreditCard.where(id: credit_card_ids)
415
+ end
416
+
417
+ def valid_credit_cards
418
+ credit_card_ids = payments.from_credit_card.valid.pluck(:source_id).uniq
419
+ Spree::CreditCard.where(id: credit_card_ids)
420
+ end
421
+
422
+ # Finalizes an in progress order after checkout is complete.
423
+ # Called after transition to complete state when payments will have been processed
424
+ def finalize!
425
+ # lock all adjustments (coupon promotions, etc.)
426
+ all_adjustments.each(&:finalize!)
427
+
428
+ # update payment and shipment(s) states, and save
429
+ updater.update_payment_state
430
+ shipments.each do |shipment|
431
+ shipment.update_state
432
+ shipment.finalize!
433
+ end
434
+
435
+ updater.update_shipment_state
436
+ save!
437
+ updater.run_hooks
438
+
439
+ touch :completed_at
440
+
441
+ deliver_order_confirmation_email unless confirmation_delivered?
442
+ end
443
+
444
+ def fulfill!
445
+ shipments.each { |shipment| shipment.update_state if shipment.persisted? }
446
+ updater.update_shipment_state
447
+ save!
448
+ end
449
+
450
+ def deliver_order_confirmation_email
451
+ Spree::Config.order_mailer_class.confirm_email(self).deliver_later
452
+ update_column(:confirmation_delivered, true)
453
+ end
454
+
455
+ # Helper methods for checkout steps
456
+ def paid?
457
+ %w(paid credit_owed).include?(payment_state)
458
+ end
459
+
460
+ def available_payment_methods
461
+ @available_payment_methods ||= Spree::PaymentMethod
462
+ .active
463
+ .available_to_store(store)
464
+ .available_to_users
465
+ .order(:position)
466
+ end
467
+
468
+ def insufficient_stock_lines
469
+ line_items.select(&:insufficient_stock?)
470
+ end
471
+
472
+ ##
473
+ # Check to see if any line item variants are soft, deleted.
474
+ # If so add error and restart checkout.
475
+ def ensure_line_item_variants_are_not_deleted
476
+ if line_items.any? { |li| li.variant.discarded? }
477
+ errors.add(:base, I18n.t('spree.deleted_variants_present'))
478
+ restart_checkout_flow
479
+ false
480
+ else
481
+ true
482
+ end
483
+ end
484
+
485
+ def merge!(*args)
486
+ Spree::Config.order_merger_class.new(self).merge!(*args)
487
+ end
488
+
489
+ def empty!
490
+ line_items.destroy_all
491
+ adjustments.destroy_all
492
+ shipments.destroy_all
493
+ order_promotions.destroy_all
494
+
495
+ recalculate
496
+ end
497
+
498
+ alias_method :has_step?, :has_checkout_step?
499
+ deprecate has_step?: :has_checkout_step?, deprecator: Spree::Deprecation
500
+
501
+ def state_changed(name)
502
+ state = "#{name}_state"
503
+ if persisted?
504
+ old_state = send("#{state}_was")
505
+ new_state = send(state)
506
+ unless old_state == new_state
507
+ state_changes.create(
508
+ previous_state: old_state,
509
+ next_state: new_state,
510
+ name: name,
511
+ user_id: user_id
512
+ )
513
+ end
514
+ end
515
+ end
516
+ deprecate :state_changed, deprecator: Spree::Deprecation
517
+
518
+ def coupon_code=(code)
519
+ @coupon_code = begin
520
+ code.strip.downcase
521
+ rescue StandardError
522
+ nil
523
+ end
524
+ end
525
+
526
+ def can_add_coupon?
527
+ Spree::Promotion.order_activatable?(self)
528
+ end
529
+
530
+ def shipped?
531
+ %w(partial shipped).include?(shipment_state)
532
+ end
533
+
534
+ def ensure_shipping_address
535
+ unless ship_address && ship_address.valid?
536
+ errors.add(:base, I18n.t('spree.ship_address_required')) && (return false)
537
+ end
538
+ end
539
+
540
+ def create_proposed_shipments
541
+ if completed?
542
+ raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_order_completed'))
543
+ elsif shipments.any? { |s| !s.pending? }
544
+ raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_shipments_not_pending'))
545
+ else
546
+ shipments.destroy_all
547
+ self.shipments = Spree::Config.stock.coordinator_class.new(self).shipments
548
+ end
549
+ end
550
+
551
+ def apply_shipping_promotions
552
+ Spree::PromotionHandler::Shipping.new(self).activate
553
+ recalculate
554
+ end
555
+ deprecate apply_free_shipping_promotions: :apply_shipping_promotions, deprecator: Spree::Deprecation
556
+
557
+ # Clean shipments and make order back to address state
558
+ #
559
+ # At some point the might need to force the order to transition from address
560
+ # to delivery again so that proper updated shipments are created.
561
+ # e.g. customer goes back from payment step and changes order items
562
+ def ensure_updated_shipments
563
+ if !completed? && shipments.all?(&:pending?)
564
+ shipments.destroy_all
565
+ update_column(:shipment_total, 0)
566
+ restart_checkout_flow
567
+ end
568
+ end
569
+
570
+ def restart_checkout_flow
571
+ return if state == 'cart'
572
+
573
+ update_columns(
574
+ state: 'cart',
575
+ updated_at: Time.current
576
+ )
577
+ next! if !line_items.empty?
578
+ end
579
+
580
+ def refresh_shipment_rates
581
+ shipments.map(&:refresh_rates)
582
+ end
583
+
584
+ def shipping_eq_billing_address?
585
+ bill_address == ship_address
586
+ end
587
+
588
+ def set_shipments_cost
589
+ shipments.each(&:update_amounts)
590
+ recalculate
591
+ end
592
+ deprecate set_shipments_cost: :update!, deprecator: Spree::Deprecation
593
+
594
+ def is_risky?
595
+ payments.risky.count > 0
596
+ end
597
+
598
+ def canceled_by(user)
599
+ transaction do
600
+ cancel!
601
+ update_columns(
602
+ canceler_id: user.id,
603
+ canceled_at: Time.current
604
+ )
605
+ end
606
+ end
607
+
608
+ def approved?
609
+ !!approved_at
610
+ end
611
+
612
+ def can_approve?
613
+ !approved?
614
+ end
615
+
616
+ def quantity
617
+ line_items.sum(:quantity)
618
+ end
619
+
620
+ def has_non_reimbursement_related_refunds?
621
+ refunds.non_reimbursement.exists? ||
622
+ payments.offset_payment.exists? # how old versions of spree stored refunds
623
+ end
624
+
625
+ def token
626
+ Spree::Deprecation.warn("Spree::Order#token is DEPRECATED, please use #guest_token instead.", caller)
627
+ guest_token
628
+ end
629
+
630
+ def tax_total
631
+ additional_tax_total + included_tax_total
632
+ end
633
+
634
+ def add_store_credit_payments
635
+ return if user.nil?
636
+ return if payments.store_credits.checkout.empty? && user.available_store_credit_total(currency: currency).zero?
637
+
638
+ payments.store_credits.checkout.each(&:invalidate!)
639
+
640
+ # this can happen when multiple payments are present, auto_capture is
641
+ # turned off, and one of the payments fails when the user tries to
642
+ # complete the order, which sends the order back to the 'payment' state.
643
+ authorized_total = payments.pending.sum(:amount)
644
+
645
+ remaining_total = outstanding_balance - authorized_total
646
+
647
+ matching_store_credits = user.store_credits.where(currency: currency)
648
+
649
+ if matching_store_credits.any?
650
+ payment_method = Spree::PaymentMethod::StoreCredit.first
651
+
652
+ matching_store_credits.order_by_priority.each do |credit|
653
+ break if remaining_total.zero?
654
+ next if credit.amount_remaining.zero?
655
+
656
+ amount_to_take = [credit.amount_remaining, remaining_total].min
657
+ payments.create!(source: credit,
658
+ payment_method: payment_method,
659
+ amount: amount_to_take,
660
+ state: 'checkout',
661
+ response_code: credit.generate_authorization_code)
662
+ remaining_total -= amount_to_take
663
+ end
664
+ end
665
+
666
+ other_payments = payments.checkout.not_store_credits
667
+ if remaining_total.zero?
668
+ other_payments.each(&:invalidate!)
669
+ elsif other_payments.size == 1
670
+ other_payments.first.update_attributes!(amount: remaining_total)
671
+ end
672
+
673
+ payments.reset
674
+
675
+ if payments.where(state: %w(checkout pending completed)).sum(:amount) != total
676
+ errors.add(:base, I18n.t('spree.store_credit.errors.unable_to_fund')) && (return false)
677
+ end
678
+ end
679
+
680
+ def covered_by_store_credit?
681
+ return false unless user
682
+ user.available_store_credit_total(currency: currency) >= total
683
+ end
684
+ alias_method :covered_by_store_credit, :covered_by_store_credit?
685
+
686
+ def total_available_store_credit
687
+ return 0.0 unless user
688
+ user.available_store_credit_total(currency: currency)
689
+ end
690
+
691
+ def order_total_after_store_credit
692
+ total - total_applicable_store_credit
693
+ end
694
+
695
+ def total_applicable_store_credit
696
+ if can_complete? || complete?
697
+ payments.store_credits.valid.sum(:amount)
698
+ else
699
+ [total, (user.try(:available_store_credit_total, currency: currency) || 0.0)].min
700
+ end
701
+ end
702
+
703
+ def display_total_applicable_store_credit
704
+ Spree::Money.new(-total_applicable_store_credit, { currency: currency })
705
+ end
706
+
707
+ def display_store_credit_remaining_after_capture
708
+ Spree::Money.new(total_available_store_credit - total_applicable_store_credit, { currency: currency })
709
+ end
710
+
711
+ def bill_address_attributes=(attributes)
712
+ self.bill_address = Spree::Address.immutable_merge(bill_address, attributes)
713
+ end
714
+
715
+ def ship_address_attributes=(attributes)
716
+ self.ship_address = Spree::Address.immutable_merge(ship_address, attributes)
717
+ end
718
+
719
+ # Assigns a default bill_address and ship_address to the order based on the
720
+ # associated user's bill_address and ship_address.
721
+ # @note This doesn't persist the change bill_address or ship_address
722
+ def assign_default_user_addresses
723
+ if user
724
+ bill_address = (user.bill_address || user.default_address)
725
+ ship_address = (user.ship_address || user.default_address)
726
+ # this is one of 2 places still using User#bill_address
727
+ self.bill_address ||= bill_address if bill_address.try!(:valid?)
728
+ # Skip setting ship address if order doesn't have a delivery checkout step
729
+ # to avoid triggering validations on shipping address
730
+ self.ship_address ||= ship_address if ship_address.try!(:valid?) && checkout_steps.include?("delivery")
731
+ end
732
+ end
733
+
734
+ alias_method :assign_default_user_addresses!, :assign_default_user_addresses
735
+ deprecate assign_default_user_addresses!: :assign_default_user_addresses, deprecator: Spree::Deprecation
736
+ alias_method :assign_default_addresses!, :assign_default_user_addresses
737
+ deprecate assign_default_addresses!: :assign_default_user_addresses, deprecator: Spree::Deprecation
738
+
739
+ def persist_user_address!
740
+ if !temporary_address && user && user.respond_to?(:persist_order_address) && bill_address_id
741
+ user.persist_order_address(self)
742
+ end
743
+ end
744
+
745
+ def add_payment_sources_to_wallet
746
+ Spree::Config.
747
+ add_payment_sources_to_wallet_class.new(self).
748
+ add_to_wallet
749
+ end
750
+ alias_method :persist_user_credit_card, :add_payment_sources_to_wallet
751
+ deprecate persist_user_credit_card: :add_payment_sources_to_wallet, deprecator: Spree::Deprecation
752
+
753
+ def add_default_payment_from_wallet
754
+ builder = Spree::Config.default_payment_builder_class.new(self)
755
+
756
+ if payment = builder.build
757
+ payments << payment
758
+
759
+ if bill_address.nil?
760
+ # this is one of 2 places still using User#bill_address
761
+ self.bill_address = payment.source.try(:address) ||
762
+ user.bill_address
763
+ end
764
+ end
765
+ end
766
+ alias_method :assign_default_credit_card, :add_default_payment_from_wallet
767
+ deprecate assign_default_credit_card: :add_default_payment_from_wallet, deprecator: Spree::Deprecation
768
+
769
+ def record_ip_address(ip_address)
770
+ if last_ip_address != ip_address
771
+ update_attributes!(last_ip_address: ip_address)
772
+ end
773
+ end
774
+
775
+ def payments_attributes=(attributes)
776
+ validate_payments_attributes(attributes)
777
+ super(attributes)
778
+ end
779
+
780
+ def validate_payments_attributes(attributes)
781
+ attributes = Array(attributes)
782
+
783
+ attributes.each do |payment_attributes|
784
+ payment_method_id = payment_attributes[:payment_method_id]
785
+
786
+ # raise RecordNotFound unless it is an allowed payment method
787
+ available_payment_methods.find(payment_method_id) if payment_method_id
788
+ end
789
+ end
790
+
791
+ private
792
+
793
+ def process_payments_before_complete
794
+ return if !payment_required?
795
+
796
+ if payments.valid.empty?
797
+ errors.add(:base, I18n.t('spree.no_payment_found'))
798
+ return false
799
+ end
800
+
801
+ if process_payments!
802
+ true
803
+ else
804
+ saved_errors = errors[:base]
805
+ payment_failed!
806
+ saved_errors.each { |error| errors.add(:base, error) }
807
+ false
808
+ end
809
+ end
810
+
811
+ # In case a existing credit card is provided it needs to build the payment
812
+ # attributes from scratch so we can set the amount. example payload:
813
+ #
814
+ # {
815
+ # "order": {
816
+ # "existing_card": "2"
817
+ # }
818
+ # }
819
+ #
820
+ def update_params_payment_source
821
+ Spree::Deprecation.warn('update_params_payment_source is deprecated. Please use set_payment_parameters_amount instead.', caller)
822
+ if @updating_params[:order] && (@updating_params[:order][:payments_attributes] || @updating_params[:order][:existing_card])
823
+ @updating_params[:order][:payments_attributes] ||= [{}]
824
+ @updating_params[:order][:payments_attributes].first[:amount] = total
825
+ end
826
+ end
827
+
828
+ def associate_store
829
+ self.store ||= Spree::Store.default
830
+ end
831
+
832
+ def link_by_email
833
+ self.email = user.email if user
834
+ end
835
+
836
+ # Determine if email is required (we don't want validation errors before we hit the checkout)
837
+ def require_email
838
+ true unless new_record? || ['cart', 'address'].include?(state)
839
+ end
840
+
841
+ def ensure_inventory_units
842
+ if has_checkout_step?("delivery")
843
+ inventory_validator = Spree::Stock::InventoryValidator.new
844
+
845
+ errors = line_items.map { |line_item| inventory_validator.validate(line_item) }.compact
846
+ raise InsufficientStock if errors.any?
847
+ end
848
+ end
849
+
850
+ def ensure_promotions_eligible
851
+ adjustment_changed = all_adjustments.eligible.promotion.any? do |adjustment|
852
+ !adjustment.calculate_eligibility
853
+ end
854
+ if adjustment_changed
855
+ restart_checkout_flow
856
+ recalculate
857
+ errors.add(:base, I18n.t('spree.promotion_total_changed_before_complete'))
858
+ end
859
+ errors.empty?
860
+ end
861
+
862
+ def validate_line_item_availability
863
+ availability_validator = Spree::Stock::AvailabilityValidator.new
864
+ raise InsufficientStock unless line_items.all? { |line_item| availability_validator.validate(line_item) }
865
+ end
866
+
867
+ def ensure_line_items_present
868
+ unless line_items.present?
869
+ errors.add(:base, I18n.t('spree.there_are_no_items_for_this_order')) && (return false)
870
+ end
871
+ end
872
+
873
+ def ensure_available_shipping_rates
874
+ if shipments.empty? || shipments.any? { |shipment| shipment.shipping_rates.blank? }
875
+ # After this point, order redirects back to 'address' state and asks user to pick a proper address
876
+ # Therefore, shipments are not necessary at this point.
877
+ shipments.destroy_all
878
+ errors.add(:base, I18n.t('spree.items_cannot_be_shipped')) && (return false)
879
+ end
880
+ end
881
+
882
+ def after_cancel
883
+ shipments.each(&:cancel!)
884
+ payments.completed.each { |payment| payment.cancel! unless payment.fully_refunded? }
885
+ payments.store_credits.pending.each(&:void_transaction!)
886
+
887
+ send_cancel_email
888
+ recalculate
889
+ end
890
+
891
+ def send_cancel_email
892
+ Spree::Config.order_mailer_class.cancel_email(self).deliver_later
893
+ end
894
+
895
+ def after_resume
896
+ shipments.each(&:resume!)
897
+ end
898
+
899
+ def use_billing?
900
+ use_billing.in?([true, 'true', '1'])
901
+ end
902
+
903
+ def set_currency
904
+ self.currency = Spree::Config[:currency] if self[:currency].nil?
905
+ end
906
+
907
+ def create_token
908
+ self.guest_token ||= loop do
909
+ random_token = SecureRandom.urlsafe_base64(nil, false)
910
+ break random_token unless self.class.exists?(guest_token: random_token)
911
+ end
912
+ end
913
+ end
914
+ end