feat: complete reservation lifecycle
This commit is contained in:
@@ -3,23 +3,36 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Domain\Inventory\Models\SnipeAsset;
|
||||
use App\Domain\Reservations\Services\AvailabilityService;
|
||||
use Carbon\CarbonImmutable;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class AssetController extends Controller
|
||||
{
|
||||
public function index(Request $request): Response
|
||||
public function index(Request $request, AvailabilityService $availability): Response
|
||||
{
|
||||
$filters = $request->validate([
|
||||
'search' => ['nullable', 'string', 'max:100'],
|
||||
'category' => ['nullable', 'string', 'max:100'],
|
||||
'location' => ['nullable', 'string', 'max:100'],
|
||||
'starts_at' => ['nullable', 'date', 'required_with:ends_at', 'after:now'],
|
||||
'ends_at' => ['nullable', 'date', 'required_with:starts_at', 'after:starts_at'],
|
||||
]);
|
||||
|
||||
$assets = SnipeAsset::query()
|
||||
->where('active', true)
|
||||
->where('requestable', true)
|
||||
$periodSelected = isset($filters['starts_at'], $filters['ends_at']);
|
||||
$query = $periodSelected
|
||||
? $availability->availableAssets(
|
||||
CarbonImmutable::parse($filters['starts_at']),
|
||||
CarbonImmutable::parse($filters['ends_at']),
|
||||
)
|
||||
: SnipeAsset::query()
|
||||
->where('active', true)
|
||||
->where('requestable', true)
|
||||
->whereNull('assigned_id');
|
||||
|
||||
$assets = $query
|
||||
->when($filters['search'] ?? null, function ($query, string $search) {
|
||||
$query->where(function ($query) use ($search) {
|
||||
$query->where('name', 'like', "%{$search}%")
|
||||
@@ -36,8 +49,9 @@ class AssetController extends Controller
|
||||
return Inertia::render('assets/index', [
|
||||
'assets' => $assets,
|
||||
'filters' => $filters,
|
||||
'categories' => SnipeAsset::query()->where('active', true)->whereNotNull('category_name')->distinct()->orderBy('category_name')->pluck('category_name'),
|
||||
'locations' => SnipeAsset::query()->where('active', true)->whereNotNull('location_name')->distinct()->orderBy('location_name')->pluck('location_name'),
|
||||
'periodSelected' => $periodSelected,
|
||||
'categories' => SnipeAsset::query()->where('active', true)->where('requestable', true)->whereNotNull('category_name')->distinct()->orderBy('category_name')->pluck('category_name'),
|
||||
'locations' => SnipeAsset::query()->where('active', true)->where('requestable', true)->whereNotNull('location_name')->distinct()->orderBy('location_name')->pluck('location_name'),
|
||||
'lastSyncedAt' => SnipeAsset::max('synced_at'),
|
||||
]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user