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,198 @@
1
+ module Spree
2
+ class Promotion < Spree::Base
3
+ MATCH_POLICIES = %w(all any)
4
+ UNACTIVATABLE_ORDER_STATES = ["complete", "awaiting_return", "returned"]
5
+
6
+ attr_reader :eligibility_errors
7
+
8
+ belongs_to :promotion_category
9
+
10
+ has_many :promotion_rules, autosave: true, dependent: :destroy
11
+ alias_method :rules, :promotion_rules
12
+
13
+ has_many :promotion_actions, autosave: true, dependent: :destroy
14
+ alias_method :actions, :promotion_actions
15
+
16
+ has_many :order_promotions, class_name: 'Spree::OrderPromotion'
17
+ has_many :orders, through: :order_promotions, class_name: 'Spree::Order'
18
+
19
+ accepts_nested_attributes_for :promotion_actions, :promotion_rules
20
+
21
+ validates_associated :rules
22
+
23
+ validates :name, presence: true
24
+ validates :path, uniqueness: { allow_blank: true }
25
+ validates :usage_limit, numericality: { greater_than: 0, allow_nil: true }
26
+ validates :description, length: { maximum: 255 }, allow_blank: true
27
+
28
+ before_save :normalize_blank_values
29
+
30
+ scope :coupons, -> { where.not(code: nil) }
31
+ scope :advertised, -> { where(advertise: true) }
32
+ scope :applied, lambda {
33
+ joins(<<-SQL).uniq
34
+ INNER JOIN spree_order_promotions
35
+ ON spree_order_promotions.promotion_id = #{table_name}.id
36
+ SQL
37
+ }
38
+
39
+ self.whitelisted_ransackable_attributes = ['path', 'promotion_category_id', 'code']
40
+
41
+ def self.with_coupon_code(coupon_code)
42
+ where("lower(#{table_name}.code) = ?", coupon_code.strip.downcase)
43
+ .includes(:promotion_actions).where.not(spree_promotion_actions: { id: nil })
44
+ .first
45
+ end
46
+
47
+ def self.active
48
+ where('spree_promotions.starts_at IS NULL OR spree_promotions.starts_at < ?', Time.current).
49
+ where('spree_promotions.expires_at IS NULL OR spree_promotions.expires_at > ?', Time.current)
50
+ end
51
+
52
+ def self.order_activatable?(order)
53
+ order && !UNACTIVATABLE_ORDER_STATES.include?(order.state)
54
+ end
55
+
56
+ def expired?
57
+ !!(starts_at && Time.current < starts_at || expires_at && Time.current > expires_at)
58
+ end
59
+
60
+ def activate(payload)
61
+ order = payload[:order]
62
+ return unless self.class.order_activatable?(order)
63
+
64
+ payload[:promotion] = self
65
+
66
+ # Track results from actions to see if any action has been taken.
67
+ # Actions should return nil/false if no action has been taken.
68
+ # If an action returns true, then an action has been taken.
69
+ results = actions.map do |action|
70
+ action.perform(payload)
71
+ end
72
+ # If an action has been taken, report back to whatever activated this promotion.
73
+ action_taken = results.include?(true)
74
+
75
+ if action_taken
76
+ # connect to the order
77
+ # create the join_table entry.
78
+ self.orders << order
79
+ self.save
80
+ end
81
+
82
+ action_taken
83
+ end
84
+
85
+ # called anytime order.update_with_updater! happens
86
+ def eligible?(promotable)
87
+ return false if expired? || usage_limit_exceeded?(promotable) || blacklisted?(promotable)
88
+ !!eligible_rules(promotable, {})
89
+ end
90
+
91
+ # eligible_rules returns an array of promotion rules where eligible? is true for the promotable
92
+ # if there are no such rules, an empty array is returned
93
+ # if the rules make this promotable ineligible, then nil is returned (i.e. this promotable is not eligible)
94
+ def eligible_rules(promotable, options = {})
95
+ # Promotions without rules are eligible by default.
96
+ return [] if rules.none?
97
+ eligible = lambda { |r| r.eligible?(promotable, options) }
98
+ specific_rules = rules.select { |rule| rule.applicable?(promotable) }
99
+ return [] if specific_rules.none?
100
+
101
+ rule_eligibility = Hash[specific_rules.map do |rule|
102
+ [rule, rule.eligible?(promotable, options)]
103
+ end]
104
+
105
+ if match_all?
106
+ # If there are rules for this promotion, but no rules for this
107
+ # particular promotable, then the promotion is ineligible by default.
108
+ unless rule_eligibility.values.all?
109
+ @eligibility_errors = specific_rules.map(&:eligibility_errors).detect(&:present?)
110
+ return nil
111
+ end
112
+ specific_rules
113
+ else
114
+ unless rule_eligibility.values.any?
115
+ @eligibility_errors = specific_rules.map(&:eligibility_errors).detect(&:present?)
116
+ return nil
117
+ end
118
+
119
+ [rule_eligibility.detect { |_, eligibility| eligibility }.first]
120
+ end
121
+ end
122
+
123
+ def products
124
+ rules.where(type: "Spree::Promotion::Rules::Product").map(&:products).flatten.uniq
125
+ end
126
+
127
+ def usage_limit_exceeded?(promotable)
128
+ usage_limit.present? && usage_limit > 0 && adjusted_credits_count(promotable) >= usage_limit
129
+ end
130
+
131
+ def adjusted_credits_count(promotable)
132
+ adjustments = promotable.is_a?(Order) ? promotable.all_adjustments : promotable.adjustments
133
+ credits_count - adjustments.promotion.where(source_id: actions.pluck(:id)).size
134
+ end
135
+
136
+ def credits
137
+ Adjustment.eligible.promotion.where(source_id: actions.map(&:id))
138
+ end
139
+
140
+ def credits_count
141
+ credits.count
142
+ end
143
+
144
+ def line_item_actionable?(order, line_item)
145
+ if eligible? order
146
+ rules = eligible_rules(order)
147
+ if rules.blank?
148
+ true
149
+ else
150
+ rules.send(match_all? ? :all? : :any?) do |rule|
151
+ rule.actionable? line_item
152
+ end
153
+ end
154
+ else
155
+ false
156
+ end
157
+ end
158
+
159
+ def used_by?(user, excluded_orders = [])
160
+ [
161
+ :adjustments,
162
+ :line_item_adjustments,
163
+ :shipment_adjustments
164
+ ].any? do |adjustment_type|
165
+ user.orders.complete.joins(adjustment_type).where(
166
+ spree_adjustments: {
167
+ source_type: 'Spree::PromotionAction',
168
+ source_id: actions.map(&:id),
169
+ eligible: true
170
+ }
171
+ ).where.not(
172
+ id: excluded_orders.map(&:id)
173
+ ).any?
174
+ end
175
+ end
176
+
177
+ private
178
+ def blacklisted?(promotable)
179
+ case promotable
180
+ when Spree::LineItem
181
+ !promotable.product.promotionable?
182
+ when Spree::Order
183
+ promotable.line_items.any? &&
184
+ !promotable.line_items.joins(:product).where(spree_products: {promotionable: true}).any?
185
+ end
186
+ end
187
+
188
+ def normalize_blank_values
189
+ [:code, :path].each do |column|
190
+ self[column] = nil if self[column].blank?
191
+ end
192
+ end
193
+
194
+ def match_all?
195
+ match_policy == 'all'
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,25 @@
1
+ ## Base class for all types of promotion action.
2
+ # PromotionActions perform the necessary tasks when a promotion is activated by an event and determined to be eligible.
3
+ module Spree
4
+ class PromotionAction < Spree::Base
5
+ acts_as_paranoid
6
+
7
+ belongs_to :promotion, class_name: 'Spree::Promotion'
8
+
9
+ scope :of_type, ->(t) { where(type: t) }
10
+
11
+ # This method should be overriden in subclass
12
+ # Updates the state of the order or performs some other action depending on the subclass
13
+ # options will contain the payload from the event that activated the promotion. This will include
14
+ # the key :user which allows user based actions to be performed in addition to actions on the order
15
+ def perform(options = {})
16
+ raise 'perform should be implemented in a sub-class of PromotionAction'
17
+ end
18
+
19
+ protected
20
+
21
+ def label
22
+ Spree.t(:promotion_label, name: promotion.name)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class PromotionActionLineItem < Spree::Base
3
+ belongs_to :promotion_action, class_name: 'Spree::Promotion::Actions::CreateLineItems'
4
+ belongs_to :variant, class_name: 'Spree::Variant'
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class PromotionCategory < Spree::Base
3
+ validates :name, presence: true
4
+ has_many :promotions
5
+ end
6
+ end
@@ -0,0 +1,51 @@
1
+ module Spree
2
+ module PromotionHandler
3
+ # Decides which promotion should be activated given the current order context
4
+ #
5
+ # By activated it doesn't necessarily mean that the order will have a
6
+ # discount for every activated promotion. It means that the discount will be
7
+ # created and might eventually become eligible. The intention here is to
8
+ # reduce overhead. e.g. a promotion that requires item A to be eligible
9
+ # shouldn't be eligible unless item A is added to the order.
10
+ #
11
+ # It can be used as a wrapper for custom handlers as well. Different
12
+ # applications might have completely different requirements to make
13
+ # the promotions system accurate and performant. Here they can plug custom
14
+ # handler to activate promos as they wish once an item is added to cart
15
+ class Cart
16
+ attr_reader :line_item, :order
17
+ attr_accessor :error, :success
18
+
19
+ def initialize(order, line_item=nil)
20
+ @order, @line_item = order, line_item
21
+ end
22
+
23
+ def activate
24
+ promotions.each do |promotion|
25
+ if (line_item && promotion.eligible?(line_item)) || promotion.eligible?(order)
26
+ promotion.activate(line_item: line_item, order: order)
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def promotions
34
+ # AR cannot bind raw ASTs to prepared statements. There always must be a manager around.
35
+ # Also Postgresql requires an aliased table for `SELECT * FROM (subexpression) AS alias`.
36
+ # And Sqlite3 cannot work on outher parenthesis from `(left UNION right)`.
37
+ # So this construct makes both happy.
38
+ select = Arel::SelectManager.new(Promotion.arel_engine)
39
+ select.from(
40
+ Promotion.arel_table.create_table_alias(
41
+ order.promotions.active.union(Promotion.active.where(code: nil, path: nil)),
42
+ Promotion.table_name
43
+ )
44
+ )
45
+ select.project(Arel.star)
46
+
47
+ Promotion.find_by_sql(select.to_sql)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,107 @@
1
+ module Spree
2
+ module PromotionHandler
3
+ class Coupon
4
+ attr_reader :order
5
+ attr_accessor :error, :success, :status_code
6
+
7
+ def initialize(order)
8
+ @order = order
9
+ end
10
+
11
+ def apply
12
+ if order.coupon_code.present?
13
+ if promotion.present? && promotion.actions.exists?
14
+ handle_present_promotion(promotion)
15
+ else
16
+ if Promotion.with_coupon_code(order.coupon_code).try(:expired?)
17
+ set_error_code :coupon_code_expired
18
+ else
19
+ set_error_code :coupon_code_not_found
20
+ end
21
+ end
22
+ end
23
+
24
+ self
25
+ end
26
+
27
+ def set_success_code(c)
28
+ @status_code = c
29
+ @success = Spree.t(c)
30
+ end
31
+
32
+ def set_error_code(c)
33
+ @status_code = c
34
+ @error = Spree.t(c)
35
+ end
36
+
37
+ def promotion
38
+ @promotion ||= Promotion.active.includes(:promotion_rules, :promotion_actions).with_coupon_code(order.coupon_code)
39
+ end
40
+
41
+ def successful?
42
+ success.present? && error.blank?
43
+ end
44
+
45
+ private
46
+
47
+ def handle_present_promotion(promotion)
48
+ return promotion_usage_limit_exceeded if promotion.usage_limit_exceeded?(order)
49
+ return promotion_applied if promotion_exists_on_order?(order, promotion)
50
+ unless promotion.eligible?(order)
51
+ self.error = promotion.eligibility_errors.full_messages.first unless promotion.eligibility_errors.blank?
52
+ return (self.error || ineligible_for_this_order)
53
+ end
54
+
55
+ # If any of the actions for the promotion return `true`,
56
+ # then result here will also be `true`.
57
+ result = promotion.activate(:order => order)
58
+ if result
59
+ determine_promotion_application_result
60
+ else
61
+ set_error_code :coupon_code_unknown_error
62
+ end
63
+ end
64
+
65
+ def promotion_usage_limit_exceeded
66
+ set_error_code :coupon_code_max_usage
67
+ end
68
+
69
+ def ineligible_for_this_order
70
+ set_error_code :coupon_code_not_eligible
71
+ end
72
+
73
+ def promotion_applied
74
+ set_error_code :coupon_code_already_applied
75
+ end
76
+
77
+ def promotion_exists_on_order?(order, promotion)
78
+ order.promotions.include? promotion
79
+ end
80
+
81
+ def determine_promotion_application_result
82
+ # Check for applied adjustments.
83
+ discount = order.all_adjustments.promotion.eligible.detect do |p|
84
+ p.source.promotion.code.try(:downcase) == order.coupon_code.downcase
85
+ end
86
+
87
+ # Check for applied line items.
88
+ created_line_items = promotion.actions.detect { |a| a.type == 'Spree::Promotion::Actions::CreateLineItems' }
89
+
90
+ if discount || created_line_items
91
+ order.update_totals
92
+ order.persist_totals
93
+ set_success_code :coupon_code_applied
94
+ else
95
+ # if the promotion exists on an order, but wasn't found above,
96
+ # we've already selected a better promotion
97
+ if order.promotions.with_coupon_code(order.coupon_code)
98
+ set_error_code :coupon_code_better_exists
99
+ else
100
+ # if the promotion was created after the order
101
+ set_error_code :coupon_code_not_found
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,33 @@
1
+ module Spree
2
+ module PromotionHandler
3
+ # Used for activating promotions with shipping rules
4
+ class FreeShipping
5
+ attr_reader :order, :order_promo_ids
6
+ attr_accessor :error, :success
7
+
8
+ def initialize(order)
9
+ @order = order
10
+ @order_promo_ids = order.promotions.pluck(:id)
11
+ end
12
+
13
+ def activate
14
+ promotions.each do |promotion|
15
+ next if promotion.code.present? && !order_promo_ids.include?(promotion.id)
16
+
17
+ if promotion.eligible?(order)
18
+ promotion.activate(order: order)
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def promotions
26
+ Spree::Promotion.active.where(
27
+ id: Spree::Promotion::Actions::FreeShipping.pluck(:promotion_id),
28
+ path: nil
29
+ )
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module PromotionHandler
3
+ class Page
4
+ attr_reader :order, :path
5
+
6
+ def initialize(order, path)
7
+ @order = order
8
+ @path = path.gsub(/\A\//, '')
9
+ end
10
+
11
+ def activate
12
+ if promotion && promotion.eligible?(order)
13
+ promotion.activate(:order => order)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def promotion
20
+ @promotion ||= Promotion.active.find_by(:path => path)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,43 @@
1
+ # Base class for all promotion rules
2
+ module Spree
3
+ class PromotionRule < Spree::Base
4
+ belongs_to :promotion, class_name: 'Spree::Promotion', inverse_of: :promotion_rules
5
+
6
+ scope :of_type, ->(t) { where(type: t) }
7
+
8
+ validate :unique_per_promotion, on: :create
9
+
10
+ def self.for(promotable)
11
+ all.select { |rule| rule.applicable?(promotable) }
12
+ end
13
+
14
+ def applicable?(promotable)
15
+ raise 'applicable? should be implemented in a sub-class of Spree::PromotionRule'
16
+ end
17
+
18
+ def eligible?(promotable, options = {})
19
+ raise 'eligible? should be implemented in a sub-class of Spree::PromotionRule'
20
+ end
21
+
22
+ # This states if a promotion can be applied to the specified line item
23
+ # It is true by default, but can be overridden by promotion rules to provide conditions
24
+ def actionable?(line_item)
25
+ true
26
+ end
27
+
28
+ def eligibility_errors
29
+ @eligibility_errors ||= ActiveModel::Errors.new(self)
30
+ end
31
+
32
+ private
33
+ def unique_per_promotion
34
+ if Spree::PromotionRule.exists?(promotion_id: promotion_id, type: self.class.name)
35
+ errors[:base] << "Promotion already contains this rule type"
36
+ end
37
+ end
38
+
39
+ def eligibility_error_message(key, options = {})
40
+ Spree.t(key, Hash[scope: [:eligibility_errors, :messages]].merge(options))
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class PromotionRuleTaxon < Spree::Base
3
+ belongs_to :promotion_rule, class_name: 'Spree::PromotionRule'
4
+ belongs_to :taxon, class_name: 'Spree::Taxon'
5
+
6
+ validates :promotion_rule, :taxon, presence: true
7
+ validates :promotion_rule_id, uniqueness: { scope: :taxon_id }, allow_nil: true
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class PromotionRuleUser < Spree::Base
3
+ belongs_to :promotion_rule, class_name: 'Spree::PromotionRule'
4
+ belongs_to :user, class_name: Spree.user_class
5
+
6
+ validates :user, :promotion_rule, presence: true
7
+ validates :user_id, uniqueness: { scope: :promotion_rule_id }, allow_nil: true
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ class Property < Spree::Base
3
+ has_many :property_prototypes, class_name: 'Spree::PropertyPrototype'
4
+ has_many :prototypes, through: :property_prototypes, class_name: 'Spree::Prototype'
5
+
6
+ has_many :product_properties, dependent: :delete_all, inverse_of: :property
7
+ has_many :products, through: :product_properties
8
+
9
+ validates :name, :presentation, presence: true
10
+
11
+ scope :sorted, -> { order(:name) }
12
+
13
+ after_touch :touch_all_products
14
+
15
+ self.whitelisted_ransackable_attributes = ['presentation']
16
+
17
+ private
18
+
19
+ def touch_all_products
20
+ products.update_all(updated_at: Time.current)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class PropertyPrototype < Spree::Base
3
+ belongs_to :prototype, class_name: 'Spree::Prototype'
4
+ belongs_to :property, class_name: 'Spree::Property'
5
+
6
+ validates :prototype, :property, presence: true
7
+ validates :prototype_id, uniqueness: { scope: :property_id }, allow_nil: true
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ class Prototype < Spree::Base
3
+ has_many :property_prototypes, class_name: 'Spree::PropertyPrototype'
4
+ has_many :properties, through: :property_prototypes, class_name: 'Spree::Property'
5
+
6
+ has_many :option_type_prototypes, class_name: 'Spree::OptionTypePrototype'
7
+ has_many :option_types, through: :option_type_prototypes, class_name: 'Spree::OptionType'
8
+
9
+ has_many :prototype_taxons, class_name: 'Spree::PrototypeTaxon'
10
+ has_many :taxons, through: :prototype_taxons, class_name: 'Spree::Taxon'
11
+
12
+ validates :name, presence: true
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class PrototypeTaxon < Spree::Base
3
+ belongs_to :taxon, class_name: 'Spree::Taxon'
4
+ belongs_to :prototype, class_name: 'Spree::Prototype'
5
+
6
+ validates :prototype, :taxon, presence: true
7
+ validates :prototype_id, uniqueness: { scope: :taxon_id }, allow_nil: true
8
+ end
9
+ end
@@ -0,0 +1,89 @@
1
+ module Spree
2
+ class Refund < Spree::Base
3
+ with_options inverse_of: :refunds do
4
+ belongs_to :payment
5
+ belongs_to :reimbursement
6
+ end
7
+ belongs_to :reason, class_name: 'Spree::RefundReason', foreign_key: :refund_reason_id
8
+
9
+ has_many :log_entries, as: :source
10
+
11
+ with_options presence: true do
12
+ validates :payment, :reason
13
+ # can't require this on create because the perform! in after_create needs to run first
14
+ validates :transaction_id, on: :update
15
+ validates :amount, numericality: { greater_than: 0, allow_nil: true }
16
+ end
17
+ validate :amount_is_less_than_or_equal_to_allowed_amount, on: :create
18
+
19
+ after_create :perform!
20
+ after_create :create_log_entry
21
+
22
+ scope :non_reimbursement, -> { where(reimbursement_id: nil) }
23
+
24
+ def money
25
+ Spree::Money.new(amount, { currency: payment.currency })
26
+ end
27
+ alias display_amount money
28
+
29
+ class << self
30
+ def total_amount_reimbursed_for(reimbursement)
31
+ reimbursement.refunds.to_a.sum(&:amount)
32
+ end
33
+ end
34
+
35
+ def description
36
+ payment.payment_method.name
37
+ end
38
+
39
+ private
40
+
41
+ # attempts to perform the refund.
42
+ # raises an error if the refund fails.
43
+ def perform!
44
+ return true if transaction_id.present?
45
+
46
+ credit_cents = Spree::Money.new(amount.to_f, currency: payment.currency).amount_in_cents
47
+
48
+ @response = process!(credit_cents)
49
+
50
+ self.transaction_id = @response.authorization
51
+ update_columns(transaction_id: transaction_id)
52
+ update_order
53
+ end
54
+
55
+ # return an activemerchant response object if successful or else raise an error
56
+ def process!(credit_cents)
57
+ response = if payment.payment_method.payment_profiles_supported?
58
+ payment.payment_method.credit(credit_cents, payment.source, payment.transaction_id, {originator: self})
59
+ else
60
+ payment.payment_method.credit(credit_cents, payment.transaction_id, {originator: self})
61
+ end
62
+
63
+ if !response.success?
64
+ logger.error(Spree.t(:gateway_error) + " #{response.to_yaml}")
65
+ text = response.params['message'] || response.params['response_reason_text'] || response.message
66
+ raise Core::GatewayError.new(text)
67
+ end
68
+
69
+ response
70
+ rescue ActiveMerchant::ConnectionError => e
71
+ logger.error(Spree.t(:gateway_error) + " #{e.inspect}")
72
+ raise Core::GatewayError.new(Spree.t(:unable_to_connect_to_gateway))
73
+ end
74
+
75
+ def create_log_entry
76
+ log_entries.create!(details: @response.to_yaml)
77
+ end
78
+
79
+ def amount_is_less_than_or_equal_to_allowed_amount
80
+ if amount > payment.credit_allowed
81
+ errors.add(:amount, :greater_than_allowed)
82
+ end
83
+ end
84
+
85
+ def update_order
86
+ payment.order.updater.update
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ class RefundReason < Spree::Base
3
+ include Spree::NamedType
4
+
5
+ RETURN_PROCESSING_REASON = 'Return processing'
6
+
7
+ has_many :refunds, dependent: :restrict_with_error
8
+
9
+ def self.return_processing_reason
10
+ find_by!(name: RETURN_PROCESSING_REASON, mutable: false)
11
+ end
12
+ end
13
+ end