Skip to main content

Documentation 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.

El modelo 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 llama presupuestos. Define la siguiente restricción de unicidad:
RestricciónColumnaNombre interno
UniqueConstraintnumero_presupuestouq_numero_presupuesto
Como numero_presupuesto admite NULL, múltiples borradores pueden coexistir sin violar la restricción hasta que se les asigna número.

Campos

id
int
required
Clave primaria autoincrementada. Identificador único e inmutable del presupuesto en la base de datos.
numero_presupuesto
str | None
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
str
Serie del presupuesto (máx. 20 caracteres). Valor por defecto: "PRES". Permite identificar distintas series de presupuestación.
cliente_id
int
required
Clave foránea hacia clientes.id. Identifica el cliente al que va dirigida la oferta. No puede ser NULL.
fecha_emision
date | None
Fecha de emisión del presupuesto. Permanece NULL en borradores. Se almacena como tipo Date de SQLAlchemy.
validez_hasta
date | None
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
EstadoPresupuesto
required
Estado actual del presupuesto según el enum EstadoPresupuesto. Valor por defecto: EstadoPresupuesto.BORRADOR.
porc_iva
float
required
Porcentaje de IVA aplicable al presupuesto. Valor por defecto: 21.0. Se traspasa a la factura resultante al convertir.
porc_irpf
float
required
Porcentaje de retención de IRPF. Valor por defecto: 15.0. Se traspasa a la factura resultante al convertir.
factura_id
int | None
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.
class EstadoPresupuesto(str, enum.Enum):
    """Ciclo de vida del presupuesto."""

    BORRADOR   = "Borrador"
    EMITIDO    = "Emitido"
    ACEPTADO   = "Aceptado"
    CONVERTIDO = "Convertido"
    RECHAZADO  = "Rechazado"
Valor del enumCadena almacenadaSignificado
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

cliente
Cliente
Relación muchos-a-uno hacia el modelo Cliente. Accesible como atributo de instancia. Se configura con back_populates="presupuestos".
lineas
list[LineaPresupuesto]
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ón self.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.
id
int
required
Clave primaria autoincrementada de la línea del presupuesto.
presupuesto_id
int
required
Clave foránea hacia presupuestos.id. Vincula la línea con su presupuesto padre.
descripcion
str
required
Descripción del concepto o servicio ofertado (máx. 500 caracteres). No puede ser NULL.
cantidad
float
required
Número de unidades del concepto. Valor por defecto: 1.0.
precio_unitario
float
required
Precio estimado por unidad en euros. Valor por defecto: 0.0.

Propiedad subtotal

@property
def subtotal(self) -> float:
    return round(self.cantidad * self.precio_unitario, 2)
Producto de 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.

Build docs developers (and LLMs) love