import { AssetAttributeDataType, AssetTypeOperationalRole, } from '../database/entities'; export interface MasterBootstrapAttributePreset { code: string; name: string; dataType: AssetAttributeDataType; isRequired: boolean; unit: string | null; options: string[] | null; sortOrder: number; } export interface MasterBootstrapTypePreset { code: string; name: string; description: string; canBeRoot: boolean; operationalRole: AssetTypeOperationalRole; allowedParentCodes: string[]; attributes: MasterBootstrapAttributePreset[]; } const text = (code: string, name: string, sortOrder: number, unit: string | null = null): MasterBootstrapAttributePreset => ({ code, name, dataType: AssetAttributeDataType.TEXT, isRequired: false, unit, options: null, sortOrder, }); const number = (code: string, name: string, sortOrder: number, unit: string | null = null): MasterBootstrapAttributePreset => ({ code, name, dataType: AssetAttributeDataType.NUMBER, isRequired: false, unit, options: null, sortOrder, }); const date = (code: string, name: string, sortOrder: number): MasterBootstrapAttributePreset => ({ code, name, dataType: AssetAttributeDataType.DATE, isRequired: false, unit: null, options: null, sortOrder, }); const select = (code: string, name: string, options: string[], sortOrder: number): MasterBootstrapAttributePreset => ({ code, name, dataType: AssetAttributeDataType.SELECT, isRequired: false, unit: null, options, sortOrder, }); export const MASTER_BOOTSTRAP_PRESET_CODE = 'mendoza-hidrocarburos-v2'; export const MASTER_BOOTSTRAP_PRESET_NAME = 'Hidrocarburos · Mendoza'; export const MASTER_BOOTSTRAP_CORE_CODES = [ 'area', 'empresa', 'yacimiento', 'instalacion', 'estacion', 'subestacion', 'pozo', 'equipo', 'ducto', ] as const; export const MASTER_BOOTSTRAP_TYPES: MasterBootstrapTypePreset[] = [ { code: 'area', name: 'Área', description: 'Área hidrocarburífera administrada como ancla territorial. Concesiones, permisos y titulares se registran por separado en la capa legal.', canBeRoot: true, operationalRole: AssetTypeOperationalRole.AREA, allowedParentCodes: [], attributes: [ text('identificacion_oficial', 'Identificación oficial', 10), text('cuenca', 'Cuenca', 20), text('departamento', 'Departamento', 30), ], }, { code: 'empresa', name: 'Organización', description: 'Entidad jurídica u organización administrada (empresa, UTE u otra figura). Su rol como operadora, titular o participante se registra mediante relaciones históricas.', canBeRoot: true, operationalRole: AssetTypeOperationalRole.COMPANY, allowedParentCodes: [], attributes: [ text('cuit', 'CUIT', 10), text('razon_social', 'Razón social', 20), ], }, { code: 'yacimiento', name: 'Yacimiento', description: 'Unidad territorial u operativa dentro de un Área. Es opcional porque la documentación también utiliza el campo combinado Área/Yacimiento.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area'], attributes: [text('identificacion_oficial', 'Identificación oficial', 10)], }, { code: 'estructura_local', name: 'Estructura local (fuente)', description: 'Nodo estructural provisional que conserva la nomenclatura propia de cada operadora o Área/Yacimiento. No implica una clasificación física normalizada por DH hasta su revisión.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion'], attributes: [ text('nivel_fuente', 'Nivel informado por la fuente', 10), text('clasificacion_fuente', 'Clasificación local informada', 20), text('ruta_fuente', 'Ruta / nomenclatura de origen', 30), ], }, { code: 'locacion', name: 'Locación', description: 'Sitio físico dentro de un área o yacimiento que puede agrupar pozos, instalaciones o equipos.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento'], attributes: [], }, { code: 'instalacion', name: 'Instalación de superficie', description: 'Tipo genérico de instalación de proceso, tratamiento, almacenamiento o apoyo. Se conserva como alternativa cuando no exista un tipo técnico más específico.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion'], attributes: [text('tipo_instalacion', 'Tipo de instalación', 10)], }, { code: 'planta', name: 'Planta', description: 'Instalación de superficie administrada como unidad de proceso, tratamiento, entrega o almacenamiento.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion'], attributes: [text('funcion_planta', 'Función / denominación operativa', 10)], }, { code: 'bateria', name: 'Batería', description: 'Batería hidrocarburífera administrada como instalación y contenedor de sistemas/equipos.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion'], attributes: [], }, { code: 'estacion', name: 'Estación', description: 'Estación operativa perteneciente a un área, yacimiento, locación o instalación.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion', 'instalacion', 'planta', 'bateria'], attributes: [], }, { code: 'subestacion', name: 'Subestación', description: 'Subestación o unidad subordinada dentro de una instalación o estación.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion', 'instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'zona_bombas', name: 'Zona de bombas', description: 'Sector o conjunto físico donde se agrupan bombas. Se distingue de cada equipo Bomba individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'sistema_drenaje', name: 'Sistema de drenaje', description: 'Sistema de drenaje de una instalación. Puede contener piletas u otros elementos que requieran identidad propia.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'sistema_electrico_iluminacion', name: 'Sistema eléctrico / iluminación', description: 'Sistema eléctrico y de iluminación administrable cuando requiere historial e inspección propios.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'sistema_defensa_incendios', name: 'Defensa contra incendios', description: 'Sistema de defensa contra incendios, incluyendo red y equipos asociados cuando corresponda.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'cargadero_descargadero', name: 'Cargadero / descargadero de camiones', description: 'Instalación utilizada para carga o descarga de camiones, inspeccionable como unidad.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion', 'instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'pileta_api', name: 'Pileta API', description: 'Pileta API identificable dentro de una instalación o sistema de drenaje.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['sistema_drenaje', 'instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'pozo', name: 'Pozo', description: 'Pozo hidrocarburífero. El método o función se administra como atributo para no duplicar el Maestro en varios tipos de pozo.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion'], attributes: [ text('identificacion_oficial', 'Identificación oficial', 10), text('tipo_pozo', 'Tipo de pozo informado', 20), select('metodo_extraccion', 'Método / función operativa', [ 'Bombeo mecánico', 'Bombeo electrosumergible', 'Bombeo de cavidad progresiva (PCP)', 'Surgente / productor de gas', 'Inyector de agua', 'Otro / a validar', ], 30), number('profundidad', 'Profundidad', 40, 'm'), text('estado_operativo', 'Estado operativo informado', 50), date('ultima_intervencion', 'Última intervención informada', 60), ], }, { code: 'equipo', name: 'Equipo', description: 'Equipo físico genérico. Se conserva como alternativa cuando el inventario no permita clasificarlo todavía en una familia técnica específica.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion', 'subestacion', 'pozo', 'zona_bombas', 'sistema_defensa_incendios', 'cargadero_descargadero'], attributes: [ text('fabricante', 'Fabricante', 10), text('modelo', 'Modelo', 20), text('numero_serie', 'Número de serie', 30), ], }, { code: 'tanque', name: 'Tanque', description: 'Tanque de almacenamiento o proceso administrado como equipo individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [ number('capacidad_nominal', 'Capacidad nominal', 10, 'm³'), text('producto_servicio', 'Producto / servicio', 20), text('fabricante', 'Fabricante', 30), text('modelo', 'Modelo', 40), text('numero_serie', 'Número de serie', 50), ], }, { code: 'separador', name: 'Separador', description: 'Separador de proceso administrado como equipo individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'bomba', name: 'Bomba', description: 'Bomba individual. Puede pertenecer a una zona de bombas, sistema contra incendios, pozo u otra instalación.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion', 'zona_bombas', 'sistema_defensa_incendios', 'cargadero_descargadero', 'pozo'], attributes: [ text('fabricante', 'Fabricante', 10), text('modelo', 'Modelo', 20), text('numero_serie', 'Número de serie', 30), ], }, { code: 'caldera', name: 'Caldera', description: 'Caldera administrada como equipo individual con controles documentales y operativos propios.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'antorcha', name: 'Antorcha', description: 'Antorcha administrada como equipo o instalación individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'colector', name: 'Colector', description: 'Colector administrado como activo individual cuando requiere trazabilidad propia.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion', 'instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'filtro', name: 'Filtro', description: 'Filtro administrado como equipo individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'equipo_flotacion', name: 'Equipo de flotación', description: 'Equipo de flotación administrado como activo individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'fwko', name: 'FWKO', description: 'Free Water Knock Out administrado como equipo individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'tratador', name: 'Tratador', description: 'Tratador administrado como equipo individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'calentador', name: 'Calentador', description: 'Calentador administrado como equipo individual.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['instalacion', 'planta', 'bateria', 'estacion'], attributes: [], }, { code: 'ducto', name: 'Ducto / Cañería', description: 'Tramo de ducto o cañería administrable e inspeccionable dentro de un área, yacimiento, locación o instalación.', canBeRoot: false, operationalRole: AssetTypeOperationalRole.GENERIC, allowedParentCodes: ['area', 'yacimiento', 'locacion', 'instalacion', 'planta', 'bateria', 'estacion'], attributes: [ text('servicio', 'Servicio / fluido', 10), text('diametro_nominal', 'Diámetro nominal', 20), ], }, ]; for (const preset of MASTER_BOOTSTRAP_TYPES) { if ( preset.operationalRole === AssetTypeOperationalRole.GENERIC && !['yacimiento', 'locacion', 'estructura_local', 'pozo', 'ducto', 'colector'].includes(preset.code) && !preset.allowedParentCodes.includes('estructura_local') ) { preset.allowedParentCodes.push('estructura_local'); } }