Files
openfoodnetwork/app/models/spree/payment_method.rb
2024-06-11 15:17:32 +10:00

144 lines
3.6 KiB
Ruby

# frozen_string_literal: true
module Spree
class PaymentMethod < ApplicationRecord
include CalculatedAdjustments
include PaymentMethodDistributors
self.belongs_to_required_by_default = false
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", dependent: :destroy
validates :name, presence: true
validate :distributor_validation
validates_associated :calculator
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|
return where(nil) if user.admin?
joins(:distributors).
where(distributors_payment_methods: { distributor_id: user.enterprises.select(&:id) }).
select('DISTINCT spree_payment_methods.*')
}
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(display_on: [display_on, "", nil])
.where(environment: [Rails.env, "", nil])
}
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