solidus_core 4.6.2 → 4.7.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.
- checksums.yaml +4 -4
- data/Rakefile +13 -13
- data/app/controllers/spree/base_controller.rb +2 -2
- data/app/helpers/spree/base_helper.rb +24 -24
- data/app/helpers/spree/checkout_helper.rb +7 -7
- data/app/helpers/spree/core/controller_helpers/auth.rb +1 -1
- data/app/helpers/spree/core/controller_helpers/common.rb +3 -2
- data/app/helpers/spree/core/controller_helpers/order.rb +3 -5
- data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +1 -2
- data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +10 -10
- data/app/helpers/spree/products_helper.rb +5 -5
- data/app/helpers/spree/store_helper.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +3 -3
- data/app/mailers/spree/order_mailer.rb +4 -4
- data/app/mailers/spree/reimbursement_mailer.rb +2 -2
- data/app/models/concerns/spree/active_storage_adapter/attachment.rb +5 -5
- data/app/models/concerns/spree/active_storage_adapter/normalization.rb +5 -5
- data/app/models/concerns/spree/active_storage_adapter.rb +2 -2
- data/app/models/concerns/spree/adjustment_source.rb +4 -4
- data/app/models/concerns/spree/display_money.rb +2 -2
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/preferences/persistable.rb +1 -1
- data/app/models/concerns/spree/ransackable_attributes.rb +1 -0
- data/app/models/concerns/spree/soft_deletable.rb +2 -1
- data/app/models/concerns/spree/state_change_tracking.rb +1 -1
- data/app/models/concerns/spree/user_address_book.rb +12 -12
- data/app/models/concerns/spree/user_methods.rb +9 -9
- data/app/models/concerns/spree/user_reporting.rb +1 -0
- data/app/models/spree/ability.rb +1 -1
- data/app/models/spree/address/name.rb +1 -1
- data/app/models/spree/address.rb +7 -7
- data/app/models/spree/adjustment.rb +11 -10
- data/app/models/spree/adjustment_reason.rb +2 -2
- data/app/models/spree/billing_integration.rb +2 -2
- data/app/models/spree/calculator/default_tax.rb +2 -2
- data/app/models/spree/calculator/flat_fee.rb +1 -1
- data/app/models/spree/calculator/flat_rate.rb +2 -2
- data/app/models/spree/calculator/returns/default_refund_amount.rb +3 -3
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +2 -2
- data/app/models/spree/calculator/shipping/flat_rate.rb +3 -3
- data/app/models/spree/calculator/shipping/flexi_rate.rb +8 -8
- data/app/models/spree/calculator/shipping/per_item.rb +3 -3
- data/app/models/spree/calculator/shipping/price_sack.rb +3 -3
- data/app/models/spree/calculator.rb +31 -6
- data/app/models/spree/carton.rb +4 -4
- data/app/models/spree/classification.rb +2 -2
- data/app/models/spree/core/state_machines/order/class_methods.rb +3 -3
- data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +1 -1
- data/app/models/spree/country.rb +1 -1
- data/app/models/spree/credit_card.rb +27 -27
- data/app/models/spree/customer_return.rb +5 -4
- data/app/models/spree/distributed_amounts_handler.rb +1 -1
- data/app/models/spree/fulfilment_changer.rb +22 -22
- data/app/models/spree/image/active_storage_attachment.rb +2 -2
- data/app/models/spree/image/paperclip_attachment.rb +8 -8
- data/app/models/spree/in_memory_order_updater.rb +262 -0
- data/app/models/spree/inventory_unit.rb +11 -11
- data/app/models/spree/item_total.rb +1 -1
- data/app/models/spree/legacy_user.rb +2 -2
- data/app/models/spree/line_item.rb +21 -11
- data/app/models/spree/log_entry.rb +3 -3
- data/app/models/spree/mergeable_orders_finder.rb +44 -0
- data/app/models/spree/money.rb +2 -1
- data/app/models/spree/null_promotion_adjuster.rb +1 -1
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +2 -2
- data/app/models/spree/order/number_generator.rb +1 -1
- data/app/models/spree/order.rb +66 -64
- data/app/models/spree/order_cancellations.rb +1 -3
- data/app/models/spree/order_inventory.rb +5 -8
- data/app/models/spree/order_mutex.rb +1 -1
- data/app/models/spree/order_shipping.rb +1 -1
- data/app/models/spree/order_updater.rb +59 -37
- data/app/models/spree/payment/cancellation.rb +2 -2
- data/app/models/spree/payment/processing.rb +22 -22
- data/app/models/spree/payment.rb +25 -25
- data/app/models/spree/payment_capture_event.rb +2 -2
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +18 -18
- data/app/models/spree/payment_method/check.rb +3 -3
- data/app/models/spree/payment_method/credit_card.rb +1 -1
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +3 -3
- data/app/models/spree/payment_method/store_credit.rb +13 -13
- data/app/models/spree/payment_method.rb +12 -11
- data/app/models/spree/payment_source.rb +2 -2
- data/app/models/spree/permission_sets/dashboard_display.rb +3 -3
- data/app/models/spree/permission_sets/default_customer.rb +1 -1
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/price.rb +7 -6
- data/app/models/spree/product/scopes.rb +23 -23
- data/app/models/spree/product.rb +37 -41
- data/app/models/spree/product_option_type.rb +2 -2
- data/app/models/spree/product_property.rb +3 -3
- data/app/models/spree/refund.rb +10 -10
- data/app/models/spree/refund_reason.rb +2 -2
- data/app/models/spree/reimbursement/credit.rb +1 -1
- data/app/models/spree/reimbursement.rb +8 -8
- data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +2 -2
- data/app/models/spree/return_authorization.rb +7 -6
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/order_completed.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
- data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +6 -6
- data/app/models/spree/return_item.rb +31 -30
- data/app/models/spree/return_reason.rb +1 -1
- data/app/models/spree/role.rb +1 -1
- data/app/models/spree/role_user.rb +1 -1
- data/app/models/spree/shipment.rb +37 -29
- data/app/models/spree/shipping_method.rb +9 -9
- data/app/models/spree/shipping_method_category.rb +2 -2
- data/app/models/spree/shipping_rate.rb +12 -10
- data/app/models/spree/shipping_rate_tax.rb +5 -4
- data/app/models/spree/simple_order_contents.rb +2 -2
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/availability.rb +9 -9
- data/app/models/spree/stock/availability_validator.rb +3 -3
- data/app/models/spree/stock/differentiator.rb +2 -2
- data/app/models/spree/stock/estimator.rb +4 -4
- data/app/models/spree/stock/inventory_validator.rb +1 -1
- data/app/models/spree/stock/package.rb +3 -3
- data/app/models/spree/stock_item.rb +5 -5
- data/app/models/spree/stock_location.rb +6 -6
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/stock_quantities.rb +2 -2
- data/app/models/spree/store.rb +3 -3
- data/app/models/spree/store_credit.rb +30 -29
- data/app/models/spree/store_credit_category.rb +2 -2
- data/app/models/spree/store_credit_event.rb +6 -6
- data/app/models/spree/store_credit_reason.rb +1 -1
- data/app/models/spree/store_credit_type.rb +3 -3
- data/app/models/spree/store_selector/by_server_name.rb +1 -1
- data/app/models/spree/store_selector/legacy.rb +1 -1
- data/app/models/spree/tax/item_tax.rb +1 -0
- data/app/models/spree/tax/order_tax.rb +1 -0
- data/app/models/spree/tax_category.rb +3 -3
- data/app/models/spree/tax_rate.rb +5 -5
- data/app/models/spree/tax_rate_tax_category.rb +2 -2
- data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
- data/app/models/spree/taxon/paperclip_attachment.rb +4 -4
- data/app/models/spree/taxon.rb +16 -17
- data/app/models/spree/taxon_brand_selector.rb +3 -3
- data/app/models/spree/unauthorized_redirect_handler.rb +1 -1
- data/app/models/spree/unit_cancel.rb +4 -4
- data/app/models/spree/user_address.rb +3 -3
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +6 -8
- data/app/models/spree/user_last_url_storer.rb +1 -1
- data/app/models/spree/variant/price_selector.rb +1 -1
- data/app/models/spree/variant/scopes.rb +9 -9
- data/app/models/spree/variant.rb +25 -25
- data/app/models/spree/variant_property_rule.rb +2 -2
- data/app/models/spree/variant_property_rule_condition.rb +1 -1
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
- data/app/models/spree/wallet/default_payment_builder.rb +1 -1
- data/app/models/spree/wallet_payment_source.rb +2 -2
- data/app/models/spree/zone.rb +18 -18
- data/app/models/spree/zone_member.rb +1 -1
- data/app/subscribers/spree/carton_shipped_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_cancel_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_confirmation_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_inventory_cancellation_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/reimbursement_mailer_subscriber.rb +2 -2
- data/config/initializers/assets.rb +1 -1
- data/config/initializers/db_query_matchers.rb +9 -0
- data/config/initializers/friendly_id.rb +2 -2
- data/config/initializers/inflections.rb +1 -1
- data/config/initializers/money.rb +1 -1
- data/config/locales/en.yml +1 -0
- data/db/default/spree/countries.rb +7 -7
- data/db/default/spree/return_reasons.rb +11 -11
- data/db/default/spree/stock_locations.rb +1 -1
- data/db/default/spree/store_credit.rb +3 -4
- data/db/default/spree/stores.rb +1 -1
- data/db/default/spree/zones.rb +5 -5
- data/db/migrate/20160101010000_solidus_one_four.rb +16 -16
- data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +3 -3
- data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +7 -6
- data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +10 -10
- data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +6 -6
- data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +1 -1
- data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +4 -4
- data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +9 -16
- data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +1 -0
- data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +3 -3
- data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +1 -1
- data/db/migrate/20250214094207_add_reverse_charge_status_to_store.rb +1 -1
- data/db/migrate/20250225051308_add_vat_id_email_and_reverse_charge_status_to_addresses.rb +1 -1
- data/db/seeds.rb +3 -3
- data/lib/generators/solidus/install/app_templates/authentication/custom.rb +2 -2
- data/lib/generators/solidus/install/app_templates/authentication/devise.rb +3 -3
- data/lib/generators/solidus/install/app_templates/authentication/existing.rb +1 -1
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +2 -2
- data/lib/generators/solidus/install/install_generator.rb +51 -51
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +3 -0
- data/lib/generators/solidus/update/update_generator.rb +29 -29
- data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -6
- data/lib/generators/spree/dummy/dummy_generator.rb +22 -24
- data/lib/generators/spree/dummy/templates/rails/boot.rb +3 -3
- data/lib/generators/spree/dummy/templates/rails/test.rb +4 -4
- data/lib/solidus_core.rb +1 -1
- data/lib/spree/app_configuration.rb +59 -47
- data/lib/spree/bus.rb +1 -1
- data/lib/spree/config.rb +1 -1
- data/lib/spree/core/active_merchant_dependencies.rb +8 -8
- data/lib/spree/core/class_constantizer.rb +1 -1
- data/lib/spree/core/engine.rb +15 -15
- data/lib/spree/core/environment.rb +1 -1
- data/lib/spree/core/environment_extension.rb +2 -2
- data/lib/spree/core/importer/order.rb +15 -15
- data/lib/spree/core/importer/product.rb +4 -4
- data/lib/spree/core/importer.rb +2 -2
- data/lib/spree/core/null_promotion_configuration.rb +7 -7
- data/lib/spree/core/permalinks.rb +1 -1
- data/lib/spree/core/product_filters.rb +94 -93
- data/lib/spree/core/role_configuration.rb +3 -3
- data/lib/spree/core/search/base.rb +5 -6
- data/lib/spree/core/search/variant.rb +3 -3
- data/lib/spree/core/stock_configuration.rb +10 -49
- data/lib/spree/core/validators/email.rb +1 -1
- data/lib/spree/core/version.rb +3 -3
- data/lib/spree/core/versioned_value.rb +4 -6
- data/lib/spree/core.rb +49 -49
- data/lib/spree/deprecated_instance_variable_proxy.rb +1 -1
- data/lib/spree/deprecation.rb +1 -1
- data/lib/spree/deprecator.rb +2 -2
- data/lib/spree/i18n.rb +2 -2
- data/lib/spree/localized_number.rb +3 -3
- data/lib/spree/manipulative_query_monitor.rb +19 -0
- data/lib/spree/migrations.rb +2 -2
- data/lib/spree/permitted_attributes.rb +10 -10
- data/lib/spree/preferences/configuration.rb +5 -5
- data/lib/spree/preferences/preferable.rb +8 -10
- data/lib/spree/preferences/preferable_class_methods.rb +16 -16
- data/lib/spree/preferences/preference_differentiator.rb +1 -1
- data/lib/spree/preferences/scoped_store.rb +2 -2
- data/lib/spree/preferences/static_model_preferences.rb +2 -2
- data/lib/spree/preferences/store.rb +6 -6
- data/lib/spree/testing_support/ability_helpers.rb +30 -30
- data/lib/spree/testing_support/authorization_helpers.rb +6 -5
- data/lib/spree/testing_support/blacklist_urls.rb +1 -1
- data/lib/spree/testing_support/bus_helpers.rb +1 -1
- data/lib/spree/testing_support/capybara_driver.rb +1 -1
- data/lib/spree/testing_support/capybara_ext.rb +12 -12
- data/lib/spree/testing_support/common_rake.rb +17 -16
- data/lib/spree/testing_support/dummy_ability.rb +1 -1
- data/lib/spree/testing_support/dummy_app/migrations.rb +1 -1
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +5 -5
- data/lib/spree/testing_support/dummy_app/routes.rb +1 -1
- data/lib/spree/testing_support/dummy_app.rb +34 -34
- data/lib/spree/testing_support/extension_rake.rb +2 -2
- data/lib/spree/testing_support/factories/address_factory.rb +12 -12
- data/lib/spree/testing_support/factories/adjustment_factory.rb +7 -7
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/calculator_factory.rb +6 -6
- data/lib/spree/testing_support/factories/carton_factory.rb +1 -1
- data/lib/spree/testing_support/factories/country_factory.rb +3 -3
- data/lib/spree/testing_support/factories/credit_card_factory.rb +3 -3
- data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
- data/lib/spree/testing_support/factories/image_factory.rb +2 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -4
- data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
- data/lib/spree/testing_support/factories/option_type_factory.rb +2 -2
- data/lib/spree/testing_support/factories/option_value_factory.rb +2 -2
- data/lib/spree/testing_support/factories/order_factory.rb +16 -16
- data/lib/spree/testing_support/factories/payment_factory.rb +9 -9
- data/lib/spree/testing_support/factories/payment_method_factory.rb +10 -10
- data/lib/spree/testing_support/factories/price_factory.rb +2 -2
- data/lib/spree/testing_support/factories/product_factory.rb +2 -2
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
- data/lib/spree/testing_support/factories/property_factory.rb +3 -3
- data/lib/spree/testing_support/factories/refund_factory.rb +2 -2
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +3 -3
- data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/role_factory.rb +2 -2
- data/lib/spree/testing_support/factories/shipment_factory.rb +3 -3
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +7 -7
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/state_factory.rb +4 -4
- data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_location_factory.rb +7 -7
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +3 -3
- data/lib/spree/testing_support/factories/stock_package_factory.rb +3 -3
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -8
- data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +6 -6
- data/lib/spree/testing_support/factories/store_factory.rb +2 -2
- data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/taxon_factory.rb +3 -3
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
- data/lib/spree/testing_support/factories/user_factory.rb +2 -2
- data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_factory.rb +3 -3
- data/lib/spree/testing_support/factory_bot.rb +1 -1
- data/lib/spree/testing_support/flaky.rb +3 -2
- data/lib/spree/testing_support/flash.rb +2 -2
- data/lib/spree/testing_support/order_walkthrough.rb +7 -7
- data/lib/spree/testing_support/preferences.rb +1 -1
- data/lib/spree/testing_support/rake.rb +1 -1
- data/lib/spree/testing_support/shared_examples/calculator.rb +1 -1
- data/lib/spree/testing_support/shared_examples/gallery.rb +7 -7
- data/lib/spree/testing_support/shared_examples/order_factory.rb +9 -9
- data/lib/spree/testing_support/shared_examples/working_factory.rb +1 -1
- data/lib/spree/testing_support/translations.rb +1 -1
- data/lib/spree_core.rb +1 -1
- data/lib/tasks/payment_method.rake +2 -2
- data/solidus_core.gemspec +49 -49
- metadata +60 -54
|
@@ -43,7 +43,7 @@ class Spree::OrderShipping
|
|
|
43
43
|
# @param tracking_number An option tracking number.
|
|
44
44
|
# @return The carton created.
|
|
45
45
|
def ship(inventory_units:, stock_location:, address:, shipping_method:,
|
|
46
|
-
|
|
46
|
+
shipped_at: Time.current, external_number: nil, tracking_number: nil, suppress_mailer: false)
|
|
47
47
|
carton = nil
|
|
48
48
|
|
|
49
49
|
Spree::InventoryUnit.transaction do
|
|
@@ -18,13 +18,14 @@ module Spree
|
|
|
18
18
|
# associations try to save and then in turn try to call +update!+ again.)
|
|
19
19
|
def recalculate
|
|
20
20
|
order.transaction do
|
|
21
|
-
|
|
21
|
+
recalculate_line_item_prices
|
|
22
|
+
recalculate_item_count
|
|
22
23
|
update_shipment_amounts
|
|
23
24
|
update_totals
|
|
24
25
|
if order.completed?
|
|
25
|
-
|
|
26
|
+
recalculate_payment_state
|
|
26
27
|
update_shipments
|
|
27
|
-
|
|
28
|
+
recalculate_shipment_state
|
|
28
29
|
end
|
|
29
30
|
Spree::Bus.publish(:order_recalculated, order:)
|
|
30
31
|
persist_totals
|
|
@@ -43,15 +44,17 @@ module Spree
|
|
|
43
44
|
# pending when all Shipments are in the "pending" state
|
|
44
45
|
#
|
|
45
46
|
# The +shipment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
|
|
46
|
-
def
|
|
47
|
-
log_state_change(
|
|
47
|
+
def recalculate_shipment_state
|
|
48
|
+
log_state_change("shipment") do
|
|
48
49
|
order.shipment_state = determine_shipment_state
|
|
49
50
|
end
|
|
50
51
|
|
|
51
52
|
order.shipment_state
|
|
52
53
|
end
|
|
54
|
+
alias_method :update_shipment_state, :recalculate_shipment_state
|
|
55
|
+
deprecate update_shipment_state: :recalculate_shipment_state, deprecator: Spree.deprecator
|
|
53
56
|
|
|
54
|
-
#
|
|
57
|
+
# Recalculates the +payment_state+ attribute according to the following logic:
|
|
55
58
|
#
|
|
56
59
|
# paid when +payment_total+ is equal to +total+
|
|
57
60
|
# balance_due when +payment_total+ is less than +total+
|
|
@@ -60,40 +63,42 @@ module Spree
|
|
|
60
63
|
# void when the order has been canceled and the payment total is 0
|
|
61
64
|
#
|
|
62
65
|
# The +payment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
|
|
63
|
-
def
|
|
64
|
-
log_state_change(
|
|
66
|
+
def recalculate_payment_state
|
|
67
|
+
log_state_change("payment") do
|
|
65
68
|
order.payment_state = determine_payment_state
|
|
66
69
|
end
|
|
67
70
|
|
|
68
71
|
order.payment_state
|
|
69
72
|
end
|
|
73
|
+
alias_method :update_payment_state, :recalculate_payment_state
|
|
74
|
+
deprecate update_payment_state: :recalculate_payment_state, deprecator: Spree.deprecator
|
|
70
75
|
|
|
71
76
|
private
|
|
72
77
|
|
|
73
78
|
def determine_payment_state
|
|
74
79
|
if payments.present? && payments.valid.empty? && order.outstanding_balance != 0
|
|
75
|
-
|
|
76
|
-
elsif order.state ==
|
|
77
|
-
|
|
80
|
+
"failed"
|
|
81
|
+
elsif order.state == "canceled" && order.payment_total.zero?
|
|
82
|
+
"void"
|
|
78
83
|
elsif order.outstanding_balance > 0
|
|
79
|
-
|
|
84
|
+
"balance_due"
|
|
80
85
|
elsif order.outstanding_balance < 0
|
|
81
|
-
|
|
86
|
+
"credit_owed"
|
|
82
87
|
else
|
|
83
88
|
# outstanding_balance == 0
|
|
84
|
-
|
|
89
|
+
"paid"
|
|
85
90
|
end
|
|
86
91
|
end
|
|
87
92
|
|
|
88
93
|
def determine_shipment_state
|
|
89
94
|
if order.backordered?
|
|
90
|
-
|
|
95
|
+
"backorder"
|
|
91
96
|
else
|
|
92
97
|
# get all the shipment states for this order
|
|
93
98
|
shipment_states = shipments.states
|
|
94
99
|
if shipment_states.size > 1
|
|
95
100
|
# multiple shiment states means it's most likely partially shipped
|
|
96
|
-
|
|
101
|
+
"partial"
|
|
97
102
|
else
|
|
98
103
|
# will return nil if no shipments are found
|
|
99
104
|
shipment_states.first
|
|
@@ -106,7 +111,7 @@ module Spree
|
|
|
106
111
|
# fields (promo_total, included_tax_total, additional_tax_total, and
|
|
107
112
|
# adjustment_total) on the item.
|
|
108
113
|
# @return [void]
|
|
109
|
-
def
|
|
114
|
+
def update_adjustments
|
|
110
115
|
# Promotion adjustments must be applied first, then tax adjustments.
|
|
111
116
|
# This fits the criteria for VAT tax as outlined here:
|
|
112
117
|
# http://www.hmrc.gov.uk/vat/managing/charging/discounts-etc.htm#1
|
|
@@ -114,8 +119,10 @@ module Spree
|
|
|
114
119
|
# http://www.boe.ca.gov/formspubs/pub113/
|
|
115
120
|
update_promotions
|
|
116
121
|
update_tax_adjustments
|
|
117
|
-
|
|
122
|
+
recalculate_item_totals
|
|
118
123
|
end
|
|
124
|
+
alias_method :recalculate_adjustments, :update_adjustments
|
|
125
|
+
deprecate recalculate_adjustments: :update_adjustments, deprecator: Spree.deprecator
|
|
119
126
|
|
|
120
127
|
# Updates the following Order total values:
|
|
121
128
|
#
|
|
@@ -125,9 +132,9 @@ module Spree
|
|
|
125
132
|
# +promo_total+ The total value of all promotion adjustments
|
|
126
133
|
# +total+ The so-called "order total." This is equivalent to +item_total+ plus +adjustment_total+.
|
|
127
134
|
def update_totals
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
135
|
+
recalculate_payment_total
|
|
136
|
+
recalculate_item_total
|
|
137
|
+
recalculate_shipment_total
|
|
131
138
|
update_adjustment_total
|
|
132
139
|
end
|
|
133
140
|
|
|
@@ -140,23 +147,29 @@ module Spree
|
|
|
140
147
|
shipments.each(&:update_state)
|
|
141
148
|
end
|
|
142
149
|
|
|
143
|
-
def
|
|
150
|
+
def recalculate_payment_total
|
|
144
151
|
order.payment_total = payments.completed.includes(:refunds).sum { |payment| payment.amount - payment.refunds.sum(:amount) }
|
|
145
152
|
end
|
|
153
|
+
alias_method :update_payment_total, :recalculate_payment_total
|
|
154
|
+
deprecate update_payment_total: :recalculate_payment_total, deprecator: Spree.deprecator
|
|
146
155
|
|
|
147
|
-
def
|
|
156
|
+
def recalculate_shipment_total
|
|
148
157
|
order.shipment_total = shipments.to_a.sum(&:cost)
|
|
149
|
-
|
|
158
|
+
recalculate_order_total
|
|
150
159
|
end
|
|
160
|
+
alias_method :update_shipment_total, :recalculate_shipment_total
|
|
161
|
+
deprecate update_shipment_total: :recalculate_shipment_total, deprecator: Spree.deprecator
|
|
151
162
|
|
|
152
|
-
def
|
|
163
|
+
def recalculate_order_total
|
|
153
164
|
order.total = order.item_total + order.shipment_total + order.adjustment_total
|
|
154
165
|
end
|
|
166
|
+
alias_method :update_order_total, :recalculate_order_total
|
|
167
|
+
deprecate update_order_total: :recalculate_order_total, deprecator: Spree.deprecator
|
|
155
168
|
|
|
156
169
|
def update_adjustment_total
|
|
157
|
-
|
|
170
|
+
update_adjustments
|
|
158
171
|
|
|
159
|
-
all_items = line_items + shipments
|
|
172
|
+
all_items = (line_items + shipments).reject(&:marked_for_destruction?)
|
|
160
173
|
# Ignore any adjustments that have been marked for destruction in our
|
|
161
174
|
# calculations. They'll get removed when/if we persist the order.
|
|
162
175
|
valid_adjustments = adjustments.reject(&:marked_for_destruction?)
|
|
@@ -166,17 +179,21 @@ module Spree
|
|
|
166
179
|
order.included_tax_total = all_items.sum(&:included_tax_total) + order_tax_adjustments.select(&:included?).sum(&:amount)
|
|
167
180
|
order.additional_tax_total = all_items.sum(&:additional_tax_total) + order_tax_adjustments.reject(&:included?).sum(&:amount)
|
|
168
181
|
|
|
169
|
-
|
|
182
|
+
recalculate_order_total
|
|
170
183
|
end
|
|
171
184
|
|
|
172
|
-
def
|
|
185
|
+
def recalculate_item_count
|
|
173
186
|
order.item_count = line_items.to_a.sum(&:quantity)
|
|
174
187
|
end
|
|
188
|
+
alias_method :update_item_count, :recalculate_item_count
|
|
189
|
+
deprecate update_item_count: :recalculate_item_count, deprecator: Spree.deprecator
|
|
175
190
|
|
|
176
|
-
def
|
|
191
|
+
def recalculate_item_total
|
|
177
192
|
order.item_total = line_items.to_a.sum(&:amount)
|
|
178
|
-
|
|
193
|
+
recalculate_order_total
|
|
179
194
|
end
|
|
195
|
+
alias_method :update_item_total, :recalculate_item_total
|
|
196
|
+
deprecate update_item_total: :recalculate_item_total, deprecator: Spree.deprecator
|
|
180
197
|
|
|
181
198
|
def persist_totals
|
|
182
199
|
order.save!
|
|
@@ -210,20 +227,25 @@ module Spree
|
|
|
210
227
|
end
|
|
211
228
|
deprecate :update_cancellations, deprecator: Spree.deprecator
|
|
212
229
|
|
|
213
|
-
def
|
|
230
|
+
def recalculate_item_totals
|
|
214
231
|
[*line_items, *shipments].each do |item|
|
|
215
232
|
Spree::Config.item_total_class.new(item).recalculate!
|
|
216
233
|
|
|
217
234
|
next unless item.changed?
|
|
218
235
|
|
|
219
|
-
item.
|
|
220
|
-
promo_total:
|
|
221
|
-
included_tax_total:
|
|
236
|
+
item.assign_attributes(
|
|
237
|
+
promo_total: item.promo_total,
|
|
238
|
+
included_tax_total: item.included_tax_total,
|
|
222
239
|
additional_tax_total: item.additional_tax_total,
|
|
223
|
-
adjustment_total:
|
|
224
|
-
updated_at: Time.current,
|
|
240
|
+
adjustment_total: item.adjustment_total
|
|
225
241
|
)
|
|
226
242
|
end
|
|
227
243
|
end
|
|
244
|
+
|
|
245
|
+
def recalculate_line_item_prices
|
|
246
|
+
if Spree::Config.recalculate_cart_prices
|
|
247
|
+
line_items.each(&:recalculate_price)
|
|
248
|
+
end
|
|
249
|
+
end
|
|
228
250
|
end
|
|
229
251
|
end
|
|
@@ -8,7 +8,7 @@ module Spree
|
|
|
8
8
|
# creating a refund about the full amount instead.
|
|
9
9
|
#
|
|
10
10
|
class Cancellation
|
|
11
|
-
DEFAULT_REASON =
|
|
11
|
+
DEFAULT_REASON = "Order canceled"
|
|
12
12
|
|
|
13
13
|
attr_reader :reason
|
|
14
14
|
|
|
@@ -26,7 +26,7 @@ module Spree
|
|
|
26
26
|
# @param payment [Spree::Payment] - the payment that should be canceled
|
|
27
27
|
#
|
|
28
28
|
def cancel(payment)
|
|
29
|
-
if response = payment.payment_method.try_void(payment)
|
|
29
|
+
if (response = payment.payment_method.try_void(payment))
|
|
30
30
|
payment.handle_void_response(response)
|
|
31
31
|
else
|
|
32
32
|
payment.refunds.create!(amount: payment.credit_allowed, reason: refund_reason).perform!
|
|
@@ -43,7 +43,7 @@ module Spree
|
|
|
43
43
|
response = payment_method.authorize(
|
|
44
44
|
money.money.cents,
|
|
45
45
|
source,
|
|
46
|
-
gateway_options
|
|
46
|
+
gateway_options
|
|
47
47
|
)
|
|
48
48
|
pend! if handle_response(response)
|
|
49
49
|
end
|
|
@@ -59,7 +59,7 @@ module Spree
|
|
|
59
59
|
response = payment_method.purchase(
|
|
60
60
|
money.money.cents,
|
|
61
61
|
source,
|
|
62
|
-
gateway_options
|
|
62
|
+
gateway_options
|
|
63
63
|
)
|
|
64
64
|
complete! if handle_response(response)
|
|
65
65
|
end
|
|
@@ -95,13 +95,13 @@ module Spree
|
|
|
95
95
|
return false unless amount.positive?
|
|
96
96
|
|
|
97
97
|
protect_from_connection_error do
|
|
98
|
-
if payment_method.payment_profiles_supported?
|
|
98
|
+
response = if payment_method.payment_profiles_supported?
|
|
99
99
|
# Gateways supporting payment profiles will need access to credit card object because this stores the payment profile information
|
|
100
100
|
# so supply the authorization itself as well as the credit card, rather than just the authorization code
|
|
101
|
-
|
|
101
|
+
payment_method.void(response_code, source, gateway_options)
|
|
102
102
|
else
|
|
103
103
|
# Standard ActiveMerchant void usage
|
|
104
|
-
|
|
104
|
+
payment_method.void(response_code, gateway_options)
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
handle_void_response(response)
|
|
@@ -170,12 +170,12 @@ module Spree
|
|
|
170
170
|
return unless payment_method.source_required?
|
|
171
171
|
|
|
172
172
|
unless source
|
|
173
|
-
gateway_error(I18n.t(
|
|
173
|
+
gateway_error(I18n.t("spree.payment_processing_failed"))
|
|
174
174
|
end
|
|
175
175
|
|
|
176
176
|
unless payment_method.supports?(source)
|
|
177
177
|
invalidate!
|
|
178
|
-
gateway_error(I18n.t(
|
|
178
|
+
gateway_error(I18n.t("spree.payment_method_not_supported"))
|
|
179
179
|
end
|
|
180
180
|
|
|
181
181
|
true
|
|
@@ -194,11 +194,11 @@ module Spree
|
|
|
194
194
|
|
|
195
195
|
unless response.authorization.nil?
|
|
196
196
|
self.response_code = response.authorization
|
|
197
|
-
self.avs_response = response.avs_result[
|
|
197
|
+
self.avs_response = response.avs_result["code"]
|
|
198
198
|
|
|
199
199
|
if response.cvv_result
|
|
200
|
-
self.cvv_response_code = response.cvv_result[
|
|
201
|
-
self.cvv_response_message = response.cvv_result[
|
|
200
|
+
self.cvv_response_code = response.cvv_result["code"]
|
|
201
|
+
self.cvv_response_message = response.cvv_result["message"]
|
|
202
202
|
end
|
|
203
203
|
end
|
|
204
204
|
|
|
@@ -217,18 +217,18 @@ module Spree
|
|
|
217
217
|
|
|
218
218
|
def gateway_error(error)
|
|
219
219
|
message, log = case error
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
logger.error("#{I18n.t(
|
|
220
|
+
when ActiveMerchant::Billing::Response
|
|
221
|
+
[
|
|
222
|
+
error.params["message"] || error.params["response_reason_text"] || error.message,
|
|
223
|
+
basic_response_info(error)
|
|
224
|
+
]
|
|
225
|
+
when ActiveMerchant::ConnectionError
|
|
226
|
+
[I18n.t("spree.unable_to_connect_to_gateway")] * 2
|
|
227
|
+
else
|
|
228
|
+
[error.to_s, error]
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
logger.error("#{I18n.t("spree.gateway_error")}: #{log}")
|
|
232
232
|
raise Core::GatewayError.new(message)
|
|
233
233
|
end
|
|
234
234
|
|
data/app/models/spree/payment.rb
CHANGED
|
@@ -9,17 +9,17 @@ module Spree
|
|
|
9
9
|
include Spree::Payment::Processing
|
|
10
10
|
include Metadata
|
|
11
11
|
|
|
12
|
-
IDENTIFIER_CHARS
|
|
13
|
-
NON_RISKY_AVS_CODES = [
|
|
14
|
-
RISKY_AVS_CODES
|
|
12
|
+
IDENTIFIER_CHARS = (("A".."Z").to_a + ("0".."9").to_a - %w[0 1 I O]).freeze
|
|
13
|
+
NON_RISKY_AVS_CODES = ["B", "D", "H", "J", "M", "Q", "T", "V", "X", "Y"].freeze
|
|
14
|
+
RISKY_AVS_CODES = ["A", "C", "E", "F", "G", "I", "K", "L", "N", "O", "P", "R", "S", "U", "W", "Z"].freeze
|
|
15
15
|
|
|
16
|
-
belongs_to :order, class_name:
|
|
16
|
+
belongs_to :order, class_name: "Spree::Order", touch: true, inverse_of: :payments, optional: true
|
|
17
17
|
belongs_to :source, polymorphic: true, optional: true
|
|
18
|
-
belongs_to :payment_method, -> { with_discarded }, class_name:
|
|
18
|
+
belongs_to :payment_method, -> { with_discarded }, class_name: "Spree::PaymentMethod", inverse_of: :payments, optional: true
|
|
19
19
|
|
|
20
20
|
has_many :log_entries, as: :source
|
|
21
21
|
has_many :state_changes, as: :stateful
|
|
22
|
-
has_many :capture_events, class_name:
|
|
22
|
+
has_many :capture_events, class_name: "Spree::PaymentCaptureEvent"
|
|
23
23
|
has_many :refunds, inverse_of: :payment
|
|
24
24
|
|
|
25
25
|
before_validation :validate_source, unless: :invalid?
|
|
@@ -43,17 +43,17 @@ module Spree
|
|
|
43
43
|
|
|
44
44
|
default_scope -> { order(:created_at) }
|
|
45
45
|
|
|
46
|
-
scope :from_credit_card, -> { where(source_type:
|
|
46
|
+
scope :from_credit_card, -> { where(source_type: "Spree::CreditCard") }
|
|
47
47
|
scope :with_state, ->(state) { where(state: state.to_s) }
|
|
48
48
|
|
|
49
|
-
scope :checkout, -> { with_state(
|
|
50
|
-
scope :completed, -> { with_state(
|
|
51
|
-
scope :pending, -> { with_state(
|
|
52
|
-
scope :processing, -> { with_state(
|
|
53
|
-
scope :failed, -> { with_state(
|
|
49
|
+
scope :checkout, -> { with_state("checkout") }
|
|
50
|
+
scope :completed, -> { with_state("completed") }
|
|
51
|
+
scope :pending, -> { with_state("pending") }
|
|
52
|
+
scope :processing, -> { with_state("processing") }
|
|
53
|
+
scope :failed, -> { with_state("failed") }
|
|
54
54
|
|
|
55
|
-
scope :risky, -> { failed.or(where(avs_response: RISKY_AVS_CODES)).or(where.not(cvv_response_code: [nil,
|
|
56
|
-
scope :valid, -> { where.not(state: %w
|
|
55
|
+
scope :risky, -> { failed.or(where(avs_response: RISKY_AVS_CODES)).or(where.not(cvv_response_code: [nil, "", "M"])) }
|
|
56
|
+
scope :valid, -> { where.not(state: %w[failed invalid void]) }
|
|
57
57
|
|
|
58
58
|
scope :store_credits, -> { where(source_type: Spree::StoreCredit.to_s) }
|
|
59
59
|
scope :not_store_credits, -> { where(arel_table[:source_type].not_eq(Spree::StoreCredit.to_s).or(arel_table[:source_type].eq(nil))) }
|
|
@@ -70,9 +70,9 @@ module Spree
|
|
|
70
70
|
|
|
71
71
|
# @return [Spree::Money] this amount of this payment as money object
|
|
72
72
|
def money
|
|
73
|
-
Spree::Money.new(amount, {
|
|
73
|
+
Spree::Money.new(amount, {currency:})
|
|
74
74
|
end
|
|
75
|
-
|
|
75
|
+
alias_method :display_amount, :money
|
|
76
76
|
|
|
77
77
|
# Sets the amount, parsing it based on i18n settings if it is a string.
|
|
78
78
|
#
|
|
@@ -81,8 +81,8 @@ module Spree
|
|
|
81
81
|
self[:amount] =
|
|
82
82
|
case amount
|
|
83
83
|
when String
|
|
84
|
-
separator = I18n.t(
|
|
85
|
-
number
|
|
84
|
+
separator = I18n.t("number.currency.format.separator")
|
|
85
|
+
number = amount.delete("^0-9-#{separator}.").tr(separator, ".")
|
|
86
86
|
number.presence&.to_d
|
|
87
87
|
end || amount
|
|
88
88
|
end
|
|
@@ -119,7 +119,7 @@ module Spree
|
|
|
119
119
|
|
|
120
120
|
# @return [Boolean] true when this payment is risky
|
|
121
121
|
def risky?
|
|
122
|
-
is_avs_risky? || is_cvv_risky? || state ==
|
|
122
|
+
is_avs_risky? || is_cvv_risky? || state == "failed"
|
|
123
123
|
end
|
|
124
124
|
|
|
125
125
|
# @return [Boolean] true when this payment is risky based on address
|
|
@@ -153,7 +153,7 @@ module Spree
|
|
|
153
153
|
private
|
|
154
154
|
|
|
155
155
|
def source_actions
|
|
156
|
-
return [] unless payment_source
|
|
156
|
+
return [] unless payment_source&.respond_to?(:actions)
|
|
157
157
|
payment_source.actions.select { |action| !payment_source.respond_to?("can_#{action}?") || payment_source.send("can_#{action}?", self) }
|
|
158
158
|
end
|
|
159
159
|
|
|
@@ -161,7 +161,7 @@ module Spree
|
|
|
161
161
|
if source && !source.valid?
|
|
162
162
|
source.errors.each do |error|
|
|
163
163
|
field_name = I18n.t("activerecord.attributes.#{source.class.to_s.underscore}.#{error.attribute}")
|
|
164
|
-
errors.add(I18n.t(source.class.to_s.demodulize.underscore, scope:
|
|
164
|
+
errors.add(I18n.t(source.class.to_s.demodulize.underscore, scope: "spree"), "#{field_name} #{error.message}")
|
|
165
165
|
end
|
|
166
166
|
end
|
|
167
167
|
if errors.any?
|
|
@@ -179,7 +179,7 @@ module Spree
|
|
|
179
179
|
|
|
180
180
|
def create_payment_profile
|
|
181
181
|
# Don't attempt to create on bad payments.
|
|
182
|
-
return if %w
|
|
182
|
+
return if %w[invalid failed].include?(state)
|
|
183
183
|
# Payment profile cannot be created without source
|
|
184
184
|
return unless source
|
|
185
185
|
# Imported payments shouldn't create a payment profile.
|
|
@@ -191,9 +191,9 @@ module Spree
|
|
|
191
191
|
end
|
|
192
192
|
|
|
193
193
|
def invalidate_old_payments
|
|
194
|
-
if !store_credit? && ![
|
|
194
|
+
if !store_credit? && !["invalid", "failed"].include?(state)
|
|
195
195
|
order.payments.select { |payment|
|
|
196
|
-
payment.state ==
|
|
196
|
+
payment.state == "checkout" && !payment.store_credit? && payment.id != id
|
|
197
197
|
}.each(&:invalidate!)
|
|
198
198
|
end
|
|
199
199
|
end
|
|
@@ -217,7 +217,7 @@ module Spree
|
|
|
217
217
|
end
|
|
218
218
|
|
|
219
219
|
def generate_identifier
|
|
220
|
-
Array.new(8){ IDENTIFIER_CHARS.sample }.join
|
|
220
|
+
Array.new(8) { IDENTIFIER_CHARS.sample }.join
|
|
221
221
|
end
|
|
222
222
|
|
|
223
223
|
def create_eligible_credit_event
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
module Spree
|
|
4
4
|
class PaymentCaptureEvent < Spree::Base
|
|
5
|
-
belongs_to :payment, class_name:
|
|
5
|
+
belongs_to :payment, class_name: "Spree::Payment", optional: true
|
|
6
6
|
|
|
7
7
|
def display_amount
|
|
8
|
-
Spree::Money.new(amount, {
|
|
8
|
+
Spree::Money.new(amount, {currency: payment.currency})
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
end
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
module Spree
|
|
4
4
|
class PaymentMethod::BogusCreditCard < PaymentMethod::CreditCard
|
|
5
|
-
TEST_VISA = [
|
|
6
|
-
TEST_MC
|
|
7
|
-
TEST_AMEX = [
|
|
8
|
-
TEST_DISC = [
|
|
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
9
|
|
|
10
|
-
VALID_CCS = [
|
|
10
|
+
VALID_CCS = ["1", TEST_VISA, TEST_MC, TEST_AMEX, TEST_DISC].flatten
|
|
11
11
|
|
|
12
|
-
AUTHORIZATION_CODE =
|
|
13
|
-
FAILURE_MESSAGE =
|
|
14
|
-
SUCCESS_MESSAGE =
|
|
12
|
+
AUTHORIZATION_CODE = "12345"
|
|
13
|
+
FAILURE_MESSAGE = "Bogus Gateway: Forced failure"
|
|
14
|
+
SUCCESS_MESSAGE = "Bogus Gateway: Forced success"
|
|
15
15
|
|
|
16
16
|
attr_accessor :test
|
|
17
17
|
|
|
@@ -22,7 +22,7 @@ module Spree
|
|
|
22
22
|
def create_profile(payment)
|
|
23
23
|
return if payment.source.has_payment_profile?
|
|
24
24
|
# simulate the storage of credit card profile using remote service
|
|
25
|
-
if success = VALID_CCS.include?(payment.source.number)
|
|
25
|
+
if (success = VALID_CCS.include?(payment.source.number))
|
|
26
26
|
payment.source.update(gateway_customer_profile_id: generate_profile_id(success))
|
|
27
27
|
end
|
|
28
28
|
end
|
|
@@ -30,18 +30,18 @@ module Spree
|
|
|
30
30
|
def authorize(_money, credit_card, _options = {})
|
|
31
31
|
profile_id = credit_card.gateway_customer_profile_id
|
|
32
32
|
message_detail = " - #{__method__}"
|
|
33
|
-
if VALID_CCS.include?(credit_card.number) ||
|
|
34
|
-
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: {
|
|
33
|
+
if VALID_CCS.include?(credit_card.number) || profile_id&.starts_with?("BGS-")
|
|
34
|
+
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: {code: "D"})
|
|
35
35
|
else
|
|
36
|
-
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE + message_detail, {
|
|
36
|
+
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE + message_detail, {message: FAILURE_MESSAGE + message_detail}, test: true)
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def purchase(_money, credit_card, _options = {})
|
|
41
41
|
profile_id = credit_card.gateway_customer_profile_id
|
|
42
42
|
message_detail = " - #{__method__}"
|
|
43
|
-
if VALID_CCS.include?(credit_card.number) ||
|
|
44
|
-
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: {
|
|
43
|
+
if VALID_CCS.include?(credit_card.number) || profile_id&.starts_with?("BGS-")
|
|
44
|
+
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: {code: "M"})
|
|
45
45
|
else
|
|
46
46
|
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE + message_detail, message: FAILURE_MESSAGE + message_detail, test: true)
|
|
47
47
|
end
|
|
@@ -54,7 +54,7 @@ module Spree
|
|
|
54
54
|
|
|
55
55
|
def capture(_money, authorization, _gateway_options)
|
|
56
56
|
message_detail = " - #{__method__}"
|
|
57
|
-
if authorization ==
|
|
57
|
+
if authorization == "12345"
|
|
58
58
|
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true)
|
|
59
59
|
else
|
|
60
60
|
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE + message_detail, error: FAILURE_MESSAGE + message_detail, test: true)
|
|
@@ -80,16 +80,16 @@ module Spree
|
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
def actions
|
|
83
|
-
%w
|
|
83
|
+
%w[capture void credit]
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
private
|
|
87
87
|
|
|
88
88
|
def generate_profile_id(success)
|
|
89
89
|
record = true
|
|
90
|
-
prefix = success ?
|
|
90
|
+
prefix = success ? "BGS" : "FAIL"
|
|
91
91
|
while record
|
|
92
|
-
random = "#{prefix}-#{Array.new(6){ rand(6) }.join}"
|
|
92
|
+
random = "#{prefix}-#{Array.new(6) { rand(6) }.join}"
|
|
93
93
|
record = Spree::CreditCard.where(gateway_customer_profile_id: random).first
|
|
94
94
|
end
|
|
95
95
|
random
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
module Spree
|
|
4
4
|
class PaymentMethod::Check < PaymentMethod
|
|
5
5
|
def actions
|
|
6
|
-
%w
|
|
6
|
+
%w[capture void credit]
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
# Indicates whether its possible to capture the payment
|
|
10
10
|
def can_capture?(payment)
|
|
11
|
-
[
|
|
11
|
+
["checkout", "pending"].include?(payment.state)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
# Indicates whether its possible to void the payment.
|
|
15
15
|
def can_void?(payment)
|
|
16
|
-
payment.state !=
|
|
16
|
+
payment.state != "void"
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def capture(*)
|
|
@@ -11,9 +11,9 @@ module Spree
|
|
|
11
11
|
message_detail = " - #{__method__}"
|
|
12
12
|
|
|
13
13
|
if VALID_CCS.include? credit_card.number
|
|
14
|
-
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: {
|
|
14
|
+
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: {code: "A"})
|
|
15
15
|
else
|
|
16
|
-
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE + message_detail, {
|
|
16
|
+
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE + message_detail, {message: FAILURE_MESSAGE}, test: true)
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
@@ -21,7 +21,7 @@ module Spree
|
|
|
21
21
|
message_detail = " - #{__method__}"
|
|
22
22
|
|
|
23
23
|
if VALID_CCS.include? credit_card.number
|
|
24
|
-
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: {
|
|
24
|
+
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE + message_detail, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: {code: "A"})
|
|
25
25
|
else
|
|
26
26
|
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE + message_detail, message: FAILURE_MESSAGE, test: true)
|
|
27
27
|
end
|