Admin fatturazione: coda pagamenti senza PDF e upload diretto.
Lista globale dei pagamenti da fatturare con dati intestazione, caricamento PDF per riga che crea la fattura e invia email; rimuove il flusso bozza manuale. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,7 +1,33 @@
|
||||
module Admin
|
||||
class BillingController < BaseController
|
||||
def index
|
||||
@clubs = Club.order(:name).includes(:billing_payments, :billing_invoices)
|
||||
@pending_payments = pending_scope.recent
|
||||
@completed_payments = Billing::Payment.with_invoice_pdf.includes(:club, :invoice).recent.limit(40)
|
||||
@filter_club = Club.find_by(id: params[:club_id]) if params[:club_id].present?
|
||||
@clubs = Club.order(:name)
|
||||
end
|
||||
|
||||
def attach_pdf
|
||||
payment = Billing::Payment.find(params[:payment_id])
|
||||
Billing::AttachPaymentInvoice.call(payment: payment, pdf: params[:pdf])
|
||||
redirect_to admin_billing_path(billing_redirect_params(payment)),
|
||||
notice: "Fattura caricata e inviata a #{payment.club.billing_email}."
|
||||
rescue Billing::AttachPaymentInvoice::Error, Billing::IssueInvoice::Error => e
|
||||
payment ||= Billing::Payment.find_by(id: params[:payment_id])
|
||||
redirect_to admin_billing_path(payment ? billing_redirect_params(payment) : {}),
|
||||
alert: e.message
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def pending_scope
|
||||
scope = Billing::Payment.awaiting_invoice_pdf.includes(:club, invoice: { pdf_attachment: :blob })
|
||||
scope = scope.where(club_id: params[:club_id]) if params[:club_id].present?
|
||||
scope
|
||||
end
|
||||
|
||||
def billing_redirect_params(payment)
|
||||
{ club_id: payment.club_id, anchor: "payment-#{payment.id}" }.compact
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4,26 +4,11 @@ module Admin
|
||||
before_action :set_invoice, only: %i[edit update]
|
||||
|
||||
def index
|
||||
@payments = @club.billing_payments.recent.includes(:invoice)
|
||||
@invoices = @club.billing_invoices.recent.includes(:billing_payment, pdf_attachment: :blob)
|
||||
redirect_to admin_billing_path(club_id: @club.id)
|
||||
end
|
||||
|
||||
def new
|
||||
@payment = @club.billing_payments.find_by(id: params[:billing_payment_id]) if params[:billing_payment_id].present?
|
||||
if @payment&.invoice.present?
|
||||
redirect_to edit_admin_club_billing_invoice_path(@club, @payment.invoice), alert: "Esiste già una fattura per questo pagamento."
|
||||
return
|
||||
end
|
||||
|
||||
@invoice = @club.billing_invoices.build(
|
||||
issued_on: Date.current,
|
||||
currency: "eur",
|
||||
source: "manual",
|
||||
status: "draft",
|
||||
billing_payment: @payment,
|
||||
amount_cents: @payment&.amount_cents,
|
||||
number: suggested_invoice_number
|
||||
)
|
||||
redirect_to admin_billing_path(club_id: @club.id), alert: "Carica il PDF dalla lista «Pagamenti da fatturare»."
|
||||
end
|
||||
|
||||
def create
|
||||
@@ -33,7 +18,7 @@ module Admin
|
||||
|
||||
if @invoice.save
|
||||
redirect_to edit_admin_club_billing_invoice_path(@club, @invoice),
|
||||
notice: "Bozza fattura #{@invoice.number} creata. Carica il PDF e invia al cliente."
|
||||
notice: "Bozza creata. Carica il PDF dalla pagina Fatturazione o qui sotto."
|
||||
else
|
||||
@payment = @invoice.billing_payment
|
||||
flash.now[:alert] = @invoice.errors.full_messages.join(", ")
|
||||
@@ -50,10 +35,10 @@ module Admin
|
||||
|
||||
if issuing?
|
||||
Billing::IssueInvoice.call(invoice: @invoice, pdf: params.dig(:billing_invoice, :pdf))
|
||||
redirect_to admin_club_billing_invoices_path(@club),
|
||||
redirect_to admin_billing_path(club_id: @club.id),
|
||||
notice: "Fattura #{@invoice.number} emessa e inviata a #{@club.billing_email}."
|
||||
elsif @invoice.save
|
||||
redirect_to admin_club_billing_invoices_path(@club), notice: "Fattura #{@invoice.number} aggiornata."
|
||||
redirect_to admin_billing_path(club_id: @club.id), notice: "Fattura #{@invoice.number} aggiornata."
|
||||
else
|
||||
@payment = @invoice.billing_payment
|
||||
flash.now[:alert] = @invoice.errors.full_messages.join(", ")
|
||||
@@ -79,12 +64,6 @@ module Admin
|
||||
params[:commit].to_s == "Emetti e invia via email"
|
||||
end
|
||||
|
||||
def suggested_invoice_number
|
||||
year = Date.current.year
|
||||
count = @club.billing_invoices.where("number LIKE ?", "%#{year}%").count + 1
|
||||
"#{year}/#{count}"
|
||||
end
|
||||
|
||||
def invoice_params
|
||||
params.require(:billing_invoice).permit(
|
||||
:number,
|
||||
|
||||
Reference in New Issue
Block a user