Files
ladill-queue/config/qms.php
T
isaaccladandCursor d2f5ff11d2
Deploy Ladill Queue / deploy (push) Successful in 40s
Fix queue handoff so tickets keep their number across services.
Handoff now frees the counter, ends the service session, and requeues
the same ticket for the next department — critical for hospital flows
like doctor → lab.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 21:22:01 +00:00

257 lines
8.9 KiB
PHP

<?php
return [
'roles' => [
'super_admin' => 'Super Administrator',
'org_admin' => 'Organization Administrator',
'branch_manager' => 'Branch Manager',
'receptionist' => 'Receptionist',
'queue_operator' => 'Queue Operator',
'counter_staff' => 'Counter Staff',
'department_manager' => 'Department Manager',
'security' => 'Security',
'supervisor' => 'Supervisor',
],
'department_types' => [
'general' => 'General',
'reception' => 'Reception',
'customer_service' => 'Customer Service',
'cashier' => 'Cashier',
'consultation' => 'Consultation',
'laboratory' => 'Laboratory',
'pharmacy' => 'Pharmacy',
'verification' => 'Document Verification',
'payments' => 'Payments',
'collections' => 'Collections',
'technical_support' => 'Technical Support',
],
'queue_strategies' => [
'fifo' => 'First In, First Out',
'priority' => 'Priority Queue',
'vip' => 'VIP Queue',
'appointment' => 'Appointment Queue',
'emergency' => 'Emergency Queue',
'department' => 'Department Queue',
'skill' => 'Skill-based Routing',
'dynamic' => 'Dynamic Routing',
'overflow' => 'Overflow Routing',
],
'ticket_priorities' => [
'emergency' => 'Emergency',
'vip' => 'VIP',
'elderly' => 'Elderly',
'disabled' => 'Disabled',
'appointment' => 'Appointment',
'walk_in' => 'Walk-in',
],
'ticket_statuses' => [
'waiting' => 'Waiting',
'called' => 'Called',
'serving' => 'Serving',
'on_hold' => 'On Hold',
'completed' => 'Completed',
'no_show' => 'No Show',
'cancelled' => 'Cancelled',
'transferred' => 'Transferred',
],
'ticket_sources' => [
'kiosk' => 'Kiosk',
'reception' => 'Reception Desk',
'mobile' => 'Mobile App',
'web' => 'Website',
'api' => 'API',
'appointment' => 'Appointment Check-in',
'tablet' => 'Self-service Tablet',
],
'counter_statuses' => [
'available' => 'Available',
'busy' => 'Busy',
'offline' => 'Offline',
'paused' => 'Paused',
],
'appointment_modes' => [
'appointment_only' => 'Appointment Only',
'walk_in_only' => 'Walk-in Only',
'hybrid' => 'Hybrid',
],
'device_types' => [
'kiosk' => 'Touchscreen Kiosk',
'tablet' => 'Tablet',
'printer' => 'Ticket Printer',
'scanner' => 'Barcode/QR Scanner',
'display' => 'Counter Display',
'feedback_tablet' => 'Feedback Tablet',
],
'display_layouts' => [
'standard' => 'Standard',
'compact' => 'Compact',
'split' => 'Split Screen',
'media' => 'Media + Queue',
],
'announcement_templates' => [
'en' => 'Ticket :ticket, please proceed to :counter.',
'fr' => 'Ticket :ticket, veuillez vous rendre au :counter.',
'tw' => 'Ticket :ticket, mesrɛ kɔ :counter.',
],
'industry_templates' => [
'healthcare' => 'Healthcare',
'banking' => 'Banking',
'government' => 'Government Office',
'visitor' => 'Visitor Management',
'university' => 'University',
'retail' => 'Retail',
'telecom' => 'Telecom Service Centre',
'custom' => 'Custom',
],
'audit_actions' => [
'organization.created' => 'Organization created',
'organization.updated' => 'Organization updated',
'branch.created' => 'Branch created',
'branch.updated' => 'Branch updated',
'department.created' => 'Department created',
'department.updated' => 'Department updated',
'department.deleted' => 'Department deleted',
'member.created' => 'Member added',
'member.updated' => 'Member updated',
'member.deleted' => 'Member removed',
'service_queue.created' => 'Queue created',
'service_queue.updated' => 'Queue updated',
'service_queue.deleted' => 'Queue archived',
'service_queue.paused' => 'Queue paused',
'service_queue.resumed' => 'Queue resumed',
'counter.created' => 'Counter created',
'counter.updated' => 'Counter updated',
'counter.deleted' => 'Counter archived',
'ticket.issued' => 'Ticket issued',
'ticket.called' => 'Ticket called',
'ticket.recalled' => 'Ticket recalled',
'ticket.skipped' => 'Ticket skipped',
'ticket.transferred' => 'Ticket transferred',
'ticket.held' => 'Ticket placed on hold',
'ticket.completed' => 'Service completed',
'ticket.no_show' => 'Ticket marked no-show',
'ticket.cancelled' => 'Ticket cancelled',
'appointment.created' => 'Appointment scheduled',
'appointment.checked_in' => 'Appointment checked in',
'appointment.cancelled' => 'Appointment cancelled',
'workflow.created' => 'Workflow created',
'workflow.updated' => 'Workflow updated',
'display.created' => 'Display screen created',
'display.updated' => 'Display screen updated',
'device.created' => 'Device registered',
'device.updated' => 'Device updated',
'feedback.submitted' => 'Customer feedback submitted',
],
'notification_templates' => [
'issued' => 'Your ticket :ticket is confirmed for :queue. We will notify you when it is almost your turn.',
'called' => 'Ticket :ticket — please proceed to :counter now.',
'almost_ready' => 'Ticket :ticket — you are :ahead customer(s) away. Please head to the waiting area.',
'completed' => 'Thank you for visiting. Ticket :ticket is complete. Share feedback: :feedback_url',
'missed' => 'Ticket :ticket was marked as missed. Please rejoin the queue if you still need service.',
'transferred' => 'Ticket :ticket has been handed off to :queue. Keep your ticket — your number stays the same.',
],
'report_types' => [
'tickets' => 'Ticket volume & throughput',
'wait_times' => 'Wait times & peak hours',
'counters' => 'Counter performance',
'appointments' => 'Appointments',
'feedback' => 'Customer satisfaction',
'service_sessions' => 'Service sessions',
],
'plans' => [
'free' => [
'label' => 'Free',
'price_minor' => 0,
'max_branches' => 1,
'max_queues' => 5,
],
'pro' => [
'label' => 'Pro',
'price_minor' => (int) env('QUEUE_PRO_PRICE_MINOR', 9900),
'max_branches' => null,
'max_queues' => null,
],
'enterprise' => [
'label' => 'Enterprise',
'price_minor_per_branch' => (int) env('QUEUE_ENTERPRISE_PRICE_PER_BRANCH_MINOR', 29900),
'max_branches' => null,
'max_queues' => null,
],
],
'pro' => [
'grace_days' => (int) env('QUEUE_PRO_GRACE_DAYS', 3),
'period_days' => (int) env('QUEUE_PRO_PERIOD_DAYS', 30),
],
'enterprise' => [
'min_branches' => (int) env('QUEUE_ENTERPRISE_MIN_BRANCHES', 2),
],
'prepaid_months' => [6, 12, 24],
'rule_types' => [
'overflow' => 'Overflow routing',
'priority_boost' => 'Priority boost',
'routing' => 'Dynamic routing',
'capacity' => 'Capacity limit',
],
'workflow_templates' => [
'healthcare' => [
['name' => 'Registration', 'sort_order' => 1],
['name' => 'Triage', 'sort_order' => 2],
['name' => 'Consultation', 'sort_order' => 3],
['name' => 'Pharmacy', 'sort_order' => 4],
],
'banking' => [
['name' => 'Reception', 'sort_order' => 1],
['name' => 'Teller', 'sort_order' => 2],
['name' => 'Customer service', 'sort_order' => 3],
],
'government' => [
['name' => 'Document check', 'sort_order' => 1],
['name' => 'Processing', 'sort_order' => 2],
['name' => 'Collection', 'sort_order' => 3],
],
'custom' => [],
],
/*
|--------------------------------------------------------------------------
| Inbound service API keys (sibling Ladill apps calling Queue)
|--------------------------------------------------------------------------
*/
'service_api_keys' => array_filter([
'pos' => env('QUEUE_API_KEY_POS'),
'crm' => env('QUEUE_API_KEY_CRM'),
'care' => env('QUEUE_API_KEY_CARE'),
'frontdesk' => env('QUEUE_API_KEY_FRONTDESK'),
]),
'display_poll_ms' => (int) env('QUEUE_DISPLAY_POLL_MS', 1200),
'upgrade_banner' => [
'title' => 'Unlock Queue Pro or Enterprise',
'description' => 'Unlimited branches, advanced routing, Care & Frontdesk integrations — from GHS 99/mo.',
'route' => 'qms.pro.index',
],
];