feat: add recurring booking management functionality

- Implemented API endpoints for listing and updating recurring booking groups.
- Added handlers for listing and updating recurring groups in the backend.
- Created frontend components for displaying and editing recurring bookings.
- Enhanced booking provider to manage recurring groups and their states.
- Updated API client to include new methods for recurring bookings.
- Introduced new validation schemas for updating recurring groups.
- Added UI elements for managing recurring bookings in the booking interface.
This commit is contained in:
Jose Selesan
2026-06-16 15:16:38 -03:00
parent 1318e3bf57
commit 3b3def94ab
15 changed files with 936 additions and 5 deletions

View File

@@ -90,6 +90,31 @@ export const recurringBookingGroupSchema = z.object({
updatedAt: z.string().datetime(),
});
export const updateRecurringGroupSchema = z.object({
courtId: z.uuid('El courtId debe ser un UUID valido.').optional(),
dayOfWeek: z
.enum(['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'])
.optional(),
startTime: z.string().regex(TIME_REGEX, 'La hora debe tener formato HH:mm.').optional(),
customerName: z
.string()
.trim()
.min(2, 'El nombre debe tener al menos 2 caracteres.')
.max(120, 'El nombre no puede superar los 120 caracteres.')
.optional(),
customerPhone: z
.string()
.trim()
.min(6, 'El telefono debe tener al menos 6 caracteres.')
.max(30, 'El telefono no puede superar los 30 caracteres.')
.optional(),
customerEmail: z.string().email('El email ingresado no es valido.').or(z.literal('')).optional(),
});
export const listRecurringGroupsResponseSchema = z.object({
groups: z.array(recurringBookingGroupSchema),
});
export type BookingStatus = z.infer<typeof bookingStatusSchema>;
export type RecurringGroupStatus = z.infer<typeof recurringGroupStatusSchema>;
export type AdminBookingSport = z.infer<typeof adminBookingSportSchema>;
@@ -100,3 +125,5 @@ export type CreateAdminBookingInput = z.infer<typeof createAdminBookingSchema>;
export type CreateRecurringBookingInput = z.infer<typeof createRecurringBookingSchema>;
export type RecurringBookingGroup = z.infer<typeof recurringBookingGroupSchema>;
export type UpdateAdminBookingStatusInput = z.infer<typeof updateAdminBookingStatusSchema>;
export type UpdateRecurringGroupInput = z.infer<typeof updateRecurringGroupSchema>;
export type ListRecurringGroupsResponse = z.infer<typeof listRecurringGroupsResponseSchema>;

View File

@@ -79,9 +79,11 @@ export {
createRecurringBookingSchema,
listAdminBookingsQuerySchema,
listAdminBookingsResponseSchema,
listRecurringGroupsResponseSchema,
recurringBookingGroupSchema,
recurringGroupStatusSchema,
updateAdminBookingStatusSchema,
updateRecurringGroupSchema,
} from './admin-booking';
export type {
AdminBooking,
@@ -91,9 +93,11 @@ export type {
CreateRecurringBookingInput,
ListAdminBookingsQuery,
ListAdminBookingsResponse,
ListRecurringGroupsResponse,
RecurringBookingGroup,
RecurringGroupStatus,
UpdateAdminBookingStatusInput,
UpdateRecurringGroupInput,
} from './admin-booking';
export {
createPublicBookingSchema,