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.
NotificationRule al catálogo documental.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.
DocumentType debe poseer un Code único dentro de su espacio de nombres de TenantId.DaysBefore) en las NotificationRules referenciadas deben ser únicos en la lista de reglas asociadas.DocumentType se establece en Critical, debe tener exactamente una EnforcementPolicy activa definida para garantizar el cumplimiento del sistema.EnforcementPolicy activa por DocumentType.BlockUser o RestrictProfile.NotificationRule, DaysBefore debe ser un número entero positivo estrictamente mayor que cero.Channels en NotificationRule debe 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.TenantId para 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"
}
TenantId. Todas las consultas de enrutamiento de verificación imponen límites de aislamiento.NotificationRule es un Aggregate Root independiente y conserva su propio ciclo de vida.Identidad (validando registros de inquilinos).UserDocument para verificar los umbrales de alerta, y por AccessEnforcementPolicy durante los pases de verificación de cumplimiento. Las alertas configuradas a través de NotificationRule son 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: voidTenantId, Code. En NotificationRule, índice compuesto en TenantId, Code para asegurar unicidad.DOCUMENT_TYPE.Tenant:Admin.DocumentType como catálogo y NotificationRule como agregado independiente protege los límites del dominio contra restricciones divididas.ChannelsJson) garantiza la flexibilidad sin sobrecargar de consultas complejas.