Contexto Delimitado: Aprobaciones
Raíz de Agregado: DocumentType
Módulo: Ums.Domain.Approvals.DocumentType
Estado: Producción
El agregado DocumentType gobierna las clasificaciones, reglas y esquemas de políticas para los documentos subidos por los usuarios (ej., Pasaportes, Documentos de certificación). Declara umbrales críticos (Criticity) y configura acciones proactivas de cumplimiento de seguridad (entidad EnforcementPolicy) para ejecutarse automáticamente cuando un documento obligatorio expira o se elimina. NotificationRule es un Aggregate Root independiente reutilizable para reglas de notificación y solo puede ser referenciado por DocumentType.
- Registrar y clasificar documentos de verificación corporativa.
- Establecer pautas de criticidad (Baja, Media, Alta, Crítica).
- Referenciar reglas de notificación dinámicas sin acoplar el ciclo de vida de
NotificationRuleal catálogo documental. - Definir canales de transmisión de alertas (correo electrónico, SMS, etc.).
- Definir bloqueos automáticos de cumplimiento (ej., Bloqueo de acceso, restricción de perfiles) cuando fallan los elementos críticos de cumplimiento.
DocumentType es la raíz del agregado. Definir acciones de cumplimiento debe realizarse a través de él para aplicar las invariantes. NotificationRule no forma parte de su ciclo de vida y no puede modelarse como entidad hija.
- Cada
DocumentTypedebe poseer unCodeúnico dentro de su espacio de nombres deTenantId. - Unicidad de DaysBefore (INV-DT2): Los umbrales de alerta (
DaysBefore) en lasNotificationRulesreferenciadas deben ser únicos en la lista de reglas asociadas. - Mandatos Críticos (INV-DT1): Si un
DocumentTypese establece enCritical, debe tener exactamente unaEnforcementPolicyactiva definida para garantizar el cumplimiento del sistema. - Política Única (INV-DT3): Solo se permite una
EnforcementPolicyactiva porDocumentType. - Coincidencia de Criticidad (INV-DT4): Los tipos de documentos que no son críticos/altos no pueden aplicar acciones de cumplimiento como
BlockUseroRestrictProfile. - Días Antes Válidos (INV-NR1): En
NotificationRule,DaysBeforedebe ser un número entero positivo estrictamente mayor que cero. - Canales Válidos (INV-NR2): La colección
ChannelsenNotificationRuledebe contener al menos un canal de notificación válido (Email, SMS, WebPortal) y no puede ser nula ni vacía.
| Entidad / VO | Tipo | Propietario | Descripción |
|---|---|---|---|
DocumentTypeId |
Objeto de Valor | Identificador de raíz de agregado | |
DocumentCriticity |
Enumerado | LOW · MEDIUM · HIGH · CRITICAL | |
NotificationRule |
Agregado Raíz | Referencia externa | Define el umbral de advertencia reactivo de expiración |
NotificationRuleId |
Objeto de Valor | Referencia externa | Identificador único de la regla de notificación |
NotificationChannel |
Enumerado | Referencia externa | EMAIL · SMS · IN_APP · WEB_PUSH |
EnforcementPolicy |
Entidad | Propia | Detalla períodos de gracia y bloqueos |
Code |
Objeto de Valor | Entidad Hija | Identificador de tipo de notificación |
AuditValueObject |
Objeto de Valor | Rastrea metadatos de creación y modificación |
| Evento | Desencadenante |
|---|---|
DocumentTypeRegisteredEvent |
Se registra con éxito una nueva categoría de documento |
NotificationRuleConfiguredEvent |
Se configura una regla de pre-alerta de vencimiento |
NotificationRuleRemovedEvent |
Se elimina una regla de pre-alerta |
EnforcementPolicyDefinedEvent |
Se define un bloqueo de cumplimiento |
EnforcementPolicyUpdatedEvent |
Se actualizan los parámetros de cumplimiento |
| Comando | Descripción |
|---|---|
CreateDocumentTypeCommand |
Registrar un nuevo tipo de documento con parámetros por defecto |
ConfigureNotificationRuleCommand |
Configurar un nuevo umbral de alerta y sus canales en el agregado independiente NotificationRule |
RemoveNotificationRuleCommand |
Eliminar una regla de pre-alerta de notificación existente |
DefineEnforcementPolicyCommand |
Añadir una política de cumplimiento de bloqueo o degradación de perfil |
UpdateEnforcementPolicyCommand |
Modificar las acciones o períodos de gracia de una política |
IDocumentTypeRepository— Persiste los esquemas de clasificación.- Acotado estrictamente por
TenantIdpara evitar cruces de configuración entre inquilinos.
DocumentType (Raíz de Agregado)
├── Props: DocumentTypeProps
│ ├── Id: DocumentTypeId
│ ├── TenantId: TenantId
│ ├── Code: Code
│ ├── Name: Name
│ ├── Description: Description
│ ├── Criticity: DocumentCriticity
│ └── Audit: AuditValueObject
└── Hijo (Anulable)
└── EnforcementPolicy
classDiagram
direction LR
class DocumentType {
+Guid Id
+Guid TenantId
+Code Code
+Name Name
+Description Description
+DocumentCriticity Criticity
+EnforcementPolicy EnforcementPolicy
+Create()
+DefineEnforcementPolicy()
}
class DocumentCriticity {
<<enumeration>>
LOW
MEDIUM
HIGH
CRITICAL
}
class EnforcementPolicy {
+Guid Id
+AccessEnforcementAction ActionOnExpiration
+int? GracePeriodDays
}
DocumentType "1" *-- "1" DocumentCriticity
DocumentType "1" *-- "0..1" EnforcementPolicy
sequenceDiagram
participant C as AdministradorInquilino
participant H as DefinePolicyHandler
participant R as IDocumentTypeRepository
participant D as DocumentType (AR)
C->>H: DefineEnforcementPolicyCommand(docTypeId, action, graceDays)
H->>R: GetById(docTypeId)
R-->>H: DocumentType (AR)
H->>D: DefineEnforcementPolicy(action, graceDays, actorId)
D->>D: Validar INV-DT4 (restricciones no críticas)
D->>D: Validar INV-DT3 (límite de política única)
D->>D: Levantar EnforcementPolicyDefinedEvent
H->>R: Save(docType)
R-->>H: ok
H-->>C: ok
erDiagram
TENANT ||--o{ DOCUMENT_TYPE : "configura"
DOCUMENT_TYPE ||--o{ NOTIFICATION_RULE : "define"
DOCUMENT_TYPE ||--o| ENFORCEMENT_POLICY : "restringe"
DOCUMENT_TYPE {
uniqueidentifier DocumentTypeId PK
uniqueidentifier TenantId FK
nvarchar Code "Único por TenantId"
nvarchar Name
nvarchar Description
nvarchar Criticity "LOW-MEDIUM-HIGH-CRITICAL"
datetime2 UpdatedAt
uniqueidentifier UpdatedBy
}
NOTIFICATION_RULE {
uniqueidentifier RuleId PK
uniqueidentifier DocumentTypeId FK
int DaysBefore "Único por DocumentTypeId"
nvarchar ChannelsJson "Matriz serializada de canales"
nvarchar Code
nvarchar Description
}
ENFORCEMENT_POLICY {
uniqueidentifier PolicyId PK
uniqueidentifier DocumentTypeId FK
nvarchar ActionOnExpiration "BlockUser-RestrictProfile-Notify"
int GracePeriodDays "Nullable"
}
- Los esquemas clasificados están particionados estrictamente por
TenantId. Todas las consultas de enrutamiento de verificación imponen límites de aislamiento. NotificationRulees un Aggregate Root independiente y conserva su propio ciclo de vida.
- Aguas Arriba: Hereda las reglas de contexto de
Identidad(validando registros de inquilinos). - Aguas Abajo: Consultado por
UserDocumentpara verificar los umbrales de alerta, y porAccessEnforcementPolicydurante los pases de verificación de cumplimiento. Las alertas configuradas a través deNotificationRuleson procesadas por ejecutores en segundo plano para notificar a los usuarios.
CreateDocumentTypeCommand-> Entradas:TenantId, Code, Name, Description, Criticity-> Retorna:GuidConfigureNotificationRuleCommand-> Entradas:NotificationRuleId, DaysBefore, Channels, Code, Description-> Retorna:voidRemoveNotificationRuleCommand-> Entradas:NotificationRuleId-> Retorna:voidDefineEnforcementPolicyCommand-> Entradas:DocumentTypeId, Action, GracePeriodDays?-> Retorna:void
- Índice: Índice único en
TenantId, Code. EnNotificationRule, índice compuesto enTenantId, Codepara asegurar unicidad. - Transacción: Las actualizaciones de hijos (políticas y entradas de reglas de pre-alerta) se almacenan de forma atómica dentro de la transacción de base de datos del padre
DOCUMENT_TYPE.
- Ajustar la clasificación o reglas críticas: Restringido estrictamente a los roles de
Tenant:Admin. - Cumplimiento: Alterar las reglas de cumplimiento representa un alto impacto de seguridad y desencadena un registro de auditoría de alta gravedad.
- Consolidar
DocumentTypecomo catálogo yNotificationRulecomo agregado independiente protege los límites del dominio contra restricciones divididas. - Almacenar los canales de comunicación permitidos como una matriz serializada (
ChannelsJson) garantiza la flexibilidad sin sobrecargar de consultas complejas.