From 88d43b741401c1508a8874c256c85948e59fda90 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Tue, 8 Sep 2026 18:23:16 -0300 Subject: [PATCH] feat(inventory): classify future concrete instances at database level --- ...87100000-f5-inventory-physical-instance.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/api-v3/src/database/migrations/1790087100000-f5-inventory-physical-instance.ts b/api-v3/src/database/migrations/1790087100000-f5-inventory-physical-instance.ts index cd7035e..ef48643 100644 --- a/api-v3/src/database/migrations/1790087100000-f5-inventory-physical-instance.ts +++ b/api-v3/src/database/migrations/1790087100000-f5-inventory-physical-instance.ts @@ -15,11 +15,40 @@ export class F5InventoryPhysicalInstance1790087100000 implements MigrationInterf `); await queryRunner.query(` COMMENT ON COLUMN assets.is_inventory_instance IS - 'True only for a concrete inventory instance confirmed/created as a real field object. Structural/context/catalog assets remain false.' + 'True only for a concrete Inventory instance. Company, Area, Yacimiento and historical/context records remain structural.' + `); + + await queryRunner.query(` + CREATE OR REPLACE FUNCTION classify_new_asset_inventory_instance() + RETURNS trigger + LANGUAGE plpgsql + AS $$ + DECLARE + role_value varchar; + type_code varchar; + BEGIN + SELECT operational_role, lower(code) + INTO role_value, type_code + FROM asset_types + WHERE id = NEW.asset_type_id; + + NEW.is_inventory_instance := + role_value = 'GENERIC' + AND COALESCE(type_code, '') NOT IN ('area', 'yacimiento', 'empresa', 'company'); + RETURN NEW; + END; + $$ + `); + await queryRunner.query(` + CREATE TRIGGER trg_assets_classify_inventory_instance + BEFORE INSERT ON assets + FOR EACH ROW EXECUTE FUNCTION classify_new_asset_inventory_instance() `); } public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query('DROP TRIGGER IF EXISTS trg_assets_classify_inventory_instance ON assets'); + await queryRunner.query('DROP FUNCTION IF EXISTS classify_new_asset_inventory_instance()'); await queryRunner.query('DROP INDEX IF EXISTS idx_assets_inventory_instance_active'); await queryRunner.query('ALTER TABLE assets DROP COLUMN IF EXISTS is_inventory_instance'); }