Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
72.34% covered (warning)
72.34%
34 / 47
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
PickingOrderResource
72.34% covered (warning)
72.34%
34 / 47
0.00% covered (danger)
0.00%
0 / 2
3.19
0.00% covered (danger)
0.00%
0 / 1
 toArray
97.14% covered (success)
97.14%
34 / 35
0.00% covered (danger)
0.00%
0 / 1
2
 getStockIOReason
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Domain\PickingOrder\Resources;
4
5use App\Models\StockIO\StockIO;
6use App\Models\User;
7
8use Domain\PickingOrder\Enums\PickingOrderTypeEnumV2;
9use Domain\PickingOrder\Services\PickingOrderCalculateTotalExecutionTimeService;
10use Domain\PickingOrder\Services\PickingOrderCalculateTotalHeightService;
11use Domain\PickingOrder\Services\PickingOrderCalculateTotalSeparatedHeightService;
12use Domain\Shared\Enums\SectorEnum;
13use Domain\ShippingPackaging\Resources\ShippingPackagingPickingOrderResource;
14use Domain\StockIO\Resources\StockIOByReasonResource;
15use Domain\StockIO\Resources\StockOIResource;
16use Domain\User\Resources\UserResource;
17
18use Illuminate\Http\Request;
19use Illuminate\Http\Resources\Json\JsonResource;
20use Illuminate\Support\Carbon;
21use Illuminate\Support\Collection;
22use Illuminate\Support\Facades\Auth;
23use Illuminate\Support\Facades\DB;
24
25/**
26 * @property bool $status
27 * @property Carbon $created_at
28 * @property ?Carbon $start_date
29 * @property ?Carbon $end_date
30 * @property int $id
31 * @property PickingOrderTypeEnumV2 $type
32 */
33class PickingOrderResource extends JsonResource
34{
35    public function toArray(Request $request): array
36    {
37        /** @var User $user */
38        $user = Auth::user();
39
40        $totalExecutionTime = $this->whenLoaded(
41            'pauses',
42            fn() => (new PickingOrderCalculateTotalExecutionTimeService())->calculate($this->resource, $user, $request)
43        );
44
45        $totalWeight = $this->whenLoaded(
46            'pauses',
47            fn() => (new PickingOrderCalculateTotalHeightService())->calculate($this->resource, $user)
48        );
49
50        $totalWeightSeparated = $this->whenLoaded(
51            'pauses',
52            fn() => (new PickingOrderCalculateTotalSeparatedHeightService())->calculate($this->resource, $user)
53        );
54
55        return [
56            'id' => $this->id,
57            'status' => $this->status,
58            'total_execution_time' => $totalExecutionTime,
59            'total_weight' => $totalWeight,
60            'total_weight_separated' => $totalWeightSeparated,
61            'created_at' => (string)$this->created_at,
62            'start_date' => (string)$this->start_date,
63            'end_date' => (string)$this->end_date,
64            'urgent' => $this->urgent,
65            'observation' => $this->observation,
66            'type' => $this->type->value,
67            'picking_order_product' => PickingOrderProductResource::collection($this->whenLoaded('pickingOrderProduct')),
68            'shipping_packaging' => ShippingPackagingPickingOrderResource::make($this->whenLoaded('shippingPackaging')),
69            'responsible' => UserResource::make($this->whenLoaded('responsible')),
70            'products' => OrderProductsResource::collection($this->whenLoaded('stockIOProducts')),
71            'stock_io' => Auth::user()->currentSector() === SectorEnum::WAREHOUSE ?
72                StockIOByReasonResource::collection($this->getStockIOReason()) :
73                StockOIResource::make($this->whenLoaded('stockIO')),
74            'pauses' => PickingOrderPauseResource::collection($this->whenLoaded('pauses')),
75            'all_products_picked' => $this->allProductsPicked()
76        ];
77    }
78
79    private function getStockIOReason(): Collection
80    {
81        $query = DB::query()
82            ->select('stock_ios.id', 'stock_ios.type', 'stock_ios.reason', 'integrations.parameters')
83            ->from('picking_order_products')
84            ->join('stock_io_products', 'stock_io_products.id', '=', 'picking_order_products.stock_io_product_id')
85            ->join('stock_ios', 'stock_ios.id', '=', 'stock_io_products.stock_io_id')
86            ->join('integrations', function ($join) {
87                $join->on('integrable_id', '=', 'stock_ios.id')
88                    ->where('integrable_type', StockIO::class);
89            })
90            ->where('picking_order_products.picking_order_id', $this->resource->getKey())
91            ->get();
92
93        return $query;
94    }
95}