| Urg. | Shipment ID | Fecha ↕ | Trans | Empresa | Cliente | Operador ↕ | Status ↕ | Fechas |
|---|---|---|---|---|---|---|---|---|
Cargando... | ||||||||
| Urg. | Shipment ID | Fecha ↕ | Trans | Empresa | Cliente | Operador ↕ | Status ↕ | Fechas |
|---|---|---|---|---|---|---|---|---|
Cargando... | ||||||||
The dashboard operations keeps open all day. It cross-references every shipment against its receivables and payables, and sorts the work by how far past the closing target it already is.
Before this, knowing which shipments were stuck meant opening CargoWise one shipment at a time. The dashboard answers four questions that used to get asked by hand every day:
This is also where data gets written back: every shipment accepts notes with an author and a history, and there's a switch that freezes the risk zone's count during month-end close — it turns itself off on the 1st, so no one has to remember.
The dashboard consumes four read webhooks — shipments, receivables,
payables, and transport bookings — and two write endpoints, for
notes and for the billing pause. The join between invoices and
shipments happens in the browser with a Map keyed by job
number, not in SQL: that keeps the webhook contract flat and stable for
every dashboard that consumes it.
There's an enrichment step that isn't cosmetic: when a movement is booked through a transport booking, CargoWise leaves the shipment's actual dates empty. The dashboard fills them in from the linked booking, and without that a ground shipment already delivered would show up as "not delivered."
The committed delivery date comes back empty for 100% of the table: it simply doesn't exist in the ERP. That's why the target is measured against the actual delivery plus six days instead of a made-up promise.
false reverts to the previous behavior without touching
anything else.build.py assembles them into a self-contained HTML file
that gets deployed to the internal portal.
It's the same file that runs in production: not a single line of logic
was touched. The only thing that changes is where the data comes from
— fetch is intercepted and answered the way the
webhook would, with a deterministic generator. The filters, the
calculations, and the loading states are the real ones; the generator
deliberately reproduces even the quirks of the real feed.
What's described here is the real system in production. This page is a portfolio replica: same interface and same logic, with the data layer swapped for a made-up data generator. It contains no client data, credentials, or internal addresses. · Back to the portfolio