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,175 @@
1
+ module Spree
2
+ class Payment < Spree::Base
3
+ module Processing
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ class_attribute :gateway_options_class
7
+ self.gateway_options_class = Spree::Payment::GatewayOptions
8
+ end
9
+
10
+ def process!
11
+ if payment_method && payment_method.auto_capture?
12
+ purchase!
13
+ else
14
+ authorize!
15
+ end
16
+ end
17
+
18
+ def authorize!
19
+ handle_payment_preconditions { process_authorization }
20
+ end
21
+
22
+ # Captures the entire amount of a payment.
23
+ def purchase!
24
+ handle_payment_preconditions { process_purchase }
25
+ end
26
+
27
+ # Takes the amount in cents to capture.
28
+ # Can be used to capture partial amounts of a payment, and will create
29
+ # a new pending payment record for the remaining amount to capture later.
30
+ def capture!(amount = nil)
31
+ return true if completed?
32
+ amount ||= money.amount_in_cents
33
+ started_processing!
34
+ protect_from_connection_error do
35
+ # Standard ActiveMerchant capture usage
36
+ response = payment_method.capture(
37
+ amount,
38
+ response_code,
39
+ gateway_options
40
+ )
41
+ money = ::Money.new(amount, currency)
42
+ capture_events.create!(amount: money.to_f)
43
+ split_uncaptured_amount
44
+ handle_response(response, :complete, :failure)
45
+ end
46
+ end
47
+
48
+ def void_transaction!
49
+ return true if void?
50
+ protect_from_connection_error do
51
+
52
+ if payment_method.payment_profiles_supported?
53
+ # Gateways supporting payment profiles will need access to credit card object because this stores the payment profile information
54
+ # so supply the authorization itself as well as the credit card, rather than just the authorization code
55
+ response = payment_method.void(self.response_code, source, gateway_options)
56
+ else
57
+ # Standard ActiveMerchant void usage
58
+ response = payment_method.void(self.response_code, gateway_options)
59
+ end
60
+ record_response(response)
61
+
62
+ if response.success?
63
+ self.response_code = response.authorization
64
+ self.void
65
+ else
66
+ gateway_error(response)
67
+ end
68
+ end
69
+ end
70
+
71
+ def cancel!
72
+ response = payment_method.cancel(response_code)
73
+ handle_response(response, :void, :failure)
74
+ end
75
+
76
+ def gateway_options
77
+ order.reload
78
+ gateway_options_class.new(self).to_hash
79
+ end
80
+
81
+ private
82
+
83
+ def process_authorization
84
+ started_processing!
85
+ gateway_action(source, :authorize, :pend)
86
+ end
87
+
88
+ def process_purchase
89
+ started_processing!
90
+ result = gateway_action(source, :purchase, :complete)
91
+ # This won't be called if gateway_action raises a GatewayError
92
+ capture_events.create!(amount: amount)
93
+ end
94
+
95
+ def handle_payment_preconditions(&block)
96
+ unless block_given?
97
+ raise ArgumentError.new("handle_payment_preconditions must be called with a block")
98
+ end
99
+
100
+ if payment_method && payment_method.source_required?
101
+ if source
102
+ if !processing?
103
+ if payment_method.supports?(source) || token_based?
104
+ yield
105
+ else
106
+ invalidate!
107
+ raise Core::GatewayError.new(Spree.t(:payment_method_not_supported))
108
+ end
109
+ end
110
+ else
111
+ raise Core::GatewayError.new(Spree.t(:payment_processing_failed))
112
+ end
113
+ end
114
+ end
115
+
116
+ def gateway_action(source, action, success_state)
117
+ protect_from_connection_error do
118
+ response = payment_method.send(action, money.amount_in_cents,
119
+ source,
120
+ gateway_options)
121
+ handle_response(response, success_state, :failure)
122
+ end
123
+ end
124
+
125
+ def handle_response(response, success_state, failure_state)
126
+ record_response(response)
127
+
128
+ if response.success?
129
+ unless response.authorization.nil?
130
+ self.response_code = response.authorization
131
+ self.avs_response = response.avs_result['code']
132
+
133
+ if response.cvv_result
134
+ self.cvv_response_code = response.cvv_result['code']
135
+ self.cvv_response_message = response.cvv_result['message']
136
+ end
137
+ end
138
+ self.send("#{success_state}!")
139
+ else
140
+ self.send(failure_state)
141
+ gateway_error(response)
142
+ end
143
+ end
144
+
145
+ def record_response(response)
146
+ log_entries.create!(:details => response.to_yaml)
147
+ end
148
+
149
+ def protect_from_connection_error
150
+ begin
151
+ yield
152
+ rescue ActiveMerchant::ConnectionError => e
153
+ gateway_error(e)
154
+ end
155
+ end
156
+
157
+ def gateway_error(error)
158
+ if error.is_a? ActiveMerchant::Billing::Response
159
+ text = error.params['message'] || error.params['response_reason_text'] || error.message
160
+ elsif error.is_a? ActiveMerchant::ConnectionError
161
+ text = Spree.t(:unable_to_connect_to_gateway)
162
+ else
163
+ text = error.to_s
164
+ end
165
+ logger.error(Spree.t(:gateway_error))
166
+ logger.error(" #{error.to_yaml}")
167
+ raise Core::GatewayError.new(text)
168
+ end
169
+
170
+ def token_based?
171
+ source.gateway_customer_profile_id.present? || source.gateway_payment_profile_id.present?
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,276 @@
1
+ module Spree
2
+ class Payment < Spree::Base
3
+ include Spree::Core::NumberGenerator.new(prefix: 'P', letters: true, length: 7)
4
+
5
+ extend FriendlyId
6
+ friendly_id :number, slug_column: :number, use: :slugged
7
+
8
+ include Spree::Payment::Processing
9
+
10
+ NON_RISKY_AVS_CODES = ['B', 'D', 'H', 'J', 'M', 'Q', 'T', 'V', 'X', 'Y'].freeze
11
+ RISKY_AVS_CODES = ['A', 'C', 'E', 'F', 'G', 'I', 'K', 'L', 'N', 'O', 'P', 'R', 'S', 'U', 'W', 'Z'].freeze
12
+ INVALID_STATES = %w(failed invalid).freeze
13
+
14
+ with_options inverse_of: :payments do
15
+ belongs_to :order, class_name: 'Spree::Order', touch: true
16
+ belongs_to :payment_method, class_name: 'Spree::PaymentMethod'
17
+ end
18
+ belongs_to :source, polymorphic: true
19
+
20
+ has_many :offsets, -> { offset_payment }, class_name: "Spree::Payment", foreign_key: :source_id
21
+ has_many :log_entries, as: :source
22
+ has_many :state_changes, as: :stateful
23
+ has_many :capture_events, class_name: 'Spree::PaymentCaptureEvent'
24
+ has_many :refunds, inverse_of: :payment
25
+
26
+ validates :payment_method, presence: true
27
+ before_validation :validate_source
28
+
29
+ after_save :create_payment_profile, if: :profiles_supported?
30
+
31
+ # update the order totals, etc.
32
+ after_save :update_order
33
+
34
+ # invalidate previously entered payments
35
+ after_create :invalidate_old_payments
36
+ after_create :create_eligible_credit_event
37
+
38
+ attr_accessor :source_attributes, :request_env
39
+
40
+ after_initialize :build_source
41
+
42
+ validates :amount, numericality: true
43
+
44
+ delegate :store_credit?, to: :payment_method, allow_nil: true
45
+ default_scope { order(:created_at) }
46
+
47
+ scope :from_credit_card, -> { where(source_type: 'Spree::CreditCard') }
48
+ scope :with_state, ->(s) { where(state: s.to_s) }
49
+ # "offset" is reserved by activerecord
50
+ scope :offset_payment, -> { where("source_type = 'Spree::Payment' AND amount < 0 AND state = 'completed'") }
51
+
52
+ scope :checkout, -> { with_state('checkout') }
53
+ scope :completed, -> { with_state('completed') }
54
+ scope :pending, -> { with_state('pending') }
55
+ scope :processing, -> { with_state('processing') }
56
+ scope :failed, -> { with_state('failed') }
57
+
58
+ scope :risky, -> { where("avs_response IN (?) OR (cvv_response_code IS NOT NULL and cvv_response_code != 'M') OR state = 'failed'", RISKY_AVS_CODES) }
59
+ scope :valid, -> { where.not(state: INVALID_STATES) }
60
+
61
+ scope :store_credits, -> { where(source_type: Spree::StoreCredit.to_s) }
62
+ scope :not_store_credits, -> { where(arel_table[:source_type].not_eq(Spree::StoreCredit.to_s).or(arel_table[:source_type].eq(nil))) }
63
+
64
+ # transaction_id is much easier to understand
65
+ def transaction_id
66
+ response_code
67
+ end
68
+
69
+ delegate :currency, to: :order
70
+
71
+ # order state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
72
+ state_machine initial: :checkout do
73
+ # With card payments, happens before purchase or authorization happens
74
+ #
75
+ # Setting it after creating a profile and authorizing a full amount will
76
+ # prevent the payment from being authorized again once Order transitions
77
+ # to complete
78
+ event :started_processing do
79
+ transition from: [:checkout, :pending, :completed, :processing], to: :processing
80
+ end
81
+ # When processing during checkout fails
82
+ event :failure do
83
+ transition from: [:pending, :processing], to: :failed
84
+ end
85
+ # With card payments this represents authorizing the payment
86
+ event :pend do
87
+ transition from: [:checkout, :processing], to: :pending
88
+ end
89
+ # With card payments this represents completing a purchase or capture transaction
90
+ event :complete do
91
+ transition from: [:processing, :pending, :checkout], to: :completed
92
+ end
93
+ event :void do
94
+ transition from: [:pending, :processing, :completed, :checkout], to: :void
95
+ end
96
+ # when the card brand isnt supported
97
+ event :invalidate do
98
+ transition from: [:checkout], to: :invalid
99
+ end
100
+
101
+ after_transition do |payment, transition|
102
+ payment.state_changes.create!(
103
+ previous_state: transition.from,
104
+ next_state: transition.to,
105
+ name: 'payment',
106
+ )
107
+ end
108
+ end
109
+
110
+ def money
111
+ Spree::Money.new(amount, { currency: currency })
112
+ end
113
+ alias display_amount money
114
+
115
+ def amount=(amount)
116
+ self[:amount] =
117
+ case amount
118
+ when String
119
+ separator = I18n.t('number.currency.format.separator')
120
+ number = amount.delete("^0-9-#{separator}\.").tr(separator, '.')
121
+ number.to_d if number.present?
122
+ end || amount
123
+ end
124
+
125
+ def offsets_total
126
+ offsets.pluck(:amount).sum
127
+ end
128
+
129
+ def credit_allowed
130
+ amount - (offsets_total.abs + refunds.sum(:amount))
131
+ end
132
+
133
+ def can_credit?
134
+ credit_allowed > 0
135
+ end
136
+
137
+ # see https://github.com/spree/spree/issues/981
138
+ def build_source
139
+ return unless new_record?
140
+ if source_attributes.present? && source.blank? && payment_method.try(:payment_source_class)
141
+ self.source = payment_method.payment_source_class.new(source_attributes)
142
+ self.source.payment_method_id = payment_method.id
143
+ self.source.user_id = self.order.user_id if self.order
144
+ end
145
+ end
146
+
147
+ def actions
148
+ return [] unless payment_source and payment_source.respond_to? :actions
149
+ payment_source.actions.select { |action| !payment_source.respond_to?("can_#{action}?") or payment_source.send("can_#{action}?", self) }
150
+ end
151
+
152
+ def payment_source
153
+ res = source.is_a?(Payment) ? source.source : source
154
+ res || payment_method
155
+ end
156
+
157
+ def is_avs_risky?
158
+ return false if avs_response.blank? || NON_RISKY_AVS_CODES.include?(avs_response)
159
+ return true
160
+ end
161
+
162
+ def is_cvv_risky?
163
+ return false if cvv_response_code == "M"
164
+ return false if cvv_response_code.nil?
165
+ return false if cvv_response_message.present?
166
+ return true
167
+ end
168
+
169
+ def captured_amount
170
+ capture_events.sum(:amount)
171
+ end
172
+
173
+ def uncaptured_amount
174
+ amount - captured_amount
175
+ end
176
+
177
+ def editable?
178
+ checkout? || pending?
179
+ end
180
+
181
+ private
182
+
183
+ def has_invalid_state?
184
+ INVALID_STATES.include?(state)
185
+ end
186
+
187
+ def validate_source
188
+ if source && !source.valid?
189
+ source.errors.each do |field, error|
190
+ field_name = I18n.t("activerecord.attributes.#{source.class.to_s.underscore}.#{field}")
191
+ self.errors.add(Spree.t(source.class.to_s.demodulize.underscore), "#{field_name} #{error}")
192
+ end
193
+ end
194
+ return !errors.present?
195
+ end
196
+
197
+ def profiles_supported?
198
+ payment_method.respond_to?(:payment_profiles_supported?) && payment_method.payment_profiles_supported?
199
+ end
200
+
201
+ def create_payment_profile
202
+ # Don't attempt to create on bad payments.
203
+ return if has_invalid_state?
204
+ # Payment profile cannot be created without source
205
+ return unless source
206
+ # Imported payments shouldn't create a payment profile.
207
+ return if source.imported
208
+
209
+ payment_method.create_profile(self)
210
+ rescue ActiveMerchant::ConnectionError => e
211
+ gateway_error e
212
+ end
213
+
214
+ def invalidate_old_payments
215
+ unless has_invalid_state?
216
+ order.payments.with_state('checkout').where("id != ?", self.id).each do |payment|
217
+ payment.invalidate!
218
+ end
219
+ end
220
+ end
221
+
222
+ def split_uncaptured_amount
223
+ if uncaptured_amount > 0
224
+ order.payments.create! amount: uncaptured_amount,
225
+ avs_response: avs_response,
226
+ cvv_response_code: cvv_response_code,
227
+ cvv_response_message: cvv_response_message,
228
+ payment_method: payment_method,
229
+ response_code: response_code,
230
+ source: source,
231
+ state: 'pending'
232
+ update_attributes(amount: captured_amount)
233
+ end
234
+ end
235
+
236
+ def update_order
237
+ if completed? || void?
238
+ order.updater.update_payment_total
239
+ end
240
+
241
+ if order.completed?
242
+ order.updater.update_payment_state
243
+ order.updater.update_shipments
244
+ order.updater.update_shipment_state
245
+ end
246
+
247
+ if self.completed? || order.completed?
248
+ order.persist_totals
249
+ end
250
+ end
251
+
252
+ def create_eligible_credit_event
253
+ # When cancelling an order, a payment with the negative amount
254
+ # of the payment total is created to refund the customer. That
255
+ # payment has a source of itself (Spree::Payment) no matter the
256
+ # type of payment getting refunded, hence the additional check
257
+ # if the source is a store credit.
258
+ return unless store_credit? && source.is_a?(Spree::StoreCredit)
259
+
260
+ # creates the store credit event
261
+ source.update_attributes!({
262
+ action: Spree::StoreCredit::ELIGIBLE_ACTION,
263
+ action_amount: amount,
264
+ action_authorization_code: response_code,
265
+ })
266
+ end
267
+
268
+ def invalidate_old_payments
269
+ return if store_credit? # store credits shouldn't invalidate other payment types
270
+ order.payments.with_state('checkout').where("id != ?", self.id).each do |payment|
271
+ payment.invalidate! unless payment.store_credit?
272
+ end
273
+ end
274
+
275
+ end
276
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class PaymentCaptureEvent < Spree::Base
3
+ belongs_to :payment, class_name: 'Spree::Payment'
4
+
5
+ def display_amount
6
+ Spree::Money.new(amount, { currency: payment.currency })
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+ module Spree
2
+ class PaymentMethod::Check < PaymentMethod
3
+ def actions
4
+ %w{capture void}
5
+ end
6
+
7
+ # Indicates whether its possible to capture the payment
8
+ def can_capture?(payment)
9
+ ['checkout', 'pending'].include?(payment.state)
10
+ end
11
+
12
+ # Indicates whether its possible to void the payment.
13
+ def can_void?(payment)
14
+ payment.state != 'void'
15
+ end
16
+
17
+ def capture(*)
18
+ simulated_successful_billing_response
19
+ end
20
+
21
+ def cancel(*)
22
+ simulated_successful_billing_response
23
+ end
24
+
25
+ def void(*)
26
+ simulated_successful_billing_response
27
+ end
28
+
29
+ def source_required?
30
+ false
31
+ end
32
+
33
+ def credit(*)
34
+ simulated_successful_billing_response
35
+ end
36
+
37
+ private
38
+
39
+ def simulated_successful_billing_response
40
+ ActiveMerchant::Billing::Response.new(true, "", {}, {})
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,130 @@
1
+ module Spree
2
+ class PaymentMethod::StoreCredit < PaymentMethod
3
+ def payment_source_class
4
+ ::Spree::StoreCredit
5
+ end
6
+
7
+ def can_capture?(payment)
8
+ ['checkout', 'pending'].include?(payment.state)
9
+ end
10
+
11
+ def can_void?(payment)
12
+ payment.pending?
13
+ end
14
+
15
+ def authorize(amount_in_cents, store_credit, gateway_options = {})
16
+ if store_credit.nil?
17
+ ActiveMerchant::Billing::Response.new(false, Spree.t('store_credit_payment_method.unable_to_find'), {}, {})
18
+ else
19
+ action = -> (store_credit) do
20
+ store_credit.authorize(
21
+ amount_in_cents / 100.0.to_d,
22
+ gateway_options[:currency],
23
+ action_originator: gateway_options[:originator]
24
+ )
25
+ end
26
+ handle_action_call(store_credit, action, :authorize)
27
+ end
28
+ end
29
+
30
+ def capture(amount_in_cents, auth_code, gateway_options = {})
31
+ action = -> (store_credit) do
32
+ store_credit.capture(
33
+ amount_in_cents / 100.0.to_d,
34
+ auth_code,
35
+ gateway_options[:currency],
36
+ action_originator: gateway_options[:originator]
37
+ )
38
+ end
39
+ handle_action(action, :capture, auth_code)
40
+ end
41
+
42
+ def purchase(amount_in_cents, store_credit, gateway_options = {})
43
+ eligible_events = store_credit.store_credit_events.where(
44
+ amount: amount_in_cents / 100.0.to_d,
45
+ action: Spree::StoreCredit::ELIGIBLE_ACTION
46
+ )
47
+ event = eligible_events.detect do |eligible_event|
48
+ store_credit.store_credit_events.where(authorization_code: eligible_event.authorization_code).
49
+ where.not(action: Spree::StoreCredit::ELIGIBLE_ACTION).empty?
50
+ end
51
+
52
+ if event.blank?
53
+ ActiveMerchant::Billing::Response.new(false, Spree.t('store_credit_payment_method.unable_to_find'), {}, {})
54
+ else
55
+ capture(amount_in_cents, event.authorization_code, gateway_options)
56
+ end
57
+ end
58
+
59
+ def void(auth_code, gateway_options = {})
60
+ action = -> (store_credit) do
61
+ store_credit.void(auth_code, action_originator: gateway_options[:originator])
62
+ end
63
+ handle_action(action, :void, auth_code)
64
+ end
65
+
66
+ def credit(amount_in_cents, auth_code, gateway_options)
67
+ action = -> (store_credit) do
68
+ currency = gateway_options[:currency] || store_credit.currency
69
+ originator = gateway_options[:originator]
70
+
71
+ store_credit.credit(amount_in_cents / 100.0.to_d, auth_code, currency, action_originator: originator)
72
+ end
73
+
74
+ handle_action(action, :credit, auth_code)
75
+ end
76
+
77
+ def cancel(auth_code)
78
+ store_credit_event = StoreCreditEvent.find_by(authorization_code: auth_code,
79
+ action: Spree::StoreCredit::CAPTURE_ACTION)
80
+ store_credit = store_credit_event.try(:store_credit)
81
+
82
+ if !store_credit_event || !store_credit
83
+ handle_action(nil, :cancel, false)
84
+ else
85
+ action = -> (store_credit) do
86
+ store_credit.credit(store_credit_event.amount, auth_code, store_credit.currency)
87
+ end
88
+ handle_action(action, :cancel, auth_code)
89
+ end
90
+ end
91
+
92
+ def source_required?
93
+ true
94
+ end
95
+
96
+ private
97
+
98
+ def handle_action_call(store_credit, action, action_name, auth_code = nil)
99
+ store_credit.with_lock do
100
+ if response = action.call(store_credit)
101
+ # note that we only need to return the auth code on an 'auth', but it's innocuous to always return
102
+ ActiveMerchant::Billing::Response.new(
103
+ true,
104
+ Spree.t('store_credit_payment_method.successful_action', action: action_name),
105
+ {},
106
+ authorization: auth_code || response
107
+ )
108
+ else
109
+ ActiveMerchant::Billing::Response.new(false, store_credit.errors.full_messages.join, {}, {})
110
+ end
111
+ end
112
+ end
113
+
114
+ def handle_action(action, action_name, auth_code)
115
+ # Find first event with provided auth_code
116
+ store_credit = StoreCreditEvent.find_by_authorization_code(auth_code).try(:store_credit)
117
+
118
+ if store_credit.nil?
119
+ ActiveMerchant::Billing::Response.new(
120
+ false,
121
+ Spree.t('store_credit_payment_method.unable_to_find_for_action', auth_code: auth_code, action: action_name),
122
+ {},
123
+ {}
124
+ )
125
+ else
126
+ handle_action_call(store_credit, action, action_name, auth_code)
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,71 @@
1
+ module Spree
2
+ class PaymentMethod < Spree::Base
3
+ acts_as_paranoid
4
+ acts_as_list
5
+
6
+ DISPLAY = [:both, :front_end, :back_end].freeze
7
+
8
+ scope :active, -> { where(active: true) }
9
+ scope :available, -> { active.where(display_on: [:front_end, :back_end, :both]) }
10
+ scope :available_on_front_end, -> { active.where(display_on: [:front_end, :both]) }
11
+ scope :available_on_back_end, -> { active.where(display_on: [:back_end, :both]) }
12
+
13
+ validates :name, presence: true
14
+
15
+ has_many :payments, class_name: "Spree::Payment", inverse_of: :payment_method
16
+ has_many :credit_cards, class_name: "Spree::CreditCard"
17
+
18
+ def self.providers
19
+ Rails.application.config.spree.payment_methods
20
+ end
21
+
22
+ def provider_class
23
+ raise ::NotImplementedError, 'You must implement provider_class method for this gateway.'
24
+ end
25
+
26
+ # The class that will process payments for this payment type, used for @payment.source
27
+ # e.g. CreditCard in the case of a the Gateway payment type
28
+ # nil means the payment method doesn't require a source e.g. check
29
+ def payment_source_class
30
+ raise ::NotImplementedError, 'You must implement payment_source_class method for this gateway.'
31
+ end
32
+
33
+ def method_type
34
+ type.demodulize.downcase
35
+ end
36
+
37
+ def self.find_with_destroyed *args
38
+ unscoped { find(*args) }
39
+ end
40
+
41
+ def payment_profiles_supported?
42
+ false
43
+ end
44
+
45
+ def source_required?
46
+ true
47
+ end
48
+
49
+ # Custom gateways should redefine this method. See Gateway implementation
50
+ # as an example
51
+ def reusable_sources(order)
52
+ []
53
+ end
54
+
55
+ def auto_capture?
56
+ self.auto_capture.nil? ? Spree::Config[:auto_capture] : self.auto_capture
57
+ end
58
+
59
+ def supports?(source)
60
+ true
61
+ end
62
+
63
+ def cancel(response)
64
+ raise ::NotImplementedError, 'You must implement cancel method for this payment method.'
65
+ end
66
+
67
+ def store_credit?
68
+ self.class == Spree::PaymentMethod::StoreCredit
69
+ end
70
+ end
71
+ end