Add full Radiology, Cardiology, and Psychiatry specialty clinical suites.
Deploy Ladill Care / deploy (push) Successful in 49s

Mirror the Ophthalmology/Maternity shell pattern with stages, stage_tabs,
workspace clinical records, reports/print, demo seeds, and suite tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-19 18:41:55 +00:00
co-authored by Cursor
parent b3805023b1
commit 8e23cdeae3
36 changed files with 3932 additions and 34 deletions
+91 -19
View File
@@ -47,16 +47,23 @@ return [
'postnatal' => 'postnatal_note',
],
'radiology' => [
'request' => 'imaging_request',
'report' => 'imaging_report',
'protocol' => 'imaging_request',
'acquisition' => 'imaging_acquisition',
'findings' => 'imaging_report',
'verification' => 'imaging_verification',
],
'cardiology' => [
'history' => 'cardio_history',
'exam' => 'cardiac_exam',
'clinical_notes' => 'clinical_note',
'investigations' => 'cardio_investigation',
'plan' => 'cardio_plan',
'procedures' => 'cardio_procedure',
],
'psychiatry' => [
'assessment' => 'mental_status',
'clinical_notes' => 'clinical_note',
'history' => 'mental_status',
'risk' => 'risk_assessment',
'plan' => 'psych_plan',
'followup' => 'psych_followup',
],
'pediatrics' => [
'exam' => 'pediatric_exam',
@@ -363,48 +370,113 @@ return [
['name' => 'clinical_info', 'label' => 'Clinical information', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'urgency', 'label' => 'Urgency', 'type' => 'select', 'options' => ['Routine', 'Urgent', 'STAT']],
['name' => 'contrast', 'label' => 'Contrast', 'type' => 'select', 'options' => ['None', 'IV', 'Oral', 'Both']],
['name' => 'protocol', 'label' => 'Protocol / sequences', 'type' => 'textarea', 'rows' => 2],
['name' => 'referrer', 'label' => 'Referring clinician', 'type' => 'text'],
],
'imaging_acquisition' => [
['name' => 'technologist', 'label' => 'Technologist', 'type' => 'text'],
['name' => 'equipment', 'label' => 'Equipment / room', 'type' => 'text'],
['name' => 'acquisition_status', 'label' => 'Acquisition status', 'type' => 'select', 'required' => true, 'options' => ['Scheduled', 'In progress', 'Acquired', 'Incomplete', 'Cancelled']],
['name' => 'contrast_given', 'label' => 'Contrast administered', 'type' => 'boolean'],
['name' => 'dose_notes', 'label' => 'Dose / exposure notes', 'type' => 'textarea', 'rows' => 2],
['name' => 'quality', 'label' => 'Image quality', 'type' => 'select', 'options' => ['Diagnostic', 'Limited', 'Non-diagnostic', 'Repeat needed']],
['name' => 'notes', 'label' => 'Acquisition notes', 'type' => 'textarea', 'rows' => 2],
],
'imaging_report' => [
['name' => 'technique', 'label' => 'Technique', 'type' => 'textarea', 'rows' => 2],
['name' => 'comparison', 'label' => 'Comparison', 'type' => 'text'],
['name' => 'findings', 'label' => 'Findings', 'type' => 'textarea', 'required' => true, 'rows' => 4],
['name' => 'impression', 'label' => 'Impression', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'recommendations', 'label' => 'Recommendations', 'type' => 'textarea', 'rows' => 2],
['name' => 'critical_result', 'label' => 'Critical / unexpected finding', 'type' => 'boolean'],
],
'imaging_verification' => [
['name' => 'verification_status', 'label' => 'Verification status', 'type' => 'select', 'required' => true, 'options' => ['Draft', 'Preliminary', 'Verified / final', 'Amended']],
['name' => 'verified_by', 'label' => 'Verified by', 'type' => 'text', 'required' => true],
['name' => 'critical_communicated', 'label' => 'Critical result communicated', 'type' => 'boolean'],
['name' => 'communication_notes', 'label' => 'Communication notes', 'type' => 'textarea', 'rows' => 2],
['name' => 'notes', 'label' => 'Verification notes', 'type' => 'textarea', 'rows' => 2],
],
],
'cardiology' => [
'cardio_history' => [
['name' => 'history', 'label' => 'History of present illness', 'type' => 'textarea', 'required' => true, 'rows' => 4],
['name' => 'past_cardiac', 'label' => 'Past cardiac history', 'type' => 'textarea', 'rows' => 2],
['name' => 'medications', 'label' => 'Medications', 'type' => 'textarea', 'rows' => 2],
['name' => 'allergies', 'label' => 'Allergies', 'type' => 'text'],
['name' => 'risk_factors', 'label' => 'Cardiac risk factors', 'type' => 'textarea', 'rows' => 2],
['name' => 'family_history', 'label' => 'Family history', 'type' => 'textarea', 'rows' => 2],
],
'cardiac_exam' => [
['name' => 'chief_complaint', 'label' => 'Chief complaint', 'type' => 'text', 'required' => true],
['name' => 'nyha_class', 'label' => 'NYHA class', 'type' => 'select', 'options' => ['I', 'II', 'III', 'IV', 'N/A']],
['name' => 'bp', 'label' => 'Blood pressure', 'type' => 'text'],
['name' => 'hr', 'label' => 'Heart rate', 'type' => 'number'],
['name' => 'heart_sounds', 'label' => 'Heart sounds / murmurs', 'type' => 'textarea', 'rows' => 2],
['name' => 'ecg_findings', 'label' => 'ECG findings', 'type' => 'textarea', 'rows' => 2],
['name' => 'echo_summary', 'label' => 'Echo summary', 'type' => 'textarea', 'rows' => 2],
['name' => 'risk_factors', 'label' => 'Cardiac risk factors', 'type' => 'textarea', 'rows' => 2],
['name' => 'ecg_findings', 'label' => 'ECG findings', 'type' => 'textarea', 'required' => true, 'rows' => 2],
['name' => 'exam_findings', 'label' => 'Exam findings', 'type' => 'textarea', 'rows' => 2],
],
'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],
'cardio_investigation' => [
['name' => 'modality', 'label' => 'Investigation', 'type' => 'select', 'required' => true, 'options' => ['Echo', 'Stress test', 'Holter', 'Troponin / labs', 'CT angio', 'Other']],
['name' => 'indication', 'label' => 'Indication', 'type' => 'textarea', 'rows' => 2],
['name' => 'findings', 'label' => 'Findings', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'impression', 'label' => 'Impression', 'type' => 'textarea', 'rows' => 2],
['name' => 'recommendations', 'label' => 'Recommendations', 'type' => 'textarea', 'rows' => 2],
],
'cardio_plan' => [
['name' => 'diagnosis', 'label' => 'Diagnosis', 'type' => 'text', 'required' => true],
['name' => 'plan', 'label' => 'Plan', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'medications', 'label' => 'Medications', 'type' => 'textarea', 'rows' => 2],
['name' => 'procedure_planned', 'label' => 'Procedure / intervention planned', 'type' => 'boolean'],
['name' => 'follow_up', 'label' => 'Follow-up', 'type' => 'text'],
['name' => 'advice', 'label' => 'Patient advice', 'type' => 'textarea', 'rows' => 2],
],
'cardio_procedure' => [
['name' => 'procedure', 'label' => 'Procedure / intervention', 'type' => 'text', 'required' => true],
['name' => 'indication', 'label' => 'Indication', 'type' => 'textarea', 'rows' => 2],
['name' => 'outcome', 'label' => 'Outcome', 'type' => 'select', 'required' => true, 'options' => ['Completed uneventfully', 'Completed with complications', 'Deferred', 'Aborted']],
['name' => 'complications', 'label' => 'Complications', 'type' => 'textarea', 'rows' => 2],
['name' => 'post_procedure_plan', 'label' => 'Post-procedure plan', 'type' => 'textarea', 'rows' => 2],
['name' => 'notes', 'label' => 'Notes', 'type' => 'textarea', 'rows' => 2],
],
],
'psychiatry' => [
'mental_status' => [
['name' => 'chief_complaint', 'label' => 'Presenting complaint', 'type' => 'text', 'required' => true],
['name' => 'history', 'label' => 'History of present illness', 'type' => 'textarea', 'rows' => 3],
['name' => 'appearance', 'label' => 'Appearance / behaviour', 'type' => 'textarea', 'rows' => 2],
['name' => 'mood_affect', 'label' => 'Mood / affect', 'type' => 'text'],
['name' => 'thought', 'label' => 'Thought content / process', 'type' => 'textarea', 'rows' => 2],
['name' => 'perception', 'label' => 'Perception', 'type' => 'text'],
['name' => 'cognition', 'label' => 'Cognition / orientation', 'type' => 'text'],
['name' => 'insight', 'label' => 'Insight / judgment', 'type' => 'text'],
['name' => 'risk', 'label' => 'Risk assessment', 'type' => 'textarea', 'required' => true, 'rows' => 2],
['name' => 'mse_summary', 'label' => 'MSE 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],
'risk_assessment' => [
['name' => 'overall_risk', 'label' => 'Overall risk level', 'type' => 'select', 'required' => true, 'options' => ['Low', 'Moderate', 'High', 'Imminent']],
['name' => 'self_harm', 'label' => 'Self-harm / suicide risk', 'type' => 'select', 'options' => ['None identified', 'Ideation', 'Plan', 'Intent / recent attempt']],
['name' => 'harm_others', 'label' => 'Risk to others', 'type' => 'select', 'options' => ['None identified', 'Ideation', 'Plan', 'Intent']],
['name' => 'safeguarding', 'label' => 'Safeguarding concerns', 'type' => 'textarea', 'rows' => 2],
['name' => 'protective_factors', 'label' => 'Protective factors', 'type' => 'textarea', 'rows' => 2],
['name' => 'risk_summary', 'label' => 'Risk summary', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'immediate_actions', 'label' => 'Immediate actions', 'type' => 'textarea', 'rows' => 2],
],
'psych_plan' => [
['name' => 'formulation', 'label' => 'Formulation', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'diagnosis', 'label' => 'Working diagnosis', 'type' => 'text'],
['name' => 'plan', 'label' => 'Management plan', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'medications', 'label' => 'Medications', 'type' => 'textarea', 'rows' => 2],
['name' => 'therapy', 'label' => 'Therapy / psychosocial', 'type' => 'textarea', 'rows' => 2],
['name' => 'follow_up', 'label' => 'Follow-up', 'type' => 'text'],
['name' => 'crisis_plan', 'label' => 'Crisis / safety plan', 'type' => 'textarea', 'rows' => 2],
],
'psych_followup' => [
['name' => 'review_type', 'label' => 'Review type', 'type' => 'select', 'required' => true, 'options' => ['Clinic follow-up', 'Medication review', 'Crisis review', 'Discharge review']],
['name' => 'progress', 'label' => 'Progress since last contact', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'current_risk', 'label' => 'Current risk', 'type' => 'select', 'options' => ['Low', 'Moderate', 'High', 'Imminent']],
['name' => 'outcome', 'label' => 'Outcome', 'type' => 'select', 'required' => true, 'options' => ['In progress', 'Follow-up arranged', 'Discharged', 'Referred', 'Admitted']],
['name' => 'next_steps', 'label' => 'Next steps', 'type' => 'textarea', 'rows' => 2],
['name' => 'notes', 'label' => 'Notes', 'type' => 'textarea', 'rows' => 2],
],
],
'pediatrics' => [
+3 -2
View File
@@ -118,6 +118,7 @@ return [
'queue_keywords' => ['radio', 'imaging', 'x-ray', 'xray', 'ultrasound', 'ct', 'mri'],
'access' => 'general',
'roles' => ['doctor', 'nurse', 'lab_technician', 'receptionist'],
'specialist_keywords' => ['radio', 'radiolog', 'imaging'],
],
'cardiology' => [
'label' => 'Cardiology',
@@ -134,7 +135,7 @@ return [
'support_roles' => ['nurse'],
'view_roles' => ['doctor', 'nurse', 'lab_technician'],
'refer_roles' => ['doctor', 'nurse'],
'specialist_keywords' => ['cardio', 'cardiology', 'heart'],
'specialist_keywords' => ['cardio', 'cardiology', 'heart', 'ecg'],
],
'psychiatry' => [
'label' => 'Psychiatry',
@@ -151,7 +152,7 @@ return [
'support_roles' => ['nurse'],
'view_roles' => ['doctor', 'nurse'],
'refer_roles' => ['doctor', 'nurse'],
'specialist_keywords' => ['psych', 'psychiatry', 'mental'],
'specialist_keywords' => ['psych', 'psychiatry', 'mental', 'behaviour'],
],
'pediatrics' => [
'label' => 'Pediatrics',
+64 -12
View File
@@ -292,61 +292,113 @@ return [
],
'radiology' => [
'stages' => [
['code' => 'request', 'label' => 'Request received', 'queue_point' => 'waiting'],
['code' => 'imaging', 'label' => 'Imaging', 'queue_point' => 'chair'],
['code' => 'check_in', 'label' => 'Check-in', 'queue_point' => 'waiting'],
['code' => 'protocol', 'label' => 'Request / protocol', 'queue_point' => 'waiting'],
['code' => 'acquisition', 'label' => 'Acquisition', 'queue_point' => 'chair'],
['code' => 'reporting', 'label' => 'Reporting', 'queue_point' => 'chair'],
['code' => 'verified', 'label' => 'Verified', 'queue_point' => null],
['code' => 'completed', 'label' => 'Completed', 'queue_point' => null],
],
'services' => [
['code' => 'rad.xray', 'label' => 'X-ray', 'amount_minor' => 8000, 'type' => 'imaging'],
['code' => 'rad.ultrasound', 'label' => 'Ultrasound', 'amount_minor' => 15000, 'type' => 'imaging'],
['code' => 'rad.ct', 'label' => 'CT scan', 'amount_minor' => 45000, 'type' => 'imaging'],
['code' => 'rad.mri', 'label' => 'MRI', 'amount_minor' => 65000, 'type' => 'imaging'],
['code' => 'rad.fluoro', 'label' => 'Fluoroscopy', 'amount_minor' => 20000, 'type' => 'imaging'],
['code' => 'rad.contrast', 'label' => 'Contrast administration', 'amount_minor' => 5000, 'type' => 'procedure'],
['code' => 'rad.report', 'label' => 'Radiology report', 'amount_minor' => 4000, 'type' => 'consultation'],
],
'workspace_tabs' => [
'overview' => 'Overview',
'request' => 'Imaging request',
'report' => 'Report',
'protocol' => 'Request / protocol',
'acquisition' => 'Acquisition',
'findings' => 'Findings / report',
'verification' => 'Verification',
'orders' => 'Orders',
'billing' => 'Billing',
'documents' => 'Documents',
],
'stage_tabs' => [
'check_in' => 'overview',
'protocol' => 'protocol',
'acquisition' => 'acquisition',
'reporting' => 'findings',
'verified' => 'verification',
'completed' => 'overview',
],
],
'cardiology' => [
'stages' => [
['code' => 'waiting', 'label' => 'Waiting', 'queue_point' => 'waiting'],
['code' => 'exam', 'label' => 'Cardiac exam', 'queue_point' => 'chair'],
['code' => 'check_in', 'label' => 'Check-in', 'queue_point' => 'waiting'],
['code' => 'history', 'label' => 'History', 'queue_point' => 'waiting'],
['code' => 'exam', 'label' => 'Exam / ECG', 'queue_point' => 'chair'],
['code' => 'investigation', 'label' => 'Investigations', 'queue_point' => 'chair'],
['code' => 'plan', 'label' => 'Diagnosis & plan', 'queue_point' => 'chair'],
['code' => 'procedure', 'label' => 'Procedure / intervention', 'queue_point' => 'chair'],
['code' => 'completed', 'label' => 'Completed', 'queue_point' => null],
],
'services' => [
['code' => 'car.consult', 'label' => 'Cardiology consultation', 'amount_minor' => 8000, 'type' => 'consultation'],
['code' => 'car.ecg', 'label' => 'ECG', 'amount_minor' => 5000, 'type' => 'procedure'],
['code' => 'car.echo', 'label' => 'Echocardiogram', 'amount_minor' => 25000, 'type' => 'imaging'],
['code' => 'car.stress', 'label' => 'Stress test', 'amount_minor' => 18000, 'type' => 'procedure'],
['code' => 'car.holter', 'label' => 'Holter monitoring', 'amount_minor' => 15000, 'type' => 'procedure'],
['code' => 'car.procedure', 'label' => 'Cardiac procedure', 'amount_minor' => 35000, 'type' => 'procedure'],
],
'workspace_tabs' => [
'overview' => 'Overview',
'exam' => 'Cardiac exam',
'clinical_notes' => 'Clinical notes',
'history' => 'History',
'exam' => 'Exam / ECG',
'investigations' => 'Investigations',
'plan' => 'Diagnosis & plan',
'procedures' => 'Procedures',
'orders' => 'Orders',
'billing' => 'Billing',
'documents' => 'Documents',
],
'stage_tabs' => [
'check_in' => 'overview',
'history' => 'history',
'exam' => 'exam',
'investigation' => 'investigations',
'plan' => 'plan',
'procedure' => 'procedures',
'completed' => 'overview',
],
],
'psychiatry' => [
'stages' => [
['code' => 'waiting', 'label' => 'Waiting', 'queue_point' => 'waiting'],
['code' => 'assessment', 'label' => 'Mental health assessment', 'queue_point' => 'chair'],
['code' => 'check_in', 'label' => 'Check-in', 'queue_point' => 'waiting'],
['code' => 'history', 'label' => 'History / MSE', 'queue_point' => 'waiting'],
['code' => 'risk', 'label' => 'Risk assessment', 'queue_point' => 'chair'],
['code' => 'formulation', 'label' => 'Formulation / plan', 'queue_point' => 'chair'],
['code' => 'review', 'label' => 'Follow-up review', 'queue_point' => 'chair'],
['code' => 'completed', 'label' => 'Completed', 'queue_point' => null],
],
'services' => [
['code' => 'psy.consult', 'label' => 'Psychiatry consultation', 'amount_minor' => 8000, 'type' => 'consultation'],
['code' => 'psy.mse', 'label' => 'Mental state examination', 'amount_minor' => 5000, 'type' => 'consultation'],
['code' => 'psy.risk', 'label' => 'Risk assessment', 'amount_minor' => 4500, 'type' => 'consultation'],
['code' => 'psy.followup', 'label' => 'Follow-up review', 'amount_minor' => 6000, 'type' => 'consultation'],
],
'workspace_tabs' => [
'overview' => 'Overview',
'assessment' => 'Assessment',
'clinical_notes' => 'Clinical notes',
'history' => 'History / MSE',
'risk' => 'Risk',
'plan' => 'Formulation / plan',
'followup' => 'Follow-up',
'orders' => 'Orders',
'billing' => 'Billing',
'documents' => 'Documents',
],
'stage_tabs' => [
'check_in' => 'overview',
'history' => 'history',
'risk' => 'risk',
'formulation' => 'plan',
'review' => 'followup',
'completed' => 'overview',
],
],
'pediatrics' => [
'stages' => [