Подсистема присвоения цветовых индикаторов заказам в интернет-магазине
Присваивать заказам при создании цветовые индикаторы по следующей схеме:
- тестовые заказы помечать серым цветом;
- заказы, в истории покупателя которых последний заказ находится в статусе "Возврат" - желтым цветом;
- заказы, в истории покупателя которых последние два и более заказа находятся в статусе "Возврат" - оранжевым цветом;
- заказы, в истории покупателя которых есть заказы в статусе "Украден" - красным цветом. Цветовая индикация не касается заказов, оформленных по предоплате.
Дополнительная сложность заключается в том, что заказы могут оформляться без регистрации пользователей в системе, следовательно, искать заказы от одного и того же покупателя необходимо не по полю user_id.
В папке app/Jobs находится класс SetOrderColor. Этот job запускается при срабатывании события OrderWasCreated.
Он обращается к OrderRepository, который с помощью поискового движка Elasticsearch ищет предыдущие заказы покупателя на основе совпадения по ФИО, email, телефону или адресу. Чтобы заказ попался в эту выборку, необходимо совпадение минимум по двум критериям из этих четырех. Проверка по адресу заключает в себя ряд проверок на точное совпадение почтового индекса и id региона и неточное совпадение названия населенного пункта, улицы, дома и квартиры.
OrderRepository - интерфейс, реализует который класс ESOrderRepository (Инверсия зависимостей).
Окрашиванием заказа занимается класс OrderColormanager из папки App\Services. Здесь применен паттерн Chain of Responsibility. Есть несколько хандлеров, через которые по цепочке проходит заказ. Каждый хандлер может окрасить заказ и прервать работу цепи, либо передать заказ следующему хандлеру в цепи. Если заказ прошел все хандлеры и не окрасился, он остается бесцветным. Хандлеры в цепи расположены по приоритету.