@Stanislav6

Можно ли прописать формулу расчёта с нефиксированной скидкой?

Здравствуйте. Помогите, пожалуйста, реализовать непростую функцию скидки в простом калькуляторе расчёта стоимости.

На каждую комбинацию Формат бумаги + Тип бумаги + Кол-во [>=9; >=99] своя фиксированная скидка.

Формат бумаги имеет value — это цена одного листа без скидки.
Тип бумаги имеет value — это множитель стоимости одного листа данного типа бумаги. Для простоты указал как 1 и 2, однако этих типов множество.

В чём загвоздка, например:
Лист А2 * Матовый тип бумаги = 4
Лист А2 * Матовый тип бумаги * 10 шт = 36
Лист А2 * Матовый тип бумаги * 100 шт = 350

Однако, если изменить тип бумаги на Глянцевый, то:
Лист А2 * Глянцевый тип бумаги = 2
Лист А2 * Глянцевый тип бумаги * 10 шт = 19
Лист А2 * Глянцевый тип бумаги * 100 шт = 185

Иначе говоря, комбинация бумага + тип имеют разную степень фиксированной скидки в зависимости от кол-ва.

<div id="calc">

	<label>Формат бумаги</label>
	<select class="form-control" id="paper">
		<option value="2">А2</option>
		<option value="1">А3</option>
	</select>
	
	<label>Тип бумаги</label>
	<select class="form-control" id="paper-type">
		<option value="1">Глянцевая</option>
		<option value="2">Матовая</option>
	</select>

	<label>Листов в упаковке</label>
	<input type="text" class="form-control" id="paper-amount" data-price="1">
		
	<div>
		<span id="totalprice">0</span> руб.
	</div>
		
</div>

jQuery(function ($) {
  $("#calc .form-control").on("input", function () {
    var paper = new Number($("#paper option:selected").val())
    var type = new Number($("#paper-type option:selected").val())

    var amount = new Number($("#paper-amount").val())
    var amount_price = new Number($("#paper-amount").attr("data-price"))
    
    if (amount >=10) {
			var amount = (amount * amount_price) * 0.9
		} 

    var total = paper * (amount * amount_price) * type
    var str = total
    //	console.log( 'From string:',  );

    $("#totalprice").text(parseInt(str).toLocaleString("ru-RU"))
  })
})


Моих знаний не хватает чтобы решить эту задачу не описывая каждое условие индивидуально. Помогите, пожалуйста, кто чем силён.

https://jsfiddle.net/mdez07as/
  • Вопрос задан
  • 42 просмотра
Решения вопроса 1
cdcdcd
@cdcdcd
Bug creator
1. Крепим таблицы скидок (фиксированные скидки для различных комбинаций):

const discounts = {
  "A2": {
    "Глянцевая": [
      { min: 1, discount: 1 }, // До 10 листов
      { min: 10, discount: 0.9 }, // От 10 листов
      { min: 100, discount: 0.85 }, // От 100 листов
    ],
    "Матовая": [
      { min: 1, discount: 1 }, // До 10 листов
      { min: 10, discount: 0.8 }, // От 10 листов
      { min: 100, discount: 0.7 }, // От 100 листов
    ],
  },
  "A3": {
    "Глянцевая": [
      { min: 1, discount: 1 },
      { min: 10, discount: 0.95 },
      { min: 100, discount: 0.9 },
    ],
    "Матовая": [
      { min: 1, discount: 1 },
      { min: 10, discount: 0.85 },
      { min: 100, discount: 0.75 },
    ],
  },
};


2. Функция для расчёта скидки:

function getDiscount(format, type, amount) {
  const rules = discounts[format][type];
  let discount = 1;

  for (const rule of rules) {
    if (amount >= rule.min) {
      discount = rule.discount;
    }
  }

  return discount;
}


3. Обновляем код калькулятора

jQuery(function ($) {
  $("#calc .form-control").on("input change", function () {
    const format = $("#paper option:selected").text();
    const type = $("#paper-type option:selected").text();
    const pricePerSheet = Number($("#paper option:selected").val());
    const multiplier = Number($("#paper-type option:selected").val());
    const amount = Number($("#paper-amount").val());

    if (!amount || amount < 1) {
      $("#totalprice").text("0 руб.");
      return;
    }

    // Получение скидки
    const discount = getDiscount(format, type, amount);

    // Расчёт итоговой стоимости
    const total = amount * pricePerSheet * multiplier * discount;

    // Вывод результата
    $("#totalprice").text(`${total.toLocaleString("ru-RU")}`);
  });
});


4. HTML с адаптацией под решение (остаётся практически неизменным):

<div id="calc">
  <label>Формат бумаги</label>
  <select class="form-control" id="paper">
    <option value="2">A2</option>
    <option value="1">A3</option>
  </select>

  <label>Тип бумаги</label>
  <select class="form-control" id="paper-type">
    <option value="1">Глянцевая</option>
    <option value="2">Матовая</option>
  </select>

  <label>Листов в упаковке</label>
  <input type="text" class="form-control" id="paper-amount" />

  <div>
    <span id="totalprice">0</span> руб.
  </div>
</div>


Вся эта пурга динамического расчёта стоимости с учетом фиксированных скидок на основе комбинаций формата бумаги, типа бумаги и количества, лучше всего использовать таблицу скидок или конфигурационный объект, который описывает правила расчёта (определил выше).

Это избавит тебя от необходимости прописывать каждую комбинацию вручную и упростит поддержку кода.

Код проверил

https://jsfiddle.net/pnr4hz10/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы