Skip to content

Commit

Permalink
fix max invest Gewinnfreibetrag
Browse files Browse the repository at this point in the history
  • Loading branch information
bettysteger committed Feb 28, 2024
1 parent e60383e commit 356a517
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 10 deletions.
31 changes: 29 additions & 2 deletions src/est.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,38 @@ export function einkommensteuer(value, year) {
// Gewinnfreibetrag
// @see https://www.wko.at/steuern/der-gewinnfreibetrag
// @see https://www.usp.gv.at/steuern-finanzen/betriebseinnahmen-und-ausgaben/gewinnfreibetrag.html
export function freiBetragValues(year) {

export function freibetragValues(year) {
return {
// Bis zur Veranlagung 2023 stand der Grundfreibetrag für Gewinne bis 30.000 €
limit: year <= 2023 ? 30000 : 33000,
// höchstens jedoch 13% bzw. ab 2022 15% des Betriebsgewinnes
percentage: year < 2022 ? 0.13 : 0.15
percentage: year < 2022 ? 0.13 : 0.15,
investLimitsAndPcts: [{limit: 145000, pct: 0.13}, {limit: 175000, pct: 0.07}, {limit: 230000, pct: 0.045}]
}
}

/**
* Bei einer Bemessungsgrundlage von 33.000 EUR bis zu 178.000 EUR beträgt der investitionsbedingte Gewinnfreibetrag 13%.
* Wird dieser Betrag überschritten, steht für die nächsten 175.000 EUR ein Freibetrag von 7% und
* für weitere 230.000 EUR ein Freibetrag von 4,5% zu.
* Ab einer Bemessungsgrundlage von 583.000 EUR steht kein Gewinnfreibetrag mehr zu.
* Durch die Prozentstaffelung ergibt sich ein Maximalausmaß von 46.400 EUR.
*/
export function investGewinnfreibetrag(value, year) {
const { limit, investLimitsAndPcts } = freibetragValues(year);
if(value <= limit) {
return 0;
}
let freibetrag = 0;
let rest = parseInt(value) - limit; // - 33.000 € Grundfreibetrag

for(const limitAndPct of investLimitsAndPcts) {
if (rest <= limitAndPct.limit) {
break;
}
freibetrag += parseInt(Math.min(rest, limitAndPct.limit) * limitAndPct.pct);
rest -= limitAndPct.limit;
}
return freibetrag;
}
14 changes: 6 additions & 8 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { defaultOptions } from './options.js';
import { einkommensteuer, freiBetragValues } from './est.js';
import { einkommensteuer, freibetragValues, investGewinnfreibetrag } from './est.js';
import { SVbeitrag } from './sv.js';


// Einkommen laut Einkommensteuerbescheid
function profitOnEStBescheid(income, outgo, options) {
const freiBetragLimit = freiBetragValues(options.year).limit;
const freiBetragLimit = freibetragValues(options.year).limit;
let value = income - outgo - options.paidSv;

// Übersteigt der Gewinn 30.000 EUR kann zusätzlich zum Grundfreibetrag
// Übersteigt der Gewinn 33.000 EUR kann zusätzlich zum Grundfreibetrag
// ein investitionsbedingter Gewinnfreibetrag geltend gemacht werden.
if(options.useInvestFreibetrag && value <= freiBetragLimit) {
options.useInvestFreibetrag = false;
Expand All @@ -28,7 +28,7 @@ function profitOnEStBescheid(income, outgo, options) {
}
}

value -= (Math.min(value, freiBetragLimit) * freiBetragValues(options.year).percentage); // - 15% Grundfreibetrag
value -= (Math.min(value, freiBetragLimit) * freibetragValues(options.year).percentage); // - 15% Grundfreibetrag
if(options.useInvestFreibetrag && options.investFreibetrag) {
value -= options.investFreibetrag; // - 15% Investitionsbedingter Gewinnfreibetrag
}
Expand All @@ -52,11 +52,9 @@ function calculate(income, outgo, options = {}) {
const est = einkommensteuer(profit, options.year);
let netto = Math.round(income - outgo - est - options.paidSv);

const freiBetragLimit = freiBetragValues(options.year).limit;
const freiBetragPercentage = freiBetragValues(options.year).percentage;
let maxInvestFreibetrag = parseInt((profit - freiBetragLimit) * freiBetragPercentage);
const maxInvestFreibetrag = investGewinnfreibetrag(profit, options.year); // parseInt((profit - freiBetragLimit) * freiBetragPercentage);

if(options.useInvestFreibetrag) {
maxInvestFreibetrag = parseInt((profit + options.investFreibetrag - freiBetragLimit) * freiBetragPercentage);
netto -= options.investFreibetrag;
}

Expand Down
22 changes: 22 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,26 @@ test('should NOT add tipp to increase SV-Beitrag in the founding year, if expect
let income = 10000;
let outgo = income * 0.6;
expect(hundert11.calculate(income, outgo).tipps.includes('INCREASE_SV')).toBe(false);
});

test('should return zero maxInvestFreibetrag because of 33.000 limit', () => {
let income = 40000;
let outgo = 7000;
expect(hundert11.calculate(income, outgo).maxInvestFreibetrag).toBe(0);
});

// Maximalausmaß von 46.400 EUR
// @see https://www.wko.at/steuern/der-gewinnfreibetrag
test('should return correct maxInvestFreibetrag for 2024', () => {
let income = 833000;
let outgo = 200000;
const grundfreibetrag = 4950;
expect(hundert11.calculate(income, outgo).maxInvestFreibetrag).toBe(46400 - grundfreibetrag);
});

test('should return correct maxInvestFreibetrag for 2023', () => {
let income = 833000;
let outgo = 200000;
const grundfreibetrag = 4500;
expect(hundert11.calculate(income, outgo, {year: 2023}).maxInvestFreibetrag).toBe(45950 - grundfreibetrag);
});

0 comments on commit 356a517

Please sign in to comment.