GR Wellness — Auditoría Fase 1

Estatuto Dic 2025 vs. Codebase · 1 abril 2026
85%Expedientes
70%Nutrición
75%Chat
60%Agenda
50%Pagos
45%Dashboard
95%Roles
100%Fitness
10%PWA
0%LFPDPPP
Built — Funcional completo
Parcial — Existe pero incompleto
Falta — No existe en código
Extra — Adicional al estatuto
componente Página / Componente UI
servicio Servicio / Hook / Lógica
por crear Archivo que falta
1

Expedientes de Pacientes

85%
Status
Feature
Notas
Referencia técnica
Built
Datos Generales
Nombre, email, teléfono, DOB, género, país. Falta: campo contacto de emergencia
CrearPacienteModal tab-expediente.tsx pacientes.service.ts
Built
Objetivos del Paciente
4 tipos + texto libre detallado. Falta: peso objetivo numérico
CrearPacienteModal paso-1-datos-personales.tsx
Parcial
Antropometría Avanzada
UI completa (peso, talla, IMC, 8 circunferencias, % grasa). Bug: botón "Guardar" nueva medición es stub — cierra sin persistir a Firestore
tab-mediciones.tsx expedientes.service.ts fix: save handler
Built
Historial Clínico
Alergias, condiciones, medicamentos, antecedentes — todo con tags color-coded
tab-expediente.tsx paso-3-historial-clinico.tsx expedientes.service.ts
Built
Cuestionario Diario
Energía, adherencia, sueño, mood, digestión + chart 14 días + semáforo. Falta: campo consumo de agua
cuestionario-dialog.tsx tab-cuestionarios.tsx cuestionarios.service.ts use-meal-checkins.ts
Built
Gestión de Archivos
Drag-and-drop, categorías (Progreso, Análisis, Lab, Receta), Firebase Storage, preview imágenes
tab-archivos.tsx archivos.service.ts firebase/storage.ts
Parcial
Visualización de Progreso
Gráficas LineChart (peso, grasa, músculo). Falta: fotos muestran ícono placeholder (no imagen real), sin filtro mes a mes, sin vista before/after
tab-mediciones.tsx weight-chart.tsx photo gallery view before/after compare
Built
Salud Femenina
Completo: ciclo, FUM, duración, anticonceptivos (12 tipos), embarazos, lactancia, menopausia. Gated por género
paso-4-salud-femenina.tsx tab-expediente.tsx
Built
Enlace Rápido (QR)
QR 240px con qrcode.react, token UUID, ruta /onboarding/[token], copiar enlace
qr-access-card.tsx onboarding-tokens.service.ts
Parcial
Timestamp Actividad
Campo ultimaActividad existe y alimenta alertas de inactividad (>7 días). Falta: no se muestra visualmente en lista de pacientes ni chat
pacientes.service.ts patient-alerts.tsx badge en paciente-card
Built
Tags / Etiquetas
Predefinidas (Diabetes, Atleta, Vegetariano...) + custom. Filtrado en pacientes y chat. Persistido en Firestore
patient-tags.tsx filter-popover.tsx
Extra
Vista Kanban de Pacientes
Pipeline: Nuevo → Contactado → Agendado → Pendiente Dieta → Seguimiento → Completado. No estaba en estatuto
kanban-board.tsx kanban-card.tsx kanban-column.tsx use-pipeline-config.ts
Extra
Onboarding 9 pasos
Flujo guiado token-based: cuenta → datos → composición → clínico → femenina(cond) → actividad → alimenticio → cocina → revisión
onboarding/[token]/page.tsx paso-1 a paso-8 (intake/) intake-context.tsx intake-schemas.ts
2

Nutrición y Dietocálculo

70%
Status
Feature
Notas
Referencia técnica
Built
Fórmulas BMR (5 de 7)
Mifflin-St Jeor, Harris-Benedict, FAO/OMS (age-banded), Owen, Valencia (calibrada MX). Falta: Schofield, Katch-McArdle
lib/calculations/tmb.ts paso-1-dietocalculo.tsx
Built
Cálculo dinámico en tiempo real
useEffect reactivo en Paso 1 al cambiar GET o slider de ajuste. Distribución recalcula por keystroke
paso-1-dietocalculo.tsx plan-context.tsx daily-calorie-adjuster.tsx
Falta
Barra progreso calórica
No existe tracker de cumplimiento diario "calorías consumidas vs. objetivo"
calorie-tracker.tsx meal-log.service.ts
Built
Distribución macronutrientes
Sliders %, gramos, kcal. Presets incluidos (estándar, high-protein, etc.). Chart macro en portal
paso-2-grupos-alimentos.tsx macro-chart.tsx lib/calculations/porciones.ts
Parcial
Plantillas reutilizables
Guardar y listar plantillas funciona. Falta: cargar plantilla existente en el wizard de creación de plan
app/plantillas/page.tsx plantillas.service.ts load-template en wizard
Parcial
Gestión de Recetas
CRUD, tags, búsqueda, tiempo prep, cálculo nutricional auto. Falta: importar recetas de fuente externa
app/recetas/page.tsx recipe-form-page.tsx recetas.service.ts faceted-filter-panel.tsx
Parcial
Suplementación
8 predefinidos + custom, dosis, frecuencia, horario. Falta: integración Odoo (link externo de compra)
suplementos-section.tsx
Parcial
Base de Datos SMAE
15 subgrupos correctos (más granular que los 9 del estatuto). Falta: solo ~60-100 ingredientes seed, no 1500+
app/ingredientes/page.tsx ingredientes.service.ts lib/calculations/porciones.ts
Built
Equivalencias Inteligentes
Swap dentro del mismo grupo SMAE preservando porciones. Panel UI + modal swap en receta e ingrediente
equivalencias-panel.tsx recipe-swap-modal.tsx ingredient-swap-modal.tsx
Falta
Tolerancias por nutriólogo
Sin rangos de tolerancia para swaps cross-category. Sin enforcement de allergen filters. Sin change log de swaps
tolerance-config.tsx swap-log.service.ts
Extra
Recomendación de fórmula
recomendarFormula() sugiere la mejor fórmula por tipo de paciente (población general, atleta, alto rendimiento, adulto mayor)
lib/calculations/tmb.ts → recomendarFormula()
3

Comunicación (Chat)

75%
Status
Feature
Notas
Referencia técnica
Built
Centro de conversaciones
Real-time Firestore, auto-scroll, auto-create conversación, deep-link por URL param
app/chat/page.tsx conversaciones.service.ts use-chat.ts
Parcial
Sidebar con expediente
4 sidebars: expediente, planes, citas, notas. Falta: métricas live (peso/IMC actual), plan activo, próxima cita, alertas
expediente-sidebar.tsx planes-sidebar.tsx citas-sidebar.tsx notas-sidebar.tsx
Parcial
Botón "Asignar Plan"
Existe en sidebar de planes, pero navega fuera del chat (router.push). No es asignación inline. Sidebar muestra texto estático "No hay planes"
planes-sidebar.tsx asignar plan inline
Falta
Cuestionarios condicionales por tags
No existe envío de cuestionarios adaptados por tag desde el chat
chat-questionnaire-trigger.tsx conditional-questionnaire.service.ts
Parcial
Badge última actividad
ultimaConexion en tipo + portal muestra "En línea". Falta: "hace X min" en lista de conversaciones del nutriólogo
tipos: ultimaConexion relative-time en chat list
Built
Historial completo
Mensajes persistidos en subcollection Firestore, real-time listener
conversaciones.service.ts use-chat.ts → useMensajes()
Parcial
Badge mensajes no leídos
mensajesNoLeidos trackeado en Firestore, reset al abrir. Bell global funciona. Falta: badge por conversación individual en la lista
notification-bell.tsx campo mensajesNoLeidos badge per-conversation
Built
File sharing
Multi-file, paste, lightbox, 10MB limit. Firebase Storage /chat/{convId}/{uuid}.ext
app/chat/page.tsx (inline) firebase/storage.ts
Extra
Filtro por tags en chat
Checkboxes de tags para filtrar conversaciones por tipo de paciente. No estaba en estatuto
app/chat/page.tsx (inline filter)
4

Agenda "Inteligente"

60%
Status
Feature
Notas
Referencia técnica
Built
Vistas mes / semana / día
3 componentes, auto-switch mobile a día, colores por estado y por nutriólogo
calendar-month-view.tsx calendar-week-view.tsx calendar-day-view.tsx
Parcial
Sync Google Calendar
Outbound (app → Google) built con OAuth + multi-calendar. Falta: inbound (Google → app)
lib/google/calendar.ts lib/google/oauth.ts google-calendar-integrations.tsx use-calendar-sync.ts
Parcial
Detección de conflictos
Union-Find algorithm para overlap detection dentro de la app. Falta: cross-calendar (no consulta Google Calendars externos)
lib/utils/overlap-detection.ts overlapping-events-stack.tsx
Parcial
Workflows pre-consulta
Email manual de recordatorio vía Postmark. Falta: scheduler automático (1d/1h/5min), formularios pre-consulta por tags
Postmark (email manual) cron/scheduler service pre-consult form
Parcial
Push notifications
Toggle on/off en settings + browser permission request. Falta: timing configurable, no hay scheduled dispatch real
lib/firebase/messaging.ts lib/firebase/push.ts scheduled-push.service.ts
Built
CRUD de citas
5 tipos (primera, valoración, seguimiento, control, revisión), modalidad, duración auto, notas, deep-link
create-appointment-dialog.tsx appointment-card.tsx citas.service.ts use-citas.ts
Falta
Drag & drop reagendar
Usa cancel-and-recreate con rescheduleDraft. No hay useDraggable en componentes de agenda
useDraggable en calendar views dnd-kit o similar
Parcial
Cancelar con razón
Cancelación funciona, estado no_show existe. Falta: campo de texto para razón de cancelación
citas.service.ts campo razonCancelacion
Built
Notas privadas por cita
Textarea en dialog, persistido, se pasa a descripción de Google Calendar
create-appointment-dialog.tsx lib/google/calendar.ts
Falta
Portal paciente: confirmar / reagendar
El portal no tiene vista de agenda. No existe /portal/agenda
app/(portal)/portal/agenda/page.tsx patient-appointment-card.tsx
Extra
Filtro por nutriólogo
Colores por especialista + filtro — útil para clínicas multi-nutriólogo. No estaba en estatuto
app/agenda/page.tsx (inline filter) use-nutriologos.ts
Extra
Overlapping events stack
UI de eventos superpuestos con expand/collapse. Más allá del estatuto
overlapping-events-stack.tsx
5

Membresías y Pagos (Stripe)

50%
Status
Feature
Notas
Referencia técnica
Built
Stripe Checkout (one-time)
Embedded + hosted mode, auth obligatoria, validación monto. Webhook con idempotencia (Firestore lock 5 min)
stripe-checkout-button.tsx stripe-embedded-checkout-dialog.tsx lib/stripe/
Falta
Suscripciones recurrentes
Cero referencias a stripe.subscriptions, recurring o interval. Solo pagos one-time
subscription-plans.tsx stripe.subscriptions.create() webhook subscription events
Parcial
Paquetes / bundles
PLANES_SERVICIO en config como dropdown. Sin tracking de consultas consumidas del paquete
configuracion.service.ts → PLANES_SERVICIO session-tracker.service.ts
Falta
Lógica no-show automática
Estado no_show se trackea manualmente. Sin acciones automáticas (pausar acceso, descontar paquete)
no-show-automation.ts cron trigger o Cloud Function
Falta
Control acceso por pago
Campo planActivo y estadoPago existen en tipo. Sin enforcement: ni middleware, ni rule, ni hook bloquea portal
tipos: planActivo, estadoPago payment-gate middleware firestore.rules enforcement
Parcial
Reportes financieros
5 summary cards (cobrado, pendiente, anticipos, reembolsado). Falta: proyecciones, gráfica tendencia con data real (usa mock)
payment-summary-cards.tsx payments-table.tsx use-pagos.ts
Built
Registro manual transacciones
Efectivo, transferencia, tarjeta, otro. Firestore transaction con tolerancia 0.01. Referencia + fecha + notas
pagos.service.ts app/pagos/page.tsx
6

Dashboard del Nutriólogo

45%
Status
Feature
Notas
Referencia técnica
Parcial
Métricas de pacientes
Activos y pipeline desde Firestore. Falta: "nuevos del mes" no filtra por fecha, retención no computada (hardcoded)
stats-cards.tsx app/dashboard/metricas/page.tsx
Parcial
Leaderboard última actividad
Lista de inactividad (>7 días). Falta: ranking de pacientes más activos / más comprometidos
patient-alerts.tsx action-required-widget.tsx
Parcial
Semáforo (verde/amarillo/rojo)
Implementado y sorted red-first. Bug: thresholds off-by-one vs estatuto (código: rojo 1-3, estatuto: rojo 1-4)
patient-alerts.tsx fix threshold constants
Built
Alertas destacadas al inicio
Sorted por severidad, deduplicadas por paciente, border-color por nivel
action-required-widget.tsx today-widget.tsx
Falta
Gráficas tendencia por paciente
BarChart mensual usa datos hardcoded mock. PieChart por objetivo es real. Sin trend chart per-patient en dashboard
app/dashboard/page.tsx (BarChart mock) real-data chart service
Falta
Filtro top pacientes (>90% adherencia)
Campo adherencia: number existe en cuestionario. Sin agregación, ranking, ni filtro
adherence-aggregator.ts top-patients-widget.tsx
Extra
Pipeline visual (Kanban)
Dashboard muestra pacientes por etapa del pipeline con conteo. No estaba en estatuto
pipeline-mini.tsx use-pipeline-config.ts
7

Roles y Permisos

95%
Status
Feature
Notas
Referencia técnica
Built
4 roles predefinidos
Admin (all), Nutriólogo (clínico), Asistente (agenda+lectura), Recepcionista (agenda+pagos). Match exacto con estatuto
lib/types/index.ts → ROLES_PREDEFINIDOS lib/auth/permissions.ts
Built
Permisos granulares toggleables
11 permisos con Switch matrix. Admin siempre-on. Saved a Firestore con localStorage fallback
roles-manager.tsx use-permissions.ts permissions.ts → hasPermission()
Built
Sistema de invitación
Email + UUID token 7 días. API auth-gated (admin only). Postmark o simulación
invite-team-dialog.tsx invitaciones.service.ts workspace-tokens.service.ts
Built
Protección de rutas por rol
2 capas: middleware.ts (cookie session) + ProtectedPage (client-side permission check). 403 para insuficiente
middleware.ts protected-page.tsx auth-context.tsx sidebar.tsx (filtering)
Parcial
Onboarding de miembro invitado
Token de invitación redirige a /signup. Falta: wizard de onboarding específico para miembros del equipo (distinto al de paciente)
app/signup/page.tsx team-onboarding-wizard.tsx
+

Cascarón Visual de Fitness

100%
Status
Feature
Notas
Referencia técnica
Built
Rutinas — visible, bloqueada
Overlay backdrop-blur con "Próximamente" + badge "Fase 2 - Fitness + Valoración". Botón crear disabled
app/rutinas/page.tsx training-calendar.tsx
Built
Ejercicios — visible, bloqueada
Grid de ejercicios renderizado debajo del overlay. Patrón idéntico a Rutinas
app/ejercicios/page.tsx
P

PWA (Instalable iOS/Android)

10%
Status
Feature
Notas
Referencia técnica
Parcial
Service Worker
Solo firebase-messaging-sw.js para push notifications. No hay SW de caching/offline
public/firebase-messaging-sw.js sw.js (cache + offline)
Falta
Web App Manifest
No existe manifest.json ni manifest.webmanifest en /public/. Layout no incluye metadata manifest
public/manifest.json app/layout.tsx → meta manifest link
Falta
Instalabilidad
Sin manifest = sin prompt de instalación. Faltan theme_color, background_color, display: standalone
manifest.json con icons 192/512 next.config: headers PWA
L

Compliance LFPDPPP

0%
Status
Feature
Notas
Referencia técnica
Falta
Aviso de Privacidad en registro
Onboarding paso 8 (revisión) tiene "Crear Cuenta" sin checkbox de consentimiento ni link a aviso de privacidad
paso-8-revision.tsx privacy-consent-checkbox privacy-policy page
Falta
Consentimiento Expreso datos salud
Paso 3 (historial clínico) recopila datos sensibles sin disclosure. docs/legal/privacy-policy.md existe pero no está linkeado en UI
paso-3-historial-clinico.tsx docs/legal/privacy-policy.md health-data-consent dialog
Falta
Derechos ARCO
Sin mecanismo de Acceso, Rectificación, Cancelación u Oposición para pacientes
portal/privacidad/page.tsx arco-request.service.ts data-export + delete API
Falta
Disclaimer salud
Sin texto de descargo en la app sobre sugerencias nutricionales. Contrato exige implementación técnica
health-disclaimer-banner.tsx portal footer disclaimer