Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
45.45% covered (danger)
45.45%
20 / 44
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
PickingOrderStoreService
45.45% covered (danger)
45.45%
20 / 44
0.00% covered (danger)
0.00%
0 / 1
18.39
0.00% covered (danger)
0.00%
0 / 1
 store
45.45% covered (danger)
45.45%
20 / 44
0.00% covered (danger)
0.00%
0 / 1
18.39
1<?php
2
3namespace Domain\PickingOrder\Services;
4
5use App\Models\PickingOrder\PickingOrder;
6use App\Models\StockIO\StockIO;
7use App\Models\User;
8use App\Notifications\ExpoPushNotification;
9use App\Notifications\PickingOrderNotification;
10use Domain\PickingOrder\DTOs\PickingOrderDTO;
11use Domain\StockIO\Exceptions\StockStatusException;
12use Exception;
13use Illuminate\Support\Facades\DB;
14
15readonly class PickingOrderStoreService
16{
17
18    /**
19     * @param PickingOrderDTO $pickingOrderDTO
20     * @param StockIO $stockIO
21     * @param User $user
22     * @return PickingOrder
23     * @throws Exception
24     */
25    public function store(PickingOrderDTO $pickingOrderDTO, StockIO $stockIO, User $user): PickingOrder
26    {
27        if ($stockIO->isCanceled()) {
28            throw new StockStatusException(__('Output is canceled.'));
29        }
30
31        if(!$stockIO->canCreatePickingOrder()){
32            throw new StockStatusException(
33                __('This output is not yet cleared to make separation orders.')
34            );
35        }
36
37        try {
38            DB::beginTransaction();
39
40            $pickingOrder = new PickingOrder();
41            $pickingOrder->stockIO()->associate($stockIO);
42            $pickingOrder->responsible()->associate($pickingOrderDTO->responsible);
43            $pickingOrder->fill($pickingOrderDTO->toArray());
44            $pickingOrder->save();
45
46            if ($pickingOrderDTO->stockIOProducts) {
47                (new PickingOrderProductSyncService())->sync(
48                    $pickingOrderDTO->stockIOProducts,
49                    $pickingOrder,
50                    $user
51                );
52            }
53
54            $pickingOrder->responsible->notify(
55                new PickingOrderNotification($pickingOrder)
56            );
57
58            if(!is_null($pickingOrder->responsible->getAttribute('expo_token'))) {
59                $urgent  = $pickingOrder->urgent;
60                $message = 'New picking order';
61
62                if($urgent) {
63                    $message = 'New URGENT picking order';
64                }
65
66                if ($user->expo_token) {
67                    $pickingOrder->responsible->notify(
68                        new ExpoPushNotification(
69                            __(
70                                'Picking order: :pickingOrder. Billing date: :billing_date',
71                                [
72                                    'pickingOrder' => $pickingOrder->getKey(),
73                                    'billing_date' => $pickingOrder->getPrvFat()
74                                ]
75                            ),
76                            __($message)
77                        )
78                    );
79                }
80            }
81
82            DB::commit();
83        } catch (Exception $exception) {
84            DB::rollBack();
85            throw $exception;
86        }
87
88        return $pickingOrder;
89    }
90}