From bd29a9acdefceb888d274763ac40b2c3c3711331 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 2 Jun 2023 20:18:14 +0100 Subject: [PATCH] Introduce "zero priced orders" to checkout UI and order state flow --- app/controllers/split_checkout_controller.rb | 1 + app/helpers/checkout_helper.rb | 2 + app/models/spree/order.rb | 4 ++ app/views/split_checkout/_payment.html.haml | 44 +++++++++++--------- app/views/split_checkout/_summary.html.haml | 13 ++++-- 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index c74b3f0ba1..6d714c258d 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -203,6 +203,7 @@ class SplitCheckoutController < ::BaseController def validate_payment! return true if params.dig(:order, :payments_attributes, 0, :payment_method_id).present? + return true if @order.zero_priced_order? @order.errors.add :payment_method, I18n.t('split_checkout.errors.select_a_payment_method') end diff --git a/app/helpers/checkout_helper.rb b/app/helpers/checkout_helper.rb index 371b92dfff..c6c2f8d0e7 100644 --- a/app/helpers/checkout_helper.rb +++ b/app/helpers/checkout_helper.rb @@ -120,6 +120,8 @@ module CheckoutHelper end def payment_or_shipping_price(method, order) + return unless method + price = method.compute_amount(order) if price.zero? t('checkout_method_free') diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index d87b14b3bb..21904aa05d 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -621,6 +621,10 @@ module Spree raise Core::GatewayError, Spree.t(:no_pending_payments) if pending_payments.empty? pending_payments.each do |payment| + if payment.amount.zero? && zero_priced_order? + payment.update_columns(state: "completed", captured_at: Time.zone.now) + end + break if payment_total >= total yield payment diff --git a/app/views/split_checkout/_payment.html.haml b/app/views/split_checkout/_payment.html.haml index 2b0fd81aa0..12a94405ee 100644 --- a/app/views/split_checkout/_payment.html.haml +++ b/app/views/split_checkout/_payment.html.haml @@ -8,28 +8,32 @@ %div.checkout-title = t("split_checkout.step2.payment_method.title") - - selected_payment_method = @order.payments&.with_state(:checkout)&.first&.payment_method_id - - selected_payment_method ||= available_payment_methods[0].id if available_payment_methods.length == 1 - - available_payment_methods.each do |payment_method| - %div.checkout-input.checkout-input-radio - = f.radio_button :payment_method_id, payment_method.id, - id: "payment_method_#{payment_method.id}", - name: "order[payments_attributes][][payment_method_id]", - checked: (payment_method.id == selected_payment_method), - "data-action": "paymentmethod#selectPaymentMethod", - "data-paymentmethod-id": "#{payment_method.id}", - "data-paymentmethod-target": "input" - = f.label :payment_method_id, "#{payment_method.name}", for: "payment_method_#{payment_method.id}" - %em.fees=payment_or_shipping_price(payment_method, @order) + - if @order.zero_priced_order? + %h3= t(:no_payment_required) + = hidden_field_tag "order[payments_attributes][][amount]", 0 + - else + - selected_payment_method = @order.payments&.with_state(:checkout)&.first&.payment_method_id + - selected_payment_method ||= available_payment_methods[0].id if available_payment_methods.length == 1 + - available_payment_methods.each do |payment_method| + %div.checkout-input.checkout-input-radio + = f.radio_button :payment_method_id, payment_method.id, + id: "payment_method_#{payment_method.id}", + name: "order[payments_attributes][][payment_method_id]", + checked: (payment_method.id == selected_payment_method), + "data-action": "paymentmethod#selectPaymentMethod", + "data-paymentmethod-id": "#{payment_method.id}", + "data-paymentmethod-target": "input" + = f.label :payment_method_id, "#{payment_method.name}", for: "payment_method_#{payment_method.id}" + %em.fees=payment_or_shipping_price(payment_method, @order) - .paymentmethod-container{"data-paymentmethod-id": "#{payment_method.id}", style: "display: #{payment_method.id == selected_payment_method ? "block" : "none"}"} - - if payment_method.description && !payment_method.description.empty? - .paymentmethod-description.panel - #{payment_method.description} - .paymentmethod-form - = render partial: "split_checkout/payment/#{payment_method.method_type}", locals: { payment_method: payment_method, f: f } + .paymentmethod-container{"data-paymentmethod-id": "#{payment_method.id}", style: "display: #{payment_method.id == selected_payment_method ? "block" : "none"}"} + - if payment_method.description && !payment_method.description.empty? + .paymentmethod-description.panel + #{payment_method.description} + .paymentmethod-form + = render partial: "split_checkout/payment/#{payment_method.method_type}", locals: { payment_method: payment_method, f: f } - = f.error_message_on :payment_method, standalone: true + = f.error_message_on :payment_method, standalone: true %div.checkout-substep = t("split_checkout.step2.explaination") diff --git a/app/views/split_checkout/_summary.html.haml b/app/views/split_checkout/_summary.html.haml index bd14fd3e7d..0317ee6232 100644 --- a/app/views/split_checkout/_summary.html.haml +++ b/app/views/split_checkout/_summary.html.haml @@ -54,16 +54,21 @@ %a.summary-edit{href: main_app.checkout_step_path(:payment)} = t("split_checkout.step3.payment_method.edit") .two-columns + - payment_method = last_payment_method(@order) %div - - payment_method = last_payment_method(@order) - = payment_method&.name - %em.fees=payment_or_shipping_price(payment_method, @order) + - if payment_method + = payment_method.name + %em.fees + = payment_or_shipping_price(payment_method, @order) + - elsif @order.zero_priced_order? + %h4= t(:no_payment_required) + - if payment_method&.description.present? %div .summary-subtitle = t("split_checkout.step3.payment_method.instructions") %div - = last_payment_method(@order)&.description + = payment_method&.description %div.checkout-substep