From 358edb47272e6e82198b57a2048df02ec05da7f3 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley Date: Sat, 3 Mar 2018 23:28:10 +0000 Subject: [PATCH] Disable guest checkout in model --- app/models/spree/order_decorator.rb | 13 +++++++++++++ spec/models/spree/order_spec.rb | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/app/models/spree/order_decorator.rb b/app/models/spree/order_decorator.rb index 0228586327..1c0248c9b1 100644 --- a/app/models/spree/order_decorator.rb +++ b/app/models/spree/order_decorator.rb @@ -17,6 +17,7 @@ Spree::Order.class_eval do validates :customer, presence: true, if: :require_customer? validate :products_available_from_new_distribution, :if => lambda { distributor_id_changed? || order_cycle_id_changed? } + validate :disallow_guest_order, if: lambda { using_guest_checkout? && registered_email? } attr_accessible :order_cycle_id, :distributor_id, :customer_id before_validation :shipping_address_from_distributor @@ -82,6 +83,18 @@ Spree::Order.class_eval do errors.add(:base, I18n.t(:spree_order_availability_error)) unless DistributionChangeValidator.new(self).can_change_to_distribution?(distributor, order_cycle) end + def using_guest_checkout? + require_email && !user.andand.id + end + + def registered_email? + Spree.user_class.find_by_email(email).present? + end + + def disallow_guest_order + errors.add(:base, I18n.t('devise.failure.already_registered')) + end + def empty_with_clear_shipping_and_payments! empty_without_clear_shipping_and_payments! payments.clear diff --git a/spec/models/spree/order_spec.rb b/spec/models/spree/order_spec.rb index d872e90ddb..345cbb661f 100644 --- a/spec/models/spree/order_spec.rb +++ b/spec/models/spree/order_spec.rb @@ -673,6 +673,28 @@ describe Spree::Order do end end + describe "when a guest order is placed with a registered email" do + let(:order) { create(:order_with_totals_and_distribution, user: nil) } + let(:payment_method) { create(:payment_method, distributors: [order.distributor]) } + let(:shipping_method) { create(:shipping_method, distributors: [order.distributor]) } + let(:user) { create(:user, email: 'registered@email.com') } + + before do + order.bill_address = create(:address) + order.ship_address = create(:address) + order.shipping_method = shipping_method + order.email = user.email + order.user = nil + order.state = 'cart' + end + + it "returns a validation error" do + expect{order.next}.to change(order.errors, :count).from(0).to(1) + expect(order.errors.messages[:base]).to eq [ I18n.t('devise.failure.already_registered') ] + expect(order.state).to eq 'cart' + end + end + describe "a completed order with shipping and transaction fees" do let(:distributor) { create(:distributor_enterprise, charges_sales_tax: true, allow_order_changes: true) } let(:order) { create(:completed_order_with_fees, distributor: distributor, shipping_fee: shipping_fee, payment_fee: payment_fee) }