Arquitectura, bounded contexts, capas y decisiones. Cómo encaja todo.
┌──────────────────────────────────────────────────────┐
Usuarios HNSM →│ FRONTEND React 19 · TanStack Query · Tailwind v4 │
└────────────────────┬─────────────────────────────────┘
│ HTTPS · JWT
┌────────────────────▼─────────────────────────────────┐
│ API GATEWAY Spring Cloud Gateway · WAF · mTLS │
└─────────────┬──────────────┬─────────────────────────┘
│ │
┌───────────────────────▼──┐ ┌───────▼───────────────────┐
│ CAPA PLATAFORMA (4) │ │ CAPA CLÍNICA (12) │
│ auth · audit · bus · not│ │ identidad · episodios · … │
└───────────────────────┬──┘ └───────┬─────────────────────┘
│ │
┌───────────────────────▼──┐ ┌───────▼───────────────────┐
│ CAPA VIGILANCIA (2) │ │ CAPA ADMINISTRACIÓN (5) │
│ vigilancia-epi · nutric.│ │ rrhh · pres · compras · … │
└───────────────────────┬──┘ └───────┬─────────────────────┘
└──────┬───────┘
┌────────────────────▼─────────────────────────────────┐
│ CAPA INTEROP (2) pasarela-fhir · reportes-sigsa │
└────────────────────┬─────────────────────────────────┘
│
┌──────────────┬───────────┼──────────────┬─────────────┐
▼ ▼ ▼ ▼ ▼
RENAP SICOIN Guatecompras MSPAS-SIGSA IGSS
(CUI WS) (SOAP) (scraping) (FHIR + CSV) (FHIR)
| Contexto | Servicios | Lenguaje ubicuo |
|---|---|---|
| Plataforma | autenticación · auditoría · bus · notificaciones | Usuario · Sesión · Mensaje · Plantilla |
| Identidad | identidad-paciente | Paciente · Identificador · Etnia · Idioma |
| Atención | episodios · expediente-clínico · órdenes-médicas · signos-vitales | Episodio · Nota · Orden · Signo vital |
| Apoyo diagnóstico | laboratorio · imagenologia | Resultado · Estudio · Modalidad |
| Medicación | farmacia · inventario | Prescripción · Dispensación · Lote · Existencia |
| Hospitalario | encamamiento · quirofano · obstetricia · emergencia | Cama · Cirugía · Parto · Triaje |
| Vigilancia | vigilancia-epidemiologica · nutricion | Notificación · Caso · Suplementación |
| Administración | recursos-humanos · presupuesto · compras · facturacion | Plaza · Ejecución · Compra · Factura |
| Interop | pasarela-fhir · reportes-sigsa | Recurso FHIR · Formulario SIGSA |
| ADR | Decisión | Razón |
|---|---|---|
| ADR-01 | Microservicios con database-per-service | Cada subsistema cambia a velocidad distinta · evita acoplamiento de esquema · facilita reuso de servicios maduros |
| ADR-02 | Java 25 LTS + Spring Boot 4 + Loom | Estabilidad de plataforma · ecosistema sólido · concurrencia barata para WebSockets clínicos |
| ADR-03 | React 19 + TanStack Query + Tailwind v4 | Curva conocida · ecosistema maduro · tipografía y accesibilidad listas |
| ADR-04 | PostgreSQL como BD primaria | SQL fuerte · JSONB para campos flexibles · particionado nativo · operacional con DBAs locales |
| ADR-05 | MongoDB para notas clínicas y JSON imágenes | Esquemas heterogéneos por especialidad · búsqueda por texto · fácil append |
| ADR-06 | TimescaleDB para signos vitales | Series de tiempo · compresión nativa · downsampling |
| ADR-07 | Apache Kafka como bus de eventos | Eventos at-least-once · particionado por paciente · retención configurable |
| ADR-08 | Mirth Connect para HL7 v2 | Adaptadores listos · transformaciones gráficas · estándar de facto en hospitales |
| ADR-09 | FHIR R4 para interoperabilidad externa | Estándar internacional · adoptado por MSPAS e IGSS · permite futura integración multinacional |
| ADR-10 | Keycloak para autenticación | OIDC + SAML · LDAP MSPAS · MFA listo · realm por hospital |
| ADR-11 | K3s on-prem (Kubernetes ligero) | Funciona en hardware modesto · menos memoria que K8s clásico · misma API · puede migrarse a cloud sin rewrite |
| ADR-12 | Auditoría WORM con hash encadenado | Cumplimiento HIPAA-style · imposibilidad de reescritura · trazabilidad reconstruible |
| ADR-13 | Observabilidad con Prometheus + Grafana + Loki + Tempo | Stack open source · curva conocida · alertas a WhatsApp |
| ADR-14 | CI/CD con GitHub Actions + ArgoCD | GitOps · pull-based deploy · rollback declarativo |
episodio.abierto, orden.creada, lab.resultado.liberado, parto.cerrado, compra.adjudicada. Particionados por paciente_id o renglón.Idempotency-Key.X-Request-Id y X-User-Id; auditoría escribe el hash de la fila modificada.