diff --git a/backend/controllers/hardwarecontroller.go b/backend/controllers/hardwarecontroller.go index e44ce23..1573563 100644 --- a/backend/controllers/hardwarecontroller.go +++ b/backend/controllers/hardwarecontroller.go @@ -34,6 +34,9 @@ var DeviceStatusCache = map[string]string{ "projector": "off", } +// ========================================================================= +// 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 sekarang := time.Now() - // ===================================================================== - // 🌟 FITUR BARU: MASTER TOKEN UNTUK CS DAN ADMIN (BYPASS DATABASE) - // ===================================================================== - - // 1. Token Khusus Cleaning Service (Waktu: 60 Menit) + // 1. Token Master CS 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{ - "status": "success", - "message": "Token CS Valid", - "duration_minutes": 60, + "status": "success", "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" { - 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{ - "status": "success", - "message": "Token Admin Valid", - "duration_minutes": 999, + "status": "success", "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 - var jamSelesai time.Time + // ------------------------------------------------------------- + // 🌟 PERBAIKAN DATABASE CASTING BUG (Menggunakan String) + // ------------------------------------------------------------- + var jamMulaiStr string + var jamSelesaiStr string isTokenValid := false - // Menarik start_time dan end_time sekaligus dari Database type ResultTime struct { - JamMulai time.Time `gorm:"column:start_time"` - JamSelesai time.Time `gorm:"column:end_time"` + JamMulai string `gorm:"column:start_time"` + JamSelesai string `gorm:"column:end_time"` } var result ResultTime @@ -92,9 +87,9 @@ func VerifyHardwareCode(c *gin.Context) { Where("redeem_code = ?", tokenInput). Scan(&result).Error - if errBooking == nil && !result.JamSelesai.IsZero() { - jamMulai = result.JamMulai - jamSelesai = result.JamSelesai + if errBooking == nil && result.JamSelesai != "" { + jamMulaiStr = result.JamMulai + jamSelesaiStr = result.JamSelesai isTokenValid = true } else { errSchedule := config.DB.Table("class_schedules"). @@ -102,9 +97,9 @@ func VerifyHardwareCode(c *gin.Context) { Where("kode_mk = ?", tokenInput). Scan(&result).Error - if errSchedule == nil && !result.JamSelesai.IsZero() { - jamMulai = result.JamMulai - jamSelesai = result.JamSelesai + if errSchedule == nil && result.JamSelesai != "" { + jamMulaiStr = result.JamMulai + jamSelesaiStr = result.JamSelesai isTokenValid = true } } @@ -114,28 +109,26 @@ func VerifyHardwareCode(c *gin.Context) { 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(), - jamMulai.Hour(), jamMulai.Minute(), jamMulai.Second(), 0, sekarang.Location()) + startHour, startMin, 0, 0, sekarang.Location()) jamSelesaiHariIni := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(), - jamSelesai.Hour(), jamSelesai.Minute(), jamSelesai.Second(), 0, sekarang.Location()) + endHour, endMin, 0, 0, sekarang.Location()) - // ------------------------------------------------------------- - // 🌟 LOGIKA BARU: CEK APAKAH JADWAL SUDAH DIMULAI? - // ------------------------------------------------------------- - // Berikan toleransi bisa masuk ruangan maksimal 15 menit sebelum kelas dimulai + // Toleransi masuk kelas: 15 Menit sebelum jam dimulai batasMasukAwal := jamMulaiHariIni.Add(-15 * time.Minute) if sekarang.Before(batasMasukAwal) { - // Jika saat ini belum waktunya masuk (masih terlalu awal) c.JSON(http.StatusForbidden, gin.H{"error": "Jadwal kelas belum dimulai"}) return } - // ------------------------------------------------------------- - // CEK APAKAH JADWAL SUDAH BERAKHIR? - // ------------------------------------------------------------- + // Cek sisa waktu kelas selisihWaktu := jamSelesaiHariIni.Sub(sekarang) sisaMenit := int(selisihWaktu.Minutes()) @@ -144,9 +137,6 @@ func VerifyHardwareCode(c *gin.Context) { return } - // ------------------------------------------------------------- - // OPTIONAL: Jika token benar, paksa otomatis catat Lampu ON di Web - // ------------------------------------------------------------- DeviceStatusCache["lampu1"] = "on" DeviceStatusCache["lampu2"] = "on" @@ -299,4 +289,4 @@ func GetHardwareStatus(c *gin.Context) { "status": "success", "data": DeviceStatusCache, }) -} \ No newline at end of file +}