import assert from 'node:assert/strict'; import test from 'node:test'; import { analyzeImportWorkbook, detectImportProfile } from '../../src/asset-imports/asset-import-profiles'; import type { ParsedWorkbook } from '../../src/asset-imports/asset-import-parser'; function workbook(rows: string[][], name = 'Inventario'): ParsedWorkbook { return { kind: 'XLSX', sheets: [{ name, rows }] }; } test('D5.3.5 detects the Mendoza inventory layout and preserves source semantics', () => { const input = workbook([ ['Item','Area/ Yacimiento','Instalacion','Sub instalacion','Equipo','Denominación del equipo','Ubicación del equipo o instalación','N° ID/ Inventario','Cantidad','Especificaciones técnicas','Estado (en servicio/ fuera de servicio)'], ['1','REFUGIO TUPUNGATO','TUP-PIAS','ZONA BOMBAS PIAS','Bomba Centrífuga','Clase: BBA; Tipo: CEN','N/A','BBA-050','1','Fabricante; GOULD; Modelo: 3196','NO'], ]); const detection = detectImportProfile(input); assert.equal(detection.profileCode, 'MENDOZA_INVENTORY_V1'); const analysis = analyzeImportWorkbook(input); assert.equal(analysis.summary.totalRows, 1); assert.equal(analysis.rows[0]?.normalized.areaOrField, 'REFUGIO TUPUNGATO'); assert.equal(analysis.rows[0]?.normalized.inventoryId, 'BBA-050'); assert.equal(analysis.rows[0]?.normalized.sourceClass, 'BBA'); assert.equal(analysis.rows[0]?.normalized.sourceSubtype, 'CEN'); assert.equal(analysis.rows[0]?.normalized.manufacturer, 'GOULD'); assert.equal(analysis.rows[0]?.normalized.model, '3196'); assert.equal(analysis.rows[0]?.normalized.sourceStatus, 'NO'); assert.ok(analysis.rows[0]?.issues.includes('SOURCE_STATUS_REQUIRES_MAPPING')); }); test('D5.3.5 treats grouped quantity and repeated inventory IDs as review signals', () => { const input = workbook([ ['Item','Area/ Yacimiento','Instalacion','Sub instalacion','Equipo','Denominación del equipo','Ubicación del equipo o instalación','N° ID/ Inventario','Cantidad','Especificaciones técnicas','Estado'], ['1','Loma de La Mina','PTC','Playa Tanques','Bomba','','Pozo 1','MEX000062','2','','en servicio'], ['2','Loma de La Mina','PTC','Playa Tanques','Bomba','','Pozo 2','MEX000062','1','','fuera de servicio'], ]); const analysis = analyzeImportWorkbook(input); assert.equal(analysis.summary.totalRows, 2); assert.ok(analysis.rows[0]?.issues.includes('GROUPED_QUANTITY')); assert.ok(analysis.rows.every((row) => row.issues.includes('INVENTORY_ID_MULTIPLE_LOCATIONS'))); assert.equal(analysis.summary.conflictRows, 2); }); test('D5.3.5 detects the Mendoza Yacimiento-Area reference table separately', () => { const input = workbook([ ['Yacimiento','Área','Departamento','Tipo Concesión','Operadora'], ['Cañada Dura','Vizcacheras','San Carlos','Explotación','Petróleos Sudamericanos Energy S.A.'], ], 'Tabla yacimientos'); const analysis = analyzeImportWorkbook(input); assert.equal(analysis.detection.profileCode, 'MENDOZA_YACIMIENTOS_V1'); assert.equal(analysis.rows[0]?.normalized.field, 'Cañada Dura'); assert.equal(analysis.rows[0]?.normalized.area, 'Vizcacheras'); assert.equal(analysis.rows[0]?.normalized.rightType, 'Explotación'); assert.equal(analysis.rows[0]?.normalized.operator, 'Petróleos Sudamericanos Energy S.A.'); });