Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 46
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
PickingOrderStartService
0.00% covered (danger)
0.00%
0 / 46
0.00% covered (danger)
0.00%
0 / 4
272
0.00% covered (danger)
0.00%
0 / 1
 start
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
110
 resumeCurrentPause
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 resumeShippingPackaging
0.00% covered (danger)
0.00%
0 / 5
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
6
1<?php
2
3namespace Domain\PickingOrder\Services\V2;
4
5use Throwable;
6
7use Illuminate\Support\Facades\DB;
8use Carbon\Carbon;
9
10use App\Models\User;
11use App\Events\ServiceProcessed;
12use App\Models\PickingOrder\PickingOrder;
13use App\Models\PickingOrder\PickingOrderPause;
14use App\Models\ShippingPackaging\ShippingPackaging;
15use App\Models\StockIO\StockIO;
16use Domain\PickingOrder\DTOs\PickingOrderStartDTO;
17use Domain\PickingOrder\Exception\PickingOrderStartedException;
18use Domain\PickingOrder\Exception\PickingOrderCanceledException;
19use Domain\Request\DTOs\RequestLogStoreDTO;
20use Domain\Request\Enums\RequestLogOperationEnum;
21use Domain\Request\Services\RequestLogStoreService;
22use Domain\ShippingPackaging\Enums\ShippingPackagingStatusEnum;
23use Domain\StockIO\Services\StockIOStartService;
24
25
26readonly class PickingOrderStartService
27{
28    /**
29     * @param PickingOrderStartDTO $pickingOrderStartDTO
30     * @param PickingOrder $pickingOrder
31     * @param User $user
32     * @return void
33     * @throws Throwable
34     */
35    public function start(PickingOrderStartDTO $pickingOrderStartDTO, PickingOrder $pickingOrder, User $user): void
36    {
37        if ($pickingOrder->isStarted()) {
38            throw new PickingOrderStartedException(__('Picking order already started.'));
39        }
40
41        if ($pickingOrder->isCanceled()) {
42            throw new PickingOrderCanceledException(__('Picking order is canceled.'));
43        }
44
45        try {
46            DB::beginTransaction();
47            $this->resumeCurrentPause($pickingOrder);
48
49            if (!is_null($pickingOrderStartDTO->shippingPackaging)){
50                $pickingOrder->shippingPackaging()->associate($pickingOrderStartDTO->shippingPackaging);
51                $this->resumeShippingPackaging($pickingOrder);
52            }
53
54            $pickingOrder->start();
55            $pickingOrder->touch();
56
57            if ($pickingOrder->stockIO) {
58                (new StockIOStartService())->start($pickingOrder->stockIO, $user);
59
60                if ($pickingOrder->stockIO->isOutput() && $pickingOrder->stockIO->isRequest()) {
61                    $this->processRequestLog($pickingOrder->stockIO, $pickingOrder, $user);
62                }
63            } else {
64                $pickingOrder->stockIOProducts()->each(function ($stockIOProduct) use ($user, $pickingOrder){
65                    (new StockIOStartService())->start($stockIOProduct->stockIO, $user);
66
67                    if ($stockIOProduct->stockIO->isOutput() && $stockIOProduct->stockIO->isRequest()) {
68                        $this->processRequestLog($stockIOProduct->stockIO, $pickingOrder, $user);
69                    }
70                });
71            }
72            DB::commit();
73        } catch (Throwable $throwable) {
74            DB::rollBack();
75            throw  $throwable;
76        }
77
78        ServiceProcessed::dispatch(self::class, $user);
79    }
80
81    /**
82     * @param PickingOrder $pickingOrder
83     * @return void
84     */
85    public function resumeCurrentPause(PickingOrder $pickingOrder): void
86    {
87        /** @var PickingOrderPause $pause */
88        $pause = $pickingOrder->pauses()
89            ->whereNotNull('start_date')
90            ->whereNull('end_date')
91            ->first();
92
93        if ($pause) {
94            $pause->setAttribute('end_date', Carbon::now());
95            $pause->save();
96        }
97    }
98
99    /**
100     * @param PickingOrder $pickingOrder
101     * @return void
102     */
103    private function resumeShippingPackaging(PickingOrder $pickingOrder)
104    {
105        $shippingPackaging = ShippingPackaging::where('status', '<>', ShippingPackagingStatusEnum::CONCLUDED)
106            ->where('id', $pickingOrder->shippingPackaging->getKey())->first();
107
108        if($shippingPackaging){
109            $shippingPackaging->setAttribute('status', ShippingPackagingStatusEnum::STARTED);
110            $shippingPackaging->save();
111        }
112    }
113
114    /**
115     * @param StockIO $stockIO
116     * @param PickingOrder $pickingOrder
117     * @param User $user
118     */
119    private function processRequestLog(
120        StockIO $stockIO,
121        PickingOrder $pickingOrder,
122        User $user)
123    {
124        $RequestLogStoreDTO = new RequestLogStoreDTO([
125            'request'     => $stockIO->request ? $stockIO->request : null,
126            'stockIO'     => $stockIO,
127            'operation'   => RequestLogOperationEnum::PICKING_ORDER_STARTED,
128            'user'        => $user,
129            'detail'      => $pickingOrder->toJson(),
130            'observation' => "Tarefa de separação iniciada: ". $pickingOrder->getKey(),
131        ]);
132
133        (new RequestLogStoreService())->store($RequestLogStoreDTO, $user);
134    }
135}