Presupuestos y Proformas
Ruta:
/owner/quotesCrea presupuestos, genera facturas proforma y convierte documentos en facturas definitivas.

Vista de lista
Sección titulada «Vista de lista»La pantalla principal de Presupuestos muestra dos pestañas y tarjetas de resumen:
Pestañas: Presupuestos | Facturas Proforma
Tarjetas de resumen (Presupuestos):
| Tarjeta | Color | Descripción |
|---|---|---|
| Total Presupuestos | — | Cantidad total de presupuestos |
| Aceptados | Verde | Presupuestos aprobados por el cliente |
| Pendientes | Amarillo | Enviados o en revisión |
| Rechazados | Rojo | Presupuestos rechazados |
Tarjetas de resumen (Proformas):
| Tarjeta | Color | Descripción |
|---|---|---|
| Total Proformas | — | Cantidad total de proformas |
| Convertidas a Factura | Verde | Proformas ya facturadas |
| Pendientes | Amarillo | Proformas enviadas sin facturar |
| Vencidas | Rojo | Proformas 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)
Funciones
Sección titulada «Funciones»| Función | Descripción | Documentación |
|---|---|---|
| Crear Presupuesto | Crea borrador con cliente, conceptos e importes | Ver |
| Convertir a Factura | Transforma presupuesto o proforma en factura | Ver |
| Enviar Presupuesto | Envía PDF del presupuesto por email | Ver |
| Gestionar Series de Proformas | Configura prefijos y numeración de proformas | Ver |
| Duplicar Presupuesto | Crea copia de un presupuesto existente | Ver |
| Cambiar Estado | Marca como enviado, aceptado o rechazado | Ver |
Estados y transiciones
Sección titulada «Estados y transiciones» ┌──────────┐ │ Borrador │ └────┬─────┘ │ Enviar ┌────▼─────┐ │ Enviado │──────┐ └────┬─────┘ │ │ │ Rechazar ┌────▼─────┐ │ │Pendiente │ │ └────┬─────┘ │ │ │ ┌────▼─────┐ ┌────▼─────┐ ┌──────────┐ │Aceptado │ │Rechazado │ │ Expirado │ │ FINAL │ │ FINAL │ │ FINAL │ └────┬─────┘ └──────────┘ └──────────┘ │ │ Convertir ┌────▼─────┐ │ FACTURA │ └──────────┘Transiciones permitidas:
| Desde | Hacia |
|---|---|
| Borrador | Enviado, Aceptado, Rechazado |
| Enviado | Pendiente, Aceptado, Rechazado, Expirado |
| Pendiente | Aceptado, 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.
Diferencia entre Presupuesto y Proforma
Sección titulada «Diferencia entre Presupuesto y Proforma»| Característica | Presupuesto | Factura Proforma |
|---|---|---|
| Propósito | Oferta comercial | Documento previo a facturación |
| Validez | Con fecha de caducidad | Opcional |
| Numeración | Serie de presupuestos | Serie de proformas independiente |
| Valor fiscal | No tiene | No tiene valor fiscal |
| Conversión | Se genera proforma o factura | Se convierte a factura definitiva |
Referencia técnica
Sección titulada «Referencia técnica»Detalles técnicos
Tablas de base de datos
Sección titulada «Tablas de base de datos»| Tabla | Columnas principales | FK |
|---|---|---|
quotes | id, business_id, customer_id, quote_number, proforma_number, status, is_proforma, valid_until, total_amount, source_quote_id, converted_to_invoice_id | customers, businesses, quote_series |
quote_items | id, quote_id, description, quantity, unit_price, tax_rate, line_total | quotes |
quote_series | id, business_id, prefix, current_number, padding | businesses |
proforma_sequences | id, business_id, prefix, current_number, padding | businesses |
Políticas RLS
Sección titulada «Políticas RLS»| Política | Regla |
|---|---|
quotes_business_isolation | business_id = usuario autenticado |
quote_items_via_quote | Acceso vía presupuesto padre |
quote_series_business | business_id = usuario autenticado |
proforma_sequences_business | business_id = usuario autenticado |
Edge Functions
Sección titulada «Edge Functions»| Función | Trigger | Descripción |
|---|---|---|
whatsapp-create-quote | Creación vía WhatsApp | Crea presupuesto desde WhatsApp |
whatsapp-convert-quote-to-invoice | Conversión | Transforma presupuesto en factura |
whatsapp-list-quotes | Listado | Obtiene presupuestos del usuario |
send-quote-email | Envío email | Genera PDF + envía via SendGrid |
generate-quote-pdf | Descarga/envío | HTML a PDF (jsPDF + html2canvas) |
Queries de diagnóstico
Sección titulada «Queries de diagnóstico»Presupuesto completo con cliente:
SELECT q.*, c.name, c.cif_nif, c.emailFROM quotes qLEFT JOIN customers c ON q.customer_id = c.idWHERE q.id = '<quote_id>';Presupuestos por estado:
SELECT status, COUNT(*) as total, SUM(total_amount) as importeFROM quotesWHERE business_id = '<business_id>' AND is_proforma = falseGROUP BY status;Proformas convertidas a factura:
SELECT q.proforma_number, q.total_amount, i.invoice_numberFROM quotes qLEFT JOIN invoices i ON q.converted_to_invoice_id = i.idWHERE 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.nameFROM quotes qLEFT JOIN customers c ON q.customer_id = c.idWHERE 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 emitidasFROM proforma_sequences sLEFT 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;