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,44 @@
1
+ require_dependency 'spree/calculator'
2
+
3
+ module Spree
4
+ class Calculator::TieredPercent < Calculator
5
+ preference :base_percent, :decimal, default: 0
6
+ preference :tiers, :hash, default: {}
7
+
8
+ before_validation do
9
+ # Convert tier values to decimals. Strings don't do us much good.
10
+ if preferred_tiers.is_a?(Hash)
11
+ self.preferred_tiers = Hash[*preferred_tiers.flatten.map(&:to_f)]
12
+ end
13
+ end
14
+
15
+ validates :preferred_base_percent, numericality: {
16
+ greater_than_or_equal_to: 0,
17
+ less_than_or_equal_to: 100
18
+ }
19
+ validate :preferred_tiers_content
20
+
21
+ def self.description
22
+ Spree.t(:tiered_percent)
23
+ end
24
+
25
+ def compute(object)
26
+ base, percent = preferred_tiers.sort.reverse.detect{ |b,_| object.amount >= b }
27
+ (object.amount * (percent || preferred_base_percent) / 100).round(2)
28
+ end
29
+
30
+ private
31
+ def preferred_tiers_content
32
+ if preferred_tiers.is_a? Hash
33
+ unless preferred_tiers.keys.all?{ |k| k.is_a?(Numeric) && k > 0 }
34
+ errors.add(:base, :keys_should_be_positive_number)
35
+ end
36
+ unless preferred_tiers.values.all?{ |k| k.is_a?(Numeric) && k >= 0 && k <= 100 }
37
+ errors.add(:base, :values_should_be_percent)
38
+ end
39
+ else
40
+ errors.add(:preferred_tiers, :should_be_hash)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,47 @@
1
+ module Spree
2
+ class Calculator < Spree::Base
3
+ # Conditional check for backwards compatibilty since acts as paranoid was added late https://github.com/spree/spree/issues/5858
4
+ if ActiveRecord::Base.connected? && connection.data_source_exists?(:spree_calculators) && connection.column_exists?(:spree_calculators, :deleted_at)
5
+ acts_as_paranoid
6
+ end
7
+
8
+ belongs_to :calculable, polymorphic: true
9
+
10
+ # This method calls a compute_<computable> method. must be overriden in concrete calculator.
11
+ #
12
+ # It should return amount computed based on #calculable and the computable parameter
13
+ def compute(computable)
14
+ # Spree::LineItem -> :compute_line_item
15
+ computable_name = computable.class.name.demodulize.underscore
16
+ method = "compute_#{computable_name}".to_sym
17
+ calculator_class = self.class
18
+ if respond_to?(method)
19
+ self.send(method, computable)
20
+ else
21
+ raise NotImplementedError, "Please implement '#{method}(#{computable_name})' in your calculator: #{calculator_class.name}"
22
+ end
23
+ end
24
+
25
+ # overwrite to provide description for your calculators
26
+ def self.description
27
+ 'Base Calculator'
28
+ end
29
+
30
+ # Returns all calculators applicable for kind of work
31
+ def self.calculators
32
+ Rails.application.config.spree.calculators
33
+ end
34
+
35
+ def to_s
36
+ self.class.name.titleize.gsub("Calculator\/", "")
37
+ end
38
+
39
+ def description
40
+ self.class.description
41
+ end
42
+
43
+ def available?(object)
44
+ true
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ class Classification < Spree::Base
3
+ self.table_name = 'spree_products_taxons'
4
+ acts_as_list scope: :taxon
5
+
6
+ with_options inverse_of: :classifications, touch: true do
7
+ belongs_to :product, class_name: "Spree::Product"
8
+ belongs_to :taxon, class_name: "Spree::Taxon"
9
+ end
10
+
11
+ validates :taxon, :product, presence: true
12
+ # For #3494
13
+ validates :taxon_id, uniqueness: { scope: :product_id, message: :already_linked, allow_blank: true }
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ class Country < Spree::Base
3
+ has_many :states, dependent: :destroy
4
+ has_many :addresses, dependent: :restrict_with_error
5
+
6
+ has_many :zone_members,
7
+ -> { where(zoneable_type: 'Spree::Country') },
8
+ class_name: 'Spree::ZoneMember',
9
+ dependent: :destroy,
10
+ foreign_key: :zoneable_id
11
+
12
+ has_many :zones, through: :zone_members, class_name: 'Spree::Zone'
13
+
14
+ before_destroy :ensure_not_default
15
+
16
+ validates :name, :iso_name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
17
+
18
+ def self.default
19
+ country_id = Spree::Config[:default_country_id]
20
+ country_id.present? ? find(country_id) : find_by!(iso: 'US')
21
+ end
22
+
23
+ def <=>(other)
24
+ name <=> other.name
25
+ end
26
+
27
+ def to_s
28
+ name
29
+ end
30
+
31
+ private
32
+
33
+ def ensure_not_default
34
+ if id.eql?(Spree::Config[:default_country_id])
35
+ errors.add(:base, Spree.t(:default_country_cannot_be_deleted))
36
+ false
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,166 @@
1
+ module Spree
2
+ class CreditCard < Spree::Base
3
+ belongs_to :payment_method
4
+ belongs_to :user, class_name: Spree.user_class, foreign_key: 'user_id'
5
+ has_many :payments, as: :source
6
+
7
+ before_save :set_last_digits
8
+
9
+ after_save :ensure_one_default
10
+
11
+ # As of rails 4.2 string columns always return strings, we can override it on model level.
12
+ attribute :month, ActiveRecord::Type::Integer.new
13
+ attribute :year, ActiveRecord::Type::Integer.new
14
+
15
+ attr_reader :number
16
+ attr_accessor :encrypted_data,
17
+ :imported,
18
+ :verification_value
19
+
20
+ with_options if: :require_card_numbers?, on: :create do
21
+ validates :month, :year, numericality: { only_integer: true }
22
+ validates :number, :verification_value, presence: true, unless: :imported
23
+ validates :name, presence: true
24
+ end
25
+
26
+ scope :with_payment_profile, -> { where('gateway_customer_profile_id IS NOT NULL') }
27
+ scope :default, -> { where(default: true) }
28
+
29
+ # needed for some of the ActiveMerchant gateways (eg. SagePay)
30
+ alias_attribute :brand, :cc_type
31
+
32
+ # ActiveMerchant::Billing::CreditCard added this accessor used by some gateways.
33
+ # More info: https://github.com/spree/spree/issues/6209
34
+ #
35
+ # Returns or sets the track data for the card
36
+ #
37
+ # @return [String]
38
+ attr_accessor :track_data
39
+
40
+ CARD_TYPES = {
41
+ visa: /^4\d{12}(\d{3})?(\d{3})?$/,
42
+ master: /^(5[1-5]\d{4}|677189|222[1-9]\d{2}|22[3-9]\d{3}|2[3-6]\d{4}|27[01]\d{3}|2720\d{2})\d{10}$/,
43
+ discover: /^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/,
44
+ american_express: /^3[47]\d{13}$/,
45
+ diners_club: /^3(0[0-5]|[68]\d)\d{11}$/,
46
+ jcb: /^35(28|29|[3-8]\d)\d{12}$/,
47
+ switch: /^6759\d{12}(\d{2,3})?$/,
48
+ solo: /^6767\d{12}(\d{2,3})?$/,
49
+ dankort: /^5019\d{12}$/,
50
+ maestro: /^(5[06-8]|6\d)\d{10,17}$/,
51
+ forbrugsforeningen: /^600722\d{10}$/,
52
+ laser: /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
53
+ }
54
+
55
+ def expiry=(expiry)
56
+ return unless expiry.present?
57
+
58
+ self[:month], self[:year] =
59
+ if expiry.match(/\d{2}\s?\/\s?\d{2,4}/) # will match mm/yy and mm / yyyy
60
+ expiry.delete(' ').split('/')
61
+ elsif match = expiry.match(/(\d{2})(\d{2,4})/) # will match mmyy and mmyyyy
62
+ [match[1], match[2]]
63
+ end
64
+ if self[:year]
65
+ self[:year] = "20#{ self[:year] }" if self[:year] / 100 == 0
66
+ self[:year] = self[:year].to_i
67
+ end
68
+ self[:month] = self[:month].to_i if self[:month]
69
+ end
70
+
71
+ def number=(num)
72
+ @number = num.gsub(/[^0-9]/, '') rescue nil
73
+ end
74
+
75
+ # cc_type is set by jquery.payment, which helpfully provides different
76
+ # types from Active Merchant. Converting them is necessary.
77
+ def cc_type=(type)
78
+ self[:cc_type] = case type
79
+ when 'mastercard', 'maestro' then 'master'
80
+ when 'amex' then 'american_express'
81
+ when 'dinersclub' then 'diners_club'
82
+ when '' then try_type_from_number
83
+ else type
84
+ end
85
+ end
86
+
87
+ def set_last_digits
88
+ number.to_s.gsub!(/\s/,'')
89
+ verification_value.to_s.gsub!(/\s/,'')
90
+ self.last_digits ||= number.to_s.length <= 4 ? number : number.to_s.slice(-4..-1)
91
+ end
92
+
93
+ def try_type_from_number
94
+ numbers = number.delete(' ') if number
95
+ CARD_TYPES.find{|type, pattern| return type.to_s if numbers =~ pattern}.to_s
96
+ end
97
+
98
+ def verification_value?
99
+ verification_value.present?
100
+ end
101
+
102
+ # Show the card number, with all but last 4 numbers replace with "X". (XXXX-XXXX-XXXX-4338)
103
+ def display_number
104
+ "XXXX-XXXX-XXXX-#{last_digits}"
105
+ end
106
+
107
+ def actions
108
+ %w{capture void credit}
109
+ end
110
+
111
+ # Indicates whether its possible to capture the payment
112
+ def can_capture?(payment)
113
+ payment.pending? || payment.checkout?
114
+ end
115
+
116
+ # Indicates whether its possible to void the payment.
117
+ def can_void?(payment)
118
+ !payment.failed? && !payment.void?
119
+ end
120
+
121
+ # Indicates whether its possible to credit the payment. Note that most gateways require that the
122
+ # payment be settled first which generally happens within 12-24 hours of the transaction.
123
+ def can_credit?(payment)
124
+ payment.completed? && payment.credit_allowed > 0
125
+ end
126
+
127
+ def has_payment_profile?
128
+ gateway_customer_profile_id.present? || gateway_payment_profile_id.present?
129
+ end
130
+
131
+ # ActiveMerchant needs first_name/last_name because we pass it a Spree::CreditCard and it calls those methods on it.
132
+ # Looking at the ActiveMerchant source code we should probably be calling #to_active_merchant before passing
133
+ # the object to ActiveMerchant but this should do for now.
134
+ def first_name
135
+ name.to_s.split(/[[:space:]]/, 2)[0]
136
+ end
137
+
138
+ def last_name
139
+ name.to_s.split(/[[:space:]]/, 2)[1]
140
+ end
141
+
142
+ def to_active_merchant
143
+ ActiveMerchant::Billing::CreditCard.new(
144
+ number: number,
145
+ month: month,
146
+ year: year,
147
+ verification_value: verification_value,
148
+ first_name: first_name,
149
+ last_name: last_name,
150
+ )
151
+ end
152
+
153
+ private
154
+
155
+ def require_card_numbers?
156
+ !self.encrypted_data.present? && !self.has_payment_profile?
157
+ end
158
+
159
+ def ensure_one_default
160
+ if self.user_id && self.default
161
+ CreditCard.where(default: true, user_id: self.user_id).where.not(id: self.id)
162
+ .update_all(default: false)
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,67 @@
1
+ module Spree
2
+ class CustomerReturn < Spree::Base
3
+ include Spree::Core::NumberGenerator.new(prefix: 'CR', length: 9)
4
+ belongs_to :stock_location
5
+
6
+ has_many :reimbursements, inverse_of: :customer_return
7
+ has_many :return_authorizations, through: :return_items
8
+ has_many :return_items, inverse_of: :customer_return
9
+
10
+ after_create :process_return!
11
+
12
+ validates :return_items, :stock_location, presence: true
13
+ validate :must_have_return_authorization, on: :create
14
+ validate :return_items_belong_to_same_order
15
+
16
+ accepts_nested_attributes_for :return_items
17
+
18
+ extend DisplayMoney
19
+ money_methods pre_tax_total: { currency: Spree::Config[:currency] }
20
+
21
+ self.whitelisted_ransackable_attributes = ['number']
22
+
23
+ delegate :id, to: :order, prefix: true, allow_nil: true
24
+
25
+ def completely_decided?
26
+ !return_items.undecided.exists?
27
+ end
28
+
29
+ def fully_reimbursed?
30
+ completely_decided? && return_items.accepted.includes(:reimbursement).all? { |return_item| return_item.reimbursement.try(:reimbursed?) }
31
+ end
32
+
33
+ # Temporarily tie a customer_return to one order
34
+ def order
35
+ return nil if return_items.blank?
36
+ return_items.first.inventory_unit.order
37
+ end
38
+
39
+
40
+ def pre_tax_total
41
+ return_items.sum(:pre_tax_amount)
42
+ end
43
+
44
+ private
45
+
46
+ def inventory_units
47
+ return_items.flat_map(&:inventory_unit)
48
+ end
49
+
50
+ def must_have_return_authorization
51
+ if item = return_items.find { |ri| ri.return_authorization.blank? }
52
+ errors.add(:base, Spree.t(:missing_return_authorization, item_name: item.inventory_unit.variant.name))
53
+ end
54
+ end
55
+
56
+ def process_return!
57
+ return_items.each(&:receive!)
58
+ order.return! if order.all_inventory_units_returned?
59
+ end
60
+
61
+ def return_items_belong_to_same_order
62
+ if return_items.any? { |return_item| return_item.inventory_unit.order_id != order_id }
63
+ errors.add(:base, Spree.t(:return_items_cannot_be_associated_with_multiple_orders))
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,46 @@
1
+ module Spree
2
+ class Exchange
3
+ class UnableToCreateShipments < StandardError; end
4
+
5
+ def initialize(order, reimbursement_objects)
6
+ @order = order
7
+ @reimbursement_objects = reimbursement_objects
8
+ end
9
+
10
+ def description
11
+ @reimbursement_objects.map do |reimbursement_object|
12
+ "#{reimbursement_object.variant.options_text} => #{reimbursement_object.exchange_variant.options_text}"
13
+ end.join(" | ")
14
+ end
15
+
16
+ def display_amount
17
+ Spree::Money.new @reimbursement_objects.map(&:total).sum
18
+ end
19
+
20
+ def perform!
21
+ shipments = Spree::Stock::Coordinator.new(@order, @reimbursement_objects.map(&:build_exchange_inventory_unit)).shipments
22
+ if shipments.flat_map(&:inventory_units).size != @reimbursement_objects.size
23
+ raise UnableToCreateShipments.new("Could not generate shipments for all items. Out of stock?")
24
+ end
25
+ @order.shipments += shipments
26
+ @order.save!
27
+ shipments.each do |shipment|
28
+ shipment.update!(@order)
29
+ shipment.finalize!
30
+ end
31
+ end
32
+
33
+ def to_key
34
+ nil
35
+ end
36
+
37
+ def self.param_key
38
+ "spree_exchange"
39
+ end
40
+
41
+ def self.model_name
42
+ Spree::Exchange
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,91 @@
1
+ module Spree
2
+ class Gateway::Bogus < Gateway
3
+ TEST_VISA = ['4111111111111111','4012888888881881','4222222222222']
4
+ TEST_MC = ['5500000000000004','5555555555554444','5105105105105100','2223000010309703']
5
+ TEST_AMEX = ['378282246310005','371449635398431','378734493671000','340000000000009']
6
+ TEST_DISC = ['6011000000000004','6011111111111117','6011000990139424']
7
+
8
+ VALID_CCS = ['1', TEST_VISA, TEST_MC, TEST_AMEX, TEST_DISC].flatten
9
+
10
+ attr_accessor :test
11
+
12
+ def provider_class
13
+ self.class
14
+ end
15
+
16
+ def preferences
17
+ {}
18
+ end
19
+
20
+ def create_profile(payment)
21
+ return if payment.source.has_payment_profile?
22
+ # simulate the storage of credit card profile using remote service
23
+ if success = VALID_CCS.include?(payment.source.number)
24
+ payment.source.update_attributes(:gateway_customer_profile_id => generate_profile_id(success))
25
+ end
26
+ end
27
+
28
+ def authorize(money, credit_card, options = {})
29
+ profile_id = credit_card.gateway_customer_profile_id
30
+ if VALID_CCS.include? credit_card.number or (profile_id and profile_id.starts_with? 'BGS-')
31
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'D' })
32
+ else
33
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { :message => 'Bogus Gateway: Forced failure' }, :test => true)
34
+ end
35
+ end
36
+
37
+ def purchase(money, credit_card, options = {})
38
+ profile_id = credit_card.gateway_customer_profile_id
39
+ if VALID_CCS.include? credit_card.number or (profile_id and profile_id.starts_with? 'BGS-')
40
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'M' })
41
+ else
42
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', :message => 'Bogus Gateway: Forced failure', :test => true)
43
+ end
44
+ end
45
+
46
+ def credit(money, credit_card, response_code, options = {})
47
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345')
48
+ end
49
+
50
+ def capture(money, authorization, gateway_options)
51
+ if authorization == '12345'
52
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true)
53
+ else
54
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', :error => 'Bogus Gateway: Forced failure', :test => true)
55
+ end
56
+
57
+ end
58
+
59
+ def void(response_code, credit_card, options = {})
60
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345')
61
+ end
62
+
63
+ def cancel(_response_code)
64
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
65
+ end
66
+
67
+ def test?
68
+ # Test mode is not really relevant with bogus gateway (no such thing as live server)
69
+ true
70
+ end
71
+
72
+ def payment_profiles_supported?
73
+ true
74
+ end
75
+
76
+ def actions
77
+ %w(capture void credit)
78
+ end
79
+
80
+ private
81
+ def generate_profile_id(success)
82
+ record = true
83
+ prefix = success ? 'BGS' : 'FAIL'
84
+ while record
85
+ random = "#{prefix}-#{Array.new(6){rand(6)}.join}"
86
+ record = CreditCard.where(:gateway_customer_profile_id => random).first
87
+ end
88
+ random
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,26 @@
1
+ # Bogus Gateway that doesn't support payment profiles
2
+ module Spree
3
+ class Gateway::BogusSimple < Gateway::Bogus
4
+
5
+ def payment_profiles_supported?
6
+ false
7
+ end
8
+
9
+ def authorize(money, credit_card, options = {})
10
+ if VALID_CCS.include? credit_card.number
11
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'A' })
12
+ else
13
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { :message => 'Bogus Gateway: Forced failure' }, :test => true)
14
+ end
15
+ end
16
+
17
+ def purchase(money, credit_card, options = {})
18
+ if VALID_CCS.include? credit_card.number
19
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'A' })
20
+ else
21
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', :message => 'Bogus Gateway: Forced failure', :test => true)
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,80 @@
1
+ module Spree
2
+ class Gateway < PaymentMethod
3
+ FROM_DOLLAR_TO_CENT_RATE = 100.0
4
+
5
+ delegate :authorize, :purchase, :capture, :void, :credit, to: :provider
6
+
7
+ validates :type, presence: true
8
+
9
+ preference :server, :string, default: 'test'
10
+ preference :test_mode, :boolean, default: true
11
+
12
+ def payment_source_class
13
+ CreditCard
14
+ end
15
+
16
+ def provider
17
+ gateway_options = options
18
+ gateway_options.delete :login if gateway_options.has_key?(:login) and gateway_options[:login].nil?
19
+ if gateway_options[:server]
20
+ ActiveMerchant::Billing::Base.gateway_mode = gateway_options[:server].to_sym
21
+ end
22
+ @provider ||= provider_class.new(gateway_options)
23
+ end
24
+
25
+ def options
26
+ self.preferences.inject({}){ |memo, (key, value)| memo[key.to_sym] = value; memo }
27
+ end
28
+
29
+ def method_missing(method, *args)
30
+ if @provider.nil? || !@provider.respond_to?(method)
31
+ super
32
+ else
33
+ provider.send(method, *args)
34
+ end
35
+ end
36
+
37
+ def payment_profiles_supported?
38
+ false
39
+ end
40
+
41
+ def method_type
42
+ 'gateway'
43
+ end
44
+
45
+ def exchange_multiplier
46
+ FROM_DOLLAR_TO_CENT_RATE
47
+ end
48
+
49
+ def supports?(source)
50
+ return true unless provider_class.respond_to? :supports?
51
+ return false unless source.brand
52
+ provider_class.supports?(source.brand)
53
+ end
54
+
55
+ def disable_customer_profile(source)
56
+ if source.is_a? CreditCard
57
+ source.update_column :gateway_customer_profile_id, nil
58
+ else
59
+ raise 'You must implement disable_customer_profile method for this gateway.'
60
+ end
61
+ end
62
+
63
+ def sources_by_order(order)
64
+ source_ids = order.payments.where(source_type: payment_source_class.to_s, payment_method_id: self.id).pluck(:source_id).uniq
65
+ payment_source_class.where(id: source_ids).with_payment_profile
66
+ end
67
+
68
+ def reusable_sources(order)
69
+ if order.completed?
70
+ sources_by_order order
71
+ else
72
+ if order.user_id
73
+ self.credit_cards.where(user_id: order.user_id).with_payment_profile
74
+ else
75
+ []
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,43 @@
1
+ module Spree
2
+ class Image < Asset
3
+ validate :no_attachment_errors
4
+
5
+ has_attached_file :attachment,
6
+ styles: { mini: '48x48>', small: '100x100>', product: '240x240>', large: '600x600>' },
7
+ default_style: :product,
8
+ url: '/spree/products/:id/:style/:basename.:extension',
9
+ path: ':rails_root/public/spree/products/:id/:style/:basename.:extension',
10
+ convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
11
+ validates_attachment :attachment,
12
+ :presence => true,
13
+ :content_type => { :content_type => %w(image/jpeg image/jpg image/png image/gif) }
14
+
15
+ # save the w,h of the original image (from which others can be calculated)
16
+ # we need to look at the write-queue for images which have not been saved yet
17
+ before_save :find_dimensions, if: :attachment_updated_at_changed?
18
+
19
+ #used by admin products autocomplete
20
+ def mini_url
21
+ attachment.url(:mini, false)
22
+ end
23
+
24
+ def find_dimensions
25
+ temporary = attachment.queued_for_write[:original]
26
+ filename = temporary.path unless temporary.nil?
27
+ filename = attachment.path if filename.blank?
28
+ geometry = Paperclip::Geometry.from_file(filename)
29
+ self.attachment_width = geometry.width
30
+ self.attachment_height = geometry.height
31
+ end
32
+
33
+ # if there are errors from the plugin, then add a more meaningful message
34
+ def no_attachment_errors
35
+ unless attachment.errors.empty?
36
+ # uncomment this to get rid of the less-than-useful interim messages
37
+ # errors.clear
38
+ errors.add :attachment, "Paperclip returned errors for file '#{attachment_file_name}' - check ImageMagick installation or image source file."
39
+ false
40
+ end
41
+ end
42
+ end
43
+ end