Files
edr-platform/apps/edr-freight-api/src/scripts/seed-edr-wagons.ts
2026-08-05 10:46:02 +03:00

91 lines
2.9 KiB
TypeScript

import { AppDataSource } from "../data-source";
import { FREIGHT_SEED_SQL } from "../migrations/3250000000000-FreightBaseline";
async function seedEdRWagons() {
await AppDataSource.initialize();
const queryRunner = AppDataSource.createQueryRunner();
try {
await queryRunner.connect();
await queryRunner.startTransaction();
// Replays the fleet exactly as the baseline migration seeds it on a fresh
// database — wagon numbers, types, run roster and yard already in their final
// state. Wipes first, so this is a reset rather than a top-up. The wagon-seed
// migrations this used to call one by one are now folded into
// `3250000000000-FreightBaseline`.
await queryRunner.query(`DELETE FROM freight.wagons`);
await queryRunner.query(FREIGHT_SEED_SQL.wagons);
const summary = await queryRunner.query(`
SELECT
wt.code,
wt.name,
COUNT(*)::int AS wagons,
MIN(w.wagon_number) AS first_wagon,
MAX(w.wagon_number) AS last_wagon,
COUNT(*) FILTER (WHERE w.status = 'AVAILABLE')::int AS available,
COUNT(*) FILTER (WHERE w.current_yard_id IS NULL)::int AS no_yard,
COUNT(*) FILTER (WHERE w.export_train_number IS NOT NULL)::int AS on_a_run
FROM freight.wagons w
JOIN freight.wagon_types wt ON wt.id = w.wagon_type_id
WHERE w.wagon_number BETWEEN 'ER0001' AND 'ER1100'
GROUP BY wt.code, wt.name
ORDER BY MIN(w.wagon_number);
`);
const [totals] = await queryRunner.query(`
SELECT
COUNT(*)::int AS total,
COUNT(*) FILTER (WHERE export_train_number IS NOT NULL)::int AS on_a_run
FROM freight.wagons;
`);
const yards = await queryRunner.query(`
SELECT
COALESCE(y.label, '(no yard)') AS yard,
COUNT(*)::int AS wagons
FROM freight.wagons w
LEFT JOIN freight.yards y ON y.id = w.current_yard_id
GROUP BY y.label
ORDER BY 2 DESC;
`);
const runs = await queryRunner.query(`
SELECT
export_train_number AS export_run,
import_train_number AS import_run,
COUNT(*)::int AS wagons
FROM freight.wagons
WHERE export_train_number IS NOT NULL
GROUP BY export_train_number, import_train_number
ORDER BY export_train_number;
`);
await queryRunner.commitTransaction();
console.log("\nFleet by wagon type:");
console.table(summary);
console.log("Run roster (export/import pairs):");
console.table(runs);
console.log("Fleet by yard:");
console.table(yards);
console.log(
`Seeded EDR wagon fleet — ${totals.total} wagons total (expected 1100), ` +
`${totals.on_a_run} on a run (expected 533).`,
);
} catch (error) {
await queryRunner.rollbackTransaction();
throw error;
} finally {
await queryRunner.release();
await AppDataSource.destroy();
}
}
seedEdRWagons().catch((error) => {
console.error("Failed to seed EDR wagon fleet:", error);
process.exit(1);
});