Подсистема начисления бонусов к заказам для интернет-магазина
Необходимо создать систему, которая будет начислять бонусы на переданный заказ, основываясь на его итоговой сумме. Бонусы могут начисляться в любой заказ, либо в заказ, достигший определенной суммы, либо за каждую определенную сумму в заказе (например, 1 бонус за каждую 1000 р в заказе). Бонусы должны хранится в БД и редактироваться из панели администратора.
Начислением бонусов занимается класс BonusesManager из папки App\Service. Для каждого типа бонуса (в каждый заказ - EveryOrder, за каждую сумму - EveryPrice и при достижении определенной суммы - ReachedPrice) определен хандлер, имеющий метод check для проверки, подходит ли заказ под условие этого типа бонусов, и метод calculateQuantity для посчета количества начисляемых на заказ бонусов. Все три хандлера забиндены в контейнер.
BonusManager получает из репозитория коллекцию всех доступных бонусов, по очереди для каждого получает хандлер, основываясь на типе конкретного бонуса, через метод getHandler (паттерн Фабричный метод), проверяет заказ через метод check хандлера, и если необходимо начисляет на заказ бонусы в количестве, получаемом из метода calcualteQuantity хандлера.
При такой системе обрабатывающий код не будет меняться при добавлении новых типов бонусов. Суммы и начисляемые количества бонусов, при этом хранятся в БД и доступны для редактирования.