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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user