Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
PickingOrderConcludeService
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 3
72
0.00% covered (danger)
0.00%
0 / 1
 conclude
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
42
 verifyProductIsDelivery
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 verifyAllPickingProductIsDelivery
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Domain\PickingOrder\Services\V2;
4
5use App\Models\User;
6use Carbon\Carbon;
7
8use App\Models\PickingOrder\PickingOrder;
9use App\Models\Request\RequestDelivery;
10use App\Models\StockIO\StockIOProduct;
11use Domain\PickingOrder\Enums\PickingOrderStatusEnum;
12use Domain\PickingOrder\Exception\PickingOrderCanceledException;
13use Domain\StockIO\Services\StockIOProductConcludeService;
14use Domain\StockIO\Services\V2\StockOutputConcludeService;
15
16readonly class PickingOrderConcludeService
17{
18    public function conclude(PickingOrder $pickingOrder, User $user): void
19    {
20        if ($pickingOrder->isCanceled()) {
21            throw new PickingOrderCanceledException(__('Picking order is canceled.'));
22        }
23
24        if ($pickingOrder->isPaused()) {
25            (new PickingOrderStartService())->resumeCurrentPause($pickingOrder);
26        }
27
28        foreach ($pickingOrder->pickingOrderProduct as $pickingOrderProduct) {
29            if ($this->verifyProductIsDelivery($pickingOrderProduct->stockIOProduct)) {
30                $pickingOrderProduct->setAttribute('status', PickingOrderStatusEnum::CONCLUDED->value);
31                $pickingOrderProduct->save();
32
33                (new StockIOProductConcludeService())->conclude($pickingOrderProduct->stockIOProduct, $user);
34            }
35        }
36
37        if ($this->verifyAllPickingProductIsDelivery($pickingOrder)) {
38            $pickingOrder->setAttribute('status', PickingOrderStatusEnum::CONCLUDED->value);
39            $pickingOrder->setAttribute('end_date', Carbon::now());
40            $pickingOrder->save();
41
42            (new StockOutputConcludeService)->conclude($pickingOrder);
43        }
44    }
45
46    /**
47     * @param StockIOProduct $stockIOProduct
48     * @return bool
49     */
50    private function verifyProductIsDelivery(StockIOProduct $stockIOProduct): bool
51    {
52        $deliveredAmount = RequestDelivery::query()
53            ->where('stock_io_product_id', $stockIOProduct->getKey())
54            ->sum('amount');
55
56        return (float) $stockIOProduct->amount === (float) $deliveredAmount;
57    }
58
59    /**
60     * @param PickingOrder $pickingOrder
61     * @return bool
62     */
63    private function verifyAllPickingProductIsDelivery(PickingOrder $pickingOrder): bool
64    {
65        return $pickingOrder->pickingOrderProduct->count() == $pickingOrder->pickingOrderProduct
66            ->where('status', PickingOrderStatusEnum::CONCLUDED)
67            ->count();
68    }
69}