diff --git a/backend/controllers/bookingcontroller.go b/backend/controllers/bookingcontroller.go index 9b65d86..a27c93f 100644 --- a/backend/controllers/bookingcontroller.go +++ b/backend/controllers/bookingcontroller.go @@ -45,7 +45,7 @@ func CreateBooking(c *gin.Context) { return } - // 🌟 PERBAIKAN 1: Ambil Role User dari Token + // 🌟 Ambil Role User dari Token userRoleInterface, _ := c.Get("role") userRole, _ := userRoleInterface.(string) @@ -55,6 +55,21 @@ func CreateBooking(c *gin.Context) { return } + // ========================================================= + // 🌟 PERBAIKAN: PROTEKSI STATUS MAINTENANCE RUANGAN + // ========================================================= + var targetRoom models.Room + if err := config.DB.First(&targetRoom, input.RoomID).Error; err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "Ruangan tidak ditemukan di database"}) + return + } + + if targetRoom.Status == "Maintenance" { + c.JSON(http.StatusForbidden, gin.H{"error": "Akses Ditolak: Ruangan ini sedang dalam perawatan teknis dan tidak dapat dipesan saat ini."}) + return + } + // ========================================================= + // Overlap Check (Mencegah bentrok jadwal) var count int64 config.DB.Model(&models.Booking{}).Where( @@ -67,7 +82,7 @@ func CreateBooking(c *gin.Context) { return } - // 🌟 PERBAIKAN 1 Lanjutan: Penentuan Status Otomatis + // Penentuan Status Otomatis statusPeminjaman := "Pending" // Default untuk student if userRole == "lecturer" { statusPeminjaman = "Approved" // Dosen otomatis disetujui! @@ -80,7 +95,7 @@ func CreateBooking(c *gin.Context) { StartTime: input.StartTime, EndTime: input.EndTime, Purpose: input.Purpose, - Status: statusPeminjaman, // <-- Gunakan variabel statusPeminjaman + Status: statusPeminjaman, } if err := config.DB.Create(&booking).Error; err != nil { @@ -95,7 +110,7 @@ func CreateBooking(c *gin.Context) { }) } -// 🌟 PERBAIKAN 3: Fungsi khusus untuk mengambil riwayat pribadi +// Fungsi khusus untuk mengambil riwayat pribadi func GetMyBookings(c *gin.Context) { var bookings []models.Booking @@ -150,7 +165,6 @@ func UpdateBookingStatus(c *gin.Context) { booking.Status = input.Status - // 🌟 PERBAIKAN 2: Menghapus blok Save dan JSON ganda yang bikin error if err := config.DB.Save(&booking).Error; err != nil { fmt.Println("🔥 ERROR DARI DATABASE:", err.Error()) c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) @@ -255,4 +269,4 @@ func GetAllBookings(c *gin.Context) { "status": "success", "data": bookings, }) -} +} \ No newline at end of file diff --git a/frontend/app/admin/rooms/page.tsx b/frontend/app/admin/rooms/page.tsx index cefc934..8d8ad37 100644 --- a/frontend/app/admin/rooms/page.tsx +++ b/frontend/app/admin/rooms/page.tsx @@ -66,7 +66,7 @@ export default function ManageRoomsPage() {
- {/* TAMBAHKAN [...rooms].sort(...) SEBELUM .map */} + {/* [...rooms].sort memastikan urutan kelas selalu rapi dari D101, D102, dst */} {[...rooms] .sort((a, b) => a.name.localeCompare(b.name)) .map((room) => ( diff --git a/frontend/app/dashboard/bookings/add/page.tsx b/frontend/app/dashboard/bookings/add/page.tsx index 3b6163b..f483078 100644 --- a/frontend/app/dashboard/bookings/add/page.tsx +++ b/frontend/app/dashboard/bookings/add/page.tsx @@ -92,11 +92,23 @@ export default function AddBookingPage() { onChange={(e) => setSelectedRoomId(e.target.value)} > - {rooms.map(room => ( - ))} +