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. * * La migración conserva una copia técnica de los valores eliminados para que un * rollback restaure los datos exactos existentes antes del cambio. Inspecciones * creadas después del up() reciben code como title y planned_end_at NULL al bajar. * * Se conserva un índice sobre planned_start_at porque sigue siendo un criterio de * orden y filtro operativo. Ninguna migración histórica se modifica. */ export class F4RemoveInspectionLegacyFields1790000500000 implements MigrationInterface { name = 'F4RemoveInspectionLegacyFields1790000500000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` CREATE TABLE IF NOT EXISTS f4_inspection_visit_legacy_fields_backup ( visit_id uuid PRIMARY KEY, title varchar(200) NOT NULL, planned_end_at timestamptz NULL, backed_up_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP ) `); await queryRunner.query(` INSERT INTO f4_inspection_visit_legacy_fields_backup ( visit_id, title, planned_end_at, backed_up_at ) SELECT id, title, planned_end_at, CURRENT_TIMESTAMP FROM inspection_visits ON CONFLICT (visit_id) DO UPDATE SET title = EXCLUDED.title, planned_end_at = EXCLUDED.planned_end_at, backed_up_at = EXCLUDED.backed_up_at `); 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(` ALTER TABLE inspection_visits ADD COLUMN IF NOT EXISTS planned_end_at timestamptz `); await queryRunner.query(` UPDATE inspection_visits visit SET title = backup.title, planned_end_at = backup.planned_end_at FROM f4_inspection_visit_legacy_fields_backup backup WHERE backup.visit_id = visit.id `); 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(` 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) `); await queryRunner.query(`DROP TABLE IF EXISTS f4_inspection_visit_legacy_fields_backup`); } }