F2.1: exigir GPS y foto antes de un Hallazgo

This commit is contained in:
2026-09-05 18:04:20 -03:00
parent 6acbb26a82
commit f88dc8c2e0
@@ -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