Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
71.43% covered (warning)
71.43%
30 / 42
33.33% covered (danger)
33.33%
1 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
StockIODTO
71.43% covered (warning)
71.43%
30 / 42
33.33% covered (danger)
33.33%
1 / 3
10.89
0.00% covered (danger)
0.00%
0 / 1
 __construct
95.00% covered (success)
95.00%
19 / 20
0.00% covered (danger)
0.00%
0 / 1
7
 toArray
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
1
 fromRequest
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Domain\StockIO\DTOs;
4
5use App\Models\Team\Team;
6use App\Models\User;
7use Domain\Integration\DTOs\IntegrationStockInputDevolutionDTO;
8use Domain\Integration\DTOs\IntegrationStockInputDTO;
9use Domain\Integration\DTOs\IntegrationStockInputWarehouseDTO;
10use Domain\Integration\DTOs\IntegrationStockOutputDTO;
11use Domain\Integration\DTOs\IntegrationStockOutputWarehouseDTO;
12use Domain\Shared\Enums\SectorEnum;
13use Domain\Shared\Interfaces\DataTransferObjectInterface;
14use Domain\StockIO\Enums\StockInputReasonEnum;
15use Domain\StockIO\Enums\StockOutputReasonEnum;
16use Domain\StockIO\Enums\StockStatusEnum;
17use Domain\StockIO\Enums\StockTypeEnum;
18use Illuminate\Foundation\Http\FormRequest;
19
20final readonly class StockIODTO implements DataTransferObjectInterface
21{
22    public ?User $responsible;
23    public ?string $detail;
24    public StockStatusEnum $statusEnum;
25    public bool $urgent;
26    public StockTypeEnum $typeEnum;
27    public int $reason;
28    public SectorEnum $sectorEnum;
29    public IntegrationStockOutputDTO|IntegrationStockInputDTO|IntegrationStockInputWarehouseDTO|IntegrationStockOutputWarehouseDTO|IntegrationStockInputDevolutionDTO|null $integrationDTO;
30    public ?Team $team;
31
32    public function __construct(array $args)
33    {
34        $this->statusEnum = StockStatusEnum::tryFrom($args['status']);
35        $this->typeEnum = StockTypeEnum::tryFrom($args['type']);
36        $this->reason = $args['reason'];
37        $this->responsible = $args['responsible'] ?? null;
38        $this->detail = $args['detail'] ?? null;
39        $this->urgent = $args['urgent'] ?? false;
40        $this->sectorEnum = $args['sector'];
41        $this->team = $args['team'] ?? null;
42
43        $DTO = null;
44        if (isset($args['integration'])) {
45            if ($this->typeEnum == StockTypeEnum::INPUT){
46                if ($this->reason == StockInputReasonEnum::INVOICE->value) {
47                    $DTO = new IntegrationStockInputWarehouseDTO($args['integration']);
48                } elseif ($this->reason == StockInputReasonEnum::DEVOLUTION->value) {
49                    $DTO = new IntegrationStockInputDevolutionDTO($args['integration']);
50                } else {
51                    $DTO = new IntegrationStockInputDTO($args['integration']);
52                }
53            } else {
54                $DTO = ($this->reason == StockOutputReasonEnum::REQUEST->value) || ($this->reason == StockOutputReasonEnum::SYNCED_REQUEST->value) ?
55                    new IntegrationStockOutputWarehouseDTO($args['integration']) :
56                    new IntegrationStockOutputDTO($args['integration']);
57            }
58        }
59        $this->integrationDTO = $DTO;
60    }
61
62    public function toArray(): array
63    {
64        return [
65            'responsible_id' => $this->responsible?->getKey(),
66            'detail' => $this->detail,
67            'data' => $this->integrationDTO?->toArray(),
68            'status' => $this->statusEnum->value,
69            'urgent' => $this->urgent,
70            'type' => $this->typeEnum->value,
71            'reason' => $this->reason,
72            'sector' => $this->sectorEnum->value,
73            'team_id' => $this->team?->getKey(),
74        ];
75    }
76
77    public static function fromRequest(FormRequest $request): StockIODTO
78    {
79        return new self([
80            'responsible' => User::find($request->validated('responsible_id')),
81            'detail' => $request->validated('detail'),
82            'data' => $request->validated('data'),
83            'status' => $request->validated('status'),
84            'urgent' => $request->validated('urgent'),
85            'type' => $request->validated('type'),
86            'reason' => $request->validated('reason'),
87            'sector' => SectorEnum::tryFrom($request->validated('sector')),
88            'team' => Team::find($request->validated('team')),
89        ]);
90    }
91}