commit21
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
<?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']));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user