Рассчитать в 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>

→ Ссылка