56 lines
2.3 KiB
PHP
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']));
|
|
}
|
|
}
|