From 21d905a0927ac0117639d2a3a4e85a0459c319a4 Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Fri, 8 Jun 2018 11:31:57 +0200 Subject: [PATCH] Refactor OrderUpdater to decorate Spree's one This replaces the nasty class eval and provides some encapsulation --- app/models/order_updater.rb | 41 +++++++++++++++++++ app/models/spree/order_updater_decorator.rb | 41 ------------------- spec/models/{spree => }/order_updater_spec.rb | 4 +- 3 files changed, 43 insertions(+), 43 deletions(-) create mode 100644 app/models/order_updater.rb delete mode 100644 app/models/spree/order_updater_decorator.rb rename spec/models/{spree => }/order_updater_spec.rb (96%) diff --git a/app/models/order_updater.rb b/app/models/order_updater.rb new file mode 100644 index 0000000000..9b41145ea3 --- /dev/null +++ b/app/models/order_updater.rb @@ -0,0 +1,41 @@ +require 'delegate' + +class OrderUpdater < SimpleDelegator + # TODO: This logic adapted from Spree 2.4, remove when we get there + # Handles state updating in a much more logical way than < 2.4 + # Specifically, doesn't depend on payments.last to determine payment state + # Also swapped: == 0 for .zero?, .size == 0 for empty? and .size > 0 for !empty? + # See: + # https://github.com/spree/spree/commit/38b8456183d11fc1e00e395e7c9154c76ef65b85 + # https://github.com/spree/spree/commit/7b264acff7824f5b3dc6651c106631d8f30b147a + def update_payment_state + last_state = order.payment_state + if payments.present? && payments.valid.empty? + order.payment_state = 'failed' + elsif order.state == 'canceled' && order.payment_total.zero? + order.payment_state = 'void' + else + # This part added so that we don't need to override order.outstanding_balance + balance = order.outstanding_balance + balance = -1 * order.payment_total if canceled_and_paid_for? + order.payment_state = 'balance_due' if balance > 0 + order.payment_state = 'credit_owed' if balance < 0 + order.payment_state = 'paid' if balance.zero? + + # Original logic + # order.payment_state = 'balance_due' if order.outstanding_balance > 0 + # order.payment_state = 'credit_owed' if order.outstanding_balance < 0 + # order.payment_state = 'paid' if !order.outstanding_balance? + end + order.state_changed('payment') if last_state != order.payment_state + order.payment_state + end + + private + + # Taken from order.outstanding_balance in Spree 2.4 + # See: https://github.com/spree/spree/commit/7b264acff7824f5b3dc6651c106631d8f30b147a + def canceled_and_paid_for? + order.canceled? && order.payments.present? && !order.payments.completed.empty? + end +end diff --git a/app/models/spree/order_updater_decorator.rb b/app/models/spree/order_updater_decorator.rb deleted file mode 100644 index ab1d4eaf26..0000000000 --- a/app/models/spree/order_updater_decorator.rb +++ /dev/null @@ -1,41 +0,0 @@ -module Spree - OrderUpdater.class_eval do - # TODO: This logic adapted from Spree 2.4, remove when we get there - # Handles state updating in a much more logical way than < 2.4 - # Specifically, doesn't depend on payments.last to determine payment state - # Also swapped: == 0 for .zero?, .size == 0 for empty? and .size > 0 for !empty? - # See: - # https://github.com/spree/spree/commit/38b8456183d11fc1e00e395e7c9154c76ef65b85 - # https://github.com/spree/spree/commit/7b264acff7824f5b3dc6651c106631d8f30b147a - def update_payment_state - last_state = order.payment_state - if payments.present? && payments.valid.empty? - order.payment_state = 'failed' - elsif order.state == 'canceled' && order.payment_total.zero? - order.payment_state = 'void' - else - # This part added so that we don't need to override order.outstanding_balance - balance = order.outstanding_balance - balance = -1 * order.payment_total if canceled_and_paid_for? - order.payment_state = 'balance_due' if balance > 0 - order.payment_state = 'credit_owed' if balance < 0 - order.payment_state = 'paid' if balance.zero? - - # Original logic - # order.payment_state = 'balance_due' if order.outstanding_balance > 0 - # order.payment_state = 'credit_owed' if order.outstanding_balance < 0 - # order.payment_state = 'paid' if !order.outstanding_balance? - end - order.state_changed('payment') if last_state != order.payment_state - order.payment_state - end - - private - - # Taken from order.outstanding_balance in Spree 2.4 - # See: https://github.com/spree/spree/commit/7b264acff7824f5b3dc6651c106631d8f30b147a - def canceled_and_paid_for? - order.canceled? && order.payments.present? && !order.payments.completed.empty? - end - end -end diff --git a/spec/models/spree/order_updater_spec.rb b/spec/models/order_updater_spec.rb similarity index 96% rename from spec/models/spree/order_updater_spec.rb rename to spec/models/order_updater_spec.rb index 1fc13f11e3..217a5dd491 100644 --- a/spec/models/spree/order_updater_spec.rb +++ b/spec/models/order_updater_spec.rb @@ -1,9 +1,9 @@ require 'spec_helper' -describe Spree::OrderUpdater do +describe OrderUpdater do context "#updating_payment_state" do let(:order) { build(:order) } - let(:order_updater) { described_class.new(order) } + let(:order_updater) { described_class.new(Spree::OrderUpdater.new(order)) } it "is failed if no valid payments" do allow(order).to receive_message_chain(:payments, :valid, :empty?) { true }