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,