From 982537bb13ee3e752f4680c288722c3e1302a964 Mon Sep 17 00:00:00 2001 From: isaacclad Date: Tue, 21 Jul 2026 14:24:34 +0000 Subject: [PATCH] Sync launcher (Merchant/Mini/Give/One) and DemoWorld Care specialty RBAC staff. --- app/Support/DemoWorld.php | 167 ++++++++++++++++++++++++++++++------- config/ladill_launcher.php | 4 + 2 files changed, 139 insertions(+), 32 deletions(-) diff --git a/app/Support/DemoWorld.php b/app/Support/DemoWorld.php index 40ccc29..dc0a15b 100644 --- a/app/Support/DemoWorld.php +++ b/app/Support/DemoWorld.php @@ -187,33 +187,52 @@ final class DemoWorld * }>> */ /** - * Care specialty module doctors (Pro / Enterprise). Emails: demo-{tier}-{key}@ladill.com + * Care specialty module clinicians (Pro / Enterprise). + * Emails: demo-{tier}-{key}@ladill.com + * Roles follow the Care RBAC matrix when a dedicated slug exists; + * remaining modules stay on legacy `doctor` + desk specialty keywords. * - * @var array module key => display name + * @var array */ public const SPECIALTY_DOCTORS = [ - 'emergency' => 'Dr. Kojo Emergency', - 'blood_bank' => 'Dr. Ama Blood Bank', - 'dentistry' => 'Dr. Ama Dental', - 'ophthalmology' => 'Dr. Kofi Eye', - 'physiotherapy' => 'Dr. Efua Physio', - 'maternity' => 'Dr. Abena Maternity', - 'radiology' => 'Dr. Yaw Radiology', - 'cardiology' => 'Dr. Kwesi Cardiology', - 'psychiatry' => 'Dr. Adwoa Psychiatry', - 'pediatrics' => 'Dr. Fiifi Pediatrics', - 'orthopedics' => 'Dr. Kojo Orthopedics', - 'ent' => 'Dr. Esi ENT', - 'oncology' => 'Dr. Mansa Oncology', - 'renal' => 'Dr. Nana Renal', - 'surgery' => 'Dr. Kwadwo Surgery', - 'vaccination' => 'Dr. Afia Vaccination', - 'pathology' => 'Dr. Yaw Pathology', - 'infusion' => 'Dr. Akosua Infusion', - 'dermatology' => 'Dr. Ama Dermatology', - 'podiatry' => 'Dr. Kofi Podiatry', - 'fertility' => 'Dr. Abena Fertility', - 'child_welfare' => 'Dr. Efua Child Welfare', + 'emergency' => ['name' => 'Dr. Kojo Emergency', 'role' => 'emergency_physician'], + 'blood_bank' => ['name' => 'Ama Blood Bank Officer', 'role' => 'blood_bank_officer'], + 'dentistry' => ['name' => 'Dr. Ama Dental', 'role' => 'dentist'], + 'ophthalmology' => ['name' => 'Dr. Kofi Eye', 'role' => 'doctor'], + 'physiotherapy' => ['name' => 'Dr. Efua Physio', 'role' => 'physiotherapist'], + 'maternity' => ['name' => 'Abena Midwife', 'role' => 'midwife'], + 'radiology' => ['name' => 'Dr. Yaw Radiology', 'role' => 'radiologist'], + 'cardiology' => ['name' => 'Dr. Kwesi Cardiology', 'role' => 'doctor'], + 'psychiatry' => ['name' => 'Dr. Adwoa Psychiatry', 'role' => 'psychiatrist'], + 'pediatrics' => ['name' => 'Dr. Fiifi Pediatrics', 'role' => 'pediatrician'], + 'orthopedics' => ['name' => 'Dr. Kojo Orthopedics', 'role' => 'doctor'], + 'ent' => ['name' => 'Dr. Esi ENT', 'role' => 'doctor'], + 'oncology' => ['name' => 'Dr. Mansa Oncology', 'role' => 'oncologist'], + 'renal' => ['name' => 'Dr. Nana Renal', 'role' => 'doctor'], + 'surgery' => ['name' => 'Dr. Kwadwo Surgery', 'role' => 'surgeon'], + 'vaccination' => ['name' => 'Dr. Afia Vaccination', 'role' => 'doctor'], + 'pathology' => ['name' => 'Dr. Yaw Pathology', 'role' => 'pathologist'], + 'infusion' => ['name' => 'Dr. Akosua Infusion', 'role' => 'doctor'], + 'dermatology' => ['name' => 'Dr. Ama Dermatology', 'role' => 'doctor'], + 'podiatry' => ['name' => 'Dr. Kofi Podiatry', 'role' => 'doctor'], + 'fertility' => ['name' => 'Dr. Abena Fertility', 'role' => 'doctor'], + 'child_welfare' => ['name' => 'Dr. Efua Child Welfare', 'role' => 'doctor'], + 'ambulance' => ['name' => 'Kojo Ambulance', 'role' => 'ambulance_staff'], + ]; + + /** + * Extra Care matrix roles (not covered by SPECIALTY_DOCTORS keys). + * + * @var list + */ + public const CARE_MATRIX_STAFF = [ + ['key' => 'ed-nurse', 'name' => 'Ama ED Nurse', 'role' => 'ed_nurse'], + ['key' => 'theatre-nurse', 'name' => 'Efua Theatre Nurse', 'role' => 'theatre_nurse'], + ['key' => 'radiographer', 'name' => 'Kofi Radiographer', 'role' => 'radiographer'], + ['key' => 'dialysis-nurse', 'name' => 'Abena Dialysis Nurse', 'role' => 'dialysis_nurse'], + ['key' => 'billing-officer', 'name' => 'Yaw Billing Officer', 'role' => 'billing_officer'], + ['key' => 'department-manager', 'name' => 'Adwoa Department Manager', 'role' => 'department_manager'], + ['key' => 'hospital-admin', 'name' => 'Kojo Hospital Admin', 'role' => 'hospital_admin'], ]; public const STAFF = [ @@ -242,7 +261,14 @@ final class DemoWorld 'email' => 'demo-pro-doctor@ladill.com', 'name' => 'Dr. Kwame Mensah (Pro)', 'apps' => ['care'], - 'roles' => ['care' => 'doctor'], + 'roles' => ['care' => 'general_physician'], + ], + [ + 'key' => 'general-physician', + 'email' => 'demo-pro-general-physician@ladill.com', + 'name' => 'Dr. Ama General Physician (Pro)', + 'apps' => ['care'], + 'roles' => ['care' => 'general_physician'], ], [ 'key' => 'nurse', @@ -282,13 +308,36 @@ final class DemoWorld 'apps' => ['care'], 'roles' => ['care' => 'lab_technician'], ], + [ + 'key' => 'lab_manager', + 'email' => 'demo-pro-lab-manager@ladill.com', + 'name' => 'Ama Lab Manager (Pro)', + 'apps' => ['care'], + 'roles' => ['care' => 'lab_manager'], + ], + [ + 'key' => 'blood_bank_manager', + 'email' => 'demo-pro-blood-bank-manager@ladill.com', + 'name' => 'Kofi Blood Bank Manager (Pro)', + 'apps' => ['care'], + 'roles' => ['care' => 'blood_bank_manager'], + ], [ 'key' => 'cashier', 'email' => 'demo-pro-cashier@ladill.com', 'name' => 'Kojo Cashier (Pro)', - 'apps' => ['care', 'pos'], + // Care cashiers collect via Billing — not Ladill POS. + 'apps' => ['care'], 'roles' => [ 'care' => 'cashier', + ], + ], + [ + 'key' => 'pos_cashier', + 'email' => 'demo-pro-pos-cashier@ladill.com', + 'name' => 'Kofi POS Cashier (Pro)', + 'apps' => ['pos'], + 'roles' => [ 'pos' => 'cashier', ], ], @@ -321,7 +370,14 @@ final class DemoWorld 'email' => 'demo-enterprise-doctor@ladill.com', 'name' => 'Dr. Kwame Mensah', 'apps' => ['care'], - 'roles' => ['care' => 'doctor'], + 'roles' => ['care' => 'general_physician'], + ], + [ + 'key' => 'general-physician', + 'email' => 'demo-enterprise-general-physician@ladill.com', + 'name' => 'Dr. Ama General Physician', + 'apps' => ['care'], + 'roles' => ['care' => 'general_physician'], ], [ 'key' => 'nurse', @@ -361,13 +417,36 @@ final class DemoWorld 'apps' => ['care'], 'roles' => ['care' => 'lab_technician'], ], + [ + 'key' => 'lab_manager', + 'email' => 'demo-enterprise-lab-manager@ladill.com', + 'name' => 'Ama Lab Manager', + 'apps' => ['care'], + 'roles' => ['care' => 'lab_manager'], + ], + [ + 'key' => 'blood_bank_manager', + 'email' => 'demo-enterprise-blood-bank-manager@ladill.com', + 'name' => 'Kofi Blood Bank Manager', + 'apps' => ['care'], + 'roles' => ['care' => 'blood_bank_manager'], + ], [ 'key' => 'cashier', 'email' => 'demo-enterprise-cashier@ladill.com', 'name' => 'Kojo Cashier', - 'apps' => ['care', 'pos'], + // Care cashiers collect via Billing — not Ladill POS. + 'apps' => ['care'], 'roles' => [ 'care' => 'cashier', + ], + ], + [ + 'key' => 'pos_cashier', + 'email' => 'demo-enterprise-pos-cashier@ladill.com', + 'name' => 'Kofi POS Cashier', + 'apps' => ['pos'], + 'roles' => [ 'pos' => 'cashier', ], ], @@ -525,7 +604,7 @@ final class DemoWorld return $roster; } - foreach (self::SPECIALTY_DOCTORS as $key => $name) { + foreach (self::SPECIALTY_DOCTORS as $key => $meta) { $email = sprintf('demo-%s-%s@ladill.com', $tier, $key); $already = false; foreach ($roster as $row) { @@ -537,13 +616,37 @@ final class DemoWorld if ($already) { continue; } + $name = is_array($meta) ? (string) ($meta['name'] ?? $key) : (string) $meta; + $role = is_array($meta) ? (string) ($meta['role'] ?? 'doctor') : 'doctor'; + $suffix = $tier === 'pro' ? ' (Pro)' : ''; + $roster[] = [ + 'key' => $key, + 'email' => $email, + 'name' => $name.$suffix, + 'apps' => ['care'], + 'roles' => ['care' => $role], + ]; + } + + foreach (self::CARE_MATRIX_STAFF as $extra) { + $email = sprintf('demo-%s-%s@ladill.com', $tier, $extra['key']); + $already = false; + foreach ($roster as $row) { + if (strtolower((string) ($row['email'] ?? '')) === $email) { + $already = true; + break; + } + } + if ($already) { + continue; + } $suffix = $tier === 'pro' ? ' (Pro)' : ''; $roster[] = [ - 'key' => $key, + 'key' => $extra['key'], 'email' => $email, - 'name' => $name.$suffix, + 'name' => $extra['name'].$suffix, 'apps' => ['care'], - 'roles' => ['care' => 'doctor'], + 'roles' => ['care' => $extra['role']], ]; } diff --git a/config/ladill_launcher.php b/config/ladill_launcher.php index 93ad902..3183cd4 100644 --- a/config/ladill_launcher.php +++ b/config/ladill_launcher.php @@ -18,7 +18,10 @@ $root = config('app.platform_domain', 'ladill.com'); return [ 'apps' => [ + ['name' => 'Merchant', 'url' => 'https://merchant.'.$root.'/sso/connect?redirect='.urlencode('https://merchant.'.$root.'/dashboard'), 'icon' => 'merchant.svg'], ['name' => 'POS', 'url' => 'https://pos.'.$root.'/sso/connect?redirect='.urlencode('https://pos.'.$root.'/dashboard'), 'icon' => 'pos.svg'], + ['name' => 'Mini', 'url' => 'https://mini.'.$root.'/sso/connect?redirect='.urlencode('https://mini.'.$root.'/dashboard'), 'icon' => 'mini.svg'], + ['name' => 'Give', 'url' => 'https://give.'.$root.'/sso/connect?redirect='.urlencode('https://give.'.$root.'/dashboard'), 'icon' => 'give.svg'], ['name' => 'Woo Manager', 'url' => 'https://woo.'.$root.'/sso/connect?redirect='.urlencode('https://woo.'.$root.'/dashboard'), 'icon' => 'woomanager.svg'], ['name' => 'Transfer', 'url' => 'https://transfer.'.$root.'/sso/connect?redirect='.urlencode('https://transfer.'.$root.'/dashboard'), 'icon' => 'transfer.svg'], ['name' => 'Accounting', 'url' => 'https://accounting.'.$root.'/sso/connect?redirect='.urlencode('https://accounting.'.$root.'/dashboard'), 'icon' => 'accounting.svg'], @@ -29,6 +32,7 @@ return [ ['name' => 'Link', 'url' => 'https://link.'.$root.'/sso/connect?redirect='.urlencode('https://link.'.$root.'/dashboard'), 'icon' => 'link.svg'], ['name' => 'Frontdesk', 'url' => 'https://frontdesk.'.$root.'/sso/connect?redirect='.urlencode('https://frontdesk.'.$root.'/dashboard'), 'icon' => 'frontdesk.svg'], ['name' => 'Care', 'url' => 'https://care.'.$root.'/sso/connect?redirect='.urlencode('https://care.'.$root.'/dashboard'), 'icon' => 'care.svg'], + ['name' => 'One', 'url' => 'https://one.'.$root.'/sso/connect?redirect='.urlencode('https://one.'.$root.'/dashboard'), 'icon' => 'one.svg'], ['name' => 'Queue', 'url' => 'https://queue.'.$root.'/sso/connect?redirect='.urlencode('https://queue.'.$root.'/dashboard'), 'icon' => 'queue.svg'], ['name' => 'SMS', 'url' => 'https://sms.'.$root, 'icon' => 'sms.svg'], ['name' => 'Bird', 'url' => 'https://bird.'.$root, 'icon' => 'bird.svg'],