Tool CLI per importare estratti conto bancari, categorizzarli con regole + LLM, farli rivedere manualmente e appenderli in modo append-only su Google Sheets.
Il flusso operativo e' questo:
- leggere un file bancario grezzo
- normalizzare i movimenti in un modello unico
- caricare le categorie valide dal Google Sheet
- applicare regole deterministiche
- classificare il resto con Gemini
- far revisionare tutto da terminale
- appendere solo nuove righe nel tab bancario corretto
Il tool non modifica righe esistenti e non scrive mai nei tab di analisi.
Dopo aver configurato l'ambiente:
uv run wheresmymoney-import test-data/ListaMovimenti.xlsx --bank Comune_bpm --dry-runQuesto comando esegue l'intera pipeline senza scrivere sul foglio.
Per una scrittura reale, basta togliere --dry-run:
uv run wheresmymoney-import test-data/ListaMovimenti.xlsx --bank Comune_bpmuv run wheresmymoney-import <file_path> --bank <tab_bancario> [--dry-run] [--llm-attempts N]Parametri principali:
file_path: file bancario da importare--bank: nome del tab bancario di destinazione, che identifica anche la sorgente logica--dry-run: esegue parse, categorizzazione e review senza append finale--llm-attempts: numero massimo di retry per singola transazione in caso di errore esterno LLM
Validare solo la configurazione del foglio:
uv run wheresmymoney-validate-config config/target_sheet.example.json --tab Comune_bpmVerificare accesso a config, Google Sheets e Gemini:
uv run wheresmymoney-smoke-test --config-only
uv run wheresmymoney-smoke-testStampare le categorie lette dal foglio:
uv run wheresmymoney-list-categoriesImport reale con review interattiva:
uv run wheresmymoney-import test-data/movimentiConto-1.xls --bank Comune_bpmDurante la review il tool:
- mostra ogni transazione con data, importo, descrizione originale, descrizione pulita e categoria proposta
- usa una selezione interattiva nel terminale con frecce e invio quando l'ambiente e' TTY compatibile
- permette di tenere la categoria corrente o sostituirla scegliendola da una lista navigabile
- mostra un riepilogo finale completo prima della conferma
- permette di riaprire una transazione dal riepilogo finale scegliendola da un menu finale
- permette di confermare o annullare l'append finale
Se il terminale non supporta la UI interattiva oppure la libreria non e' disponibile, il tool mantiene automaticamente il fallback testuale gia' esistente.
- la descrizione scritta su Google Sheets e' sempre quella originale del file banca
- la colonna
Mesenon viene presa dai dati sorgente - se il tab usa
Mesecome formula in colonna A, il writer scrive=MONTH(Bn)nelle nuove righe - i tab protetti come
CategorieeAndamentonon sono scrivibili - in caso di errore LLM persistente, la transazione degrada in modo sicuro a
Da Verificare
.xlsxcon header strutturatoData Op.,Data Val.,Descrizione,Importo,Div..xlsxcon colonne separateAddebiti (euro)eAccrediti (euro).xlsche contiene una tabella HTML conData Contabile,Data Valuta,Importo,Divisa,Causale / Descrizione
- Python 3.10+
uv- un file JSON di Service Account Google condiviso come Editor sul foglio target
- una Gemini API key valida
uv venv
source .venv/bin/activate
uv sync
cp .env.example .envIl file .env.example contiene:
GOOGLE_SERVICE_ACCOUNT_JSON=/absolute/path/to/service-account.json
GEMINI_API_KEY=your_gemini_api_key
TARGET_SHEET_CONFIG=config/target_sheet.example.json
GEMINI_MODEL=gemini-2.5-flashSignificato:
-
GOOGLE_SERVICE_ACCOUNT_JSONPath locale al file JSON del Service Account Google. -
GEMINI_API_KEYAPI key Gemini generata da Google AI Studio. -
TARGET_SHEET_CONFIGPath alla configurazione JSON del foglio target. -
GEMINI_MODELModello Gemini usato dalla pipeline. Quello verificato in questo progetto e'gemini-2.5-flash.
La configurazione principale vive in config/target_sheet.example.json e definisce:
spreadsheet_idcategories_sheet_nameallowed_bank_tabsprotected_analysis_tabstransaction_start_rowbank_tab_columnsdeterministic_rules_path
Vincoli validati:
- il foglio categorie non puo' coincidere con un tab bancario
- un tab non puo' essere insieme consentito e protetto
- i tab protetti non sono scrivibili
- il tab scelto deve comparire tra i tab bancari autorizzati
- la riga iniziale delle transazioni deve essere positiva
- l'ordine colonne di output deve essere esplicito
Le regole deterministiche sono configurate tramite il campo deterministic_rules_path dentro config/target_sheet.example.json.
Il file di esempio attuale e' config/deterministic_rules.example.json.
Formato supportato:
{
"rules": [
{
"contains": "MUTUO",
"category": "Mutuo"
},
{
"contains": "SUPERMERCATO",
"category": "Spesa"
}
]
}Significato dei campi:
-
rulesLista ordinata di regole. -
containsSottostringa cercata nellaoriginal_descriptiondella transazione. -
categoryCategoria da assegnare se la regola matcha.
Comportamento del motore:
- il match e' case-insensitive
- il primo match vince
- se nessuna regola matcha, la transazione passa al classificatore LLM
- la categoria deve esistere nel catalogo reale letto dal foglio
Categorie - condizioni duplicate fanno fallire il caricamento della configurazione
Indicazioni pratiche:
- usa regole solo per pattern molto stabili e ricorrenti
- preferisci descrizioni abbastanza specifiche da evitare falsi positivi
- tieni le regole piu' specifiche prima di quelle piu' generiche
- dopo ogni modifica, verifica il comportamento con un import in
--dry-run
Il progetto usa:
gspreadgoogle-genaiopenpyxlpandaspython-dotenvpytest
Test unitari principali:
uv run pytestTest live di integrazione Google Sheets:
WHERESMYMONEY_RUN_LIVE_TESTS=1 uv run pytest tests/test_google_sheet_integration.pyQuesto test fa un append reale sul foglio di test e verifica subito dopo la riga scritta.
- i comandi consigliati sono quelli via
uv run - restano disponibili anche alcuni wrapper in
scripts/, ma sono solo compatibilita' temporanea - il progetto e' pensato per essere usato prima in
--dry-run, poi in append reale
Configurazione centralizzata del foglio target e validator locale.
File principali:
config/target_sheet.example.jsonsrc/wheresmymoney/target_config.pyscripts/validate_target_config.py
Bootstrap del progetto Python, configurazione runtime e smoke test.
File principali:
pyproject.toml.env.examplesrc/wheresmymoney/runtime_config.pysrc/wheresmymoney/cli_smoke_test.py
Modello dati canonico Transaction con validazione di date, importi, valuta e export verso Sheets.
File principali:
src/wheresmymoney/models.pytests/test_models.py
Parser per i formati bancari reali attualmente supportati.
File principali:
src/wheresmymoney/parsers.pytests/test_parsers.py
Lettura e validazione dinamica delle categorie dal foglio Categorie.
File principali:
src/wheresmymoney/categories.pytests/test_categories.py
Layer di regole deterministiche prima dell'LLM.
File principali:
src/wheresmymoney/deterministic_rules.pytests/test_deterministic_rules.py
Classificatore LLM con output JSON strutturato e fallback locale sicuro.
File principali:
src/wheresmymoney/llm_categorizer.pytests/test_llm_categorizer.py
Review CLI interattiva con riepilogo finale e riapertura per indice.
File principali:
src/wheresmymoney/review_cli.pytests/test_review_cli.py
Writer append-only verso Google Sheets con preservazione della logica Mese.
File principali:
src/wheresmymoney/sheet_writer.pytests/test_sheet_writer.py
Pipeline end-to-end con logging, error handling e comando unico CLI.
File principali:
src/wheresmymoney/cli_import.pytests/test_cli_import.py
Copertura test con integrazione live controllata su Google Sheets.
File principali:
tests/test_google_sheet_integration.py
Il MVP CLI append-only e' implementato, testato localmente e verificato anche con test live sul foglio Google di prova.