mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
Merge pull request #1106 from Tria-plc/edrmiles
feat(warehouses): filters, pagination and charts on container returns
This commit is contained in:
@@ -5,6 +5,7 @@ import { resolve } from 'path';
|
||||
config({ path: resolve(__dirname, '../../.env') });
|
||||
|
||||
import { NestFactory } from '@nestjs/core';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { AppModule } from '../app.module';
|
||||
import { Batch14TestDataSeeder } from '../seed/batch1-4-test-data.seeder';
|
||||
import { Batch5TestDataSeeder } from '../seed/batch5-test-data.seeder';
|
||||
@@ -14,19 +15,33 @@ import { IndodeFacilitySeeder } from '../seed/indode-facility.seeder';
|
||||
import { PricingDataSeeder } from '../seed/pricing-data.seeder';
|
||||
import { WarehouseDemoSeeder } from '../seed/warehouse-demo.seeder';
|
||||
|
||||
/** Demo data only — refuse to run against anything but a local dev database. */
|
||||
function assertLocalhost() {
|
||||
const host = process.env.DB_HOST ?? 'localhost';
|
||||
if (host !== 'localhost' && host !== '127.0.0.1') {
|
||||
console.error(`Refusing to seed demo data: DB_HOST is "${host}", not localhost.`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
assertLocalhost();
|
||||
|
||||
const app = await NestFactory.createApplicationContext(AppModule, {
|
||||
logger: ['error', 'warn', 'log'],
|
||||
});
|
||||
|
||||
try {
|
||||
await app.get(PricingDataSeeder).run();
|
||||
await app.get(IndodeFacilitySeeder).run();
|
||||
await app.get(Batch14TestDataSeeder).run();
|
||||
await app.get(Batch5TestDataSeeder).run();
|
||||
await app.get(Batch7TestDataSeeder).run();
|
||||
await app.get(Batch8TestDataSeeder).run();
|
||||
await app.get(WarehouseDemoSeeder).run();
|
||||
// Demo seeders are intentionally not AppModule providers (they'd run on every
|
||||
// boot), so construct them against the app's DataSource instead of via DI.
|
||||
const dataSource = app.get(DataSource);
|
||||
await new PricingDataSeeder(dataSource).run();
|
||||
await new IndodeFacilitySeeder(dataSource).run();
|
||||
await new Batch14TestDataSeeder(dataSource).run();
|
||||
await new Batch5TestDataSeeder(dataSource).run();
|
||||
await new Batch7TestDataSeeder(dataSource).run();
|
||||
await new Batch8TestDataSeeder(dataSource).run();
|
||||
await new WarehouseDemoSeeder(dataSource).run();
|
||||
|
||||
console.log('Warehouse demo data seeded.');
|
||||
} finally {
|
||||
|
||||
@@ -2,8 +2,10 @@ import { Injectable, Logger } from '@nestjs/common';
|
||||
import { DataSource } from 'typeorm';
|
||||
|
||||
import { Booking } from '../modules/bookings/entities/booking.entity';
|
||||
import { CustomerTruckAssignment } from '../modules/bookings/entities/customer-truck-assignment.entity';
|
||||
import { CargoType } from '../modules/rule-engine/entities/cargo-type.entity';
|
||||
import { CompanyProfile } from '../modules/companies/entities/company-profile.entity';
|
||||
import { EmptyContainerReturn } from '../modules/import-operations/entities/empty-container-return.entity';
|
||||
import { Locomotive } from '../modules/locomotives/entities/locomotive.entity';
|
||||
import { ServiceType } from '../modules/rule-engine/entities/service-type.entity';
|
||||
import { Yard } from '../modules/rule-engine/entities/yard.entity';
|
||||
@@ -23,6 +25,8 @@ import { WarehouseZone } from '../modules/warehouses/entities/warehouse-zone.ent
|
||||
* Import → Arrive Queue : an ARRIVED import train with IN_TRANSIT bookings (no inventory)
|
||||
* Import → Unloaded Queue : UNLOADED import inventory
|
||||
* Import → Dispatch Queue : READY_FOR_PICKUP import inventory (PASSED)
|
||||
* Import → Import Trucks : a customer self-haul truck assigned to an unloaded booking
|
||||
* Import → Container Returns : empty container returns at two different statuses
|
||||
*
|
||||
* Idempotent: guarded on a sentinel booking reference. Uses dedicated WH-DEMO-* references so it
|
||||
* never collides with other seeders. To repopulate after items are walked through their lifecycle,
|
||||
@@ -166,16 +170,19 @@ export class WarehouseDemoSeeder {
|
||||
}
|
||||
|
||||
// 4) Import Unloaded Queue — UNLOADED import inventory (not inspected, not stored).
|
||||
let firstUnloadedBooking: Booking | null = null;
|
||||
for (let i = 1; i <= 3; i++) {
|
||||
const b = await makeBooking(`WH-DEMO-UNL-${i}`, 'IMPORT', 'IN_TRANSIT', 5000 + i * 500, i);
|
||||
await makeInventory(b, 'UNLOADED', 5000 + i * 500, {
|
||||
arrivedAt: ago(90),
|
||||
unloadedAt: ago(45),
|
||||
});
|
||||
firstUnloadedBooking ??= b;
|
||||
created++;
|
||||
}
|
||||
|
||||
// 5) Import Dispatch Queue — READY_FOR_PICKUP import inventory (inspection PASSED).
|
||||
let firstPickupBooking: Booking | null = null;
|
||||
for (let i = 1; i <= 3; i++) {
|
||||
const b = await makeBooking(`WH-DEMO-PKR-${i}`, 'IMPORT', 'IN_TRANSIT', 5500 + i * 500, i);
|
||||
await makeInventory(b, 'READY_FOR_PICKUP', 5500 + i * 500, {
|
||||
@@ -185,6 +192,50 @@ export class WarehouseDemoSeeder {
|
||||
inspectedAt: ago(120),
|
||||
readyForPickupAt: ago(60),
|
||||
});
|
||||
firstPickupBooking ??= b;
|
||||
created++;
|
||||
}
|
||||
|
||||
// 6) Import Trucks / booking Trucks tab — a customer self-haul truck on the unloaded booking.
|
||||
if (firstUnloadedBooking) {
|
||||
await this.dataSource.getRepository(CustomerTruckAssignment).save(
|
||||
this.dataSource.getRepository(CustomerTruckAssignment).create({
|
||||
bookingId: firstUnloadedBooking.id,
|
||||
plateNumber: 'WH-DEMO-3210',
|
||||
driverName: 'Demo Driver',
|
||||
truckType: 'FLATBED',
|
||||
assignedAt: ago(80),
|
||||
arrivedAt: ago(50),
|
||||
}),
|
||||
);
|
||||
created++;
|
||||
}
|
||||
|
||||
// 7) Container Returns — two empty returns at different stages of the return workflow.
|
||||
if (firstPickupBooking) {
|
||||
const returnRepo = this.dataSource.getRepository(EmptyContainerReturn);
|
||||
await returnRepo.save(
|
||||
returnRepo.create({
|
||||
containerNumber: 'WHDU1234561',
|
||||
bookingId: firstPickupBooking.id,
|
||||
returnDate: ago(20),
|
||||
facility: 'Indode',
|
||||
status: 'RETURNED',
|
||||
returnedBy: 'CUSTOMER',
|
||||
statusHistory: [],
|
||||
}),
|
||||
);
|
||||
await returnRepo.save(
|
||||
returnRepo.create({
|
||||
containerNumber: 'WHDU1234562',
|
||||
bookingId: firstPickupBooking.id,
|
||||
returnDate: ago(90),
|
||||
facility: 'Indode',
|
||||
status: 'DOCUMENTATION_CLEARED',
|
||||
returnedBy: 'CUSTOMER',
|
||||
statusHistory: [],
|
||||
}),
|
||||
);
|
||||
created++;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user