msDiscount 1.1 + MS2.1.11 = Одноразовые скидочные купоны

Наступило лето, народ разъехался по отпускам и продажи в магазинах серьёзно просели. Если, конечно, вы не торгуете кремом для загара и холодным пивом — в этом случае у вас полный порядок.

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

Вы генерируете группы купонов, у которых есть абсолютная или процентная скидка и может быть срок действия. Для отличия одних купонов от других можно использовать уникальные префиксы.

Если дела идут хорошо, и все купоны группы уже разошлись — можно сгенерировать еще, в той же группе. Для этого нужно просто указать больше купонов при редактировании группы и сохранить.

Чтобы не копипастить сотни купонов вручную, предусмотрена выгрузка кодов в формате csv, который открывается всеми нормальными редакторами, включая Excel и LibreOffice.
Выгрузки можно использовать для сбора статистики по активациям и для печати рекламных материалов.

При погашении купона, в него записывается номер заказа miniShop2, для которого он был активирован, и время активации.

Обновление miniShop2


Для работы новой версии msDiscount необходимо обновить стабильную версию MS2. Если вы уже пользуетесь 2.2-beta, то можно внести изменения самостоятельно, или подождать, пока парни их импортируют в свою версию.

Изменений немного, но они очень важные. Во первых, появились новые системные события msOnBeforeGetOrderCost и msOnGetOrderCost. Как нетрудно догадаться, они нужны для изменения цены заказа при запросе msOrderHandler::getCost().

Именно эти события использует msDiscount, чтобы влиять на цену при оформлении заказа на странице корзины.

Вам нужно просто добавить новое поле в чанк оформления заказа tpl.msOrder.outer:
<div class="form-group input-parent">
	<label class="col-sm-4 control-label" for="coupon_code">Скидочный купон</label>
	<div class="col-sm-6">
		<input type="coupon_code" id="coupon_code" placeholder="XXXXX-XXXX-XXXX-XXXX" name="coupon_code" value="[[+coupon_code]]" class="form-control [[+errors.coupon_code]]">
	</div>
</div>
При добавлении кода купона к заказу он проходит проверку и если что не так, то вы получите ошибку, а поле не сохранится. В общем, как обычно у заказов miniShop2.

Текст сообщения можно поменять в словарях системы.

Если с купоном всё в порядке, то изменение цены выглядит так (gif):


Для работы обновления стоимости заказа, при изменении поля с купоном, вам нужно добавить callback функцию:
<script type="text/javascript">
    miniShop2.Callbacks.Order.add.ajax.done = function(res) {
        var res = res.responseJSON;
        if (typeof(res.data['coupon_code']) != 'undefined') {
            miniShop2.Order.getcost();
        };
    };
</script>
Можно прописать её хоть сразу после вызова [[!msOrder]].

Как я уже говорил, при погашении кода, в его свойства записывается номер заказа и отображается в админке. Так вот, этот номер кликабельный, и отсюда следует второе изменение в MS2 — прямые ссылки на заказы в админке.

Теперь при открытии окошка заказа у вас в строке url будет добавляться &order=номерзаказа. При закрытии, этот параметр убирается. А при переходе в панель заказов по url с этим параметром, будет открываться заказ.

Кстати говоря, код купона и скидка также записываются и в поле properties заказа, чтобы можно было потом понять, почему он стоит меньше, чем должен. Это поле не видно в админке, но в БД оно есть.

Вот все изменения в MS2, одним коммитом.

Другие изменения


Понятно дело, все страницы в админке msDiscount переписаны на новый лад. Везде можно пользоваться кнопочками, а кое-где даже выделять сразу несколько строк через Ctrl или Shift.

Но это ерунда, когда скидкам можно назначать категории товаров, а не только сами товары. Более того, выбираются все родители товара до 10 уровня вверх (т.е., не только msCategory), и уже из этих ресурсов выбирается максимальная скидка. Понятное дело, скидки на сами товары тоже никто не отменял.

Возможные варианты скидочной деятельности только что приумножились, поэтому не забывайте проверять алгоритм на специальной вкладке в админке.

Заключение


Несмотря на всю проделанную работу, цена дополнения остаётся прежней — всего 1490 руб. Старые покупатели обновляются бесплатно, как обычно.

Изменений очень много, так что и я жду от вас отзывов по работе дополнения. Если что-то, вдруг, не работает — пишите, не скромничайте, будем исправлять.

Обновлено 17.06.2015


Добавил демонстрацию работы скидок в оформление заказов на minishop2.com. А вот рабочие коды, проверяйте!
MXPRO-Y51T-ADPC-VR36	MXPRO-QL78-9Y57-5B3P	MXPRO-CSB1-KLW6-7X0R	MXPRO-8GF6-TWBL-5EM6
MXPRO-VVA3-T3VQ-RX07	MXPRO-1ICA-A8FF-Y2J5	MXPRO-7XBJ-QKQI-8NRF	MXPRO-F0WE-G2LF-I821
MXPRO-1X7J-GO17-I15F	MXPRO-8QWW-T95J-M2JG	MXPRO-3P20-DSHU-4FS3	MXPRO-4O00-PUFD-Q6XQ
MXPRO-ADSV-VLRO-1KF4	MXPRO-2NOW-S7PN-LGD0	MXPRO-0J4G-GSWG-WF1H	MXPRO-RJWI-T1DM-ES8X
MXPRO-POA0-UDRL-MLRS	MXPRO-4EZQ-KRX1-1KAL	MXPRO-BDXG-WW4C-A42V	MXPRO-8K6L-WO4Q-TT73
Если кончатся — пишите в комментариях, добавлю еще.
Василий Наумкин
16 июня 2015, 19:20
modx.pro
3
2 998
+6
Поблагодарить автора Отправить деньги

Комментарии: 16

Николай
17 июня 2015, 00:23
+1
Обязательно будет куплено в ближайшее время. Купоны я ждал с самого зарождения компонента! Спасибо!
Владимир
17 июня 2015, 07:14
0
Ура!
Ilya Ev
18 июня 2015, 08:37
0
А можно активировать купон до корзины? Т.е. на сайте есть товары с ценами и где-то поле купон, если человек вводит верный купон для него цены на сайте становятся ниже в соответствии со скидкой по купону. Замануха начинает работать еще до того как он в корзину их положил.

    Василий Наумкин
    18 июня 2015, 08:43
    +1
    Неа, это купоны для оформления заказа.
    Если у человека есть купон на скидку — какая еще может быть замануха? Он просто набирает заказ, рассчитывая на неё.

    где-то поле купон, если человек вводит верный купон для него цены на сайте становятся ниже
    Я такого нигде не видел, если честно.
    Виталий Дощенко
    18 июня 2015, 09:53
    +1
    Чтобы замануха начала работать до оформления заказа, некоторые крутые ребята размещают соответствующий баннер с купоном в заметном месте сайта.



    www.jcrew.com
      Василий Наумкин
      18 июня 2015, 10:00
      +1
      Ну, здесь-то промокод. То есть, многоразовый код на скидку — в msDiscount такого пока нет.

      Будут покупки новой версии компонента, добавлю и промокоды.
        Ilya Ev
        18 июня 2015, 10:20
        0
        Понял, подождем)

        А и один момент, чтоб не создавать отдельную тему.

        Просьба вынести подключение скрипта и стиля из msdBuyNow в настройки как у всех компонентов, а то после обновления приходиться опять коментить эти строки в сниппете, так как используются свои стили и скрипты. Спасибо.
        Евгений
        07 сентября 2016, 17:33
        0
        Есть покупки?
        Если промокод многоразовый будет, то еще одна покупка будет…
          Evgeny
          21 ноября 2017, 23:16
          0
          Если кому интересно, я сделал промокод так:
          в плагине msDiscount
          ...
          case 'msOnCreateOrder':
          if ($data = $order->get()) {
          			/**@var msdCoupon $coupon */
          			if (!empty($data['coupon_code']) && $coupon = $modx->getObject('msdCoupon', array('code' => $data['coupon_code']))) {
          				/**@var msOrder $msOrder */
          				
          				$couponcode = $data['coupon_code'];
          			    //Если это не промокод то закрыавем его	
          				if ($couponcode !='япония' && $couponcode !='сентябрь')
          				{
              				$coupon->fromArray(array(
              					'active' => false,
              					'activatedon' => date('Y-m-d H:i:s'),
              					'order_id' => $msOrder->get('id'),
              				));
          				    $coupon->save();
          				}
          ..............
          т.е. проверяю по коду,… и если этой промокод, то просто не закрываю его
Владимир
17 октября 2017, 15:22
0
Подскажите, как сократить количество символов в купоне?
Константин
18 января 2018, 10:51
0
Приветствую, а есть возможность, так скажем, дарить купон при регистрации. Например до того как пользователь зарегистрировался на сайте, показывать ему баннер с определенным промокодом (Дарим промокод на скидку 25% за регистрацию на сайте)
Oleg Pimanov
13 июня 2018, 10:33
0
Добрый день, Илья! Скажите пожалуйста, а это длополнение способно обрабатывать скидку для каждого покупателя в зависимости от того, соклько этот покупатель купил раньше (что-то типа скидка постоянного покупателя). Спасибо за ответ.
Андрей
23 августа 2018, 13:31
0
Добрый день. Скажите, а можно ли при заполнении формы пользователем (например. подписка на рассылку), выдавать ему одноразовый купон?
Svetlana S
10 июня 2019, 10:36
0
Здравствуйте. При вводе купона в корзине не меняется цена, хотя скрипт добавила. Версия минишопа 2.4.18, msDiscount 1.3.10. Судя по файлам, нужные изменения в этой версии минишопа есть, правда, файлы выглядят уже немного иначе) Не нужно ли еще в них что-то добавить?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
16