Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
97.37% covered (success)
97.37%
37 / 38
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ProcessStatusRequestService
97.37% covered (success)
97.37%
37 / 38
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 1
 process
97.37% covered (success)
97.37%
37 / 38
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace Domain\Request\Services;
4
5use App\Events\ServiceProcessed;
6use App\Models\Request\Request;
7use App\Models\User;
8
9use Domain\Request\Enums\RequestItemStatusEnum;
10use Domain\Request\Enums\RequestStatusEnum;
11
12readonly class ProcessStatusRequestService
13{
14    /**
15     * @param Request $request
16     * @param User $user
17     * @return Request
18     */
19    public function process(Request $request, User $user): Request
20    {
21        if ($request->status === RequestStatusEnum::CANCELED) {
22            return $request;
23        }
24
25        $statusCounts = $request->requestItems()
26            ->selectRaw('status, COUNT(*) as total')
27            ->groupBy('status')
28            ->pluck('total', 'status');
29
30        $get = fn($status) => $statusCounts[$status] ?? 0;
31
32        $countAll = $statusCounts
33            ->reject(function ($_, $status) {
34                return in_array($status, [
35                    RequestItemStatusEnum::CANCELED->value,
36                ]);
37            })
38            ->sum();
39
40        $delivered        = $get(RequestItemStatusEnum::DELIVERED->value);
41        $deliveredParcial = $get(RequestItemStatusEnum::DELIVERED_PARCIAL->value);
42        $separated        = $get(RequestItemStatusEnum::SEPARATED->value);
43        $separatedParcial = $get(RequestItemStatusEnum::SEPARATED_PARCIAL->value);
44        $returned         = $get(RequestItemStatusEnum::RETURNED->value);
45        $returnedParcial  = $get(RequestItemStatusEnum::RETURNED_PARCIAL->value);
46
47        $status = RequestStatusEnum::PENDING;
48
49        if ($delivered > 0 || $deliveredParcial > 0) {
50            $status = ($delivered === $countAll)
51                ? RequestStatusEnum::DELIVERED
52                : RequestStatusEnum::DELIVERED_PARTIAL;
53        } elseif ($separated > 0 || $separatedParcial > 0) {
54            $status = ($separated === $countAll)
55                ? RequestStatusEnum::SEPARATED
56                : RequestStatusEnum::SEPARATED_PARTIAL;
57        } elseif ($returned > 0 || $returnedParcial > 0) {
58            $status = ($returned === $countAll)
59                ? RequestStatusEnum::RETURNED
60                : RequestStatusEnum::RETURNED_PARTIAL;
61        }
62
63        if ($status) {
64            $request->setAttribute('status', $status);
65            $request->save();
66        }
67
68        ServiceProcessed::dispatch(self::class, $user);
69        return $request;
70    }
71}