Skip to content

Commit

Permalink
Pensioenpremie meegenomen in berekeningen
Browse files Browse the repository at this point in the history
- gemidelde huur jaar specifiek gemaakt.
- Fix grens PD2025 AK 2e range.

Closes: #34
  • Loading branch information
Hilbrand committed Jan 29, 2025
1 parent 2b5eb6f commit 5f09ac8
Show file tree
Hide file tree
Showing 13 changed files with 273 additions and 110 deletions.
67 changes: 49 additions & 18 deletions src/components/HuishoudenComponent.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,38 +15,61 @@
</tr>
</thead>
<tbody>
<tr v-for="(p, index) in gegevens" :key="p" size="small">
<tr v-for="(p, index) in personenGegevens" :key="p" size="small">
<td>{{ index + 1 }}</td>
<td>
<n-select
v-model:value="gegevens[index]['leeftijd']"
v-model:value="personenGegevens[index]['leeftijd']"
:options="actieveLeeftijden(index)"
:consistent-menu-width="false"
/>
<div v-if="inkomenNietEersteVolwassene(index)">
<n-radio-group v-model:value="gegevens[index].inkomen_type">
<n-radio-group v-model:value="personenGegevens[index].inkomen_type">
<n-radio label="Bruto inkomen p/j" key="bruto" value="bruto" size="small" />
<n-radio label="Percentage van eerste inkomen" key="percentage" value="percentage" size="small" />
</n-radio-group>
<n-input-number
v-if="gegevens[index].inkomen_type === 'bruto'"
v-if="personenGegevens[index].inkomen_type === 'bruto'"
placeholder="Bruto inkomen p/j"
id="index+'bruto_inkomen'"
min="0"
step="1"
size="small"
v-model:value="gegevens[index]['bruto_inkomen']"
v-model:value="personenGegevens[index]['bruto_inkomen']"
>
<template #prefix>&euro;</template>
</n-input-number>
<n-input-number
v-if="gegevens[index].inkomen_type === 'percentage'"
v-if="personenGegevens[index].inkomen_type === 'percentage'"
placeholder="Percentage van eerste inkomen"
id="index+'percentage'"
min="0"
step="1"
size="small"
v-model:value="gegevens[index]['percentage']"
v-model:value="personenGegevens[index]['percentage']"
>
<template #suffix>%</template>
</n-input-number>
</div>
<div v-if="inkomenEersteVolwassene(index)">
<n-input-number
placeholder="Pensioen Franchise"
id="index+'franchise'"
min="0"
step="1"
size="small"
v-model:value="personenGegevens[index]['pensioenFranchise']"
>
<template #prefix>&euro;</template>
</n-input-number>
<n-input-number
placeholder="Pensioenpremie Percentage"
id="index+'premiePercentage'"
min="0"
max="100"
step="0.01"
size="small"
v-model:value="personenGegevens[index]['pensioenPremiePercentage']"
>
<template #suffix>%</template>
</n-input-number>
Expand Down Expand Up @@ -77,7 +100,6 @@

<script>
import belasting_data from "@/js/belasting/belasting_data";
import { InkomenType } from "../ts/types";
const MAX_PERSONEN = 8;
Expand All @@ -99,17 +121,17 @@ export default {
props: ["personen"],
data() {
return {
gegevens: [],
personenGegevens: [],
aantalPersonen: 1,
};
},
watch: {
personen(newPersonen, oldPersonen) {
this.gegevens = this.personen;
this.personenGegevens = this.personen;
this.aantalPersonen = this.personen.length;
},
aantalPersonen(newGegevens, oldGegevens) {
let current = this.gegevens;
let current = this.personenGegevens;
if (current.length == newGegevens) {
return;
Expand All @@ -121,7 +143,13 @@ export default {
} else if (newGegevens > oldGegevens) {
for (let i = 0; i < newGegevens - oldGegevens; i++) {
// moet altijd geldige waarde hebben, dus initialiseer met 'V'
current.push({ leeftijd: "V", inkomen_type: "bruto", bruto_inkomen: 0 });
current.push({
leeftijd: "V",
inkomen_type: "bruto",
bruto_inkomen: 0,
pensioenFranchise: 0,
pensioenPremiePercentage: 0,
});
}
}
},
Expand All @@ -137,16 +165,19 @@ export default {
return leeftijdenData;
}
},
inkomenNietEersteVolwassene(index) {
if (index == 0) {
return false;
}
let leeftijd = this.gegevens[index]["leeftijd"];
volwassene(index) {
let leeftijd = this.personenGegevens[index]["leeftijd"];
return leeftijd == "V" || leeftijd == "AOW";
},
inkomenEersteVolwassene(index) {
return index === 0 && this.volwassene(index);
},
inkomenNietEersteVolwassene(index) {
return index !== 0 && this.volwassene(index);
},
verwijderPersoon(index) {
this.gegevens.splice(index, 1);
this.personenGegevens.splice(index, 1);
this.aantalPersonen--;
},
},
Expand Down
20 changes: 15 additions & 5 deletions src/js/belasting/belasting_data.js
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ const AK = {
},
{
inkomen: { van: 12170, tot: 26289 },
grens: 968,
grens: 980,
afbouwpunt: 12169,
afbouwfactor: 0.3003,
},
Expand Down Expand Up @@ -695,7 +695,7 @@ const AK = {
},
{
inkomen: { van: 12170, tot: 26289 },
grens: 968,
grens: 980,
afbouwpunt: 12169,
afbouwfactor: 0.3003,
},
Expand Down Expand Up @@ -997,12 +997,21 @@ const LEEFTIJDEN = {
AOW: "AOW Leeftijd",
};

// Wet minimum loon

const WML = {
2025: 28712.82,
PD2025: 28712.82,
2024: 27235.38,
2023: 23940,
};

const BALKENENDENORM = 223000;
const AVG_HUUR = {
2023: 600,
2024: 674,
PD2025: 710,
2025: 710,
PD2025: 710,
2024: 674,
2023: 600,
};
const AVG_WOZ = 315000;
const AVG_RENTE = AVG_WOZ * 0.0428;
Expand All @@ -1023,4 +1032,5 @@ export default {
AVG_HUUR,
AVG_WOZ,
AVG_RENTE,
WML,
};
17 changes: 16 additions & 1 deletion src/js/belasting/inkomen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,23 @@
*/

import { isVolwassene } from "../../ts/functies";
import { InkomenType, LeeftijdType, PersoonType } from "../../ts/types";
import { InkomenType, PersoonType } from "../../ts/types";
import data from "./belasting_data";

// Berekening van pensioen premie. Als brutoloon < minimum loon, dan percentage minimum loon gebruiken.
// Dat is, ((minimum loon - franchise) / minimum loon) * premie factor
// Als boven minimum loon dan (bruto inkomen-franchise) * premie factor
function pensioenPremie(jaar: string, brutoloon: number, franchise: number, premiePercentage: number): number {
const wml = data.WML[jaar];
let premie;
if (brutoloon < wml) {
premie = brutoloon * (1 - franchise / wml) * premiePercentage * 0.01;
} else {
premie = (brutoloon - franchise) * premiePercentage * 0.01;
}
return Math.round(premie);
}

function algemeneHeffingsKorting(jaar: string, toetsingsinkomen: number, aow: boolean): number {
const ahkt = aow ? data.AHK[jaar].AOW : data.AHK[jaar].V;

Expand Down Expand Up @@ -110,6 +124,7 @@ export default {
inkomstenBelasting,
isMeestVerdiener,
netto,
pensioenPremie,
toeslagenToetsInkomen,
toetsingsinkomen,
};
24 changes: 22 additions & 2 deletions src/js/berekeningen/BeschikbaarInkomen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,25 @@ export class BeschikbaarInkomen extends Berekenen {
}

berekenBeschikbaarInkomen(
arbeidsinkomen: number,
brutoloon: number,
anderenArbeidsinkomen: number[],
visualisatie: VisualisatieTypeType
): BeschikbaarInkomenResultaatType {
const aow = this.personen[0].leeftijd == LeeftijdType.AOW;
const hoofdpersoon = this.personen[0];
const aow = hoofdpersoon.leeftijd == LeeftijdType.AOW;
// Pensioen Premie
const pensioenPremie =
hoofdpersoon.pensioenFranchise > 0
? inkomen.pensioenPremie(
this.vis.jaar,
brutoloon,
hoofdpersoon.pensioenFranchise,
hoofdpersoon.pensioenPremiePercentage
)
: 0;
const arbeidsinkomen = brutoloon - pensioenPremie;
// Hypotheek rente wordt afgetrokken van arbeidsinkomen: toetsingsinkomen zal dus lager worden dan arbeidsinkomen.

const toetsingsInkomen = inkomen.toetsingsinkomen(arbeidsinkomen, this.algemeneGegevens.hypotheekRenteAftrek);
// Berekende belasting als hypotheek rente van inkomen is afgetrokken.
const ibBox1 = inkomen.inkomstenBelasting(this.vis.jaar, toetsingsInkomen, aow);
Expand Down Expand Up @@ -141,7 +154,9 @@ export class BeschikbaarInkomen extends Berekenen {
huurtoeslag;

let beschikbaarInkomen: BeschikbaarInkomenResultaatType = {
brutoloon: brutoloon,
arbeidsinkomen: arbeidsinkomen,
pensioenPremie: pensioenPremie,
anderenArbeidsinkomen: anderenArbeidsinkomen.filter((_) => _ > 0),
nettoLoonBelasting: maxBelasting,
nettoArbeidsinkomen: nettoArbeidsinkomen,
Expand Down Expand Up @@ -209,6 +224,11 @@ export class BeschikbaarInkomen extends Berekenen {
id: id,
type: "kindgebonden budget",
getal: this.afronden(beschikbaarInkomen.kgb, factor),
},
{
id: id,
type: "pensioen premie",
getal: this.afronden(beschikbaarInkomen.pensioenPremie, factor),
}
);
}
Expand Down
4 changes: 3 additions & 1 deletion src/js/berekeningen/MarginaleDruk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ export class MarginaleDruk extends Berekenen {
const grafiek = visualisatie === VisualisatieTypeType.G;
const presentatieFunctie = grafiek ? this.percentage : this.absolute;

const ΔextraLoon = berekening2.arbeidsinkomen - berekening1.arbeidsinkomen;
const ΔextraLoon = berekening2.brutoloon - berekening1.brutoloon;
const ΔibBox1 = this.mdAbsolute(berekening1.ibBox1, berekening2.ibBox1, false);

const ΔhraMax = this.mdAbsolute(berekening1.hraMax, berekening2.hraMax, false);
Expand Down Expand Up @@ -129,8 +129,10 @@ export class MarginaleDruk extends Berekenen {
const md = ΔextraLoon - ΔnettoInkomen;

return {
brutoloon: berekening1.brutoloon,
arbeidsinkomen: berekening1.arbeidsinkomen,
anderenArbeidsinkomen: berekening1.anderenArbeidsinkomen,
pensioenPremie: presentatieFunctie(berekening1.pensioenPremie - berekening2.pensioenPremie, ΔextraLoon, grafiek),
extraLoon: ΔextraLoon,
ibBox1: presentatieFunctie(ΔibBox1, ΔextraLoon, true),
nettoLoonBelasting: presentatieFunctie(nettoLoonBelastingPresentatie, ΔextraLoon, grafiek),
Expand Down
26 changes: 22 additions & 4 deletions src/js/tabellen/tabel_kolommen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,33 @@ import { heeftInkomen } from "../../ts/functies";
import { tekstVerdiener } from "../../ts/samenvatting";

const AI_KOLOM: TableBaseColumn = {
title: "Brutoinkomen",
title: "Belastbaar loon",
key: "arbeidsinkomen",
align: "right",
render: (_) => Math.round(+_.arbeidsinkomen).toLocaleString(),
};

function brutoInkomen(titelAanvulling: string): TableBaseColumn {
return {
title: "Brutoinkomen" + (titelAanvulling && " " + titelAanvulling),
key: "arbeidsinkomen",
title: "Brutoloon" + (titelAanvulling && " " + titelAanvulling),
key: "brutoloon",
align: "right",
render: (_) => Math.round(+_.arbeidsinkomen).toLocaleString(),
render: (_) => Math.round(+_.brutoloon).toLocaleString(),
};
}

const BL_KOLOM: TableBaseColumn = {
title: "Brutoloon",
key: "brutoloon",
align: "right",
};

const PP_KOLOM: TableBaseColumn = {
title: "Pensioen premie",
key: "pensioenPremie",
align: "right",
};

const IBBOX1_KOLOM: TableBaseColumn = {
title: "IB\u00A0Box\u00A01",
key: "ibBox1",
Expand Down Expand Up @@ -138,7 +150,9 @@ const BD_KOLOM: TableBaseColumn = {
};

const BI_HUUR_KOLOMMEN: DataTableColumns<BeschikbaarInkomenResultaatType> = [
BL_KOLOM,
AI_KOLOM,
PP_KOLOM,
IBBOX1_KOLOM,
AHK_KOLOM,
AK_KOLOM,
Expand All @@ -153,6 +167,8 @@ const BI_HUUR_KOLOMMEN: DataTableColumns<BeschikbaarInkomenResultaatType> = [

const BI_KOOP_KOLOMMEN: DataTableColumns<BeschikbaarInkomenResultaatType> = [
AI_KOLOM,
BL_KOLOM,
PP_KOLOM,
IBBOX1_KOLOM,
HRA_KOLOM,
AHK_KOLOM,
Expand All @@ -167,6 +183,7 @@ const BI_KOOP_KOLOMMEN: DataTableColumns<BeschikbaarInkomenResultaatType> = [

const MD_HUUR_KOLOMMEN: DataTableColumns<MarginaleDrukResultaatType> = [
EL_KOLOM,
PP_KOLOM,
IBBOX1_KOLOM,
AHK_KOLOM,
AK_KOLOM,
Expand All @@ -182,6 +199,7 @@ const MD_HUUR_KOLOMMEN: DataTableColumns<MarginaleDrukResultaatType> = [

const MD_KOOP_KOLOMMEN: DataTableColumns<MarginaleDrukResultaatType> = [
EL_KOLOM,
PP_KOLOM,
IBBOX1_KOLOM,
HRA_KOLOM,
AHK_KOLOM,
Expand Down
Loading

0 comments on commit 5f09ac8

Please sign in to comment.