Add dual-screen customer display for the register.
Deploy Ladill POS / deploy (push) Successful in 56s

Token-gated full-screen customer view shows order, payment QR, tips,
signature, receipt, and promo phases while the till keeps operator UI.
This commit is contained in:
isaacclad
2026-07-15 15:35:44 +00:00
parent 5e31bdf629
commit 38b7f96714
10 changed files with 1426 additions and 4 deletions
+24
View File
@@ -10,12 +10,14 @@ use App\Http\Controllers\Pos\KitchenController;
use App\Http\Controllers\Pos\MenuController;
use App\Http\Controllers\Pos\ProductController;
use App\Http\Controllers\Pos\ProController;
use App\Http\Controllers\Pos\CustomerDisplayController;
use App\Http\Controllers\Pos\RegisterController;
use App\Http\Controllers\Pos\SaleController;
use App\Http\Controllers\Pos\SettingsController;
use App\Http\Controllers\Pos\TableController;
use App\Http\Controllers\Pos\TicketController;
use App\Http\Controllers\NotificationController;
use App\Http\Controllers\Public\CustomerDisplayController as PublicCustomerDisplayController;
use App\Http\Controllers\Public\TableOrderController;
use App\Http\Controllers\WalletBalanceController;
use Illuminate\Support\Facades\Route;
@@ -41,6 +43,23 @@ Route::get('/t/{code}', [TableOrderController::class, 'menu'])->name('pos.table.
Route::post('/t/{code}/order', [TableOrderController::class, 'store'])->middleware('throttle:20,1')->name('pos.table.order');
Route::get('/t/{code}/done', [TableOrderController::class, 'confirmed'])->name('pos.table.confirmed');
// Customer-facing dual-screen display (token-gated; no operator chrome).
Route::get('/customer-display/{token}', [PublicCustomerDisplayController::class, 'show'])
->where('token', '[A-Za-z0-9]{32,64}')
->name('pos.customer-display.show');
Route::get('/customer-display/{token}/state', [PublicCustomerDisplayController::class, 'state'])
->middleware('throttle:120,1')
->where('token', '[A-Za-z0-9]{32,64}')
->name('pos.customer-display.state');
Route::get('/customer-display/{token}/stream', [PublicCustomerDisplayController::class, 'stream'])
->middleware('throttle:60,1')
->where('token', '[A-Za-z0-9]{32,64}')
->name('pos.customer-display.stream');
Route::post('/customer-display/{token}/action', [PublicCustomerDisplayController::class, 'action'])
->middleware('throttle:60,1')
->where('token', '[A-Za-z0-9]{32,64}')
->name('pos.customer-display.action');
Route::middleware(['auth', 'platform.session'])->group(function () {
Route::get('/wallet/balance', [WalletBalanceController::class, 'balance'])->name('wallet.balance');
@@ -61,6 +80,11 @@ Route::middleware(['auth', 'platform.session'])->group(function () {
Route::post('/register/charge', [RegisterController::class, 'charge'])->name('pos.register.charge');
Route::post('/register/mode', [RegisterController::class, 'setMode'])->name('pos.mode.set');
Route::get('/register/customer-display', [CustomerDisplayController::class, 'info'])->name('pos.customer-display.info');
Route::post('/register/customer-display/push', [CustomerDisplayController::class, 'push'])->name('pos.customer-display.push');
Route::post('/register/customer-display/rotate', [CustomerDisplayController::class, 'rotate'])->name('pos.customer-display.rotate');
Route::get('/register/customer-display/actions', [CustomerDisplayController::class, 'actions'])->name('pos.customer-display.actions');
Route::get('/sales', [SaleController::class, 'index'])->name('pos.sales.index');
Route::get('/sales/{sale}/receipt', [SaleController::class, 'receipt'])->name('pos.sales.receipt');
Route::get('/sales/{sale}', [SaleController::class, 'show'])->name('pos.sales.show');