fix: robust night price calculation in BookingModal + clear test DB data

- Use parseISO instead of new Date() for safer date parsing
- Use Math.floor(nights) to avoid float iteration issues
- Type-check override price before using (typeof p === 'number')
- Label now shows actual sum from overrides instead of baseRate × nights

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-23 16:54:17 +03:00
parent 15936753b9
commit ce20c6545d

View File

@@ -1,5 +1,5 @@
import { useState, useLayoutEffect, useRef, useEffect } from 'react'
import { format, addDays } from 'date-fns'
import { format, addDays, parseISO } from 'date-fns'
import { Star, Banknote, CreditCard, AlertCircle, Map, Plus, Trash2, Tag, Minus, BedDouble, Tv2, Send, Loader2, CheckCircle2, Clock, CalendarDays, User, Phone } from 'lucide-react'
import { MOCK_DISCOUNTS } from '../../pages/DiscountsPage'
import type { Discount } from '../../pages/DiscountsPage'
@@ -332,15 +332,18 @@ export function BookingModal({ open, draft, rooms, bookings = [], onClose, onSav
const hourlyHours = Math.max(0, endHour - startHour)
// Calculate room cost: sum per-night prices from availability overrides, fall back to baseRate
const nightCount = Math.floor(nights)
const roomNightlyTotal = (() => {
if (!room || !form.checkIn || !form.checkOut || nights <= 0) return 0
if (!room || !form.checkIn || nightCount <= 0) return 0
const catId = room.categoryId
const catOverrides = catId ? priceOverrides?.[catId] : undefined
if (!catOverrides) return (room.baseRate ?? 0) * nights
const fallback = room.baseRate ?? 0
if (!catOverrides) return fallback * nightCount
let sum = 0
for (let i = 0; i < nights; i++) {
const d = format(addDays(new Date(form.checkIn), i), 'yyyy-MM-dd')
sum += catOverrides[d] ?? room.baseRate ?? 0
for (let i = 0; i < nightCount; i++) {
const d = format(addDays(parseISO(form.checkIn), i), 'yyyy-MM-dd')
const p = catOverrides[d]
sum += (typeof p === 'number' && isFinite(p)) ? p : fallback
}
return sum
})()
@@ -1289,7 +1292,7 @@ export function BookingModal({ open, draft, rooms, bookings = [], onClose, onSav
<p className="text-xs text-slate-400 mb-0.5">
{isHourly && room.allowHourly
? `${hourlyHours} ч × ${(room.hourlyRate ?? 0).toLocaleString('ru-RU')}`
: `${nights} ${nights === 1 ? 'ночь' : nights < 5 ? 'ночи' : 'ночей'} × ${room.baseRate.toLocaleString('ru-RU')}`
: `${nightCount} ${nightCount === 1 ? 'ночь' : nightCount < 5 ? 'ночи' : 'ночей'} · ${roomNightlyTotal.toLocaleString('ru-RU')}`
}
{discountAmount > 0 && ` ${discountAmount.toLocaleString('ru-RU')}`}
</p>