Функция подписки на заказ в интернет-магазине

Функция подписки на заказ в интернет-магазине

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

Постановка задачи

При оформлении заказа — пользователь должен иметь возможность подписаться на свой заказ, а так же, должен иметь возможность указать длительность подписки и частоту автоматического формирования заказа и иметь возможность управлять этими параметрами после создания заказа

Проектирование

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

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

Реализация

Публичная часть подписки при оформлении заказа

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

Чтоб не мешать свойства заказа, предназначенные для подписки на заказ, с другими свойствами заказа — была создана новая группа свойств «Подписка на заказ». Затем в неё добавили 2 свойства типа «Список»: «Оформить подписку на заказ?» и «Длительность подписки».

Значения свойств:

  • Оформить подписку на заказ?
    • Нет
    • Каждую неделю
    • Раз в 2 недели
  • Длительность подписки
    • 1 месяц
    • 2 месяца

Так же в эту группу было добавлено ещё одно служебное строковое свойство «Количество скопированных заказов». Это свойство пользователь не видит, но оно очень важное. Оно хранит информацию о том, сколько было сделано копий первого заказа, на который подписался пользователь. Ведь должен наступить момент, когда нужно прекратить копировать заказ, потому что подписка ограничена по времени. В определении такого момента и служат эти три свойства вместе взятые. О логике в программном коде будет описано ниже.

Итак, у нас есть нужные свойства для вывода интерфейса подписки в публичную часть. Всё вместе это может выглядеть так:

Публичная часть подписки в Личном кабинете

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

А при детальном просмотре такого заказа пользователь имеет возможность обновить ранее указанные им параметры:

Административная часть — настройки

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

Помимо дней формирования и выдачи заказов, администратор так же имеет возможность настроить скидки на заказы, которые формируются по подписке. Администратор может отдельно настроить какая скидка будет на заказ, сформированный по подписке на 1 месяц, а также, отдельно скидку на подписку на 2 месяца:

Под капотом

Теперь перейдем к программному коду, который заставит все это работать вместе. Так как наш функционал завязан на временных интервалах — нам не обойтись без технологии Агентов в 1С-Битрикс.

Агент будет запускать функцию в день формирования заказов, из настроек, показанных выше. Функция выбирает заказы за последние 2 месяца (так как это максимальная длина подписки на заказы) с установленным свойством «Оформить подписку на заказ?» не равное «Нет». Выборкой за такой период мы точно уверены, что мы проверим все заказы, которые возможно нужно скопировать по подписке, не боясь ничего потерять.

Выбранные заказы обрабатываются по такой логике:

  • Для каждого заказа получаются 3 свойства заказа из группы «Подписка на заказ»
  • Если частота подписки равна 1 разу в неделю — проверить значение свойства Длительность подписки.
    • Если длительность подписки равна 1 месяц — значит заказ на протяжении периода подписки может быть скопирован 4 раза (4 недели по одному разу в неделю).
    • Если длительность подписки равна 2 месяца — значит заказ на протяжении периода подписки может быть скопирован 8 раз.
    • Тут вступает в игру свойство «Количество скопированных заказов». Проверяем если заказ скопирован меньше 4 или 8 раз в зависимости от условий выше — значит копируем заказ и добавляем в значение свойства «Количество скопированных заказов» +1.
  • Если частота подписки равна 1 разу в 2 недели — проверить значение свойства Длительность подписки.
    • Если длительность подписки равна 1 месяц — значит заказ на протяжении периода подписки может быть скопирован 2 раза (4 недели по одному разу в 2 недели).
    • Если длительность подписки равна 2 месяца — значит заказ на протяжении периода подписки может быть скопирован 4 раз.
    • Проверить можно ли копировать заказ и если да — то делаем это.
  • Обновляем агент, который запустит эту функцию в следующий раз

Для удобства и красоты — весь этот функционал собран в виде PHP-класса. Он имеет такие методы:

  1. Статический метод, который запускается на агенте и выполняет выборку и обработку заказов
  2. Метод, который выполняет копирование заказа на основе переданного ему ID «заказа-родителя»
  3. Вспомогательный метод для метода в п.2, для получения свойств корзины (нужен для копирования заказа)
  4. Метод для обновления и установки агента на запуск метода из п.1 в следующий раз

Заключение

В рамках этой интересной задачи был спроектирован и реализован довольно нестандартный и редкий функционал — подписка пользователем на заказ.

Цель данного поста — поделиться знаниями и своим вариантом решения данной задачи. Будем надеяться, что пост будет полезен тем разработчикам, которые столкнулись с подобными задачами!

Комментарии

Тут без вас никак. Поделитесь с нами вашими мыслями

Горячие вакансии