BUG-DASH-280826 - perbaiki sumber data checkout dan definisi Checked Out di dashboard

sp_generate_dashboard_data menebak Mcu_CheckinoutOutTime dari MAX() timestamp
event lab (sample receive/sampling done), bukan dari checkout fisik pasien,
sehingga pasien yang belum checkout bisa tampil "Checked Out" walau stationnya
belum selesai. Ganti sumbernya ke cpone.preregister_checkin_checkout (log
checkin/checkout asli) dan hentikan pemaksaan Mcu_CheckinoutID = order_id yang
bentrok untuk project multi-hari.

KPI "Checked Out" di GetKPI juga diselaraskan dengan detail pasien: sekarang
hitung dari GetAllPatients dan mensyaratkan semua station wajib sudah selesai,
bukan cuma checkout fisik saja, supaya angka KPI dan modal detail selalu sinkron.
This commit is contained in:
sas.fajri
2026-08-28 16:09:04 +07:00
parent a35df69be9
commit 558f44b7c2
3 changed files with 267 additions and 27 deletions

View File

@@ -93,31 +93,25 @@ func GetKPI(mcuID int, dateFrom, dateTo string) (KPIData, error) {
AND Mcu_ParticipantDailyIsActive = 'Y'
`, mcuID, dateFrom, dateTo).Scan(&d.InvitedStaff)
// Total staff: semua yang datang (checkin) pada tanggal filter
db.DB.QueryRow(`
SELECT COUNT(DISTINCT Mcu_CheckinoutPreregisterID) FROM mcu_checkinout
WHERE Mcu_CheckinoutMcuID = ?
AND Mcu_CheckinoutDate BETWEEN ? AND ?
AND Mcu_CheckinoutIsActive = 'Y'
`, mcuID, dateFrom, dateTo).Scan(&d.TotalStaff)
// Checked-in: masih di dalam (belum checkout)
db.DB.QueryRow(`
SELECT COUNT(DISTINCT Mcu_CheckinoutPreregisterID) FROM mcu_checkinout
WHERE Mcu_CheckinoutMcuID = ?
AND Mcu_CheckinoutDate BETWEEN ? AND ?
AND Mcu_CheckinoutOutTime IS NULL
AND Mcu_CheckinoutIsActive = 'Y'
`, mcuID, dateFrom, dateTo).Scan(&d.CheckedIn)
// Checked-out: sudah selesai
db.DB.QueryRow(`
SELECT COUNT(DISTINCT Mcu_CheckinoutPreregisterID) FROM mcu_checkinout
WHERE Mcu_CheckinoutMcuID = ?
AND Mcu_CheckinoutDate BETWEEN ? AND ?
AND Mcu_CheckinoutOutTime IS NOT NULL
AND Mcu_CheckinoutIsActive = 'Y'
`, mcuID, dateFrom, dateTo).Scan(&d.CheckedOut)
// Total staff / checked-in / checked-out dihitung dari sumber yang sama dengan
// detail pasien (GetAllPatients), supaya KPI card dan modal detail selalu sinkron.
// "Checked Out" hanya terhitung kalau pasien SUDAH checkout DAN semua station
// wajibnya sudah selesai — checkout fisik saja tidak cukup.
patients, err := GetAllPatients(mcuID, dateFrom, dateTo)
if err != nil {
return d, err
}
for _, p := range patients {
if p.InTime == "" {
continue
}
d.TotalStaff++
if p.HasOut && p.ProgressStatus == "done" {
d.CheckedOut++
} else {
d.CheckedIn++
}
}
return d, nil
}