From 5404409042c493133a1d0371cee33f006db62ab3 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Tue, 8 Sep 2026 08:45:54 -0300 Subject: [PATCH] refactor(f4): retire legacy inspection fields --- ...0000-f4-remove-inspection-legacy-fields.ts | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts diff --git a/api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts b/api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts new file mode 100644 index 0000000..4555137 --- /dev/null +++ b/api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts @@ -0,0 +1,77 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +/** + * F4 elimina dos campos heredados de la planificación original de Inspecciones: + * - title: la Inspección se identifica por su código autogenerado. + * - planned_end_at: la planificación sólo define la fecha/hora prevista de inicio. + * + * Se conserva un índice sobre planned_start_at porque sigue siendo un criterio de + * orden y filtro operativo. El rollback reconstruye la forma original de D1. + */ +export class F4RemoveInspectionLegacyFields1790000500000 implements MigrationInterface { + name = 'F4RemoveInspectionLegacyFields1790000500000'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX IF EXISTS idx_inspection_visits_planned_dates`); + await queryRunner.query(` + ALTER TABLE inspection_visits + DROP CONSTRAINT IF EXISTS chk_inspection_visits_planned_dates + `); + + await queryRunner.query(`ALTER TABLE inspection_visits DROP COLUMN IF EXISTS planned_end_at`); + await queryRunner.query(`ALTER TABLE inspection_visits DROP COLUMN IF EXISTS title`); + + await queryRunner.query(` + CREATE INDEX IF NOT EXISTS idx_inspection_visits_planned_start_at + ON inspection_visits (planned_start_at) + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX IF EXISTS idx_inspection_visits_planned_start_at`); + + await queryRunner.query(` + ALTER TABLE inspection_visits + ADD COLUMN IF NOT EXISTS title varchar(200) + `); + await queryRunner.query(` + UPDATE inspection_visits + SET title = code + WHERE title IS NULL + `); + await queryRunner.query(` + ALTER TABLE inspection_visits + ALTER COLUMN title SET NOT NULL + `); + + await queryRunner.query(` + ALTER TABLE inspection_visits + ADD COLUMN IF NOT EXISTS planned_end_at timestamptz + `); + + await queryRunner.query(` + DO $$ + BEGIN + IF NOT EXISTS ( + SELECT 1 + FROM pg_constraint + WHERE conname = 'chk_inspection_visits_planned_dates' + AND conrelid = 'inspection_visits'::regclass + ) THEN + ALTER TABLE inspection_visits + ADD CONSTRAINT chk_inspection_visits_planned_dates CHECK ( + planned_start_at IS NULL + OR planned_end_at IS NULL + OR planned_end_at >= planned_start_at + ); + END IF; + END + $$ + `); + + await queryRunner.query(` + CREATE INDEX IF NOT EXISTS idx_inspection_visits_planned_dates + ON inspection_visits (planned_start_at, planned_end_at) + `); + } +}