50 lines
2.5 KiB
PHP
50 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Equipment;
|
|
use App\Models\User;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
class EquipmentWarehouseRequests
|
|
{
|
|
/** Read-only projection; consumers must not insert rows into the paginator.
|
|
* @return LengthAwarePaginator<int,covariant array<string,mixed>>|null
|
|
*/
|
|
public function page(User $actor, Equipment $equipment): ?LengthAwarePaginator
|
|
{
|
|
$canRead = $actor->hasFunctions(['admin', 'warehouse_request_read', 'warehouse_request_prepare'])
|
|
|| ($actor->hasFunctions(['warehouse_request_review']) && $actor->department_id !== null)
|
|
|| ($actor->hasFunctions(['warehouse_request_deliver']) && $actor->hasFunctions(['warehouse']));
|
|
if (! $canRead || ! Schema::hasTable('warehouse_requests')) {
|
|
return null;
|
|
}
|
|
$query = app(WarehouseWorkdesk::class)->visible($actor);
|
|
if (DB::getDriverName() === 'pgsql') {
|
|
$query->whereRaw("EXISTS (SELECT 1 FROM json_array_elements(warehouse_requests.snapshot->'lines') AS line(value) WHERE line.value->'equipment'->>'id' = ?)", [(string) $equipment->id]);
|
|
} elseif (DB::getDriverName() === 'sqlite') {
|
|
$query->whereRaw("EXISTS (SELECT 1 FROM json_each(json_extract(warehouse_requests.snapshot, '$.lines')) AS line WHERE json_extract(line.value, '$.equipment.id') = ?)", [$equipment->id]);
|
|
} else {
|
|
return null;
|
|
}
|
|
|
|
return $query->oldest('id')->paginate(15, ['id', 'snapshot'], 'requests_page')->withQueryString()->through(function ($record) use ($equipment) {
|
|
$p = app(WarehouseFulfilment::class)->progress($record);
|
|
$lines = [];
|
|
foreach ($record->snapshot['lines'] as $index => $line) {
|
|
if (($line['equipment']['id'] ?? null) !== $equipment->id) {
|
|
continue;
|
|
}
|
|
$lines[] = ['line' => $index + 1, 'item' => $line['item'], 'destination' => $line['destination'],
|
|
'requested_milli' => $line['quantity_milli'], 'reserved_milli' => $p['reserved'][$index],
|
|
'delivered_milli' => $p['delivered'][$index], 'remaining_milli' => $p['remaining'][$index], 'cancelled_milli' => $p['cancelled'][$index]];
|
|
}
|
|
|
|
return ['id' => $record->id, 'state' => $p['state'], 'version' => $p['version'],
|
|
'reservation_ready' => $p['reservation_ready'], 'lines' => $lines];
|
|
});
|
|
}
|
|
}
|