From ff6de00988f5f9001a0da1ae2d7135d034dd1c83 Mon Sep 17 00:00:00 2001 From: Asya Vee Date: Wed, 27 Aug 2025 02:50:13 +0400 Subject: [PATCH] fix the capacity and NaN participants issue --- apps/pocketbase/pb_data/auxiliary.db | Bin 1269760 -> 1695744 bytes apps/pocketbase/pb_data/data.db | Bin 229376 -> 229376 bytes .../1756248097_updated_bookingTypes.js | 29 +++++ .../[id]/available-dates/route.ts | 70 ++++++++++++ .../booking-types/[id]/time-slots/route.ts | 102 +++++++++++++++++ apps/web/components/BookingForm.tsx | 103 +++++++----------- apps/web/components/CustomerDetails.tsx | 4 +- apps/web/components/TimeSlotSelector.tsx | 7 +- apps/web/types/bookings.ts | 1 + 9 files changed, 248 insertions(+), 68 deletions(-) create mode 100644 apps/pocketbase/pb_migrations/1756248097_updated_bookingTypes.js create mode 100644 apps/web/app/api/booking-types/[id]/available-dates/route.ts create mode 100644 apps/web/app/api/booking-types/[id]/time-slots/route.ts diff --git a/apps/pocketbase/pb_data/auxiliary.db b/apps/pocketbase/pb_data/auxiliary.db index 515babcb63aaa8bdfbaad048d30db08159f6fb5d..b0d5595f26dd0e613e8c2780f9263ce100ff1ad7 100644 GIT binary patch delta 106282 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 +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_43114331") + + // add field + collection.fields.addAt(13, new Field({ + "hidden": false, + "id": "select2363381545", + "maxSelect": 1, + "name": "type", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "workshop", + "rental" + ] + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_43114331") + + // remove field + collection.fields.removeById("select2363381545") + + return app.save(collection) +}) diff --git a/apps/web/app/api/booking-types/[id]/available-dates/route.ts b/apps/web/app/api/booking-types/[id]/available-dates/route.ts new file mode 100644 index 0000000..9b9e43a --- /dev/null +++ b/apps/web/app/api/booking-types/[id]/available-dates/route.ts @@ -0,0 +1,70 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { bookingApi } from '@/lib/pocketbase'; + +export async function GET( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + try { + const { id: bookingTypeId } = await params; + + // Get booking type details to get the actual capacity + const bookingTypes = await bookingApi.getBookingTypes(); + const bookingType = bookingTypes.find(bt => bt.id === bookingTypeId); + + if (!bookingType) { + return NextResponse.json({ error: 'Booking type not found' }, { status: 404 }); + } + + const bookingCapacity = bookingType.booking_capacity; + + // Get time slots for this booking type + const timeSlots = await bookingApi.getTimeSlotsForBookingType(bookingTypeId); + + // Generate all available dates based on recurrence patterns + const availableSlotsByDate = await bookingApi.generateAvailableTimeSlots(timeSlots); + + // Get all dates and check capacity for each + const availableDates: string[] = []; + + for (const date of Object.keys(availableSlotsByDate)) { + // Get bookings for this date + const bookings = await bookingApi.getBookingsForDate(date, [bookingTypeId]); + + // Check if any time slots have capacity available + const slotsForDate = availableSlotsByDate[date]; + const hasAvailableSlots = slotsForDate.some(slot => { + const slotStart = new Date(slot.start_time); + const slotEnd = new Date(slot.end_time); + + const overlappingBookings = bookings.filter(booking => { + const bookingStart = new Date(booking.start_time); + const bookingEnd = new Date(booking.end_time); + return bookingStart < slotEnd && bookingEnd > slotStart; + }); + + const totalParticipants = overlappingBookings.reduce((sum, booking) => + sum + (booking.participants_count || 0), 0 + ); + + return totalParticipants < bookingCapacity; + }); + + if (hasAvailableSlots) { + availableDates.push(date); + } + } + + return NextResponse.json({ + bookingTypeId, + availableDates: availableDates.sort() + }); + + } catch (error) { + console.error('Error fetching available dates:', error); + return NextResponse.json( + { error: 'Failed to fetch available dates' }, + { status: 500 } + ); + } +} \ No newline at end of file diff --git a/apps/web/app/api/booking-types/[id]/time-slots/route.ts b/apps/web/app/api/booking-types/[id]/time-slots/route.ts new file mode 100644 index 0000000..1b19f3b --- /dev/null +++ b/apps/web/app/api/booking-types/[id]/time-slots/route.ts @@ -0,0 +1,102 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { bookingApi } from '@/lib/pocketbase'; + +export async function GET( + request: NextRequest, + { params }: { params: Promise<{ id: string }> } +) { + try { + const { id: bookingTypeId } = await params; + const { searchParams } = new URL(request.url); + const date = searchParams.get('date'); + + if (!date) { + return NextResponse.json({ error: 'Date parameter required' }, { status: 400 }); + } + + // Get booking type details to get the actual capacity + const bookingTypes = await bookingApi.getBookingTypes(); + const bookingType = bookingTypes.find(bt => bt.id === bookingTypeId); + + if (!bookingType) { + return NextResponse.json({ error: 'Booking type not found' }, { status: 404 }); + } + + const bookingCapacity = bookingType.booking_capacity; + + // Get time slots for this booking type + const timeSlots = await bookingApi.getTimeSlotsForBookingType(bookingTypeId); + + // Generate available slots for all dates + const availableSlotsByDate = await bookingApi.generateAvailableTimeSlots(timeSlots); + const slotsForDate = availableSlotsByDate[date] || []; + + if (slotsForDate.length === 0) { + return NextResponse.json({ + date, + bookingTypeId, + timeSlots: [] + }); + } + + // Get existing bookings for this date + const bookings = await bookingApi.getBookingsForDate(date, [bookingTypeId]); + console.log(`\n=== Bookings for ${date} and booking type ${bookingTypeId} ===`); + console.log('Number of bookings found:', bookings.length); + bookings.forEach((booking, i) => { + console.log(`Booking ${i+1}: ${booking.start_time} - ${booking.end_time}, participants: ${booking.participants_count}`); + }); + + // Calculate capacity for each slot + const slotsWithCapacity = slotsForDate.map((slot, index) => { + const slotStart = new Date(slot.start_time); + const slotEnd = new Date(slot.end_time); + + console.log(`\n=== Checking slot ${slot.start_time} - ${slot.end_time} ===`); + console.log('Available bookings for date:', bookings.length); + + const overlappingBookings = bookings.filter(booking => { + const bookingStart = new Date(booking.start_time); + const bookingEnd = new Date(booking.end_time); + const overlaps = bookingStart < slotEnd && bookingEnd > slotStart; + + console.log(`Booking ${booking.start_time} - ${booking.end_time}: overlaps = ${overlaps}`); + return overlaps; + }); + + const totalParticipants = overlappingBookings.reduce((sum, booking) => + sum + (booking.participants_count || 0), 0 + ); + + const availableCapacity = Math.max(0, bookingCapacity - totalParticipants); + + console.log(`Total participants: ${totalParticipants}, Capacity: ${bookingCapacity}, Available: ${availableCapacity}`); + + return { + id: `slot-${date}-${index}`, + start_time: slot.start_time, + end_time: slot.end_time, + availableCapacity, + totalBookings: totalParticipants, + maxCapacity: bookingCapacity, + is_active: availableCapacity > 0 + }; + }); + + // Filter out fully booked slots + const availableTimeSlots = slotsWithCapacity.filter(slot => slot.availableCapacity > 0); + + return NextResponse.json({ + date, + bookingTypeId, + timeSlots: availableTimeSlots + }); + + } catch (error) { + console.error('Error fetching time slots:', error); + return NextResponse.json( + { error: 'Failed to fetch time slots' }, + { status: 500 } + ); + } +} \ No newline at end of file diff --git a/apps/web/components/BookingForm.tsx b/apps/web/components/BookingForm.tsx index 98f2829..e433f95 100644 --- a/apps/web/components/BookingForm.tsx +++ b/apps/web/components/BookingForm.tsx @@ -4,7 +4,6 @@ import React, { useState, useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { useTranslations } from 'next-intl'; import { BookingService } from '@/lib/bookingService'; -import { bookingApi } from '@/lib/pocketbase'; import { BookingType, TimeSlot } from '@/types/bookings'; import BookingTypeSelector from './BookingTypeSelector'; import DateSelector from './DateSelector'; @@ -27,7 +26,6 @@ const BookingInterface = () => { const [bookingTypes, setBookingTypes] = useState([]); const [timeSlots, setTimeSlots] = useState([]); const [availableDates, setAvailableDates] = useState([]); - const [availableSlotsByDate, setAvailableSlotsByDate] = useState<{ [date: string]: { start_time: string; end_time: string }[] }>({}); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -100,22 +98,23 @@ const BookingInterface = () => { // Set participants count to booking type's minimum capacity const bookingType = bookingTypes.find(bt => bt.id === typeId); if (bookingType) { - setParticipantsCount(bookingType.min_capacity); + setParticipantsCount(bookingType.min_participants_capacity); } - // Fetch time slots for the selected booking type + // Fetch available dates from server API (with capacity pre-calculated) try { - const timeSlots = await bookingApi.getTimeSlotsForBookingType(typeId); + const response = await fetch(`/api/booking-types/${typeId}/available-dates`); + const data = await response.json(); - // Generate available time slots grouped by date - const generatedSlotsByDate = bookingApi.generateAvailableTimeSlots(timeSlots); - const availableDatesFromAPI = Object.keys(generatedSlotsByDate).sort(); - - // Update available dates and slots data for the date selector - setAvailableDates(availableDatesFromAPI); - setAvailableSlotsByDate(generatedSlotsByDate); + if (response.ok) { + setAvailableDates(data.availableDates); + } else { + console.error('Error fetching available dates:', data.error); + setAvailableDates([]); + } } catch (error) { - console.error('Error fetching time slots:', error); + console.error('Error fetching available dates:', error); + setAvailableDates([]); } }; @@ -123,63 +122,37 @@ const BookingInterface = () => { setSelectedDate(date); setSelectedTimeSlot(''); - // Get time slots for the selected date from availableSlotsByDate - const slotsForDate = availableSlotsByDate[date] || []; - - // Get bookings for this date filtered by booking type IDs - let bookingOverlapCounts: { [key: string]: number } = {}; + // Fetch time slots with capacity from server API try { - const bookings = await bookingApi.getBookingsForDate(date, [selectedBookingType]); + const response = await fetch(`/api/booking-types/${selectedBookingType}/time-slots?date=${date}`); + const data = await response.json(); - // Count overlapping bookings for each time slot - slotsForDate.forEach(slot => { - const slotStart = new Date(slot.start_time); - const slotEnd = new Date(slot.end_time); + if (response.ok) { + // Convert server response to TimeSlot format + const formattedTimeSlots: TimeSlot[] = data.timeSlots.map((slot: any) => ({ + id: slot.id, + start_time: slot.start_time, + end_time: slot.end_time, + is_active: slot.is_active, + booking_capacity: slot.maxCapacity, + booking_types: [selectedBookingType], + is_reccuring: false, + recurrence_pattern: undefined, + resources: [], + created: new Date().toISOString(), + updated: new Date().toISOString(), + availableCapacity: slot.availableCapacity // Add capacity info for UI + })); - const overlappingBookings = bookings.filter(booking => { - const bookingStart = new Date(booking.start_time); - const bookingEnd = new Date(booking.end_time); - - // Check if bookings overlap with time slot - return bookingStart < slotEnd && bookingEnd > slotStart; - }); - - const totalParticipants = overlappingBookings.reduce((sum, booking) => - sum + (booking.participants_count || 0), 0 - ); - - const key = `${slot.start_time}-${slot.end_time}`; - bookingOverlapCounts[key] = totalParticipants; - }); - - console.log('Booking overlap counts:', bookingOverlapCounts); + setTimeSlots(formattedTimeSlots); + } else { + console.error('Error fetching time slots:', data.error); + setTimeSlots([]); + } } catch (error) { - console.error('Error fetching bookings for date:', error); + console.error('Error fetching time slots:', error); + setTimeSlots([]); } - - // Convert to TimeSlot format and filter out fully booked slots - const bookingTypeCapacity = selectedBookingTypeData?.booking_capacity || 8; - const availableTimeSlots = slotsForDate.filter(slot => { - const key = `${slot.start_time}-${slot.end_time}`; - const overlappingCount = bookingOverlapCounts[key] || 0; - return overlappingCount < bookingTypeCapacity; - }); - - const formattedTimeSlots: TimeSlot[] = availableTimeSlots.map((slot, index) => ({ - id: `slot-${date}-${index}`, - start_time: slot.start_time, - end_time: slot.end_time, - is_active: true, - booking_capacity: bookingTypeCapacity, - booking_types: [selectedBookingType], - is_reccuring: false, - recurrence_pattern: undefined, - resources: [], - created: new Date().toISOString(), - updated: new Date().toISOString() - })); - - setTimeSlots(formattedTimeSlots); }; return ( diff --git a/apps/web/components/CustomerDetails.tsx b/apps/web/components/CustomerDetails.tsx index 912fea3..0e3cb8c 100644 --- a/apps/web/components/CustomerDetails.tsx +++ b/apps/web/components/CustomerDetails.tsx @@ -28,8 +28,8 @@ const CustomerDetails: React.FC = ({ const t = useTranslations('bookingForm'); // Calculate min and max based on booking type - const minParticipants = bookingType.min_capacity; - const maxParticipants = bookingType.max_capacity; + const minParticipants = bookingType.min_participants_capacity; + const maxParticipants = bookingType.max_participants_capacity; return (

diff --git a/apps/web/components/TimeSlotSelector.tsx b/apps/web/components/TimeSlotSelector.tsx index e07d589..56d262b 100644 --- a/apps/web/components/TimeSlotSelector.tsx +++ b/apps/web/components/TimeSlotSelector.tsx @@ -4,7 +4,7 @@ import { useTranslations } from 'next-intl'; import { TimeSlot } from '@/types/bookings'; interface TimeSlotSelectorProps { - timeSlots: TimeSlot[]; + timeSlots: (TimeSlot & { availableCapacity?: number })[]; selectedTimeSlot: string; onTimeSlotChange: (slotId: string) => void; loading?: boolean; @@ -85,6 +85,11 @@ const TimeSlotSelector: React.FC = ({
{formattedTime}
+ {slot.availableCapacity !== undefined && slot.availableCapacity > 0 && ( +
+ {slot.availableCapacity} spots left +
+ )} {!isAvailable && (
Unavailable
)} diff --git a/apps/web/types/bookings.ts b/apps/web/types/bookings.ts index 974305e..9ed78aa 100644 --- a/apps/web/types/bookings.ts +++ b/apps/web/types/bookings.ts @@ -16,6 +16,7 @@ export interface Resource extends BaseRecord { // Booking Type entity export interface BookingType extends BaseRecord { name: string; + type: 'workshop' | 'rental'; display_name: string; description?: string; requires_payment?: boolean;