.
This commit is contained in:
parent
102ac2c50a
commit
4d6e825f16
@ -45,7 +45,7 @@ func CreateBooking(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 🌟 PERBAIKAN 1: Ambil Role User dari Token
|
// 🌟 Ambil Role User dari Token
|
||||||
userRoleInterface, _ := c.Get("role")
|
userRoleInterface, _ := c.Get("role")
|
||||||
userRole, _ := userRoleInterface.(string)
|
userRole, _ := userRoleInterface.(string)
|
||||||
|
|
||||||
@ -55,6 +55,21 @@ func CreateBooking(c *gin.Context) {
|
|||||||
return
|
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)
|
// Overlap Check (Mencegah bentrok jadwal)
|
||||||
var count int64
|
var count int64
|
||||||
config.DB.Model(&models.Booking{}).Where(
|
config.DB.Model(&models.Booking{}).Where(
|
||||||
@ -67,7 +82,7 @@ func CreateBooking(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 🌟 PERBAIKAN 1 Lanjutan: Penentuan Status Otomatis
|
// Penentuan Status Otomatis
|
||||||
statusPeminjaman := "Pending" // Default untuk student
|
statusPeminjaman := "Pending" // Default untuk student
|
||||||
if userRole == "lecturer" {
|
if userRole == "lecturer" {
|
||||||
statusPeminjaman = "Approved" // Dosen otomatis disetujui!
|
statusPeminjaman = "Approved" // Dosen otomatis disetujui!
|
||||||
@ -80,7 +95,7 @@ func CreateBooking(c *gin.Context) {
|
|||||||
StartTime: input.StartTime,
|
StartTime: input.StartTime,
|
||||||
EndTime: input.EndTime,
|
EndTime: input.EndTime,
|
||||||
Purpose: input.Purpose,
|
Purpose: input.Purpose,
|
||||||
Status: statusPeminjaman, // <-- Gunakan variabel statusPeminjaman
|
Status: statusPeminjaman,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := config.DB.Create(&booking).Error; err != nil {
|
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) {
|
func GetMyBookings(c *gin.Context) {
|
||||||
var bookings []models.Booking
|
var bookings []models.Booking
|
||||||
|
|
||||||
@ -150,7 +165,6 @@ func UpdateBookingStatus(c *gin.Context) {
|
|||||||
|
|
||||||
booking.Status = input.Status
|
booking.Status = input.Status
|
||||||
|
|
||||||
// 🌟 PERBAIKAN 2: Menghapus blok Save dan JSON ganda yang bikin error
|
|
||||||
if err := config.DB.Save(&booking).Error; err != nil {
|
if err := config.DB.Save(&booking).Error; err != nil {
|
||||||
fmt.Println("🔥 ERROR DARI DATABASE:", err.Error())
|
fmt.Println("🔥 ERROR DARI DATABASE:", err.Error())
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
|
|||||||
@ -66,7 +66,7 @@ export default function ManageRoomsPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
<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]
|
{[...rooms]
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
.map((room) => (
|
.map((room) => (
|
||||||
|
|||||||
@ -92,11 +92,23 @@ export default function AddBookingPage() {
|
|||||||
onChange={(e) => setSelectedRoomId(e.target.value)}
|
onChange={(e) => setSelectedRoomId(e.target.value)}
|
||||||
>
|
>
|
||||||
<option value="" disabled>-- Pilih Ruangan yang Tersedia --</option>
|
<option value="" disabled>-- Pilih Ruangan yang Tersedia --</option>
|
||||||
{rooms.map(room => (
|
|
||||||
<option key={room.room_id} value={room.room_id}>
|
{/* PERBAIKAN: Sortir Ruangan & Disable yang berstatus Maintenance */}
|
||||||
{room.name} (Kapasitas: {room.capacity} | {room.floor})
|
{[...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>
|
</option>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user