Files
dh-inspeccion-v2/api-v3/src/asset-master/asset-master-bootstrap.ts
T

406 lines
14 KiB
TypeScript

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');
}
}