module Billing class Invoice < ApplicationRecord self.table_name = "billing_invoices" STATUSES = %w[draft issued sent cancelled].freeze SOURCES = %w[manual aruba].freeze belongs_to :club belongs_to :billing_payment, class_name: "Billing::Payment", optional: true has_one_attached :pdf validates :number, presence: true, uniqueness: { scope: :club_id } validates :issued_on, presence: true validates :amount_cents, numericality: { greater_than: 0 } validates :currency, presence: true validates :status, inclusion: { in: STATUSES } validates :source, inclusion: { in: SOURCES } validates :billing_payment_id, uniqueness: true, allow_nil: true validate :pdf_present_when_issued, on: :issue scope :recent, -> { order(issued_on: :desc, created_at: :desc) } def amount_euros amount_cents / 100.0 end def formatted_amount format("%.2f €", amount_euros) end def downloadable? pdf.attached? && status.in?(%w[issued sent]) end def draft? status == "draft" end def display_number n = number.to_s.strip cleaned = n.gsub(/\baruba[-_\s]*/i, "").strip cleaned.presence || n end def display_status { "draft" => "In preparazione", "issued" => "Emessa", "sent" => "Inviata", "cancelled" => "Annullata" }[status] || status end private def pdf_present_when_issued return unless validation_context == :issue return if pdf.attached? errors.add(:pdf, "è obbligatorio per emettere la fattura") end end end