diff --git a/AGENTS.md b/AGENTS.md index 2e9b37e..fb68534 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -269,7 +269,7 @@ La nota *"se i numeri sono questi cosa devo fare per crescere?"* suggerisce un l | **7** | Analisi & Simulazioni (§10.8) | Scenario what-if salvabile e confrontabile | ⬜ Prossima | | **8** | Sync Consulente↔Azienda via Tailscale (§6) + status bar (§7) | Due installazioni reali che si scambiano dati | ⬜ | | **9** | Import Excel avanzato: tolleranza a varianti di formato tra clienti/periodi (§11.1) | Import robusto su più file Excel reali diversi tra loro | ⬜ | -| **10** | Installer offline (electron-builder) per Consulente e Azienda | `.exe` funzionanti, Tailscale bundled | 🟡 **Parziale**: `.exe` installabile, portable e demo funzionanti. Mancano le due varianti separate e Tailscale bundled, che hanno senso solo dopo la Fase 8. **Decisione del cliente (2026-09-16): nessuna release fino a codice finito; alla fine una sola release con tre eseguibili — installer, portable, demo** | +| **10** | Installer offline (electron-builder) per Consulente e Azienda | `.exe` funzionanti, Tailscale bundled | 🟡 **Parziale**: `.exe` installabile, portable e demo funzionanti. Mancano le due varianti separate e Tailscale bundled, che hanno senso solo dopo la Fase 8. **Regola del cliente (2026-09-16): una release a ogni aggiornamento importante, sempre con i tre eseguibili — installer, portable e demo** (`npm run dist` e `npm run dist:demo`). La prima così è la v0.0.5, con le Fasi 5 e 6 | | **11+** | Integrazioni Fase futura: connettore IRIS, Cassetto Fiscale, Open Banking, pianificazione fiscale, marginalità multi-dimensionale, assistente numeri | Una alla volta, dopo validazione col cliente | ⬜ | ### 13-bis. Stato alla fine della sessione 1 (Fasi 0 → 4) @@ -506,6 +506,16 @@ Verificato con i numeri da manuale: 12.000 € al 6% in 12 rate mensili danno la **Da fare in Fase 7**: Analisi & Simulazioni (§10.8), che ora ha tutti i motori sotto: conto economico, circolante, tesoreria e finanziamenti. +**Versione 0.0.5 — Fasi 5 e 6 pubblicate** con i tre eseguibili. Collaudo fatto sugli eseguibili, non sul codice: + +- **Demo da zero**: `DaProdFinanza-Demo-0.0.5-portable.exe --user-data-dir=`. Il flag di build della demo ora cede a uno `--user-data-dir` esplicito (switch standard di Chromium), così un primo avvio si prova senza toccare la demo già presente. Verificati 25 periodi, 23 scadenze, 3 istituti, 4 linee, 3 finanziamenti, DSCR, note del circolante. +- **Demo aggiornata**: una demo della 0.0.4 riceve migrazioni 004-005, tesoreria e banche al primo avvio, con i bilanci invariati. +- **Portable normale da zero**: parte dal primo avvio, nessun dato di esempio, nessuna striscia demo; un'azienda senza bilancio ha tesoreria e banche vuote ma funzionanti. + +⚠️ **Nota per chi sviluppa da Claude desktop su Windows**: l'app è un pacchetto MSIX, e i processi che lancia vedono `%APPDATA%` *virtualizzata* (`%LOCALAPPDATA%\Packages\Claude_…\LocalCache\Roaming`) sovrapposta a quella vera. Una cartella "DaProdFinanza Demo" può quindi esistere due volte, con chiavi diverse, e rinominarla da lì non fa quello che sembra. Per le prove da zero si usa `--user-data-dir`, mai rinominare le cartelle dati. + +Corretta anche la grammatica delle note automatiche ("Magazzino in calo…: libera liquidità"). + --- ## 14. Punti aperti diff --git a/README.md b/README.md index be7dace..a084657 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,7 @@ collegamento fra i due programmi. | 6 | Banche e finanziamenti | ✅ Fatta | | 7 | Analisi e simulazioni | ⬜ Prossima | | 8-9 | Collegamento fra i due programmi | ⬜ | -| 10 | I tre eseguibili finali: installer, portable, demo | 🟡 Già provati, si pubblicano a codice finito | +| 10 | Eseguibili: installer, portable, demo | 🟡 Pubblicati a ogni aggiornamento importante; mancano le varianti Consulente/Azienda | La roadmap completa, con il dettaglio di cosa c'è dentro ogni fase, è in [`AGENTS.md` §13](./AGENTS.md). @@ -201,9 +201,14 @@ consulente con **`cammo` / `1234`**, oppure come azienda con **`Pizzeria DaProd` `1234`**. I suoi dati restano in una cartella a parte e non si mescolano mai con quelli di un'installazione vera. -Per usarlo davvero, sempre dalla 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. +Ogni versione sulla pagina **[Releases](https://github.com/cammo22/DaProdFinanza/releases)** +ha tre file, tutti per Windows a 64 bit: + +| File | A cosa serve | +|---|---| +| `DaProdFinanza-Demo-x.y.z-portable.exe` | Provarlo con i dati di esempio | +| `DaProdFinanza-Setup-x.y.z.exe` | Installarlo per usarlo davvero | +| `DaProdFinanza-x.y.z-portable.exe` | Usarlo davvero senza installare niente | 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 diff --git a/package-lock.json b/package-lock.json index ad101c1..411fe11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "daprodfinanza", - "version": "0.0.2", + "version": "0.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "daprodfinanza", - "version": "0.0.2", + "version": "0.0.5", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e3e47e5..0ccfc74 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "daprodfinanza", - "version": "0.0.4", + "version": "0.0.5", "description": "Gestionale desktop di controllo di gestione per consulenti finanziari aziendali", "main": "./out/main/index.js", "author": "DaProdProduzioni", diff --git a/src/main/build-flags.ts b/src/main/build-flags.ts index 655b07d..bda03ac 100644 --- a/src/main/build-flags.ts +++ b/src/main/build-flags.ts @@ -16,7 +16,11 @@ export const DEMO_BUILD: boolean = __DEMO_BUILD__ * * Questo modulo è il primo import di `index.ts`, così la cartella è già * spostata prima che chiunque legga `userData`. + * + * Un `--user-data-dir` esplicito vince: è lo switch standard di Chromium, e + * serve a provare un primo avvio da zero in una cartella usa e getta senza + * toccare la demo già presente. */ -if (DEMO_BUILD) { +if (DEMO_BUILD && !app.commandLine.hasSwitch('user-data-dir')) { app.setPath('userData', join(app.getPath('appData'), 'DaProdFinanza Demo')) } diff --git a/src/shared/engine/treasury.test.ts b/src/shared/engine/treasury.test.ts index 7332194..bd79927 100644 --- a/src/shared/engine/treasury.test.ts +++ b/src/shared/engine/treasury.test.ts @@ -217,3 +217,28 @@ describe('capitale circolante', () => { ]) }) }) + +describe('note del circolante: grammatica', () => { + it('il verbo si accorda con la voce', () => { + const base: WorkingCapitalSnapshot = { + creditiCommerciali: 100_00, + magazzino: 100_00, + altriCrediti: 0, + debitiFornitori: 0, + altriDebitiCorrenti: 0, + capitaleCircolanteNetto: 200_00, + dso: null, + dio: null, + dpo: null, + ccc: null + } + const testi = workingCapitalNotes({ + current: { ...base, creditiCommerciali: 150_00, magazzino: 50_00 }, + previousYear: base + }).map((n) => n.text) + expect(testi).toEqual([ + "Crediti commerciali in aumento del 50% sullo stesso periodo dell'anno scorso: assorbono più liquidità.", + "Magazzino in calo del 50% sullo stesso periodo dell'anno scorso: libera liquidità." + ]) + }) +}) diff --git a/src/shared/engine/working-capital.ts b/src/shared/engine/working-capital.ts index 78d7a02..5432b16 100644 --- a/src/shared/engine/working-capital.ts +++ b/src/shared/engine/working-capital.ts @@ -163,28 +163,32 @@ export function workingCapitalNotes(input: NoteInput): WorkingCapitalNote[] { nome: string /** Un aumento è un assorbimento di cassa (attivo) o una fonte (passivo). */ attivo: boolean + /** Per accordare il verbo della nota. */ + plurale: boolean }[] = [ - { key: 'creditiCommerciali', nome: 'Crediti commerciali', attivo: true }, - { key: 'magazzino', nome: 'Magazzino', attivo: true }, - { key: 'altriCrediti', nome: 'Altri crediti', attivo: true }, - { key: 'debitiFornitori', nome: 'Debiti verso fornitori', attivo: false }, - { key: 'altriDebitiCorrenti', nome: 'Altri debiti correnti', attivo: false } + { key: 'creditiCommerciali', nome: 'Crediti commerciali', attivo: true, plurale: true }, + { key: 'magazzino', nome: 'Magazzino', attivo: true, plurale: false }, + { key: 'altriCrediti', nome: 'Altri crediti', attivo: true, plurale: true }, + { key: 'debitiFornitori', nome: 'Debiti verso fornitori', attivo: false, plurale: true }, + { key: 'altriDebitiCorrenti', nome: 'Altri debiti correnti', attivo: false, plurale: true } ] for (const c of componenti) { const pct = deltaPercent(current[c.key], previousYear[c.key]) if (pct === null || Math.abs(pct) < s.percento) continue const su = pct > 0 + const verbo = (plurale: string, singolare: string): string => + c.plurale ? plurale : singolare notes.push({ subject: c.key, tone: 'neutral', text: `${c.nome} ${su ? 'in aumento' : 'in calo'} del ${Math.round(Math.abs(pct))}% sullo stesso periodo dell'anno scorso${ c.attivo ? su - ? ': assorbono più liquidità.' - : ': liberano liquidità.' + ? `: ${verbo('assorbono', 'assorbe')} più liquidità.` + : `: ${verbo('liberano', 'libera')} liquidità.` : su - ? ': finanziano una parte maggiore del circolante.' - : ': finanziano una parte minore del circolante.' + ? `: ${verbo('finanziano', 'finanzia')} una parte maggiore del circolante.` + : `: ${verbo('finanziano', 'finanzia')} una parte minore del circolante.` }` }) }