Commit Graph

579 Commits

Author SHA1 Message Date
16348d12db Fix placeholder tokens: DISCHARGE_SUMMARY, DOCTOR_NAMES, DEPARTMENT
- Add 'Discharge Summary' section to buildAutoDischargeContent with department, doctors, and dates so {{DISCHARGE_SUMMARY}} token extracts properly
- Improve getDischargeDepartmentName to support dept_id, department_id fields and check both hc_department and ipd_department tables
- Improve getDischargeDoctorNames to fallback to doctor_id, doc_id, consultant_id if doc_list is empty
- Update DISCHARGE_TEMPLATE_TOKENS.md to clarify what {{DISCHARGE_SUMMARY}} contains
- Clear cached content for IPD 1 to regenerate with new logic

Fixes issue where {{DISCHARGE_SUMMARY}}, {{DOCTOR_NAMES}}, {{DEPARTMENT}} tokens were not working (replaced with empty values)
2026-06-06 13:00:52 +05:30
1da16a54d6 Fix CKEditor initialization issues in discharge template editor
Fixed the error: Uncaught TypeError: can't access property 'getElementsByTag', b is null

Root Cause:
- CKEditor was not properly destroyed before reinitialization
- No error handling for editor state transitions
- Missing timing delays for DOM readiness when loaded via AJAX
- Inconsistent checking for CKEditor availability

Improvements:
1. Safe destroy pattern - wrap destroy() in try-catch to handle state issues
2. Added typeof check for CKEDITOR instead of window.CKEDITOR
3. Added 100ms setTimeout delay before CKEDITOR.replace() to ensure cleanup
4. Added 150ms delay for initial editor load (especially for AJAX loads)
5. Wrapped all setData() calls in try-catch with textarea fallback
6. Added console warnings for debugging instead of silent failures
7. Check document.readyState before initialization
8. Re-initialize editor check after AJAX template load
9. Added element existence validation before replace()

Changes follow the working pattern from:
- app/Views/PathLab_Report/ultrasound_report_edit.php (safeReplace pattern)
- app/Views/diagnosis/lab_final_report_editor.php (typeof checks)

This ensures the editor works properly when:
- Page loads normally
- Page loads via AJAX (load_form_div)
- User switches between templates using Edit button
- User cancels edit and resets form

Tested scenarios:
- Initial page load
- Edit template -> load data -> CKEditor shows content
- Cancel -> CKEditor resets
- Multiple edit/cancel cycles
2026-06-06 12:51:21 +05:30
860981a85a Update discharge template design page with complete placeholder list
Updated /setting/template/discharge_templates view to show all available placeholders
organized by 5 categories as per user requirements:

1. Hospital Information (11 tokens)
   - H_Name, H_address_1, H_address_2, H_phone_No, H_Email, H_logo, H_logo_abs
   - hospital_name, hospital_address, hospital_phone, hospital_email

2. Patient Information (9 tokens)
   - PATIENT_NAME, UHID, IPD_CODE, AGE_GENDER, GUARDIAN, GUARDIAN_RELATION,
     GUARDIAN_NAME, PATIENT_ADDRESS
   - NEW: PATIENT_PHONE ✨

3. IPD Information (13 tokens)
   - DEPARTMENT, ADMIT_DATE, DISCHARGE_DATE, ADMIT_DATE_ONLY, DISCHARGE_DATE_ONLY,
     ADMISSION_TIME, DISCHARGE_TIME, ADMIT_TIME, ISDELIVERY
   - NEW: INSURANCE_COMPANY ✨, DOCTOR_NAMES ✨, DOCTOR_NAME ✨

4. IPD Discharge Content (19 tokens)
   - CONTENT (all sections combined)
   - PATIENT_INFO_TABLE (pre-built patient demographic table)
   - Section placeholders: DISCHARGE_SUMMARY, FINAL_DIAGNOSIS, SURGERY, PROCEDURE,
     PERSONAL_HISTORY, PRESENTING_COMPLAINTS, PAIN_MEASUREMENT_SCALE,
     GENERAL_EXAM_ADMISSION, CLINICAL_INVESTIGATION_REPORTS, COURSE_IN_HOSPITAL,
     EXAMINATION_ON_DISCHARGE, DRUG_ALLERGY_ADR, CO_MORBIDITIES,
     DISCHARGE_MEDICATIONS, DIETARY_ADVICE, DISCHARGE_INSTRUCTIONS, SIGNATURE_BLOCK

5. Common/Meta (2 tokens)
   - CURRENT_DATE, PRINT_TIME

UI improvements:
- Clear category headers with numbers
- Highlighted new tokens with ✨ sparkle
- Added helpful notes (case-insensitive, auto-hide empty values)
- Better visual organization with line breaks between categories

This makes it easy for users to find and use the correct placeholders when
designing discharge templates.
2026-06-06 12:35:29 +05:30
3ad0025c24 Add new discharge template tokens: PATIENT_PHONE, INSURANCE_COMPANY, DOCTOR_NAMES
New placeholders added:

1. PATIENT_PHONE - Patient's phone number from patient_master.mphone1 or ipd_master.P_mobile1
   Example: 9876543210

2. INSURANCE_COMPANY - Insurance company name from ipd_master.ins_short_name or ins_company_name
   Example: Star Health Insurance
   Default: 'Direct' if no insurance

3. DOCTOR_NAMES / DOCTOR_NAME - Comma-separated list of treating doctors with specialties
   Example: Dr. Rajesh Kumar [General Medicine], Dr. Priya Sharma [Cardiology]
   Reads from ipd_master.doc_list field and joins with doctor_master and med_spec tables

Changes:
- Added getDischargeDoctorNames() helper function
- Updated buildDischargeSummaryTokenVars() to include three new tokens
- Updated DISCHARGE_TEMPLATE_GUIDE.md with new token documentation
- Added example template showing usage of new tokens
- Updated CI3 to CI4 migration mapping table

These tokens match the data shown in the auto-generated patient summary table
and allow templates to display this information in custom layouts.
2026-06-06 12:21:37 +05:30
6d72a5ec04 Correct fix: Remove patient table from auto-generated content, add as token
OLD CI3 BEHAVIOR (correct):
- Patient demographic table was IN the template file
- Content variables contained ONLY clinical sections
- Template controlled entire layout

NEW CI4 FIX (matching CI3):
- Patient table removed from buildAutoDischargeContent completely
- Added {{PATIENT_INFO_TABLE}} token for templates to use if needed
- Auto-generated content now contains ONLY clinical sections
- Blank template = blank output (no patient table forced)
- Templates can add patient table using token or individual tokens

Changes:
- Removed includeSummaryTable parameter from buildAutoDischargeContent
- Removed templateHasDemographicTokens helper (no longer needed)
- Added PATIENT_INFO_TABLE token in buildDischargeTemplateTokenVars
- Simplified show_discharge and preview_discharge_report (no template detection)
- Added comment explaining CI3 compatibility

This matches the old CI3 chamunda_discharge_template_html.php pattern where:
- Template had hardcoded patient table structure
- Variables like \, \ were injected
- Content did NOT include patient demographics by default
2026-06-06 12:09:57 +05:30
224ac5613c Fix: Skip auto-generated patient info table when template has demographic tokens
- Modified buildAutoDischargeContent to accept includeSummaryTable parameter
- Added templateHasDemographicTokens helper to detect if template has patient info tokens
- Updated show_discharge and preview_discharge_report to check template before auto-generation
- When template has {{PATIENT_NAME}}, {{UHID}}, etc., skip auto-summary table
- Added clear_discharge_content.php script to clear cached content for regeneration
- Solves issue where blank templates still showed patient information table
2026-06-06 11:49:52 +05:30
aa812354a6 Change mPDF default font from thin dejavusans to medium-weight freeserif for better Hindi/Devanagari rendering
- Updated all controllers: Opd, Diagnosis, Billing\Charges, Billing\Ipd, Storestock, AbdmGateway
- freeserif provides better Unicode coverage and more readable font weight
- Ipd_discharge and DoctorDocument already used good fonts (freeserif/freesans)
- Added comprehensive font configuration documentation
2026-06-06 11:19:35 +05:30
b5cfedec96 Make quick-add modal larger (modal-lg) for better UX
IMPROVEMENT: Increased modal size for better readability

Changed modal-dialog from default to modal-lg
- Provides more space for SNOMED CT and ICD code fields
- Better readability for field labels and help text
- More comfortable data entry experience
- Consistent with other modals in the system
2026-06-06 06:58:38 +05:30
38e06ed1d7 Add 'Save in Master' quick-add for Course/Treatment section
FEATURE: Quick-add functionality for Course/Treatment master terms

NEW COMPONENTS:
1. Course master table: ipd_discharge_course_master
   - term_name, term_code, icd_code, is_active
   - Auto-creates on first use
2. Controller endpoints in Ipd_discharge.php:
   - course_master_lookup() - AJAX autocomplete search
   - course_master_list() - Full list with filters
   - course_master_save() - Create/update records
   - course_master_delete() - Remove records
3. Routes added to Config/Routes.php:
   - Ipd_discharge/course_master_lookup (GET)
   - Ipd_discharge/course_master_list (GET)
   - Ipd_discharge/course_master_save (POST)
   - Ipd_discharge/course_master_delete (POST)

VIEW CHANGES (discharge_create.php):
- Course input now uses input-group layout
- Green 'Save in Master' button added
- Custom dropdown for autocomplete with code badges
- Hidden field: new_course_master_id
- JavaScript: initCourseAutocomplete() function
- Integrated with existing quickAddTermModal

QUICK-ADD MODAL ENHANCEMENT:
- Now supports 3 types: surgery, procedure, course
- Dynamic endpoint selection based on type
- Course type uses course_master_save endpoint
- Auto-populates course input and master_id on save

AUTOCOMPLETE FEATURES:
- Type 2+ characters → searches course_master table
- Dropdown shows: Name + SNOMED/ICD code badges
- Arrow key navigation (Up/Down/Enter/Escape)
- Click or Enter to select
- Hover highlighting with visual feedback
- 300ms debounce for performance

WORKFLOW:
1. Type course/treatment name
2. See dropdown with existing terms (if any)
3. Click 'Save in Master' to add new term
4. Modal opens with name pre-filled
5. Enter SNOMED/ICD codes (optional)
6. Save → Auto-populates input + master_id
7. Click '+ADD Row' to add to discharge

BENEFITS:
- Consistent UI across Surgery/Procedure/Course sections
- Fast term entry without leaving form
- Master library builds during workflow
- ABDM compliance with code support
- Reusable terms across discharges
2026-06-06 06:53:27 +05:30
b0b09bc2bf Add 'Save in Master' quick-add buttons for Surgery/Procedure
FEATURE: Quick-add functionality for Surgery and Procedure master terms

NEW COMPONENTS:
1. 'Save in Master' buttons next to Surgery/Procedure inputs
2. Quick-add modal with SNOMED CT and ICD code fields
3. Instant save without opening full Master CRUD modal
4. Auto-populate input and master_id after save

UI CHANGES:
- Surgery/Procedure inputs now use input-group layout
- Green 'Save in Master' button with plus-circle icon
- Quick-add modal opens when clicking button
- Name field auto-filled from input (read-only in modal)
- Optional SNOMED CT code and ICD code fields
- Success message shown before auto-close

WORKFLOW:
1. User types new surgery/procedure name in input
2. Click 'Save in Master' button
3. Modal opens with name pre-filled
4. Enter SNOMED/ICD codes (optional)
5. Click 'Save in Master' in modal
6. Record saves to ipd_discharge_surgery_master table
7. Input filled with saved name
8. master_id hidden field populated
9. Modal closes automatically
10. User can now click '+ADD Row' to add to discharge

BENEFITS:
- No need to open full Master CRUD modal for quick adds
- SNOMED/ICD codes can be added during workflow
- Faster data entry for new terms
- Master table stays organized and updated
- ABDM compliance maintained with code support
2026-06-06 06:38:49 +05:30
5dccbc8d12 Complete Surgery/Procedure autocomplete implementation and testing docs
COMPLETED ALL TODO ITEMS:

✅ Task 1: Enhanced Surgery autocomplete with SNOMED/ICD codes
✅ Task 2: Enhanced Procedure autocomplete with SNOMED/ICD codes
✅ Task 3: Verified Master CRUD integration (modal already working)
✅ Task 4: Created comprehensive testing documentation

KEY FIXES:
- Removed conflicting bindSurgeryTermLookup() calls from initSurgeryTools()
- Old datalist code no longer interferes with new custom dropdown
- Both autocompletes work independently with separate dropdown containers

TESTING DOCUMENT INCLUDES:
- 10 detailed test scenarios with expected results
- Database verification queries
- Troubleshooting guide
- Edge case handling
- Performance checks
- User acceptance checklist
- Future enhancement suggestions

FILE: SURGERY_PROCEDURE_AUTOCOMPLETE_TESTING.md

Ready for QA testing and user acceptance.
2026-06-06 06:35:32 +05:30
b6bca785a8 Add enhanced autocomplete for Surgery/Procedure with SNOMED/ICD codes
FEATURE: Enhanced Surgery and Procedure autocomplete with code display

IMPROVEMENTS:
1. Replaced basic datalist with custom dropdown
2. Display SNOMED codes (term_code) and ICD codes in dropdown items
3. Show codes as badges: blue for SNOMED, gray for ICD
4. Keyboard navigation (Arrow Up/Down, Enter, Escape)
5. Hover highlighting with visual feedback
6. Store master_id in hidden field for database linking

HOW IT WORKS:
- Type 2+ characters → searches ipd_discharge_surgery_master table
- Dropdown shows: Name + Code badges
- Click or Enter → selects item and fills input
- Arrow keys navigate through suggestions
- Escape closes dropdown

UI:
- Name displayed prominently (bold)
- Codes shown as colored badges below name
- Blue badge: SNOMED/term code
- Gray badge: ICD code
- Hover: light gray background
- Keyboard highlight: blue background, white text

Makes it easy to find and select surgeries/procedures from master
with their ABDM codes visible for verification.
2026-06-06 06:29:15 +05:30
e10ea540ba Remove 'Complaint added' status message
Remove the status message after adding complaint - table update
provides sufficient visual feedback.
2026-06-06 06:24:37 +05:30
6f5bacc723 Fix broken event listeners - properly close click handler and wrap keydown
BUGFIX: Uncaught SyntaxError expected expression, got ')'

PROBLEM: Event listeners were malformed - click handler and keydown handler
were merged into one broken block

ROOT CAUSE: The click event listener was missing its closing braces and
btnAdd.click() call. Instead, the keydown handler code was pasted directly
after it WITHOUT the proper addEventListener wrapper. This caused:
1. Missing closing brackets for click handler
2. Reference to undefined 'e' variable (e.key) outside function scope
3. Browser threw SyntaxError/ReferenceError

SOLUTION:
1. Properly closed click event listener:
   - Added btnAdd.click() call
   - Added closing braces for function and addEventListener
   - Added closing }); for forEach loop
   - Added closing }); for \$.get() AJAX call

2. Created separate keydown event listener:
   - Wrapped keyboard navigation code in lookup.addEventListener('keydown', function(e) {...})
   - Now 'e' variable is properly defined in function scope
   - Arrow keys, Enter, Escape all have access to event object

CODE STRUCTURE NOW:
- item.addEventListener('click', ...) - PROPERLY CLOSED
- }); // closes forEach
- }, 'json'); // closes AJAX
- }); // closes input event
- lookup.addEventListener('keydown', function(e) {...}) - NEW/PROPER

All event handlers are now independent and properly scoped.
2026-06-06 06:16:17 +05:30
1a592eda7c Add safer checks for \ variable
Add isset() and is_array() checks before using \ to prevent
PHP warnings/errors if variable is not set or not an array.

This ensures cleaner JavaScript output even if the variable is undefined.
2026-06-06 06:05:32 +05:30
d3e50174b5 Fix trailing comma in JavaScript array from PHP foreach
BUGFIX: Uncaught SyntaxError expected expression, got ')'

PROBLEM: Trailing comma after last array item caused JavaScript syntax error

ROOT CAUSE: PHP foreach loop always added comma after each object:
{...},
{...},  // <-- trailing comma before ]
];

While modern JS allows trailing commas, some parsers or contexts
(like when injected/evaluated) don't handle it well.

SOLUTION: Only add comma between items, not after last item:
1. Count total items before loop
2. Track current index in loop
3. Add comma only if currentIndex < itemCount

GENERATED JS NOW:
[
    {...},
    {...},
    {...}   // <-- no trailing comma
]

This eliminates the syntax error.
2026-06-06 06:00:25 +05:30
f6749d2664 Fix undefined variable - use \ not \
BUGFIX: Uncaught SyntaxError expected expression, got ')'

PROBLEM: JavaScript syntax error on page load caused by undefined PHP variable

ROOT CAUSE: Controller passes 'complaint_rows' to view but JavaScript code
tried to use \ (camelCase). PHP is case-sensitive, so:
- Controller: 'complaint_rows' => \
- View variable name: \ (snake_case)
- Used in view: \ (wrong!)

When \ was undefined, the !empty() check failed and PHP
tried to iterate over undefined variable, generating malformed JavaScript
that caused syntax errors.

SOLUTION: Changed \ to \ in foreach loop

Now the existing complaints will load correctly from database into
the selectedDischargeComplaints JavaScript array.
2026-06-06 05:58:04 +05:30
dde54ab80b Fix scope error - move complaint functions before initComplaintTools
BUGFIX: Uncaught SyntaxError expected expression, got ')'

PROBLEM: selectedDischargeComplaints was undefined when initComplaintTools
tried to use it, causing syntax/reference errors

ROOT CAUSE: JavaScript variable and function declarations were placed
AFTER the initComplaintTools function that used them. When btnAdd
click handler tried to access selectedDischargeComplaints at line 1841,
it was declared later at line 1964.

SOLUTION:
1. Moved selectedDischargeComplaints variable declaration to TOP
2. Moved initDischargeComplaintsTable() function before initComplaintTools
3. Moved renderDischargeComplaintTable() function before initComplaintTools
4. Removed duplicate declarations that were after initComplaintTools

ORDER NOW:
1. selectedDischargeComplaints = [] (global)
2. initDischargeComplaintsTable() function
3. renderDischargeComplaintTable() function
4. initComplaintTools() function (uses all above)

All functions/variables are now in proper scope when needed.
2026-06-06 05:55:12 +05:30
e6ccd6a408 Fix JavaScript syntax error - remove duplicate keydown handler
BUGFIX: Uncaught SyntaxError expected expression, got ')'

PROBLEM: Console error on page load due to malformed JavaScript

ROOT CAUSE: Previous replacement left duplicate code fragment:
- Closing brace of updateDropdownHighlight function was followed by
  'kup.addEventListener' (missing 'loo' prefix)
- This created invalid JavaScript syntax
- Old keydown handler wasn't fully removed

SOLUTION: Removed the duplicate/malformed keydown listener block

The proper keydown handler with arrow key navigation is earlier
in the code and works correctly.
2026-06-06 05:51:44 +05:30
bbaa6ae841 Add keyboard navigation to autocomplete dropdown
FEATURE: Arrow keys now work to navigate autocomplete suggestions

ADDED:
- highlightedIndex variable tracks current keyboard position
- ArrowDown/ArrowUp keys move through dropdown items
- Highlighted item shown with blue background and white text
- Enter key selects highlighted item (or adds typed text if none)
- Escape key closes dropdown
- Mouse hover updates highlightedIndex
- scrollIntoView keeps highlighted item visible in long lists

HOW TO USE:
1. Type complaint name → dropdown appears
2. Press ArrowDown → first item highlights (blue background)
3. Press ArrowDown/ArrowUp → navigate through items
4. Press Enter → selects highlighted item and adds to table
5. Press Escape → closes dropdown

Visual feedback:
- Mouse hover: light gray background
- Keyboard highlight: blue background, white text, bold
2026-06-06 05:49:03 +05:30
4fc64be2a2 Fix autocomplete selection - now adds to client-side array
BUGFIX: Autocomplete dropdown was showing but items weren't selectable

PROBLEM: Clicking autocomplete suggestions didn't add complaints to table

ROOT CAUSE: btnAdd click handler was using old database-submit logic
instead of new client-side array management

SOLUTION: Simplified btnAdd to:
1. Take value from lookup input
2. Check if already exists (prevent duplicates)
3. Add to selectedDischargeComplaints array
4. Call renderDischargeComplaintTable() to refresh
5. Clear input and show success message

HOW IT WORKS NOW:
- Type complaint name → autocomplete dropdown appears
- Click suggestion → sets lookup input value
- btnAdd triggered → adds to array → table refreshes
- Complaint appears in table with editable Frequency/Severity/Duration

All inline editing works without database calls!
2026-06-06 05:46:38 +05:30
58e79318fd Remove buggy database-save-on-blur, implement client-side complaint table
BUGFIX: Removed database errors by switching to OPD-style client-side management

PROBLEM: Every time user edited a complaint field, it tried to save
to database immediately, causing 'Database error' messages in console.

ROOT CAUSE: The inline save approach doesn't match how OPD works.
OPD uses client-side JavaScript array and saves everything on form
submit, not on every keystroke.

SOLUTION:
1. Removed attachComplaintFieldHandlers() with fetch() database calls
2. Created selectedDischargeComplaints JavaScript array
3. Load existing PHP complaints into array on init
4. renderDischargeComplaintTable() builds table from array
5. Input events update array in-memory (no database calls)
6. Table now has Frequency, Severity, Duration columns like OPD

BENEFITS:
- No more database errors
- Faster editing (no network calls)
- OPD-like interface with all columns
- Edit any field without errors
- Will save all changes on form submit

NOTE: Still need to wire up 'Add' button and form submission in next commit.
2026-06-06 05:41:23 +05:30
7f957bfb96 WIP: Redesign IPD complaints table structure to match OPD (Frequency/Severity/Duration columns)
WORK IN PROGRESS: Table structure updated, JavaScript needs complete rewrite

CHANGES:
1. Added Frequency, Severity, Duration columns (matching OPD)
2. Removed static PHP rendering of complaint rows
3. Added hidden discharge_complaints_json field for data storage
4. Added dropdown divs for frequency/severity/duration autocomplete5. Table now has OPD-like structure

NEXT STEPS NEEDED:
- Rewrite JavaScript to use client-side array (like OPD)
- Remove database-save-on-blur code (causing errors)
- Implement render function to build table from array
- Add inline editing with autocomplete
- Save JSON on form submit instead of individual updates

NOTE: This commit has the new table structure but old JavaScript.
The page may not work correctly until JavaScript is updated in next commit.
2026-06-06 05:40:23 +05:30
5aad2b0950 Fix database error in complaint field update - remove non-existent updated_at column
BUGFIX: Database error when saving editable complaint fields

PROBLEM: After adding X-Requested-With header, the request reached
the controller but threw 'Database error' when trying to update the
complaint field.

ROOT CAUSE: The ipd_discharge_complaint table does not have an
'updated_at' column. The update query was trying to set:
  - comp_report or comp_remark (correct)
  - updated_at (does not exist) ← DATABASE ERROR

INVESTIGATION: Checked how complaint rows are inserted elsewhere in
the codebase (line 4117-4130). The table has 'update_by' column for
tracking changes, not 'updated_at'.

SOLUTION:
1. Removed hardcoded 'updated_at' => date(...) from update data
2. Only update the target field (comp_report or comp_remark)
3. Conditionally set 'update_by' if column exists (audit trail)
4. Use session full_name for user tracking

Now editable complaint fields save successfully without database errors.
2026-06-06 05:33:18 +05:30
57691e6a7f Fix AJAX header for complaint field update to pass CI4 isAJAX() check
BUGFIX: HTTP 400 'Invalid request' when saving editable complaint fields

PROBLEM: After adding the route, the request still returned 400 Bad
Request with 'Invalid request' error. The controller's isAJAX() check
was failing and rejecting the request.

ROOT CAUSE: The fetch() API does not automatically add the
X-Requested-With header that CodeIgniter 4's isAJAX() method checks
for. Unlike jQuery.ajax() which adds this header by default, vanilla
fetch() requires explicit header configuration.

SOLUTION: Added 'X-Requested-With': 'XMLHttpRequest' header to the
fetch request in attachComplaintFieldHandlers() function. This is the
standard header that identifies AJAX requests and is what CI4's
Request::isAJAX() method validates.

Now the editable complaint fields save correctly:
- Type in complaint name/remark
- Press Tab or Enter
- Green border = saved successfully
- Changes persist in database
2026-06-06 05:30:20 +05:30
a1c6ef47b7 Add route for IPD discharge complaint field update endpoint
BUGFIX: 404 error when saving editable complaint fields

PROBLEM: When editing complaint name or remark in IPD discharge
form, the AJAX request to update_complaint_field returned HTTP 404.

ROOT CAUSE: In CodeIgniter 4, routes must be explicitly defined.
The new update_complaint_field method was added to Ipd_discharge
controller but no route was registered in Routes.php.

SOLUTION: Added POST route for Ipd_discharge/update_complaint_field
in app/Config/Routes.php following the existing pattern for other
Ipd_discharge AJAX endpoints.

Now editable complaint fields save correctly with green/red feedback.
2026-06-06 05:27:18 +05:30
4740c622a8 Redesign IPD discharge complaints table to match OPD consult form interface
UX IMPROVEMENT: Unified table design across OPD and IPD modules

CHANGES:
1. TABLE REDESIGN:
   - Moved autocomplete input INTO table footer (like OPD form)
   - Added row numbers (#) column
   - Compact styling with smaller font sizes (.82rem)
   - Minimal delete button (× symbol) instead of full button
   - Removed separate 'Smart Complaints Picker' section above table
   - Clean, professional Healthplix-style interface

2. AUTOCOMPLETE IMPROVEMENTS:
   - Replaced datalist with custom dropdown menu
   - Better visual feedback with hover effects
   - Click to select from dropdown
   - Enter key to add complaint
   - Auto-close on selection

3. BUTTON REORGANIZATION:
   - AI Draft and Hinglish buttons moved below table
   - Emoji icons for better visual recognition
   - Compact size, less intrusive
   - Removed duplicate Hinglish button from 'Other Complaints' label

4. IMPROVED SPACING:
   - Tighter layout, less vertical space
   - More data visible on screen
   - Professional medical app look and feel

BENEFITS:
- Consistent interface between OPD and IPD modules
- Faster complaint entry with inline autocomplete
- Better use of screen space
- Cleaner, more modern appearance
- Familiar workflow for users switching between OPD/IPD
2026-06-06 05:25:11 +05:30
ddec3cec69 Fix editable complaint fields - attach handlers after section reload
BUGFIX: Event handlers were only attached on initial page load

PROBLEM: After implementing editable complaint fields, the inputs
wouldn't become editable when adding new complaints via the Smart
Complaints Picker. The event handlers were only attached once on
page load, not after the section was dynamically reloaded.

ROOT CAUSE: When clicking Add or AI Draft buttons, the form submits
and the section-complaints area is reloaded from server. The new
complaint rows had the input fields but no event handlers attached.

SOLUTION:
1. Moved event handler attachment logic into initComplaintTools()
   function as new attachComplaintFieldHandlers() helper
2. This function is automatically called after section reload
3. Clone-and-replace pattern to prevent duplicate event handlers
4. Fixed table name: ipd_discharge_complaint (not ipd_discharge_comp)

FLOW:
- Add complaint → section reloads → initComplaintTools() runs →
  attachComplaintFieldHandlers() attaches blur/keydown handlers →
  editable fields work

Now clicking on complaint name/remark inputs works for both:
- Existing complaints (on page load)
- Newly added complaints (after section reload)
2026-06-06 05:18:35 +05:30
2e6bff35a0 Make IPD discharge complaint names and remarks editable like OPD form
FEATURE: Inline editing for discharge complaint table

PROBLEM: In IPD discharge form, complaint names and remarks were
read-only after adding. Unlike OPD consult form where you can edit
complaint names directly in the table.

SOLUTION:
1. VIEW Changes (discharge_create.php):
   - Changed complaint name and remark columns from static <td> to editable <input>
   - Added data attributes for complaint ID and original values
   - Added CSS classes: discharge-complaint-name-input, discharge-complaint-remark-input

2. JAVASCRIPT Changes:
   - Added saveComplaintField() function for AJAX updates
   - Event handlers on blur to save changes
   - Enter key support to blur and save
   - Visual feedback: green border on success, red on error
   - Auto-updates original value after successful save

3. CONTROLLER Changes (Ipd_discharge.php):
   - Added update_complaint_field() method for AJAX endpoint
   - Updates ipd_discharge_comp table (comp_report or comp_remark)
   - Returns JSON success/error response

BENEFITS:
- Same user experience as OPD consult form
- Edit complaints/remarks without page reload
- Immediate feedback on save success/failure
- Type correction and updates without removing and re-adding rows
2026-06-06 05:12:23 +05:30
5847f642d8 Make discharge preview top panel sticky and add action buttons
IMPROVEMENTS:
1. Sticky top panel - stays visible when scrolling
2. Action buttons moved to top panel for easy access
3. Compact layout with better button organization

CHANGES:
- Added .discharge-preview-sticky-header class with position: sticky
- Moved all action buttons to top panel:
  * Back to Edit button (with edit icon)
  * Print on Letter Head dropdown (PDF icon)
  * Print on Plain Paper dropdown (file icon)
- Added icons to buttons for better UX
- Made buttons smaller (btn-sm) to fit in top panel
- Reduced margins and padding for compact layout
- Removed duplicate buttons from bottom
- Top panel now includes: header, patient info, action buttons, template selector

BENEFITS:
- Buttons always visible even when scrolling long discharge summary
- No need to scroll up/down to access print functions
- Better workflow for reviewing and printing
2026-06-06 04:46:17 +05:30
3de14194a7 Add Preview button at top of IPD discharge form
IMPROVEMENT: Preview button now always visible at top of page

PROBLEM: Preview button was at bottom in sidebar, often hidden
and users had to scroll to find it.

SOLUTION:
- Added Preview button at top right after patient header
- Button labeled 'Preview Discharge Summary' with eye icon
- Original sidebar button still present for convenience
- Top button uses same onclick handler as sidebar button

Now users can easily preview discharge summary without scrolling.
2026-06-06 04:42:00 +05:30
a76f0dd9e7 Make pain scale more compact for prescription layout
Reduced sizes:
- Table width: 100% to 60%
- Debug text: 10px to 8px
- Triangle: 18px to 12px
- Number boxes: 14px to 10px with 3px padding
- Border: 3px to 2px for selected
- Labels: uniform 7px font
- Reduced all margins and spacing

Still maintains clear B&W visibility with triangle, gray background, and bold border.
2026-06-06 04:21:56 +05:30
6259001aec Fix emoji rendering issue - use PDF-safe symbols instead
PROBLEM: Emojis don't render in PDF (showing as empty boxes)

SOLUTION:
- Use down-pointing triangle (▼) using HTML entity &#9660;
- This Unicode character renders properly in mPDF/PDF generators
- Darker gray background (#cccccc) for better B&W visibility
- Bold 3px border on selected box
- Larger font and padding for selected number

Visual indicators that work in B&W printing:
- Triangle (▼) above selected level
- Dark gray shading on selected box
- Bold border on selected box
- Bold text for selected label
2026-06-06 04:19:20 +05:30
a047955c7c Add emojis to pain scale for clear black & white printing
PROBLEM: Color coding not visible in black & white printers

SOLUTION:
- Added emoji indicators: 😊 😐 😣 😖 😭 for pain levels 0-4
- Changed colors to black/white/gray for B&W compatibility
- Emoji shows above selected pain level (larger size)
- Bold 3px border on selected box (visible in B&W)
- Light gray background on selected box

Now pain scale is clear even in monochrome printing!
2026-06-06 04:14:12 +05:30
cad5730182 Disable static PNG pain scale images, use dynamic HTML instead
PROBLEM: Static pains_scale_0-4.png files all look identical (just gradient)
so users can't tell which pain level is selected.

SOLUTION: Comment out PNG file checking code to force use of dynamic HTML
with arrow indicator, colored backgrounds, and bold borders.

Now {{painscale_img}} will show:
- Debug line: 'Pain Level: X - Label'
- Down arrow (▼) above selected level
- Colored background (green to red) on selected box
- Bold 3px border on selected box
- Different pain values will have visibly different displays
2026-06-06 04:07:16 +05:30
e0c44e79b1 Add debug info to pain scale image showing actual value
- Add 'Pain Level: X - Label' text above pain scale for debugging
- Helps identify if pain_value is being read correctly from database
- Fix comparison to use strict equality check for  ===
- User can now see which pain level is actually being rendered
2026-06-06 03:59:14 +05:30
a14011e11c Improve pain scale visual indicator for better clarity
- Change checkmark to down arrow (▼) for better visibility in PDFs
- Increase arrow size to 20px and make it bold
- Use white background for non-selected boxes for stronger contrast
- Add thick black border (3px) on selected level for emphasis
- Selected box shows colored background with white text
- Increase selected label text size and make it bold black
- Clear visual distinction between selected (value 2 vs 4) levels now
2026-06-06 03:54:51 +05:30
5e929c858e Fix H_logo placeholder not being replaced in OPD print
- Add fallback to 'logo.png' when H_logo is not set in database or constants
- Prevents {{H_logo}} placeholder from appearing as literal text in print/PDF
- Resolves 400 Bad Request error when browser tries to load unreplaced placeholder
- Ensures prescription templates always have a valid logo path
2026-06-06 03:43:31 +05:30
a5ccd71714 Enhance pain scale image with visual tick indicator
- Add checkmark (✓) above the selected pain intensity level
- Use color gradient from green (No Pain) to red (Worst) for better visual clarity
- Highlight selected level with colored background and white text
- Thicker border on selected level for better emphasis
- Bold label text for selected intensity
- Makes pain scale selection immediately visible in printed/PDF prescriptions
2026-06-06 03:11:25 +05:30
3e21ab57b0 Make diagnosis column editable in OPD consult form
- Convert diagnosis name from static text to editable input field
- Add event handlers for diagnosis name editing (input, blur, keydown)
- Users can now edit diagnosis text after adding it to the table
- Duration and Date remain editable as before
- Enter key moves focus from diagnosis to duration field
- Auto-sync with selectedDiagnosisItems and SNOMED JSON on edit
- Apply proper SNOMED styling (blue text) only when concept_id exists
2026-06-06 02:57:54 +05:30
09c3be0755 Fix jQuery CSS error in complaint name input
- Fix 'can't access property toUpperCase' error when rendering complaint table
- Apply SNOMED styling conditionally only when complaint has concept_id
- Use proper jQuery css() object notation instead of string
2026-06-06 02:54:00 +05:30
d156e26ac1 Make complaint column editable in OPD consult form
- Convert complaint name from static text to editable input field
- Add event handlers for complaint name editing (input, blur, keydown)
- Users can now edit complaint text after adding it to the table
- Frequency, Severity, Duration remain editable as before
- Enter key moves focus from complaint to frequency field
- Auto-sync with selectedComplaintItems and SNOMED JSON on edit
2026-06-06 02:50:44 +05:30
8ef46cddb1 Add permission for Admin to edit patient name anytime
- Add billing.patient.edit-name-anytime permission to AuthGroups
- Update patient edit time restriction from 12 hours to 24 hours
- Modify Person_Edit_V to check for edit-name-anytime permission
- Admin can now edit patient name field (input_name) even after 24-hour window
2026-06-05 17:33:31 +05:30
718e01156d Revert card/modal/container borders to original light colors
User feedback: Form controls with dark borders (#555) work fine, but
card/modal/container borders looked bad with dark colors.

Reverted to original light borders:
- Cards, card-header, card-footer: #ebeef4 (light gray)
- Modals: #ebeef4 (light gray)
- Dropdowns: #ebeef4 (light gray)
- Breadcrumb: #ebeef4 (light gray)
- List groups: #ebeef4 (light gray)
- Box/Panel components: #ebeef4 (light gray)
- Profile/User cards: #ebeef4 (light gray)
- Dashboard cards: #ebeef4 (light gray)
- Sidebar/Header: #ebeef4 (light gray)
- Tables: #ddd (moderate gray, slightly darker than cards)

KEPT dark borders (user says these work fine):
- Form controls (input, select, textarea): #555 (dark gray)
- Form control focus: #333 (very dark)
- Input groups: #555 (dark gray)
- Select2: #555 (dark gray)
- jQuery UI: #666 (dark gray)

Final result: Dark, highly visible borders only on interactive form
controls. Subtle, professional light borders on structural containers.
2026-06-05 16:20:21 +05:30
12610b4b8b Add dark border theme for better visibility on old LED screens
Created custom CSS file to enhance visibility on older displays:
- Darker border colors for all form controls (#555 instead of light grays)
- Enhanced contrast for inputs, selects, textareas
- Darker card borders (#999)
- Darker table and modal borders
- Better visibility for buttons, dropdowns, alerts
- Updated Select2, jQuery UI, and DataTables borders

Files changed:
- public/assets/css/custom-theme-dark-borders.css (NEW)
  * Comprehensive dark border overrides with !important flags
  * Covers all Bootstrap and custom components

- app/Views/welcome_message.php
  * Included custom-theme-dark-borders.css after main style.css

- app/Views/auth/login.php
  * Included custom-theme-dark-borders.css for login page

- app/Views/storestock/_niceadmin_theme.php
  * Updated inline CSS border colors from light to dark
  * Changed #ebeef4, #dfe3ea, #e9edf5 to #555, #666, #888, #999

Theme now provides better contrast for old LED monitors with darker,
more visible borders across all UI components.
2026-06-05 16:10:38 +05:30
6314bafa29 Combine textarea notes and test list into single {{investigation}} placeholder
Modified {{investigation}} to show both:
1. Textarea content (advise_investigation_notes) if present
2. Comma-separated test list from opd_prescription_investigation table

Both sources combined with newline separator when both exist.
{{Tadvise_test_list}} still available separately for backward compatibility.

Example combined output:
USG WHOLE ABDOMEN
CECT ABDOMEN
PAC
COMPLETE CARDIAC CHECK UP
PAP SMEAR
CBC (Complete Blood Count), ECG (Electrocardiogram), HBA1C, HBSAG, HCV, HIV I & II (Elisa), Liver Function Test (LFT), PT/INR, Renal Function Test (RFT), Urine Routine & Microscopy, X-Ray Chest (PA View)
2026-06-05 16:04:01 +05:30
a1fbf50f3f Change {{Tadvise_test_list}} to comma-separated format (not bullet list)
Changed placeholder behavior to match user requirements:
- {{investigation}} = textarea content (advise_investigation_notes) only
- {{Tadvise_test_list}} = comma-separated test names from table

Removed HTML bullet list formatting. Now outputs plain comma-separated text.

Example output:
CBC (Complete Blood Count), ECG (Electrocardiogram), HBA1C, HBSAG, HCV,
HIV I & II (Elisa), Liver Function Test (LFT), PT/INR, Renal Function Test (RFT),
Urine Routine & Microscopy, X-Ray Chest (PA View)

Both placeholders are independent and can show content simultaneously.
2026-06-05 15:59:16 +05:30
0b865f41cd Add textarea fallback for {{Tadvise_test_list}} placeholder
When opd_prescription_investigation table is empty but investigation
textarea has content, parse textarea content (split by newlines) to
populate the test list.

This handles cases where tests are entered as free-text in the
"Advise Investigation" textarea instead of selecting from master list.

Parsing logic:
- Try rx_investigations table first
- If empty, split investigation textarea by newlines
- Filter out empty lines and 'null' values
- Build HTML bullet list from either source

Example textarea content:
USG WHOLE ABDOMEN
CECT ABDOMEN
PAC
COMPLETE CARDIAC CHECK UP
PAP SMEAR

Will render as:
• USG WHOLE ABDOMEN
• CECT ABDOMEN
• PAC
• COMPLETE CARDIAC CHECK UP
• PAP SMEAR
2026-06-05 15:55:34 +05:30
1ca2dbce4c Add error handling and debug mode for OPD PDF rendering
Added try-catch around mPDF WriteHTML to catch rendering errors.
Changed debug_html mode to output as text/html for better preview.
Logs mPDF errors and returns user-friendly error message.

This will help diagnose blank page issues with {{Tadvise_test_list}} placeholder.
2026-06-05 15:38:26 +05:30
a540581bf9 Fix {{Tadvise_test_list}} to always populate from rx_investigations
Previous implementation only built test list when investigation textarea
was empty, preventing {{Tadvise_test_list}} from showing when textarea
had content.

Changes:
- Separated test list building from textarea population logic
- {{Tadvise_test_list}} now always populates when rx_investigations exists
- {{investigation}} still gets comma-separated fallback when textarea empty
- Both placeholders now work independently

Test list HTML output format:
<ul style="margin:3px 0 0 16px;padding:0;list-style-type:disc;">
  <li>CBC (Complete Blood Count)</li>
  <li>ECG (Electrocardiogram)</li>
  <li>HBA1C</li>
</ul>
2026-06-05 15:28:01 +05:30
6f6286f427 Add {{Tadvise_test_list}} placeholder for investigation test names
Created new OPD template placeholder to display investigation test names
as a formatted HTML list, separate from the textarea {{investigation}}.

Changes:
- app/Controllers/Opd.php:
  * Added $rxInvestigationTestList variable in buildLegacyDashboardTemplateVars()
  * Builds HTML <ul> list from rx_investigations test names
  * Added 'Tadvise_test_list' token to return array

- app/Views/billing/opd_template_builder.php:
  * Added 'Tadvise_test_list' to $opdConsultSet placeholder list
  * Now appears in "OPD Consult" group in template builder

Usage in OPD templates:
- {{investigation}} = comma-separated test names (for textarea)
- {{Tadvise_test_list}} = formatted HTML bullet list of test names (for print/display)

Example output:
<ul style="margin:3px 0 0 16px;padding:0;list-style-type:disc;">
  <li>CBC (Complete Blood Count)</li>
  <li>USG WHOLE ABDOMEN</li>
  <li>ECG (Electrocardiogram)</li>
</ul>
2026-06-05 15:15:15 +05:30
a572bbabae Simplify org-case queries to match CI3 pattern
Changed from complex string comparisons to simple integer comparisons matching legacy CI3 code:

OPD query (CI3 pattern):
- OLD: o.insurance_case_id = cast(c.id as char) OR o.insurance_case_id = c.case_id_code
- NEW: o.insurance_case_id = c.id (integer comparison)

Invoice query (CI3 pattern):
- OLD: i.insurance_case_id = c.id OR i.insurance_case_id = c.case_id_code (with NULL/0 checks)
- NEW: i.insurance_case_id = c.id (integer comparison)

Schema notes:
- opd_master.insurance_case_id: int(11)
- invoice_master.insurance_case_id: varchar(50) (but stores numeric IDs)

MySQL varchar→int conversion handles this correctly:
- '4997' → 4997 (matches)
- '0' → 0 (doesn't match 4997)
- 'C26060004997' → 0 (doesn't match 4997)

Applied to:
- getOrganizationCaseInvoiceRows() union query
- updateOrgTotals() aggregate queries
- search() case list query
2026-06-05 14:14:22 +05:30
ba9d17d5e6 Fix org-case invoice query: exclude empty insurance_case_id
Root cause: 50k+ invoices had insurance_case_id='0', and MySQL string comparison '0'='C26060004997' matched (both convert to numeric 0).

Fix: Exclude NULL/empty/'0' insurance_case_id before comparison in:
- getOrganizationCaseInvoiceRows() union query
- updateOrgTotals() aggregate queries

Result: Case C26060004997 now returns 9 rows instead of 56,786 (memory crash fixed)
2026-06-05 14:09:26 +05:30
4c5e0748bb Revert patient ID fallback - use insurance_case_id only 2026-06-05 13:55:50 +05:30
e80e18600d Fix org-case invoice scoping 2026-06-05 13:49:58 +05:30
6e3a355e03 Fix org case invoice and discharge PDF rendering 2026-06-05 13:43:19 +05:30
9c295c55c8 fix(discharge): enforce pdf response and sanitize template html 2026-06-05 12:03:47 +05:30
499a9bea31 fix(orgcase): fallback invoice linkage by patient and case 2026-06-05 11:45:01 +05:30
bd820a7939 fix(orgcase): use insurance amount1 in union invoice query 2026-06-05 11:37:23 +05:30
e7d6dd88d2 fix(orgcase): avoid missing discount column in union query 2026-06-05 11:34:52 +05:30
9f1d5b93e6 fix(orgcase): restore legacy union invoice rows 2026-06-05 11:32:01 +05:30
48222bb689 fix(orgcase): include OPD rows linked by case code 2026-06-05 11:27:24 +05:30
561adb9647 feat(discharge): add department and time placeholders 2026-06-05 11:05:00 +05:30
23fd1bf73f fix(discharge): render html fragments and reorder sections 2026-06-05 10:42:14 +05:30
0b05d7284c feat(discharge): support section placeholders 2026-06-05 10:24:31 +05:30
472b8367d9 fix(discharge): remove blank-header fallback and improve auto summary 2026-06-05 09:50:58 +05:30
55e56176aa fix(discharge-ui): simplify preview and remove ABDM sandbox panel 2026-06-05 09:40:30 +05:30
3666875782 fix(discharge-pdf): suppress borders for border=0 tables 2026-06-05 08:39:48 +05:30
a076d48859 fix(discharge): apply latest controller adjustments 2026-06-05 08:31:02 +05:30
8f57288d2a fix(discharge): apply latest Ipd_discharge updates 2026-06-05 08:29:11 +05:30
c9c70a9ce5 fix(discharge): support borderless medication table in preview and PDF 2026-06-05 08:15:33 +05:30
3d8ebb1ed3 fix(discharge-preview): match table border CSS with PDF output 2026-06-05 08:08:30 +05:30
7527fc315a fix(discharge): apply latest controller updates 2026-06-05 08:04:31 +05:30
b47b41ce8a fix(discharge-pdf): remove auto title/template block from body 2026-06-05 07:40:43 +05:30
f341e8e76e fix(discharge-template): make delete endpoint reliable for URL and AJAX 2026-06-05 07:37:39 +05:30
a169ab174b fix(discharge): render header/footer hospital placeholders in PDF 2026-06-05 07:33:07 +05:30
171ff50155 fix(template): backfill discharge template columns for legacy schemas 2026-06-05 07:20:43 +05:30
fdb7c15f85 Fix discharge template page edit flow and AJAX save/delete 2026-06-05 07:12:58 +05:30
e6ffebb96d Render discharge PDF with content-only body and remove duplicate top meta blocks 2026-06-05 07:05:25 +05:30
21e662a0e6 Fix duplicate discharge summary header when using content placeholder 2026-06-05 06:47:39 +05:30
ecb55e7329 Add page settings and header footer support to discharge templates 2026-06-05 06:22:13 +05:30
226f956985 Add discharge preview and PDF quick-launch to template settings 2026-06-05 06:17:59 +05:30
b6a2e956d8 Remove heading from combined NABH panel placeholder 2026-06-05 06:05:06 +05:30
806044ff93 Add single conditional NABH panel placeholder 2026-06-05 06:00:43 +05:30
8bfd11ccda Persist consult NABH fields via remarks fallback 2026-06-05 05:53:24 +05:30
c4a6e95933 Add explicit OPD NABH allergy raw and block placeholders 2026-06-05 05:47:16 +05:30
14fb1fd400 Fix OPD placeholder collisions for vitals and allergy blocks 2026-06-05 05:29:58 +05:30
51daaa989a Fix OPD pain/allergy placeholders and hide No Pain block 2026-06-05 04:51:05 +05:30
dc2a0da1ee Use mPDF-safe mm spacer blocks for OPD section gaps 2026-06-05 04:26:23 +05:30
dbda578d68 Harden OPD block spacing and add debug_html output mode 2026-06-05 04:18:48 +05:30
f358bbd66c More spacing between OPD print blocks; add margin around medicine table 2026-06-05 04:13:21 +05:30
3a06c32dc5 Increase spacing between OPD print placeholder blocks 2026-06-05 04:08:20 +05:30
6bdef9bb9d Improve OPD print block typography for professional output 2026-06-05 03:54:52 +05:30
a1ba8f0e6b Enhance OPD template placeholders and list rendering 2026-06-05 03:48:24 +05:30
b3e8a1a692 Refine OPD template builder UI and preview behavior 2026-06-05 03:34:08 +05:30
700741ab9b Fix billing case creation reusing old records 2026-06-04 15:55:08 +05:30
45c36e730c Fix diagnosis chip duplication in consult form 2026-06-04 14:22:34 +05:30
b575560a00 Fix complaint chip duplication in consult form 2026-06-04 14:09:24 +05:30
c692340bb2 Store ABDM bundles in health records 2026-06-03 11:05:40 +05:30
45abd3ca76 Store ABHA ID and ABHA address separately 2026-06-02 06:00:35 +05:30
510d121478 Normalize OPD preview bundle_type from profile 2026-06-01 14:04:44 +05:30
c68816ce57 Upgrade regenerated OPD bundle_type to OPConsultRecord 2026-06-01 14:02:23 +05:30
6f312dd0d8 Add manual GET wrapper for FHIR regenerate 2026-06-01 14:00:02 +05:30
b0e3459c19 Add ABDM careContexts and OPD visit key 2026-06-01 13:54:56 +05:30
00c45ea7c4 Accept OPConsultRecord bundle lookups 2026-06-01 13:34:35 +05:30
b70e88dd75 Use OPConsultRecord for OPD bundles 2026-06-01 13:31:53 +05:30
33fc87ac88 Fix OPD FHIR submit record reference 2026-06-01 13:29:10 +05:30
9de803ace7 Send ABDM HFR ID only 2026-06-01 13:24:59 +05:30
e8ec06e8f8 Harden ABDM health record push payloads 2026-06-01 13:23:54 +05:30
07ed8ff305 Sanitize OPD FHIR patient name placeholders 2026-06-01 10:57:30 +05:30
f079f32f58 Restore legacy pharmacy reports and fix net/payment totals 2026-06-01 10:53:27 +05:30
252f911fad Add pharmacy invoice permissions and discount print fixes 2026-06-01 10:13:40 +05:30
7422f9c170 Normalize ABDM HI types to gateway accepted *Record values 2026-06-01 07:22:20 +05:30
40cd6d6414 Include HFR ID in HIP link payloads for e-Atria bridge 2026-06-01 07:13:36 +05:30
b12652d6e0 Align ABDM bridge workflow APIs and add report doctor mapping 2026-06-01 07:02:34 +05:30
e1d9e85e64 Fix FHIR DiagnosticReportRecord datetime and practitioner quality 2026-06-01 06:01:24 +05:30
7595f9fd29 fix(ipd-discharge): make lab date query compatible with only_full_group_by 2026-05-31 21:43:57 +05:30
701111b75e fix(patient): avoid queue_no select on legacy opd_master schema 2026-05-31 21:02:55 +05:30
8f16f1e6ec fix(routes): add my-profile save-settings endpoint 2026-05-31 20:51:22 +05:30
5a5cc570f5 fix(routes): add healthplix settings admin routes 2026-05-31 19:19:18 +05:30
0ebf8d2a8a ABDM: enforce PDF-backed report submit and improve gateway tracking 2026-05-31 04:17:39 +05:30
7253fa0cca Improve radiology template workflow and editor stability 2026-05-30 18:01:20 +05:30
78c23af7e5 Checkpoint: pathology panel modal workflow, gateway component search, and ABDM-style component/print editors 2026-05-30 06:32:30 +05:30
e449af8137 fix(pharmacy): make packing numeric in product form 2026-05-26 13:25:55 +05:30
218d7f7e50 fix(pharmacy): calculate invoice unit rate from mrp and packing 2026-05-26 13:21:36 +05:30
298647b80b fix(pharmacy): finalize product page panel toggle and GST selector behavior 2026-05-26 13:07:46 +05:30
032ff4f1ab fix(ui): disable ajax cache for dynamic panel loads 2026-05-26 13:07:03 +05:30
89a4053ede fix(drug-master): keep search shell visible with nested sub panel 2026-05-26 06:20:56 +05:30
fc2ccc91c2 fix(drug-master): keep add edit flow in medical-main container 2026-05-26 06:15:14 +05:30
4ed366ccb2 feat: commit all pending page and ABDM gateway updates 2026-05-26 06:04:34 +05:30
c97db078a9 fix(product-edit): use short formulation master and manufacturer payload name 2026-05-26 06:02:26 +05:30
e5899e59ac Fix drug autocomplete to show medicine name over identifiers 2026-05-25 14:38:06 +05:30
e3290625cc Pharmacy autocomplete: Tab key selects highlighted medicine 2026-05-25 14:14:51 +05:30
2941fadcac Pharmacy product edit: suggestion keyboard nav + immediate parsed autofill 2026-05-25 14:12:33 +05:30
e221581578 Pharmacy product edit: smarter medicine autofill from ABDM label/detail 2026-05-25 14:07:11 +05:30
0558ac5a2e Pharmacy: add ABDM drug terminology autocomplete + canonical mapping 2026-05-25 13:57:56 +05:30
12cacc3a9c Pharmacy drug master: switch to AJAX DataTable search 2026-05-25 12:47:14 +05:30
e15d876a3f Fix ABDM OPD HMS patient profile link route to person_record 2026-05-25 12:14:23 +05:30
34ff92f685 fix(abdm-opd): open pdf print links directly instead of ajax modal load 2026-05-24 07:36:20 +05:30
fcc7ef50e6 fix(abdm-opd): make addopd/showfee workflow functional inside modal 2026-05-24 07:32:49 +05:30
d6c94a0972 feat(abdm-opd): open add OPD visit in modal iframe 2026-05-24 07:26:38 +05:30
8a5624264c feat(abdm-opd): open OPD registration inside modal iframe 2026-05-24 07:25:52 +05:30
c590087a60 feat(abdm-opd): editable pre-save patient form for Register OPD 2026-05-24 07:16:32 +05:30
8a7b4440c5 fix(abdm-opd): prevent inline payload parsing error in Register OPD modal 2026-05-24 07:08:33 +05:30
b352073ec6 feat(abdm-opd): duplicate-aware Register OPD flow with existing/new patient confirmation 2026-05-24 07:04:42 +05:30
fc50158418 fix(abdm-opd-queue): keep called token visible after call action 2026-05-24 06:56:25 +05:30
23cca1f9ba feat(abdm): proper FHIR bundles for lab reports and IPD discharge
- FhirR4Builder: rewrite buildLabReportBundle() with DiagnosticReportLab
  profile, structured Observation valueQuantity/valueString, reference
  ranges, interpretation codes, Binary+DocumentReference for HTML report,
  Encounter resource, HFR-based bundle identifier system

- FhirR4Builder: rewrite buildDischargeSummaryBundle() with optional
  Practitioner/Organization params, structured ABDM sections (chief
  complaints 422843007, medical history 1003642006, investigations
  721981007, procedures 1003640003, medications 721912009, follow-up
  736271009), HFR-based bundle identifier system

- AbdmGateway: shareIpdDischargeBundle() now builds a real
  DischargeSummaryRecord FHIR bundle and posts via pushRecord()
  (POST /v3/records/push) instead of the stale shareIpdDischargeBundle()

- AbdmGateway: shareDiagnosisReportBundle() now builds a real
  DiagnosticReportRecord FHIR bundle and posts via pushRecord()
  instead of the stale shareDiagnosisReportBundle()

- AbdmGateway: add getHospitalProfileForFhir() and mapLabTypeToTitle()
  helpers; fix pre-existing undefined \ bug in
  getActiveConsentRecord()

- Add ABDM_FHIR reference package, AbdmBridgeLog controller/view,
  bridge record migration, debug scripts and misc UI/settings updates
2026-05-23 04:41:59 +05:30
1b6f2c2db7 feat: Add Submit to ABDM button on FHIR bundle preview
- POST Opd_prescription/fhir_bundle_submit endpoint:
  loads stored FHIR bundle, fetches patient/OPD/doctor context,
  calls EAtriaBridgeConnector::pushRecord to push to bridge
- Standalone preview page (/Opd_prescription/fhir_bundle_preview/N):
  added Submit to ABDM Bridge button with CSRF-safe AJAX + inline
  success/error alert
- FHIR modal in task_board.php: added Submit to ABDM button next
  to Copy JSON; JS reads _fhirOpdId/_fhirSessionId and posts to
  fhir_bundle_submit with CSRF token refresh
2026-05-22 15:54:13 +05:30
6d851f0e9e ABDM compliance: fix OPConsult bundle to match NRCES IG v6.5.0
- Use UUID v4 for all resources + urn:uuid: references (not Patient/123)
- Add fullUrl on every entry (required by FHIR Document bundle spec)
- Fix Composition.type: LOINC 34133-9 -> SNOMED CT 371530004
  (Clinical consultation report)
- Add meta.profile to Bundle, Composition, Patient, Practitioner,
  Organization, Encounter, Condition, Observation, AllergyIntolerance,
  MedicationRequest, ServiceRequest, Appointment
- Bundle identifier system: urn:ietf:rfc:3986 -> http://hip.in
- Bundle meta.security: add V (very restricted) confidentiality
- All timestamps: ISO 8601 with +05:30 offset (new isoTimestamp())
- Add generateUuid() private helper using random_bytes
- Composition: add language en-IN, identifier (ndhm.in/phr), custodian,
  author fallback, encounter reference
- Section SNOMED codes: Chief complaints 422843007, Allergies 722446000,
  Physical Examination 425044008, Diagnoses 439401001,
  Medications 721912009, Investigation Advice 721963009, Follow Up 736271009
- Separate Chief Complaints from Diagnoses sections
- Encounter.diagnosis.use: SNOMED 39154008 (confirmed) / 148006 (preliminary)
- Practitioner identifier: doctor.ndhm.gov.in system with MD type code
- Organization identifier: facility.ndhm.gov.in system with PRN type code
- Patient identifier: healthid.ndhm.gov.in (was abdm.gov.in) + MR type code
- ServiceRequest/MedicationRequest: add requester from Practitioner
2026-05-20 03:40:40 +05:30
ba6b479da6 fix: add arrow-key/Enter/Escape navigation for SNOMED dropdown in FHIR form 2026-05-20 03:21:06 +05:30