From 8f37aa71f2da47ac6a8da4762e6edaacac0bb5ae Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sat, 15 Jan 2022 23:03:31 +0000 Subject: [PATCH 1/3] Save default addresses when requested during checkout --- app/models/spree/order.rb | 21 ++++++++++++++++++- app/services/checkout/params.rb | 1 + app/views/split_checkout/_details.html.haml | 8 +++---- .../split_checkout_controller_spec.rb | 16 ++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index ae82ac9a49..2bcc58eee6 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 :save_default_addresses + # -- Scopes scope :not_empty, -> { left_outer_joins(:line_items).where.not(spree_line_items: { id: nil }) @@ -743,5 +745,22 @@ module Spree pending_payments.first.update_attribute :amount, total end + + def save_default_addresses + return unless save_bill_address || save_ship_address + + if save_bill_address + customer.bill_address_id = bill_address_id + user&.bill_address_id = bill_address_id + end + + if save_ship_address + customer.ship_address_id = ship_address_id + user&.ship_address_id = ship_address_id + end + + customer.save + user&.save + end end end 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/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 From 8a944e3e7823bd53edd21313523632700fe2be59 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 18 Jan 2022 09:41:35 +0000 Subject: [PATCH 2/3] Tidy up Order#save_default_addresses --- app/models/spree/order.rb | 13 +-------- app/services/default_address_updater.rb | 36 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 app/services/default_address_updater.rb diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 2bcc58eee6..8c33b8d759 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -749,18 +749,7 @@ module Spree def save_default_addresses return unless save_bill_address || save_ship_address - if save_bill_address - customer.bill_address_id = bill_address_id - user&.bill_address_id = bill_address_id - end - - if save_ship_address - customer.ship_address_id = ship_address_id - user&.ship_address_id = ship_address_id - end - - customer.save - user&.save + DefaultAddressUpdater.new(self).call end end end diff --git a/app/services/default_address_updater.rb b/app/services/default_address_updater.rb new file mode 100644 index 0000000000..57f219e746 --- /dev/null +++ b/app/services/default_address_updater.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class DefaultAddressUpdater + 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 From 2b960a04c6a5a9596b1d873e567b6cbb6d6175ca Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 19 Jan 2022 10:12:27 +0000 Subject: [PATCH 3/3] Move Order callback entirely into service --- app/models/spree/order.rb | 8 +------- app/services/default_address_updater.rb | 6 ++++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 8c33b8d759..aa08cca513 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -104,7 +104,7 @@ module Spree before_save :update_shipping_fees!, if: :complete? before_save :update_payment_fees!, if: :complete? - after_save_commit :save_default_addresses + after_save_commit DefaultAddressUpdater # -- Scopes scope :not_empty, -> { @@ -745,11 +745,5 @@ module Spree pending_payments.first.update_attribute :amount, total end - - def save_default_addresses - return unless save_bill_address || save_ship_address - - DefaultAddressUpdater.new(self).call - end end end diff --git a/app/services/default_address_updater.rb b/app/services/default_address_updater.rb index 57f219e746..89868373d7 100644 --- a/app/services/default_address_updater.rb +++ b/app/services/default_address_updater.rb @@ -1,6 +1,12 @@ # 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