Skip to content

Business Workflows

Shipment Lifecycle

1. Creation

User creates shipment
    ↓
Shipment created with status RECEIVED
    ↓
Packages added to shipment (1 or more)
    ↓
If all packages same recipient → Shipment.recipient_id set
If different recipients → Package.recipient_id set per package

2. Bag Assignment

Shipment ready for bagging
    ↓
Operator assigns shipment to bag (BagAssignment)
    ↓
Shipment status → PACKING
    ↓
Courier transports bag to airport
    ↓
Bag status → TO_AIRPORT

3. Flight

Bag on flight
    ↓
Bag status → IN_FLY
    ↓
Flight status tracked via webhook (AeroDataBox)
    ↓
Bag arrives at destination airport
    ↓
Bag status → IN_AIRPORT

4. Delivery

Bag with courier for delivery
    ↓
Bag status → WITH_COURIER
    ↓
Package status updates as delivered
    ↓
Shipment status → DELIVERED

Status Transitions

Shipment Status Values

Status Description Valid Transitions
RECEIVED Just created → PACKING, CANCELLED
PACKING Package(s) assigned to bag → PACKED, TO_AIRPORT
PACKED All packages packed → TO_AIRPORT, RETURNED
TO_AIRPORT In transit to origin airport → IN_FLY
IN_FLY On the flight → IN_AIRPORT
IN_AIRPORT Arrived at destination → WITH_COURIER, IN_WAREHOUSE
WITH_COURIER Courier has the bag → DELIVERED
IN_WAREHOUSE In destination warehouse → WITH_COURIER
CONSOLIDATING Consolidating packages → CONSOLIDATED
CONSOLIDATED Consolidation complete → WITH_COURIER
DELIVERED Completed (terminal)
RETURNED Returned to sender (terminal)

Package Status Values

Status Description
CREATED Registered in system
PACKED In a bag
IN_TRANSIT Moving with courier
DELIVERED Delivered
RETURNED Returned

QR Scan Workflow

Courier scans QR code
    ↓
System validates:
    1. QR format correct (hmac_valid)
    2. QR belongs to tenant (wrong_tenant check)
    3. Package exists (entity_not_found)
    4. Rate limit not exceeded (< 100/hour)
    ↓
If valid → Scan recorded, status updated
If invalid → Error returned, logged

Warehouse Receiving

Shipment arrives at warehouse
    ↓
Operator receives shipment
    ↓
PackageReceivedEvent created
    ↓
Condition checked (good, damaged)
    ↓
If damaged → BagIncidence reported

Flight Alert Subscription

User subscribes to flight updates
    ↓
System registers webhook with AeroDataBox
    ↓
Flight status changes → webhook sent
    ↓
System processes webhook
    ↓
Shipment/bag status updated