F4.4 · numeración institucional ACT e INF

This commit is contained in:
2026-09-07 19:56:40 -03:00
parent fbe8f2e8cf
commit 3634768f9a
2 changed files with 168 additions and 0 deletions
@@ -0,0 +1,144 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
export class PhaseF4DocumentNumbering1790046000000 implements MigrationInterface {
name = 'PhaseF4DocumentNumbering1790046000000';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
DO $$
BEGIN
IF EXISTS (SELECT 1 FROM inspection_acts WHERE act_number > 99999) THEN
RAISE EXCEPTION 'F4 numbering requires inspection act numbers <= 99999';
END IF;
IF EXISTS (
SELECT 1
FROM inspection_visits
WHERE code ~ '^INS-[0-9]{4}-[0-9]{6}$'
AND RIGHT(code, 6)::integer > 99999
) THEN
RAISE EXCEPTION 'F4 numbering requires inspection visit numbers <= 99999';
END IF;
END $$
`);
await queryRunner.query(`
UPDATE inspection_visits
SET code = 'INSP-'
|| LPAD(RIGHT(code, 6)::integer::text, 5, '0')
|| '-'
|| TO_CHAR(
COALESCE(planned_start_at, created_at) AT TIME ZONE 'America/Argentina/Mendoza',
'DD-MM-YY'
),
title = CASE
WHEN title = inspection_visits.code THEN 'INSP-'
|| LPAD(RIGHT(inspection_visits.code, 6)::integer::text, 5, '0')
|| '-'
|| TO_CHAR(
COALESCE(planned_start_at, created_at) AT TIME ZONE 'America/Argentina/Mendoza',
'DD-MM-YY'
)
ELSE title
END
WHERE code ~ '^INS-[0-9]{4}-[0-9]{6}$'
`);
await queryRunner.query(`
UPDATE inspection_acts
SET code = 'ACT-'
|| LPAD(act_number::text, 5, '0')
|| '-'
|| TO_CHAR(occurred_at AT TIME ZONE 'America/Argentina/Mendoza', 'DD-MM-YY')
`);
await queryRunner.query(`DROP INDEX IF EXISTS uq_inspection_reports_year_number`);
await queryRunner.query(`
UPDATE inspection_reports report
SET report_year = act.act_year,
report_number = act.act_number,
code = 'INF-'
|| LPAD(act.act_number::text, 5, '0')
|| '-'
|| TO_CHAR(act.occurred_at AT TIME ZONE 'America/Argentina/Mendoza', 'DD-MM-YY')
FROM inspection_acts act
WHERE act.id = report.act_id
`);
await queryRunner.query(`
CREATE UNIQUE INDEX uq_inspection_reports_year_number
ON inspection_reports(report_year, report_number)
`);
await queryRunner.query(`
CREATE OR REPLACE FUNCTION dhv2_f4_set_act_code()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW.act_number > 99999 THEN
RAISE EXCEPTION 'Inspection Act sequence exhausted for F4 institutional format';
END IF;
NEW.code := 'ACT-'
|| LPAD(NEW.act_number::text, 5, '0')
|| '-'
|| TO_CHAR(NEW.occurred_at AT TIME ZONE 'America/Argentina/Mendoza', 'DD-MM-YY');
RETURN NEW;
END;
$$
`);
await queryRunner.query(`
DROP TRIGGER IF EXISTS trg_dhv2_f4_set_act_code ON inspection_acts
`);
await queryRunner.query(`
CREATE TRIGGER trg_dhv2_f4_set_act_code
BEFORE INSERT OR UPDATE OF act_number, occurred_at
ON inspection_acts
FOR EACH ROW
EXECUTE FUNCTION dhv2_f4_set_act_code()
`);
await queryRunner.query(`
CREATE OR REPLACE FUNCTION dhv2_f4_set_report_code()
RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
source_act inspection_acts%ROWTYPE;
BEGIN
SELECT * INTO source_act
FROM inspection_acts
WHERE id = NEW.act_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Inspection Act not found for report %', NEW.act_id;
END IF;
IF source_act.act_number > 99999 THEN
RAISE EXCEPTION 'Inspection Report sequence exhausted for F4 institutional format';
END IF;
NEW.report_year := source_act.act_year;
NEW.report_number := source_act.act_number;
NEW.code := 'INF-'
|| LPAD(source_act.act_number::text, 5, '0')
|| '-'
|| TO_CHAR(source_act.occurred_at AT TIME ZONE 'America/Argentina/Mendoza', 'DD-MM-YY');
RETURN NEW;
END;
$$
`);
await queryRunner.query(`
DROP TRIGGER IF EXISTS trg_dhv2_f4_set_report_code ON inspection_reports
`);
await queryRunner.query(`
CREATE TRIGGER trg_dhv2_f4_set_report_code
BEFORE INSERT OR UPDATE OF act_id
ON inspection_reports
FOR EACH ROW
EXECUTE FUNCTION dhv2_f4_set_report_code()
`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TRIGGER IF EXISTS trg_dhv2_f4_set_report_code ON inspection_reports`);
await queryRunner.query(`DROP FUNCTION IF EXISTS dhv2_f4_set_report_code()`);
await queryRunner.query(`DROP TRIGGER IF EXISTS trg_dhv2_f4_set_act_code ON inspection_acts`);
await queryRunner.query(`DROP FUNCTION IF EXISTS dhv2_f4_set_act_code()`);
}
}