gewinn rechner feed page
This commit is contained in:
84
Profice WebSite/scripts/feed-calculator.js
Normal file
84
Profice WebSite/scripts/feed-calculator.js
Normal file
@@ -0,0 +1,84 @@
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user