119 lines
3.9 KiB
TypeScript
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`);
|
|
}
|
|
}
|