Link another Caudal (phone, USB) with a code or a QR instead of the password, choosing the server's root certificate as a file; read Bitcoin straight from Bitcoin Core or Knots, without an Electrum server; Android app (beta) and a Windows build script. Fixed: Save did nothing for expenses, refunds and dividends entered by hand.
470 lines
25 KiB
Markdown
470 lines
25 KiB
Markdown
# Caudal — notas técnicas
|
|
|
|
Caudal es una aplicación local que se usa desde el navegador (Python, sin
|
|
depender de internet para funcionar) para llevar una cartera: fondos, planes,
|
|
cripto, metales, acciones, préstamos, dividendos, inversiones cerradas y un
|
|
asistente que entiende frases. Este fichero explica cómo está hecha y cómo se
|
|
mantiene una instalación que se lleva desde su carpeta, por ejemplo en un USB.
|
|
Para instalarla en un servidor de casa, ver `empaquetado/LEEME.md`.
|
|
|
|
```
|
|
bash abrir_app.sh # abre la aplicación (prepara Python si hace falta)
|
|
bash actualizar_app.sh # trae la última versión de la rama «main» de tu servidor git
|
|
```
|
|
|
|
Qué hay dentro: `programa/cartera/__init__.py` lista los módulos y qué hace cada
|
|
uno. Las pruebas (`programa/pruebas/`) se pasan enteras sin internet:
|
|
|
|
```
|
|
cd programa && python3 -m unittest discover -s pruebas
|
|
```
|
|
|
|
## Qué hay en el repositorio y qué no
|
|
|
|
Solo el programa, las pruebas y una cartera **ficticia** (`pruebas/cartera_ficticia/`,
|
|
con importes inventados). Nunca datos personales: `datos/`, `backups/`,
|
|
`bitcoin.json` y las notas privadas están en `.gitignore`.
|
|
|
|
## Cómo se actualiza una instalación
|
|
|
|
La carpeta de la instalación es un clon de este repositorio. `actualizar_app.sh`:
|
|
|
|
- trae la rama `main` del repositorio del que se clonó y enseña las novedades;
|
|
- **prueba la versión nueva en una copia aparte** (pruebas automáticas y lectura
|
|
de tus datos), pregunta y solo entonces la aplica;
|
|
- guarda la versión anterior: `bash actualizar_app.sh --volver`.
|
|
|
|
Solo hace falta red y git al actualizar; la aplicación funciona sin conexión.
|
|
Quien mantenga su propia copia puede proteger `main` en su servidor y pasar los
|
|
cambios por otra rama, para que nada llegue a la instalación sin revisarlo.
|
|
|
|
## Primera vez
|
|
|
|
```
|
|
git clone <dirección de tu repositorio> caudal && cd caudal && bash abrir_app.sh
|
|
```
|
|
|
|
Los datos (`datos/`), las copias (`backups/`) y los paquetes de Python guardados
|
|
(`wheels/`) viven dentro de `programa/`, fuera del repositorio: actualizar nunca
|
|
los toca.
|
|
|
|
## Entorno de Python
|
|
|
|
`abrir_app.sh` lo prepara solo con `entorno_python.sh`: un entorno en
|
|
`/tmp/.cartera-venv` (se borra al reiniciar el equipo y se recrea en unos
|
|
segundos). Usa los paquetes de `wheels/` si están y, si no, los descarga de
|
|
internet. Para poder instalar sin internet en adelante:
|
|
|
|
```
|
|
bash programa/entorno_python.sh --guardar-wheels
|
|
```
|
|
|
|
Si falta el módulo de entornos: `sudo apt install python3-venv` (o
|
|
`python3.12-venv`, según la versión).
|
|
|
|
## Si se estropea o se pierde el equipo o el USB
|
|
|
|
Lo que se pierde: las copias automáticas de `backups/` y los cambios que no
|
|
hubieras sincronizado. El programa está en su repositorio y los datos, si usas
|
|
«Copia cifrada en tu servidor git», cifrados con tu clave GPG en el repositorio
|
|
de datos que elegiste.
|
|
|
|
1. Clona el programa en el equipo o el USB nuevo (ver «Primera vez»).
|
|
2. `bash abrir_app.sh`: preparará Python (con internet) y, al no encontrar
|
|
datos, ofrecerá **recuperarlos de la copia cifrada**. Vuelven también los
|
|
monederos de Bitcoin y los ajustes de extractos. Nunca sobrescribe datos que
|
|
ya existan. La app queda sincronizada.
|
|
3. Opcional: `bash programa/entorno_python.sh --guardar-wheels` para poder
|
|
instalar sin internet.
|
|
|
|
**Simulacro** (recomendable de vez en cuando; no toca tu instalación):
|
|
|
|
```
|
|
bash programa/simulacro_usb_nuevo.sh
|
|
```
|
|
|
|
Descarga el programa en una carpeta temporal, crea Python desde cero, pasa
|
|
las pruebas, recupera los datos con tu clave y los compara con los que tienes.
|
|
|
|
## Préstamos recibidos (deudas)
|
|
|
|
Tipo de activo «Préstamo recibido (deuda)», distinto del «Préstamo concedido»
|
|
(dinero que prestas tú). Cuota constante, sistema francés, tipo fijo. Se da
|
|
de alta desde una fecha con lo que dice el banco: capital pendiente, TIN,
|
|
cuotas que quedan y fecha de la próxima cuota. Las cuotas se calculan solas
|
|
(no se apuntan); solo se registran:
|
|
|
|
- **Amortizaciones anticipadas**, reduciendo plazo o cuota. El formulario
|
|
simula antes cuánto ahorras con cada opción. También con el asistente:
|
|
«amorticé 5.000 € del préstamo reduciendo plazo».
|
|
- **Pendiente según el banco** de vez en cuando: corrige las diferencias de
|
|
redondeo y la app sigue desde esa cifra.
|
|
|
|
La deuda no entra en la rentabilidad: resta en el **patrimonio neto**, y así
|
|
sale también al exportar a Excel. Motor en `cartera/deuda.py`.
|
|
|
|
## Fiscal: lo que hay que declarar
|
|
|
|
La pestaña **Fiscal** enseña, ejercicio a ejercicio, las cifras como las pide
|
|
la declaración, que no son las de la cartera: la cartera usa el coste medio
|
|
para decir cómo va la inversión, y Hacienda manda que lo vendido sea lo
|
|
primero que se compró (**FIFO**).
|
|
|
|
- **Ganancias y pérdidas** de cada venta o reembolso, con las compras de las
|
|
que sale (pulsa la fila). Todo el bitcoin es una sola bolsa, esté donde
|
|
esté; los traslados entre tus lugares no son ventas; un traspaso entre
|
|
fondos no tributa y conserva coste y fechas.
|
|
- **Dividendos, intereses y rentas** cobrados, con su retención.
|
|
- **Lo minado o recibido sin pagar**, a su valor de mercado de ese día.
|
|
- **Lo que tenías a 31 de diciembre**, con su coste y su valor.
|
|
- **Lo que falta por resolver** antes de fiarse: importes estimados, ventas
|
|
sin compras suficientes apuntadas…
|
|
|
|
- **La regla de la recompra** («de los dos meses»): una pérdida en acciones,
|
|
ETF o fondos no se resta si compraste el mismo valor cerca de la venta. La
|
|
pestaña dice cuánto queda aplazado, por qué compra, y en qué año se libera
|
|
al vender lo recomprado. En territorio común, Navarra y Gipuzkoa no se
|
|
aplica a las criptomonedas; en Bizkaia sí (desde 2025) y en Álava también
|
|
(desde 2026).
|
|
|
|
Los criterios aplicados y su fuente se listan al pie de la pestaña, y tres se
|
|
pueden elegir ahí mismo: si la comisión de red es una pequeña venta o no
|
|
tributa, si lo minado entra por su valor de ese día o a coste cero (cuando no
|
|
se declaró al recibirlo), y el plazo de la recompra en fondos (dos meses o un
|
|
año). No entran los planes de pensiones. Las **cuentas de bróker o trading**
|
|
(futuros, forex, CFD…) se siguen por lo que metes, lo que sacas y el saldo; su
|
|
resultado de cada año se copia del informe fiscal del bróker en la pestaña y
|
|
entra en la cuota con las ganancias y pérdidas.
|
|
|
|
- **Lo que saldría a pagar por el ahorro**, paso a paso, con las reglas del
|
|
territorio donde declaras (**territorio común, Álava, Bizkaia, Gipuzkoa o
|
|
Navarra**): los dos saldos (rendimientos, y ganancias y pérdidas), las
|
|
pérdidas de años anteriores (cuatro años), la compensación entre saldos
|
|
donde la haya (hasta el 25 % en territorio común y Navarra; en el País Vasco
|
|
no hay), las exenciones propias de cada territorio, la escala y lo ya
|
|
retenido. Es una estimación de una parte de la declaración: no ve lo que no
|
|
está en la cartera, ni la parte general, ni las deducciones. En Canarias,
|
|
Ceuta y Melilla se declara con las reglas de territorio común; la deducción
|
|
de Ceuta y Melilla no se calcula.
|
|
|
|
Las reglas de cada territorio no están en el código: están en
|
|
`cartera/fiscal/reglas/<territorio>.json`, por tramos de ejercicios, cada una
|
|
con su artículo y una marca de si se ha comprobado contra la norma de ese año.
|
|
Los ejercicios recientes están comprobados contra la norma de cada
|
|
territorio; los más antiguos usan la escala previa y lo avisan en pantalla.
|
|
La minería, la regularización (recargos, intereses y prescripción, que en
|
|
Álava es de cinco años) y la regla de la recompra en criptomonedas también
|
|
salen de esos ficheros. Es una ayuda para preparar la declaración,
|
|
no asesoría fiscal. Motor en `cartera/fiscal/`, aparte del de la cartera: lee
|
|
las mismas operaciones y no cambia ninguna cifra.
|
|
|
|
## Inmuebles
|
|
|
|
Viviendas, garajes, trasteros, locales, naves y terrenos, cada uno con su
|
|
ficha (qué es, para qué lo usas, dónde está y cómo reconocerlo si tienes
|
|
varios). Se apunta la compra con sus gastos, los alquileres cobrados, los
|
|
gastos (IBI, comunidad, seguro, reparaciones…) y las mejoras, y sale la
|
|
rentabilidad del alquiler de los últimos doce meses, bruta y neta, de cada
|
|
uno y de todos juntos.
|
|
|
|
- **El valor, sin apuntarlo a mano:** en las viviendas se estima cada
|
|
trimestre con el Índice de Precios de Vivienda del INE de su comunidad,
|
|
partiendo del precio de compra o de la última tasación que apuntes. La
|
|
serie viene con el programa y se pone al día al actualizar precios. En
|
|
garajes, locales y terrenos urbanos se puede activar, pero es solo
|
|
aproximado.
|
|
- **Fincas rústicas:** con su superficie y su cultivo (secano y regadío por
|
|
separado), el valor se mueve cada año con el precio de la tierra que
|
|
publica el Ministerio de Agricultura para ese cultivo en su comunidad (si
|
|
allí no hay dato, el nacional). Puede partir de lo que costó o, si se
|
|
heredó o no se sabe, de la superficie por el precio medio. Si cambia el
|
|
cultivo (pasar a regadío, plantar viña), se cambia en la ficha con su
|
|
fecha. La serie viene con el programa y se renueva con cada versión.
|
|
- **Vivienda protegida:** su valor nunca pasa del precio máximo de venta.
|
|
- **Tu casa** (uso propio) cuenta en el patrimonio, no como inversión.
|
|
- **La hipoteca** (un «préstamo recibido») se vincula al inmueble: se ve lo
|
|
que es tuyo de verdad y sus intereses cuentan como gasto del alquiler.
|
|
|
|
**Lo que hay que declarar del alquiler**, en la pestaña Fiscal, con las
|
|
reglas de cada territorio (`cartera/fiscal/alquiler.py` y el bloque
|
|
«alquiler» de cada fichero de reglas):
|
|
|
|
- **Territorio común:** a la parte general; todos los gastos y la
|
|
amortización (3 % del mayor entre el coste y el valor catastral, sin el
|
|
suelo); intereses y reparaciones, como mucho lo cobrado, y el exceso pasa a
|
|
los cuatro años siguientes. La reducción por alquiler de vivienda la eliges
|
|
en la ficha según tu contrato (cambió en 2024 y con el decreto ley 29/2026).
|
|
Los inmuebles vacíos imputan renta (2 %, o 1,1 % con el catastral revisado).
|
|
- **Navarra:** a la parte general; todos los gastos, como mucho lo cobrado,
|
|
con arrastre de cuatro años; reducción del 50, 70 o 90 % según el caso.
|
|
- **País Vasco:** la vivienda habitual del inquilino, a la base del ahorro,
|
|
con una bonificación (30 %, 35 % o 70 % desde 2025; 20 % antes) y solo los
|
|
intereses y el seguro de impago como gasto; temporada y turístico, a la
|
|
general; garajes y locales, gastos y amortización; nunca en negativo.
|
|
|
|
Cada gasto de un inmueble lleva su clase (reparación, intereses, seguro de
|
|
impago u otro). Un cobro se puede marcar como impagado: no cuenta como
|
|
dinero recibido, se declara igual y, pasados seis meses, se resta como saldo
|
|
de dudoso cobro donde la norma lo permite.
|
|
|
|
**Al vender**, la ganancia o pérdida va a la base del ahorro: lo cobrado (ya
|
|
sin los gastos de la venta) menos lo que costó con sus gastos y mejoras y
|
|
menos lo amortizado por el alquiler; en el País Vasco, cada importe con su
|
|
coeficiente de actualización. No se calculan la exención de la vivienda
|
|
habitual ni los coeficientes de abatimiento de antes de 1995 (se avisa).
|
|
|
|
En el País Vasco los coeficientes de actualización se aplican también a
|
|
acciones, fondos y criptomonedas (tablas en `reglas/<territorio>.json` →
|
|
«coeficientes»).
|
|
|
|
## Letras, bonos y depósitos
|
|
|
|
Un tipo propio, «Renta fija», para Letras del Tesoro, bonos u obligaciones y
|
|
depósitos a plazo, con su nominal, su interés, cada cuánto paga y cuándo vence.
|
|
Se apunta la compra (lo pagado; la cantidad es el nominal), los cupones o
|
|
intereses cobrados y la devolución al vencer o la venta. El valor se calcula
|
|
solo cada fin de mes (de lo pagado al nominal, más los intereses ganados) y
|
|
avisa al vencer. Para Hacienda, cupones, intereses y la diferencia entre lo
|
|
pagado y lo devuelto son rendimientos del capital mobiliario y van a la base
|
|
del ahorro. Los cupones y la devolución al vencer se apuntan solos, como
|
|
estimados para confirmarlos con el extracto.
|
|
|
|
**Precio de mercado:** con el ISIN en el campo «Código», al actualizar precios
|
|
Caudal pregunta a BME (AIAF deuda pública, corporativa y extranjera, SENAF y
|
|
MARF) por el último precio negociado o, si no hubo operaciones, el punto medio
|
|
entre compra y venta; el valor es el nominal que queda por ese precio más el
|
|
cupón corrido. Los días sin cotización sigue el valor calculado. Va por el
|
|
canal público de la web de BME (`cartera/bme.py`, sin dependencias nuevas): si
|
|
BME lo cambia, se avisa y se sigue con el valor calculado.
|
|
|
|
## Bitcoin desde tu nodo
|
|
|
|
**Más → Bitcoin desde mi nodo…** compara los bitcoins apuntados con los que ve
|
|
tu servidor Electrum (electrs o Fulcrum), por Tor si su dirección es `.onion`,
|
|
y te propone qué apuntar de cada transacción nueva: compra, cobro, minería,
|
|
venta, pago, comisión de red, traslado entre lugares tuyos… o enlazarla con una
|
|
operación que ya tenías apuntada. Solo se guardan claves **públicas**
|
|
(xpub, ypub, zpub). La comprobación diaria solo avisa de lo que pase a partir de
|
|
darlas de alta; para el pasado, ver «Todo el historial». Las dos usan el mismo
|
|
motor y la misma ventana: lo que decides en una queda decidido en la otra, y
|
|
todo lo guardado desde el nodo se puede deshacer en «Importaciones hechas».
|
|
|
|
**Sin servidor Electrum** también vale: al añadir el servidor se elige
|
|
«Directamente al nodo (Bitcoin Core o Knots)» y se da su usuario y contraseña
|
|
de RPC (puerto 8332). Caudal crea en el nodo un monedero «caudal» **sin claves
|
|
privadas** (solo mira), le da tus claves públicas o direcciones y el nodo repasa
|
|
la cadena una vez: de unos minutos (con `blockfilterindex=1`) a varias horas.
|
|
Mientras dura, Caudal lo dice y no enseña cifras a medias. No sirve un nodo
|
|
podado. Lo prudente es un usuario de RPC solo para Caudal (`rpcauth`) limitado
|
|
con `rpcwhitelist` a las órdenes de `METODOS` en `cartera/core.py`. Por este
|
|
camino el nodo sigue 1000 direcciones por rama; si un monedero tiene más, se
|
|
avisa. Motor en `cartera/core.py`; por fuera es igual que `electrum.py`.
|
|
|
|
Las claves viven en `programa/bitcoin.json` (permisos `600`). No entran en el
|
|
repositorio del programa, pero sí **viajan cifradas en la copia de tu servidor git**,
|
|
para que una instalación nueva no tenga que volver a teclearlas.
|
|
|
|
### Lo que pagaste frente al mercado (prima)
|
|
|
|
De cada compra o venta de bitcoin la app calcula la **prima**: cuánto se aleja
|
|
tu precio del cierre de ese día. Sale bajo el precio en Operaciones, y en
|
|
**Bitcoin desde mi nodo → Importes y prima** hay una lista para repasarlas:
|
|
|
|
- pon el importe que pagaste de verdad (si fueron varios pagos, escríbelos
|
|
sumados: `350 + 420,50`) y la compra deja de ser «estimada»;
|
|
- adjunta ahí mismo los justificantes, uno por pago si quieres;
|
|
- si un precio queda muy lejos del mercado (más de un 15 % peor, o más de un
|
|
5 % mejor) se avisa en «Para revisar», porque suele ser una errata. Si la
|
|
cifra es buena, «La cifra es buena» y no se avisa más.
|
|
|
|
No cambia ningún cálculo: el coste de una compra es lo que pagaste, con su
|
|
prima. Motor en `cartera/prima.py`.
|
|
|
|
### Un monedero compartido con otra persona
|
|
|
|
Si de un monedero solo una parte es tuya, ponlo al editarlo: «Mi parte del
|
|
monedero (%)» (50 = la mitad). Desde entonces todo lo de ese monedero cuenta
|
|
por tu parte: de 1 BTC que llega se propone apuntar 0,5, y el cuadre se hace
|
|
contra la mitad de lo que ve el nodo. En un reparto (una salida a un monedero
|
|
tuyo y otra al otro dueño) lo tuyo es un traslado y lo del otro no aparece: no
|
|
es un regalo ni una venta, porque nunca fue tuyo. Si ya tenías operaciones
|
|
guardadas de ese monedero, «Revisar todo el historial» avisa de las que han
|
|
dejado de encajar y las deshace de una vez para volver a decidirlas.
|
|
|
|
### Lugares: dónde tienes cada bitcoin
|
|
|
|
Tu bitcoin es **un solo activo** («Bitcoin»), esté donde esté: para Hacienda y
|
|
para la rentabilidad es una sola bolsa. Dónde está —un exchange, el monedero del móvil, el
|
|
de escritorio, una multifirma, un nodo Lightning— es un **lugar** de ese activo, y se ve en su
|
|
ficha («Dónde lo tienes», con el saldo de cada uno).
|
|
|
|
- Cada **monedero** del nodo es un lugar (se crea solo con su nombre; en el
|
|
formulario del monedero se puede elegir otro o compartirlo).
|
|
- Cada **exchange** de un extracto importado es un lugar (se crea solo).
|
|
- Los **nodos Lightning** se crean a mano en la ficha: «+ Lugar», tipo «Nodo
|
|
Lightning».
|
|
- Mover entre lugares tuyos es un **Traslado**: una sola línea «Exchange →
|
|
Monedero», que no es compra ni venta y no cambia el coste. Su comisión (lo que se
|
|
pierde por el camino) va unida al traslado y sí baja la cantidad. Se apunta a
|
|
mano en «+ Operación», tipo «Traslado» (el traspaso a otro activo, igual:
|
|
tipo «Traspaso»).
|
|
- En **Operaciones**, al filtrar por un activo con lugares aparece el filtro
|
|
«Todos los lugares» (con «Sin lugar» y el saldo de ese lugar). «+ Operación»
|
|
abre ya en el activo y el lugar que estés filtrando.
|
|
- Un activo aparte que en realidad es otro sitio del mismo bitcoin («BTC en
|
|
Phoenix») se une con «Unir otro activo como lugar…» en la ficha: sus
|
|
operaciones pasan a «Bitcoin» con ese lugar y sus traspasos se convierten en
|
|
traslados.
|
|
- L-BTC (Liquid) sigue siendo **otro activo**: pasar de BTC a L-BTC con un swap
|
|
puede ser una permuta, así que es un traspaso, no un traslado.
|
|
|
|
### Todo el historial
|
|
|
|
**Revisar todo el historial** (en la misma ventana) recorre todas las
|
|
transacciones de todos los monederos desde la primera y te propone qué apuntar
|
|
de cada una. No se guarda nada hasta que marcas las filas y pulsas «Guardar».
|
|
|
|
- **Se hace a ratos.** Lo leído del nodo se guarda en este equipo
|
|
(`programa/bitcoin_cache.json`, permisos `600`, no viaja a la copia cifrada): la
|
|
revisión se reabre al instante y «Volver a leer el nodo» solo trae lo nuevo.
|
|
Lo que dejas elegido sin guardar se recuerda. Arriba se ve cuánto llevas, y se
|
|
puede filtrar por año.
|
|
- **Da de alta todos los monederos antes de empezar.** Si añades uno después y
|
|
una decisión guardada deja de encajar (aquella «venta» era en realidad un
|
|
envío a tu propio monedero), sale un aviso con «Deshacer esa decisión».
|
|
|
|
- **Todos los monederos cuentan como uno.** Pasar bitcoin de un monedero tuyo a
|
|
otro no es compra ni venta: es un **traslado** entre sus lugares (o, si están
|
|
en activos distintos, un traspaso que conserva el coste medio).
|
|
- **Lo que ya tienes apuntado no se toca.** Si una operación tuya se parece
|
|
(mismo activo y lugar, cantidad casi igual, fecha cercana) se propone
|
|
*enlazarla*: se le anota el txid y ninguna cifra cambia.
|
|
- **Las retiradas y depósitos de los exchanges se emparejan solos.** Importa
|
|
antes el extracto del exchange: cada retirada queda como traslado «Exchange → ?»
|
|
y cada depósito como «? → Exchange». Cuando el historial ve llegar (o salir)
|
|
esa cantidad en un monedero, propone enlazarlo (✓): al guardar se completa el
|
|
extremo que faltaba.
|
|
- **Una salida no se supone venta**: eliges venta, pago o regalo, o «va a otro
|
|
lugar mío» (un nodo Lightning, un exchange), que es un traslado. Crea antes el
|
|
lugar en la ficha de «Bitcoin». Si la salida va a un contrato P2WSH, la app
|
|
avisa de que parece la apertura de un canal.
|
|
- Arriba se ve, **por monedero**, lo que hay en el nodo, lo apuntado ahí y lo
|
|
que habría **tras guardar lo marcado**: cuando pone «cuadra», está bien. «Sin
|
|
lugar» es lo apuntado sin decir dónde (lo de antes de los lugares) más los
|
|
traslados de exchanges aún sin su otro extremo.
|
|
- Los euros propuestos son una **estimación** con el cierre del día (serie
|
|
empaquetada `cartera/serie_btc_eur.csv`, Bitstamp desde 2011, contrastada con
|
|
otra fuente; se regenera con `python3 herramientas/serie_btc_eur.py`). En una
|
|
compra P2P pon lo que pagaste de verdad: ese es el coste fiscal.
|
|
- **Deshacer**: «Importaciones hechas» lista cada guardado y lo deshace entero
|
|
(borra lo creado, quita los enlaces y vuelve a dejarlo pendiente).
|
|
**«Empezar de cero…»** quita de una vez todo lo del historial y todo lo que
|
|
metieron los extractos de exchanges, sin tocar los monederos ni lo apuntado antes.
|
|
|
|
### De dónde viene cada moneda
|
|
|
|
**Mis monedas** lista las monedas (UTXO) que tienes sin gastar y, de cada una,
|
|
de dónde viene: se sigue hacia atrás, transacción a transacción, hasta donde
|
|
entró (compra, minado, algo que llegó de fuera). Cuando una transacción juntó
|
|
varias monedas, la nueva viene de cada una **a prorrata** de lo que valía; la
|
|
parte de terceros de un coinjoin se ve aparte. Con cada origen: lo que pagaste
|
|
por bitcoin (si lo tienes apuntado) y el cierre de ese día. Es informativo: no
|
|
cambia cifras ni el cálculo fiscal. Usa lo último leído del nodo.
|
|
|
|
## Actividades: la rentabilidad de la minería
|
|
|
|
Cada operación puede llevar el nombre de una **actividad** (por ejemplo
|
|
«Minería»). En el resumen aparece una tarjeta con sus cifras propias: lo puesto
|
|
(aparatos y hosting), lo recuperado, lo producido, la TIR y **a cuánto te sale
|
|
cada bitcoin minado**, que es lo que dice si compensa. Marcar operaciones no
|
|
cambia ninguna cifra de la cartera: es una lectura aparte de lo que ya tienes.
|
|
|
|
## Cuando te devuelven parte de un gasto
|
|
|
|
Los gastos ligados a un activo (el hosting de los mineros, los aparatos, la
|
|
custodia) se apuntan como **Gasto** y suben su coste. Si te devuelven parte de
|
|
ese dinero, se apunta como **Devolución de un gasto**, no como dividendo: un
|
|
dividendo es una renta que produce el activo, y esto es un gasto que se anula.
|
|
|
|
La diferencia no está en cuánto, sino en dónde: la TIR y la ganancia total
|
|
salen igual de las dos maneras —el euro entra el mismo día—, pero la devolución
|
|
**baja el coste** y, con él, el precio medio, y sube el ROI. Y deja de mezclarse
|
|
con los dividendos y los intereses de verdad.
|
|
|
|
Si el importe aún es provisional, márcala con «Cifras aproximadas»: cuando
|
|
sepas el definitivo, la editas y se confirma.
|
|
|
|
## A qué precio se valora cada cosa
|
|
|
|
- **Acciones y ETF con ISIN** (LS Exchange): al
|
|
precio de **compra** (bid), que es lo que cobrarías si vendieras ahora y lo
|
|
que enseñan las aplicaciones de los brókers. Si no se puede leer, se usa el
|
|
precio medio entre compra y venta, que es algo mayor.
|
|
- **Fondos y planes**: el valor liquidativo publicado (no hay compra y venta).
|
|
- **Bitcoin y metales**: el precio de mercado de la fuente (CoinGecko, etc.),
|
|
que no descuenta el margen que cobre cada bróker o exchange al vender.
|
|
|
|
## Si un precio deja de actualizarse
|
|
|
|
Los precios salen de webs ajenas y a veces cambian sin avisar: en agosto de 2026
|
|
se cayeron a la vez Morningstar, la CNMV y la web de una gestora. La
|
|
aplicación ya avisa cuando un precio lleva más de una semana sin moverse, pero
|
|
eso llega tarde y no dice de quién es la culpa.
|
|
|
|
**Más → Comprobar las fuentes de precios…** pregunta a cada web con un ejemplo
|
|
público —un fondo, un ETF, bitcoin y el oro— y dice cuál contesta hoy y cuál no.
|
|
No consulta ningún activo tuyo. Lo mismo desde la terminal, sin abrir la
|
|
aplicación:
|
|
|
|
python3 -m cartera.precios
|
|
|
|
La CNMV sale siempre como «—»: dejó de publicar el valor liquidativo en 2026 y
|
|
se conserva solo por si vuelve. Que aparezca ahí no es una avería nueva.
|
|
|
|
Cada fuente vive en `cartera/precios.py`, una función por sitio, y se prueba en
|
|
`pruebas/test_precios.py` contra respuestas guardadas en `pruebas/respuestas/`.
|
|
Para arreglar una fuente rota: cambiar su función, guardar la respuesta nueva en
|
|
esa carpeta y ajustar su prueba.
|
|
|
|
## Llevarse los números fuera
|
|
|
|
**Más → Exportar a Excel (.xlsx)** guarda una foto de la cartera: una hoja con
|
|
lo mismo que ves en el resumen (incluidos los préstamos recibidos y el
|
|
patrimonio neto), otra con todos los movimientos y otra con los precios. Son
|
|
valores, sin fórmulas: los abre cualquier programa de hojas de cálculo. Lo que
|
|
se edite ahí no vuelve a la aplicación; los datos de verdad son los ficheros de
|
|
texto de `datos/`, que se leen con cualquier editor. También desde la terminal:
|
|
|
|
python3 -m cartera.exportar_xlsx datos/ cartera.xlsx
|
|
|
|
## Cuando cambia el formato de los datos
|
|
|
|
`datos/version.json` dice en qué formato están los datos (si no está, es el 1).
|
|
Cuando una versión nueva de la app necesite guardarlos de otra forma, los
|
|
adapta sola al abrirlos; antes deja los ficheros tal como estaban en
|
|
`datos/copia_vN/` (N = el formato de antes). La copia cifrada que llega del
|
|
servidor se adapta igual antes de juntarla con la tuya.
|
|
|
|
Una app **más antigua** que los datos no los abre ni los sincroniza: avisa de
|
|
que hay que actualizarla, sin tocar nada. Por eso, si usas
|
|
`actualizar_app.sh --volver` después de un cambio de formato, la versión vieja
|
|
se negará a abrir; para volver del todo hay que recuperar también los datos de
|
|
`datos/copia_vN/` (o de `backups/`), perdiendo lo apuntado desde entonces.
|
|
|
|
Cómo se escribe una migración: ver el principio de `cartera/datos.py`.
|
|
|
|
## Varias operaciones a la vez y justificantes
|
|
|
|
En **Operaciones**, cada fila tiene su casilla y la de la cabecera marca todas
|
|
las que cumplen los filtros (aunque no quepan en pantalla). Con alguna marcada
|
|
aparece una barra para asignarlas a una actividad, confirmarlas, cambiarlas de
|
|
activo o borrarlas. Cada acción se aplica a todas o a ninguna: si una falla (por
|
|
ejemplo, una venta que en el activo nuevo no tendría saldo), no cambia nada.
|
|
|
|
Al editar una operación, en **Justificantes** se adjuntan el extracto del
|
|
banco, la factura… (PDF, imagen u hoja de cálculo, hasta 5 MB y 10 por
|
|
operación). Si la operación la trajo tu nodo de bitcoin, ahí aparece su txid.
|
|
Los ficheros van a `datos/adjuntos/`, nombrados por su huella SHA-256; quitar
|
|
uno de una operación no borra el fichero. No entran en las copias de
|
|
`backups/` (serían 30 veces lo mismo): su copia es la del servidor git, en paquetes
|
|
cifrados aparte que se suben una sola vez.
|