Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
90.00% covered (success)
90.00%
27 / 30
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
StockIoProductInputInvoiceResource
90.00% covered (success)
90.00%
27 / 30
50.00% covered (danger)
50.00%
1 / 2
4.02
0.00% covered (danger)
0.00%
0 / 1
 toArray
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
1
 amountToStore
82.35% covered (warning)
82.35%
14 / 17
0.00% covered (danger)
0.00%
0 / 1
3.05
1<?php
2
3namespace Domain\StockIO\Resources;
4
5use App\Models\Item\Item;
6use Illuminate\Http\Request;
7use Illuminate\Http\Resources\Json\JsonResource;
8
9use Domain\Integration\Resources\IntegrationResource;
10use Domain\PickingOrder\Resources\PickedItemSimpleResource;
11use Domain\Product\Resources\ProductSimpleResource;
12
13/**
14 * @property int $id
15 * @property int $responsible_id
16 */
17class StockIoProductInputInvoiceResource extends JsonResource
18{
19    public function toArray(Request $request): array
20    {
21        return [
22            'id'              => $this->id,
23            'amount'          => $this->amount,
24            'amount_to_store' => $this->amountToStore(),
25            'picked'          => $this->picked,
26            'skipped'         => $this->skipped,
27            'status'          => $this->status,
28            'created_at'      => $this->created_at->toISOString(),
29            'updated_at'      => $this->updated_at->toISOString(),
30            'integration'     => IntegrationResource::make($this->whenLoaded('integration')),
31            'product'         => ProductSimpleResource::make($this->whenLoaded('product')),
32            'picked_items'    => PickedItemSimpleResource::collection($this->whenLoaded('pickedItems')),
33        ];
34    }
35
36    private function amountToStore(): float
37    {
38        $pickedItems = $this->relationLoaded('pickedItems')
39            ? $this->pickedItems
40            : $this->pickedItems()
41                ->whereNull('picking_order_product_id')
42                ->get(['amount', 'item_id']);
43
44        $pickedAmount = (float) $pickedItems->sum('amount');
45        $itemIds = $pickedItems
46            ->pluck('item_id')
47            ->filter()
48            ->unique()
49            ->values();
50
51        $itemAmount = $itemIds->isEmpty()
52            ? 0
53            : (float) Item::query()
54                ->whereIn('id', $itemIds)
55                ->sum('amount');
56
57        return round(max(0, (float) $this->amount - $pickedAmount) + $itemAmount, 2);
58    }
59}