@lexstile

Как спроектировать возврат ДС по заказу на laravel?

Делаю фичу, где при отмене заказа автоматически возвращаются деньги заказчику.
Причин не делать это автоматически - не нашел.

Сейчас логика работы выглядит так:
1. Отменяем заказ, статус переводится в CANCEL.
2. Далее, так как я подписан на изменение статуса, в слушателе я вызываю метод платежной системы на возврат.

Проблема: мне нужно отлавливать ошибку платежной системы и в случае, если ДС не были возвращены, снова менять статус заказа на предыдущий.

Если я это делаю в контроллере, получается грязновато:
public function update(OrderUpdateRequest $request, Project $project, Order $order)
    {
        if (in_array($order->status, [Order::PAID, Order::CLOSE])) {
            if ($request->get('status') === Order::CANCEL && $order->isPaid() && !$order->isReverted() && $order->isNonCashType()) {
                $this->orderService->reverse($order);
            }
        }
        
        $order->fill($request->validated());
        $order->saveOrFail();

        return $this->baseJson(message: ResponseHelper::success(__('orders.messages.update.success')));
    }


Интересует 2 вопроса:
1. Отказаться от автоматического возвращения ДС и делать это по отдельному действию?
2. Если это делать автоматически, каким образом лучше - перед сменой статуса у заказа или после? (в первом случае, если не удастся вернуть деньги, то просто сработает exception и статус уже не поменяется)
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
pLavrenov
@pLavrenov
Разработка сайтов
Почему бы не Использовать эвенты? при изменении модели в событии updating проверяем "грязное" ли поле status (это покажет был ли это запрос на изменение статуса) если грязное то обрабатываем в соответствии с требованиями, если получаем неправильный ответ от обработки - устанавливаем нужный статус или тот который был в чистой модели.

Итог - или отработает так как надо или т̶а̶к̶ ̶к̶а̶к̶ ̶н̶а̶д̶о̶ возврат к нужному статусу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы