devsofttech_hms_ci4/run_bed_fix.php
DevSoftTech Server d722714ef1 feat: Complete bed management system with transfer and time tracking
- Implemented automatic bed release on patient discharge
- Added bed transfer functionality in nursing workspace
- Added date/time tracking for bed assignments with duration calculation
- Fixed bed_master.current_ipd_id as source of truth for occupancy
- Created data fix scripts for existing records
- Added bed assignment history with duration display (hours/minutes)
- Fixed display issues in bed assignment tab
- Added route for bed transfer endpoint
- Supports custom assignment datetime for backdated entries
- Automatically marks previous bed as released on transfer
2026-06-09 08:39:48 +05:30

190 lines
5.8 KiB
PHP

<?php
/**
* Run Bed Management Fix
* This script executes the SQL fixes for bed management issues
*/
// Database credentials from .env
$hostname = 'localhost';
$username = 'root';
$password = '';
$database = 'hms_data_ci4';
// Connect to database
$db = new mysqli($hostname, $username, $password, $database);
if ($db->connect_error) {
die("Connection failed: " . $db->connect_error);
}
echo "==============================================\n";
echo "Bed Management Fix Script\n";
echo "==============================================\n\n";
// Step 0: Check current state BEFORE fix
echo "BEFORE FIX - Current State:\n";
echo "----------------------------\n";
$query = "
SELECT
COUNT(CASE WHEN bed_status = 'available' THEN 1 END) as available_beds,
COUNT(CASE WHEN bed_status = 'occupied' THEN 1 END) as occupied_beds,
COUNT(*) as total_beds
FROM bed_master
WHERE status = 'active'
";
$result = $db->query($query);
$row = $result->fetch_object();
echo "Total Beds: {$row->total_beds}\n";
echo "Available: {$row->available_beds}\n";
echo "Occupied: {$row->occupied_beds}\n";
$query = "SELECT COUNT(*) as current_admissions FROM ipd_master WHERE ipd_status = 0";
$result = $db->query($query);
$row = $result->fetch_object();
echo "Current Admissions: {$row->current_admissions}\n";
$query = "
SELECT COUNT(*) as problem_beds
FROM bed_master bm
INNER JOIN ipd_master i ON i.id = bm.current_ipd_id
WHERE i.ipd_status = 1
AND bm.current_ipd_id IS NOT NULL
";
$result = $db->query($query);
$row = $result->fetch_object();
echo "Beds stuck with discharged patients: {$row->problem_beds}\n\n";
// Step 1: Release beds for discharged patients (MAIN FIX)
echo "Step 1: Releasing beds for discharged patients...\n";
$sql = "
UPDATE bed_master bm
INNER JOIN ipd_master i ON i.id = bm.current_ipd_id
SET
bm.bed_status = 'available',
bm.current_ipd_id = NULL
WHERE i.ipd_status = 1
AND bm.current_ipd_id IS NOT NULL
";
$db->query($sql);
$affected = $db->affected_rows;
echo "✓ Released {$affected} beds\n\n";
// Step 1b: Fix phantom occupied beds (occupied status but no patient assigned)
echo "Step 1b: Fixing phantom occupied beds (occupied but no current_ipd_id)...\n";
$sql = "
UPDATE bed_master
SET bed_status = 'available'
WHERE bed_status = 'occupied'
AND current_ipd_id IS NULL
";
$db->query($sql);
$affected = $db->affected_rows;
echo "✓ Fixed {$affected} phantom occupied beds\n\n";
// Step 1c: Sync bed_assignment_history to bed_master.current_ipd_id
echo "Step 1c: Syncing bed assignments from history to bed_master...\n";
$sql = "
UPDATE bed_master bm
INNER JOIN bed_assignment_history bah ON bah.bed_id = bm.id
INNER JOIN ipd_master i ON i.id = bah.ipd_id
SET
bm.current_ipd_id = bah.ipd_id,
bm.bed_status = 'occupied'
WHERE i.ipd_status = 0
AND bah.released_date IS NULL
AND bm.current_ipd_id IS NULL
";
$db->query($sql);
$affected = $db->affected_rows;
echo "✓ Synced {$affected} bed assignments\n\n";
// Step 2: Update bed_assignment_history (if table exists)
$tableCheck = $db->query("SHOW TABLES LIKE 'bed_assignment_history'");
if ($tableCheck->num_rows > 0) {
echo "Step 2: Updating bed_assignment_history...\n";
$sql = "
UPDATE bed_assignment_history bah
INNER JOIN ipd_master i ON i.id = bah.ipd_id
SET
bah.released_date = COALESCE(i.discharge_date, NOW()),
bah.release_reason = 'Patient Discharged (Data Fix)'
WHERE i.ipd_status = 1
AND bah.released_date IS NULL
";
$db->query($sql);
$affected = $db->affected_rows;
echo "✓ Updated {$affected} history records\n\n";
} else {
echo "Step 2: bed_assignment_history table not found, skipping...\n\n";
}
// Step 3: Verify the fix
echo "AFTER FIX - Verification:\n";
echo "-------------------------\n";
$query = "
SELECT
COUNT(CASE WHEN bed_status = 'available' THEN 1 END) as available_beds,
COUNT(CASE WHEN bed_status = 'occupied' THEN 1 END) as occupied_beds,
COUNT(*) as total_beds
FROM bed_master
WHERE status = 'active'
";
$result = $db->query($query);
$row = $result->fetch_object();
echo "Total Beds: {$row->total_beds}\n";
echo "Available: {$row->available_beds}\n";
echo "Occupied: {$row->occupied_beds}\n";
$query = "SELECT COUNT(*) as current_admissions FROM ipd_master WHERE ipd_status = 0";
$result = $db->query($query);
$row = $result->fetch_object();
echo "Current Admissions: {$row->current_admissions}\n";
$query = "
SELECT COUNT(*) as problem_beds
FROM bed_master bm
INNER JOIN ipd_master i ON i.id = bm.current_ipd_id
WHERE i.ipd_status = 1
AND bm.current_ipd_id IS NOT NULL
";
$result = $db->query($query);
$row = $result->fetch_object();
echo "Beds stuck with discharged patients: {$row->problem_beds}\n\n";
// Check for any mismatches
$query = "
SELECT
bm.id,
bm.bed_number,
bm.bed_code,
bm.bed_status,
bm.current_ipd_id
FROM bed_master bm
LEFT JOIN ward_master w ON w.id = bm.ward_id
WHERE bm.bed_status = 'occupied'
AND bm.current_ipd_id IS NULL
LIMIT 5
";
$result = $db->query($query);
if ($result->num_rows > 0) {
echo "⚠ Warning: Found beds marked 'occupied' but no current_ipd_id:\n";
while ($bed = $result->fetch_assoc()) {
echo " - Bed #{$bed['bed_number']} (ID: {$bed['id']})\n";
}
echo "\n";
} else {
echo "✓ No status mismatches found\n\n";
}
$db->close();
echo "==============================================\n";
echo "Fix completed successfully!\n";
echo "==============================================\n";
echo "\nNext steps:\n";
echo "1. Check bed status at: /setting/admin/bed-status\n";
echo "2. Test discharge a patient and verify bed is released\n";
echo "3. Test admitting a patient and verify bed is assigned\n";