feat: implement customer registration flow and business hours system

Major changes:
- Add customer registration with email/phone lookup (app/booking/registro)
- Add customers API endpoint (app/api/customers/route)
- Implement business hours for locations (mon-fri 10-7, sat 10-6, sun closed)
- Fix availability function type casting issues
- Add business hours utilities (lib/utils/business-hours.ts)
- Update Location type to include business_hours JSONB
- Add mock payment component for testing
- Remove Supabase auth from booking flow
- Fix /cita redirect path in booking flow

Database migrations:
- Add category column to services table
- Add business_hours JSONB column to locations table
- Fix availability functions with proper type casting
- Update get_detailed_availability to use business_hours

Features:
- Customer lookup by email or phone
- Auto-redirect to registration if customer not found
- Pre-fill customer data if exists
- Business hours per day of week
- Location-specific opening/closing times
This commit is contained in:
Marco Gallegos
2026-01-17 00:29:49 -06:00
parent fb60178c86
commit 583a25a6f6
56 changed files with 2676 additions and 491 deletions

View File

@@ -43,7 +43,7 @@ CREATE TABLE IF NOT EXISTS booking_blocks (
end_time_utc TIMESTAMPTZ NOT NULL,
reason TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
created_by UUID REFERENCES users(id) ON DELETE SET NULL,
created_by UUID REFERENCES staff(id) ON DELETE SET NULL,
CONSTRAINT booking_blocks_time_check CHECK (end_time_utc > start_time_utc)
);
@@ -193,6 +193,8 @@ $$ LANGUAGE plpgsql SECURITY DEFINER;
-- Obtiene staff disponible para un rango de tiempo
-- ============================================
DROP FUNCTION IF EXISTS get_available_staff(p_location_id UUID, p_start_time_utc TIMESTAMPTZ, p_end_time_utc TIMESTAMPTZ) CASCADE;
CREATE OR REPLACE FUNCTION get_available_staff(
p_location_id UUID,
p_start_time_utc TIMESTAMPTZ,
@@ -237,6 +239,8 @@ $$ LANGUAGE plpgsql SECURITY DEFINER;
-- Obtiene slots de tiempo disponibles
-- ============================================
DROP FUNCTION IF EXISTS get_detailed_availability(p_location_id UUID, p_service_id UUID, p_date DATE, p_time_slot_duration_minutes INTEGER) CASCADE;
CREATE OR REPLACE FUNCTION get_detailed_availability(
p_location_id UUID,
p_service_id UUID,