graph TD
%% ==========================================
%% ESTILOS DE TARJETAS Y COMPONENTES
%% ==========================================
classDef header fill:#0f172a,color:#ffffff,stroke:none,font-weight:900,font-size:14px;
classDef sectionHeader fill:#334155,color:#ffffff,stroke:none,font-weight:bold,font-size:12px;
%% Tarjetas por Tipo
classDef cardBase fill:#ffffff,stroke:#cbd5e1,stroke-width:2px,color:#0f172a,font-size:11px;
classDef cardColumn fill:#fefce8,stroke:#eab308,stroke-width:2px,color:#713f12,font-size:17px;
%% Badges de Validadores (Colores por Categoría)
classDef valCondicionados fill:#dbeafe,stroke:#3b82f6,color:#1e40af,font-size:10px,font-weight:bold;
classDef valData fill:#dcfce7,stroke:#22c55e,color:#14532d,font-size:10px,font-weight:bold;
classDef valClave fill:#ffedd5,stroke:#f97316,color:#7c2d12,font-size:10px,font-weight:bold;
classDef valCondicionador fill:#f3e8ff,stroke:#a855f7,color:#581c87,font-size:10px,font-weight:bold;
classDef valAuto fill:#ffe4e6,stroke:#f43f5e,color:#881337,font-size:10px,font-weight:bold;
%% Estilos Catálogo
classDef catUI fill:#1e3a8a,color:#ffffff,stroke:none,font-weight:bold,font-size:12px;
classDef itemUI fill:#dbeafe,stroke:#3b82f6,stroke-width:1px,color:#1e40af,font-size:11px;
classDef catData fill:#065f46,color:#ffffff,stroke:none,font-weight:bold,font-size:12px;
classDef itemData fill:#dcfce7,stroke:#22c55e,stroke-width:1px,color:#14532d,font-size:11px;
classDef catRel fill:#9a3412,color:#ffffff,stroke:none,font-weight:bold,font-size:12px;
classDef itemRel fill:#ffedd5,stroke:#f97316,stroke-width:1px,color:#7c2d12,font-size:11px;
classDef catCond fill:#6b21a8,color:#ffffff,stroke:none,font-weight:bold,font-size:12px;
classDef itemCond fill:#f3e8ff,stroke:#a855f7,stroke-width:1px,color:#581c87,font-size:11px;
classDef catCalc fill:#9f1239,color:#ffffff,stroke:none,font-weight:bold,font-size:12px;
classDef itemCalc fill:#ffe4e6,stroke:#f43f5e,stroke-width:1px,color:#881337,font-size:11px;
%% ==========================================
%% PARTE 1: MATRIZ DE INTEGRIDAD Y VALIDADORES
%% ==========================================
subgraph MATRIZ ["MATRIZ DE INTEGRIDAD"]
direction TB
TITLE1[Distribucion de Validadores]:::header
TITLE1 --- OPS
TITLE1 --- CLI
%% ENTIDAD 1: CLIENTES
subgraph OPS [ 👤 TABLA: CLIENTES ]
direction TB
subgraph C_G1 [ 📌 Identificación ]
direction TB
C_Vendedor["📄 Campo: vendedor"]:::cardColumn --- C_Vendedor_V["🟢 V3. Obligatorio
🟠 V8. FK Relacional
🔵 V4. Preset ($CURRENT_USER)
🟣 V10. No-Visible si Vendedor
🟢 V7. Select. ([vendrs]), si Gerencia"]:::valCondicionador
C_Compania["📄 Campo: compania"]:::cardColumn --- C_compania_V["🟢 V3. Obligatorio
🟠 V9. Único
🟠 V8. FK Relacional "]:::valCondicionador
C_Sector["📄 Campo: sector"]:::cardColumn --- C_Sector_V["🟢 V3. Obligatorio
🟠 V9. Único
🟠 V8. FK (una compania, un sector)"]:::valCondicionador
C_Tipo["📄 Campo: cliente_o_prospecto"]:::cardColumn --- C_Tipo_V["🟢 V3. Obligatorio
🟢 V7. Select
🔵 V4. Preset (Prospecto)"]:::valCondicionador
end
subgraph C_G2 [ 💾 Contacto ]
direction TB
C_Nombre["📄 Campo: nombre_cliente"]:::cardColumn --- C_Nombre_V["🟢 V3. Obligatorio
🟠 V9. Único"]:::valData
C_Puesto["📄 Campo: Puesto"]:::cardColumn --- C_Puesto_V["⚪ Sin Validación (Texto Libre)"]:::cardBase
C_Contacto["📄 Campo: Teléfono / Celular / Correo"]:::cardColumn --- C_Contacto_V["🟢 V5. Regex / Máscara"]:::valData
end
C_G1 --> C_G2
end
%% ENTIDAD 2: OPORTUNIDADES
subgraph CLI [ 💼 TABLA: OPORTUNIDADES ]
direction TB
subgraph O_G1 [ 📌 Datos Base y Finanzas ]
direction TB
O_Vendedor["📄 Campo: vendedor"]:::cardColumn --- O_Vendedor_V["🟢 V3. Obligatorio
🔵 V4. Preset ($CURRENT_USER)
🟣 V10. Non-Visible si Vendedor
🟢 V7. Select. ([vendrs]), si Gerencia"]:::valCondicionados
O_Compania["📄 Campo: compania"]:::cardColumn --- O_Compania_V["🟢 V3. Obligatorio
🟢 V7. Select ([companias])
🔴 V12. Trigger CLIENTES/[compania]"]:::valCondicionados
O_Nombre["📄 Campo: nombre_oportunidad"]:::cardBase --- O_Nombre_V["🟢 V3. Obligatorio
🟢 V5. Regex (Max. Caracteres)"]:::valData
O_Area["📄 Campo: area"]:::cardColumn --- O_Area_V["🟢 V3. Obligatorio
🟢 V7. Select"]:::valData
O_Sector["📄 Campo: sector"]:::cardColumn --- O_Sector_V["🟢 V3. Obligatorio
🟣 V10. Visible si hay Compania
🔴 V12. Trigger copia CLIENTES/[sector]"]:::valAuto
O_ClienteProspecto["📄 Campo: cliente_o_prospecto"]:::cardColumn --- O_CliOPros_V["🟢 V3. Obligatorio
🟣 V10. Visible si hay Compania
🔴 V12. Trigger copia CLIENTES/[cliente_o_prospecto]"]:::valAuto
O_Estado["📄 Campo: estado"]:::cardColumn --- O_Estado_V["🟢 V3. Obligatorio
🔵 V4. Preset (Activa) si Vendedor
🔵 V4. Preset (Suspendida) si Gerencia
🟢 V7. Select"]:::valData
O_Fechas["📄 Campo: fecha_ingreso"]:::cardColumn --- O_Fechas_V["🟢 V3. Obligatorio
🔵 V2. Readonly
🔵 V4. Preset NOW() al Crear
🔴 V12. Trigger Timestamp"]:::valAuto
O_Fechas1["📄 Campo: fecha_creacion"]:::cardColumn --- O_Fechas_V:::valAuto
O_Fechas2["📄 Campo: fecha_modificacion"]:::cardColumn --- O_Fechas2_V["🟢 V3. Obligatorio
🟢 V5. Regex / Máscara
🔵 V4. Preset NOW() al Crear y Modificar
🔴 V12. Trigger Timestamp"]:::valData
O_Monto["📄 Campo: valor_usd ➔ valor_crc"]:::cardColumn --- O_Monto_V["🟢 V3. USD o CRC Obligatorio
🟢 V6. Rango > 0
🔴 V12. Cambio Auto-Calculado"]:::valData
O_Notas["📄 Campo: Notas"]:::cardColumn --- O_Notas_V["⚪ Sin Validación (Texto Libre)"]:::cardBase
end
subgraph O_G2 [ 💾 Condicional de Clasificación ]
direction TB
P_Clas["📄 1. clasificacion"]:::cardColumn --- P_Clas_V["🟢 V3. Obligatorio
🟢 V7. Enum (0% a 100%)"]:::valCondicionador
P_Proc["⚡ 2. num_procedimiento"]:::cardColumn --- P_Proc_V["🟣 V10. Visible si Clasificación == 100%"]:::valCondicionador
P_Fact["⚡ 3. num_factura"]:::cardColumn --- P_Fact_V["🟣 V10. Visible si hay Procedimiento"]:::valCondicionador
P_Pag["⚡ 4. factura_pagada"]:::cardColumn --- P_Pag_V["🟣 V10. Visible si hay Factura
🟢 V7. Select (True / False)"]:::valCondicionador
P_Parc["⚡ 5. pago_parcial"]:::cardColumn --- P_PagoP_V["🟣 V10. Visible si hay Factura
🟢 V7. Select (True / False)"]:::valCondicionador
P_Monto["⚡ 6. monto_parcial"]:::cardColumn --- P_MontoP_V["🟣 V10. Visible si hay Pago Parcial
🟢 V6. Rango > 0"]:::valCondicionador
P_Clas --> P_Proc --> P_Fact
P_Fact --> P_Pag
P_Fact --> P_Parc --> P_Monto
end
O_G1 --> O_G2
end
end
%% ==========================================
%% PARTE 2: CATÁLOGO DE VALIDADORES
%% ==========================================
subgraph CATALOGO ["📂 CATÁLOGO DE VALIDADORES DE INTEGRIDAD"]
direction LR
TITLE2[Indicadores de Integridad]:::header
TITLE2 --- C1
TITLE2 --- C2
TITLE2 --- C3
TITLE2 --- C4
TITLE2 --- C5
%% CATEGORÍA 1
subgraph C1 [" 🔵 1. UI Y CONTEXTO DE SESIÓN (Condicionados) " ]
direction TB
V1["V1. Hidden (Oculto)
Existe en la BD pero no se dibuja en la interfaz.
Asignación automática por contexto."]:::itemUI
V2["V2. Readonly (Solo Lectura)
Visible en la pantalla pero bloqueado para edición.
Protege datos estáticos o calculados."]:::itemUI
V4["V4. Preset / Default Value
Inyecta un valor inicial por defecto al crear el registro.
Ej. $CURRENT_USER o marca de tiempo."]:::itemUI
end
%% CATEGORÍA 2
subgraph C2 [" 🟢 2. FORMATO Y CONTROL DE DATOS (Obligatorios) "]
direction TB
V3["V3. Required (Obligatorio)
Bloquea el guardado si el campo está vacío.
Equivale a restricción NOT NULL en BD."]:::itemData
V5["V5. Regex / Máscara
Asegura una sintaxis específica de entrada.
Ej. Formato de correo o teléfono ####-####."]:::itemData
V6["V6. Rango Numérico
Restringe valores dentro de límites válidos.
Ej. Montos estrictamente mayores a 0."]:::itemData
V7["V7. Enum / Select
Desplegable restringido a opciones cerradas.
Garantiza consistencia en el dominio."]:::itemData
end
%% CATEGORÍA 3
subgraph C3 [" 🟠 3. INTEGRIDAD EN BASE DE DATOS (Unicos)" ]
direction TB
V8["V8. FK Relacional Validado
Verifica la existencia del valor en la tabla padre.
Llave foránea para evitar datos huérfanos."]:::itemRel
V9["V9. Unique (Único)
Impide guardar registros duplicados en el sistema.
Ej. Nombre de cliente o número de cédula."]:::itemRel
end
%% CATEGORÍA 4
subgraph C4 [" 🟣 4. LÓGICA DE CASCADA (Condicionadores) " ]
direction TB
V10["V10. Visibilidad Condicional
Mantiene oculto el campo hasta cumplir regla previa.
Optimiza el flujo visual del usuario."]:::itemCond
V11["V11. Requerido Condicional
El campo pasa a ser Required solo si se activa la regla.
Obligatorio bajo condiciones específicas."]:::itemCond
end
%% CATEGORÍA 5
subgraph C5 [" 🔴 5. AUTOMATIZACIÓN Y TRIGGERS (Automaticos) "]
direction TB
V12["V12. Auto-Calculado / Trigger
Valor generado o actualizado por fórmula o backend.
Ej. Tipo de cambio USD a CRC o timestamps."]:::itemCalc
end
end
subgraph USEME ["USO DEL DIAGRAMA"]
direction TB
TITLE0[Uso de Indicadores]:::header
TITLE0 --- CATALOGO
end