El modeloDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/entreunosyceros/lefa/llms.txt
Use this file to discover all available pages before exploring further.
Presupuesto representa una oferta comercial previa a la facturación. Un presupuesto no tiene validez fiscal por sí mismo, pero puede convertirse en una Factura una vez aceptado por el cliente. LEFA gestiona su ciclo de vida completo a través del enum EstadoPresupuesto, desde la fase de borrador hasta la conversión o el rechazo. Al igual que las facturas, el campo numero_presupuesto permanece NULL mientras el presupuesto es un borrador, y se asigna en el momento de su emisión.
Tabla SQL
La tabla en la base de datos SQLite se llamapresupuestos. Define la siguiente restricción de unicidad:
| Restricción | Columna | Nombre interno |
|---|---|---|
UniqueConstraint | numero_presupuesto | uq_numero_presupuesto |
numero_presupuesto admite NULL, múltiples borradores pueden coexistir sin violar la restricción hasta que se les asigna número.
Campos
Clave primaria autoincrementada. Identificador único e inmutable del presupuesto en la base de datos.
Número oficial del presupuesto (máx. 30 caracteres). Es
NULL mientras el presupuesto está en estado BORRADOR. Se asigna al emitirlo y queda protegido por la restricción uq_numero_presupuesto.Serie del presupuesto (máx. 20 caracteres). Valor por defecto:
"PRES". Permite identificar distintas series de presupuestación.Clave foránea hacia
clientes.id. Identifica el cliente al que va dirigida la oferta. No puede ser NULL.Fecha de emisión del presupuesto. Permanece
NULL en borradores. Se almacena como tipo Date de SQLAlchemy.Fecha límite de validez de la oferta. Pasada esta fecha, el presupuesto puede considerarse expirado. Puede ser
NULL si no se fija plazo.Estado actual del presupuesto según el enum
EstadoPresupuesto. Valor por defecto: EstadoPresupuesto.BORRADOR.Porcentaje de IVA aplicable al presupuesto. Valor por defecto:
21.0. Se traspasa a la factura resultante al convertir.Porcentaje de retención de IRPF. Valor por defecto:
15.0. Se traspasa a la factura resultante al convertir.Clave foránea hacia
facturas.id. Se rellena cuando el presupuesto ha sido convertido en factura. NULL mientras no se haya convertido.Enum EstadoPresupuesto
EstadoPresupuesto hereda de str y enum.Enum, por lo que sus valores son cadenas de texto serializables directamente.
| Valor del enum | Cadena almacenada | Significado |
|---|---|---|
EstadoPresupuesto.BORRADOR | "Borrador" | En preparación, sin número asignado. Editable. |
EstadoPresupuesto.EMITIDO | "Emitido" | Numerado y enviado al cliente. Pendiente de respuesta. |
EstadoPresupuesto.ACEPTADO | "Aceptado" | El cliente ha confirmado la oferta. Listo para convertir. |
EstadoPresupuesto.CONVERTIDO | "Convertido" | Se ha generado una factura a partir de este presupuesto. El campo factura_id estará relleno. |
EstadoPresupuesto.RECHAZADO | "Rechazado" | El cliente ha declinado la oferta. Estado terminal. |
Un presupuesto en estado
CONVERTIDO tiene su campo factura_id apuntando a la factura generada. La factura, a su vez, registra el presupuesto de origen en presupuesto_origen_id.Relaciones
Relación muchos-a-uno hacia el modelo
Cliente. Accesible como atributo de instancia. Se configura con back_populates="presupuestos".Relación uno-a-muchos hacia
LineaPresupuesto. Las líneas se ordenan por LineaPresupuesto.id y se eliminan en cascada (cascade="all, delete-orphan") al borrar el presupuesto.Propiedades calculadas
Todos los métodos de cálculo operan sobre la colecciónself.lineas y los porcentajes fiscales almacenados en la instancia, con la misma lógica que el modelo Factura.
Modelo LineaPresupuesto
Cada Presupuesto contiene una lista de objetos LineaPresupuesto almacenados en la tabla lineas_presupuesto. Representan los conceptos o servicios incluidos en la oferta.
Clave primaria autoincrementada de la línea del presupuesto.
Clave foránea hacia
presupuestos.id. Vincula la línea con su presupuesto padre.Descripción del concepto o servicio ofertado (máx. 500 caracteres). No puede ser
NULL.Número de unidades del concepto. Valor por defecto:
1.0.Precio estimado por unidad en euros. Valor por defecto:
0.0.Propiedad subtotal
cantidad × precio_unitario, redondeado a dos decimales. Es la base sobre la que Presupuesto.calcular_subtotal() acumula el importe total de la oferta.
La estructura de
LineaPresupuesto es intencionalmente idéntica a la de LineaFactura. Esto facilita la conversión directa de presupuesto a factura: cada línea del presupuesto se duplica como línea de la factura resultante.