['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 */ 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 $filters * @return Builder */ 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'])); } }