Ограничить ввод промокода по сумме заказа

Эта модификация позволяет установить минимальную сумму товаров, при которой покупатель может применить промокод в корзине Тильды.
Пример
Введите номинал меньше 10000 р и в корзине применить промокод "ASDFA23LKJ2"
Сумма сертификатов: 0 руб.
🎁 -1000 руб. по промокоду "ASDFA23LKJ2" на сертификаты от 10.000 руб. Примените его в корзине
Инструкция по установке:
Покупатель вводит код и нажимает «Активировать». Если сумма товаров ниже заданного порога, скрипт очищает поле, показывает предупреждение и не передаёт промокод обработчику Тильды. Если сумма достигла порога, промокод применяется штатным способом.
Модификация следит за корзиной и после активации. Если покупатель уменьшит количество товаров или удалит товар и сумма станет ниже порога, скидка отменится, итог пересчитается, а поле промокода появится снова.
  1. Добавьте блок ST100 (корзина)
  2. В блок T123 на страницу с корзиной вставьте код ниже. Скрипт сам определит идентификаторы корзины и поля промокода.
  3. Минимальную сумму задайте в переменной MINIMUM: например, 10000 для заказов от 10 000 ₽ или 15000 для заказов от 15 000 ₽.
<!-- Ограничить ввод промокода по сумме заказа https://dabreeze.ru/blog/summ-promocode -->

<script>
(function () {
  var MINIMUM = 10000;

  function init() {
    var cart = document.querySelector('.t706');
    var group = cart && cart.querySelector('.t-input-group_pc[data-input-lid]');
    var record = cart && cart.closest('[id^="rec"]');
    if (!group || !record) return;

    var cartId = record.id.slice(3);
    var promoFieldId = group.getAttribute('data-input-lid');
    var wrapper = group.querySelector('.t-inputpromocode__wrapper');
    if (!wrapper) return;

    var originalField = wrapper.cloneNode(true);
    var resetting = false;
    var scheduled = false;

    function subtotal() {
      var amount = window.tcart && Number(window.tcart.prodamount);
      if (Number.isFinite(amount)) return amount;

      var price = cart.querySelector(
        '.t706__cartpage-prodamount .t706__cartwin-prodamount-price'
      );
      if (!price) return 0;

      amount = Number(
        price.textContent.replace(/[\s\u00a0]/g, '').replace(',', '.')
      );
      return Number.isFinite(amount) ? amount : 0;
    }

    function clearWarning() {
      var warning = group.querySelector('.promo-minimum-warning');
      if (warning) warning.remove();
    }

    function showWarning(message) {
      var warning = group.querySelector('.promo-minimum-warning');

      if (!warning) {
        warning = document.createElement('div');
        warning.className = 'promo-minimum-warning t-descr t-descr_xxs';
        warning.setAttribute('role', 'alert');
        warning.style.cssText = 'margin-top:8px;color:#a52a2a';
        group.querySelector('.t-input-block').appendChild(warning);
      }

      warning.textContent = message;
    }

    function revokeIfBelowMinimum() {
      if (resetting) return;

      if (subtotal() >= MINIMUM) {
        clearWarning();
        return;
      }

      if (!window.tcart) return;

      var field = group.querySelector('.t-inputpromocode__wrapper');
      var promoApplied =
        !!window.tcart.promocode ||
        !!(window.cartCalculator &&
           window.cartCalculator.appliedPromocode) ||
        !!(field && !field.querySelector('.t-inputpromocode'));

      if (!promoApplied) return;

      resetting = true;

      try {
        delete window.tcart.promocode;

        if (window.cartCalculator) {
          window.cartCalculator.appliedPromocode = null;
        }

        tcart__updateTotalProductsinCartObj();
        tcart__reDrawTotal();
        tcart__saveLocalObj();

        if (field && !field.querySelector('.t-inputpromocode')) {
          var restored = originalField.cloneNode(true);
          var input = restored.querySelector('.t-inputpromocode');
          var button = restored.querySelector('.t-inputpromocode__btn');

          if (input) input.value = '';
          if (button) button.style.display = 'none';

          field.replaceWith(restored);
          t_input_promocode_init(cartId, promoFieldId);
        }

        showWarning(
          'Промокод отменён: сумма товаров стала меньше 10 000 ₽.'
        );
      } finally {
        resetting = false;
      }
    }

    cart.addEventListener('click', function (event) {
      var button = event.target.closest('.t-inputpromocode__btn');

      if (button && button.closest('.t-input-group_pc[data-input-lid]') === group) {
        if (subtotal() >= MINIMUM) {
          clearWarning();
          return;
        }

        event.preventDefault();
        event.stopImmediatePropagation();

        var input = group.querySelector('.t-inputpromocode');

        if (input) {
          input.value = '';
          input.dispatchEvent(new Event('input', { bubbles: true }));
        }

        showWarning(
          'Промокод действует при сумме товаров от 10 000 ₽.'
        );
        return;
      }

      if (event.target.closest(
        '.t706__product-minus, .t706__product-plus, .t706__product-del'
      )) {
        setTimeout(revokeIfBelowMinimum, 0);
      }

      if (event.target.closest('.t-submit')) {
        revokeIfBelowMinimum();
      }
    }, true);

    cart.addEventListener('submit', revokeIfBelowMinimum, true);

    cart.addEventListener('input', function (event) {
      if (event.target.matches('.t-inputpromocode')) {
        clearWarning();
      }
    });

    new MutationObserver(function () {
      if (scheduled || resetting) return;

      scheduled = true;

      requestAnimationFrame(function () {
        scheduled = false;
        revokeIfBelowMinimum();
      });
    }).observe(cart, {
      childList: true,
      characterData: true,
      subtree: true
    });

    revokeIfBelowMinimum();
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
  } else {
    init();
  }
})();
</script>
А тут я собрал целую подборку модификаций для каталога товаров на Тильде
Больше кода для Tilda в ТГ-канале
Поблагодари за код - подпишись https://t.me/breeze_tilda