Fix booking creation: localStorage token, conflict detection, paid_amount

- Fix api.ts getToken/saveToken to read from localStorage (matching AuthContext) — was reading sessionStorage causing all API requests to fail auth until refresh
- Fix session cleanup on 401 to use localStorage
- Add isConflict/availableRooms helpers to BookingModal; show amber warning when selected room is occupied with clickable free room suggestions
- Pass bookings prop to BookingModal via BookingCalendar
- Add paid_amount to backend POST /bookings INSERT
- Show alert() when booking creation fails so user sees the error
- Pass paidAmount in CalendarPage handleCreate

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-17 19:48:37 +03:00
parent e59bc752b0
commit 684073c4ad
5 changed files with 61 additions and 12 deletions

View File

@@ -58,7 +58,7 @@ const bookings: FastifyPluginAsync = async (fastify) => {
fastify.post<SlugParam & { Body: {
room_id: string; guest_name: string; guest_email?: string; guest_phone?: string
check_in: string; check_out: string; adults?: number; children?: number
status?: string; source?: string; total_amount?: number; notes?: string
status?: string; source?: string; total_amount?: number; paid_amount?: number; notes?: string
} }>(
'/api/hotels/:slug/bookings',
{ onRequest: [fastify.authenticate] },
@@ -76,7 +76,7 @@ const bookings: FastifyPluginAsync = async (fastify) => {
const {
room_id, guest_name, guest_email, guest_phone,
check_in, check_out, adults = 1, children = 0,
status = 'confirmed', source = 'direct', total_amount, notes,
status = 'confirmed', source = 'direct', total_amount, paid_amount = 0, notes,
} = request.body
// Check for conflicts
@@ -88,17 +88,17 @@ const bookings: FastifyPluginAsync = async (fastify) => {
[room_id, check_out, check_in],
)
if (conflicts.length > 0) {
return reply.code(409).send({ error: 'Room already booked for these dates' })
return reply.code(409).send({ error: 'Номер уже занят на эти даты' })
}
const { rows } = await db.query(
`INSERT INTO bookings
(hotel_id, room_id, guest_name, guest_email, guest_phone, check_in, check_out,
adults, children, status, source, total_amount, notes)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13) RETURNING *`,
adults, children, status, source, total_amount, paid_amount, notes)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14) RETURNING *`,
[hotelId, room_id, guest_name, guest_email ?? null, guest_phone ?? null,
check_in, check_out, adults, children, status, source,
total_amount ?? null, notes ?? null],
total_amount ?? 0, paid_amount, notes ?? null],
)
return reply.code(201).send(rows[0])
},