Implementa el nuevo núcleo operativo: múltiples Actas por Inspección, un Informe por Acta, cierre de campo independiente y firma de empresa diferida con conformidad/disidencia.
109 lines
3.5 KiB
TypeScript
109 lines
3.5 KiB
TypeScript
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
|
|
export class PhaseF11MultiActInspections1789495200000 implements MigrationInterface {
|
|
name = 'PhaseF11MultiActInspections1789495200000';
|
|
|
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
await queryRunner.query(`
|
|
ALTER TABLE inspection_acts
|
|
DROP CONSTRAINT IF EXISTS uq_inspection_acts_visit
|
|
`);
|
|
await queryRunner.query(`
|
|
CREATE UNIQUE INDEX uq_inspection_acts_one_draft_per_visit
|
|
ON inspection_acts (visit_id)
|
|
WHERE status = 'DRAFT'
|
|
`);
|
|
|
|
await queryRunner.query(`
|
|
ALTER TABLE inspection_reports
|
|
DROP CONSTRAINT IF EXISTS uq_inspection_reports_visit
|
|
`);
|
|
await queryRunner.query(`
|
|
CREATE INDEX idx_inspection_reports_visit_id
|
|
ON inspection_reports (visit_id)
|
|
`);
|
|
|
|
await queryRunner.query(`
|
|
ALTER TABLE inspection_act_signatures
|
|
ADD COLUMN company_manifestation varchar(20),
|
|
ADD COLUMN company_statement text
|
|
`);
|
|
await queryRunner.query(`
|
|
UPDATE inspection_act_signatures
|
|
SET company_manifestation = 'CONFORMITY'
|
|
WHERE signer_type = 'COMPANY_RESPONSIBLE'
|
|
AND status = 'SIGNED'
|
|
`);
|
|
await queryRunner.query(`
|
|
ALTER TABLE inspection_act_signatures
|
|
ADD CONSTRAINT chk_inspection_act_signatures_company_manifestation CHECK (
|
|
(
|
|
signer_type = 'COMPANY_RESPONSIBLE'
|
|
AND status = 'SIGNED'
|
|
AND company_manifestation IN ('CONFORMITY', 'DISSENT')
|
|
AND (
|
|
(company_manifestation = 'CONFORMITY' AND company_statement IS NULL)
|
|
OR
|
|
(company_manifestation = 'DISSENT' AND LENGTH(TRIM(COALESCE(company_statement, ''))) >= 10)
|
|
)
|
|
)
|
|
OR
|
|
(
|
|
NOT (signer_type = 'COMPANY_RESPONSIBLE' AND status = 'SIGNED')
|
|
AND company_manifestation IS NULL
|
|
AND company_statement IS NULL
|
|
)
|
|
)
|
|
`);
|
|
}
|
|
|
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
await queryRunner.query(`
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (
|
|
SELECT visit_id FROM inspection_acts
|
|
GROUP BY visit_id HAVING COUNT(*) > 1
|
|
) THEN
|
|
RAISE EXCEPTION 'F1.1 no puede revertirse: existen inspecciones con múltiples actas';
|
|
END IF;
|
|
IF EXISTS (
|
|
SELECT visit_id FROM inspection_reports
|
|
GROUP BY visit_id HAVING COUNT(*) > 1
|
|
) THEN
|
|
RAISE EXCEPTION 'F1.1 no puede revertirse: existen inspecciones con múltiples informes';
|
|
END IF;
|
|
IF EXISTS (
|
|
SELECT 1 FROM inspection_act_signatures
|
|
WHERE company_manifestation = 'DISSENT'
|
|
) THEN
|
|
RAISE EXCEPTION 'F1.1 no puede revertirse: existen firmas en disidencia';
|
|
END IF;
|
|
END
|
|
$$
|
|
`);
|
|
|
|
await queryRunner.query(`
|
|
ALTER TABLE inspection_act_signatures
|
|
DROP CONSTRAINT chk_inspection_act_signatures_company_manifestation
|
|
`);
|
|
await queryRunner.query(`
|
|
ALTER TABLE inspection_act_signatures
|
|
DROP COLUMN company_statement,
|
|
DROP COLUMN company_manifestation
|
|
`);
|
|
|
|
await queryRunner.query(`DROP INDEX idx_inspection_reports_visit_id`);
|
|
await queryRunner.query(`
|
|
ALTER TABLE inspection_reports
|
|
ADD CONSTRAINT uq_inspection_reports_visit UNIQUE (visit_id)
|
|
`);
|
|
|
|
await queryRunner.query(`DROP INDEX uq_inspection_acts_one_draft_per_visit`);
|
|
await queryRunner.query(`
|
|
ALTER TABLE inspection_acts
|
|
ADD CONSTRAINT uq_inspection_acts_visit UNIQUE (visit_id)
|
|
`);
|
|
}
|
|
}
|