En las operaciones de minería de rajo abierto y procesamiento de mineral (equipos de extracción CAEX, palas electromecánicas y molienda SAG), el aprovisionamiento MRO (Maintenance, Repair, and Operations) concentra riesgos críticos de fuga de caja y desabastecimiento operativo.
Esta plataforma integra un backend relacional de auditoría forense en T-SQL conectado a una capa de visualización ejecutiva en Power BI estandarizada bajo norma IBCS para el control de 3-Way Match, precios marco y capital inmovilizado.
- USD 9,87M en Fuga Financiera Directa (Maverick Spend): Compras ejecutadas por fuera de los acuerdos corporativos marco (Master Agreement / MARC).
- USD 3,46M en Capital Inmovilizado (SPEME): Componentes críticos retenidos bajo bloqueo de calidad en pañoles y bodegas operativas, restringiendo el capital de trabajo.
- 69,55% de Cumplimiento 3-Way Match: Exposición operacional severa donde ~30% de las órdenes de compra presentan descalces entre Órdenes (PO), Recepción física (GR) y Factura (IR).
- USD 39,39M de Exposición Global por Inconsistencias: Monto comprometido en transacciones con anomalías de datos, facturas huérfanas o reversas en patio.
- Concentración de Riesgo (Pareto): El 74,5% de toda la fuga económica ($7,35M USD) se concentra en solo 3 componentes: Bomba Hidráulica Liebherr R9800 (
LIEB-BOMB-R9800), Cilindro Hidráulico Pala CAT 7495 (PALA-CYL-CAT7495) y Revestimiento Molino SAG (MOLINO-REV-SAG).
mro-forensic-analytics/
├── SQL/
│ ├── 00_init/ --> Creación de BD y concurrencia no bloqueante (RCSI)
│ ├── 01_ddl_tables/ --> Tablas staging tipadas según diccionario SAP MM (EKKO, EKPO, EKBE, MARD)
│ ├── 02_ingestion/ --> Carga transaccional masiva y validaciones volumétricas
│ ├── 03_views/ --> Neteo MIGO/MIRO, lógica 3-Way Match y anomalías de datos
│ ├── 04_stored_procedures/ --> Procedimiento transaccional ACID con bloques TRY...CATCH para logging
│ ├── 05_indexes/ --> Índices Non-Clustered y Covering Indexes para acelerar lecturas
│ └── 06_tests/ --> Test Harness fiduciario unitario con fixtures en memoria
├── bi/
│ ├── pbix/ --> Archivo maestro Power BI (Mro_mining.pbix)
│ └── dax/ --> Medidas DAX de auditoría documentadas en texto plano
├── docs/
│ ├── SPEC.md --> Especificación técnica y catálogo de reglas de auditoría
│ └── img/ --> Evidencias de planes de ejecución y pruebas unitarias
├── reports/
│ ├── Mro_mining.pdf --> Entregable ejecutivo consolidado de 1 página
│ └── dashboard_preview.png --> Captura del dashboard en alta resolución
└── README.md
graph TD
subgraph SAP_ERP ["1. Ingestión ERP (SAP MM)"]
EKKO["stg.EKKO<br/>(Cabecera de OC)"]
EKPO["stg.EKPO<br/>(Posiciones & Precios MARC)"]
EKBE["stg.EKBE<br/>(Historial MIGO 101/102 & MIRO)"]
MARD["stg.MARD<br/>(Saldos Almacén & SPEME)"]
end
subgraph CORE_SQL ["2. Motor Forense T-SQL (Core Layer)"]
V3WAY["core.v_mro_3waymatch<br/>• Neteo MIGO vs MIRO (shkzg)<br/>• Control Maverick Buying<br/>• Flag Fricción Operacional"]
VFORENSIC["core.v_sap_mm_mro_forensic<br/>• Capital Retenido en Control Calidad"]
VANOMALIES["core.v_mro_data_quality_anomalies.sql<br/>• Facturas sin MIGO<br/>• Descarte lógico (loekz = 'X')"]
end
subgraph AUDIT_LAYER ["3. Trazabilidad & Logs ACID"]
PROC["audit.sp_insert_mro_audit_log"]
TABLE_LOG[("audit.tb_log_anomalias_mro")]
end
subgraph BI_SEMANTIC ["4. Capa Semántica & Consumo (Power BI)"]
MODEL["Modelo Constelación Dimensional<br/>(Dim_Repuesto, Dim_Faena, Dim_Calendario)"]
DAX["Métricas DAX de Exposición Financiera"]
UI["Panel Ejecutivo IBCS<br/>(Executive Slate & Navy Palette)"]
end
EKKO --> V3WAY
EKPO --> V3WAY
EKBE --> V3WAY
EKPO --> VFORENSIC
MARD --> VFORENSIC
V3WAY --> VANOMALIES
VANOMALIES --> PROC
PROC --> TABLE_LOG
V3WAY --> MODEL
VFORENSIC --> MODEL
VANOMALIES --> MODEL
MODEL --> DAX
DAX --> UI
classDef erp fill:#1f2937,stroke:#3b82f6,stroke-width:1px,color:#fff;
classDef core fill:#111827,stroke:#10b981,stroke-width:1px,color:#fff;
classDef audit fill:#31102f,stroke:#ec4899,stroke-width:1px,color:#fff;
classDef bi fill:#3b2a05,stroke:#f59e0b,stroke-width:1px,color:#fff;
class EKKO,EKPO,EKBE,MARD erp;
class V3WAY,VFORENSIC,VANOMALIES core;
class PROC,TABLE_LOG audit;
class MODEL,DAX,UI bi;
Para prevenir falsos positivos provocados por devoluciones o reversas de faena en bodega, las CTEs agregan los apuntes contables evaluando la naturaleza Debe/Haber (shkzg):
- Entrada de Mercancías (
vgabe = 1): Recepción física (101/ CargoS) neta contra anulaciones de patio (102/ AbonoH). - Recepción de Facturas (
vgabe = 2): Facturas (MIRO/ CargoS) netas contra notas de crédito (H). - Flag de Fricción Operacional: Si la transacción requirió reversas pero netea a balance cero, se cataloga como
HISTORIAL_CON_REVERSASpara auditoría de proveedores y almacenes.
El motor clasifica el estado de cada posición evaluando las transacciones bajo la siguiente jerarquía:
SI Cantidad_MIGO = 0 Y Cantidad_MIRO > 0 -> 'FACTURA_SIN_RECEPCION'
SI P.U._MIRO > (P.U._Contrato + 0.01) -> 'DESCALCE_PRECIO_MAVERICK'
SI Cantidad_MIRO > Cantidad_MIGO -> 'DESCALCE_CANTIDAD'
SI Cantidad_MIGO < Cantidad_PO Y MIGO > 0 -> 'ENTREGA_PARCIAL'
EN CUALQUIER OTRO CASO -> 'CONFORME_3WAY'
El modelo semántico consume las vistas optimizadas de SQL Server mediante relaciones de 1 a varios unidireccionales:
Calcula el sobrecosto real pagado por encima del contrato marco pactado:
Fuga Maverick USD =
SUM(core_v_mro_3waymatch[fuga_maverick_usd])
Valorización del inventario paralizado por inspecciones técnicas al costo promedio de contrato:
Capital Inmovilizado USD =
SUM(core_v_sap_mm_mro_forensic[capital_inmovilizado_speme_usd])
Proporción de transacciones de compra conformes sin desviaciones de precio, cantidad ni recepción:
% Cumplimiento 3WayMatch =
DIVIDE(
CALCULATE(
COUNTROWS(core_v_mro_3waymatch),
core_v_mro_3waymatch[estado_3way] = "CONFORME_3WAY"
),
COUNTROWS(core_v_mro_3waymatch),
0
)
Exposición consolidada por riesgos de gobierno de datos, borrados lógicos y facturas sin recepción:
Impacto Anomalias USD =
SUM(core_v_mro_calidad_datos_anomalias[impacto_financiero_usd])
El panel analítico sigue las directrices del International Business Communication Standards (IBCS):
- Paleta Corporativa Executive Slate & Navy: Estructurada en base a Azul Marino Oscuro (
#0F172A) para cabeceras y texto principal, Gris Pizarra (#64748B) para etiquetas secundarias y Gris Suave (#F4F5F7) para el fondo del lienzo. - Uso Semafórico Funcional: Degradado lineal de 3 puntos aplicado a la columna de Fuga Maverick: neutro en blanco (
#FFFFFF), advertencia intermedia en rosa suave (#FECACA) y alerta crítica en rojo estándar (#DC2626), reservando la saturación alta exclusivamente para desvíos presupuestarios severos. - Reducción de Ruido Visual: Tarjetas KPI flotantes con esquinas redondeadas (8 px), sombras suaves y márgenes homogéneos para garantizar legibilidad ejecutiva inmediata.
- Aislamiento Snapshot (RCSI): Base configurada con
READ_COMMITTED_SNAPSHOT ONpara permitir lecturas sin bloqueos de concurrencia durante cargas operativas. - Índices de Cobertura (Covering Indexes):
IX_stg_ekbe_3way_performance: Elimina Key Lookups en las CTEs de agregación MIGO/MIRO sobrestg.EKBE.IX_stg_ekpo_active_lookup: Permite resolver el filtrado de registros borrados (loekz) mediante Index Seek.IX_stg_mard_speme_quality: Acelera la segmentación del inventario bloqueado en calidad (speme).
- Test Harness Fiduciario: Suite unitaria en memoria (
06_tests/01_test_harness_3way_fixtures.sql) con 5 casos de prueba deterministas (Match Conforme, Sobreprecio, Factura Huérfana, Reversa Física y Borrado Lógico) con certificación 100% PASS.
- Clonar el repositorio:
git clone [https://github.com/ObedFermin/MiningMRO_Engine.git](https://github.com/ObedFermin/MiningMRO_Engine.git)
- Ejecutar los scripts SQL en orden secuencial en SQL Server Management Studio (SSMS):
SQL/00_init/01_create_database.sqlSQL/00_init/02_create_schemas.sqlSQL/01_ddl_tables/(tablasstgyaudit)SQL/02_ingestion/01_bulk_insert_sap_data.sqlSQL/03_views/(vistascore)SQL/04_stored_procedures/SQL/05_indexes/
- Certificar el motor ejecutando
SQL/06_tests/01_test_harness_3way_fixtures.sql. - Abrir el archivo
bi/pbix/Mro_mining.pbixen Power BI Desktop, actualizar la conexión a la baseBunker_MROde tu instancia local y explorar el reporte interactivo.


