From f88dc8c2e00f3d44db223c03b01179eca884f286 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Sat, 5 Sep 2026 18:04:20 -0300 Subject: [PATCH] F2.1: exigir GPS y foto antes de un Hallazgo --- ...789668000000-phase-f2-1-field-inventory.ts | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/api-v3/src/database/migrations/1789668000000-phase-f2-1-field-inventory.ts b/api-v3/src/database/migrations/1789668000000-phase-f2-1-field-inventory.ts index 3c0ffb2..3c254f7 100644 --- a/api-v3/src/database/migrations/1789668000000-phase-f2-1-field-inventory.ts +++ b/api-v3/src/database/migrations/1789668000000-phase-f2-1-field-inventory.ts @@ -91,6 +91,64 @@ export class PhaseF21FieldInventory1789668000000 implements MigrationInterface { ) `); + await queryRunner.query(` + CREATE OR REPLACE FUNCTION enforce_field_inventory_capture_before_finding() + RETURNS trigger + LANGUAGE plpgsql + AS $$ + DECLARE + finding_visit_id uuid; + BEGIN + SELECT act.visit_id INTO finding_visit_id + FROM inspection_acts act + WHERE act.id = NEW.act_id; + + IF finding_visit_id IS NULL THEN + RETURN NEW; + END IF; + + IF EXISTS ( + SELECT 1 + FROM asset_field_discoveries discovery + WHERE discovery.visit_id = finding_visit_id + AND discovery.asset_id = NEW.asset_id + ) THEN + IF NOT EXISTS ( + SELECT 1 + FROM asset_field_capture_events capture + WHERE capture.visit_id = finding_visit_id + AND capture.asset_id = NEW.asset_id + AND capture.event_type = 'CREATED' + ) THEN + RAISE EXCEPTION USING + ERRCODE = '23514', + MESSAGE = 'FIELD_INVENTORY_GPS_REQUIRED'; + END IF; + + IF NOT EXISTS ( + SELECT 1 + FROM asset_field_capture_events capture + WHERE capture.visit_id = finding_visit_id + AND capture.asset_id = NEW.asset_id + AND capture.event_type = 'PHOTO' + ) THEN + RAISE EXCEPTION USING + ERRCODE = '23514', + MESSAGE = 'FIELD_INVENTORY_PHOTO_REQUIRED'; + END IF; + END IF; + + RETURN NEW; + END + $$ + `); + await queryRunner.query(` + CREATE TRIGGER trg_inspection_findings_field_capture + BEFORE INSERT OR UPDATE OF act_id, asset_id ON inspection_findings + FOR EACH ROW + EXECUTE FUNCTION enforce_field_inventory_capture_before_finding() + `); + const appRole = process.env.DB_APP_USER; if (!appRole) throw new Error('Missing required environment variable: DB_APP_USER'); const applicationRole = quoteIdentifier(appRole); @@ -116,6 +174,9 @@ export class PhaseF21FieldInventory1789668000000 implements MigrationInterface { $$ `); + await queryRunner.query(`DROP TRIGGER IF EXISTS trg_inspection_findings_field_capture ON inspection_findings`); + await queryRunner.query(`DROP FUNCTION IF EXISTS enforce_field_inventory_capture_before_finding()`); + await queryRunner.query(`ALTER TABLE inspection_visit_asset_events DROP CONSTRAINT chk_inspection_visit_asset_events_type`); await queryRunner.query(` ALTER TABLE inspection_visit_asset_events