Add full Vaccination, Pathology, and Infusion specialty clinical suites.
Deploy Ladill Care / deploy (push) Successful in 34s

Mirror Oncology-depth stage flows, workspace controllers, clinical forms, reports/print, demo seed, and suite tests. Pathology stays clinic specialty complementary to the Lab app.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-19 21:39:15 +00:00
co-authored by Cursor
parent b7e5a7d9ad
commit 7b722c71d0
34 changed files with 3508 additions and 24 deletions
+80 -10
View File
@@ -108,16 +108,23 @@ return [
'postop' => 'surg_postop',
],
'vaccination' => [
'screening' => 'vax_screening',
'administration' => 'vax_admin',
'eligibility' => 'vax_eligibility',
'consent' => 'vax_consent',
'administer' => 'vax_admin',
'observation' => 'vax_observation',
],
'pathology' => [
'request' => 'path_request',
'specimen' => 'path_specimen',
'processing' => 'path_processing',
'report' => 'path_report',
'verification' => 'path_verification',
],
'infusion' => [
'assessment' => 'infusion_assessment',
'protocol' => 'infusion_protocol',
'session' => 'infusion_session',
'clinical_notes' => 'clinical_note',
'monitoring' => 'infusion_monitoring',
],
'dermatology' => [
'exam' => 'skin_exam',
@@ -759,14 +766,25 @@ return [
],
],
'vaccination' => [
'vax_screening' => [
['name' => 'vaccine', 'label' => 'Vaccine', 'type' => 'text', 'required' => true],
'vax_eligibility' => [
['name' => 'vaccine', 'label' => 'Vaccine requested', 'type' => 'text', 'required' => true],
['name' => 'schedule', 'label' => 'Schedule / indication', 'type' => 'select', 'options' => ['Routine EPI', 'Catch-up', 'Travel', 'Occupational', 'Campaign', 'Other']],
['name' => 'prior_doses', 'label' => 'Prior doses / history', 'type' => 'textarea', 'rows' => 2],
['name' => 'indications', 'label' => 'Indications', 'type' => 'textarea', 'rows' => 2],
['name' => 'contraindications', 'label' => 'Contraindications checked', 'type' => 'boolean', 'required' => true],
['name' => 'allergy_history', 'label' => 'Allergy / prior reaction', 'type' => 'textarea', 'rows' => 2],
['name' => 'fever_today', 'label' => 'Fever today', 'type' => 'boolean'],
['name' => 'pregnancy', 'label' => 'Pregnant / breastfeeding', 'type' => 'boolean'],
['name' => 'cleared', 'label' => 'Cleared to vaccinate', 'type' => 'boolean', 'required' => true],
],
'vax_consent' => [
['name' => 'information_given', 'label' => 'Information given', 'type' => 'boolean', 'required' => true],
['name' => 'consent_obtained', 'label' => 'Consent obtained', 'type' => 'boolean', 'required' => true],
['name' => 'consent_type', 'label' => 'Consent type', 'type' => 'select', 'options' => ['Verbal', 'Written', 'Guardian', 'Implied']],
['name' => 'consented_by', 'label' => 'Consented by', 'type' => 'text'],
['name' => 'risks_discussed', 'label' => 'Risks / AEFI discussed', 'type' => 'boolean'],
['name' => 'notes', 'label' => 'Consent notes', 'type' => 'textarea', 'rows' => 2],
],
'vax_admin' => [
['name' => 'vaccine', 'label' => 'Vaccine administered', 'type' => 'text', 'required' => true],
['name' => 'dose', 'label' => 'Dose / antigen', 'type' => 'text'],
@@ -774,8 +792,18 @@ return [
['name' => 'batch', 'label' => 'Batch / lot number', 'type' => 'text', 'required' => true],
['name' => 'expiry', 'label' => 'Expiry date', 'type' => 'text'],
['name' => 'route', 'label' => 'Route', 'type' => 'select', 'options' => ['IM', 'SC', 'ID', 'Oral', 'Nasal']],
['name' => 'administered_by', 'label' => 'Administered by', 'type' => 'text'],
['name' => 'adverse_events', 'label' => 'Immediate adverse events', 'type' => 'textarea', 'rows' => 2],
['name' => 'next_due', 'label' => 'Next dose due', 'type' => 'text'],
['name' => 'outcome', 'label' => 'Administration outcome', 'type' => 'select', 'required' => true, 'options' => ['Completed — observe', 'Deferred', 'Refused', 'Incomplete']],
],
'vax_observation' => [
['name' => 'observation_minutes', 'label' => 'Observation minutes', 'type' => 'number'],
['name' => 'vitals', 'label' => 'Vitals / condition', 'type' => 'textarea', 'rows' => 2],
['name' => 'aefi', 'label' => 'AEFI', 'type' => 'select', 'options' => ['None', 'Mild', 'Moderate', 'Severe — escalate']],
['name' => 'aefi_details', 'label' => 'AEFI details / actions', 'type' => 'textarea', 'rows' => 2],
['name' => 'advice', 'label' => 'Home advice', 'type' => 'textarea', 'rows' => 2],
['name' => 'outcome', 'label' => 'Disposition', 'type' => 'select', 'required' => true, 'options' => ['Completed — discharged', 'Completed — AEFI follow-up', 'Escalated', 'In progress']],
],
],
'pathology' => [
@@ -785,15 +813,55 @@ return [
['name' => 'clinical_history', 'label' => 'Clinical history', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'urgency', 'label' => 'Urgency', 'type' => 'select', 'options' => ['Routine', 'Urgent', 'Intra-op']],
['name' => 'tests_requested', 'label' => 'Tests requested', 'type' => 'textarea', 'rows' => 2],
['name' => 'requesting_clinician', 'label' => 'Requesting clinician', 'type' => 'text'],
],
'path_specimen' => [
['name' => 'received_at', 'label' => 'Received at', 'type' => 'text'],
['name' => 'container_label', 'label' => 'Container / accession label', 'type' => 'text', 'required' => true],
['name' => 'adequacy', 'label' => 'Specimen adequacy', 'type' => 'select', 'options' => ['Adequate', 'Suboptimal', 'Inadequate']],
['name' => 'fixative', 'label' => 'Fixative / medium', 'type' => 'text'],
['name' => 'notes', 'label' => 'Receipt notes', 'type' => 'textarea', 'rows' => 2],
],
'path_processing' => [
['name' => 'gross', 'label' => 'Gross description', 'type' => 'textarea', 'rows' => 3],
['name' => 'blocks', 'label' => 'Blocks / slides', 'type' => 'text'],
['name' => 'stains', 'label' => 'Stains / techniques', 'type' => 'textarea', 'rows' => 2],
['name' => 'status', 'label' => 'Processing status', 'type' => 'select', 'required' => true, 'options' => ['In process', 'Ready for reporting', 'Hold — missing info']],
['name' => 'notes', 'label' => 'Processing notes', 'type' => 'textarea', 'rows' => 2],
],
'path_report' => [
['name' => 'gross', 'label' => 'Gross description', 'type' => 'textarea', 'rows' => 3],
['name' => 'microscopy', 'label' => 'Microscopy', 'type' => 'textarea', 'required' => true, 'rows' => 4],
['name' => 'diagnosis', 'label' => 'Diagnosis', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'comment', 'label' => 'Comment', 'type' => 'textarea', 'rows' => 2],
['name' => 'reported_by', 'label' => 'Reported by', 'type' => 'text'],
],
'path_verification' => [
['name' => 'verified', 'label' => 'Report verified', 'type' => 'boolean', 'required' => true],
['name' => 'verified_by', 'label' => 'Verified by', 'type' => 'text'],
['name' => 'amendments', 'label' => 'Amendments', 'type' => 'textarea', 'rows' => 2],
['name' => 'released', 'label' => 'Released to clinician', 'type' => 'boolean'],
['name' => 'outcome', 'label' => 'Verification outcome', 'type' => 'select', 'required' => true, 'options' => ['Completed — released', 'Completed — amended', 'Hold', 'In progress']],
],
],
'infusion' => [
'infusion_assessment' => [
['name' => 'indication', 'label' => 'Indication', 'type' => 'text', 'required' => true],
['name' => 'history', 'label' => 'Relevant history', 'type' => 'textarea', 'required' => true, 'rows' => 3],
['name' => 'allergies', 'label' => 'Allergies', 'type' => 'textarea', 'rows' => 2],
['name' => 'baseline_vitals', 'label' => 'Baseline vitals', 'type' => 'textarea', 'rows' => 2],
['name' => 'access_plan', 'label' => 'IV access plan', 'type' => 'text'],
['name' => 'fit_for_infusion', 'label' => 'Fit for infusion', 'type' => 'boolean', 'required' => true],
],
'infusion_protocol' => [
['name' => 'medication', 'label' => 'Medication / regimen', 'type' => 'text', 'required' => true],
['name' => 'dose', 'label' => 'Dose', 'type' => 'text', 'required' => true],
['name' => 'diluent', 'label' => 'Diluent / volume', 'type' => 'text'],
['name' => 'rate', 'label' => 'Ordered rate', 'type' => 'text'],
['name' => 'duration', 'label' => 'Expected duration', 'type' => 'text'],
['name' => 'premeds', 'label' => 'Premedications', 'type' => 'textarea', 'rows' => 2],
['name' => 'ordered_by', 'label' => 'Ordered by', 'type' => 'text'],
],
'infusion_session' => [
['name' => 'medication', 'label' => 'Medication / regimen', 'type' => 'text', 'required' => true],
['name' => 'dose', 'label' => 'Dose', 'type' => 'text'],
@@ -804,12 +872,14 @@ return [
['name' => 'vitals', 'label' => 'Vitals during infusion', 'type' => 'textarea', 'rows' => 2],
['name' => 'reactions', 'label' => 'Reactions / interventions', 'type' => 'textarea', 'rows' => 2],
['name' => 'notes', 'label' => 'Session notes', 'type' => 'textarea', 'required' => true, 'rows' => 2],
['name' => 'outcome', 'label' => 'Session outcome', 'type' => 'select', 'options' => ['In progress', 'Completed — observe', 'Stopped — reaction', 'Deferred']],
],
'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],
'infusion_monitoring' => [
['name' => 'post_vitals', 'label' => 'Post-infusion vitals', 'type' => 'textarea', 'rows' => 2],
['name' => 'reaction', 'label' => 'Delayed reaction', 'type' => 'select', 'options' => ['None', 'Mild', 'Moderate', 'Severe']],
['name' => 'interventions', 'label' => 'Interventions', 'type' => 'textarea', 'rows' => 2],
['name' => 'advice', 'label' => 'Discharge advice', 'type' => 'textarea', 'rows' => 2],
['name' => 'outcome', 'label' => 'Disposition', 'type' => 'select', 'required' => true, 'options' => ['Completed — discharged', 'Completed — admit / escalate', 'In progress']],
],
],
'dermatology' => [
+3 -1
View File
@@ -265,10 +265,11 @@ return [
'queue_keywords' => ['vaccin', 'immun', 'epi', 'injection'],
'access' => 'general',
'roles' => ['doctor', 'nurse', 'receptionist'],
'specialist_keywords' => ['vaccin', 'immun', 'epi'],
],
'pathology' => [
'label' => 'Pathology',
'description' => 'Histopathology, cytology, and pathology service counters.',
'description' => 'Clinic histopathology and cytology specialty flow (complementary to the Lab app queue).',
'department_type' => 'pathology',
'department_name' => 'Pathology',
'queue_name' => 'Pathology',
@@ -292,6 +293,7 @@ return [
'queue_keywords' => ['infusion', 'iv', 'drip', 'day care'],
'access' => 'general',
'roles' => ['doctor', 'nurse', 'pharmacist', 'receptionist'],
'specialist_keywords' => ['infusion', 'iv therapy', 'day care'],
],
'dermatology' => [
'label' => 'Dermatology',
+57 -12
View File
@@ -624,59 +624,104 @@ return [
],
'vaccination' => [
'stages' => [
['code' => 'waiting', 'label' => 'Waiting', 'queue_point' => 'waiting'],
['code' => 'screening', 'label' => 'Screening', 'queue_point' => 'chair'],
['code' => 'vaccinate', 'label' => 'Vaccination', 'queue_point' => 'chair'],
['code' => 'check_in', 'label' => 'Check-in', 'queue_point' => 'waiting'],
['code' => 'eligibility', 'label' => 'History / eligibility', 'queue_point' => 'chair'],
['code' => 'consent', 'label' => 'Consent', 'queue_point' => 'chair'],
['code' => 'administer', 'label' => 'Administer', 'queue_point' => 'chair'],
['code' => 'observation', 'label' => 'Observation / AEFI', 'queue_point' => 'obs'],
['code' => 'completed', 'label' => 'Completed', 'queue_point' => null],
],
'services' => [
['code' => 'vax.consult', 'label' => 'Immunization counselling', 'amount_minor' => 2000, 'type' => 'consultation'],
['code' => 'vax.admin', 'label' => 'Vaccine administration', 'amount_minor' => 3000, 'type' => 'procedure'],
['code' => 'vax.travel', 'label' => 'Travel vaccine package', 'amount_minor' => 8000, 'type' => 'procedure'],
],
'workspace_tabs' => [
'overview' => 'Overview',
'screening' => 'Screening',
'administration' => 'Administration',
'eligibility' => 'History / eligibility',
'consent' => 'Consent',
'administer' => 'Administer',
'observation' => 'Observation / AEFI',
'orders' => 'Orders',
'billing' => 'Billing',
'documents' => 'Documents',
],
'stage_tabs' => [
'check_in' => 'overview',
'eligibility' => 'eligibility',
'consent' => 'consent',
'administer' => 'administer',
'observation' => 'observation',
'completed' => 'overview',
],
],
'pathology' => [
'stages' => [
['code' => 'request', 'label' => 'Specimen received', 'queue_point' => 'waiting'],
['code' => 'check_in', 'label' => 'Check-in', 'queue_point' => 'waiting'],
['code' => 'request', 'label' => 'Request', 'queue_point' => 'waiting'],
['code' => 'specimen', 'label' => 'Specimen', 'queue_point' => 'lab'],
['code' => 'processing', 'label' => 'Processing', 'queue_point' => 'lab'],
['code' => 'reporting', 'label' => 'Reporting', 'queue_point' => 'lab'],
['code' => 'report', 'label' => 'Report', 'queue_point' => 'lab'],
['code' => 'verified', 'label' => 'Verified', 'queue_point' => 'lab'],
['code' => 'completed', 'label' => 'Completed', 'queue_point' => null],
],
'services' => [
['code' => 'path.histo', 'label' => 'Histopathology', 'amount_minor' => 20000, 'type' => 'lab'],
['code' => 'path.cyto', 'label' => 'Cytology', 'amount_minor' => 15000, 'type' => 'lab'],
['code' => 'path.special', 'label' => 'Special stains / IHC', 'amount_minor' => 25000, 'type' => 'lab'],
],
'workspace_tabs' => [
'overview' => 'Overview',
'request' => 'Specimen request',
'request' => 'Request',
'specimen' => 'Specimen',
'processing' => 'Processing',
'report' => 'Report',
'verification' => 'Verification',
'billing' => 'Billing',
'documents' => 'Documents',
],
'stage_tabs' => [
'check_in' => 'overview',
'request' => 'request',
'specimen' => 'specimen',
'processing' => 'processing',
'report' => 'report',
'verified' => 'verification',
'completed' => 'overview',
],
],
'infusion' => [
'stages' => [
['code' => 'waiting', 'label' => 'Waiting', 'queue_point' => 'waiting'],
['code' => 'infusion', 'label' => 'Infusion', 'queue_point' => 'chair'],
['code' => 'observation', 'label' => 'Observation', 'queue_point' => 'obs'],
['code' => 'check_in', 'label' => 'Check-in', 'queue_point' => 'waiting'],
['code' => 'assessment', 'label' => 'Assessment', 'queue_point' => 'chair'],
['code' => 'protocol', 'label' => 'Order / protocol', 'queue_point' => 'chair'],
['code' => 'session', 'label' => 'Infusion session', 'queue_point' => 'chair'],
['code' => 'monitoring', 'label' => 'Monitoring', 'queue_point' => 'obs'],
['code' => 'completed', 'label' => 'Completed', 'queue_point' => null],
],
'services' => [
['code' => 'inf.assess', 'label' => 'Infusion assessment', 'amount_minor' => 4000, 'type' => 'consultation'],
['code' => 'inf.session', 'label' => 'Infusion session', 'amount_minor' => 15000, 'type' => 'procedure'],
['code' => 'inf.observe', 'label' => 'Post-infusion observation', 'amount_minor' => 3000, 'type' => 'misc'],
],
'workspace_tabs' => [
'overview' => 'Overview',
'assessment' => 'Assessment',
'protocol' => 'Protocol / order',
'session' => 'Infusion session',
'clinical_notes' => 'Clinical notes',
'monitoring' => 'Monitoring',
'orders' => 'Orders',
'billing' => 'Billing',
'documents' => 'Documents',
],
'stage_tabs' => [
'check_in' => 'overview',
'assessment' => 'assessment',
'protocol' => 'protocol',
'session' => 'session',
'monitoring' => 'monitoring',
'completed' => 'overview',
],
],
'dermatology' => [
'stages' => [