mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-08 20:38:17 +00:00
101 lines
3.6 KiB
TypeScript
101 lines
3.6 KiB
TypeScript
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
|
|
const CONTAINER_CODES = [
|
|
'IMPORT_CONTAINER_CUSTOMS',
|
|
'IMPORT_CONTAINER_NO_CUSTOMS',
|
|
'EXPORT_CONTAINER_CUSTOMS',
|
|
'EXPORT_CONTAINER_NO_CUSTOMS',
|
|
'INTERCITY_CONTAINER',
|
|
];
|
|
|
|
const BULK_CODES = [
|
|
'IMPORT_BULK_CUSTOMS',
|
|
'IMPORT_BULK_NO_CUSTOMS',
|
|
'EXPORT_BULK_CUSTOMS',
|
|
'EXPORT_BULK_NO_CUSTOMS',
|
|
'INTERCITY_BULK',
|
|
];
|
|
|
|
/**
|
|
* Bulk contract templates become staff-created, keyed by (cargo type, customs
|
|
* clearing) instead of the fixed direction codes. The five container templates
|
|
* stay seeded and become undeletable system rows; the five seeded bulk rows are
|
|
* retired (soft-deleted). cargo_types gains has_contract_template, marking
|
|
* which bulk commodities may carry their own template.
|
|
*/
|
|
export class BulkContractTemplates3320000000000 implements MigrationInterface {
|
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
await queryRunner.query(`
|
|
ALTER TABLE freight.cargo_types
|
|
ADD COLUMN IF NOT EXISTS has_contract_template boolean NOT NULL DEFAULT false
|
|
`);
|
|
|
|
await queryRunner.query(`
|
|
ALTER TABLE freight.contract_templates
|
|
ADD COLUMN IF NOT EXISTS cargo_type_id uuid REFERENCES freight.cargo_types(id),
|
|
ADD COLUMN IF NOT EXISTS with_customs boolean,
|
|
ADD COLUMN IF NOT EXISTS is_system boolean NOT NULL DEFAULT false
|
|
`);
|
|
|
|
// Generated bulk codes (BULK_<cargo code>_NO_CUSTOMS) outgrow varchar(40).
|
|
await queryRunner.query(`
|
|
ALTER TABLE freight.contract_templates
|
|
ALTER COLUMN code TYPE varchar(80)
|
|
`);
|
|
|
|
await queryRunner.query(
|
|
`UPDATE freight.contract_templates SET is_system = true WHERE code = ANY($1)`,
|
|
[CONTAINER_CODES],
|
|
);
|
|
|
|
// Retire the fixed bulk templates; staff recreate them per cargo type.
|
|
await queryRunner.query(
|
|
`UPDATE freight.contract_templates SET deleted_at = now()
|
|
WHERE code = ANY($1) AND deleted_at IS NULL`,
|
|
[BULK_CODES],
|
|
);
|
|
|
|
// Code stays unique among live rows only, so a deleted combo can be
|
|
// recreated under the same generated code.
|
|
await queryRunner.query(
|
|
`ALTER TABLE freight.contract_templates DROP CONSTRAINT IF EXISTS uq_contract_templates_code`,
|
|
);
|
|
await queryRunner.query(`
|
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_contract_templates_code
|
|
ON freight.contract_templates (code) WHERE deleted_at IS NULL
|
|
`);
|
|
|
|
// One template per (bulk cargo type, customs option) — the "same
|
|
// combination" rule, enforced even under concurrent creates.
|
|
await queryRunner.query(`
|
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_contract_templates_cargo_customs
|
|
ON freight.contract_templates (cargo_type_id, with_customs)
|
|
WHERE deleted_at IS NULL AND cargo_type_id IS NOT NULL
|
|
`);
|
|
}
|
|
|
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
await queryRunner.query(
|
|
`DROP INDEX IF EXISTS freight.uq_contract_templates_cargo_customs`,
|
|
);
|
|
await queryRunner.query(`DROP INDEX IF EXISTS freight.uq_contract_templates_code`);
|
|
await queryRunner.query(`
|
|
ALTER TABLE freight.contract_templates
|
|
ADD CONSTRAINT uq_contract_templates_code UNIQUE (code)
|
|
`);
|
|
await queryRunner.query(
|
|
`UPDATE freight.contract_templates SET deleted_at = NULL WHERE code = ANY($1)`,
|
|
[BULK_CODES],
|
|
);
|
|
await queryRunner.query(`
|
|
ALTER TABLE freight.contract_templates
|
|
DROP COLUMN IF EXISTS cargo_type_id,
|
|
DROP COLUMN IF EXISTS with_customs,
|
|
DROP COLUMN IF EXISTS is_system
|
|
`);
|
|
await queryRunner.query(`
|
|
ALTER TABLE freight.cargo_types DROP COLUMN IF EXISTS has_contract_template
|
|
`);
|
|
}
|
|
}
|