Commit Graph

4787 Commits

Author SHA1 Message Date
Hagernesh Tadesse
08c6f2ed0b Merge pull request #1362 from Tria-plc/eims-bulk-register
feat(warehouses): add empty-containers/import-trains/export-trains to…
2026-08-20 13:52:27 +03:00
Hagernesh
0066a87972 feat(warehouses): add empty-containers/import-trains/export-trains to dashboard
Extends the warehouse dashboard with 3 metrics the screenshot target
needed but the backend didn't expose: emptyContainers (AVAILABLE
containers — closest proxy, no literal EMPTY status exists),
importTrains (reuses the import arrival queue definition), and
exportTrains (reuses the Djibouti export arrival queue definition) via
SchedulingReadFacade. Reorders the frontend metric grid to match and
fixes the Empty Containers card linking to a route that doesn't exist.
2026-08-20 10:46:42 +00:00
Hagernesh Tadesse
224954060e Merge pull request #1361 from Tria-plc/eims-bulk-register
Feat warehouse
2026-08-20 13:35:52 +03:00
Hagernesh
f9987e515c feat(warehouses): filters/pagination on all import+export queue tabs
Extends the stat-tile/filter/pagination pattern from the import arrival
queue to every remaining import and export tab (unloaded, eligible,
received, ready-to-load, loaded/dispatch, locate-booking), reusing
useListControls/ListControls/RuleEngineListFooter throughout. Adds a
5-tile stat row to the export tab bar and renames ImportStatCard to
WarehouseStatCard now that it's shared by both directions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 10:29:59 +00:00
Hagernesh
d4c51ec63a feat(warehouses): add import-ops stat tiles and arrival-queue filters
Adds Arrived/Unloaded/Dispatch Ready/Total Bookings stat tiles above the
import queue tabs, wires search+date filters and pagination into the
arrival queue table (reusing useListControls/ListControls/
RuleEngineListFooter already used by Inventory Inquiry), and adds a
copy-to-clipboard action on the truncated schedule ID.
2026-08-20 10:29:59 +00:00
Abubeker Yasin
2f35b0a717 fix: ( passenger ) read permissions from position types and all positions 2026-08-20 10:29:59 +00:00
Marshal
bcf684814d fix(clearance): flag bookings with documents still awaiting GL approval 2026-08-20 10:29:59 +00:00
Marshal
21a611f1b7 fix(portal): surface document upload on cleared bookings until payment 2026-08-20 10:29:59 +00:00
Marshal
26d864a55e View manual (offline) payment channel settings
Confirm offline (bank transfer) invoice payment
2026-08-20 10:29:59 +00:00
Marshal
c889797870 feat(bookings): two-level clearance charges (port + misc) billed to customer with invoices 2026-08-20 10:29:59 +00:00
Marshal
a809215e74 feat(bookings): two-level clearance charges (port + misc) billed to customer with invoices 2026-08-20 10:29:58 +00:00
Marshal
87ae075031 fix issue 2026-08-20 10:29:58 +00:00
Stephanos A
6adfd10bc9 feat: add seat conflict assertion for route bookings 2026-08-20 10:29:58 +00:00
Marshal
1ba54829df feat(bookings): show per-document upload/review audit and download icon on clearance detail 2026-08-20 10:29:58 +00:00
Marshal
8eb3099694 feat(bookings): show per-document upload/review audit and download icon on clearance detail 2026-08-20 10:29:58 +00:00
Marshal
e97766c135 Implement new feature for user authentication and improve error handling 2026-08-20 10:29:58 +00:00
Abubeker Yasin
369f37e46b Merge pull request #1360 from Tria-plc/alpha
Alpha
2026-08-20 12:34:35 +03:00
Abubeker Yasin
e174efb8e0 fix: ( passenger ) read permissions from position types and all positions 2026-08-20 12:33:39 +03:00
marshal
f1b6444489 Merge pull request #1359 from Tria-plc/freight_feature/usermanagement
fix(clearance): flag bookings with documents still awaiting GL approval
2026-08-20 10:39:05 +03:00
Marshal
ca774c536f fix(clearance): flag bookings with documents still awaiting GL approval 2026-08-20 07:37:35 +00:00
marshal
bd94dd7306 Merge pull request #1358 from Tria-plc/freight_feature/usermanagement
fix(portal): surface document upload on cleared bookings until payment
2026-08-20 10:17:23 +03:00
Marshal
e41ce2ed6c fix(portal): surface document upload on cleared bookings until payment 2026-08-20 07:16:18 +00:00
marshal
ead4f0a293 Merge pull request #1357 from Tria-plc/freight_feature/usermanagement
View manual (offline) payment channel settings
2026-08-20 09:59:00 +03:00
Marshal
4b07ff328d View manual (offline) payment channel settings
Confirm offline (bank transfer) invoice payment
2026-08-20 06:57:57 +00:00
marshal
d4bc419d43 Merge pull request #1356 from Tria-plc/freight_feature/usermanagement
feat(bookings): two-level clearance charges (port + misc) billed to c…
2026-08-20 08:49:26 +03:00
Marshal
c38fcff00d feat(bookings): two-level clearance charges (port + misc) billed to customer with invoices 2026-08-20 05:48:16 +00:00
Abubeker Yasin
a00606823e Merge pull request #1355 from Tria-plc/dev
Merge dev to alpha
2026-08-20 08:45:14 +03:00
marshal
d04f35539a Merge pull request #1354 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-08-20 08:28:12 +03:00
Marshal
c138da6137 feat(bookings): two-level clearance charges (port + misc) billed to customer with invoices 2026-08-20 05:24:57 +00:00
Stephanos A.
c52b9229c4 Merge pull request #1353 from Tria-plc/alpha
Alpha
2026-08-20 07:57:24 +03:00
Stephanos A
5d6a21b6be Merge branch 'alpha' of github.com:Tria-plc/edr-platform into alpha 2026-08-20 07:46:33 +03:00
Stephanos A
f93b3cd993 feat: add seat conflict assertion for route bookings 2026-08-20 07:46:15 +03:00
Marshal
4adb53b486 fix issue 2026-08-20 04:27:16 +00:00
marshal
e2d32defc0 Merge pull request #1352 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-08-20 07:04:21 +03:00
Marshal
a58157a7ee feat(bookings): show per-document upload/review audit and download icon on clearance detail 2026-08-20 04:03:27 +00:00
Marshal
8a2b9306dc feat(bookings): show per-document upload/review audit and download icon on clearance detail 2026-08-20 03:59:14 +00:00
Hagernesh
fc55f48371 feat(eims): implement POST /v1/bulkRegister
New endpoints:
  POST invoices/eims/bulk-register  { invoiceIds: [...] }  — trigger
  POST eims/webhook/bulk-register                          — MoR's callback

Fundamentally different shape from single register: bulkRegister
answers only {conversationId, status:202} immediately: MoR processes
the array asynchronously and pushes the real per-invoice results
(a mix of accepted/rejected in one array, per the collection's own
examples) to a webhook configured out of band. So this ships as two
halves that don't share a call stack — EimsBulkRegistrationService.
registerBulk() reserves a contiguous block of counters (durable
reservation, same doctrine as single register, extended to N items)
and submits; handleBulkCallback(), invoked by the new
EimsWebhookController whenever MoR gets around to it, settles.

New EimsSystemState.inFlightConversationId is the bulk equivalent of
inFlightInvoiceId — a whole batch outstanding, not one invoice — and
the two markers block each other since they share the same counter
sequence. The conversation id isn't known until MoR's 202 arrives, so
reservation stamps a locally-generated placeholder first (same
commit-before-the-network-call reasoning as single register), then
swaps it for MoR's real id right after — the only value the callback
can actually use to find the batch again.

Only the first invoice in a bulk batch chains via PreviousIrn — every
other item gets an empty string, matching the collection's own
two-invoice example exactly (MoR doesn't expect a batch to chain to
IRNs that don't exist yet at submission time).

Webhook has no auth (MoR has no JWT to send) — the conversation id
embedded in the payload is what stands between this and a forged
callback: an item only ever touches an invoice actually holding that
exact id, and an unknown id is logged and ignored, never applied.

Migration 3580000000000: eims_system_state.in_flight_conversation_id,
invoices.eims_bulk_conversation_id (tags which batch an invoice was
submitted in, so a stuck batch — webhook never arrived — can be found
and reconciled by conversation id). Applied to dev DB and recorded in
freight.migrations directly (idempotent IF NOT EXISTS DDL).

Not live-testable from this sandbox (no route to MoR's real gateway).
Signing the whole array as one envelope, the way single /v1/register
was confirmed live to need despite the collection's raw example
showing no envelope, is the reasonable extension of that confirmed
behavior, not a blind guess — but it has not itself been exercised
against the real gateway. Left for the first live bulk attempt to
confirm, same as every other MoR-facing assumption this integration
has made.
2026-08-19 18:35:09 +00:00
Marshal
174bc1a7bd Implement new feature for user authentication and improve error handling 2026-08-19 17:07:48 +00:00
Abubeker Yasin
4fcb8d02f4 Merge pull request #1350 from Tria-plc/alpha
fix: ( fayda ) reject a second booking for the same identity on one d…
2026-08-19 15:33:42 +03:00
Abubeker Yasin
014b1a6d47 fix: ( fayda ) reject a second booking for the same identity on one departure 2026-08-19 15:28:10 +03:00
Nathnael Wondisha
8e11b3a168 Merge pull request #1349 from Tria-plc/freight/nati-2
Freight/nati 2
2026-08-19 13:17:07 +03:00
Nathnael
e964a9b8f4 chore: more reporting 2026-08-19 10:14:46 +00:00
Nathnael
54f52f077c fix(page-header): cap title/subtitle width
Title and subtitle grew unbounded, relying only on flex-squeeze from action
buttons to ever truncate. Caps the container at 640px and gives the
subtitle the same truncate treatment the title already had, so a long
page title or description (report descriptions in particular) always
ellipses instead of stretching the header.
2026-08-19 10:12:16 +00:00
Nathnael
6687def4af feat(reports): use the shared FilterBar instead of ReportFilters
Swaps ReportView's bespoke ReportFilters for the same FilterBar/useFilters
combo BookingRequestsPage uses — pills, saved-view-ready state, URL sync.
toFilterDefs() maps the report catalog's own filter vocabulary
(daterange/date/select/multiselect/text) onto FilterDef, matched against
every report definition's backend param handling. The search box only
shows for reports that actually implement `search` server-side, so it's
not a dead control on the rest. ReportFilters.tsx is now dead, removed.
2026-08-19 10:12:03 +00:00
Nathnael
7c56607582 fix(filters): honor a date filter's own operator, not always "between"
DateBody always initialized its op state to DEFAULT_OP.date ("between"),
ignoring a def's `operators` restriction. A single-operator exact-date
filter (e.g. `operators: ["before"]`) opened on the range UI with no way
off it, since OperatorSelect hides itself when there's only one choice.
Default to the def's first allowed operator instead.
2026-08-19 10:11:48 +00:00
marshal
62ff18a301 Merge pull request #1346 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-08-19 13:11:09 +03:00
Marshal
ad479bdcf2 issue fix 2026-08-19 10:10:04 +00:00
Marshal
13f66dfb66 changes 2026-08-19 08:41:51 +00:00
Marshal
f4a654f273 Merge branch 'dev' of github.com:Tria-plc/edr-platform into freight_feature/usermanagement 2026-08-19 06:42:36 +00:00
Marshal
cd1e9c38a7 feat: add new audit endpoints for consolidation approvals and invoice management 2026-08-19 06:42:19 +00:00