Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestItemCancelService
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 3
156
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
72
 seniorCancellationData
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
12
 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\RequestItem;
12use App\Models\User;
13use Domain\Request\DTOs\CancelRequestSeniorDTO;
14use Domain\Request\DTOs\RequestLogStoreDTO;
15use Domain\Request\Enums\RequestItemStatusEnum;
16use Domain\Request\Enums\RequestLogOperationEnum;
17use Domain\Request\Exceptions\RequestItemNotPendingException;
18use Domain\Shared\Integrations\Senior\SeniorRequestCancellationExport;
19use Domain\StockIO\Enums\StockProductStatusEnum;
20
21readonly class RequestItemCancelService
22{
23    /**
24     * @param RequestItem $requestItem
25     * @param User $user
26     * @param bool $processStatus
27     * @return RequestItem
28     * @throws \Throwable
29     */
30    public function cancel(
31        RequestItem $requestItem,
32        User $user,
33        bool $processStatus = true,
34        bool $syncSenior = true
35    ): RequestItem
36    {
37        if (!$requestItem->isPending()) {
38            throw new RequestItemNotPendingException(
39                __("Cannot cancel the item request :request, item :item, product :product. The item must be pending.",
40                [
41                    'request' => $requestItem->request->getKey(),
42                    'item'    => $requestItem->getKey(),
43                    'product' => $requestItem->product->getKey()
44                ]
45            ));
46        }
47
48        $cancellation = $this->seniorCancellationData($requestItem);
49
50        if (!is_null($cancellation)) {
51            (new SeniorRequestCancellationExport())->execute(
52                new CancelRequestSeniorDTO(['requisicoes' => [$cancellation]])
53            );
54        }
55
56        try {
57            DB::beginTransaction();
58
59            $requestItem->setAttribute('status', RequestItemStatusEnum::CANCELED);
60            $requestItem->save();
61
62            if (!is_null($requestItem->stockIoProduct)) {
63                $requestItem->stockIoProduct->setAttribute('status', StockProductStatusEnum::CANCELED);
64                $requestItem->stockIoProduct->save();
65            }
66
67            if ($processStatus) {
68                (new ProcessStatusRequestService())->process($requestItem->request, $user);
69            }
70
71            $this->processRequestLog($requestItem, $user);
72
73            DB::commit();
74        } catch (Exception $exception) {
75            DB::rollBack();
76            throw $exception;
77        }
78
79        if ($syncSenior && !is_null($cancellation)) {
80            dispatch_sync(new SeniorSyncRequestsJob($cancellation['numEme'], $requestItem->request, false));
81        }
82
83        ServiceProcessed::dispatch(self::class, $user);
84        return $requestItem;
85    }
86
87    public function seniorCancellationData(RequestItem $requestItem): ?array
88    {
89        if (is_null($requestItem->stockIoProduct) || is_null($requestItem->request->stockIo?->integration)) {
90            return null;
91        }
92
93        $stockIOProductParameters = $requestItem->stockIoProduct->integration->getAttribute('parameters');
94        $requestNumber = $requestItem->request->stockIo->integration->getAttribute('parameters')['request_number'];
95
96        return [
97            'codEmp' => 1,
98            'numEme' => (int) $requestNumber,
99            'seqEme' => $stockIOProductParameters['request_sequence'],
100        ];
101    }
102
103    /**
104     * @param RequestItem $requestItem
105     * @param User $user
106     */
107    private function processRequestLog(
108        RequestItem $requestItem,
109        User $user): void
110    {
111        $RequestLogStoreDTO = new RequestLogStoreDTO([
112            'request'     => $requestItem->request,
113            'stockIO'     => $requestItem->request->stockIO,
114            'operation'   => RequestLogOperationEnum::CANCELED_REQUEST_ITEM,
115            'user'        => $user,
116            'detail'      => $requestItem->toJson(),
117            'observation' => "Item da requisição cancelado: ". $requestItem->getKey(),
118        ]);
119
120        (new RequestLogStoreService())->store($RequestLogStoreDTO, $user);
121    }
122}