Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 55
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestCancelService
0.00% covered (danger)
0.00%
0 / 55
0.00% covered (danger)
0.00%
0 / 4
132
0.00% covered (danger)
0.00%
0 / 1
 cancel
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 1
42
 syncSeniorRequest
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getExistItemNotPending
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 processRequestLog
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Domain\Request\Services;
4
5use Exception;
6
7use Illuminate\Support\Facades\DB;
8
9use App\Events\ServiceProcessed;
10use App\Jobs\Senior\SeniorSyncRequestsJob;
11use App\Models\Request\Request;
12use App\Models\Request\RequestItem;
13use App\Models\User;
14
15use Domain\Request\DTOs\CancelRequestSeniorDTO;
16use Domain\Request\DTOs\RequestLogStoreDTO;
17use Domain\Request\Enums\RequestLogOperationEnum;
18use Domain\Request\Enums\RequestStatusEnum;
19use Domain\Request\Exceptions\RequestItemNotPendingException;
20use Domain\Request\Exceptions\RequestNotPendingException;
21use Domain\Shared\Integrations\Senior\SeniorRequestCancellationExport;
22use Domain\StockIO\Enums\StockStatusEnum;
23
24readonly class RequestCancelService
25{
26    /**
27     * @param Request $request
28     * @param User $user
29     * @return Request
30     * @throws Exception
31     */
32    public function cancel(Request $request, User $user): Request
33    {
34        if (!$request->isPending()) {
35            throw new RequestNotPendingException(
36                __("Cannot cancel the request :request. Request must be pending to cancel",
37                ['request' => $request->getKey()]
38            ));
39        }
40
41        $this->getExistItemNotPending($request);
42
43        $cancellations = $request->requestItems
44            ->map(fn(RequestItem $item) => (new RequestItemCancelService())->seniorCancellationData($item))
45            ->filter()
46            ->values()
47            ->all();
48
49        if ($cancellations !== []) {
50            (new SeniorRequestCancellationExport())->execute(
51                new CancelRequestSeniorDTO(['requisicoes' => $cancellations])
52            );
53        }
54
55        try {
56            DB::beginTransaction();
57
58            $request->setAttribute('status', RequestStatusEnum::CANCELED);
59            $request->save();
60
61            if ($request->stockIO) {
62                $request->stockIO->setAttribute('status', StockStatusEnum::CANCELED);
63                $request->stockIO->save();
64            }
65
66            foreach ($request->requestItems as $item) {
67                (new RequestItemCancelService())->cancel($item, $user, false, false);
68            }
69
70            $this->processRequestLog($request, $user);
71
72            DB::commit();
73        } catch (Exception $exception) {
74            DB::rollBack();
75            throw $exception;
76        }
77
78        $this->syncSeniorRequest($request);
79
80        ServiceProcessed::dispatch(self::class, $user);
81        return $request;
82    }
83
84    private function syncSeniorRequest(Request $request): void
85    {
86        $parameters = $request->stockIo?->integration?->getAttribute('parameters') ?? [];
87        $numEme = $parameters['request_number'] ?? null;
88
89        if (!is_null($numEme)) {
90            dispatch_sync(new SeniorSyncRequestsJob($numEme, $request, false));
91        }
92    }
93
94    /**
95     * @param Request $request
96     * @throws RequestItemNotPendingException
97    */
98    private function getExistItemNotPending(Request $request)
99    {
100        $request->requestItems()->each(function (RequestItem $items) use ($request) {
101            if (!$items->isPending()) {
102                throw new RequestItemNotPendingException(
103                    __("Cannot cancel the request :request. The request has items that are not pending. Item :item, Product :product",
104                    [
105                        'request' => $request->getKey(),
106                        'item'    => $items->getKey(),
107                        'product' => $items->product->getKey()
108                    ]
109                ));
110            }
111        });
112    }
113
114    /**
115     * @param Request $request
116     * @param User $user
117     */
118    private function processRequestLog(
119        Request $request,
120        User $user)
121    {
122        $RequestLogStoreDTO = new RequestLogStoreDTO([
123            'request'     => $request,
124            'stockIO'     => $request->stockIO,
125            'operation'   => RequestLogOperationEnum::CANCELED_REQUEST,
126            'user'        => $user,
127            'detail'      => $request->toJson(),
128            'observation' => "Requisição cancelada: ". $request->getKey(),
129        ]);
130
131        (new RequestLogStoreService())->store($RequestLogStoreDTO, $user);
132    }
133}