Módulo de Laboratorio

Gestión integral del laboratorio de reproducción asistida para MyFertPlan. Desde el paquete comercial hasta la mesa del embriólogo, desde el cultivo embrionario hasta la facturación al paciente.

Basado en Contratos 11 Flujos de Trabajo Aislamiento por Clínica 3 Puertas de Seguridad Despliegue en 5 Fases
11
Tipos de flujo
13
Tipos de bloque
14
Invariantes
20
Features totales
70%
Fase 1+2 completada

1. Vista General

El Módulo de Laboratorio gestiona todo lo que ocurre dentro del laboratorio de una clínica de fertilidad. Es impulsado por contratos: el tipo de tratamiento que firma el paciente determina automáticamente qué flujos de trabajo, bloques, formularios y entidades biológicas se crean y rastrean.

Impulsado por Contratos

El paciente firma un Contrato de Tratamiento seleccionando servicios del catálogo de la clínica. Cada servicio se mapea a un tipo de flujo clínico y determina automáticamente la estructura del caso de laboratorio.

Casos y Bloques de Lab

Cada servicio contratado genera un Caso de Lab — un agregado a nivel de ciclo que contiene bloques de flujo ordenados (estimulación, punción, fecundación, cultivo, transferencia, etc.).

Entidades Biológicas

Rastrea muestras de semen, cohortes de ovocitos, ovocitos individuales, embriones y unidades de crioalmacenamiento con trazabilidad completa (codificación SEC), máquinas de estado y guardas de elegibilidad para congelación.

Puertas de Seguridad

Tres puertas de cumplimiento: Testificación (prevención de mezclas), Consentimiento (autorización legal para disposición), y Evento Adverso (biovigilancia).

Multi-Tenant por Clínica

Cada entidad está aislada por clínica. Las definiciones de tratamiento a nivel de grupo permiten compartir paquetes entre clínicas de una misma red. Imposible filtración de datos entre clínicas.

Integración con Facturación

Los Cargos al Paciente se congelan al firmar el contrato (precio inmutable). Un puerto PaymentProvider soporta pagos manuales ahora y Stripe después, sin cambios en el dominio.

2. La Columna Vertebral — Arco Completo

El recorrido completo desde el paquete comercial hasta el resultado clínico del paciente. Este es el flujo de datos central que conecta todas las entidades del módulo.

Definición de Tratamiento (Catálogo) Paquete comercial sobre un tipo de flujo clínico. Precio, garantía, técnicas incluidas. Contrato de Tratamiento Acuerdo firmado. 1..N Servicios Contratados, cada uno con precio y garantía inmutables. Plan (enlace opcional) Medicación y seguimiento. Independiente. Caso de Laboratorio (Ciclo) Bloques, disposición, material biológico. Cargo y Pago Precio inmutable. Manual ahora, Stripe después. Material Biológico y Resultados Muestras de semen, cohortes de ovocitos, ovocitos, embriones (gradación, PGT), crioalmacenamiento. MuestraSemen CohorteOvocito Ovocito Embrión CrioUnidad Seguimiento de Embarazo (Fase 2+) Beta-hCG, embarazo clínico, nacido vivo. Resuelve garantía. Puertas de Seguridad Testificación Consentimiento Evento Adverso Regulación EU SoHO Ley 14/2006

3. Flujos de Trabajo y Reglas de Bloques

El módulo define 11 tipos de flujo de trabajo canónicos, cada uno con bloques requeridos y condicionales. Una Definición de Tratamiento mapea exactamente a un tipo de flujo. Los bloques condicionales se activan en tiempo de ejecución por decisiones de disposición o señales de resultado.

FIV Gametos Propios

ivf_own_gametes

Ciclo completo de FIV/ICSI con los óvulos propios de la paciente y semen de la pareja/donante. Es el flujo de trabajo más completo.

Estimulación Requerido
Punción Requerido
Recogida Semen Requerido
Fecundación Requerido
Cultivo Embrionario Requerido
Gradación Blastocisto Requerido
Biopsia Embrionaria Si PGT
Transferencia Si fresco
Criopreservación Si congelar
Parámetro configurable: transferDay — día 3 o día 5 (por defecto: 5)

FIV Ovocitos Donados (Receptora)

ivf_donor_oocytes_recipient

Ciclo de receptora con ovocitos donados. Sin estimulación ni punción (la donante los aporta por separado). Anonimato: ACTIVADO.

Recogida SemenRequerido
FecundaciónRequerido
CultivoRequerido
GradaciónRequerido
BiopsiaSi PGT
TransferenciaSi fresco
CriopreservaciónSi congelar

FIV Recíproca (ROPA)

reciprocal_ivf_ropa

Ambas miembros de la pareja son madres intencionadas. Una aporta los óvulos, la otra gesta. Anonimato: DESACTIVADO, consentimiento dual requerido.

EstimulaciónRequerido
PunciónRequerido
FecundaciónRequerido
CultivoRequerido
GradaciónRequerido
TransferenciaSi fresco
CriopreservaciónSi congelar

Los 11 Tipos de Flujo de Trabajo

Tipo de Flujo Categoría Bloques Requeridos Condicionales Flags
ivf_own_gametes FIV Fresca Estimulación, Punción, Recogida Semen, Fecundación, Cultivo, Gradación Biopsia, Transferencia, Criopreservación transferDay: 3|5
ivf_donor_oocytes_recipient FIV Fresca Recogida Semen, Fecundación, Cultivo, Gradación Biopsia, Transferencia, Criopreservación Anonimato ON
oocyte_donor_cycle Ciclo Donante Estimulación, Punción Anonimato ON
oocyte_fertility_preservation Preservación Fertilidad Estimulación, Punción, Criopreservación Ovocitos
frozen_embryo_transfer Transfer. Embrión Congelado Descongelación Transferencia, Criopreservación transferDay: 3|5
intrauterine_insemination Inseminación Recogida Semen, Análisis Semen, Inseminación spermSource: pareja|donante
semen_analysis Servicio Semen Recogida Semen, Análisis Semen
semen_freezing Servicio Semen Recogida Semen, Análisis Semen, Congelación Semen
reciprocal_ivf_ropa FIV Fresca Estimulación, Punción, Fecundación, Cultivo, Gradación Biopsia, Transferencia, Criopreservación Consentimiento dual
embryo_donation_recipient Transfer. Embrión Congelado Descongelación Transferencia, Criopreservación Anonimato ON
double_donation_ivf FIV Fresca Recogida Semen, Fecundación, Cultivo, Gradación Biopsia, Transferencia, Criopreservación 2 cadenas de donante
Activación Dinámica de Bloques Condicionales Los bloques condicionales no se crean por adelantado. Se activan en tiempo de ejecución cuando se decide la disposición (ej.: transferencia_fresca activa el bloque de Transferencia Embrionaria, congelar_todo activa el bloque de Criopreservación) o cuando una señal de resultado se dispara (ej.: PGT solicitado activa el bloque de Biopsia).

4. Ciclo de Vida del Caso de Lab

Cada Caso de Lab sigue una máquina de estados desde su creación hasta su finalización. Los bloques dentro del caso siguen su propio ciclo de vida independiente.

Máquina de Estados del Caso de Lab

Planificado Creado desde contrato
Activo Trabajo en progreso
Completado Todos los bloques listos (terminal)
En Espera Pausado temporalmente
Activo Reanudar
Cancelado Terminal, con motivo

Transiciones: planificado → activo | cancelado  •  activo → completado | cancelado | en_espera  •  en_espera → activo | cancelado  •  completado y cancelado son terminales

Máquina de Estados del Bloque

Planificado
Activo
Completado

Cualquier bloque no terminal también puede ser cancelado con un motivo estructurado.

Máquina de Estados del Embrión

En desarrollo
Blastocisto
Transferido

También: detenido (terminal), criopreservado, descongelado, descartado. Congelar requiere freezeEligible = true.

Línea Temporal Típica del Ciclo

Contrato Creado Paciente selecciona servicios
Caso Lab Generado Bloques instanciados
Embriólogo Trabaja Completa bloques + formularios
Decisión de Disposición Fresco / Congelar / PGT
Caso Completado O cancelado con motivo

5. Lógica de Negocio y Diseño por Contratos

Cómo la aplicación decide qué formularios, bloques y flujos de trabajo se necesitan para cada paciente.

Arquitectura de Tres Capas

Capa 1: Definiciones de Flujo

Configuración estática en código. 11 tipos canónicos con reglas de bloques fijas, transiciones, parámetros acotados y taxonomías de cancelación. Las clínicas NO pueden modificar esta capa.

Capa 2: Definiciones de Tratamiento

Paquetes comerciales por clínica o grupo. Cada uno referencia un tipo de flujo y ajusta parámetros dentro de límites (ej.: día de transferencia 3 vs 5). Define precio y garantía. Configurable por la clínica dentro de los límites.

Capa 3: Contratos de Tratamiento

Acuerdos firmados por paciente. Cada línea de servicio toma una foto inmutable del paquete (precio + garantía). Genera Casos de Lab mediante una fábrica idempotente. Específico del paciente, aislado por clínica.

Cómo los Contratos Crean Casos de Lab

  1. La clínica publica paquetes — Definiciones de Tratamiento como "FIV Básico", "FIV Plus" (con ICSI + time-lapse), "Seminograma", etc.
  2. El personal crea un contrato — Mediante el asistente UI: seleccionar paciente → seleccionar 1+ servicios del catálogo → enviar. El contrato comienza en estado borrador.
  3. Garantía y precio se congelan — Al crear el contrato, el precio actual y los términos de garantía de la Definición de Tratamiento se copian profundamente al Servicio Contratado. Los cambios futuros en el catálogo nunca afectan a este contrato.
  4. La fábrica de Casos de Lab se ejecuta — Para cada Servicio Contratado, createOrAssociateFromContract() resuelve la Definición de Tratamiento, obtiene su definición de flujo, valida parámetros y crea un Caso de Lab con los bloques requeridos en estado planificado.
  5. Idempotencia — La fábrica es idempotente: un Caso de Lab por (clínica, contrato, servicio). Las llamadas duplicadas devuelven el caso existente sin efectos secundarios.

Disposición — Decisión Fresco vs. Congelado

Cada Caso de Lab tiene una disposición (la decisión fresco/congelado) que comienza como sin_decidir y se resuelve en tiempo de ejecución:

Sin Decidir

Estado inicial. No se ha tomado decisión aún.

Transferencia Fresca

El embrión se transferirá en fresco. Activa bloque de Transferencia.

Congelar Todo

Todos los embriones viables se congelan. Activa bloque de Criopreservación.

Congelar para PGT

Congelar para test genético. Activa Criopreservación + Biopsia.

Fresco + Congelar Sobrantes

Transferir el mejor + congelar el resto. Ambos bloques activos.

Sin Embriones Viables

No quedan embriones utilizables. Estado terminal válido.

Los cambios de disposición se registran con changedReason, decidedBy y decidedAt para auditoría completa.

Cancelación y Atrición

Cancelación de Bloque

Cualquier bloque no terminal puede cancelarse con un motivo estructurado de la taxonomía del flujo. Ejemplos: sin_respuesta_a_estimulación, ovulación_prematura, síndrome_folículo_vacío, petición_paciente.

Cancelación de Caso

Cancelar un caso se propaga a todos los bloques no terminales (escritura atómica única). Los sellos a nivel de bloque usan el motivo sintético cancelación_caso. No se escriben ni eliminan entidades biológicas en ninguna ruta de cancelación.

6. Modelo de Datos y Mapa de Entidades

Todas las colecciones, subdocumentos embebidos y sus relaciones. Cada entidad está aislada por clínica.

Mapa Visual de Relaciones

DefiniciónTratamiento
referenciada por
ContratoTratamiento
contiene 1..N
ServicioContratado
genera (fábrica idempotente)
CasoLab (agregado)
contiene
BloqueFlujo[]
Disposición
Relaciones[]
material biológico
MuestraSemen
CohorteOvocito
Ovocito
Embrión
CrioUnidad
 
EventoTestificación
Consentimiento
EventoAdverso
CargoPaciente
Pago
Entidad Tipo Propósito Campos Clave
TreatmentDefinition Colección Paquete comercial sobre un tipo de flujo scope, workflowType, parameters, pricing, guarantee
TreatmentContract Colección Acuerdo firmado del paciente status (borrador/activo/completado/cancelado), patientId, contractedServices[]
ContractedService Embebido Línea de servicio dentro de un contrato workflowType, treatmentDefinitionId, guarantee (foto), pricingSnapshot
LabCase Colección Agregado del ciclo de laboratorio workflowType, status, blocks[], disposition, relationships[]
LabWorkflowBlock Embebido Paso del flujo dentro de un caso blockType, requirement, status, outcome (tipado), witnessEventId
SemenSample Colección Ciclo de vida del semen + análisis source, state, analysis, preparation, coding
OocyteCohort Colección Agregado de cohorte de punción retrieval, denudationCounts (MII/MI/PI/ANOR/DEG/ROTO), coding
Oocyte Colección Ovocito individual cohortId, maturity, fertilizationOutcome (2pn/0pn/1pn/3pn/degenerado)
Embryo Colección Seguimiento del ciclo de vida embrionario state (7 estados incl. detenido), dailyGrading d2-d6, pgtResult, freezeEligible
CryostorageUnit Colección Inventario de almacenamiento físico tank, canister, petal, materialType, capacity
WitnessEvent Colección Prevención de mezclas (solo escritura) method, result (coincidencia/discrepancia), performedBy, witnessedBy
Consent Colección Puerta de consentimiento legal subjectType, consentType, dispositionScope[], status
LabAdverseEvent Colección Reporte de biovigilancia (solo escritura) type (mezcla/pérdida_muestra/...), severity, reportedToAuthority
PatientCharge Colección Registro de facturación amountDueMinor, currency, guaranteeSnapshot, status
Payment Colección Intento de pago patientChargeId, provider, externalRef, amountMinor
Codificación Biológica (SEC) Cada entidad biológica (SemenSample, OocyteCohort, Oocyte, Embryo, CryostorageUnit) porta un subdocumento BiologicalCoding con un internalCode obligatorio (ID de trazabilidad de la clínica) y secuencias sec opcionales (Código Europeo Único). Los valores SEC son campos de referencia — nunca claves primarias.

7. Arquitectura Técnica

El módulo está construido con Next.js App Router (rutas API), modelos Mongoose/MongoDB y componentes React con MUI. La librería shared-core contiene toda la lógica de dominio, tipos y modelos.

Rutas API

Método Ruta Propósito
GET /api/lab/contracts/catalog Definiciones activas (clínica + grupo)
POST /api/lab/contracts Crear contrato borrador
GET /api/lab/contracts Listar contratos (por clínica)
GET /api/lab/cases Listar casos de lab (por clínica)
POST /api/lab/cases/[id]/blocks/[blockType]/complete Completar bloque + resultado
POST /api/lab/cases/[id]/blocks/[blockType]/cancel Cancelar un bloque
POST /api/lab/cases/[id]/cancel Cancelar caso completo

Componentes React y Páginas

Componente Propósito
/app/lab/page.tsx Página principal lab (server, con auth)
/app/lab/contracts/new/page.tsx Página de creación de contrato
LabPageClient Dashboard: tablas de contratos + casos
LabCasesList Tabla de casos de lab (solo lectura)
ContractCreateWizard Asistente 2 pasos: paciente → servicios
PatientAutocomplete Buscador de pacientes (por clínica)

Helpers de Dominio (shared-core)

Archivo Propósito
workflowDefinitions.ts Las 11 definiciones de flujo (bloques, transiciones, parámetros, taxonomías de cancelación)
createOrAssociateFromContract.ts Fábrica idempotente de LabCase desde contrato + servicio
completeBlock.ts Completar bloque: validación, puerta de testificación, escritura de entidades, sello de caso
cancelBlock.ts Cancelación de bloque con validación de taxonomía
cancelLabCase.ts Cancelación de caso con cascada a bloques no terminales
blockOutcomeValidators.ts Validación tipada de resultado por tipo de bloque (aserción PHI, checks de esquema)
assertMaterialBlockWitnessed.ts Guarda de puerta de testificación para bloques de manejo de material
assertConsented.ts Guarda de puerta de consentimiento para acciones controladas
recordWitnessEvent.ts Registro de evento de testificación (solo escritura) + evento adverso automático
resolveTreatmentDefinition.ts Resolución de definición: clínica primero, luego grupo
snapshotContractedService.ts Copia profunda de garantía + precio al firmar contrato
validateLabCaseTransition.ts Validación de transición de estado
validateTreatmentParameters.ts Validación de límites de parámetros
assertEmbryoFreezeEligible.ts Guarda de elegibilidad para congelación

Permisos RBAC

lab:case:read

Ver casos y contratos

lab:case:create

Crear contratos, ver catálogo

lab:case:update

Completar/cancelar bloques

lab:case:validate

Futuro: validar casos

lab:inventory:manage

Futuro: crioalmacenamiento

lab:donor:identity

Des-anonimización (restringido)

Doble capa de seguridad: Motor RBAC (verificación de permiso) + middleware HTTP (assertLabModuleEnabled). Feature flag: Clinic.labModule: boolean controla todas las rutas /api/lab/*.

8. Cumplimiento Normativo y Puertas de Seguridad

Tres puertas de cumplimiento implementan los requisitos de la Regulación EU SoHO y la Ley española 14/2006. Son invariantes no negociables que no pueden ser omitidas por ninguna ruta de código.

Puerta de Testificación

10 tipos de bloque de manejo de material requieren un EventoTestificación con result: match antes de completarse.

  • Punción, Recogida Semen, Fecundación
  • Biopsia Embrionaria, Transferencia, Criopreservación
  • Criopreservación Ovocitos, Descongelación, Inseminación
  • Congelación de Semen

Discrepancia auto-crea un LabAdverseEvent (tipo: mezcla, gravedad: seria).

Métodos: manual_second_person o electronic (adaptador RI Witness).

Puerta de Consentimiento

5 acciones controladas requieren un Consentimiento activo y no expirado:

  • descarte_embrión → consentimiento: disposición_embrión, alcance: cese_conservación
  • donar_embrión → consentimiento: disposición_embrión, alcance: donación_a_otros
  • descongelar_para_transferencia → consentimiento: disposición_embrión, alcance: uso_propio
  • asignación_donante → consentimiento: donación
  • tratamiento → consentimiento: tratamiento

ROPA: requiere consentimiento dual (ambas miembros de la pareja).

Reporte de Eventos Adversos

7 tipos de evento con reporte de biovigilancia:

  • Mezcla (automático por discrepancia en testificación)
  • Pérdida de muestra, Contaminación
  • Fallo de almacenamiento, Etiquetado erróneo
  • Fallo de equipamiento, Otro

Gravedad: menor (interno) o seria (SARE — reportable a la autoridad). Registros solo escritura; transiciones de estado para investigación/cierre en Fase 2.

14 Invariantes No Negociables

1
Aislamiento por clínica — cada consulta filtra por clinicId de sesión
2
Puerta de testificación — bloques de material necesitan WitnessEvent(result:match)
3
Puerta de consentimiento — disposición/asignación/descongelación bloqueada sin consentimiento
4
Anonimato de donante — identidad tras encriptación QE + permiso separado
5
Sin duplicación de PHI — hidratar desde Patient; solo guardar ObjectId refs
6
Disciplina monetaria — unidades menores enteras + ISO 4217, sin decimales flotantes
7
Fotos inmutables — precio + garantía congelados al firmar el contrato
8
IDs externos nunca PK — VREPRO, Stripe, SEC son solo referencia
9
Auditoría solo escritura — eventos de testificación y eventos adversos son inmutables
10
Configurable pero acotado — los paquetes no pueden eliminar bloques requeridos ni puertas
11
Doble capa de seguridad — motor RBAC + middleware HTTP
12
Cancelación solo escritura — no se modifican entidades biológicas en cancelación
13
Embrión detenido es terminal — ningún bloque posterior puede apuntarle
14
Preflight-then-write — todo o nada para operaciones multi-registro

9. Estado de Implementación

Progreso por fases. El módulo sigue Desarrollo Guiado por Especificaciones (SDD) con puertas de revisión Codex antes de la implementación.

10/10
Fase 1
Fundamentos — Completa
4/6
Fase 2
Flujos Principales — 67%
0/?
Fase 3
UI Lab — Pendiente
0/4
Fase 4
Integraciones — Pendiente
0/?
Fase 5
Registro Nacional — Pendiente

Detalle por Feature

Feature Fase Estado Descripción
lab-foundation-flag-and-rbac Fase 1 Hecho Flag labModule + permisos RBAC lab + doble capa
lab-workflow-definitions Fase 1 Hecho 11 tipos de flujo con bloques, transiciones, parámetros, taxonomías de cancelación
treatment-definition-catalog Fase 1 Hecho Modelo TreatmentDefinition con scope clínica/grupo, pricing, validación
treatment-contract-model Fase 1 Hecho TreatmentContract + ContractedService con máquina de estados, foto de garantía
treatment-contract-create Fase 1 Hecho Asistente UI + API de escritura para creación de contratos borrador
lab-case-model-and-factory Fase 1 Hecho Agregado LabCase + fábrica idempotente desde contrato
witness-event-gate Fase 1 Hecho Colección WitnessEvent + puerta en bloques de manejo de material
consent-gate Fase 1 Hecho Modelo Consent + guarda de puerta para disposición/asignación/descongelación
plan-labcase-link Fase 1 Hecho Enlace opcional Plan ↔ LabCase, estados independientes
patient-charge-payment-domain Fase 1 Hecho PatientCharge + Payment + proveedor manual + foto de precio
Fase 1 Completa — 10/10 features hechos
lab-biological-entities Fase 2 Hecho SemenSample, OocyteCohort, Oocyte, Embryo, CryostorageUnit + máquinas de estado
lab-blocks-with-witnessing Fase 2 Hecho Completar bloques con resultados tipados + enforcement de testificación
lab-cancellation-and-attrition Fase 2 Hecho Cancelación bloque/caso + resultados de atrición + estado embrión detenido
lab-contract-group-scoped-catalog Fase 2 Hecho Catálogo TreatmentDefinition con scope de grupo + validación POST
lab-dynamic-disposition Fase 2 Spec Lista Disposición (planificada/real), embryoDestination, activación condicional de bloques
lab-adverse-event-biovigilance Fase 2 Pendiente Reporte de eventos adversos + auto-creación por discrepancia
Fase 2 — 4/6 hechos, 1 spec lista, 1 pendiente
stripe-payment-provider Fase 4 Pendiente Stripe PaymentProvider + Connect + webhooks + reconciliación
patient-app-payments-and-followup Fase 4 Pendiente UI de pagos en app del paciente + vistas de seguimiento
lab-calendar-emr-document-linking Fase 4 Pendiente Bloques de lab enlazados a citas + resúmenes EMR
vrepro-lab-adapter Fase 4 Pendiente Adaptador de sincronización lab VREPRO vía LabExternalSyncState

Lo que está Implementado

  • Las 11 definiciones de flujo con reglas de bloques completas
  • Catálogo TreatmentDefinition (scope clínica + grupo)
  • Asistente UI de creación de contratos
  • Agregado LabCase + fábrica idempotente
  • Página de lista de casos + toggle de módulo en admin
  • Los 6 modelos de entidades biológicas con máquinas de estado
  • 10 validadores tipados de resultado de bloque
  • Capa de dominio de completar bloques con escritores de entidades
  • Cancelación de bloque + caso con validación de taxonomía
  • Puerta de testificación (WitnessEvent solo escritura)
  • Puerta de consentimiento (5 acciones controladas)
  • PatientCharge + Payment + proveedor manual
  • Enlace opcional Plan ↔ LabCase
  • Set completo de permisos RBAC
  • Stubs de codificación biológica SEC

Lo que Falta por Construir

  • Páginas de detalle del caso de lab (no hay vista /lab/cases/[id])
  • Formularios de completar bloques (API existe, sin UI)
  • UI de cancelación de bloques/casos
  • UI de disposición dinámica + activación condicional
  • UI de reporte de eventos adversos + flujo de investigación
  • Base de datos de donantes (modelos Donor + DonorIdentity)
  • Gestión de inventario de crioalmacenamiento
  • Banking de embriones/ovocitos (metas de acumulación)
  • Seguimiento de embarazo
  • Proveedor de pago Stripe
  • UI de pagos en app del paciente
  • Enlace Calendario/EMR/documentos
  • Adaptador lab VREPRO
  • Reporte SIRHA
  • Páginas admin CRUD de definiciones de tratamiento

10. Riesgos y Decisiones Abiertas

Riesgos conocidos, áreas sin finalizar y supuestos de la implementación actual.

Riesgos Técnicos

  • Sin transacciones MongoDB en Fase 1/2 para completar bloques. La escritura de entidades y luego el sello del LabCase no es atómica — los fallos parciales se detectan con BlockCompletionPartialError pero requieren reconciliación manual.
  • Brecha de UI: las APIs de backend para completar bloques, cancelación y testificación existen pero no tienen UI correspondiente. Los embriólogos no pueden usar estas funciones hasta que se construyan las páginas de detalle.
  • Completar bloques para donación/ROPA diferido: 8 de 11 tipos de flujo no tienen pares de completación soportados aún. Solo ivf_own_gametes, intrauterine_insemination y semen_analysis son completables.
  • Operaciones con scope de grupo limitadas: solo el catálogo TreatmentDefinition usa scope de grupo. El resto de entidades son estrictamente por clínica.

Decisiones Abiertas

  • Sistema de testificación electrónica — Contrato del adaptador RI Witness aún no confirmado (Fase 2)
  • Conteo de ciclos de garantía — ¿Un ciclo de banking-estimulación cancelado consume un ciclo de garantía? (Fase 2/3)
  • Escala de gradación — Escala Gardner vs. configurable por clínica (Fase 2)
  • Modelo Stripe Connect — Cuentas por clínica vs. por grupo (Fase 4)
  • Contrato de reporte SIRHA — Registros de donantes + actividad/resultados (Fase 4)
  • Esquemas de endpoint VREPRO — Aún no confirmados (Fase 4/5)
  • IVA/impuestos + facturación fiscal — Obligaciones Verifactu/SII de España (Fase 5)

Supuestos de Diseño

  • El aislamiento por clínica es suficiente para Fase 1/2; acceso lab con scope de grupo se difiere
  • El Consentimiento es una entidad nativa (no externalizada a Document Studio)
  • La codificación SEC es propiedad de este módulo (stubs ahora, autoridad externa después)
  • Los donantes internos son registros Donor (no Patient + marcador)
  • El proveedor de pago manual es suficiente hasta que se integre Stripe
  • La entidad Plan preexistente se aumenta (no se reemplaza) con enlace lab opcional

Fronteras de Integración

  • Pagos — Puerto PaymentProvider: manual ahora, stripe después (sin cambio de dominio)
  • VREPRO — IDs internos de lab + LabExternalSyncState; adaptador cuando se confirmen endpoints
  • SIRHA — Datos de donante + resultado formateados para registros; adaptador de envío después
  • RI Witness — Frontera de adaptador de testificación electrónica definida
  • CRM — Se une en TreatmentContract; flag contractClosed reemplaza Salesforce legacy