* **Google Calendar API:** Gestión e integración de citas de la agenda médica.
* **Chatwoot:** Mensajería (redirección y notificaciones básicas).
* **Seguridad:** Autenticación por Identity con roles (`Administrador`, `Médico`, `Secretaria`, `Recepcionista`, etc.) y autorización mediante políticas personalizadas.
* **Plan de desarrollo:** Consultar siempre las fases y tareas del archivo `plan_desarrollo_sistema_medico.md`.
<divclass="phase-title">Infraestructura base y autenticación</div>
<divclass="phase-desc">Scaffolding del proyecto, modelos de datos, roles e Identity</div>
</div>
<spanclass="weeks">≈ 2 semanas</span>
<spanclass="chevron"id="chev-f1">⌄</span>
</div>
<divclass="progress-bar"style="background:linear-gradient(to right,#378ADD 100%,var(--border) 0%);margin:0 18px 0"></div>
<divclass="phase-body"id="f1">
<divclass="task"><divclass="dot"style="background:#378ADD"></div><div><divclass="task-label">Crear solución ASP.NET Core 6+ con MVC</div><divclass="task-sub">Configurar Program.cs, inyección de dependencias, Pomelo MySQL y Migrations base</div></div></div>
<divclass="task"><divclass="dot"style="background:#378ADD"></div><div><divclass="task-label">Implementar <code>ApplicationUser</code> con ASP.NET Identity</div><divclass="task-sub">Campos: Nombre, Apellido, Documento, Dirección, Teléfono, RolPrincipal</div></div></div>
<divclass="task"><divclass="dot"style="background:#378ADD"></div><div><divclass="task-label">Definir roles y políticas de autorización</div><divclass="task-sub">Administrador, Médico, Secretaria, Recepcionista — RoleSeeder.cs</div></div></div>
<divclass="task"><divclass="dot"style="background:#378ADD"></div><div><divclass="task-label">Construir <code>AccountController</code> (login / logout / registro)</div><divclass="task-sub">Views con Bootstrap, validación del lado cliente y servidor</div></div></div>
<divclass="task"><divclass="dot"style="background:#378ADD"></div><div><divclass="task-label">Layout compartido y navbar condicional por rol</div><divclass="task-sub">_Layout.cshtml con menú adaptado según claims del usuario autenticado</div></div></div>
<divclass="task"><divclass="dot"style="background:#378ADD"></div><div><divclass="task-label">Migraciones iniciales y seeder de roles</div><divclass="task-sub">Verificar creación de tablas Identity en MySQL y usuario administrador inicial</div></div></div>
<divclass="phase-title">Gestión de usuarios y pacientes</div>
<divclass="phase-desc">CRUD completo de personal médico y pacientes</div>
</div>
<spanclass="weeks">≈ 2–3 semanas</span>
<spanclass="chevron"id="chev-f2">⌄</span>
</div>
<divclass="progress-bar"style="background:linear-gradient(to right,#1D9E75 100%,var(--border) 0%);margin:0 18px 0"></div>
<divclass="phase-body"id="f2">
<divclass="task"><divclass="dot"style="background:#1D9E75"></div><div><divclass="task-label">Módulo de usuarios (<code>UsuariosController</code>)</div><divclass="task-sub">Listar, crear, editar, deshabilitar. Asignación de roles. Perfil de médico (Especialidad, Matrícula, Horario)</div></div></div>
<divclass="task"><divclass="dot"style="background:#1D9E75"></div><div><divclass="task-label">Modelo y migración de <code>Paciente</code></div><divclass="task-sub">Todos los campos del diseño: DNI único, ObraSocial, FechaRegistro, FK a UsuarioAlta</div></div></div>
<divclass="task"><divclass="dot"style="background:#1D9E75"></div><div><divclass="task-label">CRUD de pacientes (<code>PacientesController</code>)</div><divclass="task-sub">Alta, baja lógica, modificación, búsqueda por nombre / documento. ViewModels y validaciones</div></div></div>
<divclass="task"><divclass="dot"style="background:#1D9E75"></div><div><divclass="task-label">Vista de perfil de paciente</div><divclass="task-sub">Resumen de datos, historial de citas y acceso rápido a historia clínica</div></div></div>
<divclass="task"><divclass="dot"style="background:#1D9E75"></div><div><divclass="task-label">Autorización por rol en vistas y acciones</div><divclass="task-sub">[Authorize(Roles = "...")] en controladores; ocultar botones según claims</div></div></div>
<divclass="phase-title">Gestión de citas y Google Calendar</div>
<divclass="phase-desc">Agenda médica con sincronización bidireccional</div>
</div>
<spanclass="weeks">≈ 3 semanas</span>
<spanclass="chevron"id="chev-f3">⌄</span>
</div>
<divclass="progress-bar"style="background:linear-gradient(to right,#BA7517 100%,var(--border) 0%);margin:0 18px 0"></div>
<divclass="phase-body"id="f3">
<divclass="task"><divclass="dot"style="background:#BA7517"></div><div><divclass="task-label">Modelo y migración de <code>Cita</code></div><divclass="task-sub">FK a Paciente y Médico, estados (Programada / Confirmada / Cancelada / Atendida), GoogleCalendarEventId</div></div></div>
<divclass="task"><divclass="dot"style="background:#BA7517"></div><div><divclass="task-label">CRUD de citas (<code>CitasController</code>)</div><divclass="task-sub">Crear, editar, cancelar. Vista de agenda diaria/semanal (FullCalendar.js o similar)</div></div></div>
<divclass="task"><divclass="dot"style="background:#BA7517"></div><div><divclass="task-label">Configurar OAuth2 con Google</div><divclass="task-sub">Credenciales en Google Cloud Console, flujo de autorización, almacenamiento de tokens</div></div></div>
<divclass="task"><divclass="dot"style="background:#BA7517"></div><div><divclass="task-label">Implementar <code>GoogleCalendarService</code></div><divclass="task-sub">Crear, actualizar y eliminar eventos en Google Calendar. Mapeo de campos Cita ↔ CalendarEvent</div></div></div>
<divclass="task"><divclass="dot"style="background:#BA7517"></div><div><divclass="task-label">Sincronización bidireccional</div><divclass="task-sub">Webhook o polling para traer cambios externos. Reconciliación de estado por GoogleCalendarEventId</div></div></div>
<divclass="task"><divclass="dot"style="background:#BA7517"></div><div><divclass="task-label">Notificaciones y recordatorios de cita</div><divclass="task-sub">Envío de invitación por email al paciente al confirmar la cita</div></div></div>
<divclass="phase-desc">Registro de consultas, diagnósticos, tratamientos y recetas</div>
</div>
<spanclass="weeks">≈ 2–3 semanas</span>
<spanclass="chevron"id="chev-f4">⌄</span>
</div>
<divclass="progress-bar"style="background:linear-gradient(to right,#D4537E 100%,var(--border) 0%);margin:0 18px 0"></div>
<divclass="phase-body"id="f4">
<divclass="task"><divclass="dot"style="background:#D4537E"></div><div><divclass="task-label">Modelo y migración de <code>HistoriaClinica</code></div><divclass="task-sub">FK a Paciente y Médico, Diagnóstico (texto o CIE-10), TratamientoIndicado, ProximoControl</div></div></div>
<divclass="task"><divclass="dot"style="background:#D4537E"></div><div><divclass="task-label">CRUD de historia clínica (<code>HistoriaClinicaController</code>)</div><divclass="task-sub">Crear registro por consulta, edición restringida al médico autor, vista timeline por paciente</div></div></div>
<divclass="task"><divclass="dot"style="background:#D4537E"></div><div><divclass="task-label">Vista de historial completo del paciente</div><divclass="task-sub">Timeline cronológico de consultas, diagnósticos y evolución. Filtros por fecha y médico</div></div></div>
<divclass="task"><divclass="dot"style="background:#D4537E"></div><div><divclass="task-label">Gestión de estados de paciente</div><divclass="task-sub">Activo / En tratamiento / Derivado — visible en perfil y dashboard</div></div></div>
<divclass="task"><divclass="dot"style="background:#D4537E"></div><div><divclass="task-label">Exportación básica a PDF</div><divclass="task-sub">Resumen de historia clínica imprimible para el paciente o para derivación</div></div></div>
<divclass="phase-title">Dashboard e integración Chatwoot</div>
<divclass="phase-desc">Vista ejecutiva y mensajería embebida</div>
</div>
<spanclass="weeks">≈ 1–2 semanas</span>
<spanclass="chevron"id="chev-f5">⌄</span>
</div>
<divclass="progress-bar"style="background:linear-gradient(to right,#7F77DD 100%,var(--border) 0%);margin:0 18px 0"></div>
<divclass="phase-body"id="f5">
<divclass="task"><divclass="dot"style="background:#7F77DD"></div><div><divclass="task-label">Dashboard por rol (<code>DashboardController</code>)</div><divclass="task-sub">Citas del día para médicos; resumen de pacientes y agenda para secretaría; métricas globales para admin</div></div></div>
<divclass="task"><divclass="dot"style="background:#7F77DD"></div><div><divclass="task-sub">Widgets: próximas citas, pacientes registrados hoy, citas pendientes de confirmación</div></div></div>
<divclass="task"><divclass="dot"style="background:#7F77DD"></div><div><divclass="task-label">Implementar <code>ChatwootService</code></div><divclass="task-sub">Integración con API REST de Chatwoot: contador de mensajes no leídos, redirect a conversación</div></div></div>
<divclass="task"><divclass="dot"style="background:#7F77DD"></div><div><divclass="task-label">Ícono de mensajes en navbar con badge de no leídos</div><divclass="task-sub">Polling periódico o SignalR para actualizar el contador sin recargar la página</div></div></div>
<divclass="phase-title">Calidad, seguridad y despliegue</div>
<divclass="phase-desc">Testing, hardening y puesta en producción</div>
</div>
<spanclass="weeks">≈ 2 semanas</span>
<spanclass="chevron"id="chev-f6">⌄</span>
</div>
<divclass="progress-bar"style="background:linear-gradient(to right,#888780 100%,var(--border) 0%);margin:0 18px 0"></div>
<divclass="phase-body"id="f6">
<divclass="task"><divclass="dot"style="background:#888780"></div><div><divclass="task-label">Tests unitarios e integración</div><divclass="task-sub">xUnit para servicios y controladores críticos (GoogleCalendarService, autenticación, citas)</div></div></div>
<divclass="task"><divclass="dot"style="background:#888780"></div><div><divclass="task-label">Auditoría de seguridad</div><divclass="task-sub">Validar anti-CSRF, XSS, inyección SQL, rate limiting en login, HTTPS forzado</div></div></div>
<divclass="task"><divclass="dot"style="background:#888780"></div><div><divclass="task-label">Logging y manejo de errores</div><divclass="task-sub">Serilog o NLog con niveles diferenciados; página de error amigable; alertas por excepción</div></div></div>
<divclass="task"><divclass="dot"style="background:#888780"></div><div><divclass="task-label">Optimización de consultas EF Core</div><divclass="task-sub">Revisión de N+1 queries, índices en MySQL (DocumentoIdentidad, MedicoId, FechaHoraInicio)</div></div></div>
<divclass="task"><divclass="dot"style="background:#888780"></div><div><divclass="task-label">Configuración de entorno productivo</div><divclass="task-sub">Secrets/appsettings por entorno, cadena de conexión segura, deploy en servidor Linux o Azure</div></div></div>
<divclass="task"><divclass="dot"style="background:#888780"></div><div><divclass="task-label">Documentación técnica y manual de usuario</div><divclass="task-sub">README actualizado, guía de roles y permisos, instrucciones de onboarding para el equipo médico</div></div></div>
- Views con Bootstrap, validación del lado cliente y servidor
- [ ] Layout compartido y navbar condicional por rol
-`_Layout.cshtml` con menú adaptado según claims del usuario autenticado
- [ ] Migraciones iniciales y seeder de roles
- Verificar creación de tablas Identity en MySQL y usuario administrador inicial
---
## Fase 2 — Gestión de usuarios y pacientes
**Objetivo:** CRUD completo de personal médico y pacientes.
- [ ] Módulo de usuarios (`UsuariosController`)
- Listar, crear, editar, deshabilitar
- Asignación de roles
- Perfil de médico: `Especialidad`, `MatriculaProfesional`, `HorarioAtencion`
- [ ] Modelo y migración de `Paciente`
- Campos: `Nombres`, `Apellidos`, `FechaNacimiento`, `Genero`, `DocumentoIdentidad` (único), `Direccion`, `Telefono`, `Email`, `ObraSocial`, `FechaRegistro`, FK a `UsuarioAlta`
- [ ] CRUD de pacientes (`PacientesController`)
- Alta, baja lógica, modificación
- Búsqueda por nombre / documento
- ViewModels y validaciones
- [ ] Vista de perfil de paciente
- Resumen de datos, historial de citas y acceso rápido a historia clínica
- [ ] Autorización por rol en vistas y acciones
-`[Authorize(Roles = "...")]` en controladores
- Ocultar botones según claims del usuario
> **Decisión pendiente:** Definir si `Médico` extiende `ApplicationUser` (relación 1:1) o es una entidad separada. Resolverlo antes de las migraciones de Fase 3, ya que afecta todas las FK de `Cita` e `HistoriaClinica`.
---
## Fase 3 — Gestión de citas y Google Calendar
**Objetivo:** Agenda médica con sincronización bidireccional.
> ⚠️ **Fase de mayor riesgo.** La integración OAuth2 y la sincronización bidireccional son los puntos más propensos a imprevistos. Reservar tiempo adicional.
- [ ] CRUD de historia clínica (`HistoriaClinicaController`)
- Crear registro por consulta
- Edición restringida al médico autor
- Vista timeline por paciente
- [ ] Vista de historial completo del paciente
- Timeline cronológico de consultas, diagnósticos y evolución
- Filtros por fecha y médico
- [ ] Gestión de estados de paciente
-`Activo` / `En tratamiento` / `Derivado` — visible en perfil y dashboard
- [ ] Exportación básica a PDF
- Resumen de historia clínica imprimible para el paciente o para derivación
---
## Fase 5 — Dashboard e integración Chatwoot
**Objetivo:** Vista ejecutiva por rol y mensajería embebida.
- [ ] Dashboard por rol (`DashboardController`)
- **Médico:** citas del día, próximos controles
- **Secretaría:** agenda general, pacientes registrados hoy, citas pendientes de confirmación
- **Administrador:** métricas globales del sistema
- [ ] Widgets del dashboard
- Próximas citas, pacientes registrados hoy, citas pendientes de confirmación
- [ ] Implementar `ChatwootService`
- Integración con API REST de Chatwoot
- Contador de mensajes no leídos y redirect a conversación
- [ ] Ícono de mensajes en navbar con badge de no leídos
- Polling periódico o SignalR para actualizar el contador sin recargar la página
---
## Fase 6 — Calidad, seguridad y despliegue
**Objetivo:** Testing, hardening y puesta en producción.
- [ ] Tests unitarios e integración
- xUnit para servicios y controladores críticos (`GoogleCalendarService`, autenticación, citas)
- [ ] Auditoría de seguridad
- Validar anti-CSRF, XSS, inyección SQL
- Rate limiting en login, HTTPS forzado
- [ ] Logging y manejo de errores
- Serilog o NLog con niveles diferenciados
- Página de error amigable; alertas por excepción crítica
- [ ] Optimización de consultas EF Core
- Revisión de N+1 queries
- Índices en MySQL: `DocumentoIdentidad`, `MedicoId`, `FechaHoraInicio`
- [ ] Configuración de entorno productivo
-`appsettings` por entorno (Development / Production)
- Cadena de conexión segura, secrets management
- Deploy en servidor Linux o Azure App Service
- [ ] Documentación técnica y manual de usuario
- README actualizado con instrucciones de setup
- Guía de roles y permisos
- Manual de onboarding para el equipo médico y administrativo
---
## Dependencias entre fases
```
Fase 1 → Fase 2 → Fase 3 → Fase 4
↘
Fase 5 (Dashboard consume datos de Fases 2–4)
↘
Fase 6 (transversal a todo el proyecto)
```
> La **Fase 1** es prerequisito duro para todo lo demás.
> La **Fase 6** puede iniciarse parcialmente en paralelo desde la Fase 3 en adelante (testing y logging).
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.