Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
75.00% covered (warning)
75.00%
21 / 28
33.33% covered (danger)
33.33%
1 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
PickingOrderStartService
75.00% covered (warning)
75.00%
21 / 28
33.33% covered (danger)
33.33%
1 / 3
9.00
0.00% covered (danger)
0.00%
0 / 1
 start
68.75% covered (warning)
68.75%
11 / 16
0.00% covered (danger)
0.00%
0 / 1
4.49
 resumeCurrentPause
71.43% covered (warning)
71.43%
5 / 7
0.00% covered (danger)
0.00%
0 / 1
2.09
 resumeShippingPackaging
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace Domain\PickingOrder\Services;
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;
15
16use Domain\PickingOrder\DTOs\PickingOrderStartDTO;
17use Domain\PickingOrder\Exception\PickingOrderStartedException;
18use Domain\PickingOrder\Exception\PickingOrderCanceledException;
19use Domain\ShippingPackaging\Enums\ShippingPackagingStatusEnum;
20use Domain\StockIO\Services\StockIOStartService;
21
22
23readonly class PickingOrderStartService
24{
25    /**
26     * @param PickingOrderStartDTO $pickingOrderStartDTO
27     * @param PickingOrder $pickingOrder
28     * @param User $user
29     * @return void
30     * @throws Throwable
31     */
32    public function start(PickingOrderStartDTO $pickingOrderStartDTO, PickingOrder $pickingOrder, User $user): void
33    {
34        if ($pickingOrder->isStarted()) {
35            throw new PickingOrderStartedException(__('Picking order already started.'));
36        }
37
38        if ($pickingOrder->isCanceled()) {
39            throw new PickingOrderCanceledException(__('Picking order is canceled.'));
40        }
41
42        try {
43            DB::beginTransaction();
44            $this->resumeCurrentPause($pickingOrder);
45            $pickingOrder->shippingPackaging()->associate($pickingOrderStartDTO->shippingPackaging);
46            $pickingOrder->start();
47            $pickingOrder->touch();
48            $this->resumeShippingPackaging($pickingOrder);
49
50            (new StockIOStartService())->start($pickingOrder->stockIO, $user);
51            DB::commit();
52        } catch (Throwable $throwable) {
53            DB::rollBack();
54            throw  $throwable;
55        }
56
57        ServiceProcessed::dispatch(self::class, $user);
58    }
59
60    /**
61     * @param PickingOrder $pickingOrder
62     * @return void
63     */
64    public function resumeCurrentPause(PickingOrder $pickingOrder): void
65    {
66        /** @var PickingOrderPause $pause */
67        $pause = $pickingOrder->pauses()
68            ->whereNotNull('start_date')
69            ->whereNull('end_date')
70            ->first();
71
72        if ($pause) {
73            $pause->setAttribute('end_date', Carbon::now());
74            $pause->save();
75        }
76    }
77
78    /**
79     * @param PickingOrder $pickingOrder
80     * @return void
81     */
82    private function resumeShippingPackaging(PickingOrder $pickingOrder)
83    {
84        $shippingPackaging = ShippingPackaging::where('status', '<>', ShippingPackagingStatusEnum::CONCLUDED)
85            ->where('id', $pickingOrder->shippingPackaging->getKey())->first();
86
87        if($shippingPackaging){
88            $shippingPackaging->setAttribute('status', ShippingPackagingStatusEnum::STARTED);
89            $shippingPackaging->save();
90        }
91    }
92}