Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
78.95% covered (warning)
78.95%
15 / 19
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
TransferTaskStoreService
78.95% covered (warning)
78.95%
15 / 19
0.00% covered (danger)
0.00%
0 / 1
4.15
0.00% covered (danger)
0.00%
0 / 1
 store
78.95% covered (warning)
78.95%
15 / 19
0.00% covered (danger)
0.00%
0 / 1
4.15
1<?php
2
3namespace Domain\TransferTask\Services;
4
5use App\Events\ServiceProcessed;
6use App\Models\TransferTask\TransferTask;
7use App\Models\User;
8use Domain\TransferTask\DTOs\TransferTaskDTO;
9use Domain\TransferTask\DTOs\TransferTaskProductDTO;
10use Domain\TransferTask\Enums\TransferTaskStatusEnum;
11use Domain\TransferTask\Exceptions\TransferTaskException;
12use Domain\TransferTask\Exceptions\TransferTaskStatusException;
13use Illuminate\Support\Facades\DB;
14use Throwable;
15
16readonly class TransferTaskStoreService
17{
18
19    /**
20     * @param TransferTaskDTO $taskDTO
21     * @param User $user
22     * @return TransferTask
23     * @throws Throwable
24     */
25    public function store(TransferTaskDTO $taskDTO, User $user): TransferTask
26    {
27        if ($taskDTO->responsible && $taskDTO->responsible->teams()->where('teams.id', $taskDTO->team->id)->doesntExist()) {
28            throw new TransferTaskException(__('The responsible does not belong to the team'));
29        }
30
31        try {
32            DB::beginTransaction();
33
34            $transferTask = new TransferTask();
35            $transferTask->fill($taskDTO->toArray());
36            $transferTask->setAttribute('status', TransferTaskStatusEnum::PENDING);
37            $transferTask->responsible()->associate($taskDTO->responsible);
38            $transferTask->team()->associate($taskDTO->team);
39            $transferTask->creator()->associate($user);
40            $transferTask->save();
41
42            $taskDTO->products->each(function (TransferTaskProductDTO $transferTaskProductDTO) use ($transferTask, $user) {
43                (new TransferTaskProductStoreService())->store($transferTaskProductDTO, $transferTask, $user);
44            });
45
46            DB::commit();
47        } catch (Throwable $throwable) {
48            DB::rollBack();
49            throw $throwable;
50        }
51
52        ServiceProcessed::dispatch(self::class, $user);
53        return $transferTask;
54    }
55}