/**
* đź§ľ IHK BELEG- & KALKULATIONS-TRAINER (PrintTop GmbH) đź§ľ
* ====================================================
* Interaktiver Trainer für kaufmännische Berechnungen nach ZPA 2. Auflage:
* 1. Bezugskalkulation (Vorwärtskalkulation vom Listeneinkaufspreis zum Einstandspreis)
* 2. RechnungsprĂĽfung & Skontoabzug bei Zahlung innerhalb Frist
* 3. Verzugszinsberechnung nach § 288 BGB & 40 € Mahnpauschale (§ 288 Abs. 5 BGB)
*/
class BelegKalkulator {
constructor(containerId) {
this.container = document.getElementById(containerId);
this.init();
}
init() {
if (!this.container) return;
this.render();
}
render() {
this.container.innerHTML = `
`;
this.attachEvents();
}
attachEvents() {
const tabBezug = document.getElementById("tab-bezug");
const tabVerzug = document.getElementById("tab-verzug");
const viewBezug = document.getElementById("view-bezug");
const viewVerzug = document.getElementById("view-verzug");
tabBezug.addEventListener("click", () => {
tabBezug.className = "ihk-btn ihk-btn-primary";
tabVerzug.className = "ihk-btn ihk-btn-secondary";
viewBezug.style.display = "block";
viewVerzug.style.display = "none";
});
tabVerzug.addEventListener("click", () => {
tabVerzug.className = "ihk-btn ihk-btn-primary";
tabBezug.className = "ihk-btn ihk-btn-secondary";
viewVerzug.style.display = "block";
viewBezug.style.display = "none";
});
document.getElementById("btn-check-bezug").addEventListener("click", () => this.checkBezug());
document.getElementById("btn-solve-bezug").addEventListener("click", () => this.solveBezug());
document.getElementById("btn-new-bezug").addEventListener("click", () => this.newBezugScenario());
document.getElementById("btn-calc-verzug").addEventListener("click", () => this.calculateVerzug());
}
getBezugValues() {
const lep = 10000;
const rabattP = 0.15;
const skontoP = 0.02;
const bezugK = 350;
const rabattEur = lep * rabattP; // 1500
const zep = lep - rabattEur; // 8500
const skontoEur = zep * skontoP; // 170
const bep = zep - skontoEur; // 8330
const einstand = bep + bezugK; // 8680
return { lep, rabattEur, zep, skontoEur, bep, bezugK, einstand };
}
checkBezug() {
const sol = this.getBezugValues();
const uRabatt = parseFloat(document.getElementById("val-rabatt-eur").value);
const uZep = parseFloat(document.getElementById("val-zep").value);
const uSkonto = parseFloat(document.getElementById("val-skonto-eur").value);
const uBep = parseFloat(document.getElementById("val-bep").value);
const uEinstand = parseFloat(document.getElementById("val-einstand").value);
let allOk = true;
const testVal = (actual, expected, statusId) => {
const el = document.getElementById(statusId);
if (Math.abs(actual - expected) < 0.05) {
el.innerHTML = `✓ ${expected.toFixed(2)} €`;
} else {
el.innerHTML = `✕ Soll: ${expected.toFixed(2)} €`;
allOk = false;
}
};
testVal(uRabatt, sol.rabattEur, "status-rabatt-eur");
testVal(uZep, sol.zep, "status-zep");
testVal(uSkonto, sol.skontoEur, "status-skonto-eur");
testVal(uBep, sol.bep, "status-bep");
testVal(uEinstand, sol.einstand, "status-einstand");
const box = document.getElementById("box-bezug-res");
box.style.display = "block";
if (allOk) {
box.innerHTML = `
🎉 Hervorragend! Alle 5 Kalkulationsschritte sind centgenau richtig berechnet.
Der Bezugspreis beträgt exakt ${sol.einstand.toFixed(2)} €.
`;
} else {
box.innerHTML = `
⚠️ Abweichung entdeckt: Bitte prüfen Sie die rot markierten Zeilen. Beachten Sie, dass Lieferskonto (2 %) vom Zieleinkaufspreis (ZEP) abgezogen wird!
`;
}
}
solveBezug() {
const sol = this.getBezugValues();
document.getElementById("val-rabatt-eur").value = sol.rabattEur.toFixed(2);
document.getElementById("val-zep").value = sol.zep.toFixed(2);
document.getElementById("val-skonto-eur").value = sol.skontoEur.toFixed(2);
document.getElementById("val-bep").value = sol.bep.toFixed(2);
document.getElementById("val-einstand").value = sol.einstand.toFixed(2);
this.checkBezug();
}
newBezugScenario() {
this.solveBezug();
}
calculateVerzug() {
const betrag = parseFloat(document.getElementById("vz-betrag").value) || 0;
const art = document.getElementById("vz-art").value;
const basiszins = parseFloat(document.getElementById("vz-basiszins").value) || 0;
const tage = parseInt(document.getElementById("vz-tage").value, 10) || 0;
const aufschlag = art === "B2B" ? 9.0 : 5.0;
const zinssatzGesamt = basiszins + aufschlag;
const zinsen = (betrag * zinssatzGesamt * tage) / (100 * 360);
const pauschale = art === "B2B" ? 40.0 : 0.0;
const gesamtForderung = betrag + zinsen + pauschale;
const card = document.getElementById("vz-result-card");
const content = document.getElementById("vz-result-content");
card.style.display = "block";
content.innerHTML = `
| Hauptforderung: | ${betrag.toFixed(2)} € |
| Basiszinssatz: | ${basiszins.toFixed(2)} % |
| Gesetzlicher Verzugszinsaufschlag (${art}): | + ${aufschlag.toFixed(2)} %-Punkte |
| = Verzugszinssatz p.a.: | ${zinssatzGesamt.toFixed(2)} % |
| Verzugstage (30/360 Methode): | ${tage} Tage |
| Berechnete Verzugszinsen: | + ${zinsen.toFixed(2)} € |
${art === "B2B" ? `| Mahnpauschale (§ 288 Abs. 5 BGB): | + 40,00 € |
` : ""}
| Gesamtforderung an Schuldner: | ${gesamtForderung.toFixed(2)} € |
`;
}
}
document.addEventListener("DOMContentLoaded", () => {
if (document.getElementById("beleg-kalkulator-container")) {
window.belegKalkulator = new BelegKalkulator("beleg-kalkulator-container");
}
});