Commit Graph

2398 Commits

Author SHA1 Message Date
Hagernesh
ff49554cc2 feat(last-mile): per-truck EDR arrival/exit, exit paper, bulk drawdown, departure notify
EDR last-mile is multi-truck but was modelled as one: setVehicles accepted any
number of trucks with no validation, arrival/delivery were stamped once per
last_mile record (N trucks shared one timestamp), EDR trucks got no exit paper,
and the per-truck EDR handover never happened because deliver() resolved the
plate via last_mile_container_allocations — a table nothing writes.

- Migration 2260000000000: per-truck arrived_at/departed_at/gross_weight_tons/
  net_weight_tons on last_mile_vehicle_assignments, plus a
  last_mile_vehicle_containers child table (a truck holds 1x40ft OR 2x20ft, so
  the single container_number scalar could not express a load). Weights are
  TONNES and named accordingly — the older gross_weight_kg lies about its unit.
- setVehicles: enforce the size rule (one 40ft, or two 20ft), container
  membership, one-container-one-truck, and never more trucks than containers.
  Bulk carries no containers and is instead gated on tonnage remaining.
- Bulk drawdown: remainingTonsForBooking = booking VGM minus the net weighed off
  every departed truck (both tonnes, no conversion), exposed as
  GET /last-mile/booking/:bookingId/remaining-tons.
- release() now stamps the EDR truck's own arrival and exit (matched by plate, so
  it works for bulk too) alongside the existing customer-truck stamp. The exit
  weighing itself is untouched.
- New GET /warehouse-inventory/edr-truck-exit-paper/:assignmentId — per-truck
  exit paper for EDR trucks. Deliberately not signature-gated: EDR handovers are
  generated at delivery, after the truck has left.
- deliver(): resolve the handover plate from the truck's own containers instead
  of the dead allocations table, so EDR handovers are genuinely per-truck.
- Notify the customer (portal inbox + SMS/email) when a truck leaves — one hook
  in release() covers both self-haul and EDR, since it is the single exit path.

Self-haul is intentionally unchanged (one booking-level handover signed once).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 09:24:22 +00:00
Stephanos A.
a85bae1002 Merge pull request #729 from Tria-plc/alpha
Alpha
2026-07-16 12:04:32 +03:00
Stephanos A
2b4eeea8d7 Excess luggage tarif management issue resolution 2026-07-16 12:01:44 +03:00
Nathnael Wondisha
68f6a393a9 Merge pull request #730 from Tria-plc/freight/feat/fixes-v1
Freight/feat/fixes v1
2026-07-16 11:59:01 +03:00
Nathnael
318af79962 feat: setup posthog 2026-07-16 08:52:29 +00:00
Stephanos A
8a77f23701 Merge branch 'alpha' of github.com:Tria-plc/edr-platform into alpha 2026-07-16 11:43:14 +03:00
Stephanos A
a852b4e619 Seats report, supplementary change for bookings added 2026-07-16 11:43:04 +03:00
Nathnael
6dde17fa4d fix: premature payable invoice 2026-07-16 08:38:49 +00:00
Abubeker Yasin
368d01ff34 Merge pull request #727 from Tria-plc/alpha
add permissions
2026-07-16 11:20:16 +03:00
natib21
af57ffdda4 Merge branch 'dev' of github.com:Tria-plc/edr-platform into freight/feature/user_management_UI 2026-07-16 08:13:57 +00:00
natib21
4a04aa7e97 fic 2026-07-16 08:13:22 +00:00
Abubeker Yasin
edbef5ccf2 add permissions 2026-07-16 11:01:31 +03:00
Nathnael Wondisha
2db321b37a Merge pull request #724 from Tria-plc/freight/feat/fixes-v1
Freight/feat/fixes v1
2026-07-16 10:59:36 +03:00
yaschalew10
b6d71ccc57 Merge pull request #723 from Tria-plc/freight/feature/user_management_UI
Freight/feature/user management UI
2026-07-16 10:50:34 +03:00
natib21
9d53552f95 Merge branch 'dev' of github.com:Tria-plc/edr-platform into freight/feature/user_management_UI 2026-07-16 07:48:27 +00:00
natib21
a4b3309412 add seed 2026-07-16 07:43:54 +00:00
Nathnael
5f6d8f9294 fix: cache invalidation 2026-07-16 07:17:22 +00:00
natib21
312014b678 fix first/last mile 2026-07-16 07:13:24 +00:00
Nathnael
08faf56c4f fix: payment autopay on the payment init added for testing 2026-07-16 06:43:30 +00:00
Stephanos A.
bfc8477721 Merge pull request #722 from Tria-plc/alpha
Alpha
2026-07-16 08:47:56 +03:00
Stephanos A
3bc492ea83 Merge branch 'alpha' of github.com:Tria-plc/edr-platform into alpha 2026-07-16 08:41:53 +03:00
Stephanos A
b2b31f30bb Generate ticket, dashboard, excess luggage rate updates 2026-07-16 08:41:35 +03:00
marshal
50d5ce5ad9 Merge pull request #721 from Tria-plc/freight_feature/usermanagement
fix issue
2026-07-16 04:06:52 +03:00
Marshal
fe29b38377 fix issue 2026-07-16 01:05:57 +00:00
marshal
ea22f38adf Merge pull request #720 from Tria-plc/freight_feature/usermanagement
fix issue
2026-07-16 03:34:14 +03:00
Marshal
41fe04652f fix issue 2026-07-16 00:33:31 +00:00
marshal
67bc835458 Merge pull request #719 from Tria-plc/freight_feature/usermanagement
implement empty-container return service: add return quantity handlin…
2026-07-16 02:06:08 +03:00
Marshal
234a74e812 implement empty-container return service: add return quantity handling, update related DTOs, services, and UI components 2026-07-15 22:48:04 +00:00
Abubeker Yasin
70724ac3df Merge pull request #718 from Tria-plc/alpha
Alpha
2026-07-15 23:26:28 +03:00
marshal
e3fccbd24d Merge pull request #717 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-07-15 23:18:55 +03:00
Marshal
fc44eee25e implement update train details feature: add DTO, service method, and UI modal for editing train name and run numbers 2026-07-15 20:14:39 +00:00
Abubeker Yasin
d0a3fb3ca3 Merge branch 'alpha' of github.com:Tria-plc/edr-platform into alpha 2026-07-15 23:14:19 +03:00
Abubeker Yasin
7725b0d5d4 Update payments.service.ts 2026-07-15 23:14:05 +03:00
Roba Boru
230fdfb852 Merge branch 'alpha' of https://github.com/Tria-plc/edr-platform into alpha 2026-07-15 22:03:48 +03:00
Roba Boru
63accc8bd3 Fix booking detail for roundtrip 2026-07-15 22:03:29 +03:00
Abubeker Yasin
458f27c1b1 Merge branch 'alpha' of github.com:Tria-plc/edr-platform into alpha 2026-07-15 21:33:17 +03:00
Roba Boru
be7b829845 Merge branch 'alpha' of https://github.com/Tria-plc/edr-platform into alpha 2026-07-15 21:29:35 +03:00
Roba Boru
f185da2163 Update seatmap for blocked seats 2026-07-15 21:28:35 +03:00
Abubeker Yasin
9cf71e7e7a feat: ( payment ) add waafi webhook log 2026-07-15 21:23:10 +03:00
Stephanos A
2d2fcfbda9 Seat block issue resolution 2026-07-15 21:11:23 +03:00
Abubeker Yasin
2ffb2f9f60 remove auth 2026-07-15 20:05:55 +03:00
Roba Boru
be46744417 Merge branch 'alpha' of https://github.com/Tria-plc/edr-platform into alpha 2026-07-15 19:56:22 +03:00
Stephanos A
8bda06b226 Currency issue resolution 2026-07-15 19:50:32 +03:00
Stephanos A
4343ead1fe Merge branch 'alpha' of github.com:Tria-plc/edr-platform into alpha 2026-07-15 19:18:49 +03:00
Stephanos A
7bbd34f159 Currency issue resolution 2026-07-15 19:18:35 +03:00
Hagernesh
2647776d19 feat(warehouse): stamp actor as display name instead of UUID
Add actorLabel(user) — resolves the authenticated user to a readable name
(name → username → email → id) — and use it for the performed_by audit stamp on
every warehouse action, so the activity log shows a person, not a UUID. The
freight DB has no users table to join, so the name is stamped at write time.
approve-delivery keeps the raw user id (it is an id argument, not the audit
label). Existing rows keep their prior value; this applies going forward.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 15:24:05 +00:00
Hagernesh
2044312d93 feat(warehouse): stamp authenticated user as action actor (performedBy)
Warehouse mutation endpoints now record the JWT-authenticated user as the actor
(user.id) instead of trusting a client-supplied performedBy string, unlocking
per-operator productivity metrics and a trustworthy audit trail. Covers receive,
receive-bulk, reserve, store, ready-for-loading, ready-for-pickup, load-onto-
train, bulk-dispatch, dispatch, deliver, gate-clearance, approve-delivery, the
Djibouti/import auto-unload actions, and fee-invoice generation. The prior
client value is kept only as a fallback for unauthenticated/internal calls.

move/load do not yet carry an actor (their DTOs have no performedBy) — separate
follow-up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 14:51:21 +00:00
Marshal
d7d9db9c3a changes 2026-07-15 14:27:00 +00:00
Hagernesh
ac90b04be0 feat(warehouse): P2 dashboard — gate/dock throughput + live auto-refresh
- gateStats(): items cleared through the gate today, average arrival→gate
  turnaround (hours, 30d), and clearances per hour over the last 24h → new
  GateThroughputCard in the dashboard Performance section.
- Live board: every dashboard query (dashboard, ops, throughput, dwell, cycle,
  on-time, zone occupancy, accrual, gate) now auto-refreshes on a 60s interval,
  with a "Live" indicator in the header.

New endpoint GET /warehouse-inventory/gate-stats (guarded). Deferred (need
upstream data): capacity forecast, labour productivity, WebSocket push, yard map.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 14:26:02 +00:00
Hagernesh
fc4aadbc57 feat(warehouse): P1 dashboard analytics — dwell/aging, cycle-time + on-time, live deltas
Adds the operational-performance layer to the warehouse cockpit:

- Dwell time & aging: dwellStats() (avg + 0-3/4-7/8-14/15+ buckets over
  in-warehouse items) → DwellAgingCard histogram.
- Cycle time & on-time: cycleStats() (arrived→ready→loaded→dispatched stage
  averages + dock-to-dispatch) and onTimeDispatchStats() (share of items that
  left before their storage free-days expired, resolved via the fee engine's
  own rule matching) → CycleTimeCard.
- Live tiles: opsStats() now returns receivedYesterday; KpiStrip renders an
  optional ▲/▼ delta, and the ops strip shows received-today vs yesterday.

New endpoints: GET /warehouse-inventory/{dwell-stats,cycle-stats} and
/warehouse-fees/on-time-dispatch (all guarded). New "Performance" section on
WarehouseDashboardPage. On-time reads N/A when there is no sample / no active
storage rule.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 13:55:39 +00:00