This commit is contained in:
[Valentino Heman Budiarto] 2026-06-08 19:49:49 +07:00
parent 4afddbed68
commit 3c1a979e17

View File

@ -34,6 +34,9 @@ var DeviceStatusCache = map[string]string{
"projector": "off", "projector": "off",
} }
// =========================================================================
// FUNGSI 1: VERIFIKASI HARDWARE & HITUNG SISA WAKTU DINAMIS
// =========================================================================
// ========================================================================= // =========================================================================
// FUNGSI 1: VERIFIKASI HARDWARE & HITUNG SISA WAKTU DINAMIS // FUNGSI 1: VERIFIKASI HARDWARE & HITUNG SISA WAKTU DINAMIS
// ========================================================================= // =========================================================================
@ -48,42 +51,34 @@ func VerifyHardwareCode(c *gin.Context) {
tokenInput := req.Token tokenInput := req.Token
sekarang := time.Now() sekarang := time.Now()
// ===================================================================== // 1. Token Master CS
// 🌟 FITUR BARU: MASTER TOKEN UNTUK CS DAN ADMIN (BYPASS DATABASE)
// =====================================================================
// 1. Token Khusus Cleaning Service (Waktu: 60 Menit)
if tokenInput == "CS2026" { if tokenInput == "CS2026" {
fmt.Printf("[VERIFY] Master Token Cleaning Service digunakan pada %v\n", sekarang.Format("15:04:05")) fmt.Printf("[VERIFY] Master Token CS digunakan\n")
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"status": "success", "status": "success", "message": "Token CS Valid", "duration_minutes": 60,
"message": "Token CS Valid",
"duration_minutes": 60,
}) })
return // Berhenti di sini, Golang tidak akan mengecek database return
} }
// 2. Token Khusus Admin / Teknisi (Waktu: 999 Menit / ~16.5 Jam) // 2. Token Master Admin
if tokenInput == "ADM999" { if tokenInput == "ADM999" {
fmt.Printf("[VERIFY] Master Token Admin digunakan pada %v\n", sekarang.Format("15:04:05")) fmt.Printf("[VERIFY] Master Token Admin digunakan\n")
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"status": "success", "status": "success", "message": "Token Admin Valid", "duration_minutes": 999,
"message": "Token Admin Valid",
"duration_minutes": 999,
}) })
return // Berhenti di sini, Golang tidak akan mengecek database return
} }
// =====================================================================
// Jika bukan Master Token, jalankan pengecekan ke Database seperti biasa // -------------------------------------------------------------
var jamMulai time.Time // 🌟 PERBAIKAN DATABASE CASTING BUG (Menggunakan String)
var jamSelesai time.Time // -------------------------------------------------------------
var jamMulaiStr string
var jamSelesaiStr string
isTokenValid := false isTokenValid := false
// Menarik start_time dan end_time sekaligus dari Database
type ResultTime struct { type ResultTime struct {
JamMulai time.Time `gorm:"column:start_time"` JamMulai string `gorm:"column:start_time"`
JamSelesai time.Time `gorm:"column:end_time"` JamSelesai string `gorm:"column:end_time"`
} }
var result ResultTime var result ResultTime
@ -92,9 +87,9 @@ func VerifyHardwareCode(c *gin.Context) {
Where("redeem_code = ?", tokenInput). Where("redeem_code = ?", tokenInput).
Scan(&result).Error Scan(&result).Error
if errBooking == nil && !result.JamSelesai.IsZero() { if errBooking == nil && result.JamSelesai != "" {
jamMulai = result.JamMulai jamMulaiStr = result.JamMulai
jamSelesai = result.JamSelesai jamSelesaiStr = result.JamSelesai
isTokenValid = true isTokenValid = true
} else { } else {
errSchedule := config.DB.Table("class_schedules"). errSchedule := config.DB.Table("class_schedules").
@ -102,9 +97,9 @@ func VerifyHardwareCode(c *gin.Context) {
Where("kode_mk = ?", tokenInput). Where("kode_mk = ?", tokenInput).
Scan(&result).Error Scan(&result).Error
if errSchedule == nil && !result.JamSelesai.IsZero() { if errSchedule == nil && result.JamSelesai != "" {
jamMulai = result.JamMulai jamMulaiStr = result.JamMulai
jamSelesai = result.JamSelesai jamSelesaiStr = result.JamSelesai
isTokenValid = true isTokenValid = true
} }
} }
@ -114,28 +109,26 @@ func VerifyHardwareCode(c *gin.Context) {
return return
} }
// Samakan tanggalnya menjadi tanggal hari ini agar perbandingannya akurat // Memisahkan Jam dan Menit secara manual agar kebal terhadap error format
var startHour, startMin, endHour, endMin int
fmt.Sscanf(jamMulaiStr, "%d:%d", &startHour, &startMin)
fmt.Sscanf(jamSelesaiStr, "%d:%d", &endHour, &endMin)
jamMulaiHariIni := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(), jamMulaiHariIni := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(),
jamMulai.Hour(), jamMulai.Minute(), jamMulai.Second(), 0, sekarang.Location()) startHour, startMin, 0, 0, sekarang.Location())
jamSelesaiHariIni := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(), jamSelesaiHariIni := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(),
jamSelesai.Hour(), jamSelesai.Minute(), jamSelesai.Second(), 0, sekarang.Location()) endHour, endMin, 0, 0, sekarang.Location())
// ------------------------------------------------------------- // Toleransi masuk kelas: 15 Menit sebelum jam dimulai
// 🌟 LOGIKA BARU: CEK APAKAH JADWAL SUDAH DIMULAI?
// -------------------------------------------------------------
// Berikan toleransi bisa masuk ruangan maksimal 15 menit sebelum kelas dimulai
batasMasukAwal := jamMulaiHariIni.Add(-15 * time.Minute) batasMasukAwal := jamMulaiHariIni.Add(-15 * time.Minute)
if sekarang.Before(batasMasukAwal) { if sekarang.Before(batasMasukAwal) {
// Jika saat ini belum waktunya masuk (masih terlalu awal)
c.JSON(http.StatusForbidden, gin.H{"error": "Jadwal kelas belum dimulai"}) c.JSON(http.StatusForbidden, gin.H{"error": "Jadwal kelas belum dimulai"})
return return
} }
// ------------------------------------------------------------- // Cek sisa waktu kelas
// CEK APAKAH JADWAL SUDAH BERAKHIR?
// -------------------------------------------------------------
selisihWaktu := jamSelesaiHariIni.Sub(sekarang) selisihWaktu := jamSelesaiHariIni.Sub(sekarang)
sisaMenit := int(selisihWaktu.Minutes()) sisaMenit := int(selisihWaktu.Minutes())
@ -144,9 +137,6 @@ func VerifyHardwareCode(c *gin.Context) {
return return
} }
// -------------------------------------------------------------
// OPTIONAL: Jika token benar, paksa otomatis catat Lampu ON di Web
// -------------------------------------------------------------
DeviceStatusCache["lampu1"] = "on" DeviceStatusCache["lampu1"] = "on"
DeviceStatusCache["lampu2"] = "on" DeviceStatusCache["lampu2"] = "on"