implementacion-incremental

Sistema de Reservas — NutriTrack

Next.js 14 · Prisma · Stripe · Resend
6 rodajas verticales · 3 completadas
Estimación: 4 sprints (2 sem)
// ciclo de incremento
Impl.
Implementar
Test
Testar
Verif.
Verificar
Commit
Commitear
Next
slice
Siguiente
Cada rodaja: <100 líneas · 1 responsabilidad · sistema siempre compilable
Progreso del feature
50% — 3 / 6 slices
S1: Schema DB S2: POST /appointments S3: GET /appointments S4: UI Calendario ← activo S5: Email confirmacion S6: Pago Stripe
// rodajas verticales
Rodaja 1 — Schema Prisma + Migración
DB test
completado
Implementar
Añadir modelo Appointment a schema.prisma:
id, patientId, dietistId, datetime, duration, status, stripePaymentId
Testar
npx prisma migrate dev --name add-appointments
Test de seed: insertar 1 registro y recuperarlo
Verificar
Migración aplicada sin errores. npx prisma studio muestra la tabla. Build limpio.
Commit
feat(db): add Appointment model and migration
  • Un solo cambio lógico (solo schema, sin tocar APIs)
  • Build compila tras migración
  • Tests de base de datos pasan (4/4)
Rodaja 2 — POST /api/appointments
API test
completado
Implementar
Crear app/api/appointments/route.ts — solo handler POST con validación Zod. Sin email, sin Stripe todavía.
Testar
npm test -- appointments.post.test
Casos: payload válido, campos faltantes, conflicto de horario.
Verificar
curl -X POST /api/appointments devuelve 201 con el appointment creado. Tests pasan (6/6).
Commit
feat(api): POST /appointments endpoint with Zod validation
  • Solo POST — GET/PUT/DELETE en rodajas siguientes
  • Scope discipline: no se tocó auth middleware
  • Tests de integración pasan (6/6)
Rodaja 3 — GET /api/appointments + listado
API test
completado
Implementar
Añadir handler GET al mismo route. Filtros por dietistId y rango de fechas. Paginación simple.
Testar
npm test -- appointments.get.test
Casos: lista vacía, paginación, filtro por dietista.
Verificar
Respuesta 200 con array. Tests previos siguen en verde. npx tsc --noEmit limpio.
Commit
feat(api): GET /appointments with pagination and filters
  • Tests acumulados pasan (10/10)
  • Type-check limpio
  • Linting sin warnings nuevos
4
Rodaja 4 — UI Calendario de Disponibilidad
UI test API
en progreso
Implementar
Componente AppointmentCalendar: rejilla semanal consumiendo GET /appointments. Marcar slots ocupados/libres. Sin pago todavía — feature flag ENABLE_STRIPE_PAYMENT=false.
Testar
npm test -- AppointmentCalendar
Testing Library: render, selección de slot, estado cargando.
Verificar
Pantalla muestra slots del dietista. Slot ocupado no clicable. Build limpio. Storybook si disponible.
Commit
feat(ui): AppointmentCalendar with weekly view and slot states
  • Scope note: se detectó que el componente de Avatar tiene un import sin usar — NO se toca (tarea separada)
  • Tests de componente pendientes
  • Feature flag ENABLE_STRIPE_PAYMENT aislará el flujo de pago
5
Rodaja 5 — Email de Confirmación (Resend)
email API
pendiente
6
Rodaja 6 — Pago Stripe (60€/sesión)
Stripe API UI
pendiente
Regla 0
Simplicidad Primero
¿Qué es lo más simple que puede funcionar? Sin EventBus para una notificación. Sin abstract factories para dos componentes similares.
Regla 0.5
Disciplina de Alcance
Toca solo lo que la tarea requiere. Detecta mejoras fuera de scope → crea tarea. No las apliques ahora.
Regla 1
Una Cosa a la Vez
Cada commit cambia una cosa lógica. No mezclar: nuevo componente + refactor + build config en el mismo commit.
Regla 2
Siempre Compilable
Tras cada rodaja el proyecto debe compilar y los tests existentes pasar. Nunca dejar el codebase roto entre slices.
Regla 3
Feature Flags
Si la feature no está lista para usuarios, usa ENABLE_*=false para mergear increments sin exponer trabajo incompleto.
Regla 4–5
Safe Defaults + Rollback
Nuevos parámetros opt-in (default: false). Cambios aditivos fáciles de revertir. Migraciones con rollback correspondiente.
Red Flags — señales de alerta
Más de 100 líneas escritas sin correr tests
Múltiples cambios no relacionados en un solo increment
"Déjame añadir esto también rápido" (scope creep)
Saltar el paso test/verify para ir más rápido
Build o tests rotos entre increments
Grandes bloques sin commitear acumulándose
Abstracciones antes del tercer caso de uso
Ejecutar el mismo comando build dos veces seguidas sin cambios