Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
Generate and edit bank-style account statements from Picash wallets and print them as PDFs
AI summary · website and README
FinancePython · JavaScriptGitHub @DuvanP11OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Extracto de cuenta (estilo estado de cuenta bancario) de una billetera Picash, con los datos leídos de ClickHouse y un panel para editar lo que no viene de la base: razón social, titular, cargo, salarios, fecha de ingreso, cuenta, período y notas. Se imprime a PDF desde el navegador (A4).Read the full README ↗
Extracto de cuenta (estilo estado de cuenta bancario) de una billetera Picash, con los datos leídos de ClickHouse y un panel para editar lo que no viene de la base: razón social, titular, cargo, salarios, fecha de ingreso, cuenta, período y notas. Se imprime a PDF desde el navegador (A4).
public/
index.html el extracto + el panel de edición
css/extracto.css hoja A4, tema Picap, reglas de impresión
js/app.js carga de datos, resumen, saldo corrido, editor (localStorage)
assets/picap-logo.png
data/extracto_<wallet>.json snapshot opcional (ver abajo)
api/
extracto.py función serverless (Python) que consulta ClickHouse en vivo
scripts/
generar_snapshot.py genera public/data/*.json con la misma lógica que la API
| Dato | De dónde sale |
|---|---|
| Titular (nombre, documento) | passengers por passenger_id |
| Billetera y saldo actual | wallet_accounts por _id (campo balance) |
| Número de cuenta, banco, tipo | bank_accounts de la cuenta usada en el último retiro (DaviplataCashOut más reciente) |
| Movimientos | wallet_account_transactions por account_id, dedup por _id (última versión por _sdc_batched_at) |
| Valor | amount.cents / 100, con signo: positivo = abono, negativo = cargo. Nunca abs(). |
| Saldo por fila | amount_after_transaction (el saldo que registró la billetera) |
| Pagos RRHH | _type = WalletAccountTransactionBatchDispersion |
| Rechazados | status_cd = -1: se muestran tachados y no mueven saldo (el reembolso es otra transacción) |
Resumen: saldo anterior (movimientos antes de Desde), total abonos y total cargos (cantidad y valor), saldo actual, pagos RRHH (cantidad y valor), saldo en billetera hoy y último retiro. Fecha de generación es siempre el día en que se abre el extracto; el resto de los campos se editan en el panel y quedan guardados en el navegador.
Import del repo en Vercel (Framework preset: Other). No hay build: sirve
public/ como estático y api/extracto.py como función Python.
Environment Variables (Production y Preview):
| Nombre | Valor |
|---|---|
CLICKHOUSE_USER | usuario de ClickHouse |
CLICKHOUSE_PASSWORD | su clave |
CLICKHOUSE_URL | https://clickhouse.picap.io:8443 (opcional, es el default) |
CLICKHOUSE_DATABASE | picapmongoprod (opcional, es el default) |
Deploy. La página consulta /api/extracto al abrir; si las variables no
están, la API responde 503 y el front cae al snapshot de public/data/.
URL con parámetros:
https://<app>.vercel.app/?passenger=<id>&wallet=<id>&desde=2022-08-05
https://<app>.vercel.app/?wallet=<id>&fuente=snapshot # fuerza el snapshot
Genera public/data/extracto_<wallet>.json con la misma lógica que la API:
# con credenciales
CLICKHOUSE_USER=… CLICKHOUSE_PASSWORD=… \
python3 scripts/generar_snapshot.py --passenger <id> --wallet <id> --desde 2022-08-05
# sin credenciales: a partir de volcados hechos con curl
python3 scripts/generar_snapshot.py --sql --passenger <id> --wallet <id> # imprime los dos SQL
python3 scripts/generar_snapshot.py --passenger <id> --wallet <id> --desde 2022-08-05 \
--tx tx.jsonl --cabecera cabecera.jsonl
El repo es público. Un snapshot contiene movimientos reales de una persona: subirlo es una decisión consciente, no un paso automático.
Sin Node: python3 -m http.server 8000 -d public y abrir
http://localhost:8000/?fuente=snapshot. La API solo corre en Vercel
(vercel dev si se tiene el CLI).