Deploy Ladill Queue / deploy (push) Successful in 40s
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>
257 lines
8.9 KiB
PHP
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',
|
|
],
|
|
|
|
];
|