# Worklog - HMS_CI4_OLD Date: 2026-02-08 ## Summary Ported OPD Charges, IPD Charges, and Package modules from CI3 to CI4 with consistent NiceAdmin UI, AJAX modal flows, Simple-DataTables, insurance rate handling, and print/Excel exports. ## OPD Charges - Controller: app/Controllers/Item.php - Model: app/Models/ItemModel.php - Routes: app/Config/Routes.php (group: item) - Views: app/Views/Setting/Charges/OPD_Charges/ - item_search_V.php (header buttons: Charge Groups, Add New Charge; filters; print/export) - item_search_adv.php (list partial with DataTable) - item_profile_V.php (modal edit; insurance rates; refresh list on update) - item_create_V.php - item_type_search_v.php / item_type_profile.php / item_type_create.php - item_item_list.php (print layout with heading, borders, base rate fallback) - item_item_excel.php (Excel export) - item_insurance_list.php (insurance rate table partial) - Model joins (no DB views): - items: hc_items + hc_item_type - insurance items: hc_items_insurance + hc_insurance, filter isdelete=0 - Print: insurance selection adds Amount + Code; missing insurance uses Base Rate - Excel: output via response headers (no debug toolbar injection) ## IPD Charges - Controller: app/Controllers/ItemIpd.php - Model: app/Models/ItemIpdModel.php - Routes: app/Config/Routes.php (groups: item-ipd + legacy Item_IPD) - Views: app/Views/Setting/Charges/IPD_Charges/ - item_search_V.php, item_search_adv.php - item_profile_V.php, item_create_V.php - item_type_search_v.php / item_type_profile.php / item_type_create.php - item_item_list.php (print) - item_item_excel.php (Excel) - item_insurance_list.php - Model joins (no DB views): - items: ipd_items + ipd_item_type - insurance items: ipd_items_insurance + hc_insurance, filter isdelete=0 ## Package (IPD Package) - Controller: app/Controllers/Package.php - Model: app/Models/PackageModel.php - Routes: app/Config/Routes.php (groups: package + legacy Package + legacy IPD_Package) - Views: app/Views/Setting/Charges/Package/ - item_search_V.php, item_search_adv.php - item_profile_V.php, item_create_V.php - item_type_search_v.php / item_type_profile.php / item_type_create.php - item_item_list.php (print) - item_item_excel.php (Excel) - item_insurance_list.php - Model joins (no DB views): - packages: package, package_group - insurance items: package_insurance + hc_insurance, filter isdelete=0 - Audit tables: package_update and package_insurance_update - If not present, audit insert skipped (prevents errors) ## UI + Behavior - Charges tiles updated: - setting/charges -> IPD tile uses item-ipd/search - setting/charges -> Package tile uses package/search - Modal edits refresh list: - OPD: window.refreshChargeList() - IPD: window.refreshChargeList() - Package: window.refreshPackageList() - Print buttons in header next to filter; export Excel added - Print layout: heading with group + insurance; no OPD/IPD or group columns; table borders - Base rate fallback: if insurance-specific rate missing, show base amount and Code column shows "Base Rate" ## Known Tables Used - OPD: hc_items, hc_item_type, hc_items_insurance, hc_items_update, hc_items_insurance_update - IPD: ipd_items, ipd_item_type, ipd_items_insurance, ipd_items_update, ipd_items_insurance_update - Package: package, package_group, package_insurance, package_update, package_insurance_update - Insurance: hc_insurance ## Notes for Next Session - If audit tables for Package are required, create migrations for package_update and package_insurance_update. - If isdelete column missing on insurance tables, remove filter. - Debug toolbar can break Excel; keep response headers to avoid injection. - Legacy routes are supported for old JS paths. --- Date: 2026-02-16 ## Diagnosis CI3 → CI4 Endpoint Mapping (Lab_Report parity) ### Fully mapped in CI4 - `lab_master` → `Diagnosis::labMaster` via `Lab_Report/lab_master` - `lab_path/{lab_type}` → `Diagnosis::labPathLegacy` via `Lab_Report/lab_path/(:num)` - `search_lab_4/{lab_type}` → `Diagnosis::searchLab` via `Lab_Report/search_lab_4/(:num)` - `search_lab_4_srno/{lab_type}` → `Diagnosis::searchLabBySrno` via `Lab_Report/search_lab_4_srno/(:num)` - `search_lab_4_labno/{lab_type}` → `Diagnosis::searchLabByLabno` via `Lab_Report/search_lab_4_labno/(:num)` - `select_lab_invoice/{inv_id}/{lab_type}` → `Diagnosis::selectLabInvoicePath` - `select_lab_invoice_path/{inv_id}/{lab_type}` → `Diagnosis::selectLabInvoicePath` - `lab_date_show/{inv_id}/{lab_type}` → `Diagnosis::labDateShow` - `test_list/{inv_id}/{lab_type}` → `Diagnosis::testList` - `xray_test_list/{inv_id}/{lab_type}` → `Diagnosis::testList` - `lab_tab_1_process/{test_id}/{lab_type}` → `Diagnosis::labTab1Process` - `create_report_xray/{req_id}` → `Diagnosis::createReportXray` - `show_report_final/{req_id}` → `Diagnosis::showReportFinalXray` - `get_template_xray/{id}` → `Diagnosis::getTemplateXray` - `Final_Update_xray/{req_id}` → `Diagnosis::finalUpdateXray` - `confirm_report_xray/{req_id}` → `Diagnosis::confirmReportXray` ### Missing legacy endpoints (not yet mapped) - `report_file_list/{inv_id}/{lab_type}/{delete?}` - `select_lab_radiology/{inv_id}/{lab_type}` ### Notes - Current CI4 radiology flow uses `Diagnosis::selectLabInvoicePath` for detail screen and does not require a separate `select_lab_radiology` endpoint in active views. - File upload/list actions in CI4 diagnosis view are currently placeholders (`uploadFiles`, `showFiles`) and do not yet have controller endpoints. ## Future Backlog: AI-assisted Image Diagnosis (Ultrasound / X-Ray / CT) ### Goal - Add a professional image workspace where users can upload/scan images, review them, run AI-assisted analysis, and move AI draft findings into radiology report editor with doctor review. ### Phase 1 (MVP - internal) - Build one modal workspace in diagnosis detail screen: - Left panel: image preview, next/previous, zoom. - Right panel: AI findings, AI impression, confidence, doctor editable text. - Wire existing action buttons: - Upload Files -> open workspace + upload image. - Scan -> open workspace + scan image flow. - Show Files -> list previously uploaded/scanned images. - Add backend APIs in Diagnosis controller: - uploadImage(reqId) - listImages(reqId) - scanImage(reqId) - analyzeImageAi(reqId, fileId) - saveAiDraft(reqId, fileId) - acceptAiToReport(reqId) - Add DB table for AI result tracking (suggested: diagnosis_image_ai): - id, req_id, file_id, ai_findings, ai_impression, confidence, - model_name, model_version, status, reviewed_by, reviewed_at, - created_at, updated_at. - Add visible safety label: AI Suggestion - Doctor Review Required. ### Phase 2 (real AI integration) - Integrate external AI service endpoint (Python/FastAPI or equivalent). - Send selected image path to AI service and store structured response. - Add timeout/error handling and retry button in UI. ### Phase 3 (clinical workflow hardening) - Add audit trail for accepted/edited AI content before final report verify. - Add role check so only authorized users can accept AI output. - Keep final confirm manual; AI never auto-verifies reports. ### UI/Workflow Notes - AI output should prefill radiology editor, not directly replace final report. - Show per-image history for repeat review and comparison. - Keep terminology consistent with current imaging workflow labels. --- Date: 2026-02-16 ## Pharmacy Module Kickoff (Legacy Medical) ### What was verified - Legacy pharmacy dashboard source is in old code: - `old_code_ci3/views/Medical/Dashboard.php` - Main legacy pharmacy controller is very large and feature-rich: - `old_code_ci3/controllers/Medical.php` (~5k lines) - Related legacy controllers: - `old_code_ci3/controllers/Medical_backpanel.php` - `old_code_ci3/controllers/Medical_Report.php` - `old_code_ci3/controllers/Medical_Print.php` - `old_code_ci3/controllers/Payment_Medical.php` ### Important routing finding - Current CI4 improved auto-routing is disabled (`app/Config/Routing.php` has `autoRoute = false`). - No explicit CI4 `/Medical` routes found in `app/Config/Routes.php`. - No current CI4 Medical controller files found under `app/Controllers`. ### Legacy dashboard button map (from old Dashboard.php) - OPD Sale -> `/Medical/search_customer` - Invoice -> `/Medical/Invoice_Med_Draft` - IPD/Credit -> `/Medical/list_org_ipd` - Org. Credit -> `/Medical/list_org` - Return Counter Sale -> `/Medical/Invoice_Med_Return` - Day Report -> `/Medical_Report/Report_2` - Sale Day Report -> `/Medical_Report/Report_1` - Payment Report -> `/Medical_Report/Report_Payment_Recieved` - Store Stock -> `/Medical_backpanel/store_stock` - Store Main -> `/Medical/main_store` - Master -> `/Medical_backpanel` ### Suggested migration order (phase wise) 1. Dashboard + navigation tiles. 2. OPD Sale + Invoice Draft list. 3. Return invoice flow. 4. Store stock and stock statement. 5. Reports (day/sale/payment). 6. Backpanel master screens. ### SQL views received from user (confirmed) - `v_med_item_return` - `v_med_item_with_return` - `v_ipd_list` - `v_med_short_list` - `v_product_stock` - `v_product_stock_sub` - `v_sale_item` - `v_sale_item_sub` ### Dependency note - `v_ipd_list` depends on `v_ipd_doc_list` (seen in view body join). - Before CI4 pharmacy migration, ensure `v_ipd_doc_list` exists in target DB with compatible schema. ### Next implementation start point - Begin CI4 Pharmacy phase-1 with dashboard route/controller/view parity for `/Medical` tiles, then wire OPD Sale + Draft Invoice list endpoints. ### Phase-1 implementation done (CI4) - Added controller: app/Controllers/Medical.php - Added routes: - Medical - Medical/search_customer - Medical/Invoice_Med_Draft - Medical/Invoice_Med_Return - Medical/list_org_ipd - Medical/list_org - Medical/main_store - Medical/store_stock - Medical/master - Added views: - app/Views/medical/dashboard.php - app/Views/medical/search_customer.php - app/Views/medical/invoice_med_draft.php - app/Views/medical/placeholder.php - Status: - Dashboard works at /Medical. - OPD Sale and Invoice Draft panels are functional. - Remaining tiles currently show migration placeholder pending deeper CI3 parity port. --- Date: 2026-02-19 ## Pharmacy -> Master continuation ### Fix completed - Module: `Drug Sale Customer Wise Report` - Endpoint: `Medical::drug_patient_distribute` - Root-cause fixed in `getDrugPatientDistributeRows()`: - Legacy behavior: when Drug Name is blank and Schedule filter is blank, show all matching date-range records. - CI4 regression: returned empty result unless at least one schedule was selected. - Fix: schedule condition is now applied only when schedules are selected; blank schedule no longer forces empty result. ### Validation - `php -l app/Controllers/Medical.php` passed (no syntax errors). ### Step done: Med. Payment Edit Logs (legacy links) - Implemented legacy page endpoint: `Payment_Medical/payment_log` - Implemented legacy result endpoint: `Payment_Medical/payment_log_data` - Added CI4 controller methods in `app/Controllers/Payment_Medical.php`: - `payment_log()` for filter page - `payment_log_data()` for date-range log result table - Added CI4 views: - `app/Views/medical/payment_log.php` - `app/Views/medical/payment_log_data.php` - Updated routes in `app/Config/Routes.php`: - `GET Payment_Medical/payment_log -> Payment_Medical::payment_log` - `GET|POST Payment_Medical/payment_log_data -> Payment_Medical::payment_log_data` - Updated Master menu link in `app/Views/medical/master.php`: - `Med. Payment Edit Logs` now opens `Payment_Medical/payment_log` ### Step fix: Med. Payment Edit action buttons not working - Root cause: `payment_edit` HTML was injected using `innerHTML` in `payment_search`, so inline `