85 lines
2.9 KiB
JavaScript
85 lines
2.9 KiB
JavaScript
/**
|
|
* Gewinn-Calculator — Feed Page
|
|
* Real-time profit calculator with synchronized sliders and number inputs.
|
|
*/
|
|
(function () {
|
|
function fmt(n) {
|
|
return n.toLocaleString('de-DE', { maximumFractionDigits: 0 }) + ' €';
|
|
}
|
|
|
|
function fmtPct(n) {
|
|
return (n >= 0 ? '+' : '') + n.toLocaleString('de-DE', { maximumFractionDigits: 0 }) + ' %';
|
|
}
|
|
|
|
function calc() {
|
|
var B = +document.getElementById('sl-budget').value;
|
|
var U = +document.getElementById('sl-umsatz').value;
|
|
var m = +document.getElementById('sl-marge').value / 100;
|
|
var w = +document.getElementById('sl-waste').value / 100;
|
|
|
|
var P_alt = U * m - B;
|
|
var roas_core = U / (B * (1 - w));
|
|
var U_neu = U + B * w * roas_core;
|
|
var P_neu = U_neu * m - B;
|
|
var wachstum = P_alt !== 0 ? ((P_neu - P_alt) / Math.abs(P_alt)) * 100 : 0;
|
|
var hebel = P_neu - P_alt;
|
|
|
|
document.getElementById('out-profit-alt').textContent = fmt(Math.round(P_alt));
|
|
document.getElementById('out-profit-neu').textContent = fmt(Math.round(P_neu));
|
|
document.getElementById('out-hebel-eur').textContent = (hebel >= 0 ? '+' : '') + fmt(Math.round(hebel)).replace(' €', '') + ' €';
|
|
document.getElementById('out-hebel-pct').textContent = fmtPct(Math.round(wachstum));
|
|
}
|
|
|
|
function syncFromSlider(slId, numId, lblId, unit) {
|
|
var sl = document.getElementById(slId);
|
|
var num = document.getElementById(numId);
|
|
var lbl = document.getElementById(lblId);
|
|
|
|
function updateLbl(v) {
|
|
if (unit === '€') {
|
|
lbl.textContent = Number(v).toLocaleString('de-DE') + ' €';
|
|
} else {
|
|
lbl.textContent = v + ' %';
|
|
}
|
|
}
|
|
|
|
sl.addEventListener('input', function () {
|
|
num.value = sl.value;
|
|
updateLbl(sl.value);
|
|
calc();
|
|
});
|
|
|
|
num.addEventListener('input', function () {
|
|
var v = Math.min(+num.max, Math.max(+num.min, +num.value || +num.min));
|
|
sl.value = v;
|
|
updateLbl(v);
|
|
calc();
|
|
});
|
|
|
|
num.addEventListener('change', function () {
|
|
var v = Math.min(+num.max, Math.max(+num.min, +num.value || +num.min));
|
|
num.value = v;
|
|
sl.value = v;
|
|
updateLbl(v);
|
|
calc();
|
|
});
|
|
}
|
|
|
|
function init() {
|
|
if (!document.getElementById('sl-budget')) return;
|
|
|
|
syncFromSlider('sl-budget', 'num-budget', 'lbl-budget', '€');
|
|
syncFromSlider('sl-umsatz', 'num-umsatz', 'lbl-umsatz', '€');
|
|
syncFromSlider('sl-marge', 'num-marge', 'lbl-marge', '%');
|
|
syncFromSlider('sl-waste', 'num-waste', 'lbl-waste', '%');
|
|
|
|
calc();
|
|
}
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', init);
|
|
} else {
|
|
init();
|
|
}
|
|
})();
|