mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-14 04:04:23 +00:00
Let people choose which payment methods are available to customers on order cycles
This commit is contained in:
@@ -399,7 +399,7 @@ class Enterprise < ApplicationRecord
|
||||
end
|
||||
|
||||
def ready_for_checkout?
|
||||
shipping_methods.frontend.any? && payment_methods.available.any?
|
||||
shipping_methods.frontend.any? && payment_methods.available.any?(&:configured?)
|
||||
end
|
||||
|
||||
def self.find_available_permalink(test_permalink)
|
||||
|
||||
@@ -24,6 +24,9 @@ class OrderCycle < ApplicationRecord
|
||||
has_many :distributors, -> { distinct }, source: :receiver, through: :cached_outgoing_exchanges
|
||||
has_many :order_cycle_schedules
|
||||
has_many :schedules, through: :order_cycle_schedules
|
||||
has_and_belongs_to_many :selected_distributor_payment_methods,
|
||||
class_name: 'DistributorPaymentMethod',
|
||||
join_table: 'order_cycles_distributor_payment_methods'
|
||||
has_and_belongs_to_many :selected_distributor_shipping_methods,
|
||||
class_name: 'DistributorShippingMethod',
|
||||
join_table: 'order_cycles_distributor_shipping_methods'
|
||||
@@ -152,12 +155,10 @@ class OrderCycle < ApplicationRecord
|
||||
]
|
||||
end
|
||||
|
||||
def attachable_payment_methods
|
||||
Spree::PaymentMethod.available(:both).
|
||||
joins("INNER JOIN distributors_payment_methods
|
||||
ON payment_method_id = spree_payment_methods.id").
|
||||
where("distributor_id IN (?)", distributor_ids).
|
||||
distinct
|
||||
def attachable_distributor_payment_methods
|
||||
DistributorPaymentMethod.joins(:payment_method).
|
||||
merge(Spree::PaymentMethod.available).
|
||||
where("distributor_id IN (?)", distributor_ids)
|
||||
end
|
||||
|
||||
def attachable_distributor_shipping_methods
|
||||
@@ -177,6 +178,9 @@ class OrderCycle < ApplicationRecord
|
||||
oc.schedule_ids = schedule_ids
|
||||
oc.save!
|
||||
exchanges.each { |e| e.clone!(oc) }
|
||||
oc.selected_distributor_payment_method_ids = (
|
||||
attachable_distributor_payment_methods.map(&:id) & selected_distributor_payment_method_ids
|
||||
)
|
||||
oc.selected_distributor_shipping_method_ids = (
|
||||
attachable_distributor_shipping_methods.map(&:id) & selected_distributor_shipping_method_ids
|
||||
)
|
||||
@@ -293,6 +297,18 @@ class OrderCycle < ApplicationRecord
|
||||
items.each { |li| scoper.scope(li.variant) }
|
||||
end
|
||||
|
||||
def distributor_payment_methods
|
||||
if simple? || selected_distributor_payment_methods.none?
|
||||
attachable_distributor_payment_methods
|
||||
else
|
||||
attachable_distributor_payment_methods.where(
|
||||
"distributors_payment_methods.id IN (?) OR distributor_id NOT IN (?)",
|
||||
selected_distributor_payment_methods.map(&:id),
|
||||
selected_distributor_payment_methods.map(&:distributor_id)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def distributor_shipping_methods
|
||||
if simple? || selected_distributor_shipping_methods.none?
|
||||
attachable_distributor_shipping_methods
|
||||
|
||||
@@ -20,6 +20,8 @@ module Spree
|
||||
|
||||
after_initialize :init
|
||||
|
||||
scope :inactive_or_backend, -> { where("active = false OR display_on = 'back_end'") }
|
||||
|
||||
scope :production, -> { where(environment: 'production') }
|
||||
|
||||
scope :managed_by, lambda { |user|
|
||||
@@ -57,6 +59,10 @@ module Spree
|
||||
Rails.application.config.spree.payment_methods
|
||||
end
|
||||
|
||||
def configured?
|
||||
!stripe? || stripe_configured?
|
||||
end
|
||||
|
||||
def provider_class
|
||||
raise 'You must implement provider_class method for this gateway.'
|
||||
end
|
||||
@@ -71,6 +77,10 @@ module Spree
|
||||
nil
|
||||
end
|
||||
|
||||
def frontend?
|
||||
active? && display_on != "back_end"
|
||||
end
|
||||
|
||||
# The class that will process payments for this payment type, used for @payment.source
|
||||
# e.g. CreditCard in the case of a the Gateway payment type
|
||||
# nil means the payment method doesn't require a source e.g. check
|
||||
@@ -120,5 +130,17 @@ module Spree
|
||||
def distributor_validation
|
||||
validates_with DistributorsValidator
|
||||
end
|
||||
|
||||
def stripe?
|
||||
type.ends_with?("StripeSCA")
|
||||
end
|
||||
|
||||
def stripe_configured?
|
||||
Spree::Config.stripe_connect_enabled &&
|
||||
Stripe.publishable_key &&
|
||||
preferred_enterprise_id.present? &&
|
||||
preferred_enterprise_id > 0 &&
|
||||
stripe_account_id.present?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user