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,25 @@
1
+ module Spree
2
+ class Reimbursement::Credit < Spree::Base
3
+ class_attribute :default_creditable_class
4
+ self.default_creditable_class = nil
5
+
6
+ belongs_to :reimbursement, inverse_of: :credits
7
+ belongs_to :creditable, polymorphic: true
8
+
9
+ validates :creditable, presence: true
10
+
11
+ class << self
12
+ def total_amount_reimbursed_for(reimbursement)
13
+ reimbursement.credits.to_a.sum(&:amount)
14
+ end
15
+ end
16
+
17
+ def description
18
+ creditable.class.name.demodulize
19
+ end
20
+
21
+ def display_amount
22
+ Spree::Money.new(amount, { currency: creditable.try(:currency) || "USD" })
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,56 @@
1
+ module Spree
2
+ class Reimbursement::ReimbursementTypeEngine
3
+ include Spree::Reimbursement::ReimbursementTypeValidator
4
+
5
+ class_attribute :refund_time_constraint
6
+ self.refund_time_constraint = 90.days
7
+
8
+ class_attribute :default_reimbursement_type
9
+ self.default_reimbursement_type = Spree::ReimbursementType::OriginalPayment
10
+
11
+ class_attribute :expired_reimbursement_type
12
+ self.expired_reimbursement_type = Spree::ReimbursementType::OriginalPayment
13
+
14
+ class_attribute :exchange_reimbursement_type
15
+ self.exchange_reimbursement_type = Spree::ReimbursementType::Exchange
16
+
17
+ def initialize(return_items)
18
+ @return_items = return_items
19
+ @reimbursement_type_hash = Hash.new {|h,k| h[k] = Array.new }
20
+ end
21
+
22
+ def calculate_reimbursement_types
23
+ @return_items.each do |return_item|
24
+ reimbursement_type = calculate_reimbursement_type(return_item)
25
+ add_reimbursement_type(return_item, reimbursement_type)
26
+ end
27
+
28
+ @reimbursement_type_hash
29
+ end
30
+
31
+ private
32
+
33
+ def calculate_reimbursement_type(return_item)
34
+ if return_item.exchange_required?
35
+ exchange_reimbursement_type
36
+ elsif return_item.override_reimbursement_type.present?
37
+ return_item.override_reimbursement_type.class
38
+ elsif return_item.preferred_reimbursement_type.present?
39
+ if valid_preferred_reimbursement_type?(return_item)
40
+ return_item.preferred_reimbursement_type.class
41
+ else
42
+ nil
43
+ end
44
+ elsif past_reimbursable_time_period?(return_item)
45
+ expired_reimbursement_type
46
+ else
47
+ default_reimbursement_type
48
+ end
49
+ end
50
+
51
+ def add_reimbursement_type(return_item, reimbursement_type)
52
+ return unless reimbursement_type
53
+ @reimbursement_type_hash[reimbursement_type] << return_item
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ module Reimbursement::ReimbursementTypeValidator
3
+ def valid_preferred_reimbursement_type?(return_item)
4
+ preferred_type = return_item.preferred_reimbursement_type.class
5
+
6
+ !past_reimbursable_time_period?(return_item) ||
7
+ preferred_type == expired_reimbursement_type
8
+ end
9
+
10
+ def past_reimbursable_time_period?(return_item)
11
+ shipped_at = return_item.inventory_unit.shipment.shipped_at
12
+ shipped_at && shipped_at < refund_time_constraint.ago
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,164 @@
1
+ module Spree
2
+ class Reimbursement < Spree::Base
3
+ include Spree::Core::NumberGenerator.new(prefix: 'RI', length: 9)
4
+
5
+ class IncompleteReimbursementError < StandardError; end
6
+
7
+ with_options inverse_of: :reimbursements do
8
+ belongs_to :order
9
+ belongs_to :customer_return, touch: true
10
+ end
11
+
12
+ with_options inverse_of: :reimbursement do
13
+ has_many :refunds
14
+ has_many :credits, class_name: 'Spree::Reimbursement::Credit'
15
+ has_many :return_items
16
+ end
17
+
18
+ validates :order, presence: true
19
+ validate :validate_return_items_belong_to_same_order
20
+
21
+ accepts_nested_attributes_for :return_items, allow_destroy: true
22
+
23
+ scope :reimbursed, -> { where(reimbursement_status: 'reimbursed') }
24
+
25
+ # The reimbursement_tax_calculator property should be set to an object that responds to "call"
26
+ # and accepts a reimbursement object. Invoking "call" should update the tax fields on the
27
+ # associated ReturnItems.
28
+ # This allows a store to easily integrate with third party tax services.
29
+ class_attribute :reimbursement_tax_calculator
30
+ self.reimbursement_tax_calculator = ReimbursementTaxCalculator
31
+ # A separate attribute here allows you to use a more performant calculator for estimates
32
+ # and a different one (e.g. one that hits a 3rd party API) for the final calculations.
33
+ class_attribute :reimbursement_simulator_tax_calculator
34
+ self.reimbursement_simulator_tax_calculator = ReimbursementTaxCalculator
35
+
36
+ # The reimbursement_models property should contain an array of all models that provide
37
+ # reimbursements.
38
+ # This allows a store to incorporate custom reimbursement methods that Spree doesn't know about.
39
+ # Each model must implement a "total_amount_reimbursed_for" method.
40
+ # Example:
41
+ # Refund.total_amount_reimbursed_for(reimbursement)
42
+ # See the `reimbursement_generator` property regarding the generation of custom reimbursements.
43
+ class_attribute :reimbursement_models
44
+ self.reimbursement_models = [Refund]
45
+
46
+ # The reimbursement_performer property should be set to an object that responds to the following methods:
47
+ # - #perform
48
+ # - #simulate
49
+ # see ReimbursementPerformer for details.
50
+ # This allows a store to customize their reimbursement methods and logic.
51
+ class_attribute :reimbursement_performer
52
+ self.reimbursement_performer = ReimbursementPerformer
53
+
54
+ # These are called if the call to "reimburse!" succeeds.
55
+ class_attribute :reimbursement_success_hooks
56
+ self.reimbursement_success_hooks = []
57
+
58
+ # These are called if the call to "reimburse!" fails.
59
+ class_attribute :reimbursement_failure_hooks
60
+ self.reimbursement_failure_hooks = []
61
+
62
+ state_machine :reimbursement_status, initial: :pending do
63
+
64
+ event :errored do
65
+ transition to: :errored, from: :pending
66
+ end
67
+
68
+ event :reimbursed do
69
+ transition to: :reimbursed, from: [:pending, :errored]
70
+ end
71
+
72
+ end
73
+
74
+ class << self
75
+ def build_from_customer_return(customer_return)
76
+ order = customer_return.order
77
+ order.reimbursements.build({
78
+ customer_return: customer_return,
79
+ return_items: customer_return.return_items.accepted.not_reimbursed,
80
+ })
81
+ end
82
+ end
83
+
84
+ def display_total
85
+ Spree::Money.new(total, { currency: order.currency })
86
+ end
87
+
88
+ def calculated_total
89
+ # rounding every return item individually to handle edge cases for consecutive partial
90
+ # returns where rounding might cause us to try to reimburse more than was originally billed
91
+ return_items.map { |ri| ri.total.to_d.round(2) }.sum
92
+ end
93
+
94
+ def paid_amount
95
+ reimbursement_models.sum do |model|
96
+ model.total_amount_reimbursed_for(self)
97
+ end
98
+ end
99
+
100
+ def unpaid_amount
101
+ total - paid_amount
102
+ end
103
+
104
+ def perform!
105
+ reimbursement_tax_calculator.call(self)
106
+ reload
107
+ update!(total: calculated_total)
108
+
109
+ reimbursement_performer.perform(self)
110
+
111
+ if unpaid_amount_within_tolerance?
112
+ reimbursed!
113
+ reimbursement_success_hooks.each { |h| h.call self }
114
+ send_reimbursement_email
115
+ else
116
+ errored!
117
+ reimbursement_failure_hooks.each { |h| h.call self }
118
+ raise IncompleteReimbursementError, Spree.t("validation.unpaid_amount_not_zero", amount: unpaid_amount)
119
+ end
120
+ end
121
+
122
+ def simulate
123
+ reimbursement_simulator_tax_calculator.call(self)
124
+ reload
125
+ update!(total: calculated_total)
126
+
127
+ reimbursement_performer.simulate(self)
128
+ end
129
+
130
+ def return_items_requiring_exchange
131
+ return_items.select(&:exchange_required?)
132
+ end
133
+
134
+ private
135
+
136
+ def validate_return_items_belong_to_same_order
137
+ if return_items.any? { |ri| ri.inventory_unit.order_id != order_id }
138
+ errors.add(:base, :return_items_order_id_does_not_match)
139
+ end
140
+ end
141
+
142
+ def send_reimbursement_email
143
+ Spree::ReimbursementMailer.reimbursement_email(id).deliver_later
144
+ end
145
+
146
+ # If there are multiple different reimbursement types for a single
147
+ # reimbursement we open ourselves to a one-cent rounding error for every
148
+ # type over the first one. This is due to how we round #unpaid_amount and
149
+ # how each reimbursement type will round as well. Since at this point the
150
+ # payments and credits have already been processed, we should allow the
151
+ # reimbursement to show as 'reimbursed' and not 'errored'.
152
+ def unpaid_amount_within_tolerance?
153
+ reimbursement_count = reimbursement_models.size do |model|
154
+ model.total_amount_reimbursed_for(self) > 0
155
+ end
156
+ leniency = if reimbursement_count > 0
157
+ (reimbursement_count - 1) * 0.01.to_d
158
+ else
159
+ 0
160
+ end
161
+ unpaid_amount.abs.between?(0, leniency)
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,43 @@
1
+ module Spree
2
+
3
+ class ReimbursementPerformer
4
+
5
+ class << self
6
+ class_attribute :reimbursement_type_engine
7
+ self.reimbursement_type_engine = Spree::Reimbursement::ReimbursementTypeEngine
8
+
9
+ # Simulate performing the reimbursement without actually saving anything or refunding money, etc.
10
+ # This must return an array of objects that respond to the following methods:
11
+ # - #description
12
+ # - #display_amount
13
+ # so they can be displayed in the Admin UI appropriately.
14
+ def simulate(reimbursement)
15
+ execute(reimbursement, true)
16
+ end
17
+
18
+ # Actually perform the reimbursement
19
+ def perform(reimbursement)
20
+ execute(reimbursement, false)
21
+ end
22
+
23
+ private
24
+
25
+ def execute(reimbursement, simulate)
26
+ reimbursement_type_hash = calculate_reimbursement_types(reimbursement)
27
+
28
+ reimbursement_type_hash.flat_map do |reimbursement_type, return_items|
29
+ reimbursement_type.reimburse(reimbursement, return_items, simulate)
30
+ end
31
+ end
32
+
33
+ def calculate_reimbursement_types(reimbursement)
34
+ # Engine returns hash of preferred reimbursement types pointing at return items
35
+ # {Spree::ReimbursementType::OriginalPayment => [ReturnItem, ...], Spree::ReimbursementType::Exchange => [ReturnItem, ...]}
36
+ reimbursement_type_engine.new(reimbursement.return_items).calculate_reimbursement_types
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,44 @@
1
+ module Spree
2
+
3
+ # Tax calculation is broken out at this level to allow easy integration with 3rd party
4
+ # taxation systems. Those systems are usually geared toward calculating all items at once
5
+ # rather than one at a time.
6
+ #
7
+ # To use an alternative tax calculator do this:
8
+ # Spree::ReturnAuthorization.reimbursement_tax_calculator = calculator_object
9
+ # where `calculator_object` is an object that responds to "call" and accepts a reimbursement object
10
+
11
+ class ReimbursementTaxCalculator
12
+
13
+ class << self
14
+
15
+ def call(reimbursement)
16
+ reimbursement.return_items.includes(:inventory_unit).each do |return_item|
17
+ set_tax!(return_item)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def set_tax!(return_item)
24
+ calculated_refund = Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)
25
+
26
+ percent_of_tax = if return_item.pre_tax_amount <= 0 || calculated_refund <= 0
27
+ 0
28
+ else
29
+ return_item.pre_tax_amount / calculated_refund
30
+ end
31
+
32
+ additional_tax_total = percent_of_tax * return_item.inventory_unit.additional_tax_total
33
+ included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
34
+
35
+ return_item.update_attributes!({
36
+ additional_tax_total: additional_tax_total,
37
+ included_tax_total: included_tax_total,
38
+ })
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ class ReimbursementType::Credit < Spree::ReimbursementType
3
+ extend Spree::ReimbursementType::ReimbursementHelpers
4
+
5
+ class << self
6
+ def reimburse(reimbursement, return_items, simulate)
7
+ unpaid_amount = return_items.map { |ri| ri.total.to_d.round(2) }.sum
8
+ reimbursement_list, unpaid_amount = create_credits(reimbursement, unpaid_amount, simulate)
9
+ reimbursement_list
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ class Spree::ReimbursementType::Exchange < Spree::ReimbursementType
2
+ def self.reimburse(reimbursement, return_items, simulate)
3
+ return [] unless return_items.present?
4
+
5
+ exchange = Spree::Exchange.new(reimbursement.order, return_items)
6
+ exchange.perform! unless simulate
7
+ [exchange]
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class Spree::ReimbursementType::OriginalPayment < Spree::ReimbursementType
2
+ extend Spree::ReimbursementType::ReimbursementHelpers
3
+
4
+ class << self
5
+ def reimburse(reimbursement, return_items, simulate)
6
+ unpaid_amount = return_items.map { |ri| ri.total.to_d.round(2) }.sum
7
+ payments = reimbursement.order.payments.completed
8
+
9
+ refund_list, unpaid_amount = create_refunds(reimbursement, payments, unpaid_amount, simulate)
10
+ refund_list
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,67 @@
1
+ module Spree
2
+ module ReimbursementType::ReimbursementHelpers
3
+ def create_refunds(reimbursement, payments, unpaid_amount, simulate, reimbursement_list = [])
4
+ payments.map do |payment|
5
+ break if unpaid_amount <= 0
6
+ next unless payment.can_credit?
7
+
8
+ amount = [unpaid_amount, payment.credit_allowed].min
9
+ reimbursement_list << create_refund(reimbursement, payment, amount, simulate)
10
+ unpaid_amount -= amount
11
+ end
12
+
13
+ [reimbursement_list, unpaid_amount]
14
+ end
15
+
16
+ def create_credits(reimbursement, unpaid_amount, simulate, reimbursement_list = [])
17
+ credits = [create_credit(reimbursement, unpaid_amount, simulate)]
18
+ unpaid_amount -= credits.sum(&:amount)
19
+ reimbursement_list += credits
20
+
21
+ [reimbursement_list, unpaid_amount]
22
+ end
23
+
24
+ private
25
+
26
+ def create_refund(reimbursement, payment, amount, simulate)
27
+ refund = reimbursement.refunds.build(
28
+ payment: payment,
29
+ amount: amount,
30
+ reason: Spree::RefundReason.return_processing_reason
31
+ )
32
+
33
+ simulate ? refund.readonly! : refund.save!
34
+ refund
35
+ end
36
+
37
+ # If you have multiple methods of crediting a customer, overwrite this method
38
+ # Must return an array of objects the respond to #description, #display_amount
39
+ def create_credit(reimbursement, unpaid_amount, simulate)
40
+ creditable = create_creditable(reimbursement, unpaid_amount)
41
+ credit = reimbursement.credits.build(creditable: creditable, amount: unpaid_amount)
42
+ simulate ? credit.readonly! : credit.save!
43
+ credit
44
+ end
45
+
46
+ def create_creditable(reimbursement, unpaid_amount)
47
+ category = Spree::StoreCreditCategory.default_reimbursement_category(category_options(reimbursement))
48
+ Spree::StoreCredit.new(store_credit_params(category, reimbursement, unpaid_amount))
49
+ end
50
+
51
+ def store_credit_params(category, reimbursement, unpaid_amount)
52
+ {
53
+ user: reimbursement.order.user,
54
+ amount: unpaid_amount,
55
+ category: category,
56
+ created_by: Spree::StoreCredit.default_created_by,
57
+ memo: "Refund for uncreditable payments on order #{reimbursement.order.number}",
58
+ currency: reimbursement.order.currency
59
+ }
60
+ end
61
+
62
+ # overwrite if you need options for the default reimbursement category
63
+ def category_options(_reimbursement)
64
+ {}
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,28 @@
1
+ class Spree::ReimbursementType::StoreCredit < Spree::ReimbursementType
2
+ extend Spree::ReimbursementType::ReimbursementHelpers
3
+
4
+ class << self
5
+ def reimburse(reimbursement, return_items, simulate)
6
+ unpaid_amount = return_items.sum(&:total).to_d.round(2, :down)
7
+ payments = store_credit_payments(reimbursement)
8
+ reimbursement_list = []
9
+
10
+ # Credit each store credit that was used on the order
11
+ reimbursement_list, unpaid_amount = create_refunds(reimbursement, payments, unpaid_amount,
12
+ simulate, reimbursement_list)
13
+
14
+ # If there is any amount left to pay out to the customer, then create credit with that amount
15
+ if unpaid_amount > 0.0
16
+ reimbursement_list, _unpaid_amount = create_credits(reimbursement, unpaid_amount, simulate, reimbursement_list)
17
+ end
18
+
19
+ reimbursement_list
20
+ end
21
+
22
+ private
23
+
24
+ def store_credit_payments(reimbursement)
25
+ reimbursement.order.payments.completed.store_credits
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ class ReimbursementType < Spree::Base
3
+ include Spree::NamedType
4
+
5
+ ORIGINAL = 'original'
6
+
7
+ has_many :return_items
8
+
9
+ # This method will reimburse the return items based on however it child implements it
10
+ # By default it takes a reimbursement, the return items it needs to reimburse, and if
11
+ # it is a simulation or a real reimbursement. This should return an array
12
+ def self.reimburse(reimbursement, return_items, simulate)
13
+ raise "Implement me"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,98 @@
1
+ module Spree
2
+ class ReturnAuthorization < Spree::Base
3
+ include Spree::Core::NumberGenerator.new(prefix: 'RA', length: 9)
4
+
5
+ belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations
6
+
7
+ has_many :return_items, inverse_of: :return_authorization, dependent: :destroy
8
+ with_options through: :return_items do
9
+ has_many :inventory_units
10
+ has_many :customer_returns
11
+ end
12
+
13
+ belongs_to :stock_location
14
+ belongs_to :reason, class_name: 'Spree::ReturnAuthorizationReason', foreign_key: :return_authorization_reason_id
15
+
16
+ after_save :generate_expedited_exchange_reimbursements
17
+
18
+ accepts_nested_attributes_for :return_items, allow_destroy: true
19
+
20
+ validates :order, :reason, :stock_location, presence: true
21
+ validate :must_have_shipped_units, on: :create
22
+
23
+
24
+ # These are called prior to generating expedited exchanges shipments.
25
+ # Should respond to a "call" method that takes the list of return items
26
+ class_attribute :pre_expedited_exchange_hooks
27
+ self.pre_expedited_exchange_hooks = []
28
+
29
+ state_machine initial: :authorized do
30
+ before_transition to: :canceled, do: :cancel_return_items
31
+
32
+ event :cancel do
33
+ transition to: :canceled, from: :authorized, if: lambda { |return_authorization| return_authorization.can_cancel_return_items? }
34
+ end
35
+
36
+ end
37
+
38
+ extend DisplayMoney
39
+ money_methods :pre_tax_total
40
+
41
+ self.whitelisted_ransackable_attributes = ['memo', 'number', 'state']
42
+
43
+ def pre_tax_total
44
+ return_items.sum(:pre_tax_amount)
45
+ end
46
+
47
+ def currency
48
+ order.nil? ? Spree::Config[:currency] : order.currency
49
+ end
50
+
51
+ def refundable_amount
52
+ order.pre_tax_item_amount + order.promo_total
53
+ end
54
+
55
+ def customer_returned_items?
56
+ customer_returns.exists?
57
+ end
58
+
59
+ def can_cancel_return_items?
60
+ return_items.any?(&:can_cancel?) || return_items.blank?
61
+ end
62
+
63
+ private
64
+
65
+ def must_have_shipped_units
66
+ if order.nil? || order.inventory_units.shipped.none?
67
+ errors.add(:order, Spree.t(:has_no_shipped_units))
68
+ end
69
+ end
70
+
71
+
72
+ def cancel_return_items
73
+ return_items.each { |item| item.cancel! if item.can_cancel? }
74
+ end
75
+
76
+ def generate_expedited_exchange_reimbursements
77
+ return unless Spree::Config[:expedited_exchanges]
78
+
79
+ items_to_exchange = return_items.select(&:exchange_required?)
80
+ items_to_exchange.each(&:attempt_accept)
81
+ items_to_exchange.select!(&:accepted?)
82
+
83
+ return if items_to_exchange.blank?
84
+
85
+ pre_expedited_exchange_hooks.each { |h| h.call items_to_exchange }
86
+
87
+ reimbursement = Reimbursement.new(return_items: items_to_exchange, order: order)
88
+
89
+ if reimbursement.save
90
+ reimbursement.perform!
91
+ else
92
+ errors.add(:base, reimbursement.errors.full_messages)
93
+ raise ActiveRecord::RecordInvalid.new(self)
94
+ end
95
+
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,7 @@
1
+ module Spree
2
+ class ReturnAuthorizationReason < Spree::Base
3
+ include Spree::NamedType
4
+
5
+ has_many :return_authorizations, dependent: :restrict_with_error
6
+ end
7
+ end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ class Spree::ReturnItem::EligibilityValidator::BaseValidator
3
+ attr_reader :errors
4
+
5
+ def initialize(return_item)
6
+ @return_item = return_item
7
+ @errors = {}
8
+ end
9
+
10
+ def eligible_for_return?
11
+ raise NotImplementedError, Spree.t(:implement_eligible_for_return)
12
+ end
13
+
14
+ def requires_manual_intervention?
15
+ raise NotImplementedError, Spree.t(:implement_requires_manual_intervention)
16
+ end
17
+
18
+ private
19
+
20
+ def add_error(key, error)
21
+ @errors[key] = error
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ module Spree
2
+ class ReturnItem::EligibilityValidator::Default < Spree::ReturnItem::EligibilityValidator::BaseValidator
3
+ class_attribute :permitted_eligibility_validators
4
+ self.permitted_eligibility_validators = [
5
+ ReturnItem::EligibilityValidator::OrderCompleted,
6
+ ReturnItem::EligibilityValidator::TimeSincePurchase,
7
+ ReturnItem::EligibilityValidator::RMARequired,
8
+ ReturnItem::EligibilityValidator::InventoryShipped,
9
+ ReturnItem::EligibilityValidator::NoReimbursements,
10
+ ]
11
+
12
+ def eligible_for_return?
13
+ validators.all? {|v| v.eligible_for_return? }
14
+ end
15
+
16
+ def requires_manual_intervention?
17
+ validators.any? {|v| v.requires_manual_intervention? }
18
+ end
19
+
20
+ def errors
21
+ validators.map(&:errors).reduce({}, :merge)
22
+ end
23
+
24
+ private
25
+
26
+ def validators
27
+ @validators ||= permitted_eligibility_validators.map{|v| v.new(@return_item) }
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ class ReturnItem::EligibilityValidator::InventoryShipped < Spree::ReturnItem::EligibilityValidator::BaseValidator
3
+ def eligible_for_return?
4
+ if @return_item.inventory_unit.shipped?
5
+ return true
6
+ else
7
+ add_error(:inventory_unit_shipped, Spree.t('return_item_inventory_unit_ineligible'))
8
+ return false
9
+ end
10
+ end
11
+
12
+ def requires_manual_intervention?
13
+ @errors.present?
14
+ end
15
+ end
16
+ end