Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
PickingOrderSummaryService
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 2
12
0.00% covered (danger)
0.00%
0 / 1
 getInfos
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
6
 calculateItems
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Domain\PickingOrder\Services;
4
5use App\Models\Item\Item;
6use App\Models\PickingOrder\PickingOrder;
7use App\Models\StockIO\StockIO;
8use Domain\PickingOrder\DTOs\PickingOrderSummaryDTO;
9use Illuminate\Database\Eloquent\Collection;
10use Illuminate\Database\Eloquent\Relations\BelongsTo;
11
12class PickingOrderSummaryService
13{
14    public function getInfos(PickingOrderSummaryDTO $orderSummaryDTO): array
15    {
16        $builder = PickingOrder::query()
17            ->where('created_at', '>=', $orderSummaryDTO->start_date)
18            ->where('created_at', '<=', $orderSummaryDTO->end_date)
19            ->with(['stockIO' => fn(BelongsTo $query) => $query->withCount('items'), 'stockIO.items', 'stockIO.items.product']);
20
21        if ($orderSummaryDTO->productIntegrationCode) {
22            $builder->whereHas('stockIOProducts', function ($query) use ($orderSummaryDTO) {
23                $query->whereHas('product', function ($query) use ($orderSummaryDTO) {
24                    $query->where('integration_code', $orderSummaryDTO->productIntegrationCode);
25                });
26            });
27        }
28
29        $pickingOrders = $builder->get();
30        list($totalGrossWeight, $itemsCount) = $this->calculateItems($pickingOrders);
31
32        return [
33            'picking_order_count' => $pickingOrders->count(),
34            'items_count' => $itemsCount,
35            'total_gross_weight' => $totalGrossWeight
36        ];
37    }
38
39    /**
40     * @param Collection $pickingOrders
41     * @return int[]
42     */
43    private function calculateItems(Collection $pickingOrders): array
44    {
45        $totalGrossWeight = 0;
46        $itemsCount = 0;
47
48        $outputs = StockIO::query()->whereIn('id', $pickingOrders->pluck('stock_io_id')->unique()->toArray());
49        $outputs->each(function (StockIO $outputs) use (&$totalGrossWeight, &$itemsCount) {
50            $itemsCount += $outputs->items->sum(fn(Item $item) => $item->getAttribute('amount'));
51            $totalGrossWeight += $outputs->items->sum(fn(Item $item) => $item->product->measure->getAttribute('gross_weight') * $item->getAttribute('amount'));
52        });
53
54        return array($totalGrossWeight, $itemsCount);
55    }
56}