From c0fa4acfb0d97b7beed7c3468c4562c43583848c Mon Sep 17 00:00:00 2001 From: cammo22 Date: Wed, 23 Sep 2026 14:29:02 +0200 Subject: [PATCH 1/2] Area fiscale: valori INPS 2026 (circolare n. 14/2026) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'Area fiscale partiva dai valori INPS 2025, dichiarati "da aggiornare": a settembre 2026 una stima per mettere da parte i contributi dell'anno sbagliava il minimale di 253 €. Dalla circolare INPS n. 14 del 9/2/2026: minimale 18.808 € (era 18.555), massimale 122.295 € per chi non ha anzianità prima del 1996 (era 120.607); aliquote invariate (24% e 24,48%). Cambiano solo i valori di partenza: un'azienda che ha già salvato le sue impostazioni fiscali tiene le sue. I conti a mano dei test restano quelli coi valori 2025, fissati nel test; un test nuovo fa il conto coi 2026. L'avviso a inizio anno e l'aggiornamento con un clic restano in #46. Co-Authored-By: Claude Opus 5.5 --- .claude/launch.json | 17 +++++++++++ AGENTS.md | 4 +-- .../src/pages/business/FiscaleView.tsx | 2 +- src/shared/engine/fiscale.test.ts | 30 ++++++++++++++++++- src/shared/engine/fiscale.ts | 10 ++++--- 5 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 .claude/launch.json diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..281730a --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,17 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "android-web", + "runtimeExecutable": "npx", + "runtimeArgs": ["vite", "preview", "--config", "vite.android.config.ts", "--port", "4173", "--strictPort"], + "port": 4173 + }, + { + "name": "web-dev", + "runtimeExecutable": "npx", + "runtimeArgs": ["vite", "--config", "vite.android.config.ts", "--port", "5174", "--strictPort"], + "port": 5174 + } + ] +} diff --git a/AGENTS.md b/AGENTS.md index 986af96..752fc8d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -240,7 +240,7 @@ La prima pagina dell'accesso Azienda: chi la segue (studio e consulenti), i puls Persone con mansione, reparto, contratto (indeterminato, determinato, apprendistato, collaborazione), ore settimanali, RAL, mensilità (12-14), contributi e INAIL propri se diversi da quelli dell'azienda, altri costi, diretto/indiretto, assunzione e fine. **Costo aziendale** = RAL + contributi INPS azienda (30% di partenza) + INAIL (1%) + TFR (RAL/13,5; non per i collaboratori) + altri costi; **costo orario** = costo / ore lavorate in un anno (1.720 per un tempo pieno, in proporzione alle ore). Riepilogo per reparto, diretti/indiretti, costo orario medio dei diretti (è la manodopera della Marginalità), confronto col costo del personale nel conto economico degli ultimi 12 mesi. **Tesoreria** (interruttore, spento di partenza): netto il giorno scelto del mese dopo, F24 (trattenute + contributi) il 16, tredicesima e quattordicesima nei loro mesi, INAIL il 16 febbraio; il TFR non esce di cassa. Motore `shared/engine/personale.ts`, tabella `employees` (migrazione 010). Condivisibile con l'azienda, spento di partenza (sono stipendi). ### 10.17 Area fiscale e contributi (versione 1.3.0) -Una **stima** per mettere da parte i soldi giusti, non la dichiarazione (niente detrazioni personali né crediti d'imposta). Regime indovinato dalla forma giuridica e cambiabile: società di capitali (IRES 24% sull'utile rettificato, IRAP 3,9% sul reddito operativo), società di persone (IRAP; reddito diviso fra i soci, ognuno IRPEF a scaglioni 2026 23/33/43, addizionali, INPS sulla sua quota), ditta individuale (IRPEF, addizionali, INPS; niente IRAP), forfettario (ricavi × coefficiente meno contributi, imposta sostitutiva 15% o 5%, riduzione INPS del 35%). INPS artigiani/commercianti: fissi sul minimale e percentuale oltre fino al massimale (valori 2025, da aggiornare); gestione separata. Parte dall'utile degli ultimi 12 mesi (`bilancio.service.ts`) o dall'ultimo anno, o da un reddito scritto a mano; rettifiche in aumento/diminuzione e IRAP. **Scadenze** col metodo storico: acconti 40/60 (50/50 con gli ISA) al 30 giugno e 30 novembre, saldo il 30 giugno dopo, INPS fissi in quattro rate, INPS oltre il minimale 50/50. Accantonamento mensile = totale / 12. **Tesoreria** con interruttore. Motore `shared/engine/fiscale.ts`; impostazioni nella tabella `settings`, chiave `fiscale`. +Una **stima** per mettere da parte i soldi giusti, non la dichiarazione (niente detrazioni personali né crediti d'imposta). Regime indovinato dalla forma giuridica e cambiabile: società di capitali (IRES 24% sull'utile rettificato, IRAP 3,9% sul reddito operativo), società di persone (IRAP; reddito diviso fra i soci, ognuno IRPEF a scaglioni 2026 23/33/43, addizionali, INPS sulla sua quota), ditta individuale (IRPEF, addizionali, INPS; niente IRAP), forfettario (ricavi × coefficiente meno contributi, imposta sostitutiva 15% o 5%, riduzione INPS del 35%). INPS artigiani/commercianti: fissi sul minimale e percentuale oltre fino al massimale (valori 2026 dalla circolare INPS n. 14/2026, da aggiornare ogni anno); gestione separata. Parte dall'utile degli ultimi 12 mesi (`bilancio.service.ts`) o dall'ultimo anno, o da un reddito scritto a mano; rettifiche in aumento/diminuzione e IRAP. **Scadenze** col metodo storico: acconti 40/60 (50/50 con gli ISA) al 30 giugno e 30 novembre, saldo il 30 giugno dopo, INPS fissi in quattro rate, INPS oltre il minimale 50/50. Accantonamento mensile = totale / 12. **Tesoreria** con interruttore. Motore `shared/engine/fiscale.ts`; impostazioni nella tabella `settings`, chiave `fiscale`. ### 10.18 Marginalità (versione 1.3.0) Prende la forma dell'attività (indovinata dal *tipo di attività* dell'anagrafica): **ristorazione** (ricette, ingredienti, food cost, menu engineering di Kasavana e Smith: stelle, cavalli da lavoro, enigmi, cani), **produzione** (distinta base), **commercio** (ricarico), **servizi ed edilizia** (commesse con preventivo e consuntivo). Listino con unità, costo e scarto (costo utile = costo / (1 − scarto)); ogni voce è fatta di materiali, manodopera (costo orario dal Personale, per persona o medio dei diretti, o scritto nelle impostazioni), lavorazioni esterne, altro. Costo diretto, costi generali in % del diretto, costo pieno, margine di contribuzione e netto, food cost %, ricarico, prezzo consigliato per stare nell'obiettivo; ricette e prodotti per porzione (resa). Prezzi IVA esclusa, l'IVA serve solo al prezzo in carta. Motore `shared/engine/marginalita.ts`; tabelle `margin_materials`, `margin_items`, `margin_lines` (migrazione 011). Resta aperto l'uso delle % di costo diretto per conto nel conto economico (§14 punto 15). @@ -807,7 +807,7 @@ Controlli: 146 test (i motori nuovi su conti fatti a mano), `verify:schema` 86/8 11. **Demo Android**: provata nel browser a larghezza di telefono e l'APK della CI sull'emulatore (Android 14: installazione, accesso demo, cruscotto, menu, Attività e Tempi). Va provata su qualche telefono vero, con versioni di Android diverse. 12. **LibreOffice facoltativo**: per aprire e modificare `.xls`, `.ods`, `.doc` anche dove Office non c'è. Non si include nell'installazione (circa 350 MB): da valutare lo scaricamento su richiesta (issue #38). 13. **Chiamate vocali dentro il programma**: oggi la chiamata richiesta si fa col telefono (`tel:`). Chiamare dal programma richiede il collegamento fra studio e aziende della fase 8 (issue #37). -14. **Aliquote e minimali**: l'Area fiscale parte dai valori INPS 2025 e dagli scaglioni IRPEF 2026; vanno aggiornati ogni anno (sono impostazioni dell'azienda, ma i valori di partenza stanno in `shared/engine/fiscale.ts`). +14. **Aliquote e minimali**: l'Area fiscale parte dai valori INPS 2026 (circolare n. 14/2026) e dagli scaglioni IRPEF 2026; vanno aggiornati ogni anno — manca ancora l'avviso nel programma e l'aggiornamento con un clic (issue #46) (sono impostazioni dell'azienda, ma i valori di partenza stanno in `shared/engine/fiscale.ts`). 15. **% di costo diretto per conto**: salvate da sempre (`direct_cost_pct`, `company_section_settings`) ma lo schema "a margine di contribuzione" usa ancora la divisione per sezione. Da decidere col consulente se usarle conto per conto. 16. **Anteprima di `.xls` e `.ods`**: la libreria che le legge (SheetJS) si installa solo dal suo sito, e la configurazione npm dello sviluppatore rifiuta i pacchetti da indirizzi remoti — di proposito, e resta così. Oggi quei file si aprono col programma del computer. diff --git a/src/renderer/src/pages/business/FiscaleView.tsx b/src/renderer/src/pages/business/FiscaleView.tsx index eb9cdbe..f6a0f22 100644 --- a/src/renderer/src/pages/business/FiscaleView.tsx +++ b/src/renderer/src/pages/business/FiscaleView.tsx @@ -283,7 +283,7 @@ export function FiscaleView({ company, canEdit }: { company: Company; canEdit: b {(bozza.gestioneInps === 'artigiani' || bozza.gestioneInps === 'commercianti') && ( <> - set({ inpsAliquota: v })} aiuto="artigiani 24%, commercianti 24,48% (2025)" /> + set({ inpsAliquota: v })} aiuto="artigiani 24%, commercianti 24,48% (2026)" /> set({ inpsMinimaleCents: v ?? 0 })} /> )} diff --git a/src/shared/engine/fiscale.test.ts b/src/shared/engine/fiscale.test.ts index c7d798b..3ac6bd4 100644 --- a/src/shared/engine/fiscale.test.ts +++ b/src/shared/engine/fiscale.test.ts @@ -10,10 +10,38 @@ import { type ImpostazioniFiscali } from './fiscale' -const imp = (p: Partial): ImpostazioniFiscali => ({ ...FISCALE_PREDEFINITO, ...p }) +/** + * I conti a mano qui sotto sono fatti con minimale e massimale INPS 2025: si + * fissano qui, così restano validi anche quando i valori di partenza cambiano + * anno. I valori 2026 hanno il loro test. + */ +const INPS_2025 = { inpsMinimaleCents: 1_855_500, inpsMassimaleCents: 12_060_700 } +const imp = (p: Partial): ImpostazioniFiscali => ({ + ...FISCALE_PREDEFINITO, + ...INPS_2025, + ...p +}) const importo = (s: ReturnType, chiave: string): number | undefined => s.righe.find((r) => r.chiave === chiave)?.importo +describe('valori di partenza 2026', () => { + it('INPS artigiani e commercianti dalla circolare n. 14/2026', () => { + expect(FISCALE_PREDEFINITO.inpsMinimaleCents).toBe(1_880_800) + expect(FISCALE_PREDEFINITO.inpsMassimaleCents).toBe(12_229_500) + expect(FISCALE_PREDEFINITO.inpsAliquota).toBe(24.48) + }) + + it('ditta individuale di commercianti con i valori 2026', () => { + const s = stimaFiscale( + { utileAnteImposte: 4_000_000, ebit: 4_200_000, ricavi: 0 }, + { ...FISCALE_PREDEFINITO, regime: 'individuale', gestioneInps: 'commercianti' } + ) + // Fissi: 18.808 × 24,48% = 4.604,20 · oltre il minimale: 21.192 × 24,48% = 5.187,80 + expect(importo(s, 'inps-fissi')).toBe(460_420) + expect(importo(s, 'inps-eccedenza')).toBe(518_780) + }) +}) + describe('stima di imposte e contributi (conti fatti a mano)', () => { it('IRPEF a scaglioni 2026', () => { expect(irpef(2_000_000)).toBe(460_000) // 20.000 × 23% diff --git a/src/shared/engine/fiscale.ts b/src/shared/engine/fiscale.ts index be5ebec..ec38789 100644 --- a/src/shared/engine/fiscale.ts +++ b/src/shared/engine/fiscale.ts @@ -7,8 +7,10 @@ import type { TreasuryItemInput } from './treasury' * da parte ogni mese e quando si paga. Non è la dichiarazione dei redditi: * niente detrazioni personali, crediti d'imposta o agevolazioni, che dipendono * dalla persona e dall'anno. Le aliquote sono modificabili; i valori di - * partenza sono quelli in vigore per il 2026 dove noti (IRPEF 23/33/43), per - * i contributi INPS quelli pubblicati per il 2025, da aggiornare ogni anno. + * partenza sono quelli del 2026: IRPEF 23/33/43 e, per artigiani e + * commercianti, la circolare INPS n. 14 del 9 febbraio 2026 (minimale 18.808 €, + * massimale 122.295 € per chi non ha anzianità prima del 1996). Vanno + * aggiornati ogni anno (issue #46); un'azienda che li ha già salvati tiene i suoi. * * Regimi: * - **società di capitali** (SRL, SPA): IRES sul reddito, IRAP sul valore @@ -101,9 +103,9 @@ export const FISCALE_PREDEFINITO: ImpostazioniFiscali = { irapPct: 3.9, addizionaliPct: 2, gestioneInps: 'commercianti', - inpsMinimaleCents: 1_855_500, + inpsMinimaleCents: 1_880_800, inpsAliquota: 24.48, - inpsMassimaleCents: 12_060_700, + inpsMassimaleCents: 12_229_500, gestioneSeparataPct: 26.07, forfettarioCoeff: 40, forfettarioAliquota: 15, From c51eeff4eba778cef51913888e1b13200d5afff6 Mon Sep 17 00:00:00 2001 From: cammo22 Date: Wed, 23 Sep 2026 14:29:14 +0200 Subject: [PATCH 2/2] Togli .claude/launch.json, finito per sbaglio nel commit precedente MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit È la configurazione locale delle anteprime: la PR delle sistemazioni la mette nel .gitignore. Co-Authored-By: Claude Opus 5.5 --- .claude/launch.json | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .claude/launch.json diff --git a/.claude/launch.json b/.claude/launch.json deleted file mode 100644 index 281730a..0000000 --- a/.claude/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "0.0.1", - "configurations": [ - { - "name": "android-web", - "runtimeExecutable": "npx", - "runtimeArgs": ["vite", "preview", "--config", "vite.android.config.ts", "--port", "4173", "--strictPort"], - "port": 4173 - }, - { - "name": "web-dev", - "runtimeExecutable": "npx", - "runtimeArgs": ["vite", "--config", "vite.android.config.ts", "--port", "5174", "--strictPort"], - "port": 5174 - } - ] -}