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 archivo lefa/config.py es el único punto de verdad para todas las rutas de datos locales y los valores constantes de la aplicación. Cualquier otro módulo que necesite una ruta, un tipo impositivo o una serie de facturación lo importa directamente desde aquí; nunca se repiten literales en el resto del código.

Rutas de datos

Toda la persistencia de LEFA es local. Las rutas se construyen a partir de Path.home(), por lo que el directorio raíz siempre se sitúa dentro del perfil del usuario actual, independientemente de dónde esté instalada la aplicación.
ConstanteRuta en discoDescripción
APP_DATA_DIR~/.lefaDirectorio raíz de datos de LEFA.
DATABASE_PATH~/.lefa/lefa.dbBase de datos SQLite principal.
PDF_OUTPUT_DIR~/.lefa/facturas_pdfPDFs de facturas generadas.
PRESUPUESTOS_PDF_DIR~/.lefa/presupuestos_pdfPDFs de presupuestos generados.
SMTP_CONFIG_PATH~/.lefa/smtp_config.jsonConfiguración del servidor de correo SMTP.
PREFERENCIAS_PATH~/.lefa/preferencias.jsonPreferencias del autónomo (IVA, emisor, formato, etc.).
VERIFACTU_REGISTROS_DIR~/.lefa/verifactu/registrosRegistros JSON inmutables encadenados para VeriFactu.
FACTURAE_OUTPUT_DIR~/.lefa/facturas_xmlFicheros XML en formato Facturae 3.2.
from pathlib import Path

APP_DATA_DIR           = Path.home() / ".lefa"
DATABASE_PATH          = APP_DATA_DIR / "lefa.db"
PDF_OUTPUT_DIR         = APP_DATA_DIR / "facturas_pdf"
PRESUPUESTOS_PDF_DIR   = APP_DATA_DIR / "presupuestos_pdf"
SMTP_CONFIG_PATH       = APP_DATA_DIR / "smtp_config.json"
PREFERENCIAS_PATH      = APP_DATA_DIR / "preferencias.json"
VERIFACTU_REGISTROS_DIR = APP_DATA_DIR / "verifactu" / "registros"
FACTURAE_OUTPUT_DIR    = APP_DATA_DIR / "facturas_xml"

VeriFactu

LEFA incluye soporte para el sistema de facturación verificable de la AEAT. Las dos constantes siguientes controlan el endpoint de envío y si el modo VeriFactu está activo.
VERIFACTU_URL_BASE
str
URL base de la Agencia Tributaria para el envío de registros VeriFactu (entorno de producción).
https://www2.agenciatributaria.gob.es
Para pruebas, la AEAT pone a disposición el host prewww2.aeat.es.
VERIFACTU_MODO_VERIFACTU
bool
default:"False"
Activa o desactiva el modo VeriFactu (envío real a la AEAT). Por defecto es False: LEFA genera el hash encadenado y el QR tributario con la leyenda SISTEMA INFORMÁTICO NO VERIFICADO, pero no transmite los registros.
VERIFACTU_MODO_VERIFACTU = False  # No-Verifactu hasta activar envío a AEAT
El módulo lefa/verifactu/ genera siempre el registro local y el QR tributario en el PDF, independientemente del valor de VERIFACTU_MODO_VERIFACTU. Solo el envío a la AEAT queda desactivado cuando la constante es False.

Impuestos por defecto

Estas constantes definen los tipos impositivos habituales para autónomos en España y los valores que se preseleccionan al crear una nueva factura.
IVA_OPCIONES
tuple[float, ...]
Tipos de IVA disponibles en los desplegables de la interfaz.
IVA_OPCIONES = (21.0, 10.0, 4.0, 0.0)
IRPF_OPCIONES
tuple[float, ...]
Tipos de IRPF disponibles en los desplegables de la interfaz.
IRPF_OPCIONES = (15.0, 7.0, 0.0)
DEFAULT_IVA_PORCENTAJE
float
default:"21.0"
Tipo de IVA que se aplica por defecto al crear una nueva factura. Puede cambiarse en Herramientas → Preferencias.
DEFAULT_IVA_PORCENTAJE = 21.0
DEFAULT_IRPF_PORCENTAJE
float
default:"15.0"
Retención de IRPF que se aplica por defecto al crear una nueva factura. Puede cambiarse en Herramientas → Preferencias.
DEFAULT_IRPF_PORCENTAJE = 15.0

Series

LEFA admite varias series de numeración con correlativo independiente. Las constantes siguientes definen las series predefinidas y el prefijo que se usa cuando no hay ninguna configuración personalizada.
SERIE_PRESUPUESTO
str
default:"\"PRES\""
Serie reservada para la numeración de presupuestos.
SERIE_PRESUPUESTO = "PRES"
SERIES_POR_DEFECTO
tuple[str, ...]
Conjunto de series que se inicializa en las preferencias en una instalación nueva.
SERIES_POR_DEFECTO = ("FACT", "PRES", "PROFORMA", "RECT")
La serie RECT se utiliza automáticamente al rectificar una factura existente.
SERIE_FACTURA_PREFIX
str
default:"\"FACT\""
Prefijo de la serie de facturación general. Es el fallback cuando series_facturacion está vacío en las preferencias.
SERIE_FACTURA_PREFIX = "FACT"

Keyring

La contraseña SMTP se almacena en el llavero del sistema operativo (GNOME Keyring, KWallet o Credential Manager en Windows) mediante la biblioteca keyring. Nunca se escribe en disco en texto plano.
KEYRING_SERVICE
str
default:"\"lefa-smtp\""
Nombre de servicio con el que se registra la entrada en el llavero.
KEYRING_SERVICE = "lefa-smtp"
KEYRING_USER
str
default:"\"password\""
Nombre de usuario bajo el que se guarda la contraseña en el llavero.
KEYRING_USER = "password"
En servidores Linux sin escritorio gráfico (headless) o en conexiones SSH sin sesión D-Bus activa, keyring puede no encontrar el demonio del llavero (GNOME Keyring o KWallet) y lanzar una excepción. En esos entornos se recomienda ejecutar LEFA desde una sesión de escritorio.

Función ensure_directories()

ensure_directories() crea las carpetas de datos necesarias si no existen. Es idempotente: si los directorios ya existen, no hace nada. Se invoca desde PreferenciasService (en cargar() y guardar()) cada vez que se accede o persisten las preferencias, lo que garantiza que las carpetas estén disponibles antes de cualquier operación de escritura.
def ensure_directories() -> None:
    """Crea las carpetas necesarias si no existen."""
    APP_DATA_DIR.mkdir(parents=True, exist_ok=True)
    PDF_OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    PRESUPUESTOS_PDF_DIR.mkdir(parents=True, exist_ok=True)
    VERIFACTU_REGISTROS_DIR.mkdir(parents=True, exist_ok=True)
    FACTURAE_OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
Los directorios creados son ~/.lefa, ~/.lefa/facturas_pdf, ~/.lefa/presupuestos_pdf, ~/.lefa/verifactu/registros y ~/.lefa/facturas_xml. Los archivos smtp_config.json y preferencias.json residen directamente en APP_DATA_DIR, cuya creación ya queda cubierta por la primera llamada a mkdir.

Numeración

NumeracionService (en lefa/services/numeracion_service.py) genera los números de factura a partir de tres variables: la serie, el año de emisión y la secuencia correlativa. La plantilla de formato se selecciona mediante un identificador de cadena (formato_id) que se almacena en las preferencias del autónomo bajo la clave formato_numeracion.

Formatos disponibles

El diccionario FORMATOS_NUMERACION asocia cada identificador con una plantilla de marcadores ({serie}, {anio}, {seq}). La columna «Etiqueta» reproduce literalmente los valores de ETIQUETAS_FORMATO, que son las cadenas que se muestran en la interfaz y que utilizan distintos anchos de secuencia a modo ilustrativo. El ancho real en producción se controla con digitos_secuencia en las preferencias (por defecto 4).
formato_idPlantillaEtiqueta (ETIQUETAS_FORMATO)
fact_anio_4{serie}-{anio}-{seq}FACT-2026-0001 (serie-año-4 dígitos)
anio_3{anio}-{seq}2026-001
serie_anio_3{serie}-{anio}-{seq}F-2026-001
serie_anio_compact{serie}{anio}-{seq}FAC2026-001
seq4_anio{seq}/{anio}0001/2026
serie_seq3{serie}-{seq}WEB-001 (serie sin año)
El valor por defecto de formato_numeracion es "fact_anio_4".
Los formatos que no incluyen {anio} (por ejemplo serie_seq3) mantienen un correlativo continuo sin reiniciarse al cambiar de ejercicio. Los formatos que no incluyen {serie} comparten correlativo entre todas las series.

NumeracionService.siguiente_secuencia()

Calcula el siguiente número correlativo disponible consultando las facturas ya emitidas en la base de datos.
NumeracionService.siguiente_secuencia(
    session: Session,
    serie: str,
    anio: int,
    formato_id: str,
    digitos: int = 4,
) -> int
ParámetroTipoDescripción
sessionsqlalchemy.orm.SessionSesión activa de SQLAlchemy.
seriestrSerie de facturación (p. ej. "FACT", "RECT").
aniointEjercicio fiscal (p. ej. 2026).
formato_idstrIdentificador del formato de numeración (ver tabla anterior).
digitosintNúmero de dígitos del correlativo. Por defecto 4.
Devuelve el entero siguiente al mayor correlativo encontrado en la base de datos para la combinación de serie y año indicada. Si no existe ninguna factura previa, devuelve 1.

NumeracionService.formatear_numero()

Genera la cadena del número de factura a partir de sus componentes.
NumeracionService.formatear_numero(
    serie: str,
    anio: int,
    secuencia: int,
    formato_id: str,
    digitos: int = 4,
) -> str
ParámetroTipoDescripción
seriestrSerie de facturación.
aniointAño de emisión.
secuenciaintNúmero correlativo.
formato_idstrIdentificador del formato de numeración.
digitosintNúmero de dígitos del correlativo. Por defecto 4.
Ejemplo:
from lefa.services.numeracion_service import NumeracionService

numero = NumeracionService.formatear_numero(
    serie="FACT",
    anio=2026,
    secuencia=42,
    formato_id="fact_anio_4",
    digitos=4,
)
# → "FACT-2026-0042"

Build docs developers (and LLMs) love