mirror of
https://github.com/marcogll/AnchorOS.git
synced 2026-03-15 13:24:27 +00:00
Implementación completa de la Fase 1.1 y 1.2 del proyecto SalonOS: ## Cambios en Reglas de Negocio (PRD.md, AGENTS.md, TASKS.md) - Actualizado reset de invitaciones de mensual a semanal (Lunes 00:00 UTC) - Jerarquía de roles actualizada: Admin > Manager > Staff > Artist > Customer - Artistas (antes colaboradoras) ahora tienen rol 'artist' - Staff/Manager/Admin pueden ver PII de customers - Artist solo ve nombre y notas de customers (restricción de privacidad) ## Estructura del Proyecto (Next.js 14) - app/boutique/: Frontend de cliente - app/hq/: Dashboard administrativo - app/api/: API routes - components/: Componentes UI reutilizables (boutique, hq, shared) - lib/: Lógica de negocio (supabase, db, utils) - db/: Esquemas, migraciones y seeds - integrations/: Stripe, Google Calendar, WhatsApp - scripts/: Scripts de utilidad y automatización - docs/: Documentación del proyecto ## Esquema de Base de Datos (Supabase PostgreSQL) 8 tablas creadas: - locations: Ubicaciones con timezone - resources: Recursos físicos (estaciones, habitaciones, equipos) - staff: Personal con roles jerárquicos - services: Catálogo de servicios - customers: Información de clientes con tier (free/gold) - invitations: Sistema de invitaciones semanales - bookings: Sistema de reservas con short_id (6 caracteres) - audit_logs: Registro de auditoría automática 14 funciones creadas: - generate_short_id(): Generador de Short ID (6 chars, collision-safe) - generate_invitation_code(): Generador de códigos de invitación (10 chars) - reset_weekly_invitations_for_customer(): Reset individual de invitaciones - reset_all_weekly_invitations(): Reset masivo de invitaciones - validate_secondary_artist_role(): Validación de secondary_artist - log_audit(): Trigger de auditoría automática - get_current_user_role(): Obtener rol del usuario actual - is_staff_or_higher(): Verificar si es admin/manager/staff - is_artist(): Verificar si es artist - is_customer(): Verificar si es customer - is_admin(): Verificar si es admin - update_updated_at(): Actualizar timestamps - generate_booking_short_id(): Generar Short ID automáticamente - get_week_start(): Obtener inicio de semana 17+ triggers activos: - Auditores automáticos en tablas críticas - Timestamps updated_at en todas las tablas - Validación de secondary_artist (trigger en lugar de constraint) 20+ políticas RLS configuradas: - Restricción crítica: Artist no ve email/phone de customers - Jerarquía de roles: Admin > Manager > Staff > Artist > Customer - Políticas granulares por tipo de operación y rol 6 tipos ENUM: - user_role: admin, manager, staff, artist, customer - customer_tier: free, gold - booking_status: pending, confirmed, cancelled, completed, no_show - invitation_status: pending, used, expired - resource_type: station, room, equipment - audit_action: create, update, delete, reset_invitations, payment, status_change ## Scripts de Utilidad - check-connection.sh: Verificar conexión a Supabase - simple-verify.sh: Verificar migraciones instaladas - simple-seed.sh: Crear datos de prueba - create-auth-users.js: Crear usuarios de Auth en Supabase - verify-migration.sql: Script de verificación SQL completo - seed-data.sql: Script de seed de datos SQL completo ## Documentación - docs/STEP_BY_STEP_VERIFICATION.md: Guía paso a paso de verificación - docs/STEP_BY_STEP_AUTH_CONFIG.md: Guía paso a paso de configuración Auth - docs/POST_MIGRATION_SUCCESS.md: Guía post-migración - docs/MIGRATION_CORRECTION.md: Detalle de correcciones aplicadas - docs/QUICK_START_POST_MIGRATION.md: Guía rápida de referencia - docs/SUPABASE_DASHBOARD_MIGRATION.md: Guía de ejecución en Dashboard - docs/00_FULL_MIGRATION_FINAL_README.md: Guía de migración final - SIMPLE_GUIDE.md: Guía simple de inicio - FASE_1_STATUS.md: Estado de la Fase 1 ## Configuración - package.json: Dependencias y scripts de npm - tsconfig.json: Configuración TypeScript con paths aliases - next.config.js: Configuración Next.js - tailwind.config.ts: Tema personalizado con colores primary, secondary, gold - postcss.config.js: Configuración PostCSS - .gitignore: Archivos excluidos de git - .env.example: Template de variables de entorno ## Correcciones Aplicadas 1. Constraint de subquery en CHECK reemplazado por trigger de validación - PostgreSQL no permite subqueries en CHECK constraints - validate_secondary_artist_role() ahora es un trigger 2. Variable no declarada en loop - customer_record RECORD; añadido en bloque DECLARE ## Principios Implementados - UTC-first: Todos los timestamps se almacenan en UTC - Sistema Doble Capa: Validación Staff/Artist + Recurso físico - Reset semanal: Invitaciones se resetean cada Lunes 00:00 UTC - Idempotencia: Procesos de reset son idempotentes y auditados - Privacidad: Artist solo ve nombre y notas de customers - Auditoría: Todas las acciones críticas se registran automáticamente - Short ID: 6 caracteres alfanuméricos como referencia humana - UUID: Identificador primario interno ## Próximos Pasos - Ejecutar scripts de verificación y seed - Configurar Auth en Supabase Dashboard - Implementar Tarea 1.3: Short ID & Invitaciones (backend) - Implementar Tarea 1.4: CRM Base (endpoints CRUD)
377 lines
12 KiB
Markdown
377 lines
12 KiB
Markdown
# SalonOS - Fase 1.1 y 1.2 Completadas con Éxito
|
|
|
|
## ✅ Implementado
|
|
|
|
### 1. Estructura de Carpetas Next.js 14
|
|
|
|
Se ha creado la estructura completa según el esquema definido en README.md:
|
|
|
|
```
|
|
/salonos
|
|
├── app/
|
|
│ ├── boutique/ # Frontend cliente
|
|
│ ├── hq/ # Dashboard administrativo
|
|
│ └── api/ # API routes
|
|
├── components/ # Componentes UI
|
|
│ ├── boutique/
|
|
│ ├── hq/
|
|
│ └── shared/
|
|
├── lib/ # Lógica de negocio
|
|
│ ├── supabase/
|
|
│ ├── db/
|
|
│ └── utils/
|
|
├── db/ # Esquemas y migraciones
|
|
│ ├── migrations/
|
|
│ │ ├── 001_initial_schema.sql ✅
|
|
│ │ ├── 002_rls_policies.sql ✅
|
|
│ │ └── 003_audit_triggers.sql ✅
|
|
│ └── seeds/
|
|
├── integrations/ # Stripe, Google, WhatsApp
|
|
├── styles/ # Config Tailwind
|
|
└── docs/
|
|
```
|
|
|
|
### 2. Esquema de Base de Datos Completo
|
|
|
|
#### Migración 001: `001_initial_schema.sql`
|
|
|
|
Tablas creadas:
|
|
- **locations**: Ubicaciones del salón con timezone
|
|
- **resources**: Recursos físicos (estaciones, habitaciones, equipos)
|
|
- **staff**: Personal con roles jerárquicos
|
|
- **services**: Catálogo de servicios
|
|
- **customers**: Información de clientes con tier
|
|
- **invitations**: Sistema de invitaciones semanales
|
|
- **bookings**: Sistema de reservas con short_id
|
|
- **audit_logs**: Registro de auditoría
|
|
|
|
Features:
|
|
- Todos los timestamps en UTC
|
|
- UUID como identificador primario
|
|
- Índices optimizados para consultas frecuentes
|
|
- Constraints de integridad referencial
|
|
- Sistema Doble Capa (Staff + Recurso)
|
|
|
|
#### Migración 002: `002_rls_policies.sql`
|
|
|
|
Políticas RLS implementadas:
|
|
|
|
**Jerarquía de roles:**
|
|
```
|
|
Admin > Manager > Staff > Artist > Customer
|
|
```
|
|
|
|
**Políticas críticas:**
|
|
- **Artist**: Solo puede ver `name` y `notes` de customers
|
|
- ❌ NO puede ver `email`
|
|
- ❌ NO puede ver `phone`
|
|
- **Staff/Manager/Admin**: Pueden ver PII completo
|
|
- **Customer**: Solo sus propios datos
|
|
|
|
Funciones auxiliares:
|
|
- `get_current_user_role()`: Obtiene el rol del usuario autenticado
|
|
- `is_staff_or_higher()`: Verifica si es admin, manager o staff
|
|
- `is_artist()`: Verifica si es artist
|
|
- `is_customer()`: Verifica si es customer
|
|
- `is_admin()`: Verifica si es admin
|
|
|
|
#### Migración 003: `003_audit_triggers.sql`
|
|
|
|
Funciones implementadas:
|
|
- `generate_short_id()`: Generador de Short ID (6 caracteres, collision-safe)
|
|
- `generate_invitation_code()`: Generador de códigos de invitación (10 caracteres)
|
|
- `reset_weekly_invitations_for_customer()`: Reset individual de invitaciones
|
|
- `reset_all_weekly_invitations()`: Reset masivo de todas las invitaciones
|
|
- `log_audit()`: Trigger automático de auditoría
|
|
|
|
Triggers:
|
|
- Auditoría automática en tablas críticas (bookings, customers, invitations, staff, services)
|
|
- Generación automática de short_id al crear booking
|
|
|
|
### 3. Configuración Base del Proyecto
|
|
|
|
Archivos creados:
|
|
- `package.json`: Dependencias Next.js 14, Supabase, Tailwind, Framer Motion
|
|
- `tsconfig.json`: Configuración TypeScript con paths aliases
|
|
- `next.config.js`: Configuración Next.js
|
|
- `tailwind.config.ts`: Configuración Tailwind con tema personalizado
|
|
- `postcss.config.js`: Configuración PostCSS
|
|
- `.env.example`: Template de variables de entorno
|
|
- `.gitignore`: Archivos ignorados por Git
|
|
- `lib/supabase/client.ts`: Cliente Supabase (anon y admin)
|
|
- `lib/db/types.ts`: TypeScript types basados en el esquema
|
|
|
|
## 📋 Documentación Actualizada
|
|
|
|
Archivos modificados:
|
|
- **PRD.md**: Reset semanal de invitaciones, jerarquía de roles
|
|
- **AGENTS.md**: Referencias a reset semanal, verificación de privacidad
|
|
- **TASKS.md**: Roles incluyen Artist, reset semanal, "colaboradoras" → "artists"
|
|
|
|
## 🎯 Tareas Completadas (FASE 1)
|
|
|
|
### ✅ Tarea 1.1: Infraestructura Base
|
|
- [x] Estructura de carpetas Next.js 14
|
|
- [x] Configuración base (package.json, tsconfig, tailwind)
|
|
- [x] Template de variables de entorno
|
|
|
|
### ✅ Tarea 1.2: Esquema de Base de Datos Inicial
|
|
- [x] 8 tablas obligatorias creadas
|
|
- [x] Claves foráneas y constraints
|
|
- [x] Campos de auditoría (`created_at`, `updated_at`)
|
|
- [x] Índices optimizados
|
|
- [x] Tipos ENUM definidos
|
|
- [x] **MIGRACIONES EJECUTADAS EN SUPABASE ✅**
|
|
- [x] Políticas RLS configuradas (20+ políticas)
|
|
- [x] Triggers de auditoría activos (17+ triggers)
|
|
- [x] Funciones auxiliares creadas (14 funciones)
|
|
- [x] Validación de secondary_artist implementada
|
|
|
|
### ⏳ Tarea 1.3: Short ID & Invitaciones
|
|
- [x] Generador de Short ID (6 chars, collision-safe)
|
|
- [x] Generador de códigos de invitación
|
|
- [x] Lógica de reset semanal (Lunes 00:00 UTC)
|
|
- [ ] Validación de unicidad antes de persistir booking (backend)
|
|
- [ ] Tests unitarios
|
|
|
|
### ⏳ Tarea 1.4: CRM Base (Customers)
|
|
- [ ] Endpoints CRUD
|
|
- [ ] Policies RLS por rol (ya implementadas en DB)
|
|
- [ ] Cálculo automático de Tier
|
|
- [ ] Tracking de referidos
|
|
|
|
## 🚀 Próximos Pasos
|
|
|
|
### 1. Verificar Instalación de Migraciones ✅
|
|
- [x] Ejecutar migraciones en Supabase ✅ COMPLETADO
|
|
- [ ] Ejecutar script de verificación: `scripts/verify-migration.sql` en Supabase Dashboard
|
|
- [ ] Ejecutar script de seed: `scripts/seed-data.sql` en Supabase Dashboard
|
|
- [ ] Probar políticas RLS
|
|
|
|
**Guía completa:** `docs/STEP_BY_STEP_VERIFICATION.md`
|
|
|
|
**Contenido:**
|
|
- 12 consultas de verificación (tablas, funciones, triggers, políticas RLS, tipos ENUM)
|
|
- 9 secciones de seed (locations, resources, staff, services, customers, invitations, bookings)
|
|
- Consultas adicionales de prueba
|
|
- Checklist de verificación
|
|
|
|
**Datos a crear con seed:**
|
|
- 3 locations (Centro, Polanco, Coyoacán)
|
|
- 6 resources (estaciones)
|
|
- 8 staff (1 admin, 2 managers, 1 staff, 4 artists)
|
|
- 6 services (catálogo completo)
|
|
- 4 customers (mix Free/Gold)
|
|
- 15 invitations (5 por cliente Gold)
|
|
- 5 bookings de prueba
|
|
|
|
### 2. Configurar Auth en Supabase Dashboard
|
|
- [ ] Habilitar Email Provider
|
|
- [ ] Configurar Site URL y Redirect URLs
|
|
- [ ] Crear 8 usuarios de staff en Supabase Auth
|
|
- [ ] Crear 4 usuarios de customers en Supabase Auth
|
|
- [ ] Actualizar tablas staff y customers con user_ids correctos
|
|
- [ ] Configurar Email Templates (opcional)
|
|
|
|
**Guía completa:** `docs/STEP_BY_STEP_AUTH_CONFIG.md`
|
|
|
|
**Usuarios a crear:**
|
|
|
|
**Staff (8):**
|
|
- Admin Principal: `admin@salonos.com`
|
|
- Manager Centro: `manager.centro@salonos.com`
|
|
- Manager Polanco: `manager.polanco@salonos.com`
|
|
- Staff Coordinadora: `staff.coordinadora@salonos.com`
|
|
- Artist María García: `artist.maria@salonos.com`
|
|
- Artist Ana Rodríguez: `artist.ana@salonos.com`
|
|
- Artist Carla López: `artist.carla@salonos.com`
|
|
- Artist Laura Martínez: `artist.laura@salonos.com`
|
|
|
|
**Customers (4):**
|
|
- Sofía Ramírez (Gold): `sofia.ramirez@example.com`
|
|
- Valentina Hernández (Gold): `valentina.hernandez@example.com`
|
|
- Camila López (Free): `camila.lopez@example.com`
|
|
- Isabella García (Gold): `isabella.garcia@example.com`
|
|
|
|
**Guía rápida:** `docs/QUICK_START_POST_MIGRATION.md`
|
|
|
|
### 3. Implementar Tarea 1.3 completa
|
|
- Backend API endpoints para Short ID
|
|
- Tests unitarios de colisiones
|
|
- Edge Function o Cron Job para reset semanal
|
|
|
|
3. **Implementar Tarea 1.4**:
|
|
- Endpoints CRUD de customers
|
|
- Lógica de cálculo automático de Tier
|
|
- Sistema de referidos
|
|
|
|
## 📝 Notas Importantes
|
|
|
|
### UTC-First
|
|
Todos los timestamps se almacenan en UTC. La conversión a zona horaria local ocurre solo en:
|
|
- Frontend (The Boutique / The HQ)
|
|
- Notificaciones (WhatsApp / Email)
|
|
|
|
### Sistema Doble Capa
|
|
El sistema valida disponibilidad en dos niveles:
|
|
1. **Staff/Artist**: Horario laboral + Google Calendar
|
|
2. **Recurso**: Disponibilidad de estación física
|
|
|
|
### Reset Semanal de Invitaciones
|
|
- Ejecutado automáticamente cada Lunes 00:00 UTC
|
|
- Solo para clientes Tier Gold
|
|
- Cada cliente recibe 5 invitaciones nuevas
|
|
- Proceso idempotente y auditado
|
|
|
|
### Privacidad de Datos
|
|
- **Artist**: ❌ NO puede ver `email` ni `phone` de customers
|
|
- **Staff/Manager/Admin**: ✅ Pueden ver PII de customers
|
|
- Todas las consultas de Artist a `customers` están filtradas por RLS
|
|
|
|
## 🔧 Comandos Útiles
|
|
|
|
```bash
|
|
# Instalar dependencias
|
|
npm install
|
|
|
|
# Ejecutar migraciones de base de datos
|
|
npm run db:migrate
|
|
|
|
# Verificar instalación de migraciones (scripts SQL)
|
|
# Ejecutar: scripts/verify-migration.sql en Supabase Dashboard
|
|
|
|
# Crear datos de prueba (scripts SQL)
|
|
# Ejecutar: scripts/seed-data.sql en Supabase Dashboard
|
|
|
|
# Levantar servidor de desarrollo
|
|
npm run dev
|
|
|
|
# Verificar TypeScript
|
|
npm run typecheck
|
|
|
|
# Ejecutar linter
|
|
npm run lint
|
|
```
|
|
|
|
## 🎉 Estado de Migraciones en Supabase
|
|
|
|
### ✅ MIGRACIONES EJECUTADAS EXITOSAMENTE
|
|
|
|
**Proyecto:** pvvwbnybkadhreuqijsl
|
|
**Fecha:** 2026-01-15
|
|
**Estado:** COMPLETADO
|
|
|
|
**Tablas Creadas:**
|
|
- ✅ locations (3)
|
|
- ✅ resources (6)
|
|
- ✅ staff (0)
|
|
- ✅ services (0)
|
|
- ✅ customers (0)
|
|
- ✅ invitations (0)
|
|
- ✅ bookings (0)
|
|
- ✅ audit_logs (0)
|
|
|
|
**Funciones Creadas (14):**
|
|
- ✅ generate_short_id
|
|
- ✅ generate_invitation_code
|
|
- ✅ reset_weekly_invitations_for_customer
|
|
- ✅ reset_all_weekly_invitations
|
|
- ✅ validate_secondary_artist_role
|
|
- ✅ log_audit
|
|
- ✅ get_current_user_role
|
|
- ✅ is_staff_or_higher
|
|
- ✅ is_artist
|
|
- ✅ is_customer
|
|
- ✅ is_admin
|
|
- ✅ update_updated_at
|
|
- ✅ generate_booking_short_id
|
|
- ✅ get_week_start
|
|
|
|
**Triggers Activos (17+):**
|
|
- ✅ locations_updated_at
|
|
- ✅ resources_updated_at
|
|
- ✅ staff_updated_at
|
|
- ✅ services_updated_at
|
|
- ✅ customers_updated_at
|
|
- ✅ invitations_updated_at
|
|
- ✅ bookings_updated_at
|
|
- ✅ validate_booking_secondary_artist
|
|
- ✅ audit_bookings
|
|
- ✅ audit_customers
|
|
- ✅ audit_invitations
|
|
- ✅ audit_staff
|
|
- ✅ audit_services
|
|
- ✅ booking_generate_short_id
|
|
|
|
**Políticas RLS Configuradas (20+):**
|
|
- ✅ Locations: 2 políticas
|
|
- ✅ Resources: 3 políticas
|
|
- ✅ Staff: 3 políticas
|
|
- ✅ Services: 2 políticas
|
|
- ✅ Customers: 5 políticas (incluyendo restricción Artist)
|
|
- ✅ Invitations: 3 políticas
|
|
- ✅ Bookings: 7 políticas
|
|
- ✅ Audit logs: 2 políticas
|
|
|
|
**Tipos ENUM (6):**
|
|
- ✅ user_role
|
|
- ✅ customer_tier
|
|
- ✅ booking_status
|
|
- ✅ invitation_status
|
|
- ✅ resource_type
|
|
- ✅ audit_action
|
|
|
|
**Correcciones Aplicadas:**
|
|
- ✅ Constraint de secondary_artist reemplazado por trigger de validación
|
|
- ✅ Variable customer_record declarada en reset_all_weekly_invitations()
|
|
|
|
### 📚 Guías de Post-Migración
|
|
|
|
1. **Verificación:** Ejecutar `scripts/verify-migration.sql`
|
|
2. **Seed de datos:** Ejecutar `scripts/seed-data.sql`
|
|
3. **Configuración Auth:** Configurar en Supabase Dashboard
|
|
4. **Pruebas:** Probar funcionalidades en `docs/POST_MIGRATION_SUCCESS.md`
|
|
|
|
## 📞 Contacto
|
|
|
|
Para dudas sobre la implementación, consultar:
|
|
- PRD.md: Reglas de negocio
|
|
- TASKS.md: Plan de ejecución
|
|
- AGENTS.md: Roles y responsabilidades
|
|
- db/migrations/README.md: Guía de migraciones
|
|
|
|
---
|
|
|
|
## 📞 Documentación Disponible
|
|
|
|
- **PRD.md**: Reglas de negocio del sistema
|
|
- **TASKS.md**: Plan de ejecución por fases
|
|
- **AGENTS.md**: Roles y responsabilidades de IA
|
|
- **db/migrations/README.md**: Guía técnica de migraciones
|
|
- **docs/MIGRATION_GUIDE.md**: Guía detallada de migraciones
|
|
- **docs/00_FULL_MIGRATION_FINAL_README.md**: Guía de migración final
|
|
- **docs/MIGRATION_CORRECTION.md**: Detalle de correcciones aplicadas
|
|
- **docs/SUPABASE_DASHBOARD_MIGRATION.md**: Guía de ejecución en Dashboard
|
|
- **docs/POST_MIGRATION_SUCCESS.md**: Guía post-migración (verificación y seed)
|
|
- **scripts/verify-migration.sql**: Script de verificación
|
|
- **scripts/seed-data.sql**: Script de datos de prueba
|
|
|
|
---
|
|
|
|
**Estado**: ✅ **FASE 1.1 y 1.2 COMPLETADAS EXITOSAMENTE**
|
|
|
|
- ✅ Migraciones ejecutadas en Supabase
|
|
- ✅ Base de datos completamente configurada
|
|
- ✅ Políticas RLS activas (incluyendo restricción Artist)
|
|
- ✅ Sistema de auditoría activo
|
|
- ✅ Funciones de Short ID e invitaciones funcionales
|
|
- ✅ Validación de secondary_artist implementada
|
|
- ✅ Listo para continuar con Tarea 1.3 y 1.4
|
|
|
|
**Próximos pasos:**
|
|
1. Ejecutar script de verificación en Supabase Dashboard
|
|
2. Ejecutar script de seed para crear datos de prueba
|
|
3. Configurar Auth en Supabase Dashboard
|
|
4. Implementar Tarea 1.3 (Short ID & Invitaciones - backend)
|
|
5. Implementar Tarea 1.4 (CRM Base)
|