Files
dh-inspeccion-v2/api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts
T

119 lines
3.9 KiB
TypeScript

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<void> {
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<void> {
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`);
}
}