From 345ef76820005585658faaff6b1fe6219c4fbc89 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Tue, 8 Sep 2026 09:27:29 -0300 Subject: [PATCH] fix: align F4 Act code constraint with generated codes --- ...f4-align-document-lifecycle-constraints.ts | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/api-v3/src/database/migrations/1790000600000-f4-align-document-lifecycle-constraints.ts b/api-v3/src/database/migrations/1790000600000-f4-align-document-lifecycle-constraints.ts index 1c8d62b..cf2ec85 100644 --- a/api-v3/src/database/migrations/1790000600000-f4-align-document-lifecycle-constraints.ts +++ b/api-v3/src/database/migrations/1790000600000-f4-align-document-lifecycle-constraints.ts @@ -4,8 +4,9 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; * Alinea las restricciones físicas heredadas de D5 con el ciclo documental F4. * * F4 incorpora estados LOCKED/SEALED para Actas y WORKING/OFFICIALIZED para INF. - * Las migraciones históricas conservaban CHECKs y triggers de READY/CLOSED/FROZEN, - * por lo que el servicio podía compilar pero PostgreSQL rechazaba las transiciones. + * También usa el código visible ACT-NNNNN-DD-MM-YY. Las migraciones históricas + * conservaban CHECKs, triggers y el formato ACTA-YYYY-NNNNNN de D5, por lo que + * el servicio podía compilar pero PostgreSQL rechazaba las transiciones nuevas. */ export class F4AlignDocumentLifecycleConstraints1790000600000 implements MigrationInterface { name = 'F4AlignDocumentLifecycleConstraints1790000600000'; @@ -33,6 +34,19 @@ export class F4AlignDocumentLifecycleConstraints1790000600000 implements Migrati ) `); + // Conservamos los códigos históricos ACTA-* ya emitidos y habilitamos el + // formato F4 realmente generado por InspectionActsService. + await queryRunner.query(` + ALTER TABLE inspection_acts + DROP CONSTRAINT IF EXISTS chk_inspection_acts_code + `); + await queryRunner.query(` + ALTER TABLE inspection_acts + ADD CONSTRAINT chk_inspection_acts_code CHECK ( + code ~ '^(ACTA-[0-9]{4}-[0-9]{6}|ACT-[0-9]{5}-[0-9]{2}-[0-9]{2}-[0-9]{2})$' + ) + `); + await queryRunner.query(` ALTER TABLE inspection_act_versions DROP CONSTRAINT IF EXISTS chk_inspection_act_versions_event @@ -111,6 +125,24 @@ export class F4AlignDocumentLifecycleConstraints1790000600000 implements Migrati $$ `); + // Los códigos F4 se traducen antes de convertir SEALED a CLOSED, porque una vez + // restaurada la guarda D5 una fila CLOSED ya no puede modificarse. + await queryRunner.query(` + UPDATE inspection_acts + SET code='ACTA-' || act_year::text || '-' || LPAD(act_number::text, 6, '0') + WHERE code ~ '^ACT-[0-9]{5}-[0-9]{2}-[0-9]{2}-[0-9]{2}$' + `); + await queryRunner.query(` + ALTER TABLE inspection_acts + DROP CONSTRAINT IF EXISTS chk_inspection_acts_code + `); + await queryRunner.query(` + ALTER TABLE inspection_acts + ADD CONSTRAINT chk_inspection_acts_code CHECK ( + code ~ '^ACTA-[0-9]{4}-[0-9]{6}$' + ) + `); + // El contrato D5 no conoce los estados F4. Reducimos las representaciones // nuevas a sus equivalentes históricos antes de restaurar sus CHECKs. await queryRunner.query(`