Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/issue 46 #47

Merged
merged 8 commits into from
Sep 8, 2023
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
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20
1,606 changes: 1,606 additions & 0 deletions documentation/Lohnsteuer2022_0.xml

Large diffs are not rendered by default.

1,620 changes: 1,620 additions & 0 deletions documentation/Lohnsteuer2023AbJuli.xml

Large diffs are not rendered by default.

4,598 changes: 3,376 additions & 1,222 deletions package-lock.json

Large diffs are not rendered by default.

8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@
"eslint": "^8.17.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^5.0.0",
"isomorphic-fetch": "^3.0.0",
"jest": "^28.1.1",
"jest": "^29.6.4",
"prettier": "^3.0.0",
"ts-jest": "^28.0.4",
"ts-jest": "^29.1.1",
"typescript": "^5.0.4",
"xml2js": "^0.6.0"
},
"engines": {
"node": "^20"
},
"dependencies": {
"big.js": "^6.1.1",
"luxon": "^3.3.0"
Expand Down
162 changes: 57 additions & 105 deletions src/config.ts
Original file line number Diff line number Diff line change
@@ -1,120 +1,72 @@
import Big from "big.js";
import { KENNVMT } from "./constants";
import { IINPUT } from "./input";
import config2022 from "./configuraions/2022";
import config2023 from "./configuraions/2023";

export interface ICONFIGURATION {
BJAHR: number;
PATCH: string;
KENNVMT: KENNVMT;
GFB: Big;
SOLZFREI: Big;
TBSVORV: Big;
W1STKL5: Big;
W2STKL5: Big;
W3STKL5: Big;
RVSATZAN: Big;
PVSATZAG: Big;
PVSATZAN: Big;
KVSATZAG: Big;
KVSATZAN: Big;
BBGKVPV: Big;
BBGRV: Big;
VBEZBSO: Big;
GFB: Big; // Grundfreibetrag in Euro
SOLZFREI: Big; // Freigrenze für den Solidaritätszuschlag in Euro
TBSVORV: Big; // Teilbetragssatz der Vorsorgepauschale für die Rentenversicherung (2 Dezimalstellen)
W1STKL5: Big; // Erster Grenzwert in Steuerklasse V/VI in Euro
W2STKL5: Big; // Zweiter Grenzwert in Steuerklasse V/VI in Euro
W3STKL5: Big; // Dritter Grenzwert in Steuerklasse V/VI in Euro
RVSATZAN: Big; // Beitragssatz des Arbeitnehmers in der allgemeinen gesetzlichen Rentenversicherung (4 Dezimalstellen)
BBGRV: Big; // Allgemeine Beitragsbemessungsgrenze in der allgemeinen Rentenversicherung in Euro
VBEZBSO: Big; // Bemessungsgrundlage für den Versorgungsfreibetrag in Cent für den sonstigen Bezug
PVSATZAG: Big; // Beitragssatz des Arbeitgebers zur Pflegeversicherung (5 Dezimalstellen)
PVSATZAN: Big; // Beitragssatz des Arbeitnehmers zur Pflegeversicherung (5 Dezimalstellen)
KVSATZAG: Big; // Beitragssatz des Arbeitgebers zur Krankenversicherung unter Berücksichtigung des durchschnittlichen Zusatzbeitragssatzes für die Ermittlung des Arbeitgeberzuschusses (5 Dezimalstellen)
KVSATZAN: Big; // Beitragssatz des Arbeitnehmers zur Krankenversicherung (5 Dezimalstellen)
BBGKVPV: Big; // Beitragsbemessungsgrenze in der gesetzlichen Krankenversicherung und der sozialen Pflegeversicherung in Euro
}

export class PARAMS {
BJAHR: number;
KENNVMT: KENNVMT = KENNVMT.NORMAL;
GFB = new Big(0); // Grundfreibetrag in Euro
SOLZFREI = new Big(0); // Freigrenze für den Solidaritätszuschlag in Euro
TBSVORV = new Big(0); // Teilbetragssatz der Vorsorgepauschale für die Rentenversicherung (2 Dezimalstellen)
W1STKL5 = new Big(0); // Erster Grenzwert in Steuerklasse V/VI in Euro
W2STKL5 = new Big(0); // Zweiter Grenzwert in Steuerklasse V/VI in Euro
W3STKL5 = new Big(222260); // Dritter Grenzwert in Steuerklasse V/VI in Euro
RVSATZAN = new Big(0); // Beitragssatz des Arbeitnehmers in der allgemeinen gesetzlichen Rentenversicherung (4 Dezimalstellen)
BBGRV = new Big(0); // Allgemeine Beitragsbemessungsgrenze in der allgemeinen Rentenversicherung in Euro
VBEZBSO = new Big(0); // Bemessungsgrundlage für den Versorgungsfreibetrag in Cent für den sonstigen Bezug
PVSATZAG = new Big(0); // Beitragssatz des Arbeitgebers zur Pflegeversicherung (5 Dezimalstellen)
PVSATZAN = new Big(0); // Beitragssatz des Arbeitnehmers zur Pflegeversicherung (5 Dezimalstellen)
KVSATZAG = new Big(0); // Beitragssatz des Arbeitgebers zur Krankenversicherung unter Berücksichtigung des durchschnittlichen Zusatzbeitragssatzes für die Ermittlung des Arbeitgeberzuschusses (5 Dezimalstellen)
KVSATZAN = new Big(0); // Beitragssatz des Arbeitnehmers zur Krankenversicherung (5 Dezimalstellen)
BBGKVPV = new Big(0); // Beitragsbemessungsgrenze in der gesetzlichen Krankenversicherung und der sozialen Pflegeversicherung in Euro

constructor(YEAR = 2022, CONFIG: IINPUT) {
this.BJAHR = YEAR;

if (this.BJAHR === 2022) {
this.config2022(CONFIG);
}
if (this.BJAHR === 2023) {
this.config2023(CONFIG);
}

return this;
const parseYEAR = (inputYear: number | string): { BJAHR: number, PATCH: string } => {
let calculationYear:number;
let calculationPatch:string;
if (typeof inputYear === "number") {
calculationYear = inputYear;
calculationPatch = ""
} else {
const [cYear, cPatch] = inputYear.split(".");
calculationYear = parseInt(cYear);
calculationPatch = cPatch;
}

config2022({ KRV, KVZ, PVS, PVZ }: IINPUT) {
this.GFB = new Big(10347);
this.SOLZFREI = new Big(16956);
this.W1STKL5 = new Big(11793);
this.W2STKL5 = new Big(29298);

if (KRV < 2) {
if (KRV === 0) {
this.BBGRV = new Big(84600);
} else {
this.BBGRV = new Big(81000);
}
this.RVSATZAN = new Big(0.093);
this.TBSVORV = new Big(0.88);
}

this.BBGKVPV = new Big(58050);
this.KVSATZAN = KVZ.div(2).div(100).add(0.07);
this.KVSATZAG = new Big(0.0065).add(0.07);

if (PVS) {
this.PVSATZAN = new Big(0.02025);
this.PVSATZAG = new Big(0.01025);
} else {
this.PVSATZAN = new Big(0.01525);
this.PVSATZAG = new Big(0.01525);
}

if (PVZ) {
this.PVSATZAN = this.PVSATZAN.add(0.0035);
}
return {
BJAHR: calculationYear,
PATCH: calculationPatch,
}
}

config2023({ KRV, KVZ, PVS, PVZ }: IINPUT) {
this.GFB = new Big(10908);
this.SOLZFREI = new Big(17543);
this.W1STKL5 = new Big(12485);
this.W2STKL5 = new Big(31404);

if (KRV < 2) {
if (KRV === 0) {
this.BBGRV = new Big(87600);
} else {
this.BBGRV = new Big(85200);
}
this.RVSATZAN = new Big(0.093);
this.TBSVORV = new Big(1.0);
}

this.BBGKVPV = new Big(59850);
this.KVSATZAN = KVZ.div(2).div(100).add(0.07);
this.KVSATZAG = new Big(0.008).add(0.07);

if (PVS) {
this.PVSATZAN = new Big(0.02025);
this.PVSATZAG = new Big(0.01025);
} else {
this.PVSATZAN = new Big(0.01525);
this.PVSATZAG = new Big(0.01525);
}
export const PARAMS = (year:number|string, CONFIG:IINPUT):ICONFIGURATION => {
const { BJAHR, PATCH } = parseYEAR(year);

if (PVZ) {
this.PVSATZAN = this.PVSATZAN.add(0.0035);
}
const base = {
BJAHR: BJAHR,
PATCH: PATCH,
KENNVMT: KENNVMT.NORMAL,
GFB: new Big(0),
SOLZFREI: new Big(0),
TBSVORV: new Big(0),
W1STKL5: new Big(0),
W2STKL5: new Big(0),
W3STKL5: new Big(222260),
RVSATZAN: new Big(0),
BBGRV: new Big(0),
VBEZBSO: new Big(0),
PVSATZAG: new Big(0),
PVSATZAN: new Big(0),
KVSATZAG: new Big(0),
KVSATZAN: new Big(0),
BBGKVPV: new Big(0),
}

return {
...base,
...(BJAHR === 2022 ? config2022(CONFIG, base) : {}),
...(BJAHR === 2023 ? config2023(CONFIG, base) : {}),
};
}
102 changes: 102 additions & 0 deletions src/configuraions/2022.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import {IINPUT} from "../input";
import Big from "big.js";
import {ICONFIGURATION} from "../config";

const initial = ({ KRV, KVZ, PVS, PVZ }:IINPUT, base: ICONFIGURATION):ICONFIGURATION => {
let defaults: ICONFIGURATION;
defaults = {
...base,
GFB: new Big(9984),
SOLZFREI: new Big(16956),
W1STKL5: new Big(11480),
W2STKL5: new Big(29298),
BBGKVPV: new Big(58050),
KVSATZAN: KVZ.div(2).div(100).add(0.07),
KVSATZAG: new Big(0.0065).add(0.07),
}

if (KRV < 2) {
defaults = {
...defaults,
BBGRV: KRV === 0 ? new Big(84600) : new Big(81000),
RVSATZAN: new Big(0.093),
TBSVORV: new Big(0.88),
}
}

if (PVS) {
defaults = {
...defaults,
PVSATZAN: new Big(0.02025),
PVSATZAG: new Big(0.01025),
}
} else {
defaults = {
...defaults,
PVSATZAN: new Big(0.01525),
PVSATZAG: new Big(0.01525),
}
}

if (PVZ) {
defaults = {
...defaults,
PVSATZAN: defaults.PVSATZAN.add(0.0035),
}
}

return {...defaults};
}
const june = ({ KRV, KVZ, PVS, PVZ }:IINPUT, base: ICONFIGURATION):ICONFIGURATION => {
let defaults: ICONFIGURATION;
defaults = {
...base,
GFB: new Big(10347),
SOLZFREI: new Big(16956),
W1STKL5: new Big(11793),
W2STKL5: new Big(29298),
BBGKVPV: new Big(58050),
KVSATZAN: KVZ.div(2).div(100).add(0.07),
KVSATZAG: new Big(0.0065).add(0.07),
}

if (KRV < 2) {
defaults = {
...defaults,
BBGRV: KRV === 0 ? new Big(84600) : new Big(81000),
RVSATZAN: new Big(0.093),
TBSVORV: new Big(0.88),
}
}

if (PVS) {
defaults = {
...defaults,
PVSATZAN: new Big(0.02025),
PVSATZAG: new Big(0.01025),
}
} else {
defaults = {
...defaults,
PVSATZAN: new Big(0.01525),
PVSATZAG: new Big(0.01525),
}
}

if (PVZ) {
defaults = {
...defaults,
PVSATZAN: defaults.PVSATZAN.add(0.0035),
}
}

return {...defaults};
}

export const config = (CONFIG: IINPUT, base: ICONFIGURATION):ICONFIGURATION => {
const { PATCH } = base;
if (PATCH && PATCH === "1") return {...initial(CONFIG, base)}
return {...june(CONFIG, base)};
}

export default config;
Loading