goca-spree-core 3.1.14.rails.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (594) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +26 -0
  4. data/Rakefile +15 -0
  5. data/app/assets/images/logo/spree_50.png +0 -0
  6. data/app/assets/images/noimage/large.png +0 -0
  7. data/app/assets/images/noimage/mini.png +0 -0
  8. data/app/assets/images/noimage/product.png +0 -0
  9. data/app/assets/images/noimage/small.png +0 -0
  10. data/app/assets/javascripts/spree.js.coffee.erb +59 -0
  11. data/app/controllers/spree/base_controller.rb +15 -0
  12. data/app/helpers/spree/base_helper.rb +123 -0
  13. data/app/helpers/spree/products_helper.rb +91 -0
  14. data/app/mailers/spree/base_mailer.rb +27 -0
  15. data/app/mailers/spree/order_mailer.rb +17 -0
  16. data/app/mailers/spree/reimbursement_mailer.rb +10 -0
  17. data/app/mailers/spree/shipment_mailer.rb +10 -0
  18. data/app/mailers/spree/test_mailer.rb +8 -0
  19. data/app/models/concerns/spree/adjustment_source.rb +53 -0
  20. data/app/models/concerns/spree/calculated_adjustments.rb +34 -0
  21. data/app/models/concerns/spree/default_price.rb +40 -0
  22. data/app/models/concerns/spree/display_money.rb +32 -0
  23. data/app/models/concerns/spree/named_type.rb +12 -0
  24. data/app/models/concerns/spree/ransackable_attributes.rb +24 -0
  25. data/app/models/concerns/spree/user_address.rb +30 -0
  26. data/app/models/concerns/spree/user_api_authentication.rb +19 -0
  27. data/app/models/concerns/spree/user_methods.rb +57 -0
  28. data/app/models/concerns/spree/user_payment_source.rb +19 -0
  29. data/app/models/concerns/spree/user_reporting.rb +22 -0
  30. data/app/models/concerns/spree/vat_price_calculation.rb +47 -0
  31. data/app/models/friendly_id/slug_decorator.rb +3 -0
  32. data/app/models/spree/ability.rb +80 -0
  33. data/app/models/spree/address.rb +145 -0
  34. data/app/models/spree/adjustable/adjuster/base.rb +25 -0
  35. data/app/models/spree/adjustable/adjuster/promotion.rb +41 -0
  36. data/app/models/spree/adjustable/adjuster/tax.rb +26 -0
  37. data/app/models/spree/adjustable/adjustments_updater.rb +47 -0
  38. data/app/models/spree/adjustable/promotion_accumulator.rb +75 -0
  39. data/app/models/spree/adjustment.rb +104 -0
  40. data/app/models/spree/app_configuration.rb +74 -0
  41. data/app/models/spree/asset.rb +6 -0
  42. data/app/models/spree/base.rb +24 -0
  43. data/app/models/spree/calculator/default_tax.rb +59 -0
  44. data/app/models/spree/calculator/flat_percent_item_total.rb +22 -0
  45. data/app/models/spree/calculator/flat_rate.rb +20 -0
  46. data/app/models/spree/calculator/flexi_rate.rb +33 -0
  47. data/app/models/spree/calculator/free_shipping.rb +22 -0
  48. data/app/models/spree/calculator/percent_on_line_item.rb +15 -0
  49. data/app/models/spree/calculator/percent_per_item.rb +50 -0
  50. data/app/models/spree/calculator/price_sack.rb +29 -0
  51. data/app/models/spree/calculator/returns/default_refund_amount.rb +36 -0
  52. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +22 -0
  53. data/app/models/spree/calculator/shipping/flat_rate.rb +18 -0
  54. data/app/models/spree/calculator/shipping/flexi_rate.rb +35 -0
  55. data/app/models/spree/calculator/shipping/per_item.rb +22 -0
  56. data/app/models/spree/calculator/shipping/price_sack.rb +28 -0
  57. data/app/models/spree/calculator/tiered_flat_rate.rb +37 -0
  58. data/app/models/spree/calculator/tiered_percent.rb +44 -0
  59. data/app/models/spree/calculator.rb +47 -0
  60. data/app/models/spree/classification.rb +15 -0
  61. data/app/models/spree/country.rb +40 -0
  62. data/app/models/spree/credit_card.rb +166 -0
  63. data/app/models/spree/customer_return.rb +67 -0
  64. data/app/models/spree/exchange.rb +46 -0
  65. data/app/models/spree/gateway/bogus.rb +91 -0
  66. data/app/models/spree/gateway/bogus_simple.rb +26 -0
  67. data/app/models/spree/gateway.rb +80 -0
  68. data/app/models/spree/image.rb +43 -0
  69. data/app/models/spree/inventory_unit.rb +105 -0
  70. data/app/models/spree/legacy_user.rb +13 -0
  71. data/app/models/spree/line_item.rb +158 -0
  72. data/app/models/spree/log_entry.rb +17 -0
  73. data/app/models/spree/option_type.rb +32 -0
  74. data/app/models/spree/option_type_prototype.rb +9 -0
  75. data/app/models/spree/option_value.rb +26 -0
  76. data/app/models/spree/option_value_variant.rb +6 -0
  77. data/app/models/spree/order/checkout.rb +336 -0
  78. data/app/models/spree/order/currency_updater.rb +40 -0
  79. data/app/models/spree/order/payments.rb +66 -0
  80. data/app/models/spree/order/store_credit.rb +96 -0
  81. data/app/models/spree/order.rb +685 -0
  82. data/app/models/spree/order_contents.rb +120 -0
  83. data/app/models/spree/order_inventory.rb +103 -0
  84. data/app/models/spree/order_merger.rb +65 -0
  85. data/app/models/spree/order_promotion.rb +6 -0
  86. data/app/models/spree/order_updater.rb +177 -0
  87. data/app/models/spree/payment/gateway_options.rb +90 -0
  88. data/app/models/spree/payment/processing.rb +175 -0
  89. data/app/models/spree/payment.rb +276 -0
  90. data/app/models/spree/payment_capture_event.rb +9 -0
  91. data/app/models/spree/payment_method/check.rb +43 -0
  92. data/app/models/spree/payment_method/store_credit.rb +130 -0
  93. data/app/models/spree/payment_method.rb +71 -0
  94. data/app/models/spree/preference.rb +5 -0
  95. data/app/models/spree/preferences/configuration.rb +71 -0
  96. data/app/models/spree/preferences/preferable.rb +133 -0
  97. data/app/models/spree/preferences/preferable_class_methods.rb +51 -0
  98. data/app/models/spree/preferences/scoped_store.rb +33 -0
  99. data/app/models/spree/preferences/store.rb +98 -0
  100. data/app/models/spree/price.rb +53 -0
  101. data/app/models/spree/product/scopes.rb +271 -0
  102. data/app/models/spree/product.rb +384 -0
  103. data/app/models/spree/product_option_type.rb +12 -0
  104. data/app/models/spree/product_promotion_rule.rb +9 -0
  105. data/app/models/spree/product_property.rb +28 -0
  106. data/app/models/spree/promotion/actions/create_adjustment.rb +21 -0
  107. data/app/models/spree/promotion/actions/create_item_adjustments.rb +24 -0
  108. data/app/models/spree/promotion/actions/create_line_items.rb +62 -0
  109. data/app/models/spree/promotion/actions/free_shipping.rb +18 -0
  110. data/app/models/spree/promotion/rules/first_order.rb +37 -0
  111. data/app/models/spree/promotion/rules/item_total.rb +61 -0
  112. data/app/models/spree/promotion/rules/one_use_per_user.rb +24 -0
  113. data/app/models/spree/promotion/rules/option_value.rb +50 -0
  114. data/app/models/spree/promotion/rules/product.rb +65 -0
  115. data/app/models/spree/promotion/rules/taxon.rb +70 -0
  116. data/app/models/spree/promotion/rules/user.rb +30 -0
  117. data/app/models/spree/promotion/rules/user_logged_in.rb +18 -0
  118. data/app/models/spree/promotion.rb +198 -0
  119. data/app/models/spree/promotion_action.rb +25 -0
  120. data/app/models/spree/promotion_action_line_item.rb +6 -0
  121. data/app/models/spree/promotion_category.rb +6 -0
  122. data/app/models/spree/promotion_handler/cart.rb +51 -0
  123. data/app/models/spree/promotion_handler/coupon.rb +107 -0
  124. data/app/models/spree/promotion_handler/free_shipping.rb +33 -0
  125. data/app/models/spree/promotion_handler/page.rb +24 -0
  126. data/app/models/spree/promotion_rule.rb +43 -0
  127. data/app/models/spree/promotion_rule_taxon.rb +9 -0
  128. data/app/models/spree/promotion_rule_user.rb +9 -0
  129. data/app/models/spree/property.rb +23 -0
  130. data/app/models/spree/property_prototype.rb +9 -0
  131. data/app/models/spree/prototype.rb +14 -0
  132. data/app/models/spree/prototype_taxon.rb +9 -0
  133. data/app/models/spree/refund.rb +89 -0
  134. data/app/models/spree/refund_reason.rb +13 -0
  135. data/app/models/spree/reimbursement/credit.rb +25 -0
  136. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +56 -0
  137. data/app/models/spree/reimbursement/reimbursement_type_validator.rb +15 -0
  138. data/app/models/spree/reimbursement.rb +164 -0
  139. data/app/models/spree/reimbursement_performer.rb +43 -0
  140. data/app/models/spree/reimbursement_tax_calculator.rb +44 -0
  141. data/app/models/spree/reimbursement_type/credit.rb +13 -0
  142. data/app/models/spree/reimbursement_type/exchange.rb +9 -0
  143. data/app/models/spree/reimbursement_type/original_payment.rb +13 -0
  144. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +67 -0
  145. data/app/models/spree/reimbursement_type/store_credit.rb +28 -0
  146. data/app/models/spree/reimbursement_type.rb +16 -0
  147. data/app/models/spree/return_authorization.rb +98 -0
  148. data/app/models/spree/return_authorization_reason.rb +7 -0
  149. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +24 -0
  150. data/app/models/spree/return_item/eligibility_validator/default.rb +30 -0
  151. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +16 -0
  152. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +16 -0
  153. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +16 -0
  154. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +17 -0
  155. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +16 -0
  156. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +34 -0
  157. data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +9 -0
  158. data/app/models/spree/return_item.rb +236 -0
  159. data/app/models/spree/returns_calculator.rb +8 -0
  160. data/app/models/spree/role.rb +8 -0
  161. data/app/models/spree/role_user.rb +6 -0
  162. data/app/models/spree/shipment.rb +419 -0
  163. data/app/models/spree/shipment_handler.rb +43 -0
  164. data/app/models/spree/shipping_calculator.rb +22 -0
  165. data/app/models/spree/shipping_category.rb +11 -0
  166. data/app/models/spree/shipping_method.rb +69 -0
  167. data/app/models/spree/shipping_method_category.rb +6 -0
  168. data/app/models/spree/shipping_method_zone.rb +6 -0
  169. data/app/models/spree/shipping_rate.rb +44 -0
  170. data/app/models/spree/state.rb +41 -0
  171. data/app/models/spree/state_change.rb +10 -0
  172. data/app/models/spree/stock/adjuster.rb +27 -0
  173. data/app/models/spree/stock/availability_validator.rb +30 -0
  174. data/app/models/spree/stock/content_item.rb +54 -0
  175. data/app/models/spree/stock/coordinator.rb +65 -0
  176. data/app/models/spree/stock/differentiator.rb +44 -0
  177. data/app/models/spree/stock/estimator.rb +70 -0
  178. data/app/models/spree/stock/inventory_unit_builder.rb +22 -0
  179. data/app/models/spree/stock/package.rb +104 -0
  180. data/app/models/spree/stock/packer.rb +48 -0
  181. data/app/models/spree/stock/prioritizer.rb +47 -0
  182. data/app/models/spree/stock/quantifier.rb +29 -0
  183. data/app/models/spree/stock/splitter/backordered.rb +23 -0
  184. data/app/models/spree/stock/splitter/base.rb +28 -0
  185. data/app/models/spree/stock/splitter/shipping_category.rb +32 -0
  186. data/app/models/spree/stock/splitter/weight.rb +34 -0
  187. data/app/models/spree/stock_item.rb +90 -0
  188. data/app/models/spree/stock_location.rb +115 -0
  189. data/app/models/spree/stock_movement.rb +35 -0
  190. data/app/models/spree/stock_transfer.rb +50 -0
  191. data/app/models/spree/store.rb +48 -0
  192. data/app/models/spree/store_credit.rb +252 -0
  193. data/app/models/spree/store_credit_category.rb +22 -0
  194. data/app/models/spree/store_credit_event.rb +38 -0
  195. data/app/models/spree/store_credit_type.rb +6 -0
  196. data/app/models/spree/tax_category.rb +18 -0
  197. data/app/models/spree/tax_rate.rb +110 -0
  198. data/app/models/spree/taxon.rb +102 -0
  199. data/app/models/spree/taxonomy.rb +24 -0
  200. data/app/models/spree/tracker.rb +19 -0
  201. data/app/models/spree/validations/db_maximum_length_validator.rb +23 -0
  202. data/app/models/spree/variant.rb +312 -0
  203. data/app/models/spree/zone.rb +190 -0
  204. data/app/models/spree/zone_member.rb +12 -0
  205. data/app/validators/db_maximum_length_validator.rb +11 -0
  206. data/app/views/layouts/spree/base_mailer.html.erb +41 -0
  207. data/app/views/spree/admin/orders/customer_details/_autocomplete.js.erb +19 -0
  208. data/app/views/spree/order_mailer/_adjustment.html.erb +8 -0
  209. data/app/views/spree/order_mailer/_subtotal.html.erb +8 -0
  210. data/app/views/spree/order_mailer/_total.html.erb +8 -0
  211. data/app/views/spree/order_mailer/cancel_email.html.erb +30 -0
  212. data/app/views/spree/order_mailer/cancel_email.text.erb +16 -0
  213. data/app/views/spree/order_mailer/confirm_email.html.erb +70 -0
  214. data/app/views/spree/order_mailer/confirm_email.text.erb +38 -0
  215. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +22 -0
  216. data/app/views/spree/shared/_base_mailer_footer.html.erb +20 -0
  217. data/app/views/spree/shared/_base_mailer_header.html.erb +29 -0
  218. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +777 -0
  219. data/app/views/spree/shared/_error_messages.html.erb +11 -0
  220. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  221. data/app/views/spree/shipment_mailer/shipped_email.html.erb +41 -0
  222. data/app/views/spree/shipment_mailer/shipped_email.text.erb +16 -0
  223. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  224. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  225. data/config/initializers/assets.rb +1 -0
  226. data/config/initializers/friendly_id.rb +88 -0
  227. data/config/initializers/premailer_assets.rb +1 -0
  228. data/config/initializers/premailer_rails.rb +3 -0
  229. data/config/initializers/user_class_extensions.rb +10 -0
  230. data/config/locales/en.yml +1499 -0
  231. data/config/routes.rb +8 -0
  232. data/db/default/spree/countries.rb +29 -0
  233. data/db/default/spree/default_reimbursement_type.rb +1 -0
  234. data/db/default/spree/roles.rb +2 -0
  235. data/db/default/spree/states.rb +28 -0
  236. data/db/default/spree/stores.rb +9 -0
  237. data/db/default/spree/zones.rb +11 -0
  238. data/db/migrate/20120831092320_spree_one_two.rb +481 -0
  239. data/db/migrate/20120831092359_spree_promo_one_two.rb +45 -0
  240. data/db/migrate/20120905145253_add_tax_rate_label.rb +5 -0
  241. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +5 -0
  242. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +8 -0
  243. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +5 -0
  244. data/db/migrate/20121010142909_add_states_required_to_countries.rb +5 -0
  245. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +6 -0
  246. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +11 -0
  247. data/db/migrate/20121031162139_split_prices_from_variants.rb +31 -0
  248. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +9 -0
  249. data/db/migrate/20121107184631_add_currency_to_line_items.rb +5 -0
  250. data/db/migrate/20121107194006_add_currency_to_orders.rb +5 -0
  251. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +5 -0
  252. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +5 -0
  253. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +5 -0
  254. data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +5 -0
  255. data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +6 -0
  256. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +9 -0
  257. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +6 -0
  258. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +5 -0
  259. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +9 -0
  260. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +5 -0
  261. data/db/migrate/20130211190146_create_spree_stock_items.rb +14 -0
  262. data/db/migrate/20130211191120_create_spree_stock_locations.rb +11 -0
  263. data/db/migrate/20130213191427_create_default_stock.rb +33 -0
  264. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +5 -0
  265. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +5 -0
  266. data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +5 -0
  267. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +6 -0
  268. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +6 -0
  269. data/db/migrate/20130228210442_create_shipping_method_zone.rb +21 -0
  270. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +5 -0
  271. data/db/migrate/20130301162924_create_shipping_method_categories.rb +13 -0
  272. data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +5 -0
  273. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +24 -0
  274. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +7 -0
  275. data/db/migrate/20130305143310_create_stock_movements.rb +12 -0
  276. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +22 -0
  277. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +5 -0
  278. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +5 -0
  279. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +5 -0
  280. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +8 -0
  281. data/db/migrate/20130319062004_change_orders_total_precision.rb +8 -0
  282. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +7 -0
  283. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +7 -0
  284. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +7 -0
  285. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +7 -0
  286. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +15 -0
  287. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +9 -0
  288. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +5 -0
  289. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +15 -0
  290. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +9 -0
  291. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +14 -0
  292. data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +5 -0
  293. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +13 -0
  294. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +5 -0
  295. data/db/migrate/20130417120035_update_adjustment_states.rb +16 -0
  296. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +15 -0
  297. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +14 -0
  298. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +5 -0
  299. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +5 -0
  300. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +23 -0
  301. data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +5 -0
  302. data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +5 -0
  303. data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +5 -0
  304. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +5 -0
  305. data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +5 -0
  306. data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +9 -0
  307. data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +9 -0
  308. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +6 -0
  309. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +5 -0
  310. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +7 -0
  311. data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +5 -0
  312. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +6 -0
  313. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +5 -0
  314. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +6 -0
  315. data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +5 -0
  316. data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +5 -0
  317. data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +5 -0
  318. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +10 -0
  319. data/db/migrate/20130806022521_drop_spree_mail_methods.rb +12 -0
  320. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +8 -0
  321. data/db/migrate/20130807024301_upgrade_adjustments.rb +40 -0
  322. data/db/migrate/20130807024302_rename_adjustment_fields.rb +14 -0
  323. data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +5 -0
  324. data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +5 -0
  325. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +5 -0
  326. data/db/migrate/20130813140619_expand_order_number_size.rb +9 -0
  327. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +5 -0
  328. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +5 -0
  329. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +5 -0
  330. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +16 -0
  331. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +8 -0
  332. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +15 -0
  333. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +19 -0
  334. data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +5 -0
  335. data/db/migrate/20130909115621_change_states_required_for_countries.rb +9 -0
  336. data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +5 -0
  337. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +5 -0
  338. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +7 -0
  339. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +16 -0
  340. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +5 -0
  341. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +6 -0
  342. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +5 -0
  343. data/db/migrate/20131118043959_add_included_to_adjustments.rb +5 -0
  344. data/db/migrate/20131118050234_rename_tax_total_fields.rb +11 -0
  345. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +21 -0
  346. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +5 -0
  347. data/db/migrate/20131127001002_add_position_to_classifications.rb +5 -0
  348. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +8 -0
  349. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +24 -0
  350. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +5 -0
  351. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +8 -0
  352. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +5 -0
  353. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +5 -0
  354. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +6 -0
  355. data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +5 -0
  356. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +6 -0
  357. data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +5 -0
  358. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +5 -0
  359. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +12 -0
  360. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +5 -0
  361. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +11 -0
  362. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +5 -0
  363. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +5 -0
  364. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +6 -0
  365. data/db/migrate/20140213184916_add_more_indexes.rb +13 -0
  366. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +5 -0
  367. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +8 -0
  368. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +13 -0
  369. data/db/migrate/20140309023735_migrate_old_preferences.rb +23 -0
  370. data/db/migrate/20140309024355_create_spree_stores.rb +25 -0
  371. data/db/migrate/20140309033438_create_store_from_preferences.rb +37 -0
  372. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +6 -0
  373. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +8 -0
  374. data/db/migrate/20140331100557_add_additional_store_fields.rb +8 -0
  375. data/db/migrate/20140410141842_add_many_missing_indexes.rb +18 -0
  376. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +66 -0
  377. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +5 -0
  378. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +8 -0
  379. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +5 -0
  380. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +29 -0
  381. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +10 -0
  382. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +6 -0
  383. data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +6 -0
  384. data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +5 -0
  385. data/db/migrate/20140625214618_create_spree_refunds.rb +12 -0
  386. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +12 -0
  387. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +5 -0
  388. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +10 -0
  389. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +55 -0
  390. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +7 -0
  391. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +5 -0
  392. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +28 -0
  393. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +14 -0
  394. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +5 -0
  395. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +11 -0
  396. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +9 -0
  397. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +6 -0
  398. data/db/migrate/20140717155155_create_default_refund_reason.rb +9 -0
  399. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +7 -0
  400. data/db/migrate/20140718133010_create_spree_customer_returns.rb +9 -0
  401. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +6 -0
  402. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +15 -0
  403. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +5 -0
  404. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +13 -0
  405. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +15 -0
  406. data/db/migrate/20140725131539_create_spree_reimbursements.rb +21 -0
  407. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +5 -0
  408. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +7 -0
  409. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +5 -0
  410. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +20 -0
  411. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +10 -0
  412. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +5 -0
  413. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +10 -0
  414. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +9 -0
  415. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +10 -0
  416. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +7 -0
  417. data/db/migrate/20140911173301_add_kind_to_zone.rb +11 -0
  418. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +5 -0
  419. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +6 -0
  420. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +5 -0
  421. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +6 -0
  422. data/db/migrate/20141009204607_add_store_id_to_orders.rb +8 -0
  423. data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +8 -0
  424. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +5 -0
  425. data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +13 -0
  426. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +13 -0
  427. data/db/migrate/20141105213646_update_classifications_positions.rb +9 -0
  428. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +5 -0
  429. data/db/migrate/20141215232040_remove_token_permissions_table.rb +6 -0
  430. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +5 -0
  431. data/db/migrate/20141217215630_update_product_slug_index.rb +6 -0
  432. data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +5 -0
  433. data/db/migrate/20150118210639_create_spree_store_credits.rb +24 -0
  434. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +8 -0
  435. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +17 -0
  436. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +10 -0
  437. data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +6 -0
  438. data/db/migrate/20150122145607_add_resellable_to_return_items.rb +5 -0
  439. data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +5 -0
  440. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +6 -0
  441. data/db/migrate/20150128060325_remove_spree_configurations.rb +16 -0
  442. data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +13 -0
  443. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +9 -0
  444. data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +67 -0
  445. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
  446. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +14 -0
  447. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +70 -0
  448. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +5 -0
  449. data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +6 -0
  450. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +16 -0
  451. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
  452. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
  453. data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +6 -0
  454. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +12 -0
  455. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
  456. data/db/migrate/20150727191614_spree_store_credit_types.rb +11 -0
  457. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
  458. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +13 -0
  459. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
  460. data/db/migrate/20160219165458_add_indexes.rb +14 -0
  461. data/db/seeds.rb +5 -0
  462. data/lib/generators/spree/custom_user/custom_user_generator.rb +56 -0
  463. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +36 -0
  464. data/lib/generators/spree/custom_user/templates/initializer.rb.tt +1 -0
  465. data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -0
  466. data/lib/generators/spree/dummy/dummy_generator.rb +140 -0
  467. data/lib/generators/spree/dummy/templates/initializers/custom_user.rb +1 -0
  468. data/lib/generators/spree/dummy/templates/initializers/devise.rb +3 -0
  469. data/lib/generators/spree/dummy/templates/rails/application.rb +10 -0
  470. data/lib/generators/spree/dummy/templates/rails/boot.rb +6 -0
  471. data/lib/generators/spree/dummy/templates/rails/database.yml +72 -0
  472. data/lib/generators/spree/dummy/templates/rails/routes.rb +2 -0
  473. data/lib/generators/spree/dummy/templates/rails/script/rails +6 -0
  474. data/lib/generators/spree/dummy/templates/rails/test.rb +35 -0
  475. data/lib/generators/spree/install/install_generator.rb +233 -0
  476. data/lib/generators/spree/install/templates/config/initializers/spree.rb +18 -0
  477. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +17 -0
  478. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +17 -0
  479. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +16 -0
  480. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +16 -0
  481. data/lib/spree/core/controller_helpers/auth.rb +84 -0
  482. data/lib/spree/core/controller_helpers/common.rb +74 -0
  483. data/lib/spree/core/controller_helpers/order.rb +103 -0
  484. data/lib/spree/core/controller_helpers/respond_with.rb +65 -0
  485. data/lib/spree/core/controller_helpers/search.rb +14 -0
  486. data/lib/spree/core/controller_helpers/store.rb +51 -0
  487. data/lib/spree/core/controller_helpers/strong_parameters.rb +42 -0
  488. data/lib/spree/core/delegate_belongs_to.rb +95 -0
  489. data/lib/spree/core/engine.rb +134 -0
  490. data/lib/spree/core/environment/calculators.rb +12 -0
  491. data/lib/spree/core/environment.rb +15 -0
  492. data/lib/spree/core/environment_extension.rb +25 -0
  493. data/lib/spree/core/importer/order.rb +284 -0
  494. data/lib/spree/core/importer/product.rb +62 -0
  495. data/lib/spree/core/importer.rb +9 -0
  496. data/lib/spree/core/number_generator.rb +52 -0
  497. data/lib/spree/core/product_duplicator.rb +74 -0
  498. data/lib/spree/core/product_filters.rb +194 -0
  499. data/lib/spree/core/routes.rb +46 -0
  500. data/lib/spree/core/search/base.rb +102 -0
  501. data/lib/spree/core/token_generator.rb +22 -0
  502. data/lib/spree/core/validators/email.rb +11 -0
  503. data/lib/spree/core/version.rb +5 -0
  504. data/lib/spree/core.rb +96 -0
  505. data/lib/spree/i18n/base.rb +17 -0
  506. data/lib/spree/i18n/initializer.rb +1 -0
  507. data/lib/spree/i18n.rb +37 -0
  508. data/lib/spree/localized_number.rb +22 -0
  509. data/lib/spree/migrations.rb +77 -0
  510. data/lib/spree/money.rb +61 -0
  511. data/lib/spree/permitted_attributes.rb +115 -0
  512. data/lib/spree/promo/environment.rb +9 -0
  513. data/lib/spree/responder.rb +45 -0
  514. data/lib/spree/testing_support/ability_helpers.rb +105 -0
  515. data/lib/spree/testing_support/authorization_helpers.rb +63 -0
  516. data/lib/spree/testing_support/bar_ability.rb +14 -0
  517. data/lib/spree/testing_support/caching.rb +47 -0
  518. data/lib/spree/testing_support/capybara_ext.rb +179 -0
  519. data/lib/spree/testing_support/common_rake.rb +39 -0
  520. data/lib/spree/testing_support/controller_requests.rb +93 -0
  521. data/lib/spree/testing_support/extension_rake.rb +10 -0
  522. data/lib/spree/testing_support/factories/address_factory.rb +22 -0
  523. data/lib/spree/testing_support/factories/adjustment_factory.rb +26 -0
  524. data/lib/spree/testing_support/factories/calculator_factory.rb +20 -0
  525. data/lib/spree/testing_support/factories/country_factory.rb +9 -0
  526. data/lib/spree/testing_support/factories/credit_card_factory.rb +10 -0
  527. data/lib/spree/testing_support/factories/customer_return_factory.rb +31 -0
  528. data/lib/spree/testing_support/factories/image_factory.rb +5 -0
  529. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +10 -0
  530. data/lib/spree/testing_support/factories/line_item_factory.rb +12 -0
  531. data/lib/spree/testing_support/factories/options_factory.rb +13 -0
  532. data/lib/spree/testing_support/factories/order_factory.rb +91 -0
  533. data/lib/spree/testing_support/factories/payment_factory.rb +28 -0
  534. data/lib/spree/testing_support/factories/payment_method_factory.rb +23 -0
  535. data/lib/spree/testing_support/factories/price_factory.rb +7 -0
  536. data/lib/spree/testing_support/factories/product_factory.rb +36 -0
  537. data/lib/spree/testing_support/factories/product_option_type_factory.rb +6 -0
  538. data/lib/spree/testing_support/factories/product_property_factory.rb +6 -0
  539. data/lib/spree/testing_support/factories/promotion_category_factory.rb +6 -0
  540. data/lib/spree/testing_support/factories/promotion_factory.rb +52 -0
  541. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +5 -0
  542. data/lib/spree/testing_support/factories/property_factory.rb +6 -0
  543. data/lib/spree/testing_support/factories/prototype_factory.rb +11 -0
  544. data/lib/spree/testing_support/factories/refund_factory.rb +22 -0
  545. data/lib/spree/testing_support/factories/reimbursement_factory.rb +16 -0
  546. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +7 -0
  547. data/lib/spree/testing_support/factories/return_authorization_factory.rb +20 -0
  548. data/lib/spree/testing_support/factories/return_item_factory.rb +14 -0
  549. data/lib/spree/testing_support/factories/role_factory.rb +9 -0
  550. data/lib/spree/testing_support/factories/shipment_factory.rb +23 -0
  551. data/lib/spree/testing_support/factories/shipping_category_factory.rb +5 -0
  552. data/lib/spree/testing_support/factories/shipping_method_factory.rb +21 -0
  553. data/lib/spree/testing_support/factories/state_factory.rb +13 -0
  554. data/lib/spree/testing_support/factories/stock_factory.rb +31 -0
  555. data/lib/spree/testing_support/factories/stock_item_factory.rb +9 -0
  556. data/lib/spree/testing_support/factories/stock_location_factory.rb +28 -0
  557. data/lib/spree/testing_support/factories/stock_movement_factory.rb +11 -0
  558. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +9 -0
  559. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -0
  560. data/lib/spree/testing_support/factories/store_credit_factory.rb +17 -0
  561. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +11 -0
  562. data/lib/spree/testing_support/factories/store_factory.rb +8 -0
  563. data/lib/spree/testing_support/factories/tax_category_factory.rb +6 -0
  564. data/lib/spree/testing_support/factories/tax_rate_factory.rb +8 -0
  565. data/lib/spree/testing_support/factories/taxon_factory.rb +7 -0
  566. data/lib/spree/testing_support/factories/taxonomy_factory.rb +5 -0
  567. data/lib/spree/testing_support/factories/tracker_factory.rb +6 -0
  568. data/lib/spree/testing_support/factories/user_factory.rb +22 -0
  569. data/lib/spree/testing_support/factories/variant_factory.rb +39 -0
  570. data/lib/spree/testing_support/factories/zone_factory.rb +25 -0
  571. data/lib/spree/testing_support/factories/zone_member_factory.rb +6 -0
  572. data/lib/spree/testing_support/factories.rb +19 -0
  573. data/lib/spree/testing_support/flash.rb +27 -0
  574. data/lib/spree/testing_support/i18n.rb +97 -0
  575. data/lib/spree/testing_support/microdata.rb +189 -0
  576. data/lib/spree/testing_support/order_walkthrough.rb +72 -0
  577. data/lib/spree/testing_support/preferences.rb +31 -0
  578. data/lib/spree/testing_support/url_helpers.rb +9 -0
  579. data/lib/spree_core.rb +1 -0
  580. data/lib/tasks/core.rake +169 -0
  581. data/lib/tasks/email.rake +10 -0
  582. data/lib/tasks/exchanges.rake +70 -0
  583. data/script/rails +9 -0
  584. data/spec/fixtures/microdata.html +22 -0
  585. data/spec/fixtures/microdata_itemref.html +15 -0
  586. data/spec/fixtures/microdata_no_itemscope.html +20 -0
  587. data/spec/fixtures/thinking-cat.jpg +0 -0
  588. data/spree_core.gemspec +47 -0
  589. data/vendor/assets/javascripts/jquery-migrate-1.0.0.js +498 -0
  590. data/vendor/assets/javascripts/jquery.payment.js +652 -0
  591. data/vendor/assets/javascripts/jsuri.js +2 -0
  592. data/vendor/assets/stylesheets/normalize.css +375 -0
  593. data/vendor/assets/stylesheets/skeleton.css +242 -0
  594. metadata +971 -0
@@ -0,0 +1,90 @@
1
+ module Spree
2
+ class StockItem < Spree::Base
3
+ acts_as_paranoid
4
+
5
+ with_options inverse_of: :stock_items do
6
+ belongs_to :stock_location, class_name: 'Spree::StockLocation'
7
+ belongs_to :variant, class_name: 'Spree::Variant', counter_cache: true
8
+ end
9
+ has_many :stock_movements, inverse_of: :stock_item
10
+
11
+ validates :stock_location, :variant, presence: true
12
+ validates :variant_id, uniqueness: { scope: [:stock_location_id, :deleted_at] }, allow_blank: true
13
+
14
+ validates :count_on_hand, numericality: {
15
+ greater_than_or_equal_to: 0,
16
+ less_than_or_equal_to: 2**31 - 1,
17
+ only_integer: true }, if: :verify_count_on_hand?
18
+
19
+ delegate :weight, :should_track_inventory?, to: :variant
20
+ delegate :name, to: :variant, prefix: true
21
+
22
+ after_save :conditional_variant_touch, if: :changed?
23
+ after_touch { variant.touch }
24
+ after_destroy { variant.touch }
25
+
26
+ self.whitelisted_ransackable_attributes = ['count_on_hand', 'stock_location_id']
27
+ self.whitelisted_ransackable_associations = ['variant']
28
+
29
+ scope :with_active_stock_location, -> { joins(:stock_location).merge(Spree::StockLocation.active) }
30
+
31
+ def backordered_inventory_units
32
+ Spree::InventoryUnit.backordered_for_stock_item(self)
33
+ end
34
+
35
+ def adjust_count_on_hand(value)
36
+ self.with_lock do
37
+ set_count_on_hand(count_on_hand + value)
38
+ end
39
+ end
40
+
41
+ def set_count_on_hand(value)
42
+ self.count_on_hand = value
43
+ process_backorders(count_on_hand - count_on_hand_was)
44
+
45
+ self.save!
46
+ end
47
+
48
+ def in_stock?
49
+ self.count_on_hand > 0
50
+ end
51
+
52
+ # Tells whether it's available to be included in a shipment
53
+ def available?
54
+ self.in_stock? || self.backorderable?
55
+ end
56
+
57
+ def variant
58
+ Spree::Variant.unscoped { super }
59
+ end
60
+
61
+ def reduce_count_on_hand_to_zero
62
+ self.set_count_on_hand(0) if count_on_hand > 0
63
+ end
64
+
65
+ private
66
+ def verify_count_on_hand?
67
+ count_on_hand_changed? && !backorderable? && (count_on_hand < count_on_hand_was) && (count_on_hand < 0)
68
+ end
69
+
70
+ # Process backorders based on amount of stock received
71
+ # If stock was -20 and is now -15 (increase of 5 units), then we should process 5 inventory orders.
72
+ # If stock was -20 but then was -25 (decrease of 5 units), do nothing.
73
+ def process_backorders(number)
74
+ if number > 0
75
+ backordered_inventory_units.first(number).each do |unit|
76
+ unit.fill_backorder
77
+ end
78
+ end
79
+ end
80
+
81
+ def conditional_variant_touch
82
+ # the variant_id changes from nil when a new stock location is added
83
+ stock_changed = (count_on_hand_changed? && count_on_hand_change.any?(&:zero?)) || variant_id_changed?
84
+
85
+ if !Spree::Config.binary_inventory_cache || stock_changed
86
+ variant.touch
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,115 @@
1
+ module Spree
2
+ class StockLocation < Spree::Base
3
+ has_many :shipments
4
+ has_many :stock_items, dependent: :delete_all, inverse_of: :stock_location
5
+ has_many :stock_movements, through: :stock_items
6
+
7
+ belongs_to :state, class_name: 'Spree::State'
8
+ belongs_to :country, class_name: 'Spree::Country'
9
+
10
+ validates :name, presence: true
11
+
12
+ scope :active, -> { where(active: true) }
13
+ scope :order_default, -> { order(default: :desc, name: :asc) }
14
+
15
+ after_create :create_stock_items, if: :propagate_all_variants?
16
+ after_save :ensure_one_default
17
+
18
+ def state_text
19
+ state.try(:abbr) || state.try(:name) || state_name
20
+ end
21
+
22
+ # Wrapper for creating a new stock item respecting the backorderable config
23
+ def propagate_variant(variant)
24
+ self.stock_items.create!(variant: variant, backorderable: self.backorderable_default)
25
+ end
26
+
27
+ # Return either an existing stock item or create a new one. Useful in
28
+ # scenarios where the user might not know whether there is already a stock
29
+ # item for a given variant
30
+ def set_up_stock_item(variant)
31
+ self.stock_item(variant) || propagate_variant(variant)
32
+ end
33
+
34
+ # Returns an instance of StockItem for the variant id.
35
+ #
36
+ # @param variant_id [String] The id of a variant.
37
+ #
38
+ # @return [StockItem] Corresponding StockItem for the StockLocation's variant.
39
+ def stock_item(variant_id)
40
+ stock_items.where(variant_id: variant_id).order(:id).first
41
+ end
42
+
43
+ # Attempts to look up StockItem for the variant, and creates one if not found.
44
+ # This method accepts an instance of the variant.
45
+ # Other methods in this model attempt to pass a variant,
46
+ # but controller actions can pass just the variant id as a parameter.
47
+ #
48
+ # @param variant [Variant] Variant instance.
49
+ #
50
+ # @return [StockItem] Corresponding StockItem for the StockLocation's variant.
51
+ def stock_item_or_create(variant)
52
+ stock_item(variant) || stock_items.create(variant_id: variant.id)
53
+ end
54
+
55
+ def count_on_hand(variant)
56
+ stock_item(variant).try(:count_on_hand)
57
+ end
58
+
59
+ def backorderable?(variant)
60
+ stock_item(variant).try(:backorderable?)
61
+ end
62
+
63
+ def restock(variant, quantity, originator = nil)
64
+ move(variant, quantity, originator)
65
+ end
66
+
67
+ def restock_backordered(variant, quantity, originator = nil)
68
+ item = stock_item_or_create(variant)
69
+ item.update_columns(
70
+ count_on_hand: item.count_on_hand + quantity,
71
+ updated_at: Time.current
72
+ )
73
+ end
74
+
75
+ def unstock(variant, quantity, originator = nil)
76
+ move(variant, -quantity, originator)
77
+ end
78
+
79
+ def move(variant, quantity, originator = nil)
80
+ stock_item_or_create(variant).stock_movements.create!(quantity: quantity,
81
+ originator: originator)
82
+ end
83
+
84
+ def fill_status(variant, quantity)
85
+ if item = stock_item(variant)
86
+
87
+ if item.count_on_hand >= quantity
88
+ on_hand = quantity
89
+ backordered = 0
90
+ else
91
+ on_hand = item.count_on_hand
92
+ on_hand = 0 if on_hand < 0
93
+ backordered = item.backorderable? ? (quantity - on_hand) : 0
94
+ end
95
+
96
+ [on_hand, backordered]
97
+ else
98
+ [0, 0]
99
+ end
100
+ end
101
+
102
+ private
103
+ def create_stock_items
104
+ Variant.includes(:product).find_each do |variant|
105
+ propagate_variant(variant)
106
+ end
107
+ end
108
+
109
+ def ensure_one_default
110
+ if self.default
111
+ StockLocation.where(default: true).where.not(id: self.id).update_all(default: false)
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ class StockMovement < Spree::Base
3
+ belongs_to :stock_item, class_name: 'Spree::StockItem', inverse_of: :stock_movements
4
+ belongs_to :originator, polymorphic: true
5
+
6
+ after_create :update_stock_item_quantity
7
+
8
+ with_options presence: true do
9
+ validates :stock_item
10
+ validates :quantity, numericality: {
11
+ greater_than_or_equal_to: -2**31,
12
+ less_than_or_equal_to: 2**31 - 1,
13
+ only_integer: true,
14
+ allow_nil: true
15
+ }
16
+ end
17
+
18
+ scope :recent, -> { order(created_at: :desc) }
19
+
20
+ self.whitelisted_ransackable_attributes = ['quantity']
21
+
22
+ def readonly?
23
+ !new_record?
24
+ end
25
+
26
+ private
27
+
28
+ def update_stock_item_quantity
29
+ return unless self.stock_item.should_track_inventory?
30
+ stock_item.adjust_count_on_hand quantity
31
+ end
32
+
33
+ end
34
+ end
35
+
@@ -0,0 +1,50 @@
1
+ module Spree
2
+ class StockTransfer < Spree::Base
3
+ include Spree::Core::NumberGenerator.new(prefix: 'T')
4
+
5
+ extend FriendlyId
6
+ friendly_id :number, slug_column: :number, use: :slugged
7
+
8
+ has_many :stock_movements, as: :originator
9
+
10
+ belongs_to :source_location, class_name: 'StockLocation'
11
+ belongs_to :destination_location, class_name: 'StockLocation'
12
+
13
+ self.whitelisted_ransackable_attributes = %w[reference source_location_id destination_location_id number]
14
+
15
+ def to_param
16
+ number
17
+ end
18
+
19
+ def source_movements
20
+ find_stock_location_with_location_id(source_location_id)
21
+ end
22
+
23
+ def destination_movements
24
+ find_stock_location_with_location_id(destination_location_id)
25
+ end
26
+
27
+ def transfer(source_location, destination_location, variants)
28
+ transaction do
29
+ variants.each_pair do |variant, quantity|
30
+ source_location.unstock(variant, quantity, self) if source_location
31
+ destination_location.restock(variant, quantity, self)
32
+
33
+ self.source_location = source_location
34
+ self.destination_location = destination_location
35
+ self.save!
36
+ end
37
+ end
38
+ end
39
+
40
+ def receive(destination_location, variants)
41
+ transfer(nil, destination_location, variants)
42
+ end
43
+
44
+ private
45
+
46
+ def find_stock_location_with_location_id(location_id)
47
+ stock_movements.joins(:stock_item).where('spree_stock_items.stock_location_id' => location_id)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,48 @@
1
+ module Spree
2
+ class Store < Spree::Base
3
+ has_many :orders, class_name: "Spree::Order"
4
+
5
+ with_options presence: true do
6
+ validates :code, uniqueness: { allow_blank: true }
7
+ validates :name, :url, :mail_from_address
8
+ end
9
+
10
+ before_save :ensure_default_exists_and_is_unique
11
+ before_destroy :validate_not_default
12
+
13
+ scope :by_url, lambda { |url| where("url like ?", "%#{url}%") }
14
+
15
+ after_commit :clear_cache
16
+
17
+ def self.current(domain = nil)
18
+ current_store = domain ? Store.by_url(domain).first : nil
19
+ current_store || Store.default
20
+ end
21
+
22
+ def self.default
23
+ Rails.cache.fetch("default_store") do
24
+ where(default: true).first_or_initialize
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def ensure_default_exists_and_is_unique
31
+ if default
32
+ Store.where.not(id: id).update_all(default: false)
33
+ elsif Store.where(default: true).count.zero?
34
+ self.default = true
35
+ end
36
+ end
37
+
38
+ def validate_not_default
39
+ if default
40
+ errors.add(:base, :cannot_destroy_default_store)
41
+ end
42
+ end
43
+
44
+ def clear_cache
45
+ Rails.cache.delete("default_store")
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,252 @@
1
+ module Spree
2
+ class StoreCredit < Spree::Base
3
+ acts_as_paranoid
4
+
5
+ VOID_ACTION = 'void'.freeze
6
+ CANCEL_ACTION = 'cancel'.freeze
7
+ CREDIT_ACTION = 'credit'.freeze
8
+ CAPTURE_ACTION = 'capture'.freeze
9
+ ELIGIBLE_ACTION = 'eligible'.freeze
10
+ AUTHORIZE_ACTION = 'authorize'.freeze
11
+ ALLOCATION_ACTION = 'allocation'.freeze
12
+
13
+ DEFAULT_CREATED_BY_EMAIL = 'spree@example.com'.freeze
14
+
15
+ belongs_to :user, class_name: Spree.user_class.to_s, foreign_key: 'user_id'
16
+ belongs_to :category, class_name: "Spree::StoreCreditCategory"
17
+ belongs_to :created_by, class_name: Spree.user_class.to_s, foreign_key: 'created_by_id'
18
+ belongs_to :credit_type, class_name: 'Spree::StoreCreditType', foreign_key: 'type_id'
19
+ has_many :store_credit_events
20
+
21
+ validates_presence_of :user, :category, :credit_type, :created_by, :currency
22
+ validates_numericality_of :amount, greater_than: 0
23
+ validates_numericality_of :amount_used, greater_than_or_equal_to: 0
24
+ validate :amount_used_less_than_or_equal_to_amount
25
+ validate :amount_authorized_less_than_or_equal_to_amount
26
+
27
+ delegate :name, to: :category, prefix: true
28
+ delegate :email, to: :created_by, prefix: true
29
+
30
+ scope :order_by_priority, -> { includes(:credit_type).order('spree_store_credit_types.priority ASC') }
31
+
32
+ before_validation :associate_credit_type
33
+ after_save :store_event
34
+ before_destroy :validate_no_amount_used
35
+
36
+ attr_accessor :action, :action_amount, :action_originator, :action_authorization_code
37
+
38
+ def display_amount
39
+ Spree::Money.new(amount)
40
+ end
41
+
42
+ def display_amount_used
43
+ Spree::Money.new(amount_used)
44
+ end
45
+
46
+ def amount_remaining
47
+ amount - amount_used - amount_authorized
48
+ end
49
+
50
+ def authorize(amount, order_currency, options = {})
51
+ authorization_code = options[:action_authorization_code]
52
+ if authorization_code
53
+ if store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code: authorization_code)
54
+ # Don't authorize again on capture
55
+ return true
56
+ end
57
+ else
58
+ authorization_code = generate_authorization_code
59
+ end
60
+
61
+ if validate_authorization(amount, order_currency)
62
+ update_attributes!(
63
+ action: AUTHORIZE_ACTION,
64
+ action_amount: amount,
65
+ action_originator: options[:action_originator],
66
+ action_authorization_code: authorization_code,
67
+ amount_authorized: amount_authorized + amount
68
+ )
69
+ authorization_code
70
+ else
71
+ errors.add(:base, Spree.t('store_credit_payment_method.insufficient_authorized_amount'))
72
+ false
73
+ end
74
+ end
75
+
76
+ def validate_authorization(amount, order_currency)
77
+ if amount_remaining.to_d < amount.to_d
78
+ errors.add(:base, Spree.t('store_credit_payment_method.insufficient_funds'))
79
+ elsif currency != order_currency
80
+ errors.add(:base, Spree.t('store_credit_payment_method.currency_mismatch'))
81
+ end
82
+ errors.blank?
83
+ end
84
+
85
+ def capture(amount, authorization_code, order_currency, options = {})
86
+ return false unless authorize(amount, order_currency, action_authorization_code: authorization_code)
87
+
88
+ if amount <= amount_authorized
89
+ if currency != order_currency
90
+ errors.add(:base, Spree.t('store_credit_payment_method.currency_mismatch'))
91
+ false
92
+ else
93
+ update_attributes!(
94
+ action: CAPTURE_ACTION,
95
+ action_amount: amount,
96
+ action_originator: options[:action_originator],
97
+ action_authorization_code: authorization_code,
98
+ amount_used: amount_used + amount,
99
+ amount_authorized: amount_authorized - amount
100
+ )
101
+ authorization_code
102
+ end
103
+ else
104
+ errors.add(:base, Spree.t('store_credit_payment_method.insufficient_authorized_amount'))
105
+ false
106
+ end
107
+ end
108
+
109
+ def void(authorization_code, options = {})
110
+ if auth_event = store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code: authorization_code)
111
+ update_attributes!(
112
+ action: VOID_ACTION,
113
+ action_amount: auth_event.amount,
114
+ action_authorization_code: authorization_code,
115
+ action_originator: options[:action_originator],
116
+ amount_authorized: amount_authorized - auth_event.amount
117
+ )
118
+ true
119
+ else
120
+ errors.add(:base, Spree.t('store_credit_payment_method.unable_to_void', auth_code: authorization_code))
121
+ false
122
+ end
123
+ end
124
+
125
+ def credit(amount, authorization_code, order_currency, options = {})
126
+ # Find the amount related to this authorization_code in order to add the store credit back
127
+ capture_event = store_credit_events.find_by(action: CAPTURE_ACTION, authorization_code: authorization_code)
128
+
129
+ if currency != order_currency # sanity check to make sure the order currency hasn't changed since the auth
130
+ errors.add(:base, Spree.t('store_credit_payment_method.currency_mismatch'))
131
+ false
132
+ elsif capture_event && amount <= capture_event.amount
133
+ action_attributes = {
134
+ action: CREDIT_ACTION,
135
+ action_amount: amount,
136
+ action_originator: options[:action_originator],
137
+ action_authorization_code: authorization_code
138
+ }
139
+ create_credit_record(amount, action_attributes)
140
+ true
141
+ else
142
+ errors.add(:base, Spree.t('store_credit_payment_method.unable_to_credit', auth_code: authorization_code))
143
+ false
144
+ end
145
+ end
146
+
147
+ def actions
148
+ [CAPTURE_ACTION, VOID_ACTION, CREDIT_ACTION]
149
+ end
150
+
151
+ def can_capture?(payment)
152
+ payment.pending? || payment.checkout?
153
+ end
154
+
155
+ def can_void?(payment)
156
+ payment.pending?
157
+ end
158
+
159
+ def can_credit?(payment)
160
+ payment.completed? && payment.credit_allowed > 0
161
+ end
162
+
163
+ def generate_authorization_code
164
+ "#{id}-SC-#{Time.now.utc.strftime('%Y%m%d%H%M%S%6N')}"
165
+ end
166
+
167
+ class << self
168
+ def default_created_by
169
+ Spree.user_class.find_by(email: DEFAULT_CREATED_BY_EMAIL)
170
+ end
171
+ end
172
+
173
+ private
174
+
175
+ def create_credit_record(amount, action_attributes = {})
176
+ # Setting credit_to_new_allocation to true will create a new allocation anytime #credit is called
177
+ # If it is not set, it will update the store credit's amount in place
178
+ credit = if Spree::Config.credit_to_new_allocation
179
+ Spree::StoreCredit.new(create_credit_record_params(amount))
180
+ else
181
+ self.amount_used = amount_used - amount
182
+ self
183
+ end
184
+
185
+ credit.assign_attributes(action_attributes)
186
+ credit.save!
187
+ end
188
+
189
+ def create_credit_record_params(amount)
190
+ {
191
+ amount: amount,
192
+ user_id: user_id,
193
+ category_id: category_id,
194
+ created_by_id: created_by_id,
195
+ currency: currency,
196
+ type_id: type_id,
197
+ memo: credit_allocation_memo
198
+ }
199
+ end
200
+
201
+ def credit_allocation_memo
202
+ "This is a credit from store credit ID #{id}"
203
+ end
204
+
205
+ def store_event
206
+ return unless amount_changed? || amount_used_changed? || amount_authorized_changed? || action == ELIGIBLE_ACTION
207
+
208
+ event = if action
209
+ store_credit_events.build(action: action)
210
+ else
211
+ store_credit_events.where(action: ALLOCATION_ACTION).first_or_initialize
212
+ end
213
+
214
+ event.update_attributes!(
215
+ amount: action_amount || amount,
216
+ authorization_code: action_authorization_code || event.authorization_code || generate_authorization_code,
217
+ user_total_amount: user.total_available_store_credit,
218
+ originator: action_originator
219
+ )
220
+ end
221
+
222
+ def amount_used_less_than_or_equal_to_amount
223
+ return true if amount_used.nil?
224
+
225
+ if amount_used > amount
226
+ errors.add(:amount_used, :cannot_be_greater_than_amount)
227
+ false
228
+ end
229
+ end
230
+
231
+ def amount_authorized_less_than_or_equal_to_amount
232
+ if (amount_used + amount_authorized) > amount
233
+ errors.add(:amount_authorized, :exceeds_total_credits)
234
+ false
235
+ end
236
+ end
237
+
238
+ def validate_no_amount_used
239
+ if amount_used > 0
240
+ errors.add(:amount_used, :greater_than_zero_restrict_delete)
241
+ false
242
+ end
243
+ end
244
+
245
+ def associate_credit_type
246
+ unless type_id
247
+ credit_type_name = category.try(:non_expiring?) ? 'Non-expiring' : 'Expiring'
248
+ self.credit_type = Spree::StoreCreditType.find_by_name(credit_type_name)
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,22 @@
1
+ module Spree
2
+ class StoreCreditCategory < Spree::Base
3
+ validates_presence_of :name
4
+
5
+ GIFT_CARD_CATEGORY_NAME = 'Gift Card'.freeze
6
+ DEFAULT_NON_EXPIRING_TYPES = [GIFT_CARD_CATEGORY_NAME]
7
+
8
+ def non_expiring?
9
+ non_expiring_category_types.include? name
10
+ end
11
+
12
+ def non_expiring_category_types
13
+ DEFAULT_NON_EXPIRING_TYPES | Spree::Config[:non_expiring_credit_types]
14
+ end
15
+
16
+ class << self
17
+ def default_reimbursement_category(_options = {})
18
+ Spree::StoreCreditCategory.first
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,38 @@
1
+ module Spree
2
+ class StoreCreditEvent < Spree::Base
3
+ acts_as_paranoid
4
+
5
+ belongs_to :store_credit
6
+ belongs_to :originator, polymorphic: true
7
+
8
+ scope :exposed_events, -> { where.not(action: [Spree::StoreCredit::ELIGIBLE_ACTION, Spree::StoreCredit::AUTHORIZE_ACTION]) }
9
+ scope :reverse_chronological, -> { order(created_at: :desc) }
10
+
11
+ delegate :currency, to: :store_credit
12
+
13
+ def display_amount
14
+ Spree::Money.new(amount, currency: currency)
15
+ end
16
+
17
+ def display_user_total_amount
18
+ Spree::Money.new(user_total_amount, currency: currency)
19
+ end
20
+
21
+ def display_action
22
+ case action
23
+ when Spree::StoreCredit::CAPTURE_ACTION
24
+ Spree.t('store_credit.captured')
25
+ when Spree::StoreCredit::AUTHORIZE_ACTION
26
+ Spree.t('store_credit.authorized')
27
+ when Spree::StoreCredit::ALLOCATION_ACTION
28
+ Spree.t('store_credit.allocated')
29
+ when Spree::StoreCredit::VOID_ACTION, Spree::StoreCredit::CREDIT_ACTION
30
+ Spree.t('store_credit.credit')
31
+ end
32
+ end
33
+
34
+ def order
35
+ Spree::Payment.find_by_response_code(authorization_code).try(:order)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class StoreCreditType < Spree::Base
3
+ DEFAULT_TYPE_NAME = 'Expiring'.freeze
4
+ has_many :store_credits, class_name: 'Spree::StoreCredit', foreign_key: 'type_id'
5
+ end
6
+ end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ class TaxCategory < Spree::Base
3
+ acts_as_paranoid
4
+ validates :name, presence: true, uniqueness: { case_sensitive: false, scope: :deleted_at, allow_blank: true }
5
+
6
+ has_many :tax_rates, dependent: :destroy, inverse_of: :tax_category
7
+
8
+ before_save :set_default_category
9
+
10
+ def set_default_category
11
+ #set existing default tax category to false if this one has been marked as default
12
+
13
+ if is_default && tax_category = self.class.where(is_default: true).where.not(id: id).first
14
+ tax_category.update_columns(is_default: false, updated_at: Time.current)
15
+ end
16
+ end
17
+ end
18
+ end