I want to make the Priority Scheduling algorithm only apply if there are users who make a reservation at the same time (example: 09.00.00) for the same reservation slot (example: 13.00).
public function userReservasi(Request $request)
{
$validator = Validator::make($request->all(), [
'tanggal_reservasi' => 'required|date',
'jam_reservasi' => 'required',
'jeniskendala_reservasi' => 'required',
'detail_reservasi' => 'required',
'kendaraan_reservasi' => 'required',
'bengkels_id' => 'required|integer',
'users_id' => 'required|integer',
'kendaraan_id' => 'required|integer'
]);
if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}
$tanggal_reservasi = $request->tanggal_reservasi;
$jam_reservasi = $request->jam_reservasi;
$bengkels_id = (int) $request->bengkels_id;
$kendaraan_id = (int) $request->kendaraan_id;
$englishDayOfWeek = date('l', strtotime($tanggal_reservasi));
$daysInIndonesian = [
'Sunday' => 'Minggu',
'Monday' => 'Senin',
'Tuesday' => 'Selasa',
'Wednesday' => 'Rabu',
'Thursday' => 'Kamis',
'Friday' => 'Jumat',
'Saturday' => 'Sabtu',
];
$dayOfWeek = $daysInIndonesian[$englishDayOfWeek];
$status_reservasi = 'menunggu';
$jamOperasional = JamOperasional::where('bengkels_id', $bengkels_id)
->where('hari_operasional', $dayOfWeek)
->where('jam_operasional', $jam_reservasi)
->first();
if ($jamOperasional && $jamOperasional->slot > 0) {
$createdAtNow = '2024-06-27 10:00:00';
$prioritasBaru = $this->hitungPrioritas($request->kendaraan_reservasi, $request->jeniskendala_reservasi, 1);
if ($jamOperasional->slot == 1) {
$reservasiSama = Reservasi::where('created_at', $createdAtNow)
->orderBy('prioritas', 'desc')
->get();
if ($reservasiSama->count() >= 1) {
$prioritasTertinggi = $reservasiSama->first()->prioritas;
foreach ($reservasiSama as $reservasi) {
if ($reservasi->prioritas < $prioritasTertinggi) {
$reservasi->status_reservasi = 'dibatalkan';
$reservasi->save();
}
}
}
}
$reservasi = Reservasi::create([
'status_reservasi' => $status_reservasi,
'tanggal_reservasi' => $tanggal_reservasi,
'jam_reservasi' => $jam_reservasi,
'jeniskendala_reservasi' => $request->jeniskendala_reservasi,
'detail_reservasi' => $request->detail_reservasi,
'kendaraan_reservasi' => $request->kendaraan_reservasi,
'bengkels_id' => $bengkels_id,
'users_id' => (int) $request->users_id,
'kendaraan_id' => (int)$request->kendaraan_id,
'prioritas' => $prioritasBaru,
'created_at' => $createdAtNow,
]);
DB::commit();
return response()->json([
'status' => true,
'message' => 'Berhasil melakukan reservasi',
'bengkel' => $reservasi
], 201);
} else {
return response()->json([
'status' => false,
'message' => 'Waktu reservasi tidak tersedia',
], 409);
}
}
When I hit the API at the same time why doesn’t the data in status_reservasi which has a lower value change to ‘dibatalkan’.
but if I hit the API again along with 2 more data with the same value, the value of status_reservasi changes to ‘dibatalkan’.
is there something wrong with my code? and which parts need to be repaired? i need your help
I want if there are people who make a reservation at the same time (create_at) when there are 1 remaining reservation slots, then the person with the higher priority value will get that slot, then the person with the lower priority value will have their reservation_status be ‘dibatalkan’