implement contract booking functionality and MinIO setup

This commit is contained in:
marshal
2026-05-23 09:31:52 +03:00
parent f9a9d9923c
commit 82c6b1284e
16 changed files with 1231 additions and 40 deletions

View File

@@ -1,9 +1,9 @@
import { BaseEntity } from "@edr/api-common";
import { Freight } from "@edr/types";
import { Column, Entity } from "typeorm";
@Entity({ name: "bookings" })
export class Booking extends BaseEntity {
// ── core ───────────────────────────────────────────────────────────────
@Column({ name: "reference", type: "varchar", length: 64, unique: true })
reference!: string;
@@ -13,13 +13,8 @@ export class Booking extends BaseEntity {
@Column({ name: "train_id", type: "uuid", nullable: true })
trainId?: string | null;
@Column({
name: "status",
type: "enum",
enum: Freight.BookingStatus,
default: Freight.BookingStatus.Draft,
})
status!: Freight.BookingStatus;
@Column({ name: "status", type: "varchar", length: 40, default: "DRAFT" })
status!: string;
@Column({ name: "scheduled_date", type: "timestamptz" })
scheduledDate!: Date;
@@ -35,9 +30,126 @@ export class Booking extends BaseEntity {
@Column({
name: "payment_status",
type: "enum",
enum: Freight.PaymentStatus,
default: Freight.PaymentStatus.Pending,
type: "varchar",
length: 20,
default: "PENDING",
})
paymentStatus!: Freight.PaymentStatus;
paymentStatus!: string;
// ── contract ───────────────────────────────────────────────────────────
@Column({ name: "contract_type", type: "varchar", length: 20 })
contractType!: string;
@Column({ name: "previous_contract_id", type: "uuid", nullable: true })
previousContractId?: string | null;
@Column({ name: "service_type", type: "varchar", length: 30 })
serviceType!: string;
@Column({ name: "first_mile_enabled", type: "boolean", default: false })
firstMileEnabled!: boolean;
@Column({ name: "first_mile_pickup_address", type: "text", nullable: true })
firstMilePickupAddress?: string | null;
@Column({ name: "last_mile_enabled", type: "boolean", default: false })
lastMileEnabled!: boolean;
@Column({ name: "last_mile_delivery_address", type: "text", nullable: true })
lastMileDeliveryAddress?: string | null;
@Column({ name: "equipment_return", type: "varchar", length: 20 })
equipmentReturn!: string;
@Column({ name: "origin_station", type: "varchar", length: 255 })
originStation!: string;
@Column({ name: "destination_station", type: "varchar", length: 255 })
destinationStation!: string;
@Column({
name: "cargo_total_weight_vgm",
type: "numeric",
precision: 12,
scale: 3,
})
cargoTotalWeightVgm!: number;
@Column({ name: "freight_type", type: "varchar", length: 20 })
freightType!: string;
@Column({ name: "freight_subtype", type: "varchar", length: 100, nullable: true })
freightSubtype?: string | null;
@Column({ name: "is_hazardous", type: "boolean", default: false })
isHazardous!: boolean;
@Column({ name: "is_refrigerated", type: "boolean", default: false })
isRefrigerated!: boolean;
@Column({ name: "trade_direction", type: "varchar", length: 10 })
tradeDirection!: string;
@Column({ name: "payment_currency", type: "varchar", length: 5 })
paymentCurrency!: string;
@Column({ name: "start_date", type: "date", nullable: true })
startDate?: Date | null;
@Column({ name: "end_date", type: "date", nullable: true })
endDate?: Date | null;
@Column({ name: "financial_terms", type: "text", nullable: true })
financialTerms?: string | null;
@Column({ name: "version_number", type: "int", default: 1 })
versionNumber!: number;
// ── container ──────────────────────────────────────────────────────────
@Column({ name: "container_type", type: "varchar", length: 10 })
containerType!: string;
@Column({ name: "container_quantity", type: "int" })
containerQuantity!: number;
@Column({
name: "container_vgm_per_unit",
type: "numeric",
precision: 10,
scale: 3,
})
containerVgmPerUnit!: number;
// ── approval ───────────────────────────────────────────────────────────
@Column({ name: "approved_by_staff_id", type: "uuid", nullable: true })
approvedByStaffId?: string | null;
@Column({ name: "approved_by_staff_at", type: "timestamptz", nullable: true })
approvedByStaffAt?: Date | null;
@Column({ name: "signed_by_director_id", type: "uuid", nullable: true })
signedByDirectorId?: string | null;
@Column({ name: "signed_by_director_at", type: "timestamptz", nullable: true })
signedByDirectorAt?: Date | null;
@Column({ name: "signed_by_ceo_id", type: "uuid", nullable: true })
signedByCeoId?: string | null;
@Column({ name: "signed_by_ceo_at", type: "timestamptz", nullable: true })
signedByCeoAt?: Date | null;
@Column({ name: "priority_score", type: "int", default: 0 })
priorityScore!: number;
// ── consolidation ──────────────────────────────────────────────────────
@Column({ name: "allow_consolidation", type: "boolean", default: false })
allowConsolidation!: boolean;
@Column({ name: "consolidation_partner_id", type: "uuid", nullable: true })
consolidationPartnerId?: string | null;
// ── documents (JSONB) ──────────────────────────────────────────────────
@Column({ name: "documents", type: "jsonb", nullable: true })
documents?: Record<string, { originalName: string; size: number; mimeType: string; url?: string }> | null;
}