module Billing class Payment < ApplicationRecord self.table_name = "billing_payments" STATUSES = %w[paid failed refunded].freeze belongs_to :club has_one :invoice, class_name: "Billing::Invoice", foreign_key: :billing_payment_id, dependent: :nullify validates :amount_cents, numericality: { greater_than: 0 } validates :currency, presence: true validates :status, inclusion: { in: STATUSES } validates :stripe_invoice_id, uniqueness: true, allow_nil: true scope :recent, -> { order(paid_at: :desc, created_at: :desc) } # Pagamenti pagati senza PDF fattura caricato (da gestire in admin). scope :awaiting_invoice_pdf, lambda { where(status: "paid").where( <<~SQL.squish, NOT EXISTS ( SELECT 1 FROM billing_invoices bi INNER JOIN active_storage_attachments asa ON asa.record_type = 'Billing::Invoice' AND asa.record_id = bi.id AND asa.name = 'pdf' WHERE bi.billing_payment_id = billing_payments.id ) SQL ) } scope :with_invoice_pdf, lambda { where(status: "paid").where( <<~SQL.squish, EXISTS ( SELECT 1 FROM billing_invoices bi INNER JOIN active_storage_attachments asa ON asa.record_type = 'Billing::Invoice' AND asa.record_id = bi.id AND asa.name = 'pdf' WHERE bi.billing_payment_id = billing_payments.id ) SQL ) } def awaiting_invoice_pdf? status == "paid" && !invoice&.pdf&.attached? end def amount_euros amount_cents / 100.0 end def formatted_amount format("%.2f €", amount_euros) end def display_description PaymentDescription.for_payment(self) end def display_status { "paid" => "Pagato", "failed" => "Non riuscito", "refunded" => "Rimborsato" }[status] || status end def invoice_for_display invoice end end end