4767 Commits

Author SHA1 Message Date
Nathnael
4a4d3077d7 feat: Stripe-style filter bar for freight backoffice (pilot: contracts)
Replace the ad-hoc filter controls with a URL-linkable pill filter bar:
each filter is a pill that opens a type-aware popover (text/enum/date/
number/boolean, each with the right operator set), overflow filters live
behind a searchable "More filters" menu, sorting is a separate control,
and filter state round-trips through the URL query string (shareable,
back/forward-safe, backward compatible with existing ?statuses=A,B links).

Frontend (apps/edr-freight-web/backoffice/src/components/filters/):
- FilterDef schema + a pure url.ts codec (parse/serialize/toApiParams),
  with a 24-case round-trip + malformed-input test suite
- useFilters hook driving react-query params straight from useSearchParams,
  debounced search, saved views in localStorage (@mantine/hooks
  useLocalStorage), page-reset-on-filter-change baked into one
  setSearchParams call instead of a separate effect
- FilterBar/FilterPill/OperatorSelect/MoreFiltersMenu/SortControl +
  per-type popover bodies (Mantine)
- ContractRequestsPage migrated end to end as the pilot

Backend (apps/edr-freight-api):
- pagination.util: applySort() — whitelisted sortBy resolved against a
  per-module column map (never interpolated), with a mandatory `id ASC`
  tiebreaker so paginating a non-unique sort can't drop/duplicate rows
- facets.util: computeFacets() — one GROUP BY per enum column, each
  omitting its own predicate, so picking a value doesn't hide its siblings
- contracts/bookings: list-summary now returns real filter-scoped facet
  counts (contracts' getStatusCounts was unfiltered/global; superseded)
- deleted drivers/vehicles findAllWithFilters — dead code that
  interpolated an unwhitelisted sortBy straight into orderBy()
- migration: missing bookings(status)/wagons(status) indexes +
  (created_at DESC, id ASC) partials on the hot list tables

UI polish pass: inactive pill uses the opaque "default" variant instead
of a faint tinted outline, active pill uses "light" not "filled", larger
X hit target, applied filters sort first, sort control separated behind
a divider on the right and wraps independently from the filter row,
popover option rows are fully clickable (count moved inside the native
label) with bigger hit area and font, fixed a real date-filter bug where
the calendar's own portal falsely registered as an "outside click" and
closed the popover, and fixed a timezone bug where bare YYYY-MM-DD
strings were parsed as UTC instead of local time (shifts a day for EAT).

Not in this commit: rollout to the other ~59 list pages, the Ethiopian-
calendar DateBody branch, and the Family-B (client-side) bridge mode —
tracked in the filter-bar plan.
2026-08-14 13:18:46 +00:00
Hagernesh Tadesse
60f0824fd3 Merge pull request #1291 from Tria-plc/eims-integration
feat(train-scheduling): show loaded empties on the marshalling document
2026-08-14 14:39:22 +03:00
Hagernesh
1adc19baef feat(train-scheduling): show loaded empties on the marshalling document
Empty containers loaded onto an export departure carry no booking and no
wagon allocation, so their wagons printed as EMPTY — no cargo allocated —
staff checking the paper against the consist found boxes the list denied.
Those wagons now print the container numbers with cargo type EMPTY
CONTAINER, count toward the 40ft/20ft tallies, and get their own summary
tile; only genuinely bare wagons keep the empty wording.
2026-08-14 11:30:25 +00:00
Hagernesh Tadesse
4a836428c0 Merge pull request #1290 from Tria-plc/eims-integration
feat(train-scheduling): load returned empties onto an export train
2026-08-14 14:18:31 +03:00
Hagernesh
b4f2ec1c75 feat(train-scheduling): load returned empties onto an export train
Empties had no way onto a departure: the return record could name a train
but nothing seated it on a wagon. Export schedules now expose a loading
action that packs selected returns onto free wagons at one 40ft or two 20ft
each, enforced both in the picker and in the API (existing empties on the
schedule count against their wagon).

Adds container_size, train_schedule_id and wagon_sequence_no to
freight.empty_container_returns.
2026-08-14 09:57:50 +00:00
Hagernesh Tadesse
30c3567048 Merge pull request #1289 from Tria-plc/eims-integration
feat(warehouses): pick export train when allocating empty return to w…
2026-08-14 11:25:39 +03:00
Hagernesh
daee3eac0e feat(warehouses): pick export train when allocating empty return to wagon
Advancing an empty container return to WAGON_ALLOCATED opened no dialog,
so the wagon_allocation_reference column stayed null and nobody knew which
departure carried the empty. Now the action opens a picker of scheduled
EXPORT trains (DRAFT/SCHEDULED) and records the selection.
2026-08-14 08:17:35 +00:00
Hagernesh Tadesse
48762dccd1 Merge pull request #1288 from Tria-plc/eims-integration
feat(billing): add PNR row to freight invoice from booking payment re…
2026-08-14 10:28:06 +03:00
Hagernesh
41f480554c feat(billing): add PNR row to freight invoice from booking payment reference
PNR isn't a column on Invoice/Payment — it's written onto Booking.pnrCode
when a CBE_BILL payment initiates. toDocumentModel() now looks it up by
invoice.sourceId and adds it to the existing summary grid, shown only
when present.
2026-08-14 07:19:23 +00:00
Nathnael Wondisha
e56e1c3009 Merge pull request #1287 from Tria-plc/freight/nati-2
fix: ui
2026-08-14 10:08:08 +03:00
Nathnael
ab5a4117df fix: ui 2026-08-14 07:04:57 +00:00
mulish77
3bfff77bfb Merge pull request #1286 from Tria-plc/dev
Dev to Staging for demo purpose
2026-08-14 08:44:44 +03:00
robiman
a33494a3ae Fix price on voucher
Fix price on voucher
2026-08-14 08:25:12 +03:00
Roba Boru
f3ac818d58 Merge branch 'main' of https://github.com/Tria-plc/edr-platform into feature/report 2026-08-14 08:23:45 +03:00
Roba Boru
f41402422b Merge branch 'dev' of https://github.com/Tria-plc/edr-platform into feature/report 2026-08-14 08:23:17 +03:00
Roba Boru
aa850146dc Fix price on voucher 2026-08-14 08:22:50 +03:00
Abubeker Yasin
1a1e985d7f Merge pull request #1284 from Tria-plc/staging
Staging
2026-08-13 23:46:16 +03:00
Abubeker Yasin
ec52f15039 Merge pull request #1283 from Tria-plc/dev
merge dev to staging
2026-08-13 23:33:15 +03:00
Abubeker Yasin
62bb190752 Merge pull request #1282 from Tria-plc/alpha
feat: ( dashboard ) add booking charts
2026-08-13 23:32:25 +03:00
Abubeker Yasin
449dea78ab feat: ( dashboard ) add booking charts 2026-08-13 23:31:20 +03:00
robiman
cdc9db77ae Updated financial report and exclude fayda for Ethiopian when origin is outside of Ethiopia 2026-08-13 22:50:41 +03:00
Roba Boru
1f0d3d3a22 Merge branch 'dev' of https://github.com/Tria-plc/edr-platform into feature/report 2026-08-13 22:48:00 +03:00
Roba Boru
376c23a0ad Updated financial report and sms outside of Ethiopia 2026-08-13 22:47:22 +03:00
Nathnael Wondisha
553524ee56 Merge pull request #1280 from Tria-plc/freight/nati-2
Freight/nati 2
2026-08-13 22:16:04 +03:00
Nathnael
6cee9a2676 fix:contract page 2026-08-13 19:13:18 +00:00
marshal
e17df57a37 Merge pull request #1279 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-08-13 21:58:33 +03:00
Marshal
b9ba830a09 shipping line 2026-08-13 18:56:52 +00:00
Nathnael
147887b7c5 feat: dashbaord overview 2026-08-13 18:13:42 +00:00
Marshal
0e00a98ef3 feat: implement shipping line booking completion functionality
- Added ShippingLineBookingCompletionController and associated service to handle the completion of shipping line bookings.
- Introduced a new module for booking completion to maintain module separation and avoid cyclic dependencies.
- Updated the train scheduling global rules to set default desk hours to 24 hours.
- Modified existing services and entities to accommodate the new booking completion logic.
- Enhanced the front-end components to support the new booking completion flow, including updates to the booking detail and bookings pages.
- Implemented validation and error handling for booking completion, ensuring that only approved bookings can be completed.
- Added migration to set default desk hours in the database.
2026-08-13 15:10:27 +00:00
Marshal
5837ac7b6e Merge branch 'dev' 2026-08-13 14:14:31 +00:00
Nathnael Wondisha
df2faa1ee9 Merge pull request #1278 from Tria-plc/freight/nati-2
Freight/nati 2
2026-08-13 16:50:04 +03:00
Nathnael
89cdc0ad06 style: ui fixes 2026-08-13 13:46:46 +00:00
Roba Boru
f5a19a705a Merge branch 'main' of https://github.com/Tria-plc/edr-platform into feature/report 2026-08-13 16:36:29 +03:00
Abubeker Yasin
be7ea17841 Merge pull request #1277 from Tria-plc/alpha
feat: ( reports ) add fleet passenger overview to passengers landing …
2026-08-13 16:21:47 +03:00
Abubeker Yasin
62b2080aaf feat: ( reports ) add fleet passenger overview to passengers landing page 2026-08-13 16:20:21 +03:00
marshalyordanos
9fff469ffa feat: implement shipping line bookings management
- Add ShippingLineBookingsPage for listing and managing shipping line bookings.
- Create ShippingLineDocumentsModal for document uploads related to bookings.
- Introduce ShippingLineInitiateModal for initiating new shipping line bookings.
- Implement booking document state management with booking-doc-state utility.
- Add shipping line bookings service for API interactions.
- Update index to export new components and services.
- Enhance types for freight to include shipping line credits.
2026-08-13 15:54:40 +03:00
Nathnael
0df4be1820 style: overview revamp 2026-08-13 12:44:06 +00:00
Abubeker Yasin
2bb8d96eeb Merge pull request #1276 from Tria-plc/alpha
feat: ( reports ) add fleet seat overview to seat status landing page
2026-08-13 15:34:25 +03:00
Abubeker Yasin
aabf58320a feat: ( reports ) add fleet seat overview to seat status landing page 2026-08-13 15:32:56 +03:00
Hagernesh Tadesse
c3c27d9fcf Merge pull request #1274 from Tria-plc/eims-integration
fix(warehouses): free warehouse/yard/zone capacity on export dispatch
2026-08-13 15:05:24 +03:00
Nathnael Wondisha
adf28bd47b Merge pull request #1273 from Tria-plc/freight/nati-2
Freight/nati 2
2026-08-13 14:41:41 +03:00
Nathnael
3190b9bd38 Merge branch 'dev' into freight/nati-2 2026-08-13 11:34:57 +00:00
Hagernesh
6c96b7ad94 fix(warehouses): free warehouse/yard/zone capacity on export dispatch
dispatch() (LOADED -> DISPATCHED) routed through the shared transition()
helper, which only flipped status/timestamp and never called
applyCapacityDelta. deliver() (import pickup) already decrements
correctly, so export cargo leaving by train inflated currentWeight/
currentVolume/currentContainers forever instead of freeing capacity.

Add optional freeCapacity hook to transition(), wire dispatch() to it,
mirroring the negative-delta pattern already used in deliver().
2026-08-13 11:27:56 +00:00
Nathnael
86d69a9577 chore: group invoices, payments and usd payments 2026-08-13 11:22:45 +00:00
Hagernesh Tadesse
1088b47029 Merge pull request #1272 from Tria-plc/eims-integration
feat(freight): add company logo setting applied to every generated do…
2026-08-13 13:56:45 +03:00
Hagernesh
c4bf3c9479 feat(freight): add company logo setting applied to every generated document
New logo-settings module (mirrors stamp-settings): single uploaded logo,
stored via FilesService/MinIO, injected as a data URL into invoice/receipt,
contract, warehouse, train-scheduling, and payment-receipt PDFs. Adds a
matching backoffice settings page and settings:logo:view/manage permissions.

>
2026-08-13 10:54:23 +00:00
Hagernesh Tadesse
63b40ea4f8 Merge pull request #1271 from Tria-plc/eims-integration
Eims integration

feat(lastmile): reference stored LM contract from booking detail
2026-08-13 13:18:16 +03:00
Hagernesh
e66e622ede eims cancellation 2026-08-13 09:58:04 +00:00
Hagernesh
89dba01cd7 feat(train-scheduling): notify customer of CAS on direct-to-train load
Direct truck-to-train export cargo skips the warehouse, so the existing
carriage acceptance sheet ready notice (fired on warehouse receive)
never reached these bookings. Their handover moment is the load itself.

Extract notifyCarriageAcceptanceReady into a shared notifications util
(was private to WarehouseInventoryService) and call it from
BookingJourneyService.loadBooking for EXPORT + DIRECT_TO_TRAIN bookings,
right after the GRN gate, before the load transaction proceeds.
2026-08-13 09:58:04 +00:00
Abubeker Yasin
f78a19befb Merge pull request #1270 from Tria-plc/dev
Merge dev to staging
2026-08-13 12:30:07 +03:00