mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-06 02:51:34 +00:00
Introduce "zero priced orders" to checkout UI and order state flow
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user