Ir al contenido

Presupuestos y Proformas

Ruta: /owner/quotes Crea presupuestos, genera facturas proforma y convierte documentos en facturas definitivas.

Panel de Negocio — Presupuestos y Proformas


La pantalla principal de Presupuestos muestra dos pestañas y tarjetas de resumen:

Pestañas: Presupuestos | Facturas Proforma

Tarjetas de resumen (Presupuestos):

TarjetaColorDescripción
Total PresupuestosCantidad total de presupuestos
AceptadosVerdePresupuestos aprobados por el cliente
PendientesAmarilloEnviados o en revisión
RechazadosRojoPresupuestos rechazados

Tarjetas de resumen (Proformas):

TarjetaColorDescripción
Total ProformasCantidad total de proformas
Convertidas a FacturaVerdeProformas ya facturadas
PendientesAmarilloProformas enviadas sin facturar
VencidasRojoProformas fuera del plazo de validez

Columnas de la tabla: Número, Cliente, Fecha, Validez, Estado, Total, Acciones

Filtros disponibles: número/cliente/CIF, estado (draft, sent, pending, accepted, rejected, expired)


FunciónDescripciónDocumentación
Crear PresupuestoCrea borrador con cliente, conceptos e importesVer
Convertir a FacturaTransforma presupuesto o proforma en facturaVer
Enviar PresupuestoEnvía PDF del presupuesto por emailVer
Gestionar Series de ProformasConfigura prefijos y numeración de proformasVer
Duplicar PresupuestoCrea copia de un presupuesto existenteVer
Cambiar EstadoMarca como enviado, aceptado o rechazadoVer

┌──────────┐
│ Borrador │
└────┬─────┘
│ Enviar
┌────▼─────┐
│ Enviado │──────┐
└────┬─────┘ │
│ │ Rechazar
┌────▼─────┐ │
│Pendiente │ │
└────┬─────┘ │
│ │
┌────▼─────┐ ┌────▼─────┐ ┌──────────┐
│Aceptado │ │Rechazado │ │ Expirado │
│ FINAL │ │ FINAL │ │ FINAL │
└────┬─────┘ └──────────┘ └──────────┘
│ Convertir
┌────▼─────┐
│ FACTURA │
└──────────┘

Transiciones permitidas:

DesdeHacia
BorradorEnviado, Aceptado, Rechazado
EnviadoPendiente, Aceptado, Rechazado, Expirado
PendienteAceptado, Rechazado, Expirado
Aceptado(puede convertirse a factura)
Rechazado(estado final)
Expirado(estado final)

NOTA: Los presupuestos aceptados o las proformas pueden convertirse en facturas en cualquier momento.


CaracterísticaPresupuestoFactura Proforma
PropósitoOferta comercialDocumento previo a facturación
ValidezCon fecha de caducidadOpcional
NumeraciónSerie de presupuestosSerie de proformas independiente
Valor fiscalNo tieneNo tiene valor fiscal
ConversiónSe genera proforma o facturaSe convierte a factura definitiva

Detalles técnicos
TablaColumnas principalesFK
quotesid, business_id, customer_id, quote_number, proforma_number, status, is_proforma, valid_until, total_amount, source_quote_id, converted_to_invoice_idcustomers, businesses, quote_series
quote_itemsid, quote_id, description, quantity, unit_price, tax_rate, line_totalquotes
quote_seriesid, business_id, prefix, current_number, paddingbusinesses
proforma_sequencesid, business_id, prefix, current_number, paddingbusinesses
PolíticaRegla
quotes_business_isolationbusiness_id = usuario autenticado
quote_items_via_quoteAcceso vía presupuesto padre
quote_series_businessbusiness_id = usuario autenticado
proforma_sequences_businessbusiness_id = usuario autenticado
FunciónTriggerDescripción
whatsapp-create-quoteCreación vía WhatsAppCrea presupuesto desde WhatsApp
whatsapp-convert-quote-to-invoiceConversiónTransforma presupuesto en factura
whatsapp-list-quotesListadoObtiene presupuestos del usuario
send-quote-emailEnvío emailGenera PDF + envía via SendGrid
generate-quote-pdfDescarga/envíoHTML a PDF (jsPDF + html2canvas)

Presupuesto completo con cliente:

SELECT q.*, c.name, c.cif_nif, c.email
FROM quotes q
LEFT JOIN customers c ON q.customer_id = c.id
WHERE q.id = '<quote_id>';

Presupuestos por estado:

SELECT status, COUNT(*) as total, SUM(total_amount) as importe
FROM quotes
WHERE business_id = '<business_id>' AND is_proforma = false
GROUP BY status;

Proformas convertidas a factura:

SELECT q.proforma_number, q.total_amount, i.invoice_number
FROM quotes q
LEFT JOIN invoices i ON q.converted_to_invoice_id = i.id
WHERE q.business_id = '<business_id>'
AND q.is_proforma = true
AND q.converted_to_invoice_id IS NOT NULL;

Presupuestos expirados no convertidos:

SELECT q.quote_number, q.valid_until, q.total_amount, c.name
FROM quotes q
LEFT JOIN customers c ON q.customer_id = c.id
WHERE q.business_id = '<business_id>'
AND q.valid_until < CURRENT_DATE
AND q.converted_to_invoice_id IS NULL
AND q.is_proforma = false;

Series de proformas con conteo:

SELECT s.*, COUNT(q.id) as emitidas
FROM proforma_sequences s
LEFT JOIN quotes q ON q.proforma_sequence_id = s.id
AND q.is_proforma = true
AND q.status != 'draft'
WHERE s.business_id = '<business_id>'
GROUP BY s.id;