Files
ladill-frontdesk/config/frontdesk.php
T
isaaccladandCursor 16c85ce38a
Deploy Ladill Frontdesk / deploy (push) Successful in 24s
Replace free-text visit purpose with configurable dropdown options.
Add visit_purposes config and shared select on kiosk, reception check-in, and scheduling forms.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 22:23:26 +00:00

222 lines
8.5 KiB
PHP

<?php
return [
/*
|--------------------------------------------------------------------------
| Inbound service API keys (sibling Ladill apps calling Frontdesk)
|--------------------------------------------------------------------------
*/
'service_api_keys' => array_filter([
'pos' => env('FRONTDESK_API_KEY_POS'),
'crm' => env('FRONTDESK_API_KEY_CRM'),
'care' => env('FRONTDESK_API_KEY_CARE'),
'lab' => env('FRONTDESK_API_KEY_LAB'),
]),
'visitor_types' => [
'visitor' => 'Visitor',
'contractor' => 'Contractor',
'vendor' => 'Vendor',
'interview_candidate' => 'Interview Candidate',
'delivery' => 'Delivery Personnel',
],
'visit_purposes' => [
'meeting' => 'Business meeting',
'interview' => 'Job interview',
'delivery' => 'Delivery or pickup',
'maintenance' => 'Maintenance or repairs',
'sales' => 'Sales or vendor visit',
'training' => 'Training or workshop',
'personal' => 'Personal visit',
'other' => 'Other',
],
'visit_statuses' => [
'scheduled' => 'Scheduled',
'expected' => 'Expected',
'waiting' => 'Waiting',
'checked_in' => 'Checked In',
'checked_out' => 'Checked Out',
'cancelled' => 'Cancelled',
'overdue' => 'Overdue',
],
'watchlist_statuses' => [
'allowed' => 'Allowed',
'requires_approval' => 'Requires Approval',
'blacklisted' => 'Blacklisted',
],
'audit_actions' => [
'visit.checked_in' => 'Visit checked in',
'visit.checked_out' => 'Visit checked out',
'visit.awaiting_approval' => 'Visit awaiting approval',
'visit.scheduled' => 'Visit scheduled',
'visit.waiting' => 'Visitor waiting',
'visit.cancelled' => 'Visit cancelled',
'visit.deleted' => 'Visit archived',
'visit.restored' => 'Visit restored',
'visitor.deleted' => 'Visitor archived',
'visitor.restored' => 'Visitor restored',
'watchlist.blocked_attempt' => 'Blocked check-in attempt',
'watchlist.flagged_checkin' => 'Flagged visitor check-in',
'watchlist.entry_created' => 'Watchlist entry added',
'watchlist.entry_removed' => 'Watchlist entry removed',
'badge.expired' => 'Badge expired',
],
'roles' => [
'super_admin' => 'Super Administrator',
'org_admin' => 'Organization Administrator',
'branch_admin' => 'Branch Administrator',
'receptionist' => 'Receptionist',
'security_officer' => 'Security Officer',
'host' => 'Host',
'auditor' => 'Auditor',
],
'device_types' => [
'reception_computer' => 'Reception Computer',
'kiosk' => 'Visitor Kiosk',
'tablet' => 'Tablet',
'badge_printer' => 'Badge Printer',
'qr_scanner' => 'QR Scanner',
'camera' => 'Camera',
'signature_pad' => 'Signature Pad',
],
'notification_channels' => [
'email' => 'Email',
'sms' => 'SMS',
'push' => 'Push Notification',
'teams' => 'Microsoft Teams',
'slack' => 'Slack',
],
'notification_events' => [
'visitor_arrived' => 'Visitor arrived (checked in)',
'visitor_checked_out' => 'Visitor checked out',
'visitor_expected' => 'Visitor expected today',
'visitor_waiting' => 'Visitor waiting in reception',
'visit_cancelled' => 'Visit cancelled',
'approval_needed' => 'Approval required',
'watchlist_alert' => 'Watchlist / security alerts',
'badge_expired' => 'Expired badge while checked in',
],
'default_notification_events' => [
'visitor_arrived' => true,
'visitor_checked_out' => true,
'visitor_expected' => true,
'visitor_waiting' => true,
'visit_cancelled' => true,
'approval_needed' => true,
'watchlist_alert' => true,
'badge_expired' => true,
],
'kiosk' => [
'inactivity_reset_seconds' => (int) env('FRONTDESK_KIOSK_RESET_SECONDS', 120),
'default_visit_duration_minutes' => 60,
],
'badge' => [
'default_expiry_hours' => 8,
'qr_url_path' => '/q',
],
'default_badge_template' => [
'show_photo' => true,
'show_qr' => true,
'show_host' => true,
'show_company' => true,
'show_type' => true,
'primary_color' => '#0d9488',
'footer_text' => '',
],
'webhook_events' => [
'visit.checked_in',
'visit.checked_out',
'visit.awaiting_approval',
],
'integrations' => [
'care' => 'Ladill Care',
'lab' => 'Ladill Lab',
'pos' => 'Ladill POS',
'crm' => 'Ladill CRM',
],
'printers' => [
'default_driver' => env('FRONTDESK_PRINTER_DRIVER', 'pdf'),
'drivers' => ['pdf', 'zebra', 'brother', 'dymo'],
],
/*
|--------------------------------------------------------------------------
| Visitor type workflows (Phase 4)
|--------------------------------------------------------------------------
| Config-driven fields, badge expiry overrides, and approval requirements.
*/
'visitor_type_config' => [
'visitor' => [
'requires_approval' => false,
'badge_expiry_hours' => null,
'details_key' => null,
'fields' => [],
],
'contractor' => [
'requires_approval' => false,
'badge_expiry_hours' => 12,
'details_key' => 'contractor_details',
'fields' => [
['name' => 'contract_company', 'label' => 'Contract company', 'type' => 'text', 'required' => true],
['name' => 'supervisor', 'label' => 'Site supervisor', 'type' => 'text', 'required' => true],
['name' => 'contract_start', 'label' => 'Contract start', 'type' => 'date', 'required' => false],
['name' => 'contract_end', 'label' => 'Contract end', 'type' => 'date', 'required' => false],
['name' => 'safety_induction_completed', 'label' => 'Safety induction completed', 'type' => 'checkbox', 'required' => true],
['name' => 'insurance_reference', 'label' => 'Insurance reference', 'type' => 'text', 'required' => false],
['name' => 'permit_number', 'label' => 'Permit number', 'type' => 'text', 'required' => false],
['name' => 'equipment_carried', 'label' => 'Equipment carried', 'type' => 'textarea', 'required' => false],
],
],
'delivery' => [
'requires_approval' => false,
'badge_expiry_hours' => 2,
'details_key' => 'delivery_details',
'fields' => [
['name' => 'courier_company', 'label' => 'Courier company', 'type' => 'text', 'required' => true],
['name' => 'recipient', 'label' => 'Recipient', 'type' => 'text', 'required' => true],
['name' => 'tracking_number', 'label' => 'Tracking number', 'type' => 'text', 'required' => false],
['name' => 'package_description', 'label' => 'Package description', 'type' => 'text', 'required' => false],
['name' => 'delivery_photo', 'label' => 'Delivery photo', 'type' => 'photo', 'required' => false],
['name' => 'delivery_signature', 'label' => 'Signature', 'type' => 'signature', 'required' => false],
],
],
'vendor' => [
'requires_approval' => true,
'badge_expiry_hours' => null,
'details_key' => 'contractor_details',
'fields' => [
['name' => 'vendor_company', 'label' => 'Vendor company', 'type' => 'text', 'required' => true],
['name' => 'service_type', 'label' => 'Service / product', 'type' => 'text', 'required' => true],
['name' => 'purchase_order', 'label' => 'PO number', 'type' => 'text', 'required' => false],
],
],
'interview_candidate' => [
'requires_approval' => true,
'badge_expiry_hours' => null,
'details_key' => 'contractor_details',
'fields' => [
['name' => 'position_applied', 'label' => 'Position applied for', 'type' => 'text', 'required' => true],
['name' => 'interviewer', 'label' => 'Interviewer', 'type' => 'text', 'required' => false],
['name' => 'scheduled_interview_at', 'label' => 'Interview time', 'type' => 'datetime-local', 'required' => false],
],
],
],
];