mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-03 02:21:33 +00:00
This is much simpler. Multiple messages get combined onto one line though, which is not perfect. And.. it still seems to duplicate the errors. Weird, it's fine on my frontend though.
147 lines
3.8 KiB
Ruby
147 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'concerns/payment_method_distributors'
|
|
|
|
module Spree
|
|
class PaymentMethod < ApplicationRecord
|
|
include CalculatedAdjustments
|
|
include PaymentMethodDistributors
|
|
|
|
acts_as_taggable
|
|
acts_as_paranoid
|
|
|
|
DISPLAY = [:both, :back_end].freeze
|
|
default_scope -> { where(deleted_at: nil) }
|
|
|
|
has_many :credit_cards, class_name: "Spree::CreditCard"
|
|
|
|
validates :name, presence: true
|
|
validate :distributor_validation
|
|
include NestedCalculatorValidation
|
|
|
|
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|
|
|
if user.has_spree_role?('admin')
|
|
where(nil)
|
|
else
|
|
joins(:distributors).
|
|
where('distributors_payment_methods.distributor_id IN (?)',
|
|
user.enterprises.select(&:id)).
|
|
select('DISTINCT spree_payment_methods.*')
|
|
end
|
|
}
|
|
|
|
scope :for_distributors, ->(distributors) {
|
|
non_unique_matches = unscoped.joins(:distributors).where(enterprises: { id: distributors })
|
|
where(id: non_unique_matches.map(&:id))
|
|
}
|
|
|
|
scope :for_distributor, ->(distributor) {
|
|
joins(:distributors).where('enterprises.id = ?', distributor)
|
|
}
|
|
|
|
scope :for_subscriptions, -> { where(type: Subscription::ALLOWED_PAYMENT_METHOD_TYPES) }
|
|
|
|
scope :by_name, -> { order('spree_payment_methods.name ASC') }
|
|
|
|
scope :available, lambda { |display_on = 'both'|
|
|
where(active: true).
|
|
where('spree_payment_methods.display_on=? OR spree_payment_methods.display_on=? OR spree_payment_methods.display_on IS NULL', display_on, '').
|
|
where('spree_payment_methods.environment=? OR spree_payment_methods.environment=? OR spree_payment_methods.environment IS NULL', Rails.env, '')
|
|
}
|
|
|
|
def self.providers
|
|
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
|
|
|
|
# Does the PaymentMethod require redirecting to an external gateway?
|
|
def external_gateway?
|
|
false
|
|
end
|
|
|
|
# Inheriting PaymentMethods can implement this method if needed
|
|
def external_payment_url(_options)
|
|
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
|
|
def payment_source_class
|
|
raise 'You must implement payment_source_class method for this gateway.'
|
|
end
|
|
|
|
def self.active?
|
|
where(type: to_s, environment: Rails.env, active: true).count.positive?
|
|
end
|
|
|
|
def method_type
|
|
type.demodulize.downcase
|
|
end
|
|
|
|
def self.find_with_destroyed(*args)
|
|
unscoped { find(*args) }
|
|
end
|
|
|
|
def payment_profiles_supported?
|
|
false
|
|
end
|
|
|
|
def source_required?
|
|
true
|
|
end
|
|
|
|
def supports?(_source)
|
|
true
|
|
end
|
|
|
|
def init
|
|
self.calculator ||= ::Calculator::None.new
|
|
end
|
|
|
|
def has_distributor?(distributor)
|
|
distributors.include?(distributor)
|
|
end
|
|
|
|
def self.clean_name
|
|
i18n_key = "spree.admin.payment_methods.providers." + name.demodulize.downcase
|
|
I18n.t(i18n_key)
|
|
end
|
|
|
|
private
|
|
|
|
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
|