From 0f2885c562ef145ec3a6a5fc297186238706048f Mon Sep 17 00:00:00 2001 From: enlineawork Date: Mon, 7 Sep 2026 10:15:47 -0300 Subject: [PATCH] =?UTF-8?q?F3.1:=20listar=20padres=20v=C3=A1lidos=20para?= =?UTF-8?q?=20alta=20guiada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inventory-structure.service.ts | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/api-v3/src/asset-master/inventory-structure.service.ts b/api-v3/src/asset-master/inventory-structure.service.ts index e5eae78..dbf0121 100644 --- a/api-v3/src/asset-master/inventory-structure.service.ts +++ b/api-v3/src/asset-master/inventory-structure.service.ts @@ -105,6 +105,45 @@ export class InventoryStructureService { }; } + async parents(kindValue: string, search?: string) { + const kind = kindValue.toUpperCase() as InventoryStructureKind; + if (!(kind in PARENT_TYPE_BY_KIND) || kind === 'AREA') { + throw new BadRequestException({ + code: 'INVENTORY_STRUCTURE_PARENT_KIND_INVALID', + message: 'El nivel indicado no requiere un registro padre', + }); + } + const expectedType = PARENT_TYPE_BY_KIND[kind]; + const parameters: unknown[] = [expectedType]; + let searchSql = ''; + if (search?.trim()) { + parameters.push(`%${search.trim()}%`); + searchSql = `AND (asset.code ILIKE $2 OR asset.name ILIKE $2 OR COALESCE(asset.common_name,'') ILIKE $2)`; + } + const rows = await this.dataSource.query(` + SELECT + asset.id,asset.code,asset.name,asset.common_name AS "commonName", + JSONB_BUILD_OBJECT('id',type.id,'code',type.code,'name',type.name) AS type, + CASE WHEN family.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT( + 'id',family.id,'code',family.code,'name',family.name,'level',family.level, + 'informationLabels',family.information_labels + ) END AS "inventoryFamily", + CASE WHEN parent.id IS NULL THEN NULL ELSE JSONB_BUILD_OBJECT( + 'id',parent.id,'code',parent.code,'name',parent.name + ) END AS parent + FROM assets asset + JOIN asset_types type ON type.id=asset.asset_type_id + LEFT JOIN inventory_families family ON family.id=asset.inventory_family_id + LEFT JOIN assets parent ON parent.id=asset.parent_id + WHERE lower(type.code)=lower($1::text) + AND asset.information_status<>'INACTIVE' + ${searchSql} + ORDER BY asset.name,asset.code + LIMIT 80 + `, parameters); + return { data: rows }; + } + async create( dto: CreateInventoryStructureDto, principal: AuthPrincipal, @@ -126,7 +165,7 @@ export class InventoryStructureService { data_origin,source_name,source_reference,source_notes,created_by,updated_by,provenance_updated_by ) VALUES ( $1::uuid,$2::uuid,$3::uuid,$4::uuid,$5::uuid, - $6::varchar,$7::varchar,$8::varchar,$9::text,$10::varchar,$11::varchar, + $6::varchar,$7::varchar,$8::varchar,$9::text,$10::asset_information_status,$11::asset_operational_status, $12::varchar,$13::varchar,$14::varchar,$15::text,$16::uuid,$16::uuid,$16::uuid ) RETURNING id `, [ @@ -140,7 +179,7 @@ export class InventoryStructureService { dto.commonName ?? null, dto.description ?? null, AssetInformationStatus.DRAFT, - AssetOperationalStatus.IN_SERVICE, + AssetOperationalStatus.UNKNOWN, AssetDataOrigin.MANUAL, 'Inventario estructural F3.1', `inventory-structure:${dto.kind.toLowerCase()}`, @@ -249,7 +288,7 @@ export class InventoryStructureService { if (parent.typeCode.toLowerCase() !== expectedType) { throw new BadRequestException({ code: 'INVENTORY_STRUCTURE_PARENT_INVALID', - message: `La jerarquía requerida es Área → Yacimiento → Instalación → Subinstalación`, + message: 'La jerarquía requerida es Área → Yacimiento → Instalación → Subinstalación', }); } return parent;