Commit Graph

3713 Commits

Author SHA1 Message Date
Nathnael
346d4718bf fix(backoffice): scope permission copying to the selected organization
"Copy permissions from" listed every position type in every
organization, because the dropdown read an unfiltered GET
/position-types. IAM exposes no organization-scoped route and carries no
organizationId on a position type, so the list is now narrowed
client-side to the built-in (isSystem) types plus those whose unit
belongs to the selected organization, with the type being edited
excluded.

Also in position management:

- Invalidate every position-type cache key root after a mutation. React
  Query matches prefixes element by element, so ["position-type"] never
  reached ["position-types-common", ...] and the department pickers kept
  serving a stale list. invalidatePositionTypeQueries() covers all three
  roots and is shared by the hook and the form.
- Drop getByOrganizationId and getCommonTypesByOrganizationId. Both
  issued the same requests as their unit counterparts and had no callers.
- Surface errors that were being swallowed. Three mutations had empty
  onError handlers, hiding IAM's 403 for built-in position types, and
  CreatePositionForm's bare catch discarded the reason for every failure.
- Move organization and unit into the zod schema so they validate with
  translated messages and inline errors instead of an ad-hoc toast, and
  keep submit disabled through the permission-assignment call that
  follows the save.
- Report the two outcomes the form used to hide: a save that succeeded
  while permission assignment failed, and clearing every permission,
  which assign-seconds-for-first cannot express.
- Fix the list page's loading and error states, which rendered the
  "Add User" string as a spinner, ignored the unit-scoped query, and
  left the export button stuck after a failed download.
- Halve PermissionSearch's requests. It fetched 50 rows, read the total
  off the response and immediately refetched, and it re-filtered results
  on the undebounced term, blanking the list while typing.

Remove the three record toggles. They never worked: IAM's
PositionTypeConfiguration holds only { id, organizationId,
positionTypeId, timeframe } in every published build, canAssignRecord
and canCreateBankRecord exist nowhere in the package, and the global
ValidationPipe runs with forbidNonWhitelisted, so every write was a 400.
The reads were broken too, passing a positionTypeId to a route that
filters on organizationId. A TODO records where the real flag lives:
PositionConfiguration.canReceiveRecord, keyed by positionId.

Delete ActionsColumn.tsx, which had no references.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 13:42:08 +00:00
Nathnael
063a8799f5 fix(backoffice): make position type optional for unit departments
Creating a department under a unit required picking a position type,
which is not always known at that point. Sub-department creation is
unchanged and still requires one.

PositionPayload.positionTypeId becomes optional and the field is omitted
from the request body when unset rather than sent as an empty string.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 13:41:39 +00:00
Nathnael
48f1d08faf Merge branch 'dev' into freight/feat/fixes-v1 2026-07-23 11:51:04 +00:00
Nathnael
d47e3ae4f5 docker exefix: reimplement the admin form 2026-07-23 11:48:08 +00:00
Hagernesh Tadesse
105333c05e Merge pull request #936 from Tria-plc/Truckmaintenance
Export interchange document — a generation error after Djibouti unloa…

and 

Intervals were definable only via SQL and completion couldn't record an
odometer, so KM-based auto-scheduling never fired. Add
/maintenance/intervals endpoints + per-vehicle intervals UI, odometer on
the completion dialog, service_item to distinguish oil vs tire
intervals, full due board (all items per vehicle), no-dup completion
guard and dual km+date thresholds on one schedule.
2026-07-23 14:33:15 +03:00
Hagernesh
73f36fe46e Export interchange document — a generation error after Djibouti unloading failed the whole request and left the document missing until a manual rerun. Generation is now best-effort (unload never fails on paperwork) and reruns backfill the document. 2026-07-23 11:31:44 +00:00
marshal
4df17f36ce Merge pull request #935 from Tria-plc/freight_feature/usermanagement
changes
2026-07-23 14:07:03 +03:00
Marshal
13609f8d59 changes 2026-07-23 11:06:10 +00:00
Hagernesh Tadesse
fc2f1d7454 Merge pull request #933 from Tria-plc/Truckmaintenance
Portal: truck assignment — template download next to Bulk Upload

Portal: truck assignment — template download next to Bulk Upload
The External Truck Assignment card only exposed the Excel template from inside the Bulk Upload modal. A "Download Template" button now sits beside "Bulk Upload" in the card header, matching the container-import pattern in the booking form, so customers can grab the template without opening the modal first.
2026-07-23 12:26:38 +03:00
Hagernesh
67f606e50a Portal: truck assignment — template download next to Bulk Upload
The External Truck Assignment card only exposed the Excel template from inside the Bulk Upload modal. A Download Template  button now sits beside Bulk Upload in the card header, matching the container-import pattern in the booking form, so customers can grab the template without opening the modal first.
2026-07-23 09:24:13 +00:00
Nathnael Wondisha
77f169daba Merge pull request #932 from Tria-plc/freight/fix/seeder
fix: rm iam seeder
2026-07-23 11:44:46 +03:00
ghost2023
eab6f54e98 fix: rm iam seeder 2026-07-23 11:43:46 +03:00
Hagernesh Tadesse
42cb20bd38 Merge pull request #931 from Tria-plc/Truckmaintenance
fix(maintenance): schema-qualify maintenance_intervals migration
2026-07-23 11:21:32 +03:00
Hagernesh
fb1e4ffcb3 fix(maintenance): schema-qualify maintenance_intervals migration
createUniqueConstraint/createForeignKey used bare table names, which
resolve against the default schema (public) while the table was created
in freight — the migration failed on boot and rolled back every start.
Rewritten as idempotent schema-qualified SQL (unique index replaces the
constraint, FK inline on the column).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:18:33 +00:00
Hagernesh Tadesse
76d0edf960 Merge pull request #930 from Tria-plc/Truckmaintenance
Truckmaintenance

MaintenanceInterval entity per vehicle + type (intervalKm, intervalDays). 
Migration creates maintenance_intervals table with unique constraint. 
scheduleNextMaintenance() auto-creates SCHEDULED item when one completes: 
nextDueKm = completedKm + intervalKm. Handles both KM + date intervals.

Customer Handover Signatures with Document Visibility

Portal booking detail shows warehouse/yard/zone + cargo arrival time. 
Integrated WarehouseLocationCard into ReadonlyBookingView between 
ContainersCard and ContractInfoCard. Uses customer-safe /bookings/:id/location 
endpoint (staff perm prevented direct call).
2026-07-23 10:56:05 +03:00
Hagernesh
f2f6ac616f KM-Based Maintenance Scheduling 2026-07-23 07:53:11 +00:00
Hagernesh
4abcc909af feat(warehouses): persist saved signature image on handover sign
Store the signer's saved-signature URL on booking_handovers (new
signature_image_url column) when a handover is signed — per-truck or
booking-level — so signed handover documents can render the actual
signature, matching the contract-signing flow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 07:53:11 +00:00
Hagernesh
fa59ccfc95 feat: implement KM-based maintenance scheduling
Add maintenance intervals configuration to track maintenance by kilometers
driven. When a maintenance is marked COMPLETED, automatically calculate and
schedule the next maintenance based on interval + current odometer reading.

Features:
- MaintenanceInterval entity: stores KM/day intervals per vehicle & type
- scheduleNextMaintenance(): creates next SCHEDULED item after completion
- nextDueKm field: tracks when next maintenance is due (in kilometers)
- getDueBoard() queries already support KM-based tracking

Maintenance now "marches forward" based on distance driven, not just dates.
Each vehicle type can have different intervals (e.g., oil every 10k km, tires 50k km).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-23 07:53:11 +00:00
Nathnael
cbff529e31 feat: rebuild the admin pages 2026-07-23 07:40:48 +00:00
marshal
b756ae2f1c Merge pull request #929 from Tria-plc/freight_feature/usermanagement
fix configratio
2026-07-23 09:50:49 +03:00
Marshal
8f143b2341 fix configratio 2026-07-23 06:48:03 +00:00
marshal
8d51425f90 Merge pull request #928 from Tria-plc/freight_feature/usermanagement
fix configratio
2026-07-23 09:22:29 +03:00
Marshal
1576fcdc45 fix configratio 2026-07-23 06:21:51 +00:00
marshal
b43763ad39 Merge pull request #927 from Tria-plc/freight_feature/usermanagement
implement freight permissions for trains, wagons, and routes
2026-07-23 09:04:24 +03:00
Marshal
fd05655ecc implement freight permissions for trains, wagons, and routes 2026-07-23 06:03:43 +00:00
marshal
f5f41e0a5a Merge pull request #926 from Tria-plc/freight_feature/usermanagement
implement freight permissions for trains, wagons, and routes
2026-07-23 08:57:59 +03:00
Marshal
129a4d1d0a implement freight permissions for trains, wagons, and routes 2026-07-23 05:57:14 +00:00
marshal
edfd0a859d Merge pull request #925 from Tria-plc/freight_feature/usermanagement
add e2e test
2026-07-23 08:27:29 +03:00
Stephanos A.
6f06e3e6e8 Merge pull request #924 from Tria-plc/alpha
Payment report and missing ticket generation updates
2026-07-23 07:30:06 +03:00
Stephanos A
e2bdc21c95 Payment report and missing ticket generation updates 2026-07-23 07:27:05 +03:00
Marshal
2481f43f1f add e2e test 2026-07-22 23:44:32 +00:00
marshal
091dd0bfa3 Merge pull request #923 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-07-23 00:02:55 +03:00
Marshal
b0f561a935 Add end-to-end tests for import corridor flows
- Implement full train import journey with six container bookings filling a 54-wagon train.
- Create tests for split offer and rebooking scenarios, handling payment expiry and waiting list promotions.
- Add tests for handling waiting bookings expiration when the train is full.
- Implement tests for reopening booking windows after expired reservations.
- Seed database with necessary corridor data for import flows, including yards, container types, locomotives, and rates.
2026-07-22 21:02:17 +00:00
Marshal
5709801590 enhance shipment form and booking process 2026-07-22 17:25:01 +00:00
Stephanos A.
02939ac6e7 Merge pull request #922 from Tria-plc/alpha
Build issue resolution
2026-07-22 19:52:25 +03:00
Stephanos A
614fab806d Build issue resolution 2026-07-22 19:50:49 +03:00
Stephanos A.
dd7ad3c25b Merge pull request #921 from Tria-plc/alpha
Hidden package quick info
2026-07-22 19:27:35 +03:00
Stephanos A
e9a43fe454 Hidden package quick info 2026-07-22 19:24:55 +03:00
Stephanos A.
f23ccb585b Merge pull request #920 from Tria-plc/alpha
Hide package seats
2026-07-22 19:02:40 +03:00
Stephanos A
af28abb0f0 Hide package seats 2026-07-22 18:59:55 +03:00
mulish77
54d3481230 Merge pull request #919 from Tria-plc/tests
Fixing isssues usins AI
2026-07-22 17:30:23 +03:00
Muluhabt
e31a2d64e5 Fixing isssues usins AI 2026-07-22 17:29:40 +03:00
Hagernesh Tadesse
7d90112822 Merge pull request #918 from Tria-plc/testfixes
fix(portal): Table has no size prop in BulkTruckUploadModal
2026-07-22 17:13:14 +03:00
Hagernesh
15540f78e2 fix(portal): Table has no size prop in BulkTruckUploadModal 2026-07-22 14:11:58 +00:00
mulish77
cd3b2b3873 Merge pull request #917 from Tria-plc/tests
Tests
2026-07-22 16:44:46 +03:00
Muluhabt
9782dd0fe3 Fixing isssues usins AI 2026-07-22 16:42:07 +03:00
Muluhabt
87ebec8b51 Merge remote-tracking branch 'origin/dev' into tests 2026-07-22 16:33:07 +03:00
Stephanos A.
42bd87d9e3 Merge pull request #916 from Tria-plc/alpha
Passenger portal build issue resolution
2026-07-22 16:32:08 +03:00
Stephanos A
62fcf6a8d2 Passenger portal build issue resolution 2026-07-22 16:31:03 +03:00
Hagernesh Tadesse
a20b78b716 Merge pull request #915 from Tria-plc/testfixes
Operations permissons and dispatecand procurement and Asset Feature
2026-07-22 16:22:15 +03:00