|
| 1 | +import { getTaxonomyManager, TaxonomyRootName } from "@/util/TaxonomyManager.ts"; |
| 2 | +import { getOrCreateBeloppradInList } from "@/model/arsredovisning/Belopprad.ts"; |
| 3 | +import { isBeloppradComparable } from "@/model/arsredovisning/beloppradtyper/BaseBeloppradComparable.ts"; |
| 4 | +import Decimal from "decimal.js"; |
| 5 | +import type { Arsredovisning, Verksamhetsar } from "@/model/arsredovisning/Arsredovisning.ts"; |
| 6 | + |
| 7 | +/** |
| 8 | + * Fyller automatiskt i soliditet i flerårsöversikten för de senaste två |
| 9 | + * räkenskapsåren. Funkar endast med |
| 10 | + * |
| 11 | + * @param arsredovisning - Årsredovisningen som ska få soliditeten ifylld |
| 12 | + */ |
| 13 | +export async function autofillSoliditet(arsredovisning: Arsredovisning) { |
| 14 | + const egetKapitalBelopprad = arsredovisning.balansrakning.find( |
| 15 | + (belopprad) => belopprad.taxonomyItemName === "se-gen-base:EgetKapital", |
| 16 | + ); |
| 17 | + const obeskattadeReserverBelopprad = arsredovisning.balansrakning.find( |
| 18 | + (belopprad) => |
| 19 | + belopprad.taxonomyItemName === "se-gen-base:ObeskattadeReserver", |
| 20 | + ); |
| 21 | + const balansomslutningBelopprad = arsredovisning.balansrakning.find( |
| 22 | + (belopprad) => |
| 23 | + belopprad.taxonomyItemName === "se-gen-base:EgetKapitalSkulder", |
| 24 | + ); |
| 25 | + if (egetKapitalBelopprad != null && balansomslutningBelopprad != null) { |
| 26 | + const taxonomyManager = await getTaxonomyManager( |
| 27 | + TaxonomyRootName.FORVALTNINGSBERATTELSE, |
| 28 | + ); |
| 29 | + const soliditetBelopprad = getOrCreateBeloppradInList( |
| 30 | + taxonomyManager, |
| 31 | + arsredovisning.forvaltningsberattelse, |
| 32 | + taxonomyManager.getItemByCompleteInfo( |
| 33 | + "se-gen-base:Soliditet", |
| 34 | + undefined, |
| 35 | + "se-gen-base:Flerarsoversikt", |
| 36 | + ), |
| 37 | + ); |
| 38 | + if ( |
| 39 | + isBeloppradComparable(egetKapitalBelopprad) && |
| 40 | + isBeloppradComparable(balansomslutningBelopprad) && |
| 41 | + isBeloppradComparable(soliditetBelopprad) |
| 42 | + ) { |
| 43 | + function soliditet( |
| 44 | + egetKapital: string, |
| 45 | + obeskattadeReserver: string, |
| 46 | + balansomslutning: string, |
| 47 | + verksamhetsar: Verksamhetsar, |
| 48 | + ): string { |
| 49 | + const bolagsskatt = |
| 50 | + BOLAGSSKATT_PER_AR[verksamhetsar.startdatum.substring(0, 4)]; |
| 51 | + if (bolagsskatt == null) { |
| 52 | + return ""; |
| 53 | + } |
| 54 | + |
| 55 | + return Decimal(egetKapital) |
| 56 | + .plus( |
| 57 | + Decimal("1") |
| 58 | + .minus(Decimal(bolagsskatt)) |
| 59 | + .mul(Decimal(obeskattadeReserver)), |
| 60 | + ) |
| 61 | + .div(Decimal(balansomslutning)) |
| 62 | + .mul(100) |
| 63 | + .round() |
| 64 | + .toString(); |
| 65 | + } |
| 66 | + |
| 67 | + soliditetBelopprad.beloppNuvarandeAr = soliditet( |
| 68 | + egetKapitalBelopprad.beloppNuvarandeAr, |
| 69 | + obeskattadeReserverBelopprad != null && |
| 70 | + isBeloppradComparable(obeskattadeReserverBelopprad) |
| 71 | + ? obeskattadeReserverBelopprad.beloppNuvarandeAr |
| 72 | + : "0", |
| 73 | + balansomslutningBelopprad.beloppNuvarandeAr, |
| 74 | + arsredovisning.verksamhetsarNuvarande, |
| 75 | + ).toString(); |
| 76 | + |
| 77 | + soliditetBelopprad.beloppTidigareAr[0] = soliditet( |
| 78 | + egetKapitalBelopprad.beloppTidigareAr[0], |
| 79 | + obeskattadeReserverBelopprad != null && |
| 80 | + isBeloppradComparable(obeskattadeReserverBelopprad) |
| 81 | + ? obeskattadeReserverBelopprad.beloppTidigareAr[0] |
| 82 | + : "0", |
| 83 | + balansomslutningBelopprad.beloppTidigareAr[0], |
| 84 | + arsredovisning.verksamhetsarTidigare[0], |
| 85 | + ).toString(); |
| 86 | + } |
| 87 | + } |
| 88 | +} |
| 89 | + |
| 90 | +// Bolagsskatt per år (räkenskapsår som inleds 2021, 2022, osv) |
| 91 | +const BOLAGSSKATT_PER_AR: { [ar: string]: string } = { |
| 92 | + "2021": "20.6", |
| 93 | + "2022": "20.6", |
| 94 | + "2023": "20.6", |
| 95 | + "2024": "20.6", |
| 96 | + "2025": "20.6", |
| 97 | +}; |
0 commit comments