# Arquitectura — Fase 1

## Visión general

Dental Agenda será un monolito modular PHP con una API HTTP interna. El navegador solo presenta datos autorizados; toda decisión de acceso se toma en el backend usando el usuario autenticado de la sesión, nunca un `odontologo_id` enviado por cliente.

```
Navegador móvil (Bootstrap 5 + JS nativo)
          │ HTTPS / Fetch bajo demanda
          ▼
PHP: rutas → autenticación → CSRF → autorización por recurso → servicios
                                                          │
                                       auditoría ◄────────┼──────► almacenamiento privado de archivos
                                                          ▼
                                                       MySQL 8
```

Las áreas de dominio serán: identidad, agenda, pacientes/asignaciones, expediente, fotografías, recordatorios y auditoría. Cada consulta clínica conserva `odontologo_autor_id`; las correcciones agregan una revisión en vez de alterar silenciosamente el registro original.

## Reglas de aislamiento

1. La identidad del odontólogo se deriva exclusivamente de `$_SESSION`.
2. Paciente, consulta, cita, fotografía y archivo se resuelven por su ID y se autorizan en el servidor antes de leerlos o modificarlos.
3. Una relación activa en `odontologo_paciente` concede acceso base al paciente; permisos de colaboración delimitan acciones clínicas adicionales.
4. Las consultas y fotografías propias conservan su autor. Ver información de otro autor requiere permiso explícito y vigente.
5. Las fotos originales no se publican desde el directorio web; un controlador autorizado las transmite tras comprobar permisos.

## Estructura propuesta

```
dentalAgenda/
├── app/
│   ├── Http/{Controllers,Middleware,Requests}/
│   ├── Domain/{Identity,Agenda,Patients,Clinical,Media,Reminders,Audit}/
│   ├── Application/                 # casos de uso y políticas
│   ├── Infrastructure/{Database,Storage,Messaging}/
│   ├── Policies/                    # autorización por recurso
│   ├── Views/
│   └── Support/
├── config/                          # sin secretos; .env fuera de Git
├── database/{migrations,seeds}/
├── public/{index.php,assets}/
├── storage/{private,logs,cache}/     # fuera de public
├── tests/{Unit,Integration,Security}/
├── docs/
└── [documentación raíz]
```

## Matriz de permisos

| Recurso / acción | Odontólogo asignado | Colaborador con permiso | Sin asignación | Administrador técnico |
| --- | --- | --- | --- | --- |
| Datos generales del paciente | Consultar y actualizar según política | Solo si `ver_general` | Denegado | Sin acceso clínico por defecto |
| Historial clínico | Ver sus registros; otros según relación clínica | Solo `ver_historial` | Denegado | Sin acceso clínico por defecto |
| Crear consulta | Sí, si tiene asignación activa | Solo `agregar_consultas` | Denegado | No |
| Fotografías | Sus archivos; compartidos con permiso | `ver_fotografias` / `agregar_fotografias` | Denegado | No |
| Agenda | Solo agenda propia | No | Denegado | Operación técnica, no contenido |
| Compartir / revocar paciente | Proponer; sujeto a regla de negocio | No | Denegado | No |

Los permisos de colaboración son: `ver_general`, `ver_historial`, `agregar_consultas`, `ver_fotografias` y `agregar_fotografias`. La aprobación, revocación y uso de cada permiso se auditan. El consentimiento clínico no se asume: el intercambio de información quedará desactivado hasta definir la política aplicable.

## Navegación móvil

Tras iniciar sesión, el odontólogo entra a **Mi día**: próximas citas, alertas y accesos rápidos. La barra inferior tendrá: Agenda, Pacientes, Nueva cita y Más. Agenda abre en día y permite cambiar a semana o mes; Pacientes ofrece búsqueda paginada y solo muestra asignados/autorizados. Desde un paciente autorizado se accede a Resumen, Consultas, Fotos y Tratamientos. Las acciones sensibles requieren confirmación y regresan a una pantalla segura sin exponer identificadores en mensajes.

## Dashboard propuesto

En móvil: encabezado con fecha y perfil, tarjeta de siguiente cita, lista cronológica de citas del día, indicadores de pendientes (recordatorios, archivos por procesar) y botones grandes para nueva cita y buscar paciente. En pantalla amplia se agregará una columna lateral de agenda y métricas personales. No se cargarán pacientes ni miniaturas hasta solicitar la sección correspondiente.
