Skip to content

Database & Models

The FreightFlow storage layer is built on PostgreSQL 17 using SQLAlchemy 2.0+ in fully asynchronous mode (asyncpg).

Entity Relationship

Legacy TAI-Based System

┌──────────────────┐        ┌─────────────────────────┐
│   ShipmentTai    │        │  CargoesFlowShipment     │
│ (tai_shipments)  │        │ (cargoes_flow_shipments) │
│                  │        │                          │
│ • reference_no   │        │ • mbl_number (unique)    │
│ • MBL            │        │ • booking_number         │
│ • carrier        │        └────────────┬─────────────┘
│ • shipper        │                     │
│ • office_name    │                     │ via mbl_number
│ • sales_reps[]   │                     │
└────────┬─────────┘        ┌────────────▼────────────┐
         │                  │       Container          │
         │ tai_shipment_id  │     (containers)         │
         └─────────────────►│                          │
                            │ • container_number       │
                            │ • mbl_number             │
                            │ • status                 │
                            │ • pod_terminal           │
                            │ • terminal_status        │
                            │ • last_free_day          │
                            │ • is_archived            │
                            └──┬─────────────┬─────────┘
                               │             │
              ┌────────────────▼──┐    ┌──────▼─────────────┐
              │ ContainerShipment │    │ ContainerCustomHold │
              │      Event        │    │                     │
              │                   │    │ • hold_type         │
              │ • code            │    │ • description       │
              │ • actual_time     │    └─────────────────────┘
              │ • location      │
              │ • terminal_name │
              └───────────────────┘

Gravitas System (New)

┌─────────────────────────────────────────────────────────────────────────┐
│                      Gravitas Data Models                               │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────────────────────┐           ┌─────────────────────────────┐ │
│  │    GravitasShipment     │           │      GravitasContainer      │ │
│  │   (gravitas_shipments)  │           │    (gravitas_containers)    │ │
│  │                         │           │                             │ │
│  │ • id (UUID PK)          │◄──────────│ • id (UUID PK)              │ │
│  │ • file_no               │  1:N      │ • gravitas_shipment_id (FK) │ │
│  │ • mbl_number            │           │ • container_number          │ │
│  │ • office                │           │ • mbl_number                │ │
│  │ • consignee             │           │ • status                    │ │
│  │ • oversea_agent         │           │ • pod_terminal              │ │
│  │ • container_number      │           │ • terminal_status           │ │
│  │ • shipper               │           │ • last_free_day             │ │
│  │ • created_at            │           │ • last_return_day           │ │
│  │ • updated_at            │           │ • rail_last_free_day        │ │
│  └─────────────────────────┘           │ • rail_last_return_day      │ │
│                                        │ • demurrage_fee             │ │
│                                        │ • detention_fee               │ │
│                                        │ • is_archived               │ │
│                                        │ • shipment_tags[]           │ │
│                                        │ • eta                       │ │
│                                        └──────┬──────────────────────┘ │
│                                               │                         │
│                          ┌──────────────────────┘                         │
│                          │                                              │
│                          ▼                                              │
│               ┌─────────────────────────────┐                          │
│               │   GravitasContainerEvent    │                          │
│               │  (gravitas_container_events)│                          │
│               │                             │                          │
│               │ • id (UUID PK)              │                          │
│               │ • container_id (FK)           │                          │
│               │ • code                      │                          │
│               │ • name                      │                          │
│               │ • actual_time               │                          │
│               │ • estimate_time             │                          │
│               │ • location                  │                          │
│               │ • location_code             │                          │
│               │ • transport_mode            │                          │
│               │ • location_role             │                          │
│               │ • location_terminal_name  │                          │
│               └─────────────────────────────┘                          │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

Model Details

Legacy TAI-Based Models

ShipmentTai — TAI Shipments

Source table for shipments ingested from the TAI TMS webhook.

ColumnTypeDescription
reference_numberTextTAI shipment ID (primary identifier).
master_bill_of_ladingTextMBL number linking to ocean tracking.
shipper / consigneeTextTrade party names.
carrier / scac_codeTextCarrier identity.
office_nameTextAssigned operations office.
sales_rep_namesText[]Array of assigned sales reps.
carrier_repTextAssigned carrier representative.
statusTextWorkflow status (planned, active, etc.).
sourceTextOrigin system (tai, user).

Container — Container Tracking

The central tracking entity, linked to both TAI and Cargoes Flow data.

ColumnTypeDescription
container_numberString(20)ISO container number.
mbl_numberString(100)Master Bill of Lading.
shipment_numberString(50)Cargoes Flow shipment reference (TS-xxx).
statusString(50)Tracking status from Cargoes Flow.
pod_terminalString(50)Terminal name (set by scraper).
terminal_statusString(50)available or not-available (set by scraper).
last_free_dayDateTimeLFD date (set by scraper).
is_archivedBooleanWhether the container cycle is complete.

Gravitas Models (New)

GravitasShipment — CSV Import Source

Stores raw shipment data imported from CSV files for Gravitas entity operations.

ColumnTypeDescription
idUUIDPrimary key, auto-generated.
file_noString(100)Internal file reference number.
mbl_numberString(100)Master Bill of Lading (indexed for lookup).
officeString(100)Operating office (defaults to "Gravitas").
consigneeString(200)Consignee name from CSV.
oversea_agentString(200)Overseas agent name.
container_numberString(255)Primary container number (optional).
shipperString(200)Shipper name.
created_at / updated_atDateTimeAudit timestamps.

Key Features:

  • Uniqueness based on mbl_number (upsert behavior on import)
  • One-to-many relationship with GravitasContainer
  • CSV import via GravitasService.import_csv()

GravitasContainer — Gravitas Container Tracking

Mirrors the legacy Container model but for Gravitas-specific operations. Includes additional fields for rail shipments and fee tracking.

ColumnTypeDescription
idUUIDPrimary key.
gravitas_shipment_idUUIDForeign key to gravitas_shipments.
container_numberString(20)ISO container number (indexed).
mbl_numberString(100)Master Bill of Lading (indexed).
statusString(50)Container status.
pod_terminalString(50)Terminal name (from scraper).
terminal_statusString(50)Availability status.
last_free_dayDateTimeLast Free Day (from scraper).
last_return_dayDateTimeLast Return Day (from scraper).
rail_last_free_dayDateTimeRail-specific LFD.
rail_last_return_dayDateTimeRail-specific LRD.
demurrage_feeNumeric(10,2)Calculated demurrage fees.
detention_feeNumeric(10,2)Calculated detention fees.
daily_fee_rateNumeric(10,2)Daily rate for fee calculations (default $150).
shipment_tagsString[]Auto-generated tags: LFD, LRD, POD awaiting, etc.
is_archivedBooleanArchive status.
etaDateTimeEstimated arrival time.

Computed Properties:

PropertyLogic
is_pod_awaitingDischarged at destination, no full gate-out yet.
is_pod_full_outContainer picked up full from port.
is_completedEmpty gate-in recorded or status = completed/outdated.
is_lfd_neededAwaiting at port but missing LFD.
is_lrd_neededGated out full but missing LRD.
needs_manual_alert_inputMissing fees after discharge/arrival.
is_rail_shipmentHas rail dates or rail tracking events.
is_in_transitActive shipment, hasn't arrived at destination.
is_pod_awaiting_full_out_railDischarged from rail, not yet picked up.

GravitasContainerEvent — Event Timeline

Tracks each milestone in a Gravitas container's journey (from Cargoes Flow API).

ColumnTypeDescription
idUUIDPrimary key.
container_idUUIDForeign key to gravitas_containers.
codeString(100)Event type code (e.g., dischargeFromVessel).
nameString(200)Human-readable event name.
actual_timeString(100)When event occurred.
estimate_timeString(100)Estimated event time.
locationString(200)Port/facility name.
location_codeString(50)Location code.
transport_modeString(100)Mode of transport (vessel, rail, truck).
location_roleString(100)Role in shipment (originPort, destinationPort, etc.).
location_terminal_nameString(200)Terminal name.
carrier_event_nameString(200)Carrier-specific event description.

Migrations

We use Alembic to manage schema evolution.

Generate a migration

bash
alembic revision --autogenerate -m "Add gravitas_containers table"

Apply migrations

bash
alembic upgrade head

IMPORTANT

In Docker, prefix commands with docker exec -it <container_name>.


Seeding

Initialize default admin and operations users:

bash
python seed_users.py

FreightFlow Platform Documentation