Skip to content

Commit

Permalink
Merge pull request #136 from utaipei-sa/marvelcn015/urb-76-物品有交集的時間段就…
Browse files Browse the repository at this point in the history
…算總預約數量超過可預約數量也可以預約並驗證成功

Fix: prevert from reserving overlapping items
  • Loading branch information
marvelcn015 authored Jan 17, 2025
2 parents b535699 + f0529d8 commit 1eb6bf3
Showing 1 changed file with 34 additions and 13 deletions.
47 changes: 34 additions & 13 deletions routes/reserve/post_reserve.js
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ router.post('/reserve', [
start_datetime
) &&
received_space_reserved_time[i].space_id ===
space_reservation.space_id
space_reservation.space_id
) {
stop_flag = 1
break
Expand Down Expand Up @@ -371,26 +371,47 @@ router.post('/reserve', [
let db_item_check
let max_quantity
for (let i = 0; i < received_item_reserved_time.length; i++) {
max_quantity = await ItemRepository.findItemById(received_item_reserved_time[i].item_id)
const current_reservation = received_item_reserved_time[i]
max_quantity = await ItemRepository.findItemById(current_reservation.item_id)

let total_reserved_quantity = current_reservation.reserved_quantity

db_item_check = await ItemRepository.findSlotByStartTime(
received_item_reserved_time[i].item_id,
received_item_reserved_time[i].start_datetime
current_reservation.item_id,
current_reservation.start_datetime
)
const item_reserved_quantity = db_item_check?.reserved_quantity || 0
if (
item_reserved_quantity <=
max_quantity?.quantity - received_item_reserved_time[i].reserved_quantity
) continue

res
.status(400)
.json(
if (db_item_check?.reserved_quantity) {
total_reserved_quantity += db_item_check.reserved_quantity
}

for (let j = 0; j < received_item_reserved_time.length; j++) {
if (i === j) continue // 跳過自己

const other_reservation = received_item_reserved_time[j]
if (current_reservation.item_id.toString() !== other_reservation.item_id.toString()) continue

// 檢查時間是否重疊
const current_start = dayjs(current_reservation.start_datetime)
const current_end = dayjs(current_reservation.end_datetime)
const other_start = dayjs(other_reservation.start_datetime)
const other_end = dayjs(other_reservation.end_datetime)

if (current_start.isBefore(other_end) && other_start.isBefore(current_end)) {
total_reserved_quantity += other_reservation.reserved_quantity
}
}

// 檢查總預約數量是否超過限制
if (total_reserved_quantity > max_quantity.quantity) {
res.status(400).json(
error_response(
R_INVALID_RESERVATION,
'item_datetime has over reserved error'
)
)
return
return
}
}

// insert reservation into database
Expand Down

0 comments on commit 1eb6bf3

Please sign in to comment.