Solver za optimalnu raspodjelu poreznih olakšica za djecu i uzdržavane članove između dvoje roditelja. Na temelju bruto dohodaka, poreznih stopa i broja djece određuje raspodjelu koja minimizira ukupni porez kućanstva na obrascu ZPP-DOH.
Problem se svodi na minimizaciju po dijelovima linearne funkcije jedne varijable. Rješenje je
npm install @sa-hr/smart-zpp --registry=https://npm.pkg.github.comimport { solve } from "@sa-hr/smart-zpp";
const result = solve({
parentA: { incomeAnnual: 30000, taxPaid: 2000, birthYear: 1990, disability: null },
parentB: { incomeAnnual: 18000, taxPaid: 400, birthYear: 1997, disability: null },
rates: { lower: 0.20, higher: 0.30 },
childCount: 3,
depCount: 0,
});| Parametar | Opis |
|---|---|
parentA, parentB |
{ incomeAnnual, taxPaid, birthYear, disability } |
incomeAnnual |
Godišnji dohodak — bruto plaća minus mirovinski doprinosi (€) |
taxPaid |
Uplaćeni porez tijekom godine (€) |
birthYear |
Godina rođenja (za umanjenje mladih) |
disability |
"full", "partial" ili null |
rates |
{ lower, higher } — porezne stope općine/grada |
childCount |
Broj djece |
depCount |
Broj ostalih uzdržavanih članova |
| Polje | Opis |
|---|---|
x_star |
Optimalni ukupni odbitak za roditelja A (€) |
D |
Ukupni fond olakšica (€) |
a, b |
Početne oporezive osnovice |
H_min |
Minimalni ukupni porez kućanstva (€) |
τ_A, τ_B |
Porez po roditelju u optimumu |
Δ_A, Δ_B |
Razlika uplaćenog i dugovanog poreza (pozitivno = povrat, negativno = doplata) |
T_A, T_B |
Oporezive osnovice u optimumu |
F_A, F_B |
Fiksni osobni odbici |
allocation |
[{ index, coefficient, fractionA }] — raspodjela po djetetu |
candidates |
[{ x, label, H }] — svih 6 prijelomnih točaka |
Svako dijete donosi poreznu olakšicu — neoporezivi dio dohotka. Olakšica se može u cijelosti dodijeliti jednom roditelju, drugom, ili podijeliti između njih u koracima od 1%. Cilj je pronaći raspodjelu koja minimizira ukupni porez kućanstva.
Dohodak svakog roditelja (incomeAnnual) je bruto plaća umanjena za mirovinske doprinose. Od toga se oduzme osobni odbitak — 7.200€ godišnje plus eventualno invaliditet:
Oporeziva osnovica se oporezuje u dva razreda — niža stopa do 60.000€, viša iznad:
Stope
Umanjenje za mlade na nižu stopu:
- do 25 godina: 0% (potpuno umanjenje)
- 26–30 godina: 50% niže stope
Ukupni fond olakšica za djecu je fiksan:
| Dijete | 1. | 2. | 3. | 4. | 5. | 6. | 7. | 8. | 9. |
|---|---|---|---|---|---|---|---|---|---|
| 0,5 | 0,7 | 1,0 | 1,4 | 1,9 | 2,5 | 3,2 | 4,0 | 4,9 |
Identitet pojedinog djeteta ne utječe na rezultat — bitan je samo ukupni iznos koji svaki roditelj dobije. Problem se svodi na jednu varijablu
Oporezive osnovice:
Ukupni porez kućanstva:
| Točka | Značenje |
|---|---|
| Sve na B | |
| A pada ispod višeg razreda | |
| A pada na nulu | |
| B pada na nulu | |
| B ulazi u viši razred | |
| Sve na A |
| Metoda | Složenost | 3 djece | 9 djece |
|---|---|---|---|
| Brute force (1% koraci) | 1.030.301 | ||
| Pohlepno | 303 | 909 | |
| SmartZPP | 6 | 6 |
Optimalni
Primjer: Roditelj A zarađuje 30.000€, Roditelj B 18.000€ (28 god, 50% umanjenje), troje djece, stope 20%/30%.
Crvena krivulja je
| Vrijednost | |
|---|---|
| Osnovni osobni odbitak | 7.200 €/god |
| Granica višeg razreda | 60.000 €/god |
| Prag za uzdržavanog člana | 3.600 €/god |
| Niža stopa (raspon) | 15–23% |
| Viša stopa (raspon) | 25–33% |
| Zadano (ako općina ne odluči) | 20% / 30% |
Izvor: Zakon o porezu na dohodak (NN 152/24)
npm install
npm test # pokreni testove
npm run test:watch # testovi u watch modu
npm run lint # provjeri stil koda
npm run lint:fix # automatski ispraviInformativni alat. Za obvezujući obračun — porezni savjetnik. Bazirano na zakonu od 1.1.2025.
LGPL-3.0-or-later