mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
Containers need a reach stacker or gantry, so only Indode, Modjo and Dire Dawa take them. Bulk needs far less and is handled at all five facilities. Having a facility was previously enough to load anything, so a container booking through Sebeta or Adama would have been accepted and then had nothing to lift it. - yard_facilities gains handles_container / handles_bulk, both defaulting true so a facility handles everything unless told otherwise; the seeder states the real capability. - The intercity gate now refuses cargo a facility cannot lift, saying which type, not just "no facility". canHandleFreight keeps that rule in the resolver so callers cannot get it subtly wrong. - The intercity list resolves each end against the booking's own freight type, so the view flags a container booking routed through a bulk-only yard while the train is still coming rather than when the load is refused. Import/export untouched — the gate is still DOMESTIC-only. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import { BaseEntity } from '@edr/api-common';
|
|
import { Column, Entity, Index, JoinColumn, OneToOne } from 'typeorm';
|
|
|
|
import { Yard } from './yard.entity';
|
|
|
|
/**
|
|
* What a yard's load/unload facility can do. One record per yard flagged
|
|
* `has_facility`.
|
|
*
|
|
* `hasWarehouse` is the line that matters: a facility with a warehouse (Indode
|
|
* today) stores cargo and therefore accrues storage/demurrage through the normal
|
|
* warehouse flow; the rest only move cargo on and off the train, so they record
|
|
* the handling event and its GRN and nothing else.
|
|
*/
|
|
@Entity({ schema: 'freight', name: 'yard_facilities' })
|
|
@Index(['yardId'])
|
|
export class YardFacility extends BaseEntity {
|
|
@Column({ name: 'yard_id', type: 'uuid' })
|
|
yardId!: string;
|
|
|
|
@OneToOne(() => Yard, { nullable: false, onDelete: 'CASCADE' })
|
|
@JoinColumn({ name: 'yard_id' })
|
|
yard?: Yard;
|
|
|
|
/** Cargo can be stored here — enables the warehouse flow (storage, demurrage). */
|
|
@Column({ name: 'has_warehouse', type: 'boolean', default: false })
|
|
hasWarehouse!: boolean;
|
|
|
|
/**
|
|
* Containers need a reach stacker or gantry, so only the equipped facilities
|
|
* (Indode, Modjo, Dire Dawa) take them. Bulk needs far less and is handled
|
|
* everywhere.
|
|
*/
|
|
@Column({ name: 'handles_container', type: 'boolean', default: true })
|
|
handlesContainer!: boolean;
|
|
|
|
@Column({ name: 'handles_bulk', type: 'boolean', default: true })
|
|
handlesBulk!: boolean;
|
|
|
|
@Column({ name: 'equipment_notes', type: 'text', nullable: true })
|
|
equipmentNotes?: string | null;
|
|
|
|
@Column({ name: 'is_active', type: 'boolean', default: true })
|
|
isActive!: boolean;
|
|
}
|