Commit Graph

770 Commits

Author SHA1 Message Date
87bf2d8368 improve: add 8-method fallback for internet connectivity check
- Method 1: ping to Google DNS (8.8.8.8)
- Method 2: DNS resolution via nslookup
- Method 3: DNS query using dig
- Method 4: curl HTTP HEAD to google.com
- Method 5: wget --spider
- Method 6: fsockopen to Google DNS (8.8.8.8:53)
- Method 7: curl to Cloudflare DNS (1.1.1.1)
- Method 8: PHP gethostbyname() for DNS resolution

Tries multiple DNS providers (Google, Cloudflare, Quad9)
Falls back to 'Offline' only if all methods fail
Handles firewalls, ICMP blocks, and missing commands
2026-08-04 02:50:23 +05:30
998eb7f2bf improve: add 6-method fallback for server IP detection
- Method 1: \['SERVER_ADDR'] from Apache/Nginx (most reliable)
- Method 2: /sbin/ip (absolute path, works if ip not in PATH)
- Method 3: Parse /proc/net/route for default gateway interface + IP
- Method 4: hostname -I (space-separated IPs)
- Method 5: ifconfig (fallback for older systems)
- Method 6: Socket connection to 8.8.8.8 (pure PHP, no shell commands)

Each method validates IP and skips loopback (127.x, ::1, ::ffff:127.x)
Fixes 'Unavailable' when shell commands fail or aren't available
2026-08-04 02:47:36 +05:30
1ade027b00 fix: prioritize real server IP, skip loopback (127.x, ::1)
- Changed primary method to: ip -4 addr show scope global (gets public/private IPs only)
- Added isLoopbackIp() helper to filter out loopback addresses (127.* and ::1)
- Fallback: hostname -I with loopback filtering
- Last resort: gethostbyname() with loopback check
- On remote server with eth0: 159.89.175.190, will now show public IP instead of 127.0.0.1
2026-08-04 02:45:01 +05:30
a4bccc765c fix: show server IP address in Network field instead of "Unavailable"
Three-level fallback chain:
1. gethostbyname(gethostname()) - PHP built-in, works on Linux and Windows
2. ip -4 addr show scope global | grep inet - Linux shell fallback
3. hostname -I - Linux shell secondary fallback

All results validated with FILTER_VALIDATE_IP before display.
2026-08-04 02:40:33 +05:30
bb8ed60216 fix: repair broken @media print CSS and add PDF tips modal
- Fixed split @media print blocks that caused all print rules to be orphaned
  (gallery section had added its own block which broke the main rules)
- Consolidated into one clean @media print block with proper A4 settings
- Print improvements: cover fills page 1, intro on page 2, each section
  starts on new page, screenshots print at fixed height, 3-col gallery grid
- Added "How to save as PDF" button with step-by-step modal overlay
- Steps guide: Destination → Save as PDF, A4 Portrait, Background graphics
- Both print bar buttons hidden in @media print
- @page: A4 portrait, 14mm/12mm/18mm margins, first page margin 0
2026-08-04 02:30:38 +05:30
7c63e738e8 feat: add real screenshots and complete module reference table from Word doc
Screenshots gallery:
- Replaced placeholder icons with 11 real PNG screenshots extracted from
  E-AtriaHMS.docx (Dashboard, Patient Search, ABHA Create, ABHA Register,
  IPD Billing Panel, OPD Queue, Bed Status Map, Charge Master, Stock Control,
  Report Panel, Admin Panel)
- Added new ABHA Register card showing 4 registration methods (Number,
  Scan ABHA QR, Scan Facility QR, Mobile OTP)
- Added new IPD Billing Panel card showing full tabbed panel layout
- Lightbox now opens real images on click
- Screenshots saved to public/assets/img/screenshots/image*.png

Module Reference Table (section 10):
- Added 25-row complete module reference table derived from Word document
- Covers Registration through Web/Cross-platform including LIS, RIS, OT,
  Emergency, Daycare, ABDM Dashboard, AI, Doctor's Workspace, RBAC
2026-08-04 02:26:16 +05:30
1f0f7566e8 feat: add screenshot gallery section to HMS presentation
- Added 9-card screenshot gallery section between intro and features
- Cards for: Dashboard, Patient Management, ABHA Creation, OPD Queue,
  Bed Status Map, Charge Master/Insurance Rates, Stock Control Center,
  Report Panel, Admin Panel
- Lightbox overlay for full-screen image viewing (keyboard Escape to close)
- Placeholder icons shown now; replace with real images by dropping PNGs
  into public/assets/img/screenshots/ and updating src on each card
- Added gallery CSS with hover lift effect and lightbox styles
- Print-friendly: lightbox hidden in @media print
2026-08-04 02:17:26 +05:30
0e6cf1664d feat: add HMS Features link on login page
- Added "View HMS Features & Capabilities" link below the login card
- Copied HMS_FEATURES_PRESENTATION.html to public/ so it is accessible
  via base_url without auth (same pattern as software-use-license.html)
- Link opens in a new tab
2026-08-04 02:05:09 +05:30
4d7ae0d669 docs: add HMS feature presentation (HTML + Markdown)
- HMS_FEATURES_PRESENTATION.html: full styled presentation with cover,
  professional introduction, 11 feature sections, tech stack, compliance,
  print/PDF button, and proper @media print A4 layout
- HMS_FEATURES_PRESENTATION.md: plain Markdown version of the same content
- system_ops.php: fix confirm dialog text for Update HMS button
2026-08-04 02:02:26 +05:30
155c3ec4b5 feat: add error details modal to update history
- Added "Details" column to Update History table
- Shows info icon button when error details are available
- Clicking button opens a modal with full error message
- Details displayed in pre-formatted text for easy reading
- Helps diagnose why HMS updates failed or timed out

When an update fails, users can now click the info icon to see the exact
git error output, making troubleshooting much easier.
2026-08-03 17:03:23 +05:30
f9c0fd1a72 fix: simplify HMS update to only git pull and add timeout protection
Update improvements:
- Renamed button from "Update System" to "Update HMS"
- Changed update to run only 'git pull' (removed database migrations)
- Added 60-second timeout to prevent system hangup
- Better error messages for timeouts and failures
- Logs update status (running/success/failed/timeout) to history
- Confirmation dialog now says "Pull latest HMS code from repository?"

This ensures quick updates without long-running migrations that could hang
the admin interface. Database migrations can be run separately as needed.
2026-08-03 17:00:21 +05:30
3720da9b16 feat: add visual progress bars to resource usage and improve CPU detection
Resource Usage improvements:
- Added visual progress bars for CPU, RAM, and Disk usage
- Progress bars use Bootstrap styling (success/info/warning colors)
- Display percentage and detailed metrics (e.g., RAM 4 / 128 MB (3%))
- Bars animate smoothly with CSS transitions

CPU detection enhancements:
- Added fallback to /proc/stat parsing when shell commands unavailable
- Added fallback to PHP getrusage() for CPU time estimation
- CPU now displays even when shell_exec is disabled
- Graceful fallback chain ensures data is always available

Progress bar styling:
- Success (green) for CPU
- Info (blue) for RAM
- Warning (orange/yellow) for Disk
- All bars styled with height, rounded corners, and smooth transitions
2026-08-03 16:56:50 +05:30
232bf3ef8a fix: add PHP built-in function fallbacks for system operations when shell_exec is disabled
When shell_exec() is disabled on the server (common in production), the system
operations panel now gracefully falls back to PHP built-in functions:

- gethostname() for hostname instead of shell 'hostname' command
- php_uname() for OS info instead of shell 'uname -a' command
- /proc/uptime parsing or unavailable status for uptime
- disk_free_space() and disk_total_space() for disk usage
- memory_get_usage() and PHP memory limit for memory usage
- Improved parsePhpMemoryLimit() to handle memory limit parsing

This ensures the admin panel shows meaningful information even in restricted
production environments where shell_exec is disabled for security reasons.
2026-08-03 16:52:46 +05:30
096ce5e199 feat: add System Operations tile to admin dashboard and include helper library
- Added System Operations link to Admin dashboard (app/Views/Setting/Admin/index.php)
- Uses load_form_div to load the system operations page inline
- Added SystemOperations library for server status collection and actions
- Tile uses server icon (bi-server) and appears in the admin panel grid
- Link: javascript:load_form_div(base_url('setting/admin/system-ops'), 'maindiv', 'System Operations')
2026-08-03 16:50:00 +05:30
89b862db31 feat: add admin system operations panel with AJAX refresh and server monitoring
- Added SystemOps controller with index and panel endpoints for dynamic content refresh
- Created system_ops_panel.php fragment for AJAX-based UI updates (no full page reload)
- Implemented 30-second auto-refresh using AJAX instead of location.reload()
- Fixed health badge contrast by adding explicit dark text color (#1f2937)
- Added jQuery availability checks to prevent script errors on page load
- Included server overview, resource usage, services, events, and update history
- Integrated delegated event handlers for action buttons (Update, Restart, Reboot, Shutdown)
- All buttons are protected with confirmation dialogs
- Layout maintains NiceAdmin card styling and responsive design

Routes added:
- GET /admin/system-ops/panel - returns panel fragment for refresh
2026-08-03 16:47:41 +05:30
37631c27a0 Improve patient search for legacy UHID values 2026-08-03 15:32:16 +05:30
e473be3ae7 Fix diagnosis print template dual-PDF flow and settings save bug
- Diagnosis.php: resolve doctor mapping via ABDM Report Doctor Mapping,
  compile pathology/diagnosis reports into separate Letter Head and
  Plain Paper PDFs, add compiled-pdf-links endpoint
- Routes.php: add diagnosis/compiled-pdf-links route
- pathology_detail.php: render/persist dual compiled PDF buttons
- Setting/Template.php: per-modality Letter Head / Plain Paper template
  mapping via hospital_setting keys
- Setting/Template/index.php: fix tile links using load_form (which only
  replaces #main) instead of load_form_div, which broke every internal
  AJAX reload (template type switch, modality switch, reset) on the
  diagnosis/discharge/document print template settings pages
- diagnosis_print_settings.php: fix corrupted watermark_alpha number
  input (missing step attribute) that silently blocked form submission
  for templates with non-integer-step legacy values
2026-08-03 02:43:50 +05:30
f57da52725 Refine IPD bill group row colspan and bold styling 2026-08-01 16:44:55 +05:30
6be0df028e Highlight IPD bill group headers and subtotals 2026-08-01 16:36:54 +05:30
b1846696a4 Prevent stale cached IPD bill PDF responses 2026-08-01 16:28:27 +05:30
71a7875fe1 Format IPD bill print group headers and subtotals 2026-08-01 16:21:22 +05:30
49d83dd105 Add PATIENT_TITLE discharge placeholder 2026-08-01 16:13:13 +05:30
53bc924c06 Polish IPD bill labels and wording 2026-08-01 16:05:16 +05:30
151ea7a53f Refine IPD charge display and billing print outputs 2026-08-01 15:55:00 +05:30
2ea2f9f2dc Show last assigned bed in IPD bill print 2026-08-01 15:41:59 +05:30
ee9bb7b560 Fix ABHA card barcode print rendering 2026-08-01 03:57:43 +05:30
f7a0beadb2 Fix ABHA card header layout 2026-08-01 03:38:56 +05:30
3d43375ec0 Balance ABHA card header branding 2026-08-01 03:32:00 +05:30
a28c8612e3 Update ABHA card header branding 2026-08-01 03:27:27 +05:30
fde98e9dee Always show OPD profile picture action 2026-08-01 03:12:52 +05:30
b10661c8d0 Refine OPD profile photo flow 2026-08-01 03:06:45 +05:30
7f9d288825 chore(opd): set appointment list DataTable default page length to 100 2026-08-01 02:56:07 +05:30
302f779ea2 fix(discharge): show in-hospital lab only for explicitly selected dates 2026-08-01 02:29:55 +05:30
d751ff9b4b fix(discharge): honor investigation checkbox selection and print manual/special investigations 2026-08-01 02:15:13 +05:30
bb448a38eb fix(discharge-template): stop DIETARY_ADVICE at review section 2026-07-31 18:07:21 +05:30
fb7ea94157 fix(discharge-template): resolve placeholders with flexible token matching 2026-07-31 17:51:01 +05:30
49a2027778 fix(discharge-template): prevent empty template payload on ajax save 2026-07-31 17:46:27 +05:30
d7e5f16f79 fix(ipd-discharge): honor updated DB template instead of forcing content-only fallback 2026-07-31 17:41:15 +05:30
7d5622d958 Harden ABHA cleanup against non-standard patient and OPD key columns 2026-07-30 14:34:08 +05:30
1429ffc567 Fix ABHA cleanup command for non-id bridge queue schemas 2026-07-30 14:32:46 +05:30
3c6121a4ad Gate legacy bridge events by ABHA verification and add cleanup command 2026-07-30 14:30:34 +05:30
b7f789b1c3 Fix auto-flow false failures and remove dead opd.fhir.generated bridge event
- Patient.php: broaden non-fatal-pending detection in abdm_content_auto_flow() to recognize more bridge error wordings (No HIU sessions found / matching the criteria) and HTTP 400, stopping spurious 'Auto flow failed' toasts.
- Opd_prescription.php: remove dead opd.fhir.generated bridge_sync_queue enqueue in storePrescriptionFhirBundle(). This unprefixed event type routed to the CSNOtk terminology bridge which has no consumer for it, always 404ing. Real ABDM sharing already works via DreamsoftConnector::sharePrescriptionBundle() (abdm.fhir.share.requested).
2026-07-30 06:25:45 +05:30
55bcaa7d09 Fix ABDM M3 HIU multi-facility consent session grouping and document display
- Fix groupWorkflowRowsIntoSessions() to correlate workflow rows by stable
  request_id/abdm_consent_request_id instead of chronological proximity to
  the newest CONSENT_REQUEST row. Background polling reconciles all
  historical sessions in one batch, so older sessions' rows previously got
  silently merged into the newest session, causing 'Show Data' to display
  an unrelated older session's single facility instead of all consented
  facilities.
- Skip synthetic orphan sessions (stray rows with no owning CONSENT_REQUEST)
  in getAbdmConsentRequestsList()/getAbdmConsentArtifactDetail() so they
  don't show as phantom history rows or get picked as 'most recent'.
- Fix abdm_documents() consent_request_id filter to match all known sibling
  artifact IDs for a session (via abdm_hiu_consent_artifacts), not just an
  exact single artifact id, so all facilities under one consent request
  appear together.
- Fix CreateAbdmHiuConsentArtifacts migration: reduce VARCHAR(180) to
  VARCHAR(100) on consent_request_id/artifact_id to satisfy MySQL's
  1000-byte composite key length limit (was silently failing to migrate).
- Add fetchAllArtifactsAfterGrant() cascade in M3HiuWorkflowService to fetch
  every known artifact under a granted consent, used by both the cron poll
  and a new abdm_check_live_status() endpoint/button.
- getLatestAbdmSyncSnapshot() session-scoping fix to avoid an older granted
  session masking a newer in-progress one.
- Relabel Dr. Joshi Clinic documents (previously mislabeled 'Test Hospital'
  from the HIP's own FHIR bundle Organization name).
2026-07-30 05:08:44 +05:30
82b7b27273 fix(abha): persist OTP-verified mobile number when bridge response omits it
Abha::verifyOtp() and Abha::verifyCommOtp() were overwriting the
user-typed, OTP-verified mobile number with whatever the ABDM bridge's
verify-otp response echoed back for 'mobile'. Many bridge responses
(especially plain mobile-OTP verification, as opposed to Aadhaar eKYC)
do not echo the mobile at all, so it silently became empty and was
never saved to patient_master.mphone1 during ABHA Register (By ABHA
Number / QR / Facility QR / Mobile OTP) or ABHA Create/Verify.

Fix: fall back to the originally submitted/verified mobile when the
gateway response omits it. Also updated Patient_V.php JS (Verify ABHA
tab, ABHA Register Method 1 and Method 4) to resend the mobile number
along with the verify_comm_otp call so the server has it available.

Address/email are unaffected by this bug: those fields are already
mapped via applyAbhaMetaColumns() when present, but the ABDM mobile-OTP
verification API generally doesn't return KYC demographic data (that
only comes from the Aadhaar-eKYC flow) - so they may legitimately
stay blank for phone-based registration methods.
2026-07-29 13:52:07 +05:30
a5bbe3cc20 fix(abdm): skip TLS verify on self-loopback FHIR gateway handoff call
HMS instances behind NAT with no live public IP can hit an expired/unreachable
TLS cert on their own base_url() when doing the internal handoff self-call to
AbdmGateway::share_prescription_bundle, causing 'Gateway handoff failed:
curl error 60: Peer's Certificate has expired'. This call never leaves the
local server, so skip peer verification by default via new
fhirGatewayHandoffSslVerify() helper. Set FHIR_HANDOFF_SSL_VERIFY=true in .env
to re-enable strict verification on deployments with a valid public cert.

Does not affect the actual outbound ABDM bridge submission (EAtriaBridgeConnector),
which keeps its own independent SSL verification/toggle.
2026-07-29 12:39:05 +05:30
7b1b81ce66 ABDM Fetch Data modal: show attached images/PDFs per document (lazy-loaded via abdm_document_detail, since the list endpoint strips attachments to keep it light) 2026-07-29 03:53:13 +05:30
0a31c6aa12 ABDM UI: remove redundant document-list panel, add Fetch Data button when no records found for a consent request 2026-07-29 03:41:29 +05:30
2e7e33238b Fix fatal memory-exhaustion crash in Consent Request History: cap response_json to NULL for data_fetch/hi_data_push_callback rows
Those operations can store the entire decrypted FHIR bundle (incl. base64 scanned-document attachments, sometimes MB per row) in response_json. fetchAbdmWorkflowRows()/getLatestAbdmSyncSnapshot() only ever read small consent-status/hi_types fields out of response_json, which never appear in bulk data_fetch payloads anyway, so cap it at the SQL level instead of buffering it into PHP memory just to build a list view.
2026-07-29 03:35:46 +05:30
448db54d4c Show fetched-record sections as plain bold headings (no collapse) and resolve DiagnosticReport result Observations to actual lab values 2026-07-29 03:22:35 +05:30
37dba1948e Redesign Consent Request History table columns and add Fetch/Show Data modal with FHIR section accordion 2026-07-29 03:16:24 +05:30