diff --git a/README.md b/README.md index dbfce75..b9d97e5 100644 --- a/README.md +++ b/README.md @@ -16,92 +16,218 @@ e risponde a "cosa succede se" senza toccare un foglio Excel. --- -## Stato del progetto +## Il problema -🚧 **In sviluppo — fasi 0-3 su 10.** +Un consulente finanziario segue dieci, venti aziende contemporaneamente. Per ognuna +deve rispondere alle stesse domande: **quanto margina davvero?** **quanto tempo ha +prima di un problema di cassa?** **quanto valgono i soldi fermi in magazzino?** +**cosa cambia se assume una persona, o se chiede un altro finanziamento?** -L'applicazione si avvia, autentica, gestisce l'anagrafica dei clienti e delle loro -aziende, importa il piano dei conti da Excel e ne calcola il bilancio riclassificato -con tutti gli indici. Quello che manca è mostrarlo: le sette viste di analisi. La roadmap -completa, fase per fase, è in [`AGENTS.md` §13](./AGENTS.md); le formule e lo schema -dati del motore in [`docs/MODELLO_FINANZIARIO.md`](./docs/MODELLO_FINANZIARIO.md). +Oggi quelle risposte arrivano da un foglio Excel costruito negli anni: bravissimo, +ma da rifare a mano per ogni cliente e per ogni mese. Un errore in una formula non +si vede finché non è troppo tardi, e i numeri vivono sul computer del consulente, +lontani dall'imprenditore che dovrebbe leggerli. -| Fatto | In arrivo | +## Cosa fa DaProdFinanza + +Prende quel metodo e lo trasforma in un programma. + +Il consulente carica il piano dei conti dell'azienda — lo stesso file Excel che usa +già — e il programma fa il resto: **riclassifica il bilancio**, cioè riordina i conti +grezzi in un prospetto leggibile che mostra dove nascono i margini e dove si perdono; +**calcola gli indici** che misurano redditività, solidità e liquidità; **prevede la +cassa** delle prossime settimane incrociando incassi attesi, pagamenti e rate dei +finanziamenti; e **simula gli scenari**, per vedere l'effetto di una decisione prima +di prenderla. + +Tutto senza dipendere da internet, senza un abbonamento a un servizio esterno, e +senza che i numeri di un'azienda escano dal computer di chi ha il diritto di vederli. + +## Due programmi, due punti di vista + +| | **DaProdFinanza** | **DaProdFinanza Cliente** | +|---|---|---| +| Chi lo usa | Il consulente, nel suo studio | Ogni azienda seguita | +| Cosa vede | Tutti i clienti e tutte le loro aziende | Solo i propri numeri | +| Cosa fa | Configura, riclassifica, simula scenari | Carica i propri dati, consulta i propri KPI | +| Se salta la rete | Continua a funzionare | Continua a funzionare | + +I due programmi si parlano su una rete privata (Tailscale, con un collegamento di +riserva per quando un'azienda non riesce a configurarlo). Nessun server pubblico, +nessun dominio da comprare, nessun dato che passa da terzi per l'uso quotidiano. + +## Le sette viste + +- **Panoramica** — la situazione del mese in un colpo d'occhio, con gli avvisi che si + accendono da soli quando qualcosa peggiora +- **Conto Economico** — dove nascono e dove finiscono i soldi, con budget e anno + precedente a confronto +- **Stato Patrimoniale** — cosa possiede l'azienda, e con quali soldi lo ha pagato +- **Capitale Circolante** — quanto tempo passa fra il pagare i fornitori e l'incassare + dai clienti: è lì che la cassa si blocca +- **Tesoreria** — quanti soldi ci saranno in banca fra una settimana, un mese, tre mesi +- **Banche e Finanziamenti** — fidi, mutui e leasing, e quanto pesano sulla cassa futura +- **Analisi & Simulazioni** — "cosa succede se": assumo, investo, alzo i prezzi + +## Come nasce + +Il motore di calcolo non è teoria da manuale: è l'estrazione di uno strumento Excel +che un consulente finanziario usa già oggi con i propri clienti — piano dei conti +classificato, tre modi alternativi di riclassificare il bilancio, indici con le soglie +che lui stesso applica. + +Quel metodo è stato letto riga per riga, generalizzato e reso anonimo, e vive in +[`docs/MODELLO_FINANZIARIO.md`](./docs/MODELLO_FINANZIARIO.md): formula per formula, +liberamente consultabile. I file originali dei clienti restano fuori da qui. + +--- + +## A che punto siamo + +Il programma si avvia, riconosce chi entra, gestisce l'anagrafica dei clienti e delle +loro aziende, importa il piano dei conti da Excel e ne calcola il bilancio +riclassificato con tutti gli indici. **Quello che manca è mostrarlo**: le schermate di +analisi sono la prossima cosa da costruire. + +| | Fase | Stato | +|---|---|---| +| 0 | Impalcatura del programma | ✅ Fatta | +| 1 | Accesso, ruoli, anagrafica clienti e aziende | ✅ Fatta | +| 2 | Struttura dati del motore di calcolo | ✅ Fatta | +| 3 | Riclassificazione, indici, import Excel | 🟡 Quasi — serve un file cliente **con i saldi** per la verifica finale | +| 4 | Le prime tre schermate di analisi | ⬜ Prossima | +| 5-7 | Cassa, banche, simulazioni | ⬜ | +| 8-9 | Collegamento fra i due programmi | ⬜ | +| 10 | Installatori | 🟡 Già disponibili, da rifinire | + +La roadmap completa, con il dettaglio di cosa c'è dentro ogni fase, è in +[`AGENTS.md` §13](./AGENTS.md). + +## Provarlo + +Gli eseguibili sono nella pagina **[Releases](https://github.com/cammo22/DaProdFinanza/releases)**: +`DaProdFinanza-Setup-x.y.z.exe` per installarlo, oppure la versione *portable* che si +lancia e basta. Windows a 64 bit. + +Non sono ancora firmati con un certificato, quindi al primo avvio Windows mostra un +avviso: *Ulteriori informazioni → Esegui comunque*. Poi il programma chiede di creare +l'account del consulente e si parte. + +I dati restano sul computer: il database sta in `%APPDATA%\DaProdFinanza` ed è +**cifrato**, con la chiave protetta dal sistema operativo. Le cartelle di lavoro e i +backup stanno in `Documenti\DaProdFinanza`. + +
+ +--- + +
+ +# Parte tecnica + +Da qui in giù serve solo a chi mette le mani nel codice. + +## Stack + +| Layer | Tecnologia | |---|---| -| Scaffolding Electron + React + Tailwind + Express + SQLite cifrato | Le sette viste di analisi | -| Scelta del ruolo all'avvio, login JWT, ruoli Consulente / Azienda | Previsione di cassa e scadenziario | -| Anagrafica Clienti e Aziende, con archiviazione e rimozione | Fidi, mutui e leasing | -| Schema dati del motore: conti, tag, periodi, saldi | Scenari "cosa succede se" | -| Riclassificazione nei tre schemi e indici di bilancio | Sincronizzazione Consulente ↔ Azienda | -| Import Excel del piano dei conti, con riepilogo pre-conferma | Installer per l'app Azienda | -| Backup del database e status bar di servizio | | +| Desktop | Electron 44 | +| Interfaccia | React 19 + Tailwind CSS 4 | +| Backend | Node.js + Express 5, embedded nel processo main | +| Database | SQLite **cifrato** (`better-sqlite3-multiple-ciphers`, SQLCipher) | +| Autenticazione | JWT, password con scrypt | +| Build | electron-vite + TypeScript, electron-builder per gli installatori | +| Test | Vitest | -### Per provarlo +Convenzione di progetto: **identificatori in inglese, interfaccia in italiano**. -Gli eseguibili di prova sono nella pagina [Releases](https://github.com/cammo22/DaProdFinanza/releases): -`DaProdFinanza-Setup-x.y.z.exe` per installarlo, oppure la versione *portable* che -si lancia e basta. Windows x64. +## Architettura + +``` +[Azienda 1] ──┐ +[Azienda 2] ──┼── REST su rete privata ──► [CONSULENTE] +[Azienda N] ──┘ Express + SQLite cifrato +``` -Non sono firmati: al primo avvio SmartScreen chiede conferma (*Ulteriori informazioni -→ Esegui comunque*). Al primo avvio l'app chiede di creare l'account del Consulente. +Ogni installazione ha il proprio SQLite locale e funziona offline. Il consulente è la +fonte di verità per la configurazione, l'azienda per i propri dati grezzi. Il +collegamento fra i due arriva in fase 8: oggi il server Express ascolta **solo su +127.0.0.1**, con porta effimera, e non è esposto verso la rete. -### Per svilupparlo +## Struttura -```bash -npm install -npm run dev +``` +src/ +├── main/ processo Electron +│ ├── db/ apertura del database cifrato e migrazioni versionate +│ ├── import/ lettura dei file Excel +│ ├── lib/ percorsi su disco, segreti (DPAPI), scrypt, JWT +│ └── server/ REST: routes/ → services/ +├── preload/ unico ponte main ↔ renderer (contextIsolation attivo) +├── renderer/ React + Tailwind +└── shared/ + ├── engine/ il motore di calcolo: funzioni pure, zero dipendenze + └── types.ts tipi condivisi ``` -Al primo avvio l'app chiede di creare l'account del Consulente. Il database è cifrato -a riposo (SQLCipher) e la chiave è protetta da DPAPI: vive in `%APPDATA%/daprodfinanza`, -i dati di lavoro in `Documenti/DaProdFinanza`. +### Il motore di calcolo -Per ricostruire gli eseguibili: `npm run dist` (escono in `release/`). +`src/shared/engine/` non sa che esiste un database: riceve una lista di conti con i +loro saldi e restituisce prospetti e indici. Le formule sono la parte più delicata del +prodotto, e così si verificano in isolamento. -In sviluppo un seed crea due account di prova — `cammo` / `1234` (Consulente) e -`Pizzeria DaProd` / `1234` (Azienda) — mostrati direttamente sulle card di accesso. -Per provarli sulla build compilata: `npm run demo`. Il seed non gira mai in -un'installazione normale. +Due convenzioni da conoscere prima di leggerlo: -## Cos'è +- **I costi sono positivi**, e sono le formule a sottrarli. Vale anche per i debiti. +- **Un indice indefinito vale `null`, non zero.** Un rapporto con denominatore zero non + è zero: scrivere "0%" su un bilancio racconterebbe una bugia. -Un consulente segue più **aziende clienti** in parallelo. Per ognuna vuole sapere, senza -rifare ogni volta lo stesso Excel: quanto margina davvero, quanto tempo ha prima di un -problema di cassa, quanto vale il magazzino che tiene fermo i soldi, e cosa cambia se -assume una persona o chiede un altro finanziamento. +E una scelta di modellazione: **gli importi sono interi in centesimi**, mai numeri in +virgola mobile. Su un bilancio riclassificato si sommano centinaia di righe, e un +errore di un centesimo farebbe "non quadrare" attivo e passivo. -DaProdFinanza è pensato in **due parti**, sullo stesso principio già in produzione su -[IrideeCRM](https://github.com/cammo22/DaProd-IRIS) (stesso studio, altro prodotto): +### L'import Excel -| | **DaProdFinanza** (il consulente) | **DaProdFinanza Cliente** (l'azienda) | -|---|---|---| -| Chi lo usa | Il professionista | Ogni azienda seguita | -| Cosa vede | Tutti i clienti e le loro aziende, vista aggregata | Solo i propri numeri | -| Cosa fa | Configura, riclassifica, simula scenari | Carica dati (fatture, estratti conto), consulta i propri KPI | -| Dati | Tutto, su tutte le aziende | Solo i propri, anche offline | +`src/main/import/chart-of-accounts.ts` riconosce le sezioni dalle intestazioni di +categoria e le colonne dai nomi in prima riga — **mai da numeri di riga fissi**, perché +file di clienti e periodi diversi non sono identici. + +L'anteprima non scrive niente: elenca righe riconosciute, righe da mappare a mano, +doppioni e impronta SHA-256 del file. Scrivere è una chiamata separata, in una sola +transazione, che rifiuta di sovrascrivere un periodo già caricato senza conferma +esplicita, e un periodo chiuso in ogni caso. -Le due app si parlano in rete privata via **Tailscale** (con un trasporto di riserva per -quando un'azienda non riesce a configurarlo) — nessun server pubblico necessario, nessun -dominio, nessun dato che passa da terzi per l'uso quotidiano. +## Comandi -## I moduli +```bash +npm install # installa e ricompila il modulo nativo per Electron +npm run dev # avvio in sviluppo, con ricarica a caldo +npm run test # i test del motore e dell'import +npm run build # controllo dei tipi + test + build +npm run dist # installatore e portable in release/ +npm run demo # build compilata, con gli account di prova attivi +npm run verify:schema # prova i vincoli del database e fa rollback +``` -Sette viste, tutte già disegnate nella fase di analisi (dettaglio completo in `AGENTS.md` §10): +In sviluppo un seed crea due account di prova — `cammo` / `1234` (consulente) e +`Pizzeria DaProd` / `1234` (azienda) — mostrati sulle card di accesso. **Il seed non +gira mai in un'installazione normale** e va rimosso prima della distribuzione vera. -- **Panoramica** — la situazione del mese in un colpo d'occhio, con alert automatici -- **Conto Economico** — riclassificato a margine di contribuzione, con budget e anno precedente a confronto -- **Stato Patrimoniale** — attivo/passivo riclassificati, indici patrimoniali e finanziari -- **Capitale Circolante** — DSO, DIO, DPO, Cash Conversion Cycle, con trend e alert -- **Tesoreria / Cash Flow** — previsione di liquidità su 7/30/60/90 giorni e 6 mesi, scadenziario -- **Banche e Finanziamenti** — fidi, mutui, leasing e il loro impatto sulla cassa futura -- **Analisi & Simulazioni** — "cosa succede se": scenari what-if su ricavi, costi, investimenti, finanziamenti +## Test -## Come nasce +I test più importanti non verificano che il codice giri, ma che i conti tornino. Il +principale: **i tre schemi di riclassificazione devono arrivare allo stesso EBIT e allo +stesso utile**, perché sono tre presentazioni dello stesso risultato. Se una formula +viene trascritta male, lì si spacca. + +Due test girano sul file Excel reale del consulente quando è presente nella cartella di +lavoro; in CI vengono saltati, perché quel file non sta nella repo. + +## Documenti di progetto -Il motore di calcolo non è teoria: è l'estrazione e generalizzazione di uno strumento -Excel che un consulente finanziario usa già oggi con i propri clienti (piano dei conti -taggato, tre schemi di riclassificazione, indici di bilancio con soglie). Il dettaglio -completo, formula per formula, è in [`docs/MODELLO_FINANZIARIO.md`](./docs/MODELLO_FINANZIARIO.md). +- [`AGENTS.md`](./AGENTS.md) — prodotto, architettura, moduli, roadmap fase per fase +- [`docs/MODELLO_FINANZIARIO.md`](./docs/MODELLO_FINANZIARIO.md) — il motore di calcolo: + schema dei conti, tre riclassificazioni, tutte le formule degli indici ## Licenza