import { MigrationInterface, QueryRunner } from 'typeorm'; export class PhaseF31FamilyCatalogSync1789844500000 implements MigrationInterface { name = 'PhaseF31FamilyCatalogSync1789844500000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` CREATE OR REPLACE FUNCTION sync_asset_inventory_family_catalog() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN DELETE FROM finding_catalog_asset_overrides WHERE asset_id=NEW.id AND reason LIKE 'F3.1 familia técnica:%'; IF NEW.inventory_family_id IS NOT NULL THEN INSERT INTO finding_catalog_asset_overrides ( asset_id,catalog_item_id,is_enabled,reason,created_by,updated_by ) SELECT NEW.id,mapping.catalog_item_id,true, 'F3.1 familia técnica: catálogo contextual automático', NEW.created_by,NEW.updated_by FROM finding_catalog_item_inventory_families mapping WHERE mapping.inventory_family_id=NEW.inventory_family_id ON CONFLICT (asset_id,catalog_item_id) DO UPDATE SET is_enabled=true, reason='F3.1 familia técnica: catálogo contextual automático', updated_by=NEW.updated_by, updated_at=CURRENT_TIMESTAMP; END IF; RETURN NEW; END; $$ `); await queryRunner.query(` CREATE TRIGGER trg_assets_inventory_family_catalog AFTER INSERT OR UPDATE OF inventory_family_id ON assets FOR EACH ROW EXECUTE FUNCTION sync_asset_inventory_family_catalog() `); await queryRunner.query(` CREATE OR REPLACE FUNCTION sync_inventory_family_mapping_assets() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF TG_OP='DELETE' THEN DELETE FROM finding_catalog_asset_overrides override_record USING assets asset WHERE override_record.asset_id=asset.id AND asset.inventory_family_id=OLD.inventory_family_id AND override_record.catalog_item_id=OLD.catalog_item_id AND override_record.reason LIKE 'F3.1 familia técnica:%'; RETURN OLD; END IF; INSERT INTO finding_catalog_asset_overrides ( asset_id,catalog_item_id,is_enabled,reason,created_by,updated_by ) SELECT asset.id,NEW.catalog_item_id,true, 'F3.1 familia técnica: catálogo contextual automático', asset.created_by,asset.updated_by FROM assets asset WHERE asset.inventory_family_id=NEW.inventory_family_id ON CONFLICT (asset_id,catalog_item_id) DO UPDATE SET is_enabled=true, reason='F3.1 familia técnica: catálogo contextual automático', updated_at=CURRENT_TIMESTAMP; RETURN NEW; END; $$ `); await queryRunner.query(` CREATE TRIGGER trg_inventory_family_mapping_assets AFTER INSERT OR DELETE ON finding_catalog_item_inventory_families FOR EACH ROW EXECUTE FUNCTION sync_inventory_family_mapping_assets() `); await queryRunner.query(` INSERT INTO finding_catalog_asset_overrides ( asset_id,catalog_item_id,is_enabled,reason,created_by,updated_by ) SELECT asset.id,mapping.catalog_item_id,true, 'F3.1 familia técnica: catálogo contextual automático', asset.created_by,asset.updated_by FROM assets asset JOIN finding_catalog_item_inventory_families mapping ON mapping.inventory_family_id=asset.inventory_family_id WHERE asset.inventory_family_id IS NOT NULL ON CONFLICT (asset_id,catalog_item_id) DO UPDATE SET is_enabled=true, reason='F3.1 familia técnica: catálogo contextual automático', updated_at=CURRENT_TIMESTAMP `); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query('DROP TRIGGER IF EXISTS trg_inventory_family_mapping_assets ON finding_catalog_item_inventory_families'); await queryRunner.query('DROP FUNCTION IF EXISTS sync_inventory_family_mapping_assets()'); await queryRunner.query('DROP TRIGGER IF EXISTS trg_assets_inventory_family_catalog ON assets'); await queryRunner.query('DROP FUNCTION IF EXISTS sync_asset_inventory_family_catalog()'); } }