Boceto de Validadores de Integridad


            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