This commit is contained in:
[Valentino Heman Budiarto] 2026-06-22 16:07:24 +07:00
parent 102ac2c50a
commit 4d6e825f16
3 changed files with 36 additions and 10 deletions

View File

@ -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,
})
}
}

View File

@ -66,7 +66,7 @@ export default function ManageRoomsPage() {
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{/* 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) => (

View File

@ -92,11 +92,23 @@ export default function AddBookingPage() {
onChange={(e) => setSelectedRoomId(e.target.value)}
>
<option value="" disabled>-- Pilih Ruangan yang Tersedia --</option>
{rooms.map(room => (
<option key={room.room_id} value={room.room_id}>
{room.name} (Kapasitas: {room.capacity} | {room.floor})
{/* PERBAIKAN: Sortir Ruangan & Disable yang berstatus Maintenance */}
{[...rooms]
.sort((a, b) => a.name.localeCompare(b.name))
.map((room) => (
<option
key={room.room_id}
value={room.room_id}
disabled={room.status === 'Maintenance'}
className={room.status === 'Maintenance' ? 'text-gray-400 bg-gray-100' : 'text-gray-900'}
>
{room.name} {room.status === 'Maintenance'
? '[TIDAK TERSEDIA - SEDANG PERAWATAN]'
: `(Kapasitas: ${room.capacity} | ${room.floor})`}
</option>
))}
</select>
</div>
</div>