first commit
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# May Hair Care — Landing Page + EasyAppointments
|
||||
|
||||
Landing page bonita para May HairCare (Horta, Barcelona) con reservas gestionadas por **EasyAppointments**.
|
||||
|
||||
El frontend (HTML/JS puro) sigue siendo el de la landing, pero **las reservas, clientes y servicios se gestionan completamente con EasyAppointments**.
|
||||
|
||||
## Stack actual
|
||||
|
||||
- **Web (estático)**: Go + proxy reverso a EasyAppointments API
|
||||
- **Gestión de citas, clientes y servicios**: EasyAppointments (PHP + MySQL)
|
||||
- **Base de datos**: MySQL (para EA)
|
||||
- **Docker Compose**: todo junto (web + easyappointments + mysql)
|
||||
|
||||
## Cómo ejecutar (Desarrollo y Producción)
|
||||
|
||||
### 1. Levantar todo
|
||||
|
||||
```sh
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
- Landing + reservas: **http://localhost:8234**
|
||||
- Panel de administración EasyAppointments: **http://localhost:8888**
|
||||
|
||||
### 2. Primer arranque (importante)
|
||||
|
||||
1. Abre http://localhost:8888
|
||||
2. Completa el asistente de instalación de EasyAppointments.
|
||||
3. Crea un **usuario administrador**.
|
||||
4. Ve a **Providers** → crea al menos un proveedor (ej. "May").
|
||||
5. Ve a **Services** → crea tus servicios (puedes usar la lista anterior de servicios como referencia).
|
||||
6. Asigna los servicios al proveedor.
|
||||
7. Configura el **Working Plan** del proveedor (horario).
|
||||
8. **Anota el ID del Provider** (normalmente 1) y edita `static/index.html` → línea `const PROVIDER_ID = 1;`
|
||||
|
||||
### 3. Variables importantes en compose
|
||||
|
||||
Edita `docker-compose.yml` antes de levantar:
|
||||
|
||||
- `EA_API_USERNAME` + `EA_API_PASSWORD` (o mejor: configura **API Key** en Settings de EA y usa `EA_API_KEY`)
|
||||
- `BASE_URL` del servicio `easyappointments`
|
||||
- Contraseña de MySQL
|
||||
|
||||
### Actualizar
|
||||
|
||||
```sh
|
||||
git pull
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
## Notas sobre la integración
|
||||
|
||||
- Los servicios y la disponibilidad los obtiene el frontend directamente de la API de EasyAppointments.
|
||||
- Al reservar:
|
||||
- Busca o crea automáticamente el cliente usando el **email**.
|
||||
- Crea la cita en EasyAppointments (con todos los servicios seleccionados en las notas).
|
||||
- La gestión completa (clientes, servicios, citas, proveedores, etc.) se hace desde http://localhost:8888
|
||||
- La API antigua (carpeta `api/` + admin.html antigua + services.yml/mail.yml) ha sido eliminada completamente.
|
||||
|
||||
## Comportamiento multiservicio
|
||||
|
||||
El formulario permite seleccionar **varios servicios** (multi-checkbox).
|
||||
|
||||
Cómo funciona actualmente con EasyAppointments:
|
||||
|
||||
- **UI**: Puedes seleccionar múltiples servicios. Se muestra el resumen con nombres unidos por "+" y la duración total sumada.
|
||||
- **Comprobación de disponibilidad**: Se consulta el endpoint de EA usando el servicio de **mayor duración** de los seleccionados. EA devuelve los slots libres según ese servicio + el horario del proveedor.
|
||||
- **Al crear la reserva**:
|
||||
- Se crea **una sola cita** en EasyAppointments.
|
||||
- Se usa como `serviceId` el servicio de mayor duración (para que coincida con la disponibilidad consultada).
|
||||
- Se calcula la hora de fin sumando la **duración total** de todos los servicios seleccionados.
|
||||
- En el campo `notes` se guarda el detalle completo:
|
||||
```
|
||||
Nombre: ...
|
||||
Email: ...
|
||||
Teléfono: ...
|
||||
Servicios: Corte + Tinte + ...
|
||||
Duración total: 120 min
|
||||
Mensaje: ...
|
||||
```
|
||||
|
||||
**Limitación**: EasyAppointments modela una cita = un servicio principal. Los servicios adicionales quedan documentados en las notas del cliente y de la cita. No se crean múltiples registros de cita.
|
||||
|
||||
Recomendación: Si usas combinaciones frecuentes, crea "servicios combinados" directamente en EasyAppointments (ej. "Corte + Tinte Señora - 120min").
|
||||
Reference in New Issue
Block a user