From ebe42949a8f66e2d9c18a2129f329e35840d4dcf Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2026 15:11:34 +0000 Subject: [PATCH] docs: add August 10, 2026 changelog entry --- docs/updates/home.mdx | 115 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/docs/updates/home.mdx b/docs/updates/home.mdx index 8bed1aa5..4f6dbd0b 100644 --- a/docs/updates/home.mdx +++ b/docs/updates/home.mdx @@ -10,6 +10,121 @@ rss: true This page contains updates to **Terminal49 API** and **DataSync** only (not general product updates). + + ### New Delivery Order workflow + + A new **Delivery Order** experience lets you draft a DO, choose destinations from your party network, send it to the dray carrier, and follow the carrier's response through a public review link — no more sending PDFs by email and chasing acknowledgements. + + - **Draft, edit, and send** — build a DO from the pickup triage view, pick a destination and contacts from the party network, and send it to the assigned dray carrier + - **Public review link** — carriers open a shareable link (no login), see the container list, and accept or push back with notes; state moves through a machine (draft → sent → accepted / declined) and expires on its own if left unanswered + - **View from the container** — the container modal and pickup triage row now surface a **View DO** action once a delivery order exists, opening the same draft view for review or resend + + + View the container resource + + + --- + + ### New OOCL and Georgia Ports Authority integrations + + - **OOCL / OOLU via CargoSmart SCCT** — the OOLU tracker now runs against the CargoSmart Shipment Connect (SCCT) JSON API. Container, booking, and B/L lookups all flow through the shared adapter, with better handling for multiline booking numbers, transshipments, and rail-to-inland moves. Customs holds and container events keep populating as before + - **Georgia Ports Authority (GPA) Savannah API** — a native API tracker for the Port of Savannah (USSAV) covering canonical container states, available-for-pickup, and vessel discharge + + --- + + ### Redesigned POD Last Free Day cell + + The **Smart LFD** column has been replaced with a **POD LFD** cell that reads at a glance: + + - **Date-first layout with source chips** — the date sits on the left, followed by monochrome one-letter chips for each source (**S** for the shipping line, **T** for the terminal) and an inline qualifier (**Est.** for calculated, **Manual** for user-entered). When the sources agree, one date and both chips render; when they diverge, both dates show with the binding (earlier) date first + - **Restrained coloring** — red only after the deadline has passed with no pickup seen, grey once picked up, plain otherwise. The old "approaching" highlight is retired + - **Clearer empty states** — the cell reads **Not discharged** before free time starts, and **+ Add LFD** once discharged with nothing reported + - **Detail panel** — clicking the cell opens a coverage breakdown per source, and the shipment page shows POD and IND deadlines together + - **Sortable Smart LFD** — the column now sorts (and exports) instead of silently ignoring the header click; non-opted accounts sort by reported values only + + Calculated LFDs are now computed for every account, but only **displayed** to accounts opted into Smart LFD. Inland (IND) LFDs remain gated behind `smart_lfd_ind` because reliable inland calendars are not yet available for every location. Customer-entered LFDs are now reported as a **manual** selection so cells can label them as such. + + + Container resource with LFD fields + + + --- + + ### Wider carrier release status coverage + + Release-status parsing has been added to more steamship trackers so the `release_statuses` on containers reflects what the carrier actually reports: + + - **COSU / Cosco** — customs and freight release now surfaced + - **HDMU / Hyundai (mobile)** — customs, freight, terminal, and line release parsed + - **MATS / Matson (mobile and shared)** — customs and freight release parsed + - **ONEY / ONE** — customs, freight, and terminal release parsed + - **YMLU / Yang Ming (API and web)** — customs, freight, terminal, and line release parsed + + + How to work with holds and release data + + + --- + + ### Terminal holds v2 rollout continues + + Terminal-line holds are now routed through the shared holds v2 pipeline across APM, APM Miami, eModal, GCT Canada, Navis, Ports America, Savannah, SSA Marine, Tideworks, TMS, TMS API, and Voyager Track. Alongside the routing: + + - **Backfill of active facility holds** — a one-shot task reconciles the current active-holds state from the last terminal update so no in-flight holds are lost during migration + - **Admin toggle for holds v2** — the account edit view carries a `holds_v2` toggle for controlled enablement + - **Terminal-published hold gates** parsed and attributed + - **Attributable terminal hold releases** emitted with the terminal named as the release source + - **Source wording preserved as `detail`** — each hold source's own phrasing (carrier note, terminal note) is exposed as `detail`, alongside the normalized type + + --- + + ### Dashboard and admin updates + + - **Dray Carrier on the expanded container row** — the expanded container row on the shipment page now shows the container's dray carrier with inline **+ Assign**, **Change carrier**, and **Remove assignment**. Reads and writes share the same store as the shipment sidebar + - **"Pickup Dray Carrier" renamed to "Dray Carrier"** — the label is now consistent across the container dashboard column, the bulk-upload field, filters, and CSV exports. Role keys, API attributes, and query params are unchanged + - **Complete Plan available in admin contracts** — the subscription plan dropdown in the admin contract form now offers **Complete**, alongside Essential and Lite + - **Party contact and location editor in the side panel** — the new parties side panel exposes account-scoped party contacts and locations with a full edit view + - **Admin container delete from a B/L restored** — Terminal49 admins can again remove an individual container from a shipment's B/L, with a confirmation dialog naming the container and the B/L. The action is gated behind a new admin-only policy on `DELETE /v2/containers/:id` + - **Terminal49 accounts can read container terminal history** — `/v2/containers/:id/container_updates` no longer 404s for Terminal49 staff viewing a customer's shipment, so the Terminal history tab renders for support and engineering + + --- + + ### Customer moves to the party model + + `PartyRole(role: "customer")` is now the source of truth for a shipment's or tracking request's customer. The legacy `customer_id` column is frozen and every write path now writes a party role instead. For API and dashboard users: + + - **New customers can be unbacked parties** — creating a customer no longer implicitly creates a shipper Account; unbacked customers are exposed under their party id (customers backed by an existing account keep exposing their account id) + - **Customer id inputs accept both id kinds** — tracking-request create, shipment update, bulk add, and merge accept either a party id or an account id and resolve to the right customer role + - **Customer dropdown is stable across reloads** — dashboards read customers through the parties endpoint so unbacked customers stay visible after refresh + + + Attach customers to shipments + + + --- + + ### Bug fixes + + - **CMA CGM barge events restored** — the actual barge arrival and departure event codes (`ABA` / `ABD`) are now mapped to feeder arrival and departure. Previously the actuals were unmapped and the planned twins (`PBA` / `PBD`) were dropped when the actuals landed, so river-port origins like Phnom Penh reported no departure at all. `pol_atd_at` and `pol_etd_at` now populate for these shipments + - **CMA CGM POL resolved from the transport call** — the port of lading now reads from the `DEPA`/`POL` transport call rather than a vessel-departed event that might be dropped for a missing timestamp. Downstream fields (`empty_out_at`, `pol_full_in_at`, `pol_vessel_loaded_at`, `pol_vessel_departed_at`) populate again + - **YMLU last free days placed by carrier label** — Yang Ming's terminal and ramp LFDs now attach to the POD or the inland destination based on the block's label ("Terminal Last Free Date" / "Ramp Last Free Date"), instead of being geocoded from a facility string that regularly parsed to the wrong port. Both deadlines are captured when a shipment discharges at one location and rails to another + - **Maersk payloads without a `containers` key** — Maersk (MAEU/SEAU/SAFM/SEJJ) tracking responses that omit the equipment list no longer crash the transformer. The shipment update proceeds even when the carrier has not yet assigned containers + - **Maersk locations resolve by city + state** — Maersk event locations now carry their state so city matching resolves correctly instead of colliding with same-named cities elsewhere + - **Full In / Empty Out stamped away from the POL** — `pol_full_in_at` and `empty_out_at` are now stamped wherever the container gates in, including inland depots and ICDs. The POL-only gate cost roughly 63,000 previously eligible events per month + - **Exact locode beats a fuzzy city guess** — location matching now resolves an explicit locode before falling back to a city string. Carriers naming metro-area locodes (like `THLKR` "Lat Krabang") no longer resolve 130 km away + - **Locode aliases apply to inland locations** — curated aliases such as `CAYEG` and `USMCI` now resolve on inland rail and airport-adjacent locations, not just seaports + - **Cplus CSX terminal code mapped to DP World Hong Kong (CT3)** — the legacy CSX prefix from the Hutchison Cplus feed no longer warns and now maps to the current DP World Hong Kong CT3 terminal + - **TraPac LA future-dated updates dropped** — TraPac LA terminal updates timestamped in the future are now discarded instead of overwriting current state + - **HMM container lookups no longer crash on invalid numbers** — unrecognized HMM container numbers are now classified as awaiting-manifest (matching the B/L path) rather than raising in the tracker + - **GCT Canada `!NOBLIMPORT` hold** — the Deltaport `!NOBLIMPORT` token is now recognized as an "other" hold with a friendlier description instead of surfacing the raw token and Sentry-ing every scrape + - **Goport batches survive per-container failures** — a single container's failed moves lookup no longer aborts the whole scrape; the rest of the batch reports normally and the failing container is retried + - **Goport tolerates non-JSON portal responses** — an expired-session HTML login page (returned under HTTP 200) is now caught and treated as a transient portal error instead of a critical unknown exception + - **HTTPI SSL and timeout errors classified as transient** — Hapag-Lloyd SOAP lookups that hit an SSL or timeout error are now marked `FAILED_REASON_UNREACHABLE` and retried, rather than surfacing as `FAILED_REASON_BAD_RESPONSE` + - **GO! Port password expiry named** — SCSPA terminals (GO! Port) now surface a `password_expired` credential error when the portal returns `pwdChangeRequired`, instead of a generic HTTP 403 + - **OOLU CFFI resilience** — CargoSmart scrape failures are classified accurately, and Cloudflare ticket challenges retry rather than failing the run + + + ### New Livorno terminal integration