solidus_core 1.0.0.pre

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 (610) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +26 -0
  3. data/app/assets/images/logo/solidus.png +0 -0
  4. data/app/assets/images/logo/solidus_logo.png +0 -0
  5. data/app/assets/images/noimage/large.png +0 -0
  6. data/app/assets/images/noimage/mini.png +0 -0
  7. data/app/assets/images/noimage/product.png +0 -0
  8. data/app/assets/images/noimage/small.png +0 -0
  9. data/app/assets/javascripts/spree.js.coffee.erb +61 -0
  10. data/app/controllers/spree/base_controller.rb +15 -0
  11. data/app/helpers/spree/base_helper.rb +210 -0
  12. data/app/helpers/spree/checkout_helper.rb +31 -0
  13. data/app/helpers/spree/orders_helper.rb +17 -0
  14. data/app/helpers/spree/products_helper.rb +82 -0
  15. data/app/helpers/spree/store_helper.rb +16 -0
  16. data/app/helpers/spree/taxons_helper.rb +19 -0
  17. data/app/mailers/spree/base_mailer.rb +23 -0
  18. data/app/mailers/spree/carton_mailer.rb +12 -0
  19. data/app/mailers/spree/order_mailer.rb +35 -0
  20. data/app/mailers/spree/reimbursement_mailer.rb +10 -0
  21. data/app/mailers/spree/test_mailer.rb +8 -0
  22. data/app/models/concerns/spree/adjustment_source.rb +24 -0
  23. data/app/models/concerns/spree/calculated_adjustments.rb +33 -0
  24. data/app/models/concerns/spree/default_price.rb +34 -0
  25. data/app/models/concerns/spree/display_money.rb +32 -0
  26. data/app/models/concerns/spree/named_type.rb +12 -0
  27. data/app/models/concerns/spree/user_address.rb +30 -0
  28. data/app/models/concerns/spree/user_api_authentication.rb +13 -0
  29. data/app/models/concerns/spree/user_payment_source.rb +19 -0
  30. data/app/models/concerns/spree/user_reporting.rb +22 -0
  31. data/app/models/spree/ability.rb +74 -0
  32. data/app/models/spree/address.rb +157 -0
  33. data/app/models/spree/adjustment.rb +143 -0
  34. data/app/models/spree/app_configuration.rb +253 -0
  35. data/app/models/spree/asset.rb +6 -0
  36. data/app/models/spree/base.rb +15 -0
  37. data/app/models/spree/billing_integration.rb +21 -0
  38. data/app/models/spree/calculator.rb +47 -0
  39. data/app/models/spree/calculator/default_tax.rb +67 -0
  40. data/app/models/spree/calculator/flat_percent_item_total.rb +22 -0
  41. data/app/models/spree/calculator/flat_rate.rb +20 -0
  42. data/app/models/spree/calculator/flexi_rate.rb +33 -0
  43. data/app/models/spree/calculator/free_shipping.rb +21 -0
  44. data/app/models/spree/calculator/percent_on_line_item.rb +15 -0
  45. data/app/models/spree/calculator/percent_per_item.rb +50 -0
  46. data/app/models/spree/calculator/price_sack.rb +29 -0
  47. data/app/models/spree/calculator/returns/default_refund_amount.rb +36 -0
  48. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +22 -0
  49. data/app/models/spree/calculator/shipping/flat_rate.rb +18 -0
  50. data/app/models/spree/calculator/shipping/flexi_rate.rb +35 -0
  51. data/app/models/spree/calculator/shipping/per_item.rb +22 -0
  52. data/app/models/spree/calculator/shipping/price_sack.rb +28 -0
  53. data/app/models/spree/calculator/tiered_flat_rate.rb +37 -0
  54. data/app/models/spree/calculator/tiered_percent.rb +44 -0
  55. data/app/models/spree/carton.rb +57 -0
  56. data/app/models/spree/classification.rb +11 -0
  57. data/app/models/spree/country.rb +23 -0
  58. data/app/models/spree/credit_card.rb +197 -0
  59. data/app/models/spree/customer_return.rb +73 -0
  60. data/app/models/spree/exchange.rb +46 -0
  61. data/app/models/spree/gateway.rb +79 -0
  62. data/app/models/spree/gateway/bogus.rb +91 -0
  63. data/app/models/spree/gateway/bogus_simple.rb +26 -0
  64. data/app/models/spree/image.rb +44 -0
  65. data/app/models/spree/inventory_unit.rb +154 -0
  66. data/app/models/spree/item_adjustments.rb +85 -0
  67. data/app/models/spree/item_adjustments.rb.orig +93 -0
  68. data/app/models/spree/legacy_user.rb +38 -0
  69. data/app/models/spree/line_item.rb +183 -0
  70. data/app/models/spree/line_item_action.rb +6 -0
  71. data/app/models/spree/log_entry.rb +20 -0
  72. data/app/models/spree/option_type.rb +30 -0
  73. data/app/models/spree/option_value.rb +26 -0
  74. data/app/models/spree/option_values_variant.rb +6 -0
  75. data/app/models/spree/order.rb +811 -0
  76. data/app/models/spree/order/checkout.rb +351 -0
  77. data/app/models/spree/order/currency_updater.rb +40 -0
  78. data/app/models/spree/order/payments.rb +66 -0
  79. data/app/models/spree/order_cancellations.rb +72 -0
  80. data/app/models/spree/order_capturing.rb +49 -0
  81. data/app/models/spree/order_contents.rb +125 -0
  82. data/app/models/spree/order_inventory.rb +108 -0
  83. data/app/models/spree/order_mutex.rb +35 -0
  84. data/app/models/spree/order_promotion.rb +23 -0
  85. data/app/models/spree/order_shipping.rb +99 -0
  86. data/app/models/spree/order_stock_location.rb +15 -0
  87. data/app/models/spree/order_updater.rb +178 -0
  88. data/app/models/spree/payment.rb +292 -0
  89. data/app/models/spree/payment/processing.rb +210 -0
  90. data/app/models/spree/payment_capture_event.rb +9 -0
  91. data/app/models/spree/payment_method.rb +79 -0
  92. data/app/models/spree/payment_method/check.rb +31 -0
  93. data/app/models/spree/payment_method/store_credit.rb +127 -0
  94. data/app/models/spree/preference.rb +5 -0
  95. data/app/models/spree/preferences/configuration.rb +78 -0
  96. data/app/models/spree/preferences/preferable.rb +128 -0
  97. data/app/models/spree/preferences/preferable_class_methods.rb +64 -0
  98. data/app/models/spree/preferences/scoped_store.rb +33 -0
  99. data/app/models/spree/preferences/store.rb +93 -0
  100. data/app/models/spree/price.rb +62 -0
  101. data/app/models/spree/product.rb +347 -0
  102. data/app/models/spree/product/scopes.rb +262 -0
  103. data/app/models/spree/product_option_type.rb +7 -0
  104. data/app/models/spree/product_property.rb +25 -0
  105. data/app/models/spree/product_scope/scopes.rb +47 -0
  106. data/app/models/spree/promotion.rb +229 -0
  107. data/app/models/spree/promotion/actions/create_adjustment.rb +63 -0
  108. data/app/models/spree/promotion/actions/create_item_adjustments.rb +80 -0
  109. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +129 -0
  110. data/app/models/spree/promotion/actions/free_shipping.rb +41 -0
  111. data/app/models/spree/promotion/rules/first_order.rb +37 -0
  112. data/app/models/spree/promotion/rules/item_total.rb +61 -0
  113. data/app/models/spree/promotion/rules/one_use_per_user.rb +24 -0
  114. data/app/models/spree/promotion/rules/option_value.rb +50 -0
  115. data/app/models/spree/promotion/rules/product.rb +64 -0
  116. data/app/models/spree/promotion/rules/taxon.rb +69 -0
  117. data/app/models/spree/promotion/rules/user.rb +30 -0
  118. data/app/models/spree/promotion/rules/user_logged_in.rb +18 -0
  119. data/app/models/spree/promotion_action.rb +23 -0
  120. data/app/models/spree/promotion_builder.rb +55 -0
  121. data/app/models/spree/promotion_category.rb +6 -0
  122. data/app/models/spree/promotion_chooser.rb +30 -0
  123. data/app/models/spree/promotion_code.rb +39 -0
  124. data/app/models/spree/promotion_code/code_builder.rb +62 -0
  125. data/app/models/spree/promotion_handler/cart.rb +65 -0
  126. data/app/models/spree/promotion_handler/coupon.rb +119 -0
  127. data/app/models/spree/promotion_handler/free_shipping.rb +43 -0
  128. data/app/models/spree/promotion_handler/page.rb +24 -0
  129. data/app/models/spree/promotion_rule.rb +44 -0
  130. data/app/models/spree/property.rb +20 -0
  131. data/app/models/spree/prototype.rb +9 -0
  132. data/app/models/spree/refund.rb +96 -0
  133. data/app/models/spree/refund_reason.rb +13 -0
  134. data/app/models/spree/reimbursement.rb +188 -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_performer.rb +43 -0
  139. data/app/models/spree/reimbursement_tax_calculator.rb +38 -0
  140. data/app/models/spree/reimbursement_type.rb +16 -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 +70 -0
  145. data/app/models/spree/reimbursement_type/store_credit.rb +27 -0
  146. data/app/models/spree/return_authorization.rb +108 -0
  147. data/app/models/spree/return_authorization_reason.rb +7 -0
  148. data/app/models/spree/return_item.rb +311 -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 +17 -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/returns_calculator.rb +8 -0
  159. data/app/models/spree/role.rb +10 -0
  160. data/app/models/spree/role_user.rb +17 -0
  161. data/app/models/spree/shipment.rb +427 -0
  162. data/app/models/spree/shipping_calculator.rb +22 -0
  163. data/app/models/spree/shipping_category.rb +8 -0
  164. data/app/models/spree/shipping_manifest.rb +23 -0
  165. data/app/models/spree/shipping_method.rb +69 -0
  166. data/app/models/spree/shipping_method_category.rb +6 -0
  167. data/app/models/spree/shipping_rate.rb +57 -0
  168. data/app/models/spree/state.rb +30 -0
  169. data/app/models/spree/state_change.rb +15 -0
  170. data/app/models/spree/static_model_preferences.rb +32 -0
  171. data/app/models/spree/stock/adjuster.rb +28 -0
  172. data/app/models/spree/stock/availability_validator.rb +35 -0
  173. data/app/models/spree/stock/content_item.rb +48 -0
  174. data/app/models/spree/stock/coordinator.rb +96 -0
  175. data/app/models/spree/stock/differentiator.rb +44 -0
  176. data/app/models/spree/stock/estimator.rb +70 -0
  177. data/app/models/spree/stock/inventory_unit_builder.rb +22 -0
  178. data/app/models/spree/stock/inventory_validator.rb +14 -0
  179. data/app/models/spree/stock/package.rb +131 -0
  180. data/app/models/spree/stock/packer.rb +49 -0
  181. data/app/models/spree/stock/prioritizer.rb +47 -0
  182. data/app/models/spree/stock/quantifier.rb +47 -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 +32 -0
  187. data/app/models/spree/stock_item.rb +107 -0
  188. data/app/models/spree/stock_location.rb +128 -0
  189. data/app/models/spree/stock_movement.rb +26 -0
  190. data/app/models/spree/stock_transfer.rb +108 -0
  191. data/app/models/spree/store.rb +38 -0
  192. data/app/models/spree/store_credit.rb +267 -0
  193. data/app/models/spree/store_credit_category.rb +17 -0
  194. data/app/models/spree/store_credit_event.rb +52 -0
  195. data/app/models/spree/store_credit_type.rb +6 -0
  196. data/app/models/spree/tax_category.rb +19 -0
  197. data/app/models/spree/tax_rate.rb +199 -0
  198. data/app/models/spree/taxon.rb +103 -0
  199. data/app/models/spree/taxonomy.rb +27 -0
  200. data/app/models/spree/tracker.rb +8 -0
  201. data/app/models/spree/transfer_item.rb +58 -0
  202. data/app/models/spree/unit_cancel.rb +32 -0
  203. data/app/models/spree/user_stock_location.rb +6 -0
  204. data/app/models/spree/validations/db_maximum_length_validator.rb +22 -0
  205. data/app/models/spree/variant.rb +356 -0
  206. data/app/models/spree/variant/scopes.rb +40 -0
  207. data/app/models/spree/zone.rb +138 -0
  208. data/app/models/spree/zone_member.rb +11 -0
  209. data/app/views/layouts/spree/base_mailer.html.erb +784 -0
  210. data/app/views/spree/admin/orders/customer_details/_autocomplete.js.erb +19 -0
  211. data/app/views/spree/carton_mailer/shipped_email.text.erb +16 -0
  212. data/app/views/spree/order_mailer/cancel_email.html.erb +45 -0
  213. data/app/views/spree/order_mailer/cancel_email.text.erb +16 -0
  214. data/app/views/spree/order_mailer/confirm_email.html.erb +84 -0
  215. data/app/views/spree/order_mailer/confirm_email.text.erb +38 -0
  216. data/app/views/spree/order_mailer/inventory_cancellation_email.text.erb +10 -0
  217. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +22 -0
  218. data/app/views/spree/shared/_base_mailer_footer.html.erb +20 -0
  219. data/app/views/spree/shared/_base_mailer_header.html.erb +31 -0
  220. data/app/views/spree/shared/_error_messages.html.erb +11 -0
  221. data/app/views/spree/shipment_mailer/shipped_email.html.erb +34 -0
  222. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  223. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  224. data/config/initializers/friendly_id.rb +88 -0
  225. data/config/initializers/premailer_assets.rb +1 -0
  226. data/config/initializers/user_class_extensions.rb +42 -0
  227. data/config/locales/en.yml +1534 -0
  228. data/config/routes.rb +1 -0
  229. data/db/default/spree/countries.rb +19 -0
  230. data/db/default/spree/roles.rb +2 -0
  231. data/db/default/spree/states.rb +16 -0
  232. data/db/default/spree/store_credit.rb +16 -0
  233. data/db/default/spree/stores.rb +9 -0
  234. data/db/default/spree/zones.rb +17 -0
  235. data/db/migrate/20120831092320_spree_one_two.rb +481 -0
  236. data/db/migrate/20120831092359_spree_promo_one_two.rb +45 -0
  237. data/db/migrate/20120905145253_add_tax_rate_label.rb +5 -0
  238. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +5 -0
  239. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +8 -0
  240. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +5 -0
  241. data/db/migrate/20121010142909_add_states_required_to_countries.rb +5 -0
  242. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +6 -0
  243. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +11 -0
  244. data/db/migrate/20121031162139_split_prices_from_variants.rb +31 -0
  245. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +9 -0
  246. data/db/migrate/20121107184631_add_currency_to_line_items.rb +5 -0
  247. data/db/migrate/20121107194006_add_currency_to_orders.rb +5 -0
  248. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +5 -0
  249. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +5 -0
  250. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +5 -0
  251. data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +5 -0
  252. data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +6 -0
  253. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +9 -0
  254. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +6 -0
  255. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +5 -0
  256. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +9 -0
  257. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +5 -0
  258. data/db/migrate/20130211190146_create_spree_stock_items.rb +14 -0
  259. data/db/migrate/20130211191120_create_spree_stock_locations.rb +11 -0
  260. data/db/migrate/20130213191427_create_default_stock.rb +34 -0
  261. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +5 -0
  262. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +5 -0
  263. data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +5 -0
  264. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +6 -0
  265. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +6 -0
  266. data/db/migrate/20130228210442_create_shipping_method_zone.rb +21 -0
  267. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +5 -0
  268. data/db/migrate/20130301162924_create_shipping_method_categories.rb +13 -0
  269. data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +5 -0
  270. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +24 -0
  271. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +7 -0
  272. data/db/migrate/20130305143310_create_stock_movements.rb +12 -0
  273. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +22 -0
  274. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +5 -0
  275. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +5 -0
  276. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +5 -0
  277. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +8 -0
  278. data/db/migrate/20130319062004_change_orders_total_precision.rb +8 -0
  279. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +7 -0
  280. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +7 -0
  281. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +7 -0
  282. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +7 -0
  283. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +15 -0
  284. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +9 -0
  285. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +5 -0
  286. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +15 -0
  287. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +9 -0
  288. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +14 -0
  289. data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +5 -0
  290. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +13 -0
  291. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +5 -0
  292. data/db/migrate/20130417120035_update_adjustment_states.rb +16 -0
  293. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +15 -0
  294. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +14 -0
  295. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +5 -0
  296. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +5 -0
  297. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +23 -0
  298. data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +5 -0
  299. data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +5 -0
  300. data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +5 -0
  301. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +5 -0
  302. data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +5 -0
  303. data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +9 -0
  304. data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +9 -0
  305. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +6 -0
  306. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +5 -0
  307. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +7 -0
  308. data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +5 -0
  309. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +6 -0
  310. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +5 -0
  311. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +6 -0
  312. data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +5 -0
  313. data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +5 -0
  314. data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +5 -0
  315. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +10 -0
  316. data/db/migrate/20130806022521_drop_spree_mail_methods.rb +12 -0
  317. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +8 -0
  318. data/db/migrate/20130807024301_upgrade_adjustments.rb +40 -0
  319. data/db/migrate/20130807024302_rename_adjustment_fields.rb +14 -0
  320. data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +5 -0
  321. data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +5 -0
  322. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +5 -0
  323. data/db/migrate/20130813140619_expand_order_number_size.rb +9 -0
  324. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +5 -0
  325. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +5 -0
  326. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +5 -0
  327. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +16 -0
  328. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +8 -0
  329. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +15 -0
  330. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +19 -0
  331. data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +5 -0
  332. data/db/migrate/20130909115621_change_states_required_for_countries.rb +9 -0
  333. data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +5 -0
  334. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +5 -0
  335. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +7 -0
  336. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +16 -0
  337. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +5 -0
  338. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +6 -0
  339. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +5 -0
  340. data/db/migrate/20131118043959_add_included_to_adjustments.rb +5 -0
  341. data/db/migrate/20131118050234_rename_tax_total_fields.rb +11 -0
  342. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +21 -0
  343. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +5 -0
  344. data/db/migrate/20131127001002_add_position_to_classifications.rb +5 -0
  345. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +8 -0
  346. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +24 -0
  347. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +5 -0
  348. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +8 -0
  349. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +5 -0
  350. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +5 -0
  351. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +6 -0
  352. data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +5 -0
  353. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +6 -0
  354. data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +5 -0
  355. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +5 -0
  356. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +12 -0
  357. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +5 -0
  358. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +11 -0
  359. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +5 -0
  360. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +5 -0
  361. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +6 -0
  362. data/db/migrate/20140213184916_add_more_indexes.rb +13 -0
  363. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +5 -0
  364. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +8 -0
  365. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +13 -0
  366. data/db/migrate/20140309023735_migrate_old_preferences.rb +23 -0
  367. data/db/migrate/20140309024355_create_spree_stores.rb +25 -0
  368. data/db/migrate/20140309033438_create_store_from_preferences.rb +30 -0
  369. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +6 -0
  370. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +8 -0
  371. data/db/migrate/20140331100557_add_additional_store_fields.rb +8 -0
  372. data/db/migrate/20140410141842_add_many_missing_indexes.rb +17 -0
  373. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +66 -0
  374. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +5 -0
  375. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +8 -0
  376. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +5 -0
  377. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +29 -0
  378. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +10 -0
  379. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +6 -0
  380. data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +6 -0
  381. data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +5 -0
  382. data/db/migrate/20140625214618_create_spree_refunds.rb +12 -0
  383. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +12 -0
  384. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +5 -0
  385. data/db/migrate/20140708132019_create_order_mutex.rb +11 -0
  386. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +10 -0
  387. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +55 -0
  388. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +7 -0
  389. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +5 -0
  390. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +28 -0
  391. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +14 -0
  392. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +5 -0
  393. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +11 -0
  394. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +9 -0
  395. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +6 -0
  396. data/db/migrate/20140717155155_create_default_refund_reason.rb +9 -0
  397. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +7 -0
  398. data/db/migrate/20140718133010_create_spree_customer_returns.rb +9 -0
  399. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +6 -0
  400. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +15 -0
  401. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +5 -0
  402. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +13 -0
  403. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +15 -0
  404. data/db/migrate/20140725131539_create_spree_reimbursements.rb +21 -0
  405. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +5 -0
  406. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +7 -0
  407. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +5 -0
  408. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +20 -0
  409. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +10 -0
  410. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +5 -0
  411. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +10 -0
  412. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +9 -0
  413. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +10 -0
  414. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +7 -0
  415. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +5 -0
  416. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +6 -0
  417. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +5 -0
  418. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +6 -0
  419. data/db/migrate/20141009204607_add_store_id_to_orders.rb +8 -0
  420. data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +8 -0
  421. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +5 -0
  422. data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +8 -0
  423. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +13 -0
  424. data/db/migrate/20141105213646_update_classifications_positions.rb +9 -0
  425. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +5 -0
  426. data/db/migrate/20141231151320_add_default_column_to_price.rb +5 -0
  427. data/db/migrate/20150112194216_add_position_to_stock_location.rb +5 -0
  428. data/db/migrate/20150113002122_create_spree_promotion_codes.rb +13 -0
  429. data/db/migrate/20150113002123_create_adjustment_promotion_code_association.rb +6 -0
  430. data/db/migrate/20150121202544_add_restock_inventory_to_stock_location.rb +5 -0
  431. data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +5 -0
  432. data/db/migrate/20150127161843_create_order_stock_locations.rb +12 -0
  433. data/db/migrate/20150203151219_add_fulfillable_to_stock_location.rb +5 -0
  434. data/db/migrate/20150205210527_add_code_to_refund_reason.rb +5 -0
  435. data/db/migrate/20150213160148_add_promotion_code_id_to_orders_promotions.rb +7 -0
  436. data/db/migrate/20150213163612_add_approver_name_to_spree_orders.rb +5 -0
  437. data/db/migrate/20150225205344_move_promotion_code_to_promotion_code_value.rb +65 -0
  438. data/db/migrate/20150226195213_downcase_promotion_codes_values.rb +11 -0
  439. data/db/migrate/20150227161934_add_order_ids_to_adjustments_where_missing.rb +9 -0
  440. data/db/migrate/20150303212749_add_per_code_usage_limit_to_promotions.rb +5 -0
  441. data/db/migrate/20150303212826_remove_usage_limit_from_promotion_codes.rb +5 -0
  442. data/db/migrate/20150304211616_add_timestamps_to_order_promotions.rb +6 -0
  443. data/db/migrate/20150305043021_create_spree_cartons.rb +24 -0
  444. data/db/migrate/20150305210403_add_timestamps_to_spree_roles_users.rb +7 -0
  445. data/db/migrate/20150313140507_remove_considered_risky_from_spree_orders.rb +5 -0
  446. data/db/migrate/20150313192827_add_index_to_inventory_units_carton_id.rb +5 -0
  447. data/db/migrate/20150313201235_add_imported_from_shipment_id_to_cartons.rb +8 -0
  448. data/db/migrate/20150313201503_copy_shipped_shipments_to_cartons.rb +13 -0
  449. data/db/migrate/20150330144639_create_spree_user_stock_locations.rb +10 -0
  450. data/db/migrate/20150331134544_add_stock_location_code.rb +5 -0
  451. data/db/migrate/20150402210430_create_unit_cancels.rb +10 -0
  452. data/db/migrate/20150407173305_add_fields_to_stock_transfer.rb +12 -0
  453. data/db/migrate/20150407173531_create_transfer_items.rb +14 -0
  454. data/db/migrate/20150424143547_drop_stock_transfer_type.rb +10 -0
  455. data/db/migrate/20150424161102_add_stock_transfer_finalized_at.rb +8 -0
  456. data/db/migrate/20150429125822_rename_stock_transfer_reference.rb +5 -0
  457. data/db/migrate/20150430233803_create_line_item_actions.rb +10 -0
  458. data/db/migrate/20150506181159_create_spree_store_credit_categories.rb +10 -0
  459. data/db/migrate/20150506181244_create_spree_store_credits.rb +19 -0
  460. data/db/migrate/20150506181539_create_spree_store_credit_events.rb +17 -0
  461. data/db/migrate/20150506181611_create_spree_store_credit_payment_method.rb +13 -0
  462. data/db/migrate/20150506181715_create_store_credit_types.rb +17 -0
  463. data/db/migrate/20150506182045_create_store_credit_reimbursement_type.rb +5 -0
  464. data/db/migrate/20150508044622_add_resellable_to_return_items.rb +5 -0
  465. data/db/migrate/20150514185559_add_invalidated_at_to_spree_store_credits.rb +5 -0
  466. data/db/migrate/20150514201836_migrate_deleted_store_credits_to_invalidated.rb +13 -0
  467. data/db/migrate/20150515170322_add_check_stock_on_transfer.rb +5 -0
  468. data/db/migrate/20150528125647_delete_inventory_units_without_shipment.rb +25 -0
  469. data/db/migrate/20150601191251_add_deleted_at_to_stock_transfers.rb +5 -0
  470. data/db/migrate/20150601204148_add_deleted_at_to_transfer_items.rb +5 -0
  471. data/db/migrate/20150609193231_add_preferences_to_promotion_actions.rb +5 -0
  472. data/db/migrate/20150610182638_add_id_to_spree_option_values_variants.rb +5 -0
  473. data/db/migrate/20150611200247_add_frontend_viewable_to_spree_orders.rb +5 -0
  474. data/db/migrate/20150612205731_remove_spree_configurations.rb +15 -0
  475. data/db/migrate/20150618191713_remove_credit_card_address_id.rb +7 -0
  476. data/db/migrate/20150626214817_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb +10 -0
  477. data/db/seeds.rb +5 -0
  478. data/lib/generators/spree/custom_user/custom_user_generator.rb +56 -0
  479. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +36 -0
  480. data/lib/generators/spree/custom_user/templates/initializer.rb.tt +1 -0
  481. data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -0
  482. data/lib/generators/spree/dummy/dummy_generator.rb +140 -0
  483. data/lib/generators/spree/dummy/templates/initializers/custom_user.rb +1 -0
  484. data/lib/generators/spree/dummy/templates/initializers/devise.rb +3 -0
  485. data/lib/generators/spree/dummy/templates/rails/application.rb +10 -0
  486. data/lib/generators/spree/dummy/templates/rails/boot.rb +6 -0
  487. data/lib/generators/spree/dummy/templates/rails/database.yml +65 -0
  488. data/lib/generators/spree/dummy/templates/rails/routes.rb +2 -0
  489. data/lib/generators/spree/dummy/templates/rails/script/rails +6 -0
  490. data/lib/generators/spree/dummy/templates/rails/test.rb +34 -0
  491. data/lib/generators/spree/install/install_generator.rb +191 -0
  492. data/lib/generators/spree/install/templates/config/initializers/spree.rb +41 -0
  493. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +13 -0
  494. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +13 -0
  495. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +12 -0
  496. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +12 -0
  497. data/lib/solidus_core.rb +1 -0
  498. data/lib/spree/core.rb +95 -0
  499. data/lib/spree/core/controller_helpers/auth.rb +83 -0
  500. data/lib/spree/core/controller_helpers/common.rb +74 -0
  501. data/lib/spree/core/controller_helpers/order.rb +106 -0
  502. data/lib/spree/core/controller_helpers/respond_with.rb +65 -0
  503. data/lib/spree/core/controller_helpers/search.rb +14 -0
  504. data/lib/spree/core/controller_helpers/store.rb +19 -0
  505. data/lib/spree/core/controller_helpers/strong_parameters.rb +42 -0
  506. data/lib/spree/core/delegate_belongs_to.rb +95 -0
  507. data/lib/spree/core/engine.rb +114 -0
  508. data/lib/spree/core/environment.rb +15 -0
  509. data/lib/spree/core/environment/calculators.rb +12 -0
  510. data/lib/spree/core/environment_extension.rb +25 -0
  511. data/lib/spree/core/importer.rb +9 -0
  512. data/lib/spree/core/importer/order.rb +202 -0
  513. data/lib/spree/core/importer/product.rb +62 -0
  514. data/lib/spree/core/permalinks.rb +71 -0
  515. data/lib/spree/core/product_duplicator.rb +74 -0
  516. data/lib/spree/core/product_filters.rb +194 -0
  517. data/lib/spree/core/routes.rb +46 -0
  518. data/lib/spree/core/search/base.rb +97 -0
  519. data/lib/spree/core/search/variant.rb +46 -0
  520. data/lib/spree/core/unreturned_item_charger.rb +102 -0
  521. data/lib/spree/core/validators/email.rb +7 -0
  522. data/lib/spree/core/version.rb +5 -0
  523. data/lib/spree/i18n.rb +37 -0
  524. data/lib/spree/i18n/base.rb +17 -0
  525. data/lib/spree/i18n/initializer.rb +1 -0
  526. data/lib/spree/localized_number.rb +24 -0
  527. data/lib/spree/migrations.rb +76 -0
  528. data/lib/spree/money.rb +72 -0
  529. data/lib/spree/permitted_attributes.rb +114 -0
  530. data/lib/spree/promo/environment.rb +9 -0
  531. data/lib/spree/responder.rb +45 -0
  532. data/lib/spree/testing_support/ability_helpers.rb +105 -0
  533. data/lib/spree/testing_support/authorization_helpers.rb +63 -0
  534. data/lib/spree/testing_support/bar_ability.rb +14 -0
  535. data/lib/spree/testing_support/caching.rb +47 -0
  536. data/lib/spree/testing_support/capybara_ext.rb +163 -0
  537. data/lib/spree/testing_support/common_rake.rb +40 -0
  538. data/lib/spree/testing_support/controller_requests.rb +83 -0
  539. data/lib/spree/testing_support/extension_rake.rb +10 -0
  540. data/lib/spree/testing_support/factories.rb +20 -0
  541. data/lib/spree/testing_support/factories/address_factory.rb +22 -0
  542. data/lib/spree/testing_support/factories/adjustment_factory.rb +26 -0
  543. data/lib/spree/testing_support/factories/calculator_factory.rb +24 -0
  544. data/lib/spree/testing_support/factories/carton_factory.rb +21 -0
  545. data/lib/spree/testing_support/factories/country_factory.rb +9 -0
  546. data/lib/spree/testing_support/factories/credit_card_factory.rb +10 -0
  547. data/lib/spree/testing_support/factories/customer_return_factory.rb +31 -0
  548. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +10 -0
  549. data/lib/spree/testing_support/factories/line_item_factory.rb +14 -0
  550. data/lib/spree/testing_support/factories/options_factory.rb +13 -0
  551. data/lib/spree/testing_support/factories/order_factory.rb +100 -0
  552. data/lib/spree/testing_support/factories/order_promotion_factory.rb +6 -0
  553. data/lib/spree/testing_support/factories/payment_factory.rb +28 -0
  554. data/lib/spree/testing_support/factories/payment_method_factory.rb +27 -0
  555. data/lib/spree/testing_support/factories/price_factory.rb +7 -0
  556. data/lib/spree/testing_support/factories/product_factory.rb +36 -0
  557. data/lib/spree/testing_support/factories/product_option_type_factory.rb +6 -0
  558. data/lib/spree/testing_support/factories/product_property_factory.rb +6 -0
  559. data/lib/spree/testing_support/factories/promotion_category_factory.rb +6 -0
  560. data/lib/spree/testing_support/factories/promotion_code_factory.rb +6 -0
  561. data/lib/spree/testing_support/factories/promotion_factory.rb +62 -0
  562. data/lib/spree/testing_support/factories/property_factory.rb +6 -0
  563. data/lib/spree/testing_support/factories/prototype_factory.rb +6 -0
  564. data/lib/spree/testing_support/factories/refund_factory.rb +14 -0
  565. data/lib/spree/testing_support/factories/reimbursement_factory.rb +16 -0
  566. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +7 -0
  567. data/lib/spree/testing_support/factories/return_authorization_factory.rb +18 -0
  568. data/lib/spree/testing_support/factories/return_item_factory.rb +16 -0
  569. data/lib/spree/testing_support/factories/role_factory.rb +9 -0
  570. data/lib/spree/testing_support/factories/shipment_factory.rb +28 -0
  571. data/lib/spree/testing_support/factories/shipping_category_factory.rb +5 -0
  572. data/lib/spree/testing_support/factories/shipping_method_factory.rb +25 -0
  573. data/lib/spree/testing_support/factories/state_factory.rb +13 -0
  574. data/lib/spree/testing_support/factories/stock_factory.rb +31 -0
  575. data/lib/spree/testing_support/factories/stock_item_factory.rb +9 -0
  576. data/lib/spree/testing_support/factories/stock_location_factory.rb +28 -0
  577. data/lib/spree/testing_support/factories/stock_movement_factory.rb +11 -0
  578. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +28 -0
  579. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +6 -0
  580. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +15 -0
  581. data/lib/spree/testing_support/factories/store_credit_factory.rb +10 -0
  582. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +13 -0
  583. data/lib/spree/testing_support/factories/store_factory.rb +8 -0
  584. data/lib/spree/testing_support/factories/tax_category_factory.rb +7 -0
  585. data/lib/spree/testing_support/factories/tax_rate_factory.rb +8 -0
  586. data/lib/spree/testing_support/factories/taxon_factory.rb +7 -0
  587. data/lib/spree/testing_support/factories/taxonomy_factory.rb +5 -0
  588. data/lib/spree/testing_support/factories/tracker_factory.rb +7 -0
  589. data/lib/spree/testing_support/factories/user_factory.rb +22 -0
  590. data/lib/spree/testing_support/factories/variant_factory.rb +39 -0
  591. data/lib/spree/testing_support/factories/zone_factory.rb +17 -0
  592. data/lib/spree/testing_support/flash.rb +27 -0
  593. data/lib/spree/testing_support/i18n.rb +98 -0
  594. data/lib/spree/testing_support/mail.rb +20 -0
  595. data/lib/spree/testing_support/order_walkthrough.rb +78 -0
  596. data/lib/spree/testing_support/preferences.rb +29 -0
  597. data/lib/spree/testing_support/rspec-activemodel-mocks_patch.rb +8 -0
  598. data/lib/spree/testing_support/url_helpers.rb +9 -0
  599. data/lib/spree_core.rb +1 -0
  600. data/lib/tasks/core.rake +101 -0
  601. data/lib/tasks/email.rake +7 -0
  602. data/lib/tasks/exchanges.rake +48 -0
  603. data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +180 -0
  604. data/lib/tasks/order_capturing.rake +23 -0
  605. data/vendor/assets/javascripts/jquery-migrate-1.0.0.js +498 -0
  606. data/vendor/assets/javascripts/jquery.payment.js +497 -0
  607. data/vendor/assets/javascripts/jsuri.js +2 -0
  608. data/vendor/assets/stylesheets/normalize.css +375 -0
  609. data/vendor/assets/stylesheets/skeleton.css +242 -0
  610. metadata +993 -0
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ class OptionValue < Spree::Base
3
+ belongs_to :option_type, class_name: 'Spree::OptionType', touch: true, inverse_of: :option_values
4
+ acts_as_list scope: :option_type
5
+
6
+ has_many :option_values_variants, dependent: :destroy
7
+ has_many :variants, through: :option_values_variants
8
+
9
+ validates :name, presence: true, uniqueness: { scope: :option_type_id }
10
+ validates :presentation, presence: true
11
+
12
+ after_touch :touch_all_variants
13
+
14
+ # Updates the updated_at column on all the variants associated with this
15
+ # option value.
16
+ def touch_all_variants
17
+ variants.update_all(updated_at: Time.current)
18
+ end
19
+
20
+ # @return [String] a string representation of all option value and its
21
+ # option type
22
+ def presentation_with_option_type
23
+ "#{self.option_type.presentation} - #{self.presentation}"
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class OptionValuesVariant < ActiveRecord::Base
3
+ belongs_to :variant
4
+ belongs_to :option_value
5
+ end
6
+ end
@@ -0,0 +1,811 @@
1
+ require 'spree/core/validators/email'
2
+ require 'spree/order/checkout'
3
+
4
+ module Spree
5
+ class Order < Spree::Base
6
+
7
+ ORDER_NUMBER_LENGTH = 9
8
+ ORDER_NUMBER_LETTERS = false
9
+ ORDER_NUMBER_PREFIX = 'R'
10
+
11
+ include Spree::Order::Checkout
12
+ include Spree::Order::CurrencyUpdater
13
+ include Spree::Order::Payments
14
+
15
+ class InsufficientStock < StandardError; end
16
+
17
+ extend Spree::DisplayMoney
18
+ money_methods :outstanding_balance, :item_total, :adjustment_total,
19
+ :included_tax_total, :additional_tax_total, :tax_total,
20
+ :shipment_total, :total, :order_total_after_store_credit, :total_available_store_credit
21
+ alias :display_ship_total :display_shipment_total
22
+
23
+ checkout_flow do
24
+ go_to_state :address
25
+ go_to_state :delivery
26
+ go_to_state :payment, if: ->(order) { order.payment_required? }
27
+ go_to_state :confirm
28
+ end
29
+
30
+ attr_reader :coupon_code
31
+ attr_accessor :temporary_address, :temporary_credit_card
32
+
33
+ if Spree.user_class
34
+ belongs_to :user, class_name: Spree.user_class.to_s
35
+ belongs_to :created_by, class_name: Spree.user_class.to_s
36
+ belongs_to :approver, class_name: Spree.user_class.to_s
37
+ belongs_to :canceler, class_name: Spree.user_class.to_s
38
+ else
39
+ belongs_to :user
40
+ belongs_to :created_by
41
+ belongs_to :approver
42
+ belongs_to :canceler
43
+ end
44
+
45
+ belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
46
+ alias_attribute :billing_address, :bill_address
47
+
48
+ belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
49
+ alias_attribute :shipping_address, :ship_address
50
+ alias_attribute :ship_total, :shipment_total
51
+
52
+ belongs_to :store, class_name: 'Spree::Store'
53
+ has_many :state_changes, as: :stateful
54
+ has_many :line_items, -> { order('created_at', 'id') }, dependent: :destroy, inverse_of: :order
55
+ has_many :payments, dependent: :destroy
56
+ has_many :return_authorizations, dependent: :destroy, inverse_of: :order
57
+ has_many :reimbursements, inverse_of: :order
58
+ has_many :adjustments, -> { order("#{Adjustment.table_name}.created_at ASC") }, as: :adjustable, inverse_of: :adjustable, dependent: :destroy
59
+ has_many :line_item_adjustments, through: :line_items, source: :adjustments
60
+ has_many :shipment_adjustments, through: :shipments, source: :adjustments
61
+ has_many :inventory_units, inverse_of: :order
62
+ has_many :products, through: :variants
63
+ has_many :variants, through: :line_items
64
+ has_many :refunds, through: :payments
65
+
66
+ has_many :order_stock_locations, class_name: "Spree::OrderStockLocation"
67
+ has_many :stock_locations, through: :order_stock_locations
68
+
69
+ has_many :order_promotions, class_name: 'Spree::OrderPromotion'
70
+ has_many :promotions, through: :order_promotions
71
+
72
+ has_many :cartons, -> { uniq }, through: :inventory_units
73
+ has_many :shipments, dependent: :destroy, inverse_of: :order do
74
+ def states
75
+ pluck(:state).uniq
76
+ end
77
+ end
78
+
79
+ accepts_nested_attributes_for :line_items
80
+ accepts_nested_attributes_for :bill_address
81
+ accepts_nested_attributes_for :ship_address
82
+ accepts_nested_attributes_for :payments
83
+ accepts_nested_attributes_for :shipments
84
+
85
+ # Needs to happen before save_permalink is called
86
+ before_validation :set_currency
87
+ before_validation :generate_order_number, on: :create
88
+ before_validation :clone_billing_address, if: :use_billing?
89
+ attr_accessor :use_billing
90
+
91
+
92
+ before_create :create_token
93
+ before_create :link_by_email
94
+ before_update :homogenize_line_item_currencies, if: :currency_changed?
95
+
96
+ validates :email, presence: true, if: :require_email
97
+ validates :email, email: true, if: :require_email, allow_blank: true
98
+ validates :number, presence: true, uniqueness: { allow_blank: true }
99
+ validate :has_available_shipment
100
+
101
+ make_permalink field: :number
102
+
103
+ delegate :update_totals, :persist_totals, :to => :updater
104
+
105
+ class_attribute :update_hooks
106
+ self.update_hooks = Set.new
107
+
108
+ class_attribute :line_item_comparison_hooks
109
+ self.line_item_comparison_hooks = Set.new
110
+
111
+ def self.by_number(number)
112
+ where(number: number)
113
+ end
114
+
115
+ scope :created_between, ->(start_date, end_date) { where(created_at: start_date..end_date) }
116
+ scope :completed_between, ->(start_date, end_date) { where(completed_at: start_date..end_date) }
117
+
118
+ scope :by_store, ->(store) { where(store_id: store.id) }
119
+
120
+ # shows completed orders first, by their completed_at date, then uncompleted orders by their created_at
121
+ scope :reverse_chronological, -> { order('spree_orders.completed_at IS NULL', completed_at: :desc, created_at: :desc) }
122
+ scope :unreturned_exchange, -> { joins(:shipments).where('spree_orders.created_at > spree_shipments.created_at') }
123
+
124
+ def self.by_customer(customer)
125
+ joins(:user).where("#{Spree.user_class.table_name}.email" => customer)
126
+ end
127
+
128
+ def self.by_state(state)
129
+ where(state: state)
130
+ end
131
+
132
+ def self.complete
133
+ where.not(completed_at: nil)
134
+ end
135
+
136
+ def self.incomplete
137
+ where(completed_at: nil)
138
+ end
139
+
140
+ # Use this method in other gems that wish to register their own custom logic
141
+ # that should be called after Order#update
142
+ def self.register_update_hook(hook)
143
+ self.update_hooks.add(hook)
144
+ end
145
+
146
+ # Use this method in other gems that wish to register their own custom logic
147
+ # that should be called when determining if two line items are equal.
148
+ def self.register_line_item_comparison_hook(hook)
149
+ self.line_item_comparison_hooks.add(hook)
150
+ end
151
+
152
+ def all_adjustments
153
+ Adjustment.where("order_id = :order_id OR (adjustable_id = :order_id AND adjustable_type = 'Spree::Order')",
154
+ order_id: self.id)
155
+ end
156
+
157
+ # For compatiblity with Calculator::PriceSack
158
+ def amount
159
+ line_items.inject(0.0) { |sum, li| sum + li.amount }
160
+ end
161
+
162
+ # Sum of all line item amounts pre-tax
163
+ def pre_tax_item_amount
164
+ line_items.to_a.sum(&:pre_tax_amount)
165
+ end
166
+
167
+ def currency
168
+ self[:currency] || Spree::Config[:currency]
169
+ end
170
+
171
+ def shipping_discount
172
+ shipment_adjustments.eligible.sum(:amount) * - 1
173
+ end
174
+
175
+ def to_param
176
+ number.to_s.to_url.upcase
177
+ end
178
+
179
+ def completed?
180
+ completed_at.present?
181
+ end
182
+
183
+ # Indicates whether or not the user is allowed to proceed to checkout.
184
+ # Currently this is implemented as a check for whether or not there is at
185
+ # least one LineItem in the Order. Feel free to override this logic in your
186
+ # own application if you require additional steps before allowing a checkout.
187
+ def checkout_allowed?
188
+ line_items.count > 0
189
+ end
190
+
191
+ # Is this a free order in which case the payment step should be skipped
192
+ def payment_required?
193
+ total.to_f > 0.0
194
+ end
195
+
196
+ def confirmation_required?
197
+ true
198
+ end
199
+
200
+ def backordered?
201
+ shipments.any?(&:backordered?)
202
+ end
203
+
204
+ # Returns the relevant zone (if any) to be used for taxation purposes.
205
+ # Uses default tax zone unless there is a specific match
206
+ def tax_zone
207
+ @tax_zone ||= Zone.match(tax_address) || Zone.default_tax
208
+ end
209
+
210
+ # Returns the address for taxation based on configuration
211
+ def tax_address
212
+ Spree::Config[:tax_using_ship_address] ? ship_address : bill_address
213
+ end
214
+
215
+ def updater
216
+ @updater ||= OrderUpdater.new(self)
217
+ end
218
+
219
+ def update!
220
+ updater.update
221
+ end
222
+
223
+ def clone_billing_address
224
+ if bill_address and self.ship_address.nil?
225
+ self.ship_address = bill_address.dup
226
+ else
227
+ self.ship_address.attributes = bill_address.attributes.except('id', 'updated_at', 'created_at')
228
+ end
229
+ true
230
+ end
231
+
232
+ def allow_cancel?
233
+ return false unless completed? and state != 'canceled'
234
+ shipment_state.nil? || %w{ready backorder pending}.include?(shipment_state)
235
+ end
236
+
237
+ def all_inventory_units_returned?
238
+ inventory_units.all? { |inventory_unit| inventory_unit.returned? }
239
+ end
240
+
241
+ def contents
242
+ @contents ||= Spree::OrderContents.new(self)
243
+ end
244
+
245
+ def shipping
246
+ @shipping ||= Spree::OrderShipping.new(self)
247
+ end
248
+
249
+ def cancellations
250
+ @cancellations ||= Spree::OrderCancellations.new(self)
251
+ end
252
+
253
+ # Associates the specified user with the order.
254
+ def associate_user!(user, override_email = true)
255
+ self.user = user
256
+ attrs_to_set = { user_id: user.try(:id) }
257
+ attrs_to_set[:email] = user.try(:email) if override_email
258
+ attrs_to_set[:created_by_id] = user.try(:id) if self.created_by.blank?
259
+
260
+ if persisted?
261
+ # immediately persist the changes we just made, but don't use save since we might have an invalid address associated
262
+ self.class.unscoped.where(id: id).update_all(attrs_to_set)
263
+ end
264
+
265
+ attrs_to_set[:ship_address_attributes] = user.ship_address.attributes.except('id', 'updated_at', 'created_at') if user.try(:ship_address)
266
+ attrs_to_set[:bill_address_attributes] = user.bill_address.attributes.except('id', 'updated_at', 'created_at') if user.try(:bill_address)
267
+ assign_attributes(attrs_to_set)
268
+ end
269
+
270
+ def generate_order_number(options = {})
271
+ options[:length] ||= ORDER_NUMBER_LENGTH
272
+ options[:letters] ||= ORDER_NUMBER_LETTERS
273
+ options[:prefix] ||= ORDER_NUMBER_PREFIX
274
+
275
+ possible = (0..9).to_a
276
+ possible += ('A'..'Z').to_a if options[:letters]
277
+
278
+ self.number ||= loop do
279
+ # Make a random number.
280
+ random = "#{options[:prefix]}#{(0...options[:length]).map { possible.shuffle.first }.join}"
281
+ # Use the random number if no other order exists with it.
282
+ if self.class.exists?(number: random)
283
+ # If over half of all possible options are taken add another digit.
284
+ options[:length] += 1 if self.class.count > (10 ** options[:length] / 2)
285
+ else
286
+ break random
287
+ end
288
+ end
289
+ end
290
+
291
+ def shipped_shipments
292
+ shipments.shipped
293
+ end
294
+
295
+ def contains?(variant, options = {})
296
+ find_line_item_by_variant(variant, options).present?
297
+ end
298
+
299
+ def quantity_of(variant, options = {})
300
+ line_item = find_line_item_by_variant(variant, options)
301
+ line_item ? line_item.quantity : 0
302
+ end
303
+
304
+ def find_line_item_by_variant(variant, options = {})
305
+ line_items.detect { |line_item|
306
+ line_item.variant_id == variant.id &&
307
+ line_item_options_match(line_item, options)
308
+ }
309
+ end
310
+
311
+ # This method enables extensions to participate in the
312
+ # "Are these line items equal" decision.
313
+ #
314
+ # When adding to cart, an extension would send something like:
315
+ # params[:product_customizations]={...}
316
+ #
317
+ # and would provide:
318
+ #
319
+ # def product_customizations_match
320
+ def line_item_options_match(line_item, options)
321
+ return true unless options
322
+
323
+ self.line_item_comparison_hooks.all? { |hook|
324
+ self.send(hook, line_item, options)
325
+ }
326
+ end
327
+
328
+ # Creates new tax charges if there are any applicable rates. If prices already
329
+ # include taxes then price adjustments are created instead.
330
+ def create_tax_charge!
331
+ # We want to only look up the applicable tax zone once and pass it to TaxRate calculation to avoid duplicated lookups.
332
+ order_tax_zone = self.tax_zone
333
+ Spree::TaxRate.adjust(order_tax_zone, line_items)
334
+ Spree::TaxRate.adjust(order_tax_zone, shipments) if shipments.any?
335
+ end
336
+
337
+ def outstanding_balance
338
+ if state == 'canceled'
339
+ -1 * payment_total
340
+ else
341
+ total - payment_total
342
+ end
343
+ end
344
+
345
+ def outstanding_balance?
346
+ self.outstanding_balance != 0
347
+ end
348
+
349
+ def name
350
+ if (address = bill_address || ship_address)
351
+ "#{address.firstname} #{address.lastname}"
352
+ end
353
+ end
354
+
355
+ def can_ship?
356
+ self.complete? || self.resumed? || self.awaiting_return? || self.returned?
357
+ end
358
+
359
+ def credit_cards
360
+ credit_card_ids = payments.from_credit_card.pluck(:source_id).uniq
361
+ CreditCard.where(id: credit_card_ids)
362
+ end
363
+
364
+ def valid_credit_cards
365
+ credit_card_ids = payments.from_credit_card.valid.pluck(:source_id).uniq
366
+ CreditCard.where(id: credit_card_ids)
367
+ end
368
+
369
+ # Finalizes an in progress order after checkout is complete.
370
+ # Called after transition to complete state when payments will have been processed
371
+ def finalize!
372
+ # lock all adjustments (coupon promotions, etc.)
373
+ all_adjustments.each{|a| a.close}
374
+
375
+ # update payment and shipment(s) states, and save
376
+ updater.update_payment_state
377
+ shipments.each do |shipment|
378
+ shipment.update!(self)
379
+ shipment.finalize!
380
+ end
381
+
382
+ updater.update_shipment_state
383
+ save!
384
+ updater.run_hooks
385
+
386
+ touch :completed_at
387
+
388
+ deliver_order_confirmation_email unless confirmation_delivered?
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(self.id).deliver_now
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(:front_end) + PaymentMethod.available(:both)).uniq
409
+ end
410
+
411
+ def billing_firstname
412
+ bill_address.try(:firstname)
413
+ end
414
+
415
+ def billing_lastname
416
+ bill_address.try(:lastname)
417
+ end
418
+
419
+ def insufficient_stock_lines
420
+ line_items.select(&:insufficient_stock?)
421
+ end
422
+
423
+ ##
424
+ # Check to see if any line item variants are soft, deleted.
425
+ # If so add error and restart checkout.
426
+ def ensure_line_item_variants_are_not_deleted
427
+ if line_items.any? { |li| li.variant.paranoia_destroyed? }
428
+ errors.add(:base, Spree.t(:deleted_variants_present))
429
+ restart_checkout_flow
430
+ false
431
+ else
432
+ true
433
+ end
434
+ end
435
+
436
+ def ensure_line_items_are_in_stock
437
+ if insufficient_stock_lines.present?
438
+ errors.add(:base, Spree.t(:insufficient_stock_lines_present))
439
+ restart_checkout_flow
440
+ false
441
+ else
442
+ true
443
+ end
444
+ end
445
+
446
+ def merge!(order, user = nil)
447
+ order.line_items.each do |other_order_line_item|
448
+ next unless other_order_line_item.currency == currency
449
+
450
+ # Compare the line items of the other order with mine.
451
+ # Make sure you allow any extensions to chime in on whether or
452
+ # not the extension-specific parts of the line item match
453
+ current_line_item = self.line_items.detect { |my_li|
454
+ my_li.variant == other_order_line_item.variant &&
455
+ self.line_item_comparison_hooks.all? { |hook|
456
+ self.send(hook, my_li, other_order_line_item.serializable_hash)
457
+ }
458
+ }
459
+ if current_line_item
460
+ current_line_item.quantity += other_order_line_item.quantity
461
+ current_line_item.save!
462
+ else
463
+ other_order_line_item.order_id = self.id
464
+ other_order_line_item.save!
465
+ end
466
+ end
467
+
468
+ self.associate_user!(user) if !self.user && !user.blank?
469
+
470
+ updater.update
471
+
472
+ # So that the destroy doesn't take out line items which may have been re-assigned
473
+ order.line_items.reload
474
+ order.destroy
475
+ end
476
+
477
+ def empty!
478
+ line_items.destroy_all
479
+ updater.update_item_count
480
+ adjustments.destroy_all
481
+ shipments.destroy_all
482
+
483
+ update_totals
484
+ persist_totals
485
+ end
486
+
487
+ def has_step?(step)
488
+ checkout_steps.include?(step)
489
+ end
490
+
491
+ def state_changed(name)
492
+ state = "#{name}_state"
493
+ if persisted?
494
+ old_state = self.send("#{state}_was")
495
+ new_state = self.send(state)
496
+ unless old_state == new_state
497
+ self.state_changes.create(
498
+ previous_state: old_state,
499
+ next_state: new_state,
500
+ name: name,
501
+ user_id: self.user_id
502
+ )
503
+ end
504
+ end
505
+ end
506
+
507
+ def coupon_code=(code)
508
+ @coupon_code = code.strip.downcase rescue nil
509
+ end
510
+
511
+ def can_add_coupon?
512
+ Spree::Promotion.order_activatable?(self)
513
+ end
514
+
515
+
516
+ def shipped?
517
+ %w(partial shipped).include?(shipment_state)
518
+ end
519
+
520
+ def ensure_shipping_address
521
+ unless ship_address && ship_address.valid?
522
+ errors.add(:base, Spree.t(:ship_address_required)) and return false
523
+ end
524
+ end
525
+
526
+ def create_proposed_shipments
527
+ adjustments.shipping.delete_all
528
+ shipments.destroy_all
529
+ self.shipments = Spree::Stock::Coordinator.new(self).shipments
530
+ end
531
+
532
+ def apply_free_shipping_promotions
533
+ Spree::PromotionHandler::FreeShipping.new(self).activate
534
+ shipments.each { |shipment| ItemAdjustments.new(shipment).update }
535
+ updater.update_shipment_total
536
+ persist_totals
537
+ end
538
+
539
+ # Clean shipments and make order back to address state
540
+ #
541
+ # At some point the might need to force the order to transition from address
542
+ # to delivery again so that proper updated shipments are created.
543
+ # e.g. customer goes back from payment step and changes order items
544
+ def ensure_updated_shipments
545
+ unless completed?
546
+ self.shipments.destroy_all
547
+ self.update_column(:shipment_total, 0)
548
+ restart_checkout_flow
549
+ end
550
+
551
+ end
552
+
553
+ def restart_checkout_flow
554
+ self.update_columns(
555
+ state: 'cart',
556
+ updated_at: Time.now,
557
+ )
558
+ self.next! if self.line_items.size > 0
559
+ end
560
+
561
+ def refresh_shipment_rates
562
+ shipments.map(&:refresh_rates)
563
+ end
564
+
565
+ def shipping_eq_billing_address?
566
+ (bill_address.empty? && ship_address.empty?) || bill_address.same_as?(ship_address)
567
+ end
568
+
569
+ def set_shipments_cost
570
+ shipments.each(&:update_amounts)
571
+ updater.update_shipment_total
572
+ persist_totals
573
+ end
574
+
575
+ def is_risky?
576
+ self.payments.risky.count > 0
577
+ end
578
+
579
+ def canceled_by(user)
580
+ self.transaction do
581
+ cancel!
582
+ self.update_columns(
583
+ canceler_id: user.id,
584
+ canceled_at: Time.now,
585
+ )
586
+ end
587
+ end
588
+
589
+ def approved?
590
+ !!self.approved_at
591
+ end
592
+
593
+ def can_approve?
594
+ !approved?
595
+ end
596
+
597
+ # moved from api order_decorator. This is a better place for it.
598
+ def update_line_items(line_item_params)
599
+ return if line_item_params.blank?
600
+ line_item_params.each_value do |attributes|
601
+ if attributes[:id].present?
602
+ self.line_items.find(attributes[:id]).update_attributes!(attributes)
603
+ else
604
+ self.line_items.create!(attributes)
605
+ end
606
+ end
607
+ self.ensure_updated_shipments
608
+ end
609
+
610
+ def reload(options=nil)
611
+ remove_instance_variable(:@tax_zone) if defined?(@tax_zone)
612
+ super
613
+ end
614
+
615
+ def quantity
616
+ line_items.sum(:quantity)
617
+ end
618
+
619
+ def has_non_reimbursement_related_refunds?
620
+ refunds.non_reimbursement.exists? ||
621
+ payments.offset_payment.exists? # how old versions of spree stored refunds
622
+ end
623
+
624
+ def token
625
+ ActiveSupport::Deprecation.warn("Spree::Order#token is DEPRECATED, please use #guest_token instead.", caller)
626
+ guest_token
627
+ end
628
+
629
+ def fully_discounted?
630
+ adjustment_total + line_items.map(&:final_amount).sum == 0.0
631
+ end
632
+ alias_method :fully_discounted, :fully_discounted?
633
+
634
+ def unreturned_exchange?
635
+ # created_at - 1 is a hack to ensure that this doesn't blow up on MySQL,
636
+ # records loaded from the DB on MySQL will have a precision of 1 second,
637
+ # but records in memory may still have miliseconds on them, causing this
638
+ # to be true where it shouldn't be.
639
+ #
640
+ # FIXME: find a better way to determine if an order is an unreturned
641
+ # exchange
642
+ shipment = self.shipments.first
643
+ shipment.present? ? (shipment.created_at < self.created_at - 1) : false
644
+ end
645
+
646
+ def tax_total
647
+ additional_tax_total + included_tax_total
648
+ end
649
+
650
+ def add_store_credit_payments
651
+ payments.store_credits.checkout.each(&:invalidate!)
652
+
653
+ # this can happen when multiple payments are present, auto_capture is
654
+ # turned off, and one of the payments fails when the user tries to
655
+ # complete the order, which sends the order back to the 'payment' state.
656
+ authorized_total = payments.pending.sum(:amount)
657
+
658
+ remaining_total = outstanding_balance - authorized_total
659
+
660
+ if user && user.store_credits.any?
661
+ payment_method = Spree::PaymentMethod::StoreCredit.first
662
+
663
+ user.store_credits.order_by_priority.each do |credit|
664
+ break if remaining_total.zero?
665
+ next if credit.amount_remaining.zero?
666
+
667
+ amount_to_take = [credit.amount_remaining, remaining_total].min
668
+ payments.create!(source: credit,
669
+ payment_method: payment_method,
670
+ amount: amount_to_take,
671
+ state: 'checkout',
672
+ response_code: credit.generate_authorization_code)
673
+ remaining_total -= amount_to_take
674
+ end
675
+ end
676
+
677
+ other_payments = payments.checkout.not_store_credits
678
+ if remaining_total.zero?
679
+ other_payments.each(&:invalidate!)
680
+ elsif other_payments.size == 1
681
+ other_payments.first.update_attributes!(amount: remaining_total)
682
+ end
683
+
684
+ payments.reset
685
+
686
+ if payments.where(state: %w(checkout pending)).sum(:amount) != total
687
+ errors.add(:base, Spree.t("store_credit.errors.unable_to_fund")) and return false
688
+ end
689
+
690
+ end
691
+
692
+ def covered_by_store_credit?
693
+ return false unless user
694
+ user.total_available_store_credit >= total
695
+ end
696
+ alias_method :covered_by_store_credit, :covered_by_store_credit?
697
+
698
+ def total_available_store_credit
699
+ return 0.0 unless user
700
+ user.total_available_store_credit
701
+ end
702
+
703
+ def order_total_after_store_credit
704
+ total - total_applicable_store_credit
705
+ end
706
+
707
+ def total_applicable_store_credit
708
+ if confirm? || complete?
709
+ payments.store_credits.valid.sum(:amount)
710
+ else
711
+ [total, (user.try(:total_available_store_credit) || 0.0)].min
712
+ end
713
+ end
714
+
715
+ def display_total_applicable_store_credit
716
+ Spree::Money.new(-total_applicable_store_credit, { currency: currency })
717
+ end
718
+
719
+ def display_store_credit_remaining_after_capture
720
+ Spree::Money.new(total_available_store_credit - total_applicable_store_credit, { currency: currency })
721
+ end
722
+
723
+ private
724
+
725
+ def link_by_email
726
+ self.email = user.email if self.user
727
+ end
728
+
729
+ # Determine if email is required (we don't want validation errors before we hit the checkout)
730
+ def require_email
731
+ true unless new_record? or ['cart', 'address'].include?(state)
732
+ end
733
+
734
+ def ensure_inventory_units
735
+ if has_step?("delivery")
736
+ inventory_validator = Spree::Stock::InventoryValidator.new
737
+
738
+ errors = line_items.map { |line_item| inventory_validator.validate(line_item) }.compact
739
+ raise InsufficientStock if errors.any?
740
+ end
741
+ end
742
+
743
+ def ensure_promotions_eligible
744
+ updater.update_adjustment_total
745
+ if promo_total_changed?
746
+ restart_checkout_flow
747
+ errors.add(:base, Spree.t(:promotion_total_changed_before_complete))
748
+ end
749
+ errors.empty?
750
+ end
751
+
752
+ def validate_line_item_availability
753
+ availability_validator = Spree::Stock::AvailabilityValidator.new
754
+ raise InsufficientStock unless line_items.all? { |line_item| availability_validator.validate(line_item) }
755
+ end
756
+
757
+ def ensure_line_items_present
758
+ unless line_items.present?
759
+ errors.add(:base, Spree.t(:there_are_no_items_for_this_order)) and return false
760
+ end
761
+ end
762
+
763
+ def has_available_shipment
764
+ return unless has_step?("delivery")
765
+ return unless has_step?(:address) && address?
766
+ return unless ship_address && ship_address.valid?
767
+ # errors.add(:base, :no_shipping_methods_available) if available_shipping_methods.empty?
768
+ end
769
+
770
+ def ensure_available_shipping_rates
771
+ if shipments.empty? || shipments.any? { |shipment| shipment.shipping_rates.blank? }
772
+ # After this point, order redirects back to 'address' state and asks user to pick a proper address
773
+ # Therefore, shipments are not necessary at this point.
774
+ shipments.delete_all
775
+ errors.add(:base, Spree.t(:items_cannot_be_shipped)) and return false
776
+ end
777
+ end
778
+
779
+ def after_cancel
780
+ shipments.each { |shipment| shipment.cancel! }
781
+ payments.completed.each { |payment| payment.cancel! }
782
+ payments.store_credits.pending.each { |payment| payment.void_transaction! }
783
+
784
+ send_cancel_email
785
+ self.update!
786
+ end
787
+
788
+ def send_cancel_email
789
+ OrderMailer.cancel_email(self.id).deliver_now
790
+ end
791
+
792
+ def after_resume
793
+ shipments.each { |shipment| shipment.resume! }
794
+ end
795
+
796
+ def use_billing?
797
+ @use_billing == true || @use_billing == 'true' || @use_billing == '1'
798
+ end
799
+
800
+ def set_currency
801
+ self.currency = Spree::Config[:currency] if self[:currency].nil?
802
+ end
803
+
804
+ def create_token
805
+ self.guest_token ||= loop do
806
+ random_token = SecureRandom.urlsafe_base64(nil, false)
807
+ break random_token unless self.class.exists?(guest_token: random_token)
808
+ end
809
+ end
810
+ end
811
+ end