PRD Next.js 14 + FastAPI Generado automaticamente v1.0.0

NutriFlow Dashboard

Generado: 12 jun 2026 Stack: Next.js 14 (App Router) + FastAPI Analizado por: Skill ingeniero-inverso-prd
6
Modulos funcionales
14
Paginas documentadas
23
Endpoints de API
3
Roles de usuario
48
Campos documentados

πŸ₯ Vision general del sistema

NutriFlow Dashboard es una plataforma web B2B de gestion nutricional clinica. Permite a dietistas y administradores de clinica gestionar pacientes, asignar y monitorizar planes de alimentacion, hacer seguimiento de la evolucion y generar informes para la clinica y los pacientes.

El sistema tiene tres tipos de usuario con acceso diferenciado: administradores de clinica que gestionan el equipo y la configuracion, dietistas que trabajan con sus pacientes asignados, y pacientes que visualizan su propio plan y progreso.

Tecnicamente es una aplicacion fullstack: el frontend esta construido con Next.js 14 usando App Router y hace llamadas a una API REST FastAPI desplegada separadamente. El estado del cliente se gestiona con Zustand y las peticiones asincronas con TanStack Query.

Modulos del sistema

#ModuloPaginasFuncionalidad principalRoles con acceso
1AutenticacionLogin, Recuperar contrasena, Reset contrasenaAcceso seguro con JWT, redireccion por rolTodos
2Gestion de pacientesLista, Ficha detalle, Alta/bajaCRUD de pacientes, asignacion a dietistasAdmin, Dietista
3Planes nutricionalesLista planes, Editor de plan, Asignar planCrear y asignar planes semana a semanaDietista
4SeguimientoRegistro diario, Historial evolucion, Grafica pesoRegistro de comidas y peso, calculo IMCDietista, Paciente
5ReportesMetricas clinica, Informe paciente (PDF)Estadisticas de adherencia y progresoAdmin, Dietista
6ConfiguracionPerfil clinica, Usuarios, FacturacionAjustes del espacio de trabajoAdmin

πŸ“‹ Inventario de paginas

#PaginaRutaModuloStack
1Login/loginAuthNext.js client component
2Recuperar contrasena/auth/recuperar-passwordAuthNext.js client component
3Reset contrasena/auth/reset-password?token=xxxAuthNext.js client component
4Dashboard principal/dashboardHomeNext.js server component
5Lista de pacientes/pacientesPacientesNext.js client component
6Ficha paciente/pacientes/:idPacientesNext.js server + client
7Lista planes/planesPlanesNext.js client component
8Editor de plan/planes/:id/editarPlanesNext.js client component
9Registro diario/seguimiento/registroSeguimientoNext.js client component
10Evolucion paciente/pacientes/:id/evolucionSeguimientoNext.js server + client
11Reportes clinica/reportesReportesNext.js server component
12Perfil clinica/configuracion/clinicaConfigNext.js client component
13Gestion usuarios/configuracion/usuariosConfigNext.js client component
14Facturacion/configuracion/facturacionConfigNext.js client component

πŸ” Modelo de permisos

El sistema implementa RBAC (Role-Based Access Control) con tres roles. El token JWT incluye el campo role que el frontend lee de localStorage para redirigir al espacio correcto tras el login.

Modulo / PaginaAdminDietistaPaciente
Dashboard principalSi (metricas globales)Si (sus pacientes)No
Lista de pacientesTodosSolo los suyosNo
Crear / editar pacienteSiSolo los suyosNo
Dar de alta (baja clinica)SiSolo los suyosNo
Planes nutricionalesLecturaCRUD completoSolo ver su plan activo
Registro diarioNoVerCrear/editar
Reportes clinicaSiSolo sus pacientesNo
Configuracion / usuariosSiNoNo
Patron global: Toda llamada a la API incluye el header Authorization: Bearer {token}. El backend FastAPI valida el token y el rol antes de cada operacion.
Redireccion post-login: admin β†’ /admin/dashboard | dietista β†’ /dashboard | paciente β†’ /paciente/resumen
πŸ”‘

Modulo 1 β€” Autenticacion

Paginas de acceso, recuperacion y reseteo de contrasena. Rutas publicas (no requieren token).

Pagina: Login β€” /login

Pagina de entrada al sistema. El usuario introduce email y contrasena; el sistema valida contra la API, almacena el token JWT en localStorage y redirige segun el rol.

Campos

CampoTipoReq.ValidacionDescripcion
Correo electronicoEmail inputSiFormato email validoCuenta de acceso del usuario
ContrasenaPassword inputSiMinimo 8 caracteresContrasena de la cuenta

Interacciones

Envio del formulario (click "Entrar" o Enter)
AccionUsuario hace click en "Entrar" o pulsa Enter. El boton muestra "Cargando..." y queda deshabilitado.
APIPOST /api/auth/login con { email, password }
ValidacionEmail con formato valido. Contrasena minimo 8 caracteres. Ambos campos requeridos.
ExitoSe guarda token en localStorage. Se guarda rol en localStorage. Redireccion al espacio del rol (admin/dietista/paciente).
ErrorSe muestra el mensaje de error de la API ("Credenciales incorrectas" u otro). El boton vuelve a estar activo.
Click en "Olvidaste tu contrasena?"
AccionNavega a /auth/recuperar-password

API asociada

APIMetodoRutaTriggerRespuesta
LoginPOST/api/auth/loginSubmit formulario{ access_token, user: { id, role, nombre } }
πŸ‘₯

Modulo 2 β€” Gestion de pacientes

Listado, fichas y alta/baja de pacientes de la clinica. Acceso para admin y dietistas.

Pagina: Lista de pacientes β€” /pacientes

Tabla paginada con todos los pacientes. Permite buscar, filtrar por estado, acceder a fichas individuales, crear nuevos pacientes y dar de alta (baja clinica) a los existentes.

Layout

Cabecera: Titulo "Pacientes" + boton "+ Nuevo paciente" (abre modal).
Filtros: Campo de busqueda de texto libre + selector de estado.
Tabla: 7 columnas con paginacion de 20 filas por pagina.
Paginacion: Botones Anterior/Siguiente + contador "Pagina X de Y".

Filtros de busqueda

FiltroTipoOpcionesComportamiento
BusquedaText inputβ€”Busca por nombre completo, DNI/NIE o email. Resetea paginacion a pagina 1.
EstadoSelectTodos / Activo / Inactivo / Alta medica / Pendiente evaluacionFiltra la tabla. Se puede combinar con busqueda.

Columnas de la tabla

ColumnaFormatoClickableNotas
Nombre completoTexto enlaceSi β†’ ficha pacienteNavega a /pacientes/:id
DNI/NIETextoNoβ€”
EmailTextoNoβ€”
Dietista asignadoNombre del dietistaNoPuede estar vacio si no asignado
EstadoBadge de color segun estadoNoactivo/inactivo/alta/pendiente
Ultima visitaFecha dd/mm/aaaaNoLocale es-ES
AccionesLinks + botonSiVer ficha | Plan nutricional | Dar de alta

Acciones por fila

AccionComportamiento
Ver fichaNavega a /pacientes/:id
Plan nutricionalNavega a /pacientes/:id/plan
Dar de altaMuestra dialogo de confirmacion. Si confirma, hace PATCH /api/pacientes/:id con status='alta'. Refresca la tabla.

Modal: Nuevo paciente

CampoTipoReq.ValidacionDescripcion
NombreTextSiβ€”Nombre de pila
ApellidosTextSiβ€”Apellidos del paciente
DNI/NIETextSiPatron: 8 digitos + letra mayuscula, o X/Y/Z + 7 digitos + letraDocumento de identidad
Fecha de nacimientoDateSiβ€”Para calculo de edad e IMC
EmailEmailSiFormato email validoEmail de contacto y acceso del paciente
TelefonoTextNoPatron: empieza 6-9, 9 digitosMovil espanol
Dietista asignadoSelectSiβ€”Carga lista de dietistas de la clinica
ObjetivoSelectNoβ€”Perdida peso / Ganancia muscular / Mantenimiento / Gestion patologia / Rendimiento deportivo
Peso inicialNumber (0.1 paso)Noβ€”En kg. Se usa para calculo IMC y evolucion
AlturaNumber (entero)Noβ€”En cm
Alergias e intoleranciasTextareaNoβ€”Texto libre
Observaciones medicasTextareaNoβ€”Notas para el dietista
Guardar nuevo paciente
ValidacionCampos requeridos: nombre, apellidos, DNI, fecha nacimiento, email, dietista. DNI con patron regex. Email valido. Telefono con patron opcional.
APIPOST /api/pacientes con todos los campos del formulario
ExitoCierra el modal. Refresca la tabla de pacientes.
Error[TBC] El codigo fuente no muestra manejo de error explicitamente en el modal. Pendiente confirmar si muestra toast o error inline.

API de esta pagina

APIMetodoRutaTriggerParams
Listar pacientesGET/api/pacientesCarga inicial + busqueda + filtro + cambio paginapage, per_page=20, q, status
Crear pacientePOST/api/pacientesSubmit modal nuevo pacienteBody con todos los campos del formulario
Dar de altaPATCH/api/pacientes/:idClick boton "Dar de alta" + confirmacionBody: { status: "alta" }
πŸ“

Modulo 3 β€” Planes nutricionales

Creacion y gestion de planes de alimentacion asignados a pacientes. Solo los dietistas pueden crear y editar.

Pagina: Lista de planes β€” /planes

Tabla de todos los planes nutricionales con tabs de estado para filtrado rapido. Muestra metricas clave como calorias, duracion y adherencia.

Layout

Tabs de estado: "Activos (N)" | "Borradores (N)" | "Completados (N)". Funciona como filtro rapido.
Tabla: 8 columnas. Sin paginacion visible en el codigo analizado β€” puede estar en el servidor [TBC].

Columnas de la tabla

ColumnaFormatoNotas
PacienteNombre completoEnlaza a ficha del paciente
Nombre del planTextoEj: "Plan hipocalorico 8 semanas"
Calorias/diaNumero + "kcal"Objetivo calorico del plan
SemanasEnteroDuracion total del plan
InicioFechaFecha de inicio del plan
Fin previstoFechaInicio + duracion en semanas
EstadoBadge: borrador/activo/completado/suspendidoVer enum PlanStatus
AdherenciaPorcentaje (ej: 87%)% de dias con registro completo del paciente
πŸ“Š

Modulo 4 β€” Seguimiento

Registro diario de comidas y peso por parte del paciente, y visualizacion de evolucion por el dietista.

Pagina: Registro diario β€” /seguimiento/registro

El paciente registra lo que ha comido cada dia y su peso. El dietista puede ver y editar estos registros desde la ficha del paciente.

Campos del registro diario

CampoTipoReq.Descripcion
FechaDateSiPor defecto: hoy. El paciente puede registrar dias pasados.
Peso del diaNumber (0.1 paso)NoEn kg. Muestra diferencia con el dia anterior.
DesayunoTextareaNoDescripcion libre de alimentos
Media mananaTextareaNoβ€”
ComidaTextareaNoβ€”
MeriendaTextareaNoβ€”
CenaTextareaNoβ€”
Actividad fisicaSelect + minutosNoTipo (ninguna/caminata/cardio/fuerza/mixto) + duracion en minutos
Notas del diaTextareaNoBienestar general, sensaciones, incidencias

Pagina: Evolucion del paciente β€” /pacientes/:id/evolucion

Vista historica del progreso del paciente. Muestra grafica de peso con linea de tendencia, tablas de adherencia semanal y comparativa de medidas antropometricas.

Grafica de peso: Linea temporal (Recharts). Eje X: fechas. Eje Y: peso en kg. Incluye linea de objetivo y linea de tendencia calculada.
Tabla de adherencia: Por semana, % de dias con registro completo vs plan.
πŸ“ˆ

Modulo 5 β€” Reportes

Metricas globales de la clinica y generacion de informes PDF para pacientes.

Pagina: Reportes clinica β€” /reportes

Panel de metricas con graficas de resumen: numero de pacientes activos, distribucion de objetivos, adherencia media y evolucion mensual de altas/bajas.

MetricaFormatoDescripcion
Pacientes activosNumeroTotal con status='activo'
Nuevos este mesNumero + variacion %Comparativa con mes anterior
Adherencia mediaPorcentajeMedia de adherencia de todos los planes activos
Distribucion de objetivosGrafica de tarta (Recharts)% de cada objetivo (perdida peso, ganancia muscular, etc)
Evolucion mensualGrafica de barras (Recharts)Altas vs bajas por mes, ultimos 6 meses
πŸ”Œ

Apendice A β€” Inventario completo de API

Todos los endpoints identificados en el codebase (Next.js proxy β†’ FastAPI backend).

POST /api/auth/login Autenticacion de usuario
InputTipoReq.Descripcion
emailstringSiEmail de la cuenta
passwordstringSiContrasena, min 8 chars
OutputTipoDescripcion
access_tokenstring (JWT)Token de sesion
user.idintegerID del usuario
user.roleenum: admin/dietista/pacienteRol para redireccion
user.nombrestringNombre para mostrar en la UI
GET /api/pacientes Listar pacientes paginados
Query paramTipoDefaultDescripcion
pageinteger1Numero de pagina
per_pageinteger20Resultados por pagina
qstringβ€”Busqueda por nombre, DNI o email
statusenum PacienteStatusβ€”Filtro por estado
Output fieldTipoDescripcion
itemsarrayLista de pacientes (ver modelo Paciente)
total_pagesintegerTotal de paginas disponibles
totalintegerTotal de registros
POST /api/pacientes Crear nuevo paciente

Body con los campos del formulario Nuevo Paciente. Devuelve el paciente creado con id asignado.

PATCH /api/pacientes/:id Actualizar campos del paciente

Usado para dar de alta (cambiar status a "alta") y para editar datos de la ficha. Body parcial con solo los campos a actualizar.

GET /api/planes Listar planes nutricionales
Output fieldTipoDescripcion
activosintegerContador para el tab "Activos"
borradoresintegerContador para el tab "Borradores"
completadosintegerContador para el tab "Completados"
itemsarrayLista de planes (ver modelo Plan)
πŸ—‚οΈ

Apendice B β€” Diccionario de enums y constantes

Todos los valores de estado, tipos y codigos usados en el sistema.

PacienteStatus β€” Estado del paciente
ValorEtiqueta UIDescripcion
activoActivoPaciente en seguimiento activo. Aparece en busquedas por defecto.
inactivoInactivoPaciente que no tiene plan activo en este momento pero sigue en la base de datos.
altaAlta medicaPaciente dado de alta, ya no requiere seguimiento. Se oculta de listas por defecto.
pendientePendiente evaluacionPaciente creado pero aun no evaluado por el dietista asignado.
PlanStatus β€” Estado del plan nutricional
ValorEtiqueta UIDescripcion
borradorBorradorPlan en creacion, aun no asignado al paciente.
activoActivoPlan en curso, el paciente puede registrar su adherencia.
completadoCompletadoEl periodo del plan ha finalizado.
suspendidoSuspendidoPlan interrumpido antes de finalizar (por motivos medicos u otros).
ObjetivoNutricional β€” Objetivo del paciente
ValorEtiqueta UIDescripcion
perdida_pesoPerdida de pesoDeficit calorico progresivo
ganancia_muscularGanancia muscularSuperavit calorico con enfasis en proteinas
mantenimientoMantenimientoTDEE equilibrado
patologiaGestion de patologiaPlan adaptado a condicion medica (diabetes, celiaquia, etc)
deportivoRendimiento deportivoPlan periodizado segun carga de entrenamiento
UserRole β€” Roles de usuario
ValorDescripcion
adminAdministrador de la clinica. Acceso completo a todo.
dietistaProfesional nutricionista. Acceso a sus pacientes asignados.
pacientePaciente de la clinica. Acceso solo a su propio perfil y plan.
πŸ—ΊοΈ

Apendice C β€” Relaciones entre paginas

Mapa de navegacion y paso de parametros entre paginas del sistema.

Pagina origenAccionDestinoParams pasados
LoginLogin exitoso (role=admin)/admin/dashboardβ€”
LoginLogin exitoso (role=dietista)/dashboardβ€”
LoginLogin exitoso (role=paciente)/paciente/resumenβ€”
LoginClick "Olvidaste contrasena"/auth/recuperar-passwordβ€”
Lista pacientesClick nombre en tabla/pacientes/:idid del paciente
Lista pacientesClick "Plan nutricional"/pacientes/:id/planid del paciente
Ficha pacienteClick "Ver evolucion"/pacientes/:id/evolucionid del paciente
Lista planesClick nombre del plan/planes/:id/editarid del plan
Ficha pacienteClick "Editar plan"/planes/:id/editarid del plan

Patron de refresco de datos compartidos

Alta de paciente: Al dar de alta desde Lista pacientes, TanStack Query invalida la cache de ['pacientes', ...] y la tabla se refresca automaticamente.
Nuevo paciente: Al guardar el modal, se llama a refetch() explicitamente sobre la query de la lista.
Cambios en plan: Al guardar un plan desde el editor, se invalida la cache de ['planes'] y de ['pacientes', id] para reflejar el nuevo plan activo en la ficha.