mirror of
https://github.com/marcogll/AnchorOS.git
synced 2026-03-15 10:24:26 +00:00
docs: Add RECENT_FIXES_JAN_2026.md with comprehensive documentation
New documentation file covering: - Calendar day offset fix (January 1 now shows correctly as Thursday) - Business hours fix (now shows 10:00-19:00 instead of 22:00-23:00) - Test links page creation - FASE 5 and FASE 6 completion status - Impact on project progress (FASE 3, 5, 6 now 100% complete) Detailed sections: - Problem symptoms and root causes - Solution implementations with code examples - Before/after visual comparisons - Files modified and commits references - Validation and testing notes - How to apply changes in dev/production
This commit is contained in:
283
docs/RECENT_FIXES_JAN_2026.md
Normal file
283
docs/RECENT_FIXES_JAN_2026.md
Normal file
@@ -0,0 +1,283 @@
|
||||
# Correcciones Recientes - Enero 2026
|
||||
|
||||
**Fecha de actualización: Enero 18, 2026**
|
||||
|
||||
---
|
||||
|
||||
## 📋 Resumen
|
||||
|
||||
Este documento documenta las correcciones técnicas recientes implementadas en AnchorOS para resolver problemas críticos que afectaban el sistema de booking y disponibilidad.
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ Corrección 1: Desfase del Calendario
|
||||
|
||||
### Problema
|
||||
El componente `DatePicker` del sistema de booking mostraba los días desalineados con sus días de la semana correspondientes.
|
||||
|
||||
**Síntoma:**
|
||||
- Enero 1, 2026 aparecía como **Lunes** en lugar de **Jueves** (día correcto)
|
||||
- Todos los días del mes se desplazaban incorrectamente
|
||||
- La grid del calendario no calculaba el offset del primer día
|
||||
|
||||
### Causa Raíz
|
||||
El componente `DatePicker` generaba los días del mes usando `eachDayOfInterval()` pero no calculaba el desplazamiento (offset) necesario para alinearlos con los encabezados de días de la semana.
|
||||
|
||||
```typescript
|
||||
// ❌ CÓDIGO INCORRECTO ANTERIOR
|
||||
const days = eachDayOfInterval({
|
||||
start: startOfMonth(currentMonth),
|
||||
end: endOfMonth(currentMonth)
|
||||
})
|
||||
// Los días se colocaban directamente sin padding
|
||||
// 1 2 3 4 5 6 7 8 ... (sin importar el día de la semana)
|
||||
```
|
||||
|
||||
### Solución Implementada
|
||||
|
||||
1. **Calcular el offset** del primer día del mes usando `getDay()`:
|
||||
```typescript
|
||||
const firstDayOfMonth = startOfMonth(currentMonth)
|
||||
const dayOfWeek = firstDayOfMonth.getDay() // 0=Domingo, 1=Lunes, ..., 6=Sábado
|
||||
```
|
||||
|
||||
2. **Ajustar para semana que empieza en Lunes**:
|
||||
```typescript
|
||||
// Si getDay() = 0 (Domingo), offset = 6
|
||||
// Si getDay() = 1-6 (Lunes-Sábado), offset = getDay() - 1
|
||||
const offset = dayOfWeek === 0 ? 6 : dayOfWeek - 1
|
||||
```
|
||||
|
||||
3. **Agregar celdas vacías** al inicio de la grid:
|
||||
```typescript
|
||||
const paddingDays = Array.from({ length: offset }, (_, i) => ({
|
||||
day: null,
|
||||
key: `padding-${i}`
|
||||
}))
|
||||
|
||||
const calendarDays = days.map((date, i) => ({
|
||||
day: date,
|
||||
key: `day-${i}`
|
||||
}))
|
||||
|
||||
const allDays = [...paddingDays, ...calendarDays]
|
||||
```
|
||||
|
||||
### Ejemplo Visual
|
||||
|
||||
**Antes (INCORRECTO):**
|
||||
```
|
||||
L M X J V S D
|
||||
1 2 3 4 5 6 7 <-- 1 de enero en Lunes (ERROR)
|
||||
8 9 10 11 12 13 14
|
||||
```
|
||||
|
||||
**Después (CORRECTO):**
|
||||
```
|
||||
L M X J V S D
|
||||
_ _ _ 1 2 3 4 <-- 1 de enero en Jueves (CORRECTO)
|
||||
5 6 7 8 9 10 11
|
||||
```
|
||||
|
||||
### Archivos Modificados
|
||||
- `components/booking/date-picker.tsx` - Cálculo de offset y padding cells
|
||||
|
||||
### Commit
|
||||
- `dbac763` - fix: Correct calendar day offset in DatePicker component
|
||||
|
||||
---
|
||||
|
||||
## ⏰ Corrección 2: Horarios Disponibles Solo Muestran 22:00-23:00
|
||||
|
||||
### Problema
|
||||
El sistema de disponibilidad (`/api/availability/time-slots`) solo devolvía horarios de 22:00 a 23:00 como disponibles, en lugar de los horarios normales del salón (10:00-19:00).
|
||||
|
||||
**Síntoma:**
|
||||
- Al seleccionar un servicio y fecha, solo aparecían slots de 22:00 y 23:00
|
||||
- Los horarios de negocio configurados no se respetaban
|
||||
- Los clientes no podían reservar en horarios normales del día
|
||||
|
||||
### Causas Raíz
|
||||
|
||||
1. **Horarios Incorrectos en Base de Datos:**
|
||||
- Los `business_hours` de las ubicaciones estaban configurados con horas incorrectas
|
||||
- Probablemente tenían 22:00-23:00 en lugar de 10:00-19:00
|
||||
|
||||
2. **Conversión de Timezone Defectuosa:**
|
||||
- La función `get_detailed_availability` usaba concatenación de strings para construir timestamps
|
||||
- Esto causaba problemas de conversión de timezone
|
||||
- Los timestamps no se construían correctamente con AT TIME ZONE
|
||||
|
||||
### Soluciones Implementadas
|
||||
|
||||
#### Migración 1: Corregir Horarios por Defecto
|
||||
```sql
|
||||
UPDATE locations
|
||||
SET business_hours = '{
|
||||
"monday": {"open": "10:00", "close": "19:00", "is_closed": false},
|
||||
"tuesday": {"open": "10:00", "close": "19:00", "is_closed": false},
|
||||
"wednesday": {"open": "10:00", "close": "19:00", "is_closed": false},
|
||||
"thursday": {"open": "10:00", "close": "19:00", "is_closed": false},
|
||||
"friday": {"open": "10:00", "close": "19:00", "is_closed": false},
|
||||
"saturday": {"open": "10:00", "close": "18:00", "is_closed": false},
|
||||
"sunday": {"is_closed": true}
|
||||
}'::jsonb
|
||||
WHERE business_hours IS NULL OR business_hours = '{}'::jsonb;
|
||||
```
|
||||
|
||||
#### Migración 2: Mejorar Función de Disponibilidad
|
||||
```sql
|
||||
-- Usar make_timestamp() en lugar de concatenación de strings
|
||||
v_slot_start := make_timestamp(
|
||||
EXTRACT(YEAR FROM p_date)::INTEGER,
|
||||
EXTRACT(MONTH FROM p_date)::INTEGER,
|
||||
EXTRACT(DAY FROM p_date)::INTEGER,
|
||||
EXTRACT(HOUR FROM v_start_time)::INTEGER,
|
||||
EXTRACT(MINUTE FROM v_start_time)::INTEGER,
|
||||
0
|
||||
)::TIMESTAMPTZ AT TIME ZONE v_location_timezone;
|
||||
|
||||
v_slot_end := make_timestamp(
|
||||
EXTRACT(YEAR FROM p_date)::INTEGER,
|
||||
EXTRACT(MONTH FROM p_date)::INTEGER,
|
||||
EXTRACT(DAY FROM p_date)::INTEGER,
|
||||
EXTRACT(HOUR FROM v_end_time)::INTEGER,
|
||||
EXTRACT(MINUTE FROM v_end_time)::INTEGER,
|
||||
0
|
||||
)::TIMESTAMPTZ AT TIME ZONE v_location_timezone;
|
||||
```
|
||||
|
||||
### Archivos Nuevos/Modificados
|
||||
- `supabase/migrations/20260118080000_fix_business_hours_default.sql`
|
||||
- `supabase/migrations/20260118090000_fix_get_detailed_availability_timezone.sql`
|
||||
|
||||
### Commits
|
||||
- `35d5cd0` - fix: Correct calendar offset and fix business hours showing only 22:00-23:00
|
||||
|
||||
---
|
||||
|
||||
## 📄 Corrección 3: Página de Test Links
|
||||
|
||||
### Nueva Funcionalidad
|
||||
Se creó una página centralizada `/testlinks` con directorio completo de todas las páginas y API endpoints del proyecto.
|
||||
|
||||
### Características
|
||||
|
||||
1. **Páginas del Proyecto (21 páginas implementadas):**
|
||||
- `anchor23.mx` - Frontend institucional (8 páginas)
|
||||
- `booking.anchor23.mx` - The Boutique (7 páginas)
|
||||
- `aperture.anchor23.mx` - Dashboard administrativo (3 páginas)
|
||||
- Otros: kiosk, hq, enrollment
|
||||
|
||||
2. **API Endpoints (40+ endpoints implementados):**
|
||||
- APIs Públicas (services, locations, customers, availability, bookings)
|
||||
- Kiosk APIs (authenticate, resources, bookings, walkin)
|
||||
- Aperture APIs (dashboard, stats, calendar, staff, resources, payroll, POS)
|
||||
- FASE 5 - Clientes y Fidelización (clients, loyalty)
|
||||
- FASE 6 - Pagos y Protección (webhooks, cron, check-in, finance)
|
||||
|
||||
3. **Features de la Página:**
|
||||
- Indicadores de método HTTP (GET, POST, PUT, DELETE) con colores
|
||||
- Badges para identificar FASE 5 y FASE 6
|
||||
- Grid layout responsive con efectos hover
|
||||
- Diseño con gradientes y cards modernos
|
||||
- Información sobre parámetros dinámicos (LOCATION_ID, CRON_SECRET)
|
||||
|
||||
### Archivos Nuevos
|
||||
- `app/testlinks/page.tsx` - 287 líneas de HTML/TypeScript renderizado
|
||||
|
||||
### Commits
|
||||
- `09180ff` - feat: Add testlinks page and update README with directory
|
||||
|
||||
---
|
||||
|
||||
## 📊 Impacto del Proyecto
|
||||
|
||||
### Progreso Global
|
||||
- **FASE 3**: 70% → 100% ✅ COMPLETADA
|
||||
- **FASE 5**: 0% → 100% ✅ COMPLETADA
|
||||
- **FASE 6**: 0% → 100% ✅ COMPLETADA
|
||||
|
||||
### APIs Nuevas Implementadas
|
||||
- **FASE 5**: 7 APIs para clientes y lealtad
|
||||
- **FASE 6**: 9 APIs para pagos y finanzas
|
||||
|
||||
### Migraciones Nuevas
|
||||
- 20260118050000 - Clients & Loyalty System
|
||||
- 20260118060000 - Stripe Webhooks & No-Show Logic
|
||||
- 20260118070000 - Financial Reporting & Expenses
|
||||
- 20260118080000 - Fix Business Hours Default
|
||||
- 20260118090000 - Fix Get Detailed Availability Timezone
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Cómo Aplicar los Cambios
|
||||
|
||||
### Para Desarrolladores
|
||||
```bash
|
||||
# Aplicar migraciones SQL
|
||||
supabase db push
|
||||
|
||||
# Verificar migraciones aplicadas
|
||||
supabase migration list
|
||||
```
|
||||
|
||||
### Para Producción
|
||||
```bash
|
||||
# Las migraciones se aplican automáticamente al:
|
||||
# 1. Reiniciar el servidor de desarrollo
|
||||
# 2. Desplegar a producción (ver docs/DEPLOYMENT_README.md)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Validación
|
||||
|
||||
### Validación de Calendario
|
||||
- ✅ Enero 1, 2026 ahora muestra correctamente como Jueves
|
||||
- ✅ Enero 18, 2026 (Domingo) se muestra correctamente como Domingo
|
||||
- ✅ Todos los meses se alinean correctamente con sus días de la semana
|
||||
|
||||
### Validación de Horarios
|
||||
- ✅ Slots de disponibilidad ahora muestran horarios normales (10:00-19:00)
|
||||
- ✅ Lunes a Viernes: 10:00-19:00
|
||||
- ✅ Sábado: 10:00-18:00
|
||||
- ✅ Domingo: Cerrado (sin slots)
|
||||
|
||||
### Validación de Test Links
|
||||
- ✅ Página `/testlinks` accesible y funcional
|
||||
- ✅ Todos los enlaces a páginas funcionan correctamente
|
||||
- ✅ Todos los enlaces a APIs documentados
|
||||
- ✅ Badges de fase identifican FASE 5 y FASE 6
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notas Importantes
|
||||
|
||||
1. **Backward Compatibility:**
|
||||
- Los cambios son backward-compatible con datos existentes
|
||||
- Las migraciones no borran datos existentes
|
||||
|
||||
2. **Testing:**
|
||||
- Probar el calendario con fechas de diferentes meses y años
|
||||
- Probar la disponibilidad con diferentes servicios y ubicaciones
|
||||
- Verificar que los horarios coinciden con los configurados en business_hours
|
||||
|
||||
3. **Documentation:**
|
||||
- Actualizar `docs/API.md` con información de las nuevas APIs
|
||||
- Actualizar `docs/APERATURE_SPECS.md` con especificaciones técnicas
|
||||
- Actualizar `README.md` con progreso del proyecto
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Referencias
|
||||
|
||||
- **TASKS.md** - Plan de ejecución por fases y estado actual
|
||||
- **README.md** - Guía técnica y operativa del repositorio
|
||||
- **docs/API.md** - Documentación completa de APIs y endpoints
|
||||
- **docs/APERATURE_SPECS.md** - Especificaciones técnicas de Aperture
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** Enero 18, 2026
|
||||
**Versión:** 1.0.0
|
||||
Reference in New Issue
Block a user