Faster voice announcements, Care/Frontdesk API, and console UI polish.
Deploy Ladill Queue / deploy (push) Successful in 28s

Poll displays every 1.2s with client-side TTS ack; expose service API for sibling apps; redesign tickets, counters, and staff console.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-29 21:51:13 +00:00
co-authored by Cursor
parent 051372672b
commit bc6bf0a07c
22 changed files with 813 additions and 140 deletions
+21
View File
@@ -3,8 +3,10 @@
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\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;
@@ -58,3 +60,22 @@ Route::middleware(['auth:sanctum', 'qms.setup'])->prefix('v1')->group(function (
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('/queues', [ServiceQueueController::class, 'index'])->name('api.service.queues.index');
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/{ticket}/action', [TicketController::class, 'action'])->name('api.service.tickets.action');
Route::get('/counters', [CounterController::class, 'index'])->name('api.service.counters.index');
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');
});
+1
View File
@@ -46,6 +46,7 @@ Route::get('/signed-out', fn () => auth()->check() ? redirect()->route('qms.dash
// Public: digital display
Route::get('/display/{token}', [DisplayPublicController::class, 'show'])->name('qms.display.public');
Route::get('/display/{token}/data', [DisplayPublicController::class, 'data'])->name('qms.display.data');
Route::post('/display/{token}/announcements/{announcement}/played', [DisplayPublicController::class, 'played'])->name('qms.display.announcement.played');
// Public: mobile queue
Route::get('/join', [MobileQueueController::class, 'joinForm'])->name('qms.mobile.join');