Skip to content

Repository files navigation

Facturize

Aplicación de escritorio (Windows/macOS/Linux, Tauri v2) que digitaliza facturas de proveedor en PDF o imagen y genera, por cada una:

  • un XML UBL 2.1 válido (factura.xml), y
  • un PDF híbrido (factura_hibrida.pdf): copia del original con el XML incrustado como factur-x.xml,

listos para importarse en Odoo como borrador editable — sin gastar créditos de digitalización IAP y sin pantalla de revisión intermedia.

Principio de diseño: la IA solo extrae datos (imagen → JSON validado). El XML lo construye siempre código determinista a partir de una plantilla verificada; la IA nunca genera XML. Ver docs/ARCHITECTURE.md.

Características

  • Entrada por selección múltiple de archivos o carpeta completa (PDF, JPG, PNG), con confirmación del lote antes de procesar.
  • Proveedores de IA intercambiables desde Ajustes: OpenAI (ChatGPT), Anthropic (Claude), Google (Gemini) o Local compatible OpenAI (llama.cpp llama-server, Ollama, LM Studio, vLLM). El MVP está probado principalmente con OpenAI y llama.cpp.
  • Deduplicación exacta (hash SHA-256) y lógica (nº de factura + NIF del proveedor), con historial completo en SQLite local.
  • Validación estricta del JSON extraído, reintentos automáticos con el error de vuelta al modelo, y flag low_confidence cuando la aritmética de la factura no cuadra.
  • Un fallo en un archivo nunca detiene el resto del lote; los fallidos se pueden reintentar desde el Historial.
  • API keys exclusivamente en el almacén seguro del sistema operativo (Credential Manager / Keychain / Secret Service); enmascarado automático de credenciales en logs.
  • Sin telemetría: las únicas llamadas de red son al proveedor de IA que tú configures.

Requisitos

  • Rust estable y pnpm (Node 20+).
  • Windows: Visual Studio Build Tools con la carga de trabajo C++ y WebView2 (preinstalado en Windows 11). Sin permisos de administrador, hay una alternativa a nivel de usuario: ejecuta una vez scripts/setup-user-toolchain.ps1 y carga el entorno en cada sesión con . .\scripts\use-user-toolchain.ps1.
  • Linux: dependencias de Tauri v2 (libwebkit2gtk-4.1-dev, libssl-dev, etc. — ver docs de Tauri) y libdbus-1-dev para el almacén de credenciales.
  • PDFium (rasterizado de PDF): se descarga con un script, ver abajo.

Puesta en marcha (desarrollo)

pnpm install

# Descargar la librería PDFium (una vez por máquina)
#   Windows:      powershell -ExecutionPolicy Bypass -File scripts/download-pdfium.ps1
#   Linux/macOS:  bash scripts/download-pdfium.sh

pnpm tauri dev

Compilar instaladores de producción:

pnpm tauri build

Configurar el proveedor de IA

En Ajustes elige el proveedor activo, su modelo, y guarda la API key si aplica. El botón Probar conexión verifica credenciales/endpoint antes de procesar nada.

Proveedor Necesita Ejemplo de modelo
OpenAI (ChatGPT) API key gpt-4o
Anthropic (Claude) API key claude-sonnet-4-5
Google (Gemini) API key gemini-2.0-flash
Local (compatible OpenAI) URL del endpoint (por defecto http://localhost:8080/v1) el modelo cargado en tu servidor

Privacidad: con proveedores en la nube, el contenido de la factura (nombres, NIF, importes, IBAN) sale de tu máquina. Con el proveedor Local no sale nunca. La app te lo recuerda en Ajustes.

Modo Local con llama.cpp

  1. Descarga llama.cpp (binario llama-server).

  2. Necesitas un modelo con visión en formato GGUF y su proyector multimodal (mmproj). Por ejemplo, Qwen2.5-VL o MiniCPM-V.

  3. Arranca el servidor; con soporte de descarga directa desde Hugging Face basta:

    llama-server -hf ggml-org/Qwen2.5-VL-7B-Instruct-GGUF --port 8080

    o con archivos locales:

    llama-server -m modelo.gguf --mmproj mmproj.gguf --port 8080
  4. En Ajustes: proveedor Local, URL http://localhost:8080/v1, y el nombre del modelo cargado. Sin API key (salvo que tu servidor use --api-key).

La app avisa si configuras una URL que no es localhost ni de red privada.

Salida

Por cada factura procesada se guardan en la carpeta de salida configurada:

  • <nombre_original>.xml — UBL 2.1 independiente.
  • <nombre_original>_hibrida.pdf — PDF original con factur-x.xml adjunto.

Nunca se sobrescribe un archivo existente: se añade sufijo _2, _3, …

En Odoo, importa cualquiera de los dos desde la vista de facturas de proveedor (o adjúntalo al correo de la alias de facturas); los datos se rellenan como borrador editable.

Tests

cd src-tauri
cargo test          # unitarios + integración (requiere PDFium descargado)
cargo clippy --all-targets -- -D warnings
cargo fmt --check
pnpm lint && pnpm typecheck

Los tests de integración levantan un servidor HTTP local que simula al proveedor de IA — no consumen ninguna API real. Ver docs/TESTING.md.

Documentación del proyecto

Documento Contenido
docs/PRD.md Producto, alcance del MVP y roadmap
docs/ARCHITECTURE.md Módulos, flujo de datos y decisiones
docs/DECISIONS.md Decisiones de implementación del MVP
docs/SECURITY.md Modelo de amenazas y gestión de credenciales
docs/TESTING.md Estrategia de tests y CI
docs/CONTRIBUTING.md Flujo de ramas y commits
docs/RELEASE.md Versionado y releases

Nota sobre validez legal

El XML generado está pensado para que Odoo lo importe correctamente. No es una factura electrónica legalmente vinculante (Facturae/FACe/Veri*Factu) — ver docs/SECURITY.md, sección 9.

Licencia

MIT

About

Digitaliza facturas de proveedor (PDF/imagen) con IA y genera XML UBL 2.1 + PDF híbrido Factur-X listos para importar en Odoo como borrador. App de escritorio (Tauri v2 + React) con OpenAI, Claude, Gemini o modelo local (llama.cpp/Ollama). Sin telemetría.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages