Files
isaaccladandCursor 0854b431bc
Deploy Ladill Queue / deploy (push) Successful in 2m17s
Add service-point routing so call-next cannot steal assigned tickets.
Counters gain destination/staff metadata; tickets can be pre-assigned to a
service point with assigned_only queues for healthcare while shared_pool
preserves generic bank/government behavior. Display and announcements expose
ticket, staff, and destination clearly for Care and public boards.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 17:21:56 +00:00

97 lines
6.6 KiB
PHP

<?php
use App\Http\Controllers\Api\AnalyticsController;
use App\Http\Controllers\Api\AppointmentController;
use App\Http\Controllers\Api\BranchController;
use App\Http\Controllers\Api\ConsoleApiController;
use App\Http\Controllers\Api\CounterController;
use App\Http\Controllers\Api\DepartmentController;
use App\Http\Controllers\Api\DeviceHeartbeatController;
use App\Http\Controllers\Api\IntegrationController;
use App\Http\Controllers\Api\PublicQueueController;
use App\Http\Controllers\Api\QueueRuleController;
use App\Http\Controllers\Api\ReportController;
use App\Http\Controllers\Api\ServiceEventController;
use App\Http\Controllers\Api\ServiceQueueController;
use App\Http\Controllers\Api\TicketController;
use App\Http\Controllers\Api\WorkflowController;
use Illuminate\Support\Facades\Route;
Route::get('/health', fn () => response()->json(['status' => 'ok', 'app' => 'queue']));
Route::post('/devices/heartbeat', DeviceHeartbeatController::class)->name('api.devices.heartbeat');
Route::post('/service-events', ServiceEventController::class)->name('api.service-events');
Route::prefix('v1/public')->group(function () {
Route::post('/join', [PublicQueueController::class, 'join'])->name('api.public.join');
Route::get('/tickets/{qrToken}', [PublicQueueController::class, 'show'])->name('api.public.ticket');
Route::post('/tickets/{qrToken}/delay', [PublicQueueController::class, 'delay'])->name('api.public.ticket.delay');
Route::post('/tickets/{qrToken}/cancel', [PublicQueueController::class, 'cancel'])->name('api.public.ticket.cancel');
});
Route::middleware(['auth:sanctum', 'qms.setup'])->prefix('v1')->group(function () {
Route::get('/queues', [ServiceQueueController::class, 'index'])->name('api.queues.index');
Route::post('/queues', [ServiceQueueController::class, 'store'])->name('api.queues.store');
Route::patch('/queues/{serviceQueue}', [ServiceQueueController::class, 'update'])->name('api.queues.update');
Route::get('/queues/{serviceQueue}/waiting', [ServiceQueueController::class, 'waiting'])->name('api.queues.waiting');
Route::post('/queues/{serviceQueue}/pause', [ServiceQueueController::class, 'pause'])->name('api.queues.pause');
Route::post('/queues/{serviceQueue}/resume', [ServiceQueueController::class, 'resume'])->name('api.queues.resume');
Route::get('/tickets', [TicketController::class, 'index'])->name('api.tickets.index');
Route::post('/tickets', [TicketController::class, 'store'])->name('api.tickets.store');
Route::get('/tickets/{ticket}', [TicketController::class, 'show'])->name('api.tickets.show');
Route::post('/tickets/{ticket}/action', [TicketController::class, 'action'])->name('api.tickets.action');
Route::post('/queues/{serviceQueue}/call-next', [TicketController::class, 'callNext'])->name('api.queues.call-next');
Route::get('/counters', [CounterController::class, 'index'])->name('api.counters.index');
Route::post('/counters', [CounterController::class, 'store'])->name('api.counters.store');
Route::patch('/counters/{counter}', [CounterController::class, 'update'])->name('api.counters.update');
Route::get('/appointments', [AppointmentController::class, 'index'])->name('api.appointments.index');
Route::post('/appointments', [AppointmentController::class, 'store'])->name('api.appointments.store');
Route::post('/appointments/{appointment}/check-in', [AppointmentController::class, 'checkIn'])->name('api.appointments.check-in');
Route::get('/workflows', [WorkflowController::class, 'index'])->name('api.workflows.index');
Route::get('/workflows/{workflow}', [WorkflowController::class, 'show'])->name('api.workflows.show');
Route::get('/queues/{serviceQueue}/rules', [QueueRuleController::class, 'index'])->name('api.rules.index');
Route::post('/queues/{serviceQueue}/rules', [QueueRuleController::class, 'store'])->name('api.rules.store');
Route::get('/analytics/overview', [AnalyticsController::class, 'overview'])->name('api.analytics.overview');
Route::get('/reports/{type}', [ReportController::class, 'show'])->name('api.reports.show');
Route::get('/branches', [BranchController::class, 'index'])->name('api.branches.index');
Route::post('/branches', [BranchController::class, 'store'])->name('api.branches.store');
});
Route::middleware(['auth.service:qms'])->prefix('v1')->group(function () {
Route::get('/integrations/status', [IntegrationController::class, 'status'])->name('api.integrations.status');
Route::post('/integrations/provision', [IntegrationController::class, 'provision'])->name('api.integrations.provision');
Route::patch('/integrations', [IntegrationController::class, 'update'])->name('api.integrations.update');
});
Route::middleware(['auth.service:qms', 'qms.integration'])->prefix('v1')->group(function () {
Route::get('/branches', [BranchController::class, 'index'])->name('api.service.branches.index');
Route::post('/branches', [BranchController::class, 'store'])->name('api.service.branches.store');
Route::get('/departments', [DepartmentController::class, 'index'])->name('api.service.departments.index');
Route::post('/departments', [DepartmentController::class, 'store'])->name('api.service.departments.store');
Route::get('/queues', [ServiceQueueController::class, 'index'])->name('api.service.queues.index');
Route::post('/queues', [ServiceQueueController::class, 'store'])->name('api.service.queues.store');
Route::patch('/queues/{serviceQueue}', [ServiceQueueController::class, 'update'])->name('api.service.queues.update');
Route::get('/queues/{serviceQueue}/waiting', [ServiceQueueController::class, 'waiting'])->name('api.service.queues.waiting');
Route::post('/queues/{serviceQueue}/call-next', [TicketController::class, 'callNext'])->name('api.service.queues.call-next');
Route::get('/tickets', [TicketController::class, 'index'])->name('api.service.tickets.index');
Route::post('/tickets', [TicketController::class, 'store'])->name('api.service.tickets.store');
Route::post('/tickets/{ticket}/action', [TicketController::class, 'action'])->name('api.service.tickets.action');
Route::get('/counters', [CounterController::class, 'index'])->name('api.service.counters.index');
Route::post('/counters', [CounterController::class, 'store'])->name('api.service.counters.store');
Route::patch('/counters/{counter}', [CounterController::class, 'update'])->name('api.service.counters.update');
Route::get('/counters/{counter}/console', [ConsoleApiController::class, 'show'])->name('api.service.counters.console');
Route::post('/counters/{counter}/console', [ConsoleApiController::class, 'action'])->name('api.service.counters.console.action');
});