Files
compras/app/Services/SupplyCoordinationRead.php
T
2026-11-03 11:51:44 +02:00

56 lines
2.3 KiB
PHP

<?php
namespace App\Services;
use App\Models\SupplyRecord;
use App\Models\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
/** Shared read scope for the workdesk and its export; no parallel authority. */
class SupplyCoordinationRead
{
public function kind(User $actor, string $view): string
{
[$kind, $permissions] = match ($view) {
'reservations' => ['reservation', ['supply_read', 'supply_reserve']],
'deliveries' => ['delivery', ['supply_read', 'supply_delivery']],
'alternatives' => ['alternative', ['supply_read', 'supply_technical_prepare', 'supply_technical_review']],
default => abort(404),
};
abort_unless(collect($permissions)->contains(fn ($permission) => app(SupplyPlanning::class)->allows($actor, $permission)), 403);
return $kind;
}
/** @return array<string,mixed> */
public function filters(Request $request, string $kind): array
{
$states = $kind === 'alternative' ? ['draft', 'returned', 'approved', 'suspended'] : ($kind === 'reservation' ? ['active', 'cancelled', 'fulfilled'] : ['active', 'cancelled']);
$filters = $request->validate([
'record_search' => 'nullable|string|max:100',
'record_state' => ['nullable', Rule::in($states)],
]);
return ['record_search' => trim($filters['record_search'] ?? ''), 'record_state' => $filters['record_state'] ?? ''];
}
/** @param array<string,mixed> $filters
* @return Builder<SupplyRecord>
*/
public function query(string $kind, array $filters): Builder
{
$search = $filters['record_search'];
return app(SupplyPlanning::class)->latest($kind)
->when($search !== '', fn ($q) => $q->where(fn ($match) => $match
->whereLike('snapshot->item->code', '%'.$search.'%')
->orWhereLike('snapshot->item->name', '%'.$search.'%')
->orWhereLike('snapshot->warehouse->name', '%'.$search.'%')
->orWhereLike('snapshot->order->number', '%'.$search.'%')
->orWhereLike('data->reference', '%'.$search.'%')))
->when($filters['record_state'] !== '', fn ($q) => $q->where('state', $filters['record_state']));
}
}