[msPromoCode] Скидочные промо-коды для miniShop2


  • Полная AJAX обработка применения/удаления купона к заказу.
  • Промо-код можно добавить не только с основной страницы бекенда. На странице товара также есть вкладка "Промо-коды", при добавлении кода из которой текущий товар сразу привяжется к этому промо-коду. Это очень удобно, когда надо добавить купон только для одного товара.
  • Если к купону не привязано ниодного товара или раздела — купон действует на весь магазин.
  • Скидку можно указать, как для купона в целом, так и для товара или раздела, привязанного к купону. При этом, чем индивидуальнее будет указана скидка, тем она первостепеннее будет восприниматься компонентом. К примеру, у нас есть купон со скидкой 20%, есть Раздел 1, привязанный к этому купону, со скидкой 80% и есть товар лежащий в Разделе 1, привязанный к этому купону, со скидкой 40%. Для данного товара скидка будет 40%.
  • При отправке заказа, ровно как и при открытии страницы со сниппетом [[!mspcForm]], компонент проверяет, действителен ли ещё купон. Если нет, то сообщает об этом юзеру, удаляет купон из формы и обновляет цены. Это делает невозможным воспользоваться купоном:
    а) который был отключён,
    б) время действия которого завершилось,
    в) количество которого закончилось.
  • Если заказ был оформлен с промо-кодом, то в бекенде в модальном окне заказа вверху на первой вкладке появится промо-код и сумма скидки.
  • JS на странице вызова сниппета [[!mspcForm]] вызывается в конце страницы для того, чтобы ваши колбеки miniShop2, которые могут пересекаться с используемыми в пакете, были клонированы и успешно выполнены.


Демо-сайт msPromoCode


Пакет можно купить в modstore.pro



Для промо-кода можно указать:

  • Код купона. Также его можно сгенерировать встроенным инструментом, указав нечто вроде регулярки:
    /([a-zA-Z0-9]{4-10})-([A-Z]{4})/
  • Скидку. Как в процентах, так и фиксированную, которая будет применена для каждого товара привязанного к купону.
  • Количество. Это позволит ограничить кол-во оформленных заказов с данным купоном. Необязательно.
  • Дату начала и окончания. Необязательно.
  • Привязать список товаров/разделов, которые будут участвовать в промо-акции. Если не указать — будет действовать на весь магазин.

Вся информация по установке и настройке компонента перенесена в документацию.
Павел Гвоздь
02 января 2016, 04:37
modx.pro
6
7 434
+10
Поблагодарить автора Отправить деньги

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

Владимир
02 января 2016, 10:31
+1
Ай, молодец!
    Павел Гвоздь
    02 января 2016, 15:26
    0
    С удовольствием выслушаю пожелания по улучшению компонента.
      Владимир
      02 января 2016, 16:33
      0
      Дополни его привязанным к купону подарком. Например, оператор какой то товар назначает подарком, который рандомно будет кому то подарен в момент погашения купона (варианты: в течении периода, от цены товара и т.п.)
      Ну, и конечно, к какому купону привязывается подарок- ни кто не знает. ))
        Павел Гвоздь
        02 января 2016, 16:45
        0
        Не совсем понял, если честно. Подробнее бы. :)
          Владимир
          02 января 2016, 17:51
          0
          Да? Распишу. Чуть позже))
        mngatoff
        21 декабря 2017, 00:07
        0
        Привет! не дружит с msoptionsprice2, так как берет дефолтную цену продукта из таблички продукта напрямую. Пришлось лезть в исходники, добавлять выборку по модификациям.
        Мне кажется, имеет смысл создавать доп. сущность в сессии, чтоб туда записывались цены до промокода, и потом восстанавливались оттуда, а не из таблиц бд… ну или не знаю я)
          charset
          11 октября 2019, 14:06
          0
          Добрый день Павел, у меня на сайте при выборе одного из купонов — не перекидывает на оплату. Я писал разработчику модуля оплаты — он сказал это к Вам.

          Причем по одним купонам — все нормально, а по этому ошибка из-за несовпадении сумм.
            Павел Гвоздь
            11 октября 2019, 15:17
            0
            Пишите в ТП на Модстор. Сразу доступы приложите пжл. И всю доп инфу (что за купон, что за компонент оплаты и т.п.).
              charset
              11 октября 2019, 16:13
              0
              пытался, пишет что прошло больше года после покупки, поэтому не дает отправить сообщение в ТП
                Павел Гвоздь
                13 октября 2019, 07:35
                0
                Всё, что я написал выше, скиньте мне на почту.
                  charset
                  16 октября 2019, 22:02
                  0
                  написал в ЛС, почту не нашел.
          Роман Воропаев (Volk)
          02 января 2016, 22:38
          +1
          Отлично! Как раз то, что не хватало именно msdiscount. В идеале бы соединить эти два компонента либо добавить в этот компеонент фунцкционал из мсдискаунт. Отдельный респекст за маску генерирования кода купона. Вопрос такой: можно ли самому будет вписать свой код купона? Если нет, то желательно бы добавить эту возможность. Ждем в магазине этот компонент!
            Павел Гвоздь
            03 января 2016, 00:09
            0
            Конечно можно. Без этого данный функционал не мыслю даже. Можно сгенерить по маске, либо самому вписать любой код. Это можно увидеть в демо-версии на странице корзины.
            А что именно из msDiscount не хватает тут?
              but1head
              03 января 2016, 03:46
              0
              Вписать код в админке, вместо автогенерации)
                Роман Воропаев (Volk)
                03 января 2016, 20:04
                +1
                Не хватает к примеру генерации группы одноразовых купонов (любое количество штук купонов за один клик) которые можно отслеживать какие уже активировали а какие еще нет, ну и их можно скачать файлом для удобства в котором так же экспортируется информация какие активировали а какие еще нет. Так в мсдискаунте, но там как раз не хватает генерации кодов по маске.
                Плюсом неплохо было бы видеть в таблице купонов сколько раз их активировали ( многоразовые купоны) а еще лучше какие пользователи активировали и к какому заказу.
                  Павел Гвоздь
                  03 января 2016, 21:34
                  +1
                  Спасибо, приму на заметку всё вышесказанное.
              Виталий Дощенко
              04 января 2016, 14:46
              +2
              Опубликовал дополнение в Магазине: modstore.pro/packages/ecommerce/mspromocode
              Viacheslav
              27 января 2016, 17:20
              0
              Здравствуйте! Подскажите, пожалуйста, возможно ли добавить за оплату следующий функционал?
              Указание определенных условий для конкретного многоразового промокода:
              — количество товаров в заказе;
              — стоимость заказа;

              Пример: Скидка 400 грн при заказе двух товаров на общую сумму от 1500 грн.
              Артём Зернов
              22 сентября 2016, 10:12
              +1
              Если в поле ввода промокода убрать [[+coupon:notempty=`disabled`]], то каждый раз, обновляя страницу корзины можно вводить этот же промокод и каждый раз скидка будет применяться к текущей сумме (то есть можно так себе сделать гораздо бОльшую скидку).

              Павел, протестируй, пожалуйста, этот момент, так как это дает потенциальную дыру для «особо умных» покупателей :)
                Павел Гвоздь
                22 сентября 2016, 15:47
                0
                Спасибо за баг-репорт! Проблема устранена, обновляйтесь на версию 1.2.5!
                Артём Зернов
                22 сентября 2016, 10:33
                +1
                В методе setCurrentCoupon надо бы добавить строчки после первого if:

                elseif($_SESSION['mspc']['coupon'] == $code){
                            $this->mspc->setError($this->modx->lexicon('mspromocode_err_code_applied'), true);
                            return false;
                        }
                А то получается, даже если купон уже был применен, то мы можем его повторно применять неограниченное количество раз.

                Ну и в словарь добавить фразу «Этот купон уже был применен»
                  Павел Гвоздь
                  22 сентября 2016, 15:48
                  +1
                  Реализовал немного по-иному, т.к. в твоём коде есть возможность применить купон с другим кодом и всё прокатит.
                    Артём Зернов
                    22 сентября 2016, 15:51
                    +1
                    Тоже верно, мое решение — 5-минутное. Я когда написал, тоже подумал о том, что можно ввести другой промокод :)
                    Оперативненько сработал :)
                  Rostislav
                  25 октября 2016, 15:33
                  0
                  Подскажите, если ли возможность при помощи компонента реализовать промо-ссылки?
                    Павел Гвоздь
                    25 октября 2016, 16:02
                    0
                    Опишите задачу подробнее, пожалуйста.
                      Rostislav
                      25 октября 2016, 16:05
                      0
                      Имеется магазин. Мы раздаем партнерам ссылки типа «shop.ru/promo.html?code=partner», при этом автоматически применяется скидка по этому коду и происходит редирект в каталог товаров.
                        Павел Гвоздь
                        25 октября 2016, 16:08
                        0
                        А условие применения промо-кода для конкретного юзера не нужно? Если нет, то с помощью данного компонента + плагина/сниппета, выполняющего применение промо-кода и редирект — задача решаема.
                          Rostislav
                          25 октября 2016, 17:37
                          0
                          Скидка (10%) применяется ко всем товарам без условий. Если есть возможность, напишите как
                            Павел Гвоздь
                            25 октября 2016, 18:47
                            0
                            Если есть возможность, напишите как
                            Для этого необходимо знать PHP. Надо подключить класс компонента в код и использовать метод применения промо-кода. Перед применением, желательно проверить на наличие и активность данного промо-кода.
                            Единственное, цены на товары вне корзины будут такими же, как и без промо-кода, а в корзине цена будет со скидкой.
                    Алексей
                    06 января 2017, 10:45
                    0
                    Можно ли в письме покупателю, при оформлении заказа, указывать размер скидки и используемый промо-код?
                      Павел Гвоздь
                      06 января 2017, 12:21
                      0
                        Алексей
                        07 января 2017, 13:39
                        0
                        Замечательно! еще вопрос — как работает опция «В данной акции реферальные промо-коды» — нет ли какой-либо документации по данному пункту?
                          Павел Гвоздь
                          07 января 2017, 16:07
                          0
                          Документация разбросана по сообществу. Каюсь, моя вина. Я обязательно найду в себе силы переписать документацию для каждого своего дополнения, тем более, что у меня есть 2 хороших пакета, которые просто так пролёживают, вместо того, чтобы служить людям.
                            Николаевич
                            16 января 2017, 19:44
                            +1
                            Подскажите, пожалуйста, как можно программно создавать промокоды?
                              Павел Гвоздь
                              16 января 2017, 22:28
                              +3
                              Из Console как-то так:
                              $response = $modx->runProcessor('coupon/create', array(
                                  'code' => 'lala',
                                  'discount' => '20%',
                                  'active' => 1,
                              ), array('processors_path' => MODX_CORE_PATH . 'components/mspromocode/processors/mgr/'));
                              print_r($response->getObject());
                      php.run
                      16 января 2017, 23:03
                      0
                      Уважаемый разработчик,

                      Пожалуйста, разъясните ситуацию: есть купон, но в качестве скидки указана абсолютная величина.
                      Как сделать так чтобы скидка применялась к общей сумме, а не к каждому продукту?
                        php.run
                        16 января 2017, 23:27
                        0
                        Нашел ответ в ChangeLog
                          Павел Гвоздь
                          17 января 2017, 00:40
                          0
                          Такие вопросы лучше задавать в поддержку дополнения в modstore.
                          Дмитрий
                          28 мая 2017, 15:29
                          0
                          Подскажите, пожалуйста, как я могу кнопочку с галочкой(крестиком) изменить?
                          Спасибо!
                            Павел Гвоздь
                            28 мая 2017, 22:13
                            0
                            Лексиконы: mspromocode_btn_apply, mspromocode_btn_remove.
                              Дмитрий
                              28 мая 2017, 22:53
                              0
                              Прошу прощения! А для новичка можно подробнее.
                              Спасибо.
                                Дмитрий
                                28 мая 2017, 23:29
                                0
                                Разобрался! Большое спасибо!
                              Евгений Webinmd
                              26 октября 2017, 11:35
                              0
                              Вопрос, есть ли возможность использовать один и тот же код купона, но с разными данными и датами?
                              Пример:
                              Купон 1 — дата с 10 по 15 число — скидка 20%
                              Купон 1 — дата с 15 по 20 число — скидка 15 %

                                Павел Гвоздь
                                27 октября 2017, 10:29
                                0
                                Нет. Только вручную поправить после окончания первой акции.
                                Алексей Шумаев
                                10 ноября 2017, 12:56
                                0
                                Демо-сайт не работает (
                                  Павел Гвоздь
                                  10 ноября 2017, 12:59
                                  0
                                    Алексей Шумаев
                                    10 ноября 2017, 13:04
                                    0
                                    На любое действие response возвращает array() соответственно не очень удобно пробовать )
                                    Нужно догадаться перезагружать страницу корзины, ну и товар добавился или нет — не видно.
                                Евгений Webinmd
                                14 ноября 2017, 17:18
                                0
                                еще вопросик, можно ли из плагина устанавливать новое значение скидки и чтобы оно пересчитывалось?
                                Например на событие mspcOnSetProductDiscount или какое-то другое получать значение скидки, переопределять его и чтобы это всё работало :)
                                parabellum
                                04 декабря 2017, 18:12
                                0
                                Так как разработчик написал, что готов выслушать пожелания по компоненту, то хочу сообщить что не хватает очень важной функции просмотра, сколько же раз был использован каждый промокод. Благодаря этому можно понять что сработало, а что нет.
                                И второй момент — условия для использования купонов супер, но не хватает условия на товарную категорию.
                                Если выбран товар из одной категории, то скидка будет на доп товар из другой категории.

                                В остальном все супер. Спасибо за компонент.
                                  Владислав
                                  20 декабря 2017, 17:29
                                  0
                                  Подскажите, а как вывести поле для промокода на странице товара?
                                  [[!mspcForm]]
                                  выводится, только если промокод был применен для корзины с этим товаром…
                                    Павел Гвоздь
                                    20 декабря 2017, 19:58
                                    0
                                    Никак.
                                      Прохор
                                      29 марта 2018, 17:37
                                      0
                                      Добрый день Павел!
                                      Возможно ли связать Ваш компонент с PayAndSee от Володи?
                                      Смысл таков что есть подписка на скрытые ресурсы и нужно при покупке подписки по промокоду давать скидку.
                                  Владимир Тельнов
                                  30 июня 2018, 12:56
                                  0
                                  Добрый день.
                                  Подскажите, как создать купон так, что бы его могли применить только незарегистрированные пользователи или пользователи состоящие в группе Users?
                                    Павел Гвоздь
                                    30 июня 2018, 13:41
                                    0
                                    Создаёте такой плагин:
                                    switch ($modx->event->name) {
                                        case 'mspcOnBeforeSetCoupon':
                                            // Если это не купон "all", дальше не проверяем
                                            if ($coupon['code'] != 'all') {
                                                break;
                                            }
                                            
                                            // Если в группе Users, то применим купон
                                            if (is_object($modx->user) && $modx->user->isMember('Users')) {
                                                break;
                                            }
                                            
                                            // Выдаём ошибку применения купона
                                            $modx->event->output('Не применю купон "' . $coupon['code'] . '"!');
                                            break;
                                    }
                                    Дальше можете под себя его кастомизировать…
                                    Андрей
                                    20 сентября 2018, 09:29
                                    0
                                    Добрый день, есть ли возможность что бы купон действовал на все товары, кроме тех что уже со скидкой (например у товара указана старая цена)? Имеется ввиду купон в корзине, на заказ.
                                      Павел Гвоздь
                                      20 сентября 2018, 10:00
                                      0
                                      У купона есть настройка
                                        Андрей
                                        20 сентября 2018, 10:03
                                        0
                                        Отлично, спасибо, а то перед покупкой не ясно было)
                                      Валерий
                                      18 октября 2018, 10:27
                                      0
                                      Добрый день, Павел!

                                      Возник такой вопрос, есть ли в планах и техническая возможность добавить купоны, которые будут работать конкретные часы? Как я понимаю — это можно добавить в раздел «Условия» для промокода… Не подскажите, где эти условия обрабатываются в файлах?

                                      Спасибо :)
                                        Павел Гвоздь
                                        18 октября 2018, 18:38
                                        0
                                        Что значит «конкретны часы»?
                                          Валерий
                                          18 октября 2018, 18:41
                                          0
                                          Павел, я имею в виду, промокоды, которые работают только с 10:00 до 12:00, либо с 00:00 по 06:00 каждый день и т.п.
                                          «Счастливые часы», «Обед в шоколаднице» и т.п ситуации :)
                                            Павел Гвоздь
                                            18 октября 2018, 18:47
                                            0
                                            Ну а откуда брать время? Сервера? Если так, то что делать с юзерами, у которых +-5 часов разницы? А если брать время JSом с компа юзера, то что делать с хитрыми юзерами, которые поменяют часовой пояс на компе?
                                              Валерий
                                              18 октября 2018, 18:55
                                              0
                                              Ну, в данном случае это же не обязательная функция купона, каждый магазин сам будет решать — хочет он такое или нет :) Другое дело, если эта возможность требует полностью пересмотреть логику компонента, то тогда она может не стоить того.

                                              А по вопросам:
                                              Время можно брать с сервера (конкретно у нас оно верное, встречал сервера с кривыми настройками). Просто можно дать магазину возможность выбирать часовой пояс и ориентироваться исключительно на него.
                                                Павел Гвоздь
                                                18 октября 2018, 18:58
                                                0
                                                Вы можете самостоятельно написать для себя плагин с любой логикой проверки. Вот инструкция с примером.
                                                  Валерий
                                                  18 октября 2018, 19:10
                                                  +1
                                                  О, на эту статью еще не натыкался, сейчас сидел с другими.
                                                  Спасибо, буду так решать :)
                                        Роман
                                        07 ноября 2018, 22:16
                                        0
                                        Павел, можно будет как то вывести в списке товаров, у самого товара его данные:

                                        — промо-код
                                        — размер скидки
                                        — время когда заканчивается его действие



                                        Так же интересует, тоже самое, но уже в карточке товара.
                                          Павел Гвоздь
                                          08 ноября 2018, 06:50
                                          0
                                          Вы все сообщения будете писать на мыло, а через минуту дублировать сюда?
                                          Андрей
                                          14 апреля 2019, 11:37
                                          0
                                          Павел, добрый день! Можно ли настроить однократное использование промокода? Например, чтобы промокод для новых клиентов сгорал после одного использования?
                                            Павел Гвоздь
                                            14 апреля 2019, 11:41
                                            0
                                            Да. У промо-кода есть настройка «Кол-во». Только не пойму, что за «для новых клиентов»?
                                              Андрей
                                              14 апреля 2019, 11:52
                                              0
                                              Уточню вопрос. На главной странице сайта хотим повесить промокод для новых клиентов. Идея в том, чтобы вы получили скидку на первый заказ. Затем промокод перестаёт действовать. Можно ли это настроить в вашем компоненте или обращаться к разработчику, чтобы он другим образом настроил «уничтожение» промо-кода? Прошу прощения, если коряво формулирую, я не разработчик.
                                                Павел Гвоздь
                                                14 апреля 2019, 11:54
                                                0
                                                «Один промокод = одно применение» — можно.
                                                «Один промокод = одно применение для конкретного юзера» — кастом.
                                            Валерий
                                            16 июня 2019, 10:37
                                            0
                                            Модуль не плохой, но столкнулись с проблемой, во 1х хотелось бы генерировать промокоды со своим названием казалось бы мелочью, но это очень важно если имеем крупный интернет магазин и работа идет с большой аудиторией. Во 2х столкнулись с проблемой когда стали работать с крупным корпоративным клиентом. Проблема следующая, хотелось бы сделать возможность использовать 1-промокод но несколько раз подряд, в компании работает больше 400 человек, и не совсем удобно генерировать 400 промокодов, понятное дело, что если промокод один его могут использовать «за пределами компании» Но все же это было бы удобно
                                            Денис
                                            20 июня 2019, 11:50
                                            0
                                            Приветствую!
                                            Условия акции: при покупке товара1 и товара2 скидка по промокоду на сумму заказа, равная цене товара2.
                                            Такую акцию можно реализовать с помощью данного компонента?
                                            Если да — беру!
                                              Павел Гвоздь
                                              20 июня 2019, 11:54
                                              0
                                              Из коробки — нет.
                                                Денис
                                                20 июня 2019, 11:57
                                                0
                                                Подскажите, есть ли компоненты, где из коробки будет реализован данный тип акций?
                                                Или везде надо дописывать под себя?
                                            Евгений
                                            20 марта 2023, 15:15
                                            0
                                            Добрый день, компонент в корзине работает, но что делать если корзина вызывается с любой страницы по ajax в модальное окно бутсрапа, в такм случае скрипты не отрабатывают. подскажите как сделать по фэншую, чтобы скрипты отрабатывали.
                                              Антон
                                              26 мая 2023, 14:54
                                              0
                                              Написано, что компонент работает на php выше 5.6, но на 8 он не работает. Из-за вот этой строчки в основном классе:
                                              $return .= $symbs{rand(0, $maxpos)};
                                              Это 1087 строка.
                                                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                86