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 Factura representa el documento de facturación central de LEFA. Gestiona todo el ciclo de vida de una factura emitida por el autónomo, desde su creación como borrador hasta su cobro. Mientras la factura permanece en estado BORRADOR, el campo numero_factura es NULL para evitar comprometer la numeración oficial antes de su emisión. El modelo incluye soporte para facturas rectificativas mediante una auto-referencia, trazabilidad de origen desde presupuestos y campos de encadenamiento para el sistema VeriFactu.

Tabla SQL

La tabla en la base de datos SQLite se llama facturas. Define la siguiente restricción de unicidad:
RestricciónColumnaNombre interno
UniqueConstraintnumero_facturauq_numero_factura
Esto garantiza que no existan dos facturas con el mismo número oficial una vez asignado. Como numero_factura admite NULL, múltiples borradores pueden coexistir sin violar la restricción.

Campos

id
int
required
Clave primaria autoincrementada. Identificador único e inmutable de la factura en la base de datos.
numero_factura
str | None
Número oficial de la factura (máx. 30 caracteres). Es NULL mientras la factura está en estado BORRADOR. Se asigna en el momento de la emisión y queda protegido por la restricción de unicidad uq_numero_factura.
serie
str
Serie de facturación (máx. 20 caracteres). Valor por defecto: "FACT". Permite separar distintas series de facturación (p. ej. "RECT" para rectificativas).
cliente_id
int
required
Clave foránea hacia clientes.id. Identifica el cliente destinatario de la factura. No puede ser NULL.
fecha_emision
date | None
Fecha en que se emite la factura. Permanece NULL en borradores. Se almacena como tipo Date de SQLAlchemy.
fecha_vencimiento
date | None
Fecha límite de pago acordada con el cliente. Puede ser NULL si no se establece plazo. Se usa en texto_estado_vencimiento() para calcular el estado de cobro.
estado
EstadoFactura
required
Estado actual de la factura según el enum EstadoFactura. Valor por defecto: EstadoFactura.BORRADOR. Controla qué operaciones están disponibles sobre la factura.
porc_iva
float
required
Porcentaje de IVA aplicable a la factura. Valor por defecto: 21.0. Se usa en calcular_iva().
porc_irpf
float
required
Porcentaje de retención de IRPF aplicable. Valor por defecto: 15.0. Se usa en calcular_irpf().
enviada
bool
required
Indica si la factura ha sido enviada por correo electrónico al cliente. Valor por defecto: False.
fecha_envio
date | None
Fecha en que se realizó el envío por correo. Es NULL si enviada es False. Se formatea en texto_estado_envio().
destinatario
str | None
Dirección de correo electrónico a la que se envió la factura (máx. 150 caracteres). Puede ser NULL.
verifactu_hash
str | None
Hash SHA de 64 caracteres generado para el sistema VeriFactu. Es inmutable tras la emisión. NULL hasta que se genera el hash.
verifactu_hash_anterior
str | None
Hash de la factura precedente en la cadena VeriFactu (máx. 64 caracteres). Permite el encadenamiento requerido por la normativa. NULL en la primera factura de la serie.
factura_rectificada_id
int | None
Clave foránea auto-referencial hacia facturas.id. Si no es NULL, indica que esta factura rectifica a la factura con ese id. Se usa junto a la propiedad es_rectificativa.
presupuesto_origen_id
int | None
Clave foránea hacia presupuestos.id. Registra el presupuesto del que se generó esta factura mediante conversión. NULL si la factura se creó directamente.

Enum EstadoFactura

EstadoFactura hereda de str y enum.Enum, por lo que sus valores son cadenas de texto directamente comparables y serializables.
class EstadoFactura(str, enum.Enum):
    """Estados posibles de una factura en el flujo operativo."""

    BORRADOR = "Borrador"
    EMITIDA  = "Emitida"
    COBRADA  = "Cobrada"
Valor del enumCadena almacenadaSignificado
EstadoFactura.BORRADOR"Borrador"Factura en edición. Sin número oficial asignado. Modificable.
EstadoFactura.EMITIDA"Emitida"Factura numerada y enviada al cliente. Solo lectura.
EstadoFactura.COBRADA"Cobrada"Pago recibido y confirmado. Estado terminal.
Una factura en estado EMITIDA o COBRADA no puede editarse. La propiedad es_editable devolverá False en ambos casos.

Relaciones

cliente
Cliente
Relación muchos-a-uno hacia el modelo Cliente. Accesible como atributo de instancia. Se configura con back_populates="facturas".
factura_rectificada
Factura | None
Relación auto-referencial. Apunta a la instancia Factura que esta factura está rectificando. Se establece mediante remote_side="Factura.id" y la clave foránea factura_rectificada_id. Devuelve None si no es una rectificativa.
lineas
list[LineaFactura]
Relación uno-a-muchos hacia LineaFactura. Las líneas se ordenan por LineaFactura.id y se eliminan en cascada (cascade="all, delete-orphan") al borrar la factura.

Propiedades calculadas

es_editable (propiedad)

@property
def es_editable(self) -> bool:
    return self.estado == EstadoFactura.BORRADOR
Devuelve True únicamente cuando la factura está en estado BORRADOR. La interfaz de LEFA usa esta propiedad para habilitar o deshabilitar controles de edición.

es_rectificativa (propiedad)

@property
def es_rectificativa(self) -> bool:
    return self.factura_rectificada_id is not None
Devuelve True si la factura tiene asignada una referencia a otra factura que corrige. Equivale a comprobar que factura_rectificada_id no sea None.

Métodos de cálculo

Todos los métodos de cálculo operan sobre la colección self.lineas y los porcentajes fiscales almacenados en la instancia.

Modelo LineaFactura

Cada Factura contiene una lista de objetos LineaFactura almacenados en la tabla lineas_factura. Representan los conceptos o servicios facturados de forma individual.
id
int
required
Clave primaria autoincrementada de la línea.
factura_id
int
required
Clave foránea hacia facturas.id. Vincula la línea con su factura padre.
descripcion
str
required
Descripción del concepto o servicio (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 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 Factura.calcular_subtotal() acumula el total de todas las líneas.

Build docs developers (and LLMs) love