diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index ae82ac9a49..aa08cca513 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -30,7 +30,7 @@ module Spree go_to_state :complete end - attr_accessor :use_billing, :checkout_processing + attr_accessor :use_billing, :checkout_processing, :save_bill_address, :save_ship_address token_resource @@ -104,6 +104,8 @@ module Spree before_save :update_shipping_fees!, if: :complete? before_save :update_payment_fees!, if: :complete? + after_save_commit DefaultAddressUpdater + # -- Scopes scope :not_empty, -> { left_outer_joins(:line_items).where.not(spree_line_items: { id: nil }) diff --git a/app/services/checkout/params.rb b/app/services/checkout/params.rb index eaa0a0c815..10715c8acc 100644 --- a/app/services/checkout/params.rb +++ b/app/services/checkout/params.rb @@ -24,6 +24,7 @@ module Checkout def apply_strong_parameters @order_params = params.require(:order).permit( :email, :shipping_method_id, :special_instructions, :existing_card_id, + :save_bill_address, :save_ship_address, bill_address_attributes: ::PermittedAttributes::Address.attributes, ship_address_attributes: ::PermittedAttributes::Address.attributes, payments_attributes: [ diff --git a/app/services/default_address_updater.rb b/app/services/default_address_updater.rb new file mode 100644 index 0000000000..89868373d7 --- /dev/null +++ b/app/services/default_address_updater.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +class DefaultAddressUpdater + def self.after_commit(order) + return unless order.save_bill_address || order.save_ship_address + + new(order).call + end + + def initialize(order) + @order = order + end + + def call + assign_bill_addresses + assign_ship_addresses + + customer.save + user&.save + end + + private + + attr_reader :order + + delegate :save_ship_address, :save_bill_address, :customer, :user, + :bill_address_id, :ship_address_id, to: :order + + def assign_bill_addresses + return unless save_bill_address + + customer.bill_address_id = bill_address_id + user&.bill_address_id = bill_address_id + end + + def assign_ship_addresses + return unless save_ship_address + + customer.ship_address_id = ship_address_id + user&.ship_address_id = ship_address_id + end +end diff --git a/app/views/split_checkout/_details.html.haml b/app/views/split_checkout/_details.html.haml index 4e0be37ac9..011e016fe7 100644 --- a/app/views/split_checkout/_details.html.haml +++ b/app/views/split_checkout/_details.html.haml @@ -60,8 +60,8 @@ - if spree_current_user||true %div.checkout-input - = f.check_box :checkout_default_bill_address - = f.label :checkout_default_bill_address, t(:checkout_default_bill_address) + = f.check_box :save_bill_address + = f.label :save_bill_address, t(:checkout_default_bill_address) %div.checkout-substep{ "data-controller": "toggle shippingmethod" } - selected_shipping_method = @order.shipping_method&.id || params[:shipping_method_id] @@ -136,8 +136,8 @@ - if spree_current_user %div.checkout-input{ "data-toggle-target": "content", style: "display: none" } - = f.check_box :default_ship_address, { id: "default_ship_address", name: "default_ship_address" } - = f.label :default_ship_address, t(:checkout_default_ship_address), { for: "default_ship_address" } + = f.check_box :save_ship_address + = f.label :save_ship_address, t(:checkout_default_ship_address) .div.checkout-input = f.label :special_instructions, t(:checkout_instructions) diff --git a/spec/controllers/split_checkout_controller_spec.rb b/spec/controllers/split_checkout_controller_spec.rb index 92f8cba389..9c8963a349 100644 --- a/spec/controllers/split_checkout_controller_spec.rb +++ b/spec/controllers/split_checkout_controller_spec.rb @@ -82,6 +82,22 @@ describe SplitCheckoutController, type: :controller do expect(response).to redirect_to checkout_step_path(:payment) expect(order.reload.state).to eq "payment" end + + describe "saving default addresses" do + it "updates default bill address on user and customer" do + put :update, params: params.merge({ order: { save_bill_address: true } }) + + expect(order.customer.bill_address).to eq(order.bill_address) + expect(order.user.bill_address).to eq(order.bill_address) + end + + it "updates default ship address on user and customer" do + put :update, params: params.merge({ order: { save_ship_address: true } }) + + expect(order.customer.ship_address).to eq(order.ship_address) + expect(order.user.ship_address).to eq(order.ship_address) + end + end end end