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:
@@ -1,5 +1,5 @@
|
|||||||
import { useState, useLayoutEffect, useRef, useEffect } from 'react'
|
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 { 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 { MOCK_DISCOUNTS } from '../../pages/DiscountsPage'
|
||||||
import type { Discount } 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)
|
const hourlyHours = Math.max(0, endHour - startHour)
|
||||||
// Calculate room cost: sum per-night prices from availability overrides, fall back to baseRate
|
// Calculate room cost: sum per-night prices from availability overrides, fall back to baseRate
|
||||||
|
const nightCount = Math.floor(nights)
|
||||||
const roomNightlyTotal = (() => {
|
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 catId = room.categoryId
|
||||||
const catOverrides = catId ? priceOverrides?.[catId] : undefined
|
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
|
let sum = 0
|
||||||
for (let i = 0; i < nights; i++) {
|
for (let i = 0; i < nightCount; i++) {
|
||||||
const d = format(addDays(new Date(form.checkIn), i), 'yyyy-MM-dd')
|
const d = format(addDays(parseISO(form.checkIn), i), 'yyyy-MM-dd')
|
||||||
sum += catOverrides[d] ?? room.baseRate ?? 0
|
const p = catOverrides[d]
|
||||||
|
sum += (typeof p === 'number' && isFinite(p)) ? p : fallback
|
||||||
}
|
}
|
||||||
return sum
|
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">
|
<p className="text-xs text-slate-400 mb-0.5">
|
||||||
{isHourly && room.allowHourly
|
{isHourly && room.allowHourly
|
||||||
? `${hourlyHours} ч × ${(room.hourlyRate ?? 0).toLocaleString('ru-RU')} ₽`
|
? `${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')} ₽`}
|
{discountAmount > 0 && ` − ${discountAmount.toLocaleString('ru-RU')} ₽`}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
Reference in New Issue
Block a user