Рассчитать в JS проценты от суммы (за каждый последующий 1% свыше 50% от общей суммы прибавлять по 500)
Дано: 1) план (100.000); 2) за выполнение плана на 50% и выше выплачивается премия 5.000, при этом за каждый последующий процент выполнения прибавлять по 500 к премии (например, 51% = 5.000 + 500); 3) при выполнении плана менее 50% всегда выплачивается 3.000.
Как сделать так, чтобы высчитывалось, на сколько процентов больше 50% от плана, и затем эта разница умножалась на 500? Например, если выполнен план на 53%, программа должна расчитать, что 50% выполнения = 5.000, а 53% это уже 6.500.
Ответы (1 шт):
Автор решения: MoloF
→ Ссылка
Получилось громоздко, но вся основная логика вынесена в функцию calculatePayout
const planElem = document.querySelector("#plan");
const doneElem = document.querySelector("#done");
const percentLimitElem = document.querySelector("#percent_limit");
const minPayoutElem = document.querySelector("#min_payout");
const bonusPayoutElem = document.querySelector("#bonus_payout");
const payoutElem = document.querySelector("#payout");
const bonusForPercent = document.querySelector("#bonus_for_percent");
function calculatePayout({
plan,
done,
limit,
min_payout,
bonus_payout,
bonus_for_percent,
}) {
// Общий процент выполненной работы
const totalPercent = done / plan * 100;
// Выполнен план или нет
const exceededPlan = totalPercent > limit;
// Разница выполненного плана с округлением в меньшую сторону и абсолютным значением
const differentPercent = Math.abs(Math.floor(totalPercent - limit));
// Дефолтные значения если условия по выполнению плана не будет выполнено
let bonusForPercent = 0;
let bonusPayout = 0;
let payout = min_payout;
// Задаем значения если план был выполнен
if (exceededPlan) {
bonusForPercent = bonus_for_percent;
bonusPayout = bonus_payout;
payout = differentPercent * bonus_for_percent + bonus_payout
}
// Возвращаем подробные данные, можно обойтись лишь результатом `payout`
return {
exceededPlan,
differentPercent,
bonusForPercent,
bonusPayout,
payout,
}
}
// Функция обёртка для извлечения значений из блоков ввода
function calculatePayoutWrapper() {
const data = calculatePayout({
plan: Number(planElem.value),
done: Number(doneElem.value),
limit: Number(percentLimitElem.value),
min_payout: Number(minPayoutElem.value),
bonus_payout: Number(bonusPayoutElem.value),
bonus_for_percent: Number(bonusForPercent.value),
});
if (data.exceededPlan) {
payoutElem.innerText = `${data.bonusPayout} + ${data.differentPercent}% * ${data.bonusForPercent} = ${data.payout}`;
} else {
payoutElem.innerText = `${data.payout}`;
}
}
planElem.addEventListener('change', calculatePayoutWrapper);
doneElem.addEventListener('change', calculatePayoutWrapper);
percentLimitElem.addEventListener('change', calculatePayoutWrapper);
minPayoutElem.addEventListener('change', calculatePayoutWrapper);
bonusPayoutElem.addEventListener('change', calculatePayoutWrapper);
bonusForPercent.addEventListener('change', calculatePayoutWrapper);
calculatePayoutWrapper();
<fieldset>
<legend>Рассчёт зарплаты</legend>
<label for="plan">План</label>
<input type="number" id="plan" value="100000" min="50000" max="500000" step="1000" />
<br />
<label for="done">Выполнено</label>
<input type="number" id="done" value="65000" min="50000" max="500000" step="1000" />
<br />
<label for="min_payout">Минимальная выплата</label>
<input type="number" id="min_payout" value="3000" min="0" max="100000" step="100" />
<br />
<label for="bonus_payout">Бонус к выплате</label>
<input type="number" id="bonus_payout" value="5000" min="0" max="50000" step="100" />
<br />
<label for="bonus_for_percent">Бонус к выплате за каждый %</label>
<input type="number" id="bonus_for_percent" value="300" min="0" max="3000" step="100" />
<br />
<label for="percent_limit">Граница (%)</label>
<input type="number" id="percent_limit" value="50" min="0" max="100" step="1" />
<br />
<br />
<label for="payout">К выплате:</label>
<div id="payout"></div>
</fieldset>