solidus_core_devise_token_auth 2.8.0.alpha.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/LICENSE +26 -0
- data/README.md +69 -0
- data/Rakefile +37 -0
- data/app/assets/config/solidus_core_manifest.js +1 -0
- data/app/assets/images/logo/solidus_logo.png +0 -0
- data/app/assets/images/noimage/large.png +0 -0
- data/app/assets/images/noimage/mini.png +0 -0
- data/app/assets/images/noimage/product.png +0 -0
- data/app/assets/images/noimage/small.png +0 -0
- data/app/assets/javascripts/spree.js.erb +72 -0
- data/app/controllers/spree/base_controller.rb +15 -0
- data/app/helpers/spree/base_helper.rb +160 -0
- data/app/helpers/spree/checkout_helper.rb +33 -0
- data/app/helpers/spree/products_helper.rb +74 -0
- data/app/helpers/spree/store_helper.rb +23 -0
- data/app/helpers/spree/taxons_helper.rb +22 -0
- data/app/jobs/spree/promotion_code_batch_job.rb +26 -0
- data/app/mailers/spree/base_mailer.rb +18 -0
- data/app/mailers/spree/carton_mailer.rb +29 -0
- data/app/mailers/spree/order_mailer.rb +36 -0
- data/app/mailers/spree/promotion_code_batch_mailer.rb +15 -0
- data/app/mailers/spree/reimbursement_mailer.rb +13 -0
- data/app/mailers/spree/test_mailer.rb +11 -0
- data/app/models/concerns/spree/adjustment_source.rb +27 -0
- data/app/models/concerns/spree/calculated_adjustments.rb +40 -0
- data/app/models/concerns/spree/default_price.rb +27 -0
- data/app/models/concerns/spree/display_money.rb +34 -0
- data/app/models/concerns/spree/named_type.rb +14 -0
- data/app/models/concerns/spree/ordered_property_value_list.rb +28 -0
- data/app/models/concerns/spree/ransackable_attributes.rb +22 -0
- data/app/models/concerns/spree/user_address_book.rb +149 -0
- data/app/models/concerns/spree/user_methods.rb +77 -0
- data/app/models/concerns/spree/user_payment_source.rb +26 -0
- data/app/models/concerns/spree/user_reporting.rb +24 -0
- data/app/models/spree/ability.rb +64 -0
- data/app/models/spree/address.rb +222 -0
- data/app/models/spree/adjustment.rb +168 -0
- data/app/models/spree/adjustment_reason.rb +12 -0
- data/app/models/spree/asset.rb +8 -0
- data/app/models/spree/base.rb +46 -0
- data/app/models/spree/billing_integration.rb +23 -0
- data/app/models/spree/calculator/default_tax.rb +60 -0
- data/app/models/spree/calculator/distributed_amount.rb +33 -0
- data/app/models/spree/calculator/flat_percent_item_total.rb +20 -0
- data/app/models/spree/calculator/flat_rate.rb +18 -0
- data/app/models/spree/calculator/flexi_rate.rb +27 -0
- data/app/models/spree/calculator/free_shipping.rb +21 -0
- data/app/models/spree/calculator/percent_on_line_item.rb +13 -0
- data/app/models/spree/calculator/percent_per_item.rb +49 -0
- data/app/models/spree/calculator/price_sack.rb +27 -0
- data/app/models/spree/calculator/returns/default_refund_amount.rb +34 -0
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +21 -0
- data/app/models/spree/calculator/shipping/flat_rate.rb +17 -0
- data/app/models/spree/calculator/shipping/flexi_rate.rb +34 -0
- data/app/models/spree/calculator/shipping/per_item.rb +21 -0
- data/app/models/spree/calculator/shipping/price_sack.rb +27 -0
- data/app/models/spree/calculator/tiered_flat_rate.rb +52 -0
- data/app/models/spree/calculator/tiered_percent.rb +61 -0
- data/app/models/spree/calculator.rb +49 -0
- data/app/models/spree/carton.rb +59 -0
- data/app/models/spree/classification.rb +13 -0
- data/app/models/spree/country.rb +28 -0
- data/app/models/spree/credit_card.rb +197 -0
- data/app/models/spree/customer_return.rb +78 -0
- data/app/models/spree/distributed_amounts_handler.rb +43 -0
- data/app/models/spree/exchange.rb +45 -0
- data/app/models/spree/fulfilment_changer.rb +135 -0
- data/app/models/spree/gallery/product_gallery.rb +18 -0
- data/app/models/spree/gallery/variant_gallery.rb +18 -0
- data/app/models/spree/gateway/bogus.rb +13 -0
- data/app/models/spree/gateway/bogus_simple.rb +13 -0
- data/app/models/spree/gateway.rb +14 -0
- data/app/models/spree/image.rb +56 -0
- data/app/models/spree/inventory_unit.rb +159 -0
- data/app/models/spree/legacy_user.rb +26 -0
- data/app/models/spree/line_item.rb +206 -0
- data/app/models/spree/line_item_action.rb +8 -0
- data/app/models/spree/log_entry.rb +11 -0
- data/app/models/spree/option_type.rb +32 -0
- data/app/models/spree/option_value.rb +33 -0
- data/app/models/spree/option_values_variant.rb +8 -0
- data/app/models/spree/order/checkout.rb +243 -0
- data/app/models/spree/order/number_generator.rb +45 -0
- data/app/models/spree/order/payments.rb +55 -0
- data/app/models/spree/order.rb +914 -0
- data/app/models/spree/order_cancellations.rb +125 -0
- data/app/models/spree/order_capturing.rb +50 -0
- data/app/models/spree/order_contents.rb +126 -0
- data/app/models/spree/order_inventory.rb +115 -0
- data/app/models/spree/order_merger.rb +143 -0
- data/app/models/spree/order_mutex.rb +35 -0
- data/app/models/spree/order_promotion.rb +27 -0
- data/app/models/spree/order_shipping.rb +89 -0
- data/app/models/spree/order_taxation.rb +81 -0
- data/app/models/spree/order_update_attributes.rb +41 -0
- data/app/models/spree/order_updater.rb +271 -0
- data/app/models/spree/payment/cancellation.rb +62 -0
- data/app/models/spree/payment/processing.rb +225 -0
- data/app/models/spree/payment.rb +284 -0
- data/app/models/spree/payment_capture_event.rb +11 -0
- data/app/models/spree/payment_create.rb +93 -0
- data/app/models/spree/payment_method/bogus_credit_card.rb +90 -0
- data/app/models/spree/payment_method/check.rb +40 -0
- data/app/models/spree/payment_method/credit_card.rb +43 -0
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +26 -0
- data/app/models/spree/payment_method/store_credit.rb +122 -0
- data/app/models/spree/payment_method.rb +281 -0
- data/app/models/spree/payment_source.rb +47 -0
- data/app/models/spree/preference.rb +7 -0
- data/app/models/spree/price.rb +89 -0
- data/app/models/spree/product/scopes.rb +259 -0
- data/app/models/spree/product.rb +400 -0
- data/app/models/spree/product_option_type.rb +9 -0
- data/app/models/spree/product_promotion_rule.rb +8 -0
- data/app/models/spree/product_property.rb +14 -0
- data/app/models/spree/promotion/actions/create_adjustment.rb +80 -0
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +102 -0
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +142 -0
- data/app/models/spree/promotion/actions/free_shipping.rb +57 -0
- data/app/models/spree/promotion/rules/first_order.rb +40 -0
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +36 -0
- data/app/models/spree/promotion/rules/item_total.rb +45 -0
- data/app/models/spree/promotion/rules/nth_order.rb +45 -0
- data/app/models/spree/promotion/rules/one_use_per_user.rb +25 -0
- data/app/models/spree/promotion/rules/option_value.rb +50 -0
- data/app/models/spree/promotion/rules/product.rb +74 -0
- data/app/models/spree/promotion/rules/store.rb +22 -0
- data/app/models/spree/promotion/rules/taxon.rb +103 -0
- data/app/models/spree/promotion/rules/user.rb +30 -0
- data/app/models/spree/promotion/rules/user_logged_in.rb +20 -0
- data/app/models/spree/promotion/rules/user_role.rb +45 -0
- data/app/models/spree/promotion.rb +260 -0
- data/app/models/spree/promotion_action.rb +53 -0
- data/app/models/spree/promotion_category.rb +8 -0
- data/app/models/spree/promotion_chooser.rb +34 -0
- data/app/models/spree/promotion_code/batch_builder.rb +78 -0
- data/app/models/spree/promotion_code.rb +44 -0
- data/app/models/spree/promotion_code_batch.rb +27 -0
- data/app/models/spree/promotion_handler/cart.rb +55 -0
- data/app/models/spree/promotion_handler/coupon.rb +92 -0
- data/app/models/spree/promotion_handler/free_shipping.rb +9 -0
- data/app/models/spree/promotion_handler/page.rb +26 -0
- data/app/models/spree/promotion_handler/shipping.rb +61 -0
- data/app/models/spree/promotion_rule.rb +51 -0
- data/app/models/spree/promotion_rule_role.rb +8 -0
- data/app/models/spree/promotion_rule_store.rb +10 -0
- data/app/models/spree/promotion_rule_taxon.rb +8 -0
- data/app/models/spree/promotion_rule_user.rb +10 -0
- data/app/models/spree/property.rb +20 -0
- data/app/models/spree/refund.rb +90 -0
- data/app/models/spree/refund_reason.rb +15 -0
- data/app/models/spree/reimbursement/credit.rb +29 -0
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +56 -0
- data/app/models/spree/reimbursement/reimbursement_type_validator.rb +17 -0
- data/app/models/spree/reimbursement.rb +186 -0
- data/app/models/spree/reimbursement_performer.rb +40 -0
- data/app/models/spree/reimbursement_tax_calculator.rb +35 -0
- data/app/models/spree/reimbursement_type/credit.rb +15 -0
- data/app/models/spree/reimbursement_type/exchange.rb +11 -0
- data/app/models/spree/reimbursement_type/original_payment.rb +15 -0
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +72 -0
- data/app/models/spree/reimbursement_type/store_credit.rb +29 -0
- data/app/models/spree/reimbursement_type.rb +18 -0
- data/app/models/spree/return_authorization.rb +90 -0
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +30 -0
- data/app/models/spree/return_item/eligibility_validator/default.rb +36 -0
- data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +22 -0
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +22 -0
- data/app/models/spree/return_item/eligibility_validator/order_completed.rb +22 -0
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +22 -0
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +22 -0
- data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +47 -0
- data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +13 -0
- data/app/models/spree/return_item.rb +320 -0
- data/app/models/spree/return_reason.rb +14 -0
- data/app/models/spree/returns_calculator.rb +9 -0
- data/app/models/spree/role.rb +14 -0
- data/app/models/spree/role_user.rb +11 -0
- data/app/models/spree/shipment.rb +431 -0
- data/app/models/spree/shipping_calculator.rb +23 -0
- data/app/models/spree/shipping_category.rb +10 -0
- data/app/models/spree/shipping_manifest.rb +30 -0
- data/app/models/spree/shipping_method.rb +133 -0
- data/app/models/spree/shipping_method_category.rb +8 -0
- data/app/models/spree/shipping_method_stock_location.rb +6 -0
- data/app/models/spree/shipping_method_zone.rb +8 -0
- data/app/models/spree/shipping_rate.rb +48 -0
- data/app/models/spree/shipping_rate_tax.rb +39 -0
- data/app/models/spree/state.rb +40 -0
- data/app/models/spree/state_change.rb +17 -0
- data/app/models/spree/stock/availability.rb +72 -0
- data/app/models/spree/stock/availability_validator.rb +36 -0
- data/app/models/spree/stock/content_item.rb +50 -0
- data/app/models/spree/stock/differentiator.rb +47 -0
- data/app/models/spree/stock/estimator.rb +71 -0
- data/app/models/spree/stock/inventory_unit_builder.rb +23 -0
- data/app/models/spree/stock/inventory_validator.rb +16 -0
- data/app/models/spree/stock/location_sorter/base.rb +38 -0
- data/app/models/spree/stock/location_sorter/default_first.rb +15 -0
- data/app/models/spree/stock/location_sorter/unsorted.rb +14 -0
- data/app/models/spree/stock/package.rb +142 -0
- data/app/models/spree/stock/quantifier.rb +49 -0
- data/app/models/spree/stock/shipping_rate_selector.rb +17 -0
- data/app/models/spree/stock/shipping_rate_sorter.rb +17 -0
- data/app/models/spree/stock/simple_coordinator.rb +119 -0
- data/app/models/spree/stock/splitter/backordered.rb +23 -0
- data/app/models/spree/stock/splitter/base.rb +35 -0
- data/app/models/spree/stock/splitter/shipping_category.rb +35 -0
- data/app/models/spree/stock/splitter/weight.rb +32 -0
- data/app/models/spree/stock/splitter_chain.rb +34 -0
- data/app/models/spree/stock_item.rb +128 -0
- data/app/models/spree/stock_location.rb +127 -0
- data/app/models/spree/stock_movement.rb +28 -0
- data/app/models/spree/stock_quantities.rb +83 -0
- data/app/models/spree/store.rb +83 -0
- data/app/models/spree/store_credit.rb +293 -0
- data/app/models/spree/store_credit_category.rb +18 -0
- data/app/models/spree/store_credit_event.rb +66 -0
- data/app/models/spree/store_credit_type.rb +10 -0
- data/app/models/spree/store_credit_update_reason.rb +4 -0
- data/app/models/spree/store_payment_method.rb +8 -0
- data/app/models/spree/store_selector/by_server_name.rb +32 -0
- data/app/models/spree/store_selector/legacy.rb +50 -0
- data/app/models/spree/store_shipping_method.rb +8 -0
- data/app/models/spree/tax/item_tax.rb +22 -0
- data/app/models/spree/tax/order_adjuster.rb +22 -0
- data/app/models/spree/tax/order_tax.rb +20 -0
- data/app/models/spree/tax/shipping_rate_taxer.rb +24 -0
- data/app/models/spree/tax/tax_helpers.rb +17 -0
- data/app/models/spree/tax/tax_location.rb +39 -0
- data/app/models/spree/tax_calculator/default.rb +85 -0
- data/app/models/spree/tax_calculator/shipping_rate.rb +58 -0
- data/app/models/spree/tax_category.rb +30 -0
- data/app/models/spree/tax_rate.rb +147 -0
- data/app/models/spree/tax_rate_tax_category.rb +8 -0
- data/app/models/spree/taxon.rb +144 -0
- data/app/models/spree/taxonomy.rb +29 -0
- data/app/models/spree/unit_cancel.rb +36 -0
- data/app/models/spree/user_address.rb +23 -0
- data/app/models/spree/user_class_handle.rb +28 -0
- data/app/models/spree/user_stock_location.rb +8 -0
- data/app/models/spree/validations/db_maximum_length_validator.rb +23 -0
- data/app/models/spree/variant/price_selector.rb +37 -0
- data/app/models/spree/variant/pricing_options.rb +98 -0
- data/app/models/spree/variant/scopes.rb +42 -0
- data/app/models/spree/variant/vat_price_generator.rb +63 -0
- data/app/models/spree/variant.rb +465 -0
- data/app/models/spree/variant_property_rule.rb +44 -0
- data/app/models/spree/variant_property_rule_condition.rb +10 -0
- data/app/models/spree/variant_property_rule_value.rb +12 -0
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +40 -0
- data/app/models/spree/wallet/default_payment_builder.rb +28 -0
- data/app/models/spree/wallet.rb +78 -0
- data/app/models/spree/wallet_payment_source.rb +19 -0
- data/app/models/spree/zone.rb +148 -0
- data/app/models/spree/zone_member.rb +10 -0
- data/app/views/layouts/spree/base_mailer.html.erb +784 -0
- data/app/views/spree/carton_mailer/shipped_email.html.erb +34 -0
- data/app/views/spree/carton_mailer/shipped_email.text.erb +16 -0
- data/app/views/spree/order_mailer/cancel_email.html.erb +45 -0
- data/app/views/spree/order_mailer/cancel_email.text.erb +16 -0
- data/app/views/spree/order_mailer/confirm_email.html.erb +84 -0
- data/app/views/spree/order_mailer/confirm_email.text.erb +38 -0
- data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +26 -0
- data/app/views/spree/order_mailer/inventory_cancellation_email.text.erb +10 -0
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +39 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +17 -0
- data/app/views/spree/shared/_base_mailer_footer.html.erb +1 -0
- data/app/views/spree/shared/_base_mailer_header.html.erb +1 -0
- data/app/views/spree/shared/_error_messages.html.erb +11 -0
- data/app/views/spree/test_mailer/test_email.html.erb +40 -0
- data/app/views/spree/test_mailer/test_email.text.erb +4 -0
- data/config/initializers/assets.rb +5 -0
- data/config/initializers/friendly_id.rb +90 -0
- data/config/locales/en.yml +2107 -0
- data/db/default/spree/countries.rb +45 -0
- data/db/default/spree/refund_reasons.rb +3 -0
- data/db/default/spree/return_reasons.rb +11 -0
- data/db/default/spree/roles.rb +3 -0
- data/db/default/spree/shipping_categories.rb +3 -0
- data/db/default/spree/states.rb +14 -0
- data/db/default/spree/stock_locations.rb +4 -0
- data/db/default/spree/store_credit.rb +22 -0
- data/db/default/spree/stores.rb +10 -0
- data/db/default/spree/zones.rb +13 -0
- data/db/migrate/20160101010000_solidus_one_four.rb +1102 -0
- data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +27 -0
- data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +29 -0
- data/db/migrate/20160924135758_remove_is_default_from_prices.rb +7 -0
- data/db/migrate/20161009141333_remove_currency_from_line_items.rb +7 -0
- data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +30 -0
- data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +38 -0
- data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +22 -0
- data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +7 -0
- data/db/migrate/20170223235001_remove_spree_store_credits_column.rb +7 -0
- data/db/migrate/20170317035819_add_lft_and_rgt_indexes_to_taxons.rb +8 -0
- data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +30 -0
- data/db/migrate/20170412103617_transform_tax_rate_category_relation.rb +50 -0
- data/db/migrate/20170422134804_add_roles_unique_constraints.rb +8 -0
- data/db/migrate/20170522143442_add_time_range_to_tax_rate.rb +8 -0
- data/db/migrate/20170608074534_rename_bogus_gateways.rb +17 -0
- data/db/migrate/20170831201542_remove_default_tax_from_spree_zones.rb +7 -0
- data/db/migrate/20180202190713_create_promotion_rule_stores.rb +12 -0
- data/db/migrate/20180202222641_create_store_shipping_methods.rb +12 -0
- data/db/migrate/20180313220213_add_available_locales_to_stores.rb +9 -0
- data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +61 -0
- data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +11 -0
- data/db/seeds.rb +17 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +43 -0
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +40 -0
- data/lib/generators/spree/custom_user/templates/migration.rb.tt +30 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +148 -0
- data/lib/generators/spree/dummy/templates/rails/application.rb.tt +10 -0
- data/lib/generators/spree/dummy/templates/rails/boot.rb +6 -0
- data/lib/generators/spree/dummy/templates/rails/database.yml +71 -0
- data/lib/generators/spree/dummy/templates/rails/routes.rb +2 -0
- data/lib/generators/spree/dummy/templates/rails/script/rails +6 -0
- data/lib/generators/spree/dummy/templates/rails/test.rb +33 -0
- data/lib/generators/spree/install/install_generator.rb +189 -0
- data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +67 -0
- data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +10 -0
- data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +10 -0
- data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +9 -0
- data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +9 -0
- data/lib/solidus/migrations/rename_gateways.rb +39 -0
- data/lib/solidus_core.rb +3 -0
- data/lib/spree/app_configuration.rb +529 -0
- data/lib/spree/config.rb +5 -0
- data/lib/spree/core/active_merchant_dependencies.rb +13 -0
- data/lib/spree/core/class_constantizer.rb +33 -0
- data/lib/spree/core/controller_helpers/auth.rb +83 -0
- data/lib/spree/core/controller_helpers/common.rb +82 -0
- data/lib/spree/core/controller_helpers/order.rb +107 -0
- data/lib/spree/core/controller_helpers/payment_parameters.rb +221 -0
- data/lib/spree/core/controller_helpers/pricing.rb +30 -0
- data/lib/spree/core/controller_helpers/search.rb +16 -0
- data/lib/spree/core/controller_helpers/store.rb +19 -0
- data/lib/spree/core/controller_helpers/strong_parameters.rb +63 -0
- data/lib/spree/core/current_store.rb +24 -0
- data/lib/spree/core/engine.rb +61 -0
- data/lib/spree/core/environment/calculators.rb +18 -0
- data/lib/spree/core/environment.rb +22 -0
- data/lib/spree/core/environment_extension.rb +31 -0
- data/lib/spree/core/importer/order.rb +203 -0
- data/lib/spree/core/importer/product.rb +65 -0
- data/lib/spree/core/importer.rb +11 -0
- data/lib/spree/core/permalinks.rb +67 -0
- data/lib/spree/core/product_duplicator.rb +75 -0
- data/lib/spree/core/product_filters.rb +197 -0
- data/lib/spree/core/role_configuration.rb +88 -0
- data/lib/spree/core/search/base.rb +120 -0
- data/lib/spree/core/search/variant.rb +66 -0
- data/lib/spree/core/stock_configuration.rb +26 -0
- data/lib/spree/core/validators/email.rb +30 -0
- data/lib/spree/core/version.rb +11 -0
- data/lib/spree/core.rb +92 -0
- data/lib/spree/deprecation.rb +7 -0
- data/lib/spree/i18n.rb +35 -0
- data/lib/spree/localized_number.rb +30 -0
- data/lib/spree/mailer_previews/carton_preview.rb +13 -0
- data/lib/spree/mailer_previews/order_preview.rb +25 -0
- data/lib/spree/mailer_previews/reimbursement_preview.rb +13 -0
- data/lib/spree/migration_helpers.rb +21 -0
- data/lib/spree/migrations.rb +85 -0
- data/lib/spree/money.rb +133 -0
- data/lib/spree/paranoia_deprecations.rb +21 -0
- data/lib/spree/permission_sets/base.rb +32 -0
- data/lib/spree/permission_sets/configuration_display.rb +25 -0
- data/lib/spree/permission_sets/configuration_management.rb +25 -0
- data/lib/spree/permission_sets/dashboard_display.rb +11 -0
- data/lib/spree/permission_sets/default_customer.rb +37 -0
- data/lib/spree/permission_sets/order_display.rb +21 -0
- data/lib/spree/permission_sets/order_management.rb +22 -0
- data/lib/spree/permission_sets/product_display.rb +19 -0
- data/lib/spree/permission_sets/product_management.rb +21 -0
- data/lib/spree/permission_sets/promotion_display.rb +15 -0
- data/lib/spree/permission_sets/promotion_management.rb +14 -0
- data/lib/spree/permission_sets/restricted_stock_display.rb +18 -0
- data/lib/spree/permission_sets/restricted_stock_management.rb +18 -0
- data/lib/spree/permission_sets/stock_display.rb +12 -0
- data/lib/spree/permission_sets/stock_management.rb +12 -0
- data/lib/spree/permission_sets/super_user.rb +11 -0
- data/lib/spree/permission_sets/user_display.rb +13 -0
- data/lib/spree/permission_sets/user_management.rb +21 -0
- data/lib/spree/permission_sets.rb +20 -0
- data/lib/spree/permitted_attributes.rb +133 -0
- data/lib/spree/preferences/configuration.rb +107 -0
- data/lib/spree/preferences/preferable.rb +180 -0
- data/lib/spree/preferences/preferable_class_methods.rb +88 -0
- data/lib/spree/preferences/scoped_store.rb +36 -0
- data/lib/spree/preferences/static_model_preferences.rb +49 -0
- data/lib/spree/preferences/statically_configurable.rb +39 -0
- data/lib/spree/preferences/store.rb +91 -0
- data/lib/spree/promo/environment.rb +13 -0
- data/lib/spree/testing_support/ability_helpers.rb +107 -0
- data/lib/spree/testing_support/authorization_helpers.rb +69 -0
- data/lib/spree/testing_support/bar_ability.rb +19 -0
- data/lib/spree/testing_support/caching.rb +33 -0
- data/lib/spree/testing_support/capybara_ext.rb +147 -0
- data/lib/spree/testing_support/common_rake.rb +38 -0
- data/lib/spree/testing_support/controller_requests.rb +108 -0
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +10 -0
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +10 -0
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/backend/all.css +9 -0
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +9 -0
- data/lib/spree/testing_support/dummy_app/database.yml +33 -0
- data/lib/spree/testing_support/dummy_app/migrations.rb +47 -0
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +67 -0
- data/lib/spree/testing_support/dummy_app/routes.rb +5 -0
- data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +1 -0
- data/lib/spree/testing_support/dummy_app.rb +120 -0
- data/lib/spree/testing_support/extension_rake.rb +11 -0
- data/lib/spree/testing_support/factories/address_factory.rb +45 -0
- data/lib/spree/testing_support/factories/adjustment_factory.rb +45 -0
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +8 -0
- data/lib/spree/testing_support/factories/calculator_factory.rb +26 -0
- data/lib/spree/testing_support/factories/carton_factory.rb +26 -0
- data/lib/spree/testing_support/factories/country_factory.rb +21 -0
- data/lib/spree/testing_support/factories/credit_card_factory.rb +17 -0
- data/lib/spree/testing_support/factories/customer_return_factory.rb +35 -0
- data/lib/spree/testing_support/factories/image_factory.rb +7 -0
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +26 -0
- data/lib/spree/testing_support/factories/line_item_factory.rb +18 -0
- data/lib/spree/testing_support/factories/option_type_factory.rb +8 -0
- data/lib/spree/testing_support/factories/option_value_factory.rb +10 -0
- data/lib/spree/testing_support/factories/order_factory.rb +160 -0
- data/lib/spree/testing_support/factories/order_promotion_factory.rb +11 -0
- data/lib/spree/testing_support/factories/payment_factory.rb +51 -0
- data/lib/spree/testing_support/factories/payment_method_factory.rb +32 -0
- data/lib/spree/testing_support/factories/price_factory.rb +11 -0
- data/lib/spree/testing_support/factories/product_factory.rb +50 -0
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +11 -0
- data/lib/spree/testing_support/factories/product_property_factory.rb +11 -0
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +7 -0
- data/lib/spree/testing_support/factories/promotion_code_factory.rb +11 -0
- data/lib/spree/testing_support/factories/promotion_factory.rb +64 -0
- data/lib/spree/testing_support/factories/property_factory.rb +8 -0
- data/lib/spree/testing_support/factories/refund_factory.rb +21 -0
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +7 -0
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +21 -0
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +9 -0
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +20 -0
- data/lib/spree/testing_support/factories/return_item_factory.rb +23 -0
- data/lib/spree/testing_support/factories/return_reason_factory.rb +7 -0
- data/lib/spree/testing_support/factories/role_factory.rb +11 -0
- data/lib/spree/testing_support/factories/shipment_factory.rb +37 -0
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +7 -0
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +42 -0
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +11 -0
- data/lib/spree/testing_support/factories/state_factory.rb +28 -0
- data/lib/spree/testing_support/factories/stock_item_factory.rb +14 -0
- data/lib/spree/testing_support/factories/stock_location_factory.rb +41 -0
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +15 -0
- data/lib/spree/testing_support/factories/stock_package_factory.rb +28 -0
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +7 -0
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +30 -0
- data/lib/spree/testing_support/factories/store_credit_factory.rb +16 -0
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +13 -0
- data/lib/spree/testing_support/factories/store_credit_update_reason_factory.rb +7 -0
- data/lib/spree/testing_support/factories/store_factory.rb +10 -0
- data/lib/spree/testing_support/factories/tax_category_factory.rb +10 -0
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +14 -0
- data/lib/spree/testing_support/factories/taxon_factory.rb +11 -0
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +7 -0
- data/lib/spree/testing_support/factories/user_factory.rb +21 -0
- data/lib/spree/testing_support/factories/variant_factory.rb +43 -0
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +11 -0
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +22 -0
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +11 -0
- data/lib/spree/testing_support/factories/zone_factory.rb +24 -0
- data/lib/spree/testing_support/factories.rb +7 -0
- data/lib/spree/testing_support/flash.rb +29 -0
- data/lib/spree/testing_support/order_walkthrough.rb +87 -0
- data/lib/spree/testing_support/preferences.rb +34 -0
- data/lib/spree/testing_support/sequences.rb +8 -0
- data/lib/spree/testing_support/shared_examples/gallery.rb +18 -0
- data/lib/spree/testing_support/url_helpers.rb +11 -0
- data/lib/spree_core.rb +3 -0
- data/lib/tasks/core.rake +104 -0
- data/lib/tasks/email.rake +9 -0
- data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +115 -0
- data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +20 -0
- data/lib/tasks/migrations/migrate_user_addresses.rake +31 -0
- data/lib/tasks/migrations/rename_gateways.rake +21 -0
- data/lib/tasks/order_capturing.rake +25 -0
- data/script/rails +10 -0
- data/solidus_core.gemspec +48 -0
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +168 -0
- data/spec/helpers/products_helper_spec.rb +200 -0
- data/spec/helpers/taxons_helper_spec.rb +41 -0
- data/spec/jobs/promotion_code_batch_job_spec.rb +96 -0
- data/spec/lib/calculated_adjustments_spec.rb +133 -0
- data/spec/lib/i18n_spec.rb +92 -0
- data/spec/lib/search/base_spec.rb +87 -0
- data/spec/lib/search/variant_spec.rb +115 -0
- data/spec/lib/spree/core/class_constantizer_spec.rb +71 -0
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +69 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +126 -0
- data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +195 -0
- data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +81 -0
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +21 -0
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +18 -0
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +41 -0
- data/spec/lib/spree/core/current_store_spec.rb +33 -0
- data/spec/lib/spree/core/environment_extension_spec.rb +36 -0
- data/spec/lib/spree/core/importer/order_spec.rb +484 -0
- data/spec/lib/spree/core/role_configuration_spec.rb +155 -0
- data/spec/lib/spree/core/stock_configuration_spec.rb +59 -0
- data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +61 -0
- data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +20 -0
- data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +44 -0
- data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +39 -0
- data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +376 -0
- data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +40 -0
- data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +32 -0
- data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +32 -0
- data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +32 -0
- data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +20 -0
- data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +20 -0
- data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +20 -0
- data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +44 -0
- data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +59 -0
- data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +35 -0
- data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +28 -0
- data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +43 -0
- data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +20 -0
- data/spec/lib/spree/core/testing_support/factories/store_credit_update_reason_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +24 -0
- data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +56 -0
- data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +14 -0
- data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +20 -0
- data/spec/lib/spree/core/testing_support/preferences_spec.rb +28 -0
- data/spec/lib/spree/core/validators/email_spec.rb +53 -0
- data/spec/lib/spree/core/version_spec.rb +19 -0
- data/spec/lib/spree/localized_number_spec.rb +45 -0
- data/spec/lib/spree/migrations_spec.rb +32 -0
- data/spec/lib/spree/money_spec.rb +305 -0
- data/spec/lib/spree/permission_sets/default_customer_spec.rb +22 -0
- data/spec/lib/tasks/dummy_task.rake +12 -0
- data/spec/lib/tasks/dummy_task_spec.rb +30 -0
- data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +19 -0
- data/spec/mailers/carton_mailer_spec.rb +44 -0
- data/spec/mailers/order_mailer_spec.rb +117 -0
- data/spec/mailers/promotion_code_batch_mailer_spec.rb +47 -0
- data/spec/mailers/reimbursement_mailer_spec.rb +36 -0
- data/spec/mailers/test_mailer_spec.rb +11 -0
- data/spec/models/spree/ability_spec.rb +279 -0
- data/spec/models/spree/address_spec.rb +375 -0
- data/spec/models/spree/adjustment_reason_spec.rb +11 -0
- data/spec/models/spree/adjustment_spec.rb +339 -0
- data/spec/models/spree/app_configuration_spec.rb +55 -0
- data/spec/models/spree/asset_spec.rb +25 -0
- data/spec/models/spree/calculator/default_tax_spec.rb +260 -0
- data/spec/models/spree/calculator/distributed_amount_spec.rb +82 -0
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +30 -0
- data/spec/models/spree/calculator/flat_rate_spec.rb +52 -0
- data/spec/models/spree/calculator/flexi_rate_spec.rb +158 -0
- data/spec/models/spree/calculator/free_shipping_spec.rb +8 -0
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +20 -0
- data/spec/models/spree/calculator/percent_per_item_spec.rb +12 -0
- data/spec/models/spree/calculator/price_sack_spec.rb +35 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +70 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +39 -0
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +18 -0
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +56 -0
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +25 -0
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +35 -0
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +99 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +191 -0
- data/spec/models/spree/calculator_spec.rb +43 -0
- data/spec/models/spree/carton_spec.rb +137 -0
- data/spec/models/spree/classification_spec.rb +114 -0
- data/spec/models/spree/concerns/display_money_spec.rb +44 -0
- data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +52 -0
- data/spec/models/spree/concerns/user_address_book_spec.rb +358 -0
- data/spec/models/spree/concerns/user_methods_spec.rb +121 -0
- data/spec/models/spree/country_spec.rb +78 -0
- data/spec/models/spree/credit_card_spec.rb +373 -0
- data/spec/models/spree/customer_return_spec.rb +293 -0
- data/spec/models/spree/distributed_amounts_handler_spec.rb +83 -0
- data/spec/models/spree/exchange_spec.rb +76 -0
- data/spec/models/spree/fulfilment_changer_spec.rb +307 -0
- data/spec/models/spree/gallery/product_gallery_spec.rb +21 -0
- data/spec/models/spree/gallery/variant_gallery_spec.rb +21 -0
- data/spec/models/spree/gateway/bogus_simple.rb +14 -0
- data/spec/models/spree/gateway/bogus_spec.rb +14 -0
- data/spec/models/spree/gateway_spec.rb +14 -0
- data/spec/models/spree/image_spec.rb +25 -0
- data/spec/models/spree/inventory_unit_spec.rb +312 -0
- data/spec/models/spree/line_item_spec.rb +240 -0
- data/spec/models/spree/option_type_spec.rb +16 -0
- data/spec/models/spree/option_value_spec.rb +52 -0
- data/spec/models/spree/order/address_spec.rb +52 -0
- data/spec/models/spree/order/adjustments_spec.rb +29 -0
- data/spec/models/spree/order/callbacks_spec.rb +44 -0
- data/spec/models/spree/order/checkout_spec.rb +744 -0
- data/spec/models/spree/order/finalizing_spec.rb +111 -0
- data/spec/models/spree/order/number_generator_spec.rb +47 -0
- data/spec/models/spree/order/outstanding_balance_integration_spec.rb +137 -0
- data/spec/models/spree/order/payment_spec.rb +280 -0
- data/spec/models/spree/order/risk_assessment_spec.rb +70 -0
- data/spec/models/spree/order/state_machine_spec.rb +122 -0
- data/spec/models/spree/order/totals_spec.rb +26 -0
- data/spec/models/spree/order/updating_spec.rb +18 -0
- data/spec/models/spree/order/validations_spec.rb +17 -0
- data/spec/models/spree/order_cancellations_spec.rb +192 -0
- data/spec/models/spree/order_capturing_spec.rb +16 -0
- data/spec/models/spree/order_contents_spec.rb +362 -0
- data/spec/models/spree/order_inventory_spec.rb +278 -0
- data/spec/models/spree/order_merger_spec.rb +159 -0
- data/spec/models/spree/order_mutex_spec.rb +89 -0
- data/spec/models/spree/order_promotion_spec.rb +33 -0
- data/spec/models/spree/order_shipping_spec.rb +247 -0
- data/spec/models/spree/order_spec.rb +1633 -0
- data/spec/models/spree/order_taxation_spec.rb +128 -0
- data/spec/models/spree/order_update_attributes_spec.rb +49 -0
- data/spec/models/spree/order_updater_spec.rb +560 -0
- data/spec/models/spree/payment/cancellation_spec.rb +83 -0
- data/spec/models/spree/payment_create_spec.rb +205 -0
- data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +10 -0
- data/spec/models/spree/payment_method/check_spec.rb +80 -0
- data/spec/models/spree/payment_method/credit_card_spec.rb +68 -0
- data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +20 -0
- data/spec/models/spree/payment_method/store_credit_spec.rb +325 -0
- data/spec/models/spree/payment_method_spec.rb +408 -0
- data/spec/models/spree/payment_spec.rb +1274 -0
- data/spec/models/spree/permission_sets/base_spec.rb +14 -0
- data/spec/models/spree/permission_sets/configuration_display.rb +79 -0
- data/spec/models/spree/permission_sets/configuration_management_spec.rb +49 -0
- data/spec/models/spree/permission_sets/dashboard_display_spec.rb +23 -0
- data/spec/models/spree/permission_sets/order_display_spec.rb +56 -0
- data/spec/models/spree/permission_sets/order_management_spec.rb +43 -0
- data/spec/models/spree/permission_sets/product_display_spec.rb +57 -0
- data/spec/models/spree/permission_sets/product_management_spec.rb +39 -0
- data/spec/models/spree/permission_sets/promotion_display_spec.rb +41 -0
- data/spec/models/spree/permission_sets/promotion_management_spec.rb +27 -0
- data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +42 -0
- data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +42 -0
- data/spec/models/spree/permission_sets/stock_display_spec.rb +25 -0
- data/spec/models/spree/permission_sets/stock_management_spec.rb +23 -0
- data/spec/models/spree/permission_sets/user_display_spec.rb +39 -0
- data/spec/models/spree/permission_sets/user_management_spec.rb +56 -0
- data/spec/models/spree/preference_spec.rb +79 -0
- data/spec/models/spree/preferences/configuration_spec.rb +27 -0
- data/spec/models/spree/preferences/preferable_spec.rb +334 -0
- data/spec/models/spree/preferences/scoped_store_spec.rb +62 -0
- data/spec/models/spree/preferences/static_model_preferences_spec.rb +79 -0
- data/spec/models/spree/preferences/statically_configurable_spec.rb +67 -0
- data/spec/models/spree/preferences/store_spec.rb +40 -0
- data/spec/models/spree/price_spec.rb +150 -0
- data/spec/models/spree/product/scopes_spec.rb +164 -0
- data/spec/models/spree/product_duplicator_spec.rb +92 -0
- data/spec/models/spree/product_filter_spec.rb +28 -0
- data/spec/models/spree/product_property_spec.rb +20 -0
- data/spec/models/spree/product_spec.rb +584 -0
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +126 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +198 -0
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +298 -0
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +61 -0
- data/spec/models/spree/promotion/rules/first_order_spec.rb +77 -0
- data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +71 -0
- data/spec/models/spree/promotion/rules/item_total_spec.rb +113 -0
- data/spec/models/spree/promotion/rules/nth_order_spec.rb +72 -0
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +44 -0
- data/spec/models/spree/promotion/rules/option_value_spec.rb +96 -0
- data/spec/models/spree/promotion/rules/product_spec.rb +178 -0
- data/spec/models/spree/promotion/rules/store_spec.rb +35 -0
- data/spec/models/spree/promotion/rules/taxon_spec.rb +174 -0
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +28 -0
- data/spec/models/spree/promotion/rules/user_role_spec.rb +88 -0
- data/spec/models/spree/promotion/rules/user_spec.rb +39 -0
- data/spec/models/spree/promotion_action_spec.rb +44 -0
- data/spec/models/spree/promotion_category_spec.rb +19 -0
- data/spec/models/spree/promotion_code/batch_builder_spec.rb +107 -0
- data/spec/models/spree/promotion_code_batch_spec.rb +54 -0
- data/spec/models/spree/promotion_code_spec.rb +206 -0
- data/spec/models/spree/promotion_handler/cart_spec.rb +132 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +365 -0
- data/spec/models/spree/promotion_handler/page_spec.rb +45 -0
- data/spec/models/spree/promotion_handler/shipping_spec.rb +96 -0
- data/spec/models/spree/promotion_rule_spec.rb +34 -0
- data/spec/models/spree/promotion_spec.rb +834 -0
- data/spec/models/spree/refund_spec.rb +199 -0
- data/spec/models/spree/reimbursement/credit_spec.rb +38 -0
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +144 -0
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +85 -0
- data/spec/models/spree/reimbursement_performer_spec.rb +32 -0
- data/spec/models/spree/reimbursement_spec.rb +253 -0
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +52 -0
- data/spec/models/spree/reimbursement_type/credit_spec.rb +55 -0
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +47 -0
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +109 -0
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +99 -0
- data/spec/models/spree/return_authorization_spec.rb +226 -0
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +79 -0
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +59 -0
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +86 -0
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +35 -0
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +31 -0
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +42 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +66 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
- data/spec/models/spree/return_item_spec.rb +776 -0
- data/spec/models/spree/returns_calculator_spec.rb +16 -0
- data/spec/models/spree/shipment_spec.rb +907 -0
- data/spec/models/spree/shipping_calculator_spec.rb +57 -0
- data/spec/models/spree/shipping_manifest_spec.rb +110 -0
- data/spec/models/spree/shipping_method_spec.rb +260 -0
- data/spec/models/spree/shipping_rate_spec.rb +154 -0
- data/spec/models/spree/shipping_rate_tax_spec.rb +79 -0
- data/spec/models/spree/state_spec.rb +43 -0
- data/spec/models/spree/stock/availability_spec.rb +143 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +140 -0
- data/spec/models/spree/stock/content_item_spec.rb +70 -0
- data/spec/models/spree/stock/differentiator_spec.rb +41 -0
- data/spec/models/spree/stock/estimator_spec.rb +240 -0
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +34 -0
- data/spec/models/spree/stock/location_sorter/default_first_spec.rb +20 -0
- data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +19 -0
- data/spec/models/spree/stock/package_spec.rb +182 -0
- data/spec/models/spree/stock/quantifier_spec.rb +113 -0
- data/spec/models/spree/stock/shipping_rate_selector_spec.rb +18 -0
- data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +18 -0
- data/spec/models/spree/stock/simple_coordinator_spec.rb +247 -0
- data/spec/models/spree/stock/splitter/backordered_spec.rb +31 -0
- data/spec/models/spree/stock/splitter/base_spec.rb +22 -0
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +48 -0
- data/spec/models/spree/stock/splitter/weight_spec.rb +31 -0
- data/spec/models/spree/stock/splitter_chain_spec.rb +66 -0
- data/spec/models/spree/stock_item_spec.rb +347 -0
- data/spec/models/spree/stock_location_spec.rb +288 -0
- data/spec/models/spree/stock_movement_spec.rb +58 -0
- data/spec/models/spree/stock_quantities_spec.rb +249 -0
- data/spec/models/spree/store_credit_category_spec.rb +19 -0
- data/spec/models/spree/store_credit_event_spec.rb +328 -0
- data/spec/models/spree/store_credit_spec.rb +900 -0
- data/spec/models/spree/store_selector/by_server_name_spec.rb +28 -0
- data/spec/models/spree/store_selector/legacy_spec.rb +46 -0
- data/spec/models/spree/store_spec.rb +156 -0
- data/spec/models/spree/tax/order_adjuster_spec.rb +35 -0
- data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +59 -0
- data/spec/models/spree/tax/tax_location_spec.rb +79 -0
- data/spec/models/spree/tax/taxation_integration_spec.rb +815 -0
- data/spec/models/spree/tax_calculator/default_spec.rb +56 -0
- data/spec/models/spree/tax_category_spec.rb +29 -0
- data/spec/models/spree/tax_rate_spec.rb +316 -0
- data/spec/models/spree/taxon_spec.rb +169 -0
- data/spec/models/spree/taxonomy_spec.rb +15 -0
- data/spec/models/spree/unit_cancel_spec.rb +61 -0
- data/spec/models/spree/user_spec.rb +247 -0
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +33 -0
- data/spec/models/spree/variant/price_selector_spec.rb +90 -0
- data/spec/models/spree/variant/pricing_options_spec.rb +181 -0
- data/spec/models/spree/variant/scopes_spec.rb +94 -0
- data/spec/models/spree/variant/vat_price_generator_spec.rb +77 -0
- data/spec/models/spree/variant_property_rule_condition_spec.rb +17 -0
- data/spec/models/spree/variant_property_rule_spec.rb +85 -0
- data/spec/models/spree/variant_property_rule_value_spec.rb +20 -0
- data/spec/models/spree/variant_spec.rb +822 -0
- data/spec/models/spree/wallet_payment_source_spec.rb +48 -0
- data/spec/models/spree/wallet_spec.rb +155 -0
- data/spec/models/spree/zone_spec.rb +248 -0
- data/spec/rails_helper.rb +45 -0
- data/spec/shared_examples/calculator_shared_examples.rb +10 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/support/big_decimal.rb +7 -0
- data/spec/support/concerns/default_price.rb +36 -0
- data/spec/support/concerns/payment_source.rb +66 -0
- data/spec/support/concerns/working_factories.rb +15 -0
- data/spec/support/dummy_ability.rb +7 -0
- data/spec/support/shared_contexts/rake.rb +32 -0
- data/vendor/assets/javascripts/jquery.payment.js +648 -0
- data/vendor/assets/javascripts/jsuri.js +2 -0
- data/vendor/assets/stylesheets/normalize.css +375 -0
- metadata +1226 -0
@@ -0,0 +1,225 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class Payment < Spree::Base
|
5
|
+
module Processing
|
6
|
+
# "process!" means:
|
7
|
+
# - Do nothing when:
|
8
|
+
# - There is no payment method
|
9
|
+
# - The payment method does not require a source
|
10
|
+
# - The payment is in the "processing" state
|
11
|
+
# - 'auto_capture?' is false and the payment is already authorized.
|
12
|
+
# - Raise an exception when:
|
13
|
+
# - The source is missing or invalid
|
14
|
+
# - The payment is in a state that cannot transition to 'processing'
|
15
|
+
# (failed/void/invalid states). Note: 'completed' can transition to
|
16
|
+
# 'processing' and thus calling #process! on a completed Payment
|
17
|
+
# will attempt to re-authorize/re-purchase the payment.
|
18
|
+
# - Otherwise:
|
19
|
+
# - If 'auto_capture?' is true:
|
20
|
+
# - Call #purchase on the payment gateway. (i.e. authorize+capture)
|
21
|
+
# even if the payment is already completed.
|
22
|
+
# - Else:
|
23
|
+
# - Call #authorize on the payment gateway even if the payment is
|
24
|
+
# already completed.
|
25
|
+
def process!
|
26
|
+
return if payment_method.nil?
|
27
|
+
|
28
|
+
if payment_method.auto_capture?
|
29
|
+
purchase!
|
30
|
+
elsif pending?
|
31
|
+
# do nothing. already authorized.
|
32
|
+
else
|
33
|
+
authorize!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def authorize!
|
38
|
+
handle_payment_preconditions { process_authorization }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Captures the entire amount of a payment.
|
42
|
+
def purchase!
|
43
|
+
handle_payment_preconditions { process_purchase }
|
44
|
+
end
|
45
|
+
|
46
|
+
# Takes the amount in cents to capture.
|
47
|
+
# Can be used to capture partial amounts of a payment, and will create
|
48
|
+
# a new pending payment record for the remaining amount to capture later.
|
49
|
+
def capture!(amount = nil)
|
50
|
+
return true if completed?
|
51
|
+
amount ||= money.money.cents
|
52
|
+
started_processing!
|
53
|
+
protect_from_connection_error do
|
54
|
+
# Standard ActiveMerchant capture usage
|
55
|
+
response = payment_method.capture(
|
56
|
+
amount,
|
57
|
+
response_code,
|
58
|
+
gateway_options
|
59
|
+
)
|
60
|
+
money = ::Money.new(amount, currency)
|
61
|
+
capture_events.create!(amount: money.to_d)
|
62
|
+
update_attributes!(amount: captured_amount)
|
63
|
+
handle_response(response, :complete, :failure)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def void_transaction!
|
68
|
+
return true if void?
|
69
|
+
protect_from_connection_error do
|
70
|
+
if payment_method.payment_profiles_supported?
|
71
|
+
# Gateways supporting payment profiles will need access to credit card object because this stores the payment profile information
|
72
|
+
# so supply the authorization itself as well as the credit card, rather than just the authorization code
|
73
|
+
response = payment_method.void(response_code, source, gateway_options)
|
74
|
+
else
|
75
|
+
# Standard ActiveMerchant void usage
|
76
|
+
response = payment_method.void(response_code, gateway_options)
|
77
|
+
end
|
78
|
+
|
79
|
+
handle_void_response(response)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def cancel!
|
84
|
+
Spree::Config.payment_canceller.cancel(self)
|
85
|
+
end
|
86
|
+
|
87
|
+
def gateway_options
|
88
|
+
order.reload
|
89
|
+
options = {
|
90
|
+
email: order.email,
|
91
|
+
customer: order.email,
|
92
|
+
customer_id: order.user_id,
|
93
|
+
ip: order.last_ip_address,
|
94
|
+
# Need to pass in a unique identifier here to make some
|
95
|
+
# payment gateways happy.
|
96
|
+
#
|
97
|
+
# For more information, please see Spree::Payment#set_unique_identifier
|
98
|
+
order_id: gateway_order_id,
|
99
|
+
# The originator is passed to options used by the payment method.
|
100
|
+
# One example of a place that it is used is in:
|
101
|
+
# app/models/spree/payment_method/store_credit.rb
|
102
|
+
originator: self
|
103
|
+
}
|
104
|
+
|
105
|
+
options[:shipping] = order.ship_total * 100
|
106
|
+
options[:tax] = order.additional_tax_total * 100
|
107
|
+
options[:subtotal] = order.item_total * 100
|
108
|
+
options[:discount] = order.promo_total * 100
|
109
|
+
options[:currency] = currency
|
110
|
+
|
111
|
+
bill_address = source.try(:address)
|
112
|
+
bill_address ||= order.bill_address
|
113
|
+
|
114
|
+
options[:billing_address] = bill_address.try!(:active_merchant_hash)
|
115
|
+
options[:shipping_address] = order.ship_address.try!(:active_merchant_hash)
|
116
|
+
|
117
|
+
options
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def process_authorization
|
123
|
+
started_processing!
|
124
|
+
gateway_action(source, :authorize, :pend)
|
125
|
+
end
|
126
|
+
|
127
|
+
def process_purchase
|
128
|
+
started_processing!
|
129
|
+
gateway_action(source, :purchase, :complete)
|
130
|
+
# This won't be called if gateway_action raises a GatewayError
|
131
|
+
capture_events.create!(amount: amount)
|
132
|
+
end
|
133
|
+
|
134
|
+
def handle_payment_preconditions(&_block)
|
135
|
+
unless block_given?
|
136
|
+
raise ArgumentError.new("handle_payment_preconditions must be called with a block")
|
137
|
+
end
|
138
|
+
|
139
|
+
return if payment_method.nil?
|
140
|
+
return if !payment_method.source_required?
|
141
|
+
|
142
|
+
if source
|
143
|
+
if !processing?
|
144
|
+
if payment_method.supports?(source)
|
145
|
+
yield
|
146
|
+
else
|
147
|
+
invalidate!
|
148
|
+
raise Core::GatewayError.new(I18n.t('spree.payment_method_not_supported'))
|
149
|
+
end
|
150
|
+
end
|
151
|
+
else
|
152
|
+
raise Core::GatewayError.new(I18n.t('spree.payment_processing_failed'))
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def gateway_action(source, action, success_state)
|
157
|
+
protect_from_connection_error do
|
158
|
+
response = payment_method.send(action, money.money.cents,
|
159
|
+
source,
|
160
|
+
gateway_options)
|
161
|
+
handle_response(response, success_state, :failure)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def handle_response(response, success_state, failure_state)
|
166
|
+
record_response(response)
|
167
|
+
|
168
|
+
if response.success?
|
169
|
+
unless response.authorization.nil?
|
170
|
+
self.response_code = response.authorization
|
171
|
+
self.avs_response = response.avs_result['code']
|
172
|
+
|
173
|
+
if response.cvv_result
|
174
|
+
self.cvv_response_code = response.cvv_result['code']
|
175
|
+
self.cvv_response_message = response.cvv_result['message']
|
176
|
+
end
|
177
|
+
end
|
178
|
+
send("#{success_state}!")
|
179
|
+
else
|
180
|
+
send(failure_state)
|
181
|
+
gateway_error(response)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def handle_void_response(response)
|
186
|
+
record_response(response)
|
187
|
+
|
188
|
+
if response.success?
|
189
|
+
self.response_code = response.authorization
|
190
|
+
void
|
191
|
+
else
|
192
|
+
gateway_error(response)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def record_response(response)
|
197
|
+
log_entries.create!(details: response.to_yaml)
|
198
|
+
end
|
199
|
+
|
200
|
+
def protect_from_connection_error
|
201
|
+
yield
|
202
|
+
rescue ActiveMerchant::ConnectionError => e
|
203
|
+
gateway_error(e)
|
204
|
+
end
|
205
|
+
|
206
|
+
def gateway_error(error)
|
207
|
+
if error.is_a? ActiveMerchant::Billing::Response
|
208
|
+
text = error.params['message'] || error.params['response_reason_text'] || error.message
|
209
|
+
elsif error.is_a? ActiveMerchant::ConnectionError
|
210
|
+
text = I18n.t('spree.unable_to_connect_to_gateway')
|
211
|
+
else
|
212
|
+
text = error.to_s
|
213
|
+
end
|
214
|
+
logger.error(I18n.t('spree.gateway_error'))
|
215
|
+
logger.error(" #{error.to_yaml}")
|
216
|
+
raise Core::GatewayError.new(text)
|
217
|
+
end
|
218
|
+
|
219
|
+
# The unique identifier to be passed in to the payment gateway
|
220
|
+
def gateway_order_id
|
221
|
+
"#{order.number}-#{number}"
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
@@ -0,0 +1,284 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
# Manage and process a payment for an order, from a specific
|
5
|
+
# source (e.g. `Spree::CreditCard`) using a specific payment method (e.g
|
6
|
+
# `Solidus::Gateway::Braintree`).
|
7
|
+
#
|
8
|
+
class Payment < Spree::Base
|
9
|
+
include Spree::Payment::Processing
|
10
|
+
|
11
|
+
alias_attribute :identifier, :number
|
12
|
+
deprecate :identifier, :identifier=, deprecator: Spree::Deprecation
|
13
|
+
|
14
|
+
IDENTIFIER_CHARS = (('A'..'Z').to_a + ('0'..'9').to_a - %w(0 1 I O)).freeze
|
15
|
+
NON_RISKY_AVS_CODES = ['B', 'D', 'H', 'J', 'M', 'Q', 'T', 'V', 'X', 'Y'].freeze
|
16
|
+
RISKY_AVS_CODES = ['A', 'C', 'E', 'F', 'G', 'I', 'K', 'L', 'N', 'O', 'P', 'R', 'S', 'U', 'W', 'Z'].freeze
|
17
|
+
|
18
|
+
belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :payments
|
19
|
+
belongs_to :source, polymorphic: true
|
20
|
+
belongs_to :payment_method, -> { with_deleted }, class_name: 'Spree::PaymentMethod', inverse_of: :payments
|
21
|
+
|
22
|
+
has_many :offsets, -> { offset_payment }, class_name: "Spree::Payment", foreign_key: :source_id
|
23
|
+
has_many :log_entries, as: :source
|
24
|
+
has_many :state_changes, as: :stateful
|
25
|
+
has_many :capture_events, class_name: 'Spree::PaymentCaptureEvent'
|
26
|
+
has_many :refunds, inverse_of: :payment
|
27
|
+
|
28
|
+
before_validation :validate_source, unless: :invalid?
|
29
|
+
before_create :set_unique_identifier
|
30
|
+
|
31
|
+
after_save :create_payment_profile, if: :profiles_supported?
|
32
|
+
|
33
|
+
# update the order totals, etc.
|
34
|
+
after_save :update_order
|
35
|
+
|
36
|
+
after_create :create_eligible_credit_event
|
37
|
+
|
38
|
+
# invalidate previously entered payments
|
39
|
+
after_create :invalidate_old_payments
|
40
|
+
|
41
|
+
attr_accessor :request_env
|
42
|
+
|
43
|
+
validates :amount, numericality: true
|
44
|
+
validates :source, presence: true, if: :source_required?
|
45
|
+
validates :payment_method, presence: true
|
46
|
+
|
47
|
+
default_scope -> { order(:created_at) }
|
48
|
+
|
49
|
+
scope :from_credit_card, -> { where(source_type: 'Spree::CreditCard') }
|
50
|
+
scope :with_state, ->(s) { where(state: s.to_s) }
|
51
|
+
# "offset" is reserved by activerecord
|
52
|
+
scope :offset_payment, -> { where("source_type = 'Spree::Payment' AND amount < 0 AND state = 'completed'") }
|
53
|
+
|
54
|
+
scope :checkout, -> { with_state('checkout') }
|
55
|
+
scope :completed, -> { with_state('completed') }
|
56
|
+
scope :pending, -> { with_state('pending') }
|
57
|
+
scope :processing, -> { with_state('processing') }
|
58
|
+
scope :failed, -> { with_state('failed') }
|
59
|
+
|
60
|
+
scope :risky, -> { where("avs_response IN (?) OR (cvv_response_code IS NOT NULL and cvv_response_code != 'M') OR state = 'failed'", RISKY_AVS_CODES) }
|
61
|
+
scope :valid, -> { where.not(state: %w(failed invalid)) }
|
62
|
+
|
63
|
+
scope :store_credits, -> { where(source_type: Spree::StoreCredit.to_s) }
|
64
|
+
scope :not_store_credits, -> { where(arel_table[:source_type].not_eq(Spree::StoreCredit.to_s).or(arel_table[:source_type].eq(nil))) }
|
65
|
+
|
66
|
+
# order state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
|
67
|
+
state_machine initial: :checkout do
|
68
|
+
# With card payments, happens before purchase or authorization happens
|
69
|
+
#
|
70
|
+
# Setting it after creating a profile and authorizing a full amount will
|
71
|
+
# prevent the payment from being authorized again once Order transitions
|
72
|
+
# to complete
|
73
|
+
event :started_processing do
|
74
|
+
transition from: [:checkout, :pending, :completed, :processing], to: :processing
|
75
|
+
end
|
76
|
+
# When processing during checkout fails
|
77
|
+
event :failure do
|
78
|
+
transition from: [:pending, :processing], to: :failed
|
79
|
+
end
|
80
|
+
# With card payments this represents authorizing the payment
|
81
|
+
event :pend do
|
82
|
+
transition from: [:checkout, :processing], to: :pending
|
83
|
+
end
|
84
|
+
# With card payments this represents completing a purchase or capture transaction
|
85
|
+
event :complete do
|
86
|
+
transition from: [:processing, :pending, :checkout], to: :completed
|
87
|
+
end
|
88
|
+
event :void do
|
89
|
+
transition from: [:pending, :processing, :completed, :checkout], to: :void
|
90
|
+
end
|
91
|
+
# when the card brand isnt supported
|
92
|
+
event :invalidate do
|
93
|
+
transition from: [:checkout], to: :invalid
|
94
|
+
end
|
95
|
+
|
96
|
+
after_transition do |payment, transition|
|
97
|
+
payment.state_changes.create!(
|
98
|
+
previous_state: transition.from,
|
99
|
+
next_state: transition.to,
|
100
|
+
name: 'payment'
|
101
|
+
)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# @return [String] this payment's response code
|
106
|
+
def transaction_id
|
107
|
+
response_code
|
108
|
+
end
|
109
|
+
|
110
|
+
# @return [String] this payment's currency
|
111
|
+
delegate :currency, to: :order
|
112
|
+
|
113
|
+
# @return [Spree::Money] this amount of this payment as money object
|
114
|
+
def money
|
115
|
+
Spree::Money.new(amount, { currency: currency })
|
116
|
+
end
|
117
|
+
alias display_amount money
|
118
|
+
|
119
|
+
# Sets the amount, parsing it based on i18n settings if it is a string.
|
120
|
+
#
|
121
|
+
# @param amount [BigDecimal, String] the desired new amount
|
122
|
+
def amount=(amount)
|
123
|
+
self[:amount] =
|
124
|
+
case amount
|
125
|
+
when String
|
126
|
+
separator = I18n.t('number.currency.format.separator')
|
127
|
+
number = amount.delete("^0-9-#{separator}\.").tr(separator, '.')
|
128
|
+
number.to_d if number.present?
|
129
|
+
end || amount
|
130
|
+
end
|
131
|
+
|
132
|
+
# The total amount of the offsets (for old-style refunds) for this payment.
|
133
|
+
#
|
134
|
+
# @return [BigDecimal] the total amount of this payment's offsets
|
135
|
+
def offsets_total
|
136
|
+
offsets.pluck(:amount).sum
|
137
|
+
end
|
138
|
+
|
139
|
+
# The total amount this payment can be credited.
|
140
|
+
#
|
141
|
+
# @return [BigDecimal] the amount of this payment minus the offsets
|
142
|
+
# (old-style refunds) and refunds
|
143
|
+
def credit_allowed
|
144
|
+
amount - (offsets_total.abs + refunds.sum(:amount))
|
145
|
+
end
|
146
|
+
|
147
|
+
# @return [Boolean] true when this payment can be credited
|
148
|
+
def can_credit?
|
149
|
+
credit_allowed > 0
|
150
|
+
end
|
151
|
+
|
152
|
+
# @return [Boolean] true when this payment has been fully refunded
|
153
|
+
def fully_refunded?
|
154
|
+
refunds.map(&:amount).sum == amount
|
155
|
+
end
|
156
|
+
|
157
|
+
# @return [Array<String>] the actions available on this payment
|
158
|
+
def actions
|
159
|
+
sa = source_actions
|
160
|
+
sa |= ["failure"] if processing?
|
161
|
+
sa
|
162
|
+
end
|
163
|
+
|
164
|
+
# @return [Object] the source of ths payment
|
165
|
+
def payment_source
|
166
|
+
res = source.is_a?(Payment) ? source.source : source
|
167
|
+
res || payment_method
|
168
|
+
end
|
169
|
+
|
170
|
+
# @return [Boolean] true when this payment is risky based on address
|
171
|
+
def is_avs_risky?
|
172
|
+
return false if avs_response.blank? || NON_RISKY_AVS_CODES.include?(avs_response)
|
173
|
+
true
|
174
|
+
end
|
175
|
+
|
176
|
+
# @return [Boolean] true when this payment is risky based on cvv
|
177
|
+
def is_cvv_risky?
|
178
|
+
return false if cvv_response_code == "M"
|
179
|
+
return false if cvv_response_code.nil?
|
180
|
+
return false if cvv_response_message.present?
|
181
|
+
true
|
182
|
+
end
|
183
|
+
|
184
|
+
# @return [BigDecimal] the total amount captured on this payment
|
185
|
+
def captured_amount
|
186
|
+
capture_events.sum(:amount)
|
187
|
+
end
|
188
|
+
|
189
|
+
# @return [BigDecimal] the total amount left uncaptured on this payment
|
190
|
+
def uncaptured_amount
|
191
|
+
amount - captured_amount
|
192
|
+
end
|
193
|
+
|
194
|
+
# @return [Boolean] true when the payment method exists and is a store credit payment method
|
195
|
+
def store_credit?
|
196
|
+
payment_method.try!(:store_credit?)
|
197
|
+
end
|
198
|
+
|
199
|
+
private
|
200
|
+
|
201
|
+
def source_actions
|
202
|
+
return [] unless payment_source && payment_source.respond_to?(:actions)
|
203
|
+
payment_source.actions.select { |action| !payment_source.respond_to?("can_#{action}?") || payment_source.send("can_#{action}?", self) }
|
204
|
+
end
|
205
|
+
|
206
|
+
def validate_source
|
207
|
+
if source && !source.valid?
|
208
|
+
source.errors.each do |field, error|
|
209
|
+
field_name = I18n.t("activerecord.attributes.#{source.class.to_s.underscore}.#{field}")
|
210
|
+
errors.add(I18n.t(source.class.to_s.demodulize.underscore, scope: 'spree'), "#{field_name} #{error}")
|
211
|
+
end
|
212
|
+
end
|
213
|
+
if errors.any?
|
214
|
+
throw :abort
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def source_required?
|
219
|
+
payment_method.present? && payment_method.source_required?
|
220
|
+
end
|
221
|
+
|
222
|
+
def profiles_supported?
|
223
|
+
payment_method.respond_to?(:payment_profiles_supported?) && payment_method.payment_profiles_supported?
|
224
|
+
end
|
225
|
+
|
226
|
+
def create_payment_profile
|
227
|
+
# Don't attempt to create on bad payments.
|
228
|
+
return if %w(invalid failed).include?(state)
|
229
|
+
# Payment profile cannot be created without source
|
230
|
+
return unless source
|
231
|
+
# Imported payments shouldn't create a payment profile.
|
232
|
+
return if source.imported
|
233
|
+
|
234
|
+
payment_method.create_profile(self)
|
235
|
+
rescue ActiveMerchant::ConnectionError => e
|
236
|
+
gateway_error e
|
237
|
+
end
|
238
|
+
|
239
|
+
def invalidate_old_payments
|
240
|
+
if !store_credit? && !['invalid', 'failed'].include?(state)
|
241
|
+
order.payments.select { |payment|
|
242
|
+
payment.state == 'checkout' && !payment.store_credit? && payment.id != id
|
243
|
+
}.each(&:invalidate!)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def update_order
|
248
|
+
if order.completed? || completed? || void?
|
249
|
+
order.recalculate
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
# Necessary because some payment gateways will refuse payments with
|
254
|
+
# duplicate IDs. We *were* using the Order number, but that's set once and
|
255
|
+
# is unchanging. What we need is a unique identifier on a per-payment basis,
|
256
|
+
# and this is it. Related to https://github.com/spree/spree/issues/1998.
|
257
|
+
# See https://github.com/spree/spree/issues/1998#issuecomment-12869105
|
258
|
+
def set_unique_identifier
|
259
|
+
loop do
|
260
|
+
self.number = generate_identifier
|
261
|
+
break unless self.class.exists?(number: number)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
def generate_identifier
|
266
|
+
Array.new(8){ IDENTIFIER_CHARS.sample }.join
|
267
|
+
end
|
268
|
+
|
269
|
+
def create_eligible_credit_event
|
270
|
+
# When cancelling an order, a payment with the negative amount
|
271
|
+
# of the payment total is created to refund the customer. That
|
272
|
+
# payment has a source of itself (Spree::Payment) no matter the
|
273
|
+
# type of payment getting refunded, hence the additional check
|
274
|
+
# if the source is a store credit.
|
275
|
+
if store_credit? && source.is_a?(Spree::StoreCredit)
|
276
|
+
source.update_attributes!({
|
277
|
+
action: Spree::StoreCredit::ELIGIBLE_ACTION,
|
278
|
+
action_amount: amount,
|
279
|
+
action_authorization_code: response_code
|
280
|
+
})
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
# Service object for creating new payments on an Order
|
5
|
+
class PaymentCreate
|
6
|
+
# @param order [Order] The order for the new payment
|
7
|
+
# @param attributes [Hash,ActionController::Parameters] attributes which are assigned to the new payment
|
8
|
+
# * :payment_method_id Id of payment method used for this payment
|
9
|
+
# * :source_attributes Attributes used to build the source of this payment. Usually a {CreditCard}
|
10
|
+
# * :existing_card_id (Integer) Deprecated: The id of an existing {CreditCard} object to use
|
11
|
+
# * :wallet_payment_source_id (Integer): The id of a {WalletPaymentSource} to use
|
12
|
+
# @param request_env [Hash] rack env of user creating the payment
|
13
|
+
# @param payment [Payment] Internal use only. Instead of making a new payment, change the attributes for an existing one.
|
14
|
+
def initialize(order, attributes, payment: nil, request_env: {})
|
15
|
+
@order = order
|
16
|
+
@payment = payment
|
17
|
+
|
18
|
+
# If AC::Params are passed in, attributes.to_h gives us a hash of only
|
19
|
+
# the permitted attributes.
|
20
|
+
@attributes = attributes.to_h.with_indifferent_access
|
21
|
+
@source_attributes = @attributes.delete(:source_attributes) || {}
|
22
|
+
@request_env = request_env
|
23
|
+
end
|
24
|
+
|
25
|
+
# Build the new Payment
|
26
|
+
# @return [Payment] a new (unpersisted) Payment
|
27
|
+
def build
|
28
|
+
@payment ||= order.payments.new
|
29
|
+
@payment.request_env = @request_env if @request_env
|
30
|
+
@payment.attributes = @attributes
|
31
|
+
|
32
|
+
if source_attributes[:existing_card_id].present?
|
33
|
+
Spree::Deprecation.warn(
|
34
|
+
"Passing existing_card_id to PaymentCreate is deprecated. Use wallet_payment_source_id instead.",
|
35
|
+
caller,
|
36
|
+
)
|
37
|
+
build_existing_card
|
38
|
+
elsif source_attributes[:wallet_payment_source_id].present?
|
39
|
+
build_from_wallet_payment_source
|
40
|
+
else
|
41
|
+
build_source
|
42
|
+
end
|
43
|
+
|
44
|
+
@payment
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
attr_reader :order, :payment, :attributes, :source_attributes
|
50
|
+
|
51
|
+
def build_source
|
52
|
+
payment_method = payment.payment_method
|
53
|
+
if source_attributes.present? && payment_method.try(:payment_source_class)
|
54
|
+
payment.source = payment_method.payment_source_class.new(source_attributes)
|
55
|
+
payment.source.payment_method_id = payment_method.id
|
56
|
+
if order && payment.source.respond_to?(:user=)
|
57
|
+
payment.source.user = order.user
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def build_from_wallet_payment_source
|
63
|
+
wallet_payment_source_id = source_attributes.fetch(:wallet_payment_source_id)
|
64
|
+
raise(ActiveRecord::RecordNotFound) if order.user.nil?
|
65
|
+
wallet_payment_source = order.user.wallet.find(wallet_payment_source_id)
|
66
|
+
raise(ActiveRecord::RecordNotFound) if wallet_payment_source.nil?
|
67
|
+
build_from_payment_source(wallet_payment_source.payment_source)
|
68
|
+
end
|
69
|
+
|
70
|
+
def build_existing_card
|
71
|
+
credit_card = available_cards.find(source_attributes[:existing_card_id])
|
72
|
+
build_from_payment_source(credit_card)
|
73
|
+
end
|
74
|
+
|
75
|
+
def build_from_payment_source(payment_source)
|
76
|
+
# FIXME: does this work?
|
77
|
+
if source_attributes[:verification_value]
|
78
|
+
payment_source.verification_value = source_attributes[:verification_value]
|
79
|
+
end
|
80
|
+
|
81
|
+
payment.source = payment_source
|
82
|
+
payment.payment_method_id = payment_source.payment_method_id
|
83
|
+
end
|
84
|
+
|
85
|
+
def available_cards
|
86
|
+
if user_id = order.user_id
|
87
|
+
Spree::CreditCard.where(user_id: user_id)
|
88
|
+
else
|
89
|
+
Spree::CreditCard.none
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class PaymentMethod::BogusCreditCard < PaymentMethod::CreditCard
|
5
|
+
TEST_VISA = ['4111111111111111', '4012888888881881', '4222222222222']
|
6
|
+
TEST_MC = ['5500000000000004', '5555555555554444', '5105105105105100']
|
7
|
+
TEST_AMEX = ['378282246310005', '371449635398431', '378734493671000', '340000000000009']
|
8
|
+
TEST_DISC = ['6011000000000004', '6011111111111117', '6011000990139424']
|
9
|
+
|
10
|
+
VALID_CCS = ['1', TEST_VISA, TEST_MC, TEST_AMEX, TEST_DISC].flatten
|
11
|
+
|
12
|
+
attr_accessor :test
|
13
|
+
|
14
|
+
def gateway_class
|
15
|
+
self.class
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_profile(payment)
|
19
|
+
return if payment.source.has_payment_profile?
|
20
|
+
# simulate the storage of credit card profile using remote service
|
21
|
+
if success = VALID_CCS.include?(payment.source.number)
|
22
|
+
payment.source.update_attributes(gateway_customer_profile_id: generate_profile_id(success))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def authorize(_money, credit_card, _options = {})
|
27
|
+
profile_id = credit_card.gateway_customer_profile_id
|
28
|
+
if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
|
29
|
+
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'D' })
|
30
|
+
else
|
31
|
+
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def purchase(_money, credit_card, _options = {})
|
36
|
+
profile_id = credit_card.gateway_customer_profile_id
|
37
|
+
if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
|
38
|
+
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'M' })
|
39
|
+
else
|
40
|
+
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def credit(_money, _credit_card, _response_code, _options = {})
|
45
|
+
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
|
46
|
+
end
|
47
|
+
|
48
|
+
def capture(_money, authorization, _gateway_options)
|
49
|
+
if authorization == '12345'
|
50
|
+
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true)
|
51
|
+
else
|
52
|
+
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', error: 'Bogus Gateway: Forced failure', test: true)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def void(_response_code, _credit_card, _options = {})
|
57
|
+
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
|
58
|
+
end
|
59
|
+
|
60
|
+
# @see Spree::PaymentMethod#try_void
|
61
|
+
def try_void(_payment)
|
62
|
+
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
|
63
|
+
end
|
64
|
+
|
65
|
+
def test?
|
66
|
+
# Test mode is not really relevant with bogus gateway (no such thing as live server)
|
67
|
+
true
|
68
|
+
end
|
69
|
+
|
70
|
+
def payment_profiles_supported?
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
def actions
|
75
|
+
%w(capture void credit)
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def generate_profile_id(success)
|
81
|
+
record = true
|
82
|
+
prefix = success ? 'BGS' : 'FAIL'
|
83
|
+
while record
|
84
|
+
random = "#{prefix}-#{Array.new(6){ rand(6) }.join}"
|
85
|
+
record = Spree::CreditCard.where(gateway_customer_profile_id: random).first
|
86
|
+
end
|
87
|
+
random
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|