MCPcopy Index your code
hub / github.com/GeiserX/DeclaRenta

github.com/GeiserX/DeclaRenta @v0.58.4

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.58.4 ↗ · + Follow
759 symbols 2,395 edges 176 files 181 documented · 24%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

DeclaRenta banner

DeclaRenta

Herramienta fiscal gratuita para inversores con brokers internacionales.

DeclaRenta License Codecov CI Stars awesome-spain

declarenta.com — Úsalo gratis, sin registro

IBKR · Degiro · Flatex · Scalable Capital · eToro · Freedom24 · Trade Republic · Revolut · Lightyear · Coinbase · Binance · Kraken · Trading 212 → Modelo 100 · Modelo 720 · Modelo 721 · D-6

Self-hosted · Privacidad total · Tus datos no salen de tu equipo


Despliegue rápido

Deploy with Vercel Deploy to Netlify Deploy on Railway

DeclaRenta es una web estática (Vite) — funciona en cualquier hosting de archivos estáticos. También disponible como imagen Docker: drumsergio/declarenta:web.


El problema

Si inviertes con un broker extranjero, hacer la renta es un infierno:

  • Renta Web no importa datos de brokers extranjeros — todo manual
  • FIFO obligatorio con tipos ECB oficiales (no los del broker)
  • Regla anti-churning (2 meses cotizados / 1 año no cotizados) que nadie detecta automáticamente
  • Doble imposición internacional que hay que calcular a mano
  • Modelo 720 obligatorio si tus activos en el extranjero superan 50.000 EUR
  • Modelo D-6 solo obligatorio si tu participación es ≥10% del capital o derechos de voto (Orden ICT/1408/2021)

DeclaRenta automatiza todo esto.

Brokers soportados

Broker Formato Notas
Interactive Brokers Flex Query XML Trades, dividendos, corporate actions, posiciones
Degiro CSV (transacciones + cartera) Delimitador auto-detectado (coma/punto y coma)
Flatex CSV (Depotumsätze + Kontoumsätze) Dos ficheros: operaciones y movimientos de caja (dividendos/comisiones)
Scalable Capital CSV (14 columnas) Incluye savings plans y distribuciones
eToro XLSX (cuenta completa) Posiciones cerradas + dividendos + CFDs, 6+ versiones de cabeceras
Freedom24 JSON (report export) Trades, dividendos, retenciones
Revolut XLSX (Trading Account Statement) Posiciones cerradas (acciones y cripto) con PnL y comisiones
Lightyear CSV (Transaction Report) Compras, ventas, dividendos, distribuciones, intereses
Trade Republic CSV (Actividad) Operaciones de compraventa y dividendos
Trading 212 CSV (Historial de transacciones) Operaciones de compraventa y dividendos
Coinbase CSV (historial de transacciones) Crypto trades y conversiones
Binance CSV (historial de transacciones) Spot trades, conversiones e ingresos cripto
Kraken CSV (trades/ledger) Crypto trades y staking

Se pueden combinar ficheros de varios brokers en una sola ejecución para FIFO cruzado.

Modelos fiscales

Modelo Descripción Formato
Modelo 100 (IRPF) Casillas 0328, 0331, 1633, 1637, 0029, 0027, 0588 (pérdidas bloqueadas: informativo) JSON, CSV, PDF (con tipos ECB)
Modelo 720 Declaración de bienes en el extranjero (>50.000 EUR), tipos A/M/C Fixed-width AEAT (validado contra spec BOE)
Modelo 721 Revisión orientativa de criptomonedas en el extranjero (>50.000 EUR) Generación oficial pendiente: AEAT exige XML
Modelo D-6 Guía orientativa para participaciones significativas (Banco de España / AFORIX) JSON o guía paso a paso

Casillas del Modelo 100

Casilla Concepto
0328 Valor de transmisión — acciones negociadas (importe total de ventas)
0331 Valor de adquisición — acciones negociadas (coste total FIFO con tipos ECB)
1633 Valor de transmisión — otros elementos (opciones, cripto, fondos no cotizados) y divisa (FX)
1637 Valor de adquisición — otros elementos y divisa (FX)
0029 Dividendos brutos de acciones extranjeras
0027 Intereses de cuentas, depósitos y activos financieros (Art. 25.2 LIRPF)
Intereses pagados al broker (margen, no deducible — informativo)
Pérdidas bloqueadas por regla anti-churning (Art. 33.5.f/g) — informativo, no hay casilla agregada en Renta Web
0588 Deducción por doble imposición internacional

La casilla 0327 es un campo de texto (denominación de los valores), no un importe. Las ganancias por tipo de cambio (Art. 33.1 LIRPF) se declaran junto a los «otros elementos patrimoniales» en las casillas 1633/1637.

Interfaz web

La web incluye:

  • Wizard guiado: subida de ficheros → revisión de datos → resultados con casillas detalladas
  • Guías por broker: instrucciones paso a paso para obtener el informe de cada broker
  • Perfil fiscal: NIF, nombre, CCAA y teléfono para generar 720/D-6 correctamente
  • Secciones dedicadas: Modelo 100, Modelo 720, Modelo D-6 con navegación lateral
  • Gráficas interactivas: distribución por activo, G/P mensual, composición de divisas, retenciones por país
  • Comparativa interanual: guarda informes en localStorage y compara variaciones año a año
  • Detalle de casillas: desplegable con explicación de cada casilla y su normativa
  • PWA instalable: funciona offline tras la primera visita
  • Tema claro/oscuro
  • 5 idiomas: español, inglés, catalán, euskera, gallego

Inicio rápido

Web (recomendado)

Visita declarenta.com — arrastra tus ficheros y listo.

Soporta .xml, .csv, .json y .xlsx. Se pueden subir varios ficheros a la vez para FIFO cruzado entre brokers.

Docker

# Web (nginx)
docker run -p 8080:80 drumsergio/declarenta:web

# CLI
docker run --rm -v $(pwd):/data drumsergio/declarenta convert --input /data/flex_query.xml --year 2025

CLI

git clone https://github.com/GeiserX/DeclaRenta.git
cd DeclaRenta && npm install && npm run build

# Informe Modelo 100 (JSON a stdout)
node dist/cli.js convert --input flex_query.xml --year 2025

# Varios ficheros de distintos brokers
node dist/cli.js convert --input ibkr.xml --input degiro.csv --input etoro.xlsx --year 2025

# Exportar en CSV
node dist/cli.js convert --input flex_query.xml --year 2025 --format csv --output detalle.csv

# Exportar en PDF
node dist/cli.js convert --input flex_query.xml --year 2025 --format pdf --output informe.pdf

# Con compensación de pérdidas de años anteriores (Art. 49 LIRPF)
node dist/cli.js convert --input flex_query.xml --year 2025 --prior-losses perdidas.json

# Modelo 720
node dist/cli.js modelo720 --input flex_query.xml --year 2025 --nif 12345678A --name "APELLIDOS, NOMBRE"

# Modelo 720 con tipos A/M/C (comparando con declaración del año anterior)
node dist/cli.js modelo720 --input flex_query.xml --year 2025 --nif 12345678A --name "APELLIDOS, NOMBRE" --previous-720 720_2024.txt

# Modelo D-6 (guía AFORIX)
node dist/cli.js d6 --input flex_query.xml --year 2025 --nif 12345678A --name "APELLIDOS, NOMBRE"

# Modelo D-6 con detección de bajas (comparando con año anterior)
node dist/cli.js d6 --input flex_query.xml --year 2025 --nif 12345678A --name "APELLIDOS, NOMBRE" --previous-d6 d6_2024.json --format json

El broker se auto-detecta a partir del contenido del fichero. Se puede forzar con --broker <nombre>.

Motor fiscal

  • FIFO estricto con tipos de cambio ECB oficiales por fecha de operación
  • Todos los tipos de activo: acciones, ETFs, opciones, futuros, forex, bonos, CFDs y criptomonedas
  • Regla anti-churning (Art. 33.5.f/g LIRPF): bloqueo proporcional de la pérdida si se recompra el mismo valor en 2 meses (cotizados en mercado regulado) o 1 año (no cotizados/cripto) — solo se difiere la parte correspondiente a la cantidad recomprada. La pérdida diferida no se suma al coste: se reintegra al transmitir los valores recomprados. Excluye derivados y forex
  • Doble imposición (Art. 80 LIRPF): deducción por retenciones en origen, desglosado por país
  • Stock splits: forward y reverse, con liquidación de fracciones (cash-in-lieu)
  • Corporate actions: fusiones (transferencia de coste) y spin-offs (distribución proporcional)
  • Compensación de pérdidas (Art. 49 LIRPF): ventana de 4 años con compensación cruzada del 25%
  • Validador Modelo 720: verificación contra la especificación BOE del formato de registro

Observabilidad: traza del motor de divisas (FX)

Para auditar o depurar cómo se construye una cifra de divisa (casillas 1633/1637), DeclaRenta puede emitir una traza completa de los movimientos internos del motor FX: el libro mayor acquire → park → unpark → discard → profit → dispose, con el saldo del pool gastable y del principal aparcado tras cada paso. Permite reconstruir lote a lote, con tus propios datos, cómo se llegó a cada importe. Es una herramienta para usuarios avanzados y asesores; disponible desde la v0.52.0.

Está desactivada por defecto y nunca aparece en la interfaz normal (coste cero cuando está apagada).

En la web (modo diagnóstico)

El modo diagnóstico se activa de dos formas:

  • Añadiendo #debug a la URL: https://declarenta.com/#debug
  • O, de forma persistente, en la consola del navegador: localStorage.declarenta_debug = "1" y recargar.

El orden importa: la traza solo se calcula si el modo diagnóstico está activo al generar el informe. Receta fiable:

  1. Entra directamente en https://declarenta.com/#debug.
  2. Sube tus ficheros y genera el informe.
  3. Pulsa «Descargar traza de cálculo FX (diagnóstico)» → se descarga declarenta_fxtrace_<año>.csv.

En modo monodivisa, o si no hay movimientos de divisa, el botón avisa de que «no hay movimientos FX que trazar».

En la CLI

# Traza a un fichero, en CSV
node dist/cli.js convert --input flex_query.xml --year 2025 --fx-trace traza.csv --fx-trace-format csv

# Traza a stderr (sin ruta), en JSONL (por defecto)
node dist/cli.js convert --input flex_query.xml --year 2025 --fx-trace
  • --fx-trace [fichero] — sin valor vuelca a stderr; con una ruta, escribe el fichero (nunca contamina la salida estándar del informe).
  • --fx-trace-format jsonl|csvjsonl (por defecto: una línea JSON por evento, ideal para máquinas/tests) o csv (tabla legible).

Formato de la traza

Cada fila es un movimiento del motor, con estas columnas:

Columna Significado
seq Número de orden del movimiento
date Fecha del evento
kind Tipo de movimiento (ver abajo)
currency Divisa (p. ej. USD)
trigger Origen del movimiento (conversión, dividendo, interés, compra/venta de valor…)
quantityFcy Cantidad de divisa movida
rate Tipo de cambio aplicado (EUR por 1 unidad de divisa)
costBasisEur Valor de adquisición en EUR
proceedsEur Valor de transmisión en EUR
gainLossEur Ganancia/pérdida FX realizada (solo en dispose)
poolBalanceFcy Saldo de divisa «gastable» tras el movimiento
parkedBalanceFcy Saldo de principal aparcado (en posiciones aún abiertas)
positionKey Posición a la que pertenece el principal aparcado
lotId Identificador del lote consumido (UNKNOWN = sin lote previo suficiente → ganancia FX forzada a 0). Es un contador de orden de creación, compartido entre divisas — NO indica el orden FIFO.
lotAcquireDate Fecha de adquisición original del lote consumido. Esta es la prueba del FIFO: en dispose consecutivos de una misma divisa es no decreciente (se consume siempre el dólar más antigu

Extension points exported contracts — how you extend this code

NetLeg (Interface)
A coin's net position within a paired group (after netting intra-account splits).
src/parsers/binance.ts
BuyEvent (Interface)
A homogeneous repurchase available to absorb a loss, with a consumable quantity.
src/engine/wash-sale.ts
BrokerParser (Interface)
(no doc)
src/types/broker.ts
LocalizableMessage (Interface)
(no doc)
src/i18n/index.ts
CasillaBlock (Interface)
(no doc)
src/generators/casillas.ts
GuideField (Interface)
(no doc)
src/web/section-guide.ts
BinanceColumns (Interface)
(no doc)
src/parsers/binance.ts
PositionEvent (Interface)
Signed position movement used to compute shares remaining after a disposal.
src/engine/wash-sale.ts

Core symbols most depended-on inside this repo

parse
called by 484
src/types/broker.ts
t
called by 398
src/i18n/index.ts
esc
called by 186
src/web/esc.ts
get
called by 161
src/engine/fx-fifo.ts
findColumn
called by 144
src/parsers/csv-utils.ts
generateTaxReport
called by 140
src/generators/report.ts
detect
called by 115
src/types/broker.ts
processTrades
called by 112
src/engine/fifo.ts

Shape

Function 605
Interface 86
Method 62
Class 6

Languages

TypeScript100%

Modules by API surface

src/parsers/binance.ts35 symbols
src/engine/fx-fifo.ts34 symbols
src/engine/fifo.ts31 symbols
src/web/main.ts28 symbols
src/web/manual-rates.ts21 symbols
src/web/charts.ts18 symbols
src/engine/wash-sale.ts18 symbols
src/types/tax.ts16 symbols
src/parsers/ibkr.ts16 symbols
src/parsers/trading212.ts14 symbols
src/parsers/revolut.ts14 symbols
src/parsers/kraken.ts13 symbols

For agents

$ claude mcp add DeclaRenta \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact