From 12158d73fa418082f4f1c8b8d64add4bce65adb1 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Wed, 27 Nov 2019 21:47:46 +0000 Subject: [PATCH 01/10] Add payments_controller from spree_backend so that we can now merge it with the OFN's decorator --- .../spree/admin/payments_controller.rb | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 app/controllers/spree/admin/payments_controller.rb diff --git a/app/controllers/spree/admin/payments_controller.rb b/app/controllers/spree/admin/payments_controller.rb new file mode 100644 index 0000000000..3e73885eca --- /dev/null +++ b/app/controllers/spree/admin/payments_controller.rb @@ -0,0 +1,112 @@ +module Spree + module Admin + class PaymentsController < Spree::Admin::BaseController + before_filter :load_order, :only => [:create, :new, :index, :fire] + before_filter :load_payment, :except => [:create, :new, :index] + before_filter :load_data + before_filter :can_transition_to_payment + + respond_to :html + + def index + @payments = @order.payments + redirect_to new_admin_order_payment_url(@order) if @payments.empty? + end + + def new + @payment = @order.payments.build + end + + def create + @payment = @order.payments.build(object_params) + if @payment.payment_method.is_a?(Spree::Gateway) && @payment.payment_method.payment_profiles_supported? && params[:card].present? and params[:card] != 'new' + @payment.source = CreditCard.find_by_id(params[:card]) + end + + begin + unless @payment.save + redirect_to admin_order_payments_path(@order) + return + end + + if @order.completed? + @payment.process! + flash[:success] = flash_message_for(@payment, :successfully_created) + + redirect_to admin_order_payments_path(@order) + else + #This is the first payment (admin created order) + until @order.completed? + @order.next! + end + flash[:success] = Spree.t(:new_order_completed) + redirect_to edit_admin_order_url(@order) + end + + rescue Spree::Core::GatewayError => e + flash[:error] = "#{e.message}" + redirect_to new_admin_order_payment_path(@order) + end + end + + def fire + return unless event = params[:e] and @payment.payment_source + + # Because we have a transition method also called void, we do this to avoid conflicts. + event = "void_transaction" if event == "void" + if @payment.send("#{event}!") + flash[:success] = Spree.t(:payment_updated) + else + flash[:error] = Spree.t(:cannot_perform_operation) + end + rescue Spree::Core::GatewayError => ge + flash[:error] = "#{ge.message}" + ensure + redirect_to admin_order_payments_path(@order) + end + + private + + def object_params + if params[:payment] and params[:payment_source] and source_params = params.delete(:payment_source)[params[:payment][:payment_method_id]] + params[:payment][:source_attributes] = source_params + end + params[:payment] + end + + def load_data + @amount = params[:amount] || load_order.total + @payment_methods = PaymentMethod.available(:back_end) + if @payment and @payment.payment_method + @payment_method = @payment.payment_method + else + @payment_method = @payment_methods.first + end + @previous_cards = @order.credit_cards.with_payment_profile + end + + # At this point admin should have passed through Customer Details step + # where order.next is called which leaves the order in payment step + # + # Orders in complete step also allows to access this controller + # + # Otherwise redirect user to that step + def can_transition_to_payment + unless @order.payment? || @order.complete? + flash[:notice] = Spree.t(:fill_in_customer_info) + redirect_to edit_admin_order_customer_url(@order) + end + end + + def load_order + @order = Order.find_by_number!(params[:order_id]) + authorize! action, @order + @order + end + + def load_payment + @payment = Payment.find(params[:id]) + end + end + end +end From afddaed9fca87f916016117b9edfcdbcb51d927b Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Mon, 11 Nov 2019 22:27:14 +0000 Subject: [PATCH 02/10] Add empty but needed payments templates for check payment method --- app/views/spree/admin/payments/source_forms/_check.html.haml | 0 app/views/spree/admin/payments/source_views/_check.html.haml | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/views/spree/admin/payments/source_forms/_check.html.haml create mode 100644 app/views/spree/admin/payments/source_views/_check.html.haml diff --git a/app/views/spree/admin/payments/source_forms/_check.html.haml b/app/views/spree/admin/payments/source_forms/_check.html.haml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/spree/admin/payments/source_views/_check.html.haml b/app/views/spree/admin/payments/source_views/_check.html.haml new file mode 100644 index 0000000000..e69de29bb2 From 61ce849546865e9e1f76e746b658411cf074a0a1 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Mon, 11 Nov 2019 16:36:07 +0000 Subject: [PATCH 03/10] Merge spree/admin/payments_controller with its decorator and fix a few rubocop issues --- .../spree/admin/payments_controller.rb | 67 +++++++++++-------- .../admin/payments_controller_decorator.rb | 59 ---------------- 2 files changed, 40 insertions(+), 86 deletions(-) delete mode 100644 app/controllers/spree/admin/payments_controller_decorator.rb diff --git a/app/controllers/spree/admin/payments_controller.rb b/app/controllers/spree/admin/payments_controller.rb index 3e73885eca..f195864d0e 100644 --- a/app/controllers/spree/admin/payments_controller.rb +++ b/app/controllers/spree/admin/payments_controller.rb @@ -1,11 +1,13 @@ module Spree module Admin class PaymentsController < Spree::Admin::BaseController - before_filter :load_order, :only => [:create, :new, :index, :fire] - before_filter :load_payment, :except => [:create, :new, :index] + before_filter :load_order, only: [:create, :new, :index, :fire] + before_filter :load_payment, except: [:create, :new, :index] before_filter :load_data before_filter :can_transition_to_payment + append_before_filter :filter_payment_methods + respond_to :html def index @@ -19,7 +21,10 @@ module Spree def create @payment = @order.payments.build(object_params) - if @payment.payment_method.is_a?(Spree::Gateway) && @payment.payment_method.payment_profiles_supported? && params[:card].present? and params[:card] != 'new' + if @payment.payment_method.is_a?(Spree::Gateway) && + @payment.payment_method.payment_profiles_supported? && + params[:card].present? && + (params[:card] != 'new') @payment.source = CreditCard.find_by_id(params[:card]) end @@ -33,42 +38,50 @@ module Spree @payment.process! flash[:success] = flash_message_for(@payment, :successfully_created) - redirect_to admin_order_payments_path(@order) + redirect_to admin_order_payments_path(@order) else - #This is the first payment (admin created order) - until @order.completed? - @order.next! - end + AdvanceOrderService.new(@order).call! + flash[:success] = Spree.t(:new_order_completed) redirect_to edit_admin_order_url(@order) end - rescue Spree::Core::GatewayError => e - flash[:error] = "#{e.message}" + flash[:error] = e.message.to_s redirect_to new_admin_order_payment_path(@order) end end + # When a user fires an event, take them back to where they came from + # (we can't use respond_override because Spree no longer uses respond_with) def fire - return unless event = params[:e] and @payment.payment_source + event = params[:e] + return unless event && @payment.payment_source # Because we have a transition method also called void, we do this to avoid conflicts. event = "void_transaction" if event == "void" - if @payment.send("#{event}!") - flash[:success] = Spree.t(:payment_updated) + if @payment.public_send("#{event}!") + flash[:success] = t(:payment_updated) else - flash[:error] = Spree.t(:cannot_perform_operation) + flash[:error] = t(:cannot_perform_operation) end - rescue Spree::Core::GatewayError => ge - flash[:error] = "#{ge.message}" + rescue Spree::Core::GatewayError => e + flash[:error] = e.message ensure - redirect_to admin_order_payments_path(@order) + redirect_to request.referer end private + # Only show payments for the order's distributor + def filter_payment_methods + @payment_methods = @payment_methods.select{ |pm| pm.has_distributor? @order.distributor } + @payment_method ||= @payment_methods.first + end + def object_params - if params[:payment] and params[:payment_source] and source_params = params.delete(:payment_source)[params[:payment][:payment_method_id]] + if params[:payment] && + params[:payment_source] && + source_params = params.delete(:payment_source)[params[:payment][:payment_method_id]] params[:payment][:source_attributes] = source_params end params[:payment] @@ -77,11 +90,11 @@ module Spree def load_data @amount = params[:amount] || load_order.total @payment_methods = PaymentMethod.available(:back_end) - if @payment and @payment.payment_method - @payment_method = @payment.payment_method - else - @payment_method = @payment_methods.first - end + @payment_method = if @payment && @payment.payment_method + @payment.payment_method + else + @payment_methods.first + end @previous_cards = @order.credit_cards.with_payment_profile end @@ -92,10 +105,10 @@ module Spree # # Otherwise redirect user to that step def can_transition_to_payment - unless @order.payment? || @order.complete? - flash[:notice] = Spree.t(:fill_in_customer_info) - redirect_to edit_admin_order_customer_url(@order) - end + return if @order.payment? || @order.complete? + + flash[:notice] = Spree.t(:fill_in_customer_info) + redirect_to edit_admin_order_customer_url(@order) end def load_order diff --git a/app/controllers/spree/admin/payments_controller_decorator.rb b/app/controllers/spree/admin/payments_controller_decorator.rb deleted file mode 100644 index 41d43f2e56..0000000000 --- a/app/controllers/spree/admin/payments_controller_decorator.rb +++ /dev/null @@ -1,59 +0,0 @@ -Spree::Admin::PaymentsController.class_eval do - append_before_filter :filter_payment_methods - - def create - @payment = @order.payments.build(object_params) - if @payment.payment_method.is_a?(Spree::Gateway) && @payment.payment_method.payment_profiles_supported? && params[:card].present? && (params[:card] != 'new') - @payment.source = CreditCard.find_by_id(params[:card]) - end - - begin - unless @payment.save - redirect_to admin_order_payments_path(@order) - return - end - - if @order.completed? - @payment.process! - flash[:success] = flash_message_for(@payment, :successfully_created) - - redirect_to admin_order_payments_path(@order) - else - AdvanceOrderService.new(@order).call! - - flash[:success] = Spree.t(:new_order_completed) - redirect_to edit_admin_order_url(@order) - end - rescue Spree::Core::GatewayError => e - flash[:error] = e.message.to_s - redirect_to new_admin_order_payment_path(@order) - end - end - - # When a user fires an event, take them back to where they came from - # (we can't use respond_override because Spree no longer uses respond_with) - def fire - event = params[:e] - return unless event && @payment.payment_source - - # Because we have a transition method also called void, we do this to avoid conflicts. - event = "void_transaction" if event == "void" - if @payment.public_send("#{event}!") - flash[:success] = t(:payment_updated) - else - flash[:error] = t(:cannot_perform_operation) - end - rescue Spree::Core::GatewayError => e - flash[:error] = e.message - ensure - redirect_to request.referer - end - - private - - # Only show payments for the order's distributor - def filter_payment_methods - @payment_methods = @payment_methods.select{ |pm| pm.has_distributor? @order.distributor } - @payment_method ||= @payment_methods.first - end -end From fbc5887fa640c624fa6723f9dc53385681479d5b Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 14 Dec 2019 12:26:00 +0000 Subject: [PATCH 04/10] Bring payments routes from spree_backend --- config/routes/spree.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/routes/spree.rb b/config/routes/spree.rb index 1749f563bc..43fec55b55 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -100,6 +100,12 @@ Spree::Core::Engine.routes.prepend do end resources :adjustments + + resources :payments do + member do + put :fire + end + end end resources :users do From 940953b043e9c3b1c573e69234cf1c8a17d373ce Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 14 Dec 2019 12:26:20 +0000 Subject: [PATCH 05/10] Add missing translations for payments --- config/locales/en.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/locales/en.yml b/config/locales/en.yml index 37e65de208..b1108cf6d8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2986,6 +2986,8 @@ See the %{link} to find out more about %{sitename}'s features and to start using zipcode: Postcode weight: Weight (per kg) error_user_destroy_with_orders: "Users with completed orders may not be deleted" + cannot_create_payment_without_payment_methods: "You cannot create a payment for an order without any payment methods defined." + please_define_payment_methods: "Please define some payment methods first." options: "Options" actions: From f6ecf5773749ccebb356ddf43fb99e280104af58 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 14 Dec 2019 12:28:32 +0000 Subject: [PATCH 06/10] Make before filters easier to understand using the fact that there are only index, create, new and fire actions in this controller --- app/controllers/spree/admin/payments_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/spree/admin/payments_controller.rb b/app/controllers/spree/admin/payments_controller.rb index f195864d0e..a0476354bb 100644 --- a/app/controllers/spree/admin/payments_controller.rb +++ b/app/controllers/spree/admin/payments_controller.rb @@ -1,8 +1,7 @@ module Spree module Admin class PaymentsController < Spree::Admin::BaseController - before_filter :load_order, only: [:create, :new, :index, :fire] - before_filter :load_payment, except: [:create, :new, :index] + before_filter :load_order before_filter :load_data before_filter :can_transition_to_payment @@ -54,6 +53,8 @@ module Spree # When a user fires an event, take them back to where they came from # (we can't use respond_override because Spree no longer uses respond_with) def fire + load_payment + event = params[:e] return unless event && @payment.payment_source From dc5374e2841d7101dbd423538e462a601c909fe4 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 14 Dec 2019 12:34:39 +0000 Subject: [PATCH 07/10] Merge filter_payment_methods and load_data --- .../spree/admin/payments_controller.rb | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/app/controllers/spree/admin/payments_controller.rb b/app/controllers/spree/admin/payments_controller.rb index a0476354bb..f607b49bea 100644 --- a/app/controllers/spree/admin/payments_controller.rb +++ b/app/controllers/spree/admin/payments_controller.rb @@ -5,8 +5,6 @@ module Spree before_filter :load_data before_filter :can_transition_to_payment - append_before_filter :filter_payment_methods - respond_to :html def index @@ -73,12 +71,6 @@ module Spree private - # Only show payments for the order's distributor - def filter_payment_methods - @payment_methods = @payment_methods.select{ |pm| pm.has_distributor? @order.distributor } - @payment_method ||= @payment_methods.first - end - def object_params if params[:payment] && params[:payment_source] && @@ -90,12 +82,18 @@ module Spree def load_data @amount = params[:amount] || load_order.total - @payment_methods = PaymentMethod.available(:back_end) + + # Only show payments for the order's distributor + @payment_methods = PaymentMethod. + available(:back_end). + select{ |pm| pm.has_distributor? @order.distributor } + @payment_method = if @payment && @payment.payment_method @payment.payment_method else @payment_methods.first end + @previous_cards = @order.credit_cards.with_payment_profile end From 74226fbdf80420b0102075e48bfe6e4a6c9c1e24 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 14 Dec 2019 12:41:07 +0000 Subject: [PATCH 08/10] Fix one rubocop issue and update rubocop todo manual for the new controller --- .rubocop_manual_todo.yml | 8 +++----- .../spree/admin/payments_controller.rb | 16 ++++++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml index f2a0f1d7f9..e8ef371ca2 100644 --- a/.rubocop_manual_todo.yml +++ b/.rubocop_manual_todo.yml @@ -43,7 +43,6 @@ Layout/LineLength: - app/controllers/checkout_controller.rb - app/controllers/spree/admin/adjustments_controller_decorator.rb - app/controllers/spree/admin/orders_controller_decorator.rb - - app/controllers/spree/admin/payments_controller_decorator.rb - app/controllers/spree/credit_cards_controller.rb - app/controllers/spree/paypal_controller_decorator.rb - app/controllers/stripe/callbacks_controller.rb @@ -366,7 +365,8 @@ Metrics/AbcSize: - app/controllers/spree/admin/orders_controller_decorator.rb - app/controllers/spree/admin/overview_controller.rb - app/controllers/spree/admin/payment_methods_controller.rb - - app/controllers/spree/admin/payments_controller_decorator.rb + - app/controllers/spree/admin/payments_controller.rb + - app/controllers/spree/admin/products_controller_decorator.rb - app/controllers/spree/admin/reports_controller.rb - app/controllers/spree/admin/resource_controller.rb - app/controllers/spree/admin/products_controller.rb @@ -495,7 +495,6 @@ Metrics/CyclomaticComplexity: - app/controllers/admin/enterprise_fees_controller.rb - app/controllers/admin/enterprises_controller.rb - app/controllers/checkout_controller.rb - - app/controllers/spree/admin/payments_controller_decorator.rb - app/controllers/spree/admin/taxons_controller.rb - app/controllers/spree/orders_controller.rb - app/helpers/checkout_helper.rb @@ -525,7 +524,6 @@ Metrics/PerceivedComplexity: - app/controllers/admin/enterprises_controller.rb - app/controllers/api/variants_controller.rb - app/controllers/checkout_controller.rb - - app/controllers/spree/admin/payments_controller_decorator.rb - app/controllers/spree/admin/taxons_controller.rb - app/controllers/spree/orders_controller.rb - app/helpers/checkout_helper.rb @@ -566,7 +564,7 @@ Metrics/MethodLength: - app/controllers/spree/admin/image_settings_controller.rb - app/controllers/spree/admin/orders/customer_details_controller_decorator.rb - app/controllers/spree/admin/payment_methods_controller.rb - - app/controllers/spree/admin/payments_controller_decorator.rb + - app/controllers/spree/admin/payments_controller.rb - app/controllers/spree/admin/reports_controller.rb - app/controllers/spree/admin/resource_controller.rb - app/controllers/spree/admin/products_controller.rb diff --git a/app/controllers/spree/admin/payments_controller.rb b/app/controllers/spree/admin/payments_controller.rb index f607b49bea..8e2151f86c 100644 --- a/app/controllers/spree/admin/payments_controller.rb +++ b/app/controllers/spree/admin/payments_controller.rb @@ -18,12 +18,7 @@ module Spree def create @payment = @order.payments.build(object_params) - if @payment.payment_method.is_a?(Spree::Gateway) && - @payment.payment_method.payment_profiles_supported? && - params[:card].present? && - (params[:card] != 'new') - @payment.source = CreditCard.find_by_id(params[:card]) - end + load_payment_source begin unless @payment.save @@ -71,6 +66,15 @@ module Spree private + def load_payment_source + if @payment.payment_method.is_a?(Spree::Gateway) && + @payment.payment_method.payment_profiles_supported? && + params[:card].present? && + (params[:card] != 'new') + @payment.source = CreditCard.find_by_id(params[:card]) + end + end + def object_params if params[:payment] && params[:payment_source] && From 766303b3322ff571e9526cab5284b39345138601 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 14 Dec 2019 21:22:21 +0000 Subject: [PATCH 09/10] Add required payment_helper from spree_backend --- app/helpers/spree/admin/payments_helper.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 app/helpers/spree/admin/payments_helper.rb diff --git a/app/helpers/spree/admin/payments_helper.rb b/app/helpers/spree/admin/payments_helper.rb new file mode 100644 index 0000000000..529ef90adf --- /dev/null +++ b/app/helpers/spree/admin/payments_helper.rb @@ -0,0 +1,11 @@ +module Spree + module Admin + module PaymentsHelper + def payment_method_name(payment) + # hack to allow us to retrieve the name of a "deleted" payment method + id = payment.payment_method_id + Spree::PaymentMethod.find_with_destroyed(id).name + end + end + end +end From e192207f4eca473ac3c6c29a8a315edf203b9432 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Thu, 30 Jan 2020 10:27:26 +0000 Subject: [PATCH 10/10] Fix bug in before filters migration, needs to load payment for the show action --- app/controllers/spree/admin/payments_controller.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/spree/admin/payments_controller.rb b/app/controllers/spree/admin/payments_controller.rb index 8e2151f86c..0c17f8154a 100644 --- a/app/controllers/spree/admin/payments_controller.rb +++ b/app/controllers/spree/admin/payments_controller.rb @@ -1,7 +1,10 @@ +# frozen_string_literal: true + module Spree module Admin class PaymentsController < Spree::Admin::BaseController - before_filter :load_order + before_filter :load_order, except: [:show] + before_filter :load_payment, only: [:fire, :show] before_filter :load_data before_filter :can_transition_to_payment @@ -46,8 +49,6 @@ module Spree # When a user fires an event, take them back to where they came from # (we can't use respond_override because Spree no longer uses respond_with) def fire - load_payment - event = params[:e] return unless event && @payment.payment_source