Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
53.57% covered (warning)
53.57%
15 / 28
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
PickingOrderPauseService
53.57% covered (warning)
53.57%
15 / 28
0.00% covered (danger)
0.00%
0 / 2
23.11
0.00% covered (danger)
0.00%
0 / 1
 pause
70.00% covered (warning)
70.00%
14 / 20
0.00% covered (danger)
0.00%
0 / 1
9.73
 pauseShippingPackaging
12.50% covered (danger)
12.50%
1 / 8
0.00% covered (danger)
0.00%
0 / 1
9.03
1<?php
2
3namespace Domain\PickingOrder\Services;
4
5use Throwable;
6
7use Illuminate\Support\Facades\DB;
8use Carbon\Carbon;
9
10use App\Events\ServiceProcessed;
11use App\Models\PickingOrder\PickingOrder;
12use App\Models\PickingOrder\PickingOrderPause;
13use App\Models\ShippingPackaging\ShippingPackaging;
14use App\Models\User;
15
16use Domain\PickingOrder\DTOs\PickingOrderPauseDTO;
17use Domain\PickingOrder\Enums\PickingOrderStatusEnum;
18use Domain\ShippingPackaging\Enums\ShippingPackagingStatusEnum;
19use Domain\PickingOrder\Exception\PickingOrderPausedException;
20use Domain\PickingOrder\Exception\PickingOrderStartedException;
21use Domain\PickingOrder\Exception\PickingOrderCanceledException;
22
23readonly class PickingOrderPauseService
24{
25    /**
26     * @param PickingOrderPauseDTO $pickingOrderPauseDTO
27     * @param PickingOrder $pickingOrder
28     * @param User $user
29     * @return void
30     * @throws Throwable
31     */
32    public function pause(PickingOrderPauseDTO $pickingOrderPauseDTO, PickingOrder $pickingOrder, User $user): void
33    {
34        if ($pickingOrder->isPaused()) {
35            throw new PickingOrderPausedException(__('Picking order already paused.'));
36        }
37
38        if (!$pickingOrder->isStarted() && !$pickingOrder->isSeparatedPartial() && !$pickingOrder->isSeparated()) {
39            throw new PickingOrderStartedException(__('Picking order not yet initiated.'));
40        }
41
42        if ($pickingOrder->isCanceled()) {
43            throw new PickingOrderCanceledException(__('Picking order is canceled.'));
44        }
45
46        try {
47            DB::beginTransaction();
48
49            $pause = new PickingOrderPause();
50            $pause->fill($pickingOrderPauseDTO->toArray());
51            $pause->setAttribute('start_date', Carbon::now());
52            $pickingOrder->pauses()->save($pause);
53
54            $pickingOrder->setAttribute('status', PickingOrderStatusEnum::PAUSED);
55            if ($pickingOrder->isDirty('status')) {
56                $pickingOrder->save();
57            }
58
59            DB::commit();
60        } catch (Throwable $throwable) {
61            DB::rollBack();
62            throw $throwable;
63        }
64
65        $this->pauseShippingPackaging($pickingOrder);
66
67        ServiceProcessed::dispatch(self::class, $user);
68    }
69
70    /**
71     * @param PickingOrder $pickingOrder
72     * @return void
73     */
74    private function pauseShippingPackaging(PickingOrder $pickingOrder)
75    {
76        if ($pickingOrder->shippingPackaging) {
77            $shippingPackaging = ShippingPackaging::whereDoesntHave('pickingOrders', function ($query) use ($pickingOrder) {
78                $query->where('status', 2)
79                ->where('id', '<>', $pickingOrder->getKey());
80            })->where('id', $pickingOrder->shippingPackaging->getKey())->first();
81
82            if($shippingPackaging){
83                $shippingPackaging->setAttribute('status', ShippingPackagingStatusEnum::PAUSED);
84                $shippingPackaging->save();
85            }
86        }
87    }
88}