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 comofactur-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.
- 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_confidencecuando 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.
- 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.ps1y 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) ylibdbus-1-devpara el almacén de credenciales. - PDFium (rasterizado de PDF): se descarga con un script, ver abajo.
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 devCompilar instaladores de producción:
pnpm tauri buildEn 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.
-
Descarga llama.cpp (binario
llama-server). -
Necesitas un modelo con visión en formato GGUF y su proyector multimodal (
mmproj). Por ejemplo, Qwen2.5-VL o MiniCPM-V. -
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
-
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.
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 confactur-x.xmladjunto.
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.
cd src-tauri
cargo test # unitarios + integración (requiere PDFium descargado)
cargo clippy --all-targets -- -D warnings
cargo fmt --check
pnpm lint && pnpm typecheckLos tests de integración levantan un servidor HTTP local que simula al proveedor de IA — no consumen ninguna API real. Ver docs/TESTING.md.
| 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 |
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.