68 lines
2.5 KiB
TypeScript
68 lines
2.5 KiB
TypeScript
/**
|
|
* Lineare Abschreibung (AfA) nach §7 EStG
|
|
* Alle Geldwerte in Euro, 2 Dezimalstellen.
|
|
*/
|
|
|
|
export interface AnlagegutRaw {
|
|
anschaffungskosten: number;
|
|
nutzungsdauerJahre: number;
|
|
restwert: number;
|
|
anschaffungsdatum: string; // ISO-Datumsstring
|
|
aktiv: boolean;
|
|
}
|
|
|
|
/** Volle Jahres-AfA */
|
|
export function jahresAfa(ak: number, restwert: number, nd: number): number {
|
|
return Math.round(((ak - restwert) / nd) * 100) / 100;
|
|
}
|
|
|
|
/** Pro-rata AfA im Anschaffungsjahr: verbleibende Monate (inkl. Anschaffungsmonat) / 12 */
|
|
export function erwerbsjahrAfa(ak: number, restwert: number, nd: number, datum: Date): number {
|
|
const verbleibendeMonathe = 12 - datum.getMonth(); // getMonth() = 0-basiert, Jan=0
|
|
return Math.round((jahresAfa(ak, restwert, nd) * verbleibendeMonathe) / 12 * 100) / 100;
|
|
}
|
|
|
|
/** AfA für ein bestimmtes Kalenderjahr (0 wenn nicht erworben oder vollständig abgeschrieben) */
|
|
export function afaFuerJahr(asset: AnlagegutRaw, year: number): number {
|
|
const acqDate = new Date(asset.anschaffungsdatum);
|
|
const acqYear = acqDate.getFullYear();
|
|
const lastDepYear = acqYear + asset.nutzungsdauerJahre - 1;
|
|
|
|
if (year < acqYear || year > lastDepYear) return 0;
|
|
|
|
const ak = asset.anschaffungskosten;
|
|
const rv = asset.restwert;
|
|
const nd = asset.nutzungsdauerJahre;
|
|
|
|
return year === acqYear
|
|
? erwerbsjahrAfa(ak, rv, nd, acqDate)
|
|
: jahresAfa(ak, rv, nd);
|
|
}
|
|
|
|
/** Kumulierte AfA vom Anschaffungsjahr bis inkl. gegebenem Jahr */
|
|
export function kumulierteAfa(asset: AnlagegutRaw, bisJahr: number): number {
|
|
const acqYear = new Date(asset.anschaffungsdatum).getFullYear();
|
|
let total = 0;
|
|
for (let y = acqYear; y <= bisJahr; y++) {
|
|
total += afaFuerJahr(asset, y);
|
|
}
|
|
return Math.round(total * 100) / 100;
|
|
}
|
|
|
|
/** Buchwert zum 31.12. des gegebenen Jahres (Minimum: Restwert) */
|
|
export function buchwert(asset: AnlagegutRaw, year: number): number {
|
|
const acqYear = new Date(asset.anschaffungsdatum).getFullYear();
|
|
if (year < acqYear) return asset.anschaffungskosten;
|
|
const bw = asset.anschaffungskosten - kumulierteAfa(asset, year);
|
|
return Math.max(Math.round(bw * 100) / 100, asset.restwert);
|
|
}
|
|
|
|
/** Anzeige-Status eines Anlageguts */
|
|
export function assetStatus(asset: AnlagegutRaw, currentYear: number): "aktiv" | "vollständig abgeschrieben" | "inaktiv" {
|
|
if (!asset.aktiv) return "inaktiv";
|
|
const acqYear = new Date(asset.anschaffungsdatum).getFullYear();
|
|
const lastDepYear = acqYear + asset.nutzungsdauerJahre - 1;
|
|
if (currentYear > lastDepYear) return "vollständig abgeschrieben";
|
|
return "aktiv";
|
|
}
|