Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down Expand Up @@ -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.

Expand Down
2 changes: 1 addition & 1 deletion src/renderer/src/pages/business/FiscaleView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ export function FiscaleView({ company, canEdit }: { company: Company; canEdit: b
</Riga>
{(bozza.gestioneInps === 'artigiani' || bozza.gestioneInps === 'commercianti') && (
<>
<Percento label="Aliquota" valore={bozza.inpsAliquota} onChange={(v) => set({ inpsAliquota: v })} aiuto="artigiani 24%, commercianti 24,48% (2025)" />
<Percento label="Aliquota" valore={bozza.inpsAliquota} onChange={(v) => set({ inpsAliquota: v })} aiuto="artigiani 24%, commercianti 24,48% (2026)" />
<Euro label="Reddito minimale" valore={bozza.inpsMinimaleCents} onChange={(v) => set({ inpsMinimaleCents: v ?? 0 })} />
</>
)}
Expand Down
30 changes: 29 additions & 1 deletion src/shared/engine/fiscale.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,38 @@ import {
type ImpostazioniFiscali
} from './fiscale'

const imp = (p: Partial<ImpostazioniFiscali>): 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>): ImpostazioniFiscali => ({
...FISCALE_PREDEFINITO,
...INPS_2025,
...p
})
const importo = (s: ReturnType<typeof stimaFiscale>, 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%
Expand Down
10 changes: 6 additions & 4 deletions src/shared/engine/fiscale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down