Add full Ambulance and Child Welfare specialty clinical suites.
Deploy Ladill Care / deploy (push) Successful in 54s

EMS clinic workflow (dispatch → scene → transport → handover) plus completed CWC suite, with shell stages, clinical records, reports/print, demo seed, and suite tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-19 22:25:52 +00:00
co-authored by Cursor
parent 8c18ecc5c9
commit c0e5d8ef00
32 changed files with 2672 additions and 22 deletions
+3
View File
@@ -43,6 +43,7 @@ return [
'podiatry' => 'Podiatry',
'fertility' => 'Fertility',
'child_welfare' => 'Child Welfare Clinic',
'ambulance' => 'Ambulance',
],
/*
@@ -78,6 +79,8 @@ return [
'Podiatry',
'Fertility',
'Child Welfare Clinic',
'Ambulance',
'EMS / Paramedic',
],
/*
+86 -11
View File
@@ -148,8 +148,16 @@ return [
'cycle' => 'fert_cycle',
],
'child_welfare' => [
'growth' => 'growth',
'clinical_notes' => 'clinical_note',
'intake' => 'cwc_intake',
'assessment' => 'cwc_assessment',
'plan' => 'cwc_plan',
'followup' => 'cwc_followup',
],
'ambulance' => [
'dispatch' => 'amb_dispatch',
'scene' => 'amb_scene',
'en_route' => 'amb_en_route',
'handover' => 'amb_handover',
],
],
'fields' => [
@@ -1021,22 +1029,89 @@ return [
],
],
'child_welfare' => [
'growth' => [
'cwc_intake' => [
['name' => 'visit_reason', 'label' => 'Visit reason', 'type' => 'select', 'required' => true, 'options' => ['Routine well-child', 'Growth monitoring', 'Immunization review', 'Feeding concern', 'Development concern', 'Follow-up', 'Other']],
['name' => 'caregiver', 'label' => 'Caregiver / accompanying adult', 'type' => 'text'],
['name' => 'history', 'label' => 'Interval history', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'birth_history', 'label' => 'Birth / neonatal history', 'type' => 'textarea', 'rows' => 2],
['name' => 'immunization_status', 'label' => 'Immunization status', 'type' => 'select', 'options' => ['Up to date', 'Catch-up needed', 'Unknown', 'Deferred']],
['name' => 'feeding', 'label' => 'Feeding / nutrition history', 'type' => 'textarea', 'rows' => 2],
['name' => 'social_context', 'label' => 'Social / family context', 'type' => 'textarea', 'rows' => 2],
['name' => 'safeguarding_notes', 'label' => 'Sensitive / safeguarding notes', 'type' => 'textarea', 'rows' => 3],
['name' => 'allergies', 'label' => 'Allergies', 'type' => 'text'],
],
'cwc_assessment' => [
['name' => 'age_months', 'label' => 'Age (months)', 'type' => 'number', 'required' => true],
['name' => 'weight_kg', 'label' => 'Weight (kg)', 'type' => 'number', 'required' => true],
['name' => 'height_cm', 'label' => 'Height / length (cm)', 'type' => 'number'],
['name' => 'head_circumference_cm', 'label' => 'Head circumference (cm)', 'type' => 'number'],
['name' => 'muac_cm', 'label' => 'MUAC (cm)', 'type' => 'number'],
['name' => 'growth_status', 'label' => 'Growth status', 'type' => 'select', 'options' => ['Normal', 'Underweight', 'Stunted', 'Wasted', 'Overweight']],
['name' => 'feeding', 'label' => 'Feeding / nutrition', 'type' => 'textarea', 'rows' => 2],
['name' => 'milestones', 'label' => 'Developmental milestones', 'type' => 'textarea', 'rows' => 2],
['name' => 'counseling', 'label' => 'Counseling given', 'type' => 'textarea', 'rows' => 2],
['name' => 'nutrition_risk', 'label' => 'Nutrition risk', 'type' => 'select', 'options' => ['Low', 'Moderate', 'High']],
['name' => 'development', 'label' => 'Developmental milestones', 'type' => 'textarea', 'rows' => 2],
['name' => 'exam_findings', 'label' => 'Exam findings', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'safeguarding_flag', 'label' => 'Safeguarding flag', 'type' => 'select', 'options' => ['None', 'Concern', 'Escalated']],
['name' => 'assessment_summary', 'label' => 'Assessment summary', 'type' => 'textarea', 'required' => true, 'rows' => 3],
],
'clinical_note' => [
['name' => 'history', 'label' => 'History of present illness', 'type' => 'textarea', 'required' => true, 'rows' => 4],
['name' => 'examination', 'label' => 'Examination', 'type' => 'textarea', 'rows' => 3],
['name' => 'working_diagnosis', 'label' => 'Working diagnosis', 'type' => 'text'],
['name' => 'plan', 'label' => 'Plan', 'type' => 'textarea', 'rows' => 3],
'cwc_plan' => [
['name' => 'goals', 'label' => 'Care goals', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'interventions', 'label' => 'Planned interventions', 'type' => 'textarea', 'rows' => 2],
['name' => 'counseling', 'label' => 'Counseling / education', 'type' => 'textarea', 'rows' => 2],
['name' => 'referrals', 'label' => 'Referrals', 'type' => 'textarea', 'rows' => 2],
['name' => 'medications', 'label' => 'Medications / supplements', 'type' => 'textarea', 'rows' => 2],
['name' => 'follow_up', 'label' => 'Follow-up', 'type' => 'text'],
['name' => 'advice', 'label' => 'Caregiver advice', 'type' => 'textarea', 'rows' => 2],
],
'cwc_followup' => [
['name' => 'review_type', 'label' => 'Review type', 'type' => 'select', 'required' => true, 'options' => ['Clinic follow-up', 'Growth recheck', 'Intervention review', 'Caregiver counselling', 'Discharge from CWC episode']],
['name' => 'interventions_delivered', 'label' => 'Interventions delivered', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'progress', 'label' => 'Progress since last visit', 'type' => 'textarea', 'rows' => 2],
['name' => 'outcome', 'label' => 'Outcome', 'type' => 'select', 'required' => true, 'options' => ['In progress', 'Completed — continue CWC', 'Completed uneventfully', 'Referred', 'Lost to follow-up']],
['name' => 'next_visit', 'label' => 'Next visit', 'type' => 'text'],
['name' => 'notes', 'label' => 'Notes', 'type' => 'textarea', 'rows' => 2],
],
],
'ambulance' => [
'amb_dispatch' => [
['name' => 'call_nature', 'label' => 'Call nature', 'type' => 'select', 'required' => true, 'options' => ['Medical emergency', 'Trauma / accident', 'Transfer', 'Obstetric', 'Psychiatric', 'Standby', 'Other']],
['name' => 'priority', 'label' => 'Priority', 'type' => 'select', 'required' => true, 'options' => ['Immediate', 'Urgent', 'Routine', 'Scheduled transfer']],
['name' => 'location', 'label' => 'Scene / pickup location', 'type' => 'text', 'required' => true],
['name' => 'caller_info', 'label' => 'Caller / contact', 'type' => 'text'],
['name' => 'crew', 'label' => 'Crew assigned', 'type' => 'text'],
['name' => 'vehicle', 'label' => 'Vehicle / unit', 'type' => 'text'],
['name' => 'dispatch_notes', 'label' => 'Dispatch notes', 'type' => 'textarea', 'rows' => 3],
['name' => 'eta_minutes', 'label' => 'ETA (minutes)', 'type' => 'number'],
],
'amb_scene' => [
['name' => 'chief_complaint', 'label' => 'Chief complaint', 'type' => 'text', 'required' => true],
['name' => 'acuity', 'label' => 'Scene acuity', 'type' => 'select', 'required' => true, 'options' => ['Critical', 'Urgent', 'Stable', 'Non-urgent']],
['name' => 'mechanism', 'label' => 'Mechanism / history', 'type' => 'textarea', 'rows' => 2],
['name' => 'airway_ok', 'label' => 'Airway patent', 'type' => 'boolean'],
['name' => 'breathing_ok', 'label' => 'Breathing adequate', 'type' => 'boolean'],
['name' => 'circulation_ok', 'label' => 'Circulation stable', 'type' => 'boolean'],
['name' => 'gcs', 'label' => 'GCS', 'type' => 'number'],
['name' => 'vitals_summary', 'label' => 'Vitals summary', 'type' => 'textarea', 'rows' => 2],
['name' => 'scene_findings', 'label' => 'Scene findings / triage', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'hazards', 'label' => 'Scene hazards', 'type' => 'textarea', 'rows' => 2],
],
'amb_en_route' => [
['name' => 'destination', 'label' => 'Destination facility', 'type' => 'text', 'required' => true],
['name' => 'interventions', 'label' => 'Interventions en route', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'medications', 'label' => 'Medications given', 'type' => 'textarea', 'rows' => 2],
['name' => 'response_to_treatment', 'label' => 'Response to treatment', 'type' => 'textarea', 'rows' => 2],
['name' => 'monitoring', 'label' => 'Monitoring notes', 'type' => 'textarea', 'rows' => 2],
['name' => 'deterioration', 'label' => 'Deterioration en route', 'type' => 'boolean'],
['name' => 'eta_facility', 'label' => 'ETA to facility', 'type' => 'text'],
['name' => 'notes', 'label' => 'Transport notes', 'type' => 'textarea', 'rows' => 2],
],
'amb_handover' => [
['name' => 'receiving_facility', 'label' => 'Receiving facility / unit', 'type' => 'text', 'required' => true],
['name' => 'receiving_clinician', 'label' => 'Receiving clinician', 'type' => 'text'],
['name' => 'handover_summary', 'label' => 'Handover summary (SBAR)', 'type' => 'textarea', 'required' => true, 'rows' => 4],
['name' => 'outcome', 'label' => 'Outcome', 'type' => 'select', 'required' => true, 'options' => ['Completed — handed over', 'Completed uneventfully', 'Transferred to another unit', 'Patient refused transport', 'Cancelled on scene']],
['name' => 'time_critical', 'label' => 'Time-critical pathway', 'type' => 'select', 'options' => ['None', 'Stroke', 'STEMI', 'Trauma', 'Obstetric', 'Other']],
['name' => 'follow_up', 'label' => 'Follow-up / documentation', 'type' => 'text'],
['name' => 'notes', 'label' => 'Notes', 'type' => 'textarea', 'rows' => 2],
],
],
],
+1
View File
@@ -30,5 +30,6 @@ return [
'finger-print' => '<path stroke-linecap="round" stroke-linejoin="round" d="M7.864 4.243A7.5 7.5 0 0 1 19.5 10.5c0 2.92-.556 5.709-1.566 8.268M5.742 6.364A7.465 7.465 0 0 0 4.5 10.5a7.464 7.464 0 0 1-1.15 3.993m1.989 3.559A11.209 11.209 0 0 0 8.25 10.5a3.75 3.75 0 1 1 7.5 0c0 .527-.021 1.049-.064 1.565M12 10.5a14.94 14.94 0 0 1-3.635 9.76m6.633-1.13a14.958 14.958 0 0 0 2.252-6.63M12 10.5a14.94 14.94 0 0 0-3.635 9.76m0 0A14.926 14.926 0 0 0 12 21.75c1.258 0 2.48-.17 3.643-.483M8.365 20.26A14.94 14.94 0 0 0 12 10.5" />',
'sparkles' => '<path stroke-linecap="round" stroke-linejoin="round" d="M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z" />',
'gift' => '<path stroke-linecap="round" stroke-linejoin="round" d="M21 11.25v8.25a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5v-8.25M12 4.875A2.625 2.625 0 1 0 9.375 7.5H12m0-2.625V7.5m0-2.625A2.625 2.625 0 1 1 14.625 7.5H12m0 0V21m-8.625-9.75h18c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125h-18c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125Z" />',
'truck' => '<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 18.75a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m3 0h6m-9 0H3.375a1.125 1.125 0 0 1-1.125-1.125V14.25m17.25 4.5a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m3 0h1.125c.621 0 1.129-.504 1.09-1.124a17.902 17.902 0 0 0-3.213-9.193 2.056 2.056 0 0 0-1.58-.86H14.25M16.5 18.75h-2.25m0-11.177v-.958c0-.568-.422-1.048-.987-1.106a48.554 48.554 0 0 0-10.026 0 1.106 1.106 0 0 0-.987 1.106v7.635m12-6.677v6.677m0 4.5v-4.5m0 0h-12" />',
'squares-2x2' => '<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6A2.25 2.25 0 0 1 6 3.75h2.25A2.25 2.25 0 0 1 10.5 6v2.25a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V6ZM3.75 15.75A2.25 2.25 0 0 1 6 13.5h2.25a2.25 2.25 0 0 1 2.25 2.25V18a2.25 2.25 0 0 1-2.25 2.25H6A2.25 2.25 0 0 1 3.75 18v-2.25ZM13.5 6a2.25 2.25 0 0 1 2.25-2.25H18A2.25 2.25 0 0 1 20.25 6v2.25A2.25 2.25 0 0 1 18 10.5h-2.25a2.25 2.25 0 0 1-2.25-2.25V6ZM13.5 15.75a2.25 2.25 0 0 1 2.25-2.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-2.25A2.25 2.25 0 0 1 13.5 18v-2.25Z" />',
];
+6 -3
View File
@@ -166,7 +166,8 @@ return [
'queue_keywords' => ['pedia', 'paedia', 'child', 'infant'],
'access' => 'general',
'roles' => ['doctor', 'nurse', 'receptionist'],
'specialist_keywords' => ['pedia', 'paedia', 'pediatric', 'paediatric', 'child', 'infant'],
// Avoid bare "child" — collides with Child Welfare Clinic specialty labels.
'specialist_keywords' => ['pedia', 'paedia', 'pediatric', 'paediatric', 'infant'],
],
'orthopedics' => [
'label' => 'Orthopedics',
@@ -348,15 +349,17 @@ return [
],
'child_welfare' => [
'label' => 'Child Welfare Clinic',
'description' => 'Well-child visits, growth monitoring, and CWC queues.',
'description' => 'Well-child / CWC clinics: intake, growth assessment, care plans, and follow-up.',
'department_type' => 'child_welfare',
'department_name' => 'Child Welfare Clinic',
'queue_name' => 'Child Welfare',
'queue_prefix' => 'CWC',
'nav_label' => 'Child Welfare',
'icon' => 'gift',
'queue_keywords' => ['cwc', 'child welfare', 'well baby', 'growth'],
'queue_keywords' => ['cwc', 'child welfare', 'well baby', 'well-child', 'welfare clinic'],
'access' => 'general',
'roles' => ['doctor', 'nurse', 'receptionist'],
// Prefer multi-word / CWC stems — do not use bare "child" (steals pediatrics).
'specialist_keywords' => ['child welfare', 'cwc', 'welfare clinic', 'well baby', 'well-child'],
],
];
+55 -5
View File
@@ -836,21 +836,71 @@ return [
],
'child_welfare' => [
'stages' => [
['code' => 'waiting', 'label' => 'Waiting', 'queue_point' => 'waiting'],
['code' => 'growth', 'label' => 'Growth / wellness', 'queue_point' => 'chair'],
['code' => 'check_in', 'label' => 'Check-in', 'queue_point' => 'waiting'],
['code' => 'intake', 'label' => 'Intake / history', 'queue_point' => 'waiting'],
['code' => 'assessment', 'label' => 'Assessment', 'queue_point' => 'chair'],
['code' => 'plan', 'label' => 'Care plan', 'queue_point' => 'chair'],
['code' => 'followup', 'label' => 'Intervention / follow-up', 'queue_point' => 'chair'],
['code' => 'completed', 'label' => 'Completed', 'queue_point' => null],
],
'services' => [
['code' => 'cwc.visit', 'label' => 'Well-child visit', 'amount_minor' => 3000, 'type' => 'consultation'],
['code' => 'cwc.visit', 'label' => 'Well-child / CWC visit', 'amount_minor' => 3000, 'type' => 'consultation'],
['code' => 'cwc.growth', 'label' => 'Growth & development assessment', 'amount_minor' => 2500, 'type' => 'consultation'],
['code' => 'cwc.counseling', 'label' => 'Caregiver counselling', 'amount_minor' => 2000, 'type' => 'consultation'],
['code' => 'cwc.followup', 'label' => 'CWC follow-up review', 'amount_minor' => 2500, 'type' => 'consultation'],
],
'workspace_tabs' => [
'overview' => 'Overview',
'growth' => 'Growth monitoring',
'clinical_notes' => 'Clinical notes',
'intake' => 'Intake / history',
'assessment' => 'Assessment',
'plan' => 'Care plan',
'followup' => 'Intervention / follow-up',
'orders' => 'Orders',
'billing' => 'Billing',
'documents' => 'Documents',
],
'stage_tabs' => [
'check_in' => 'overview',
'intake' => 'intake',
'assessment' => 'assessment',
'plan' => 'plan',
'followup' => 'followup',
'completed' => 'overview',
],
],
'ambulance' => [
'stages' => [
['code' => 'check_in', 'label' => 'Check-in', 'queue_point' => 'waiting'],
['code' => 'dispatch', 'label' => 'Dispatch', 'queue_point' => 'waiting'],
['code' => 'on_scene', 'label' => 'On scene', 'queue_point' => 'chair'],
['code' => 'transport', 'label' => 'Transport', 'queue_point' => 'chair'],
['code' => 'handover', 'label' => 'Handover', 'queue_point' => 'chair'],
['code' => 'completed', 'label' => 'Completed', 'queue_point' => null],
],
'services' => [
['code' => 'amb.dispatch', 'label' => 'Ambulance dispatch / response', 'amount_minor' => 8000, 'type' => 'consultation'],
['code' => 'amb.scene', 'label' => 'Scene assessment', 'amount_minor' => 5000, 'type' => 'consultation'],
['code' => 'amb.transport', 'label' => 'Patient transport', 'amount_minor' => 12000, 'type' => 'procedure'],
['code' => 'amb.handover', 'label' => 'Facility handover', 'amount_minor' => 4000, 'type' => 'consultation'],
],
'workspace_tabs' => [
'overview' => 'Overview',
'dispatch' => 'Dispatch',
'scene' => 'Scene / triage',
'en_route' => 'En-route care',
'handover' => 'Handover',
'orders' => 'Orders',
'billing' => 'Billing',
'documents' => 'Documents',
],
'stage_tabs' => [
'check_in' => 'overview',
'dispatch' => 'dispatch',
'on_scene' => 'scene',
'transport' => 'en_route',
'handover' => 'handover',
'completed' => 'overview',
],
],
],