Commit Graph

2900 Commits

Author SHA1 Message Date
marshal
952078086e Merge pull request #966 from Tria-plc/freight_feature/usermanagement
add dispute functionality for contract duty and implement collection…
2026-07-26 21:24:17 +03:00
Marshal
af85f20789 add dispute functionality for contract duty and implement collection dates 2026-07-26 18:23:37 +00:00
marshal
2da27ef127 Merge pull request #965 from Tria-plc/freight_feature/usermanagement
add dispute functionality for contract duty and implement collection…
2026-07-26 20:59:16 +03:00
Marshal
225d2c8229 add dispute functionality for contract duty and implement collection dates 2026-07-26 17:58:37 +00:00
marshal
12bab14b06 Merge pull request #964 from Tria-plc/freight_feature/usermanagement
add dispute functionality for contract duty and implement collection…
2026-07-26 20:30:31 +03:00
Marshal
bfea9de660 add dispute functionality for contract duty and implement collection dates 2026-07-26 17:30:00 +00:00
marshal
e63ddec088 Merge pull request #963 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-07-26 19:59:39 +03:00
Marshal
5e10c97294 add dispute functionality for contract duty and implement collection dates 2026-07-26 16:58:51 +00:00
Marshal
9b13fa2ac6 feat: implement wagon transfer management modals and page
- Add TransferFulfillModal for fulfilling wagon transfer requests.
- Create TransferRequestFormModal for filing new wagon transfer requests.
- Introduce TransferCloseShortModal for closing requests that cannot be fully fulfilled.
- Develop WagonTransfersPage to manage and display wagon transfer requests.
- Implement utility functions for handling wagon transfer request data and UI components.
- Enhance UI with Mantine components for better user experience.
2026-07-26 15:11:50 +00:00
marshal
48873890a4 Merge pull request #962 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-07-26 11:12:23 +03:00
Marshal
9a1c8e5603 feat: add hazardous goods declaration feature
- Introduced HazardDeclarationPanel component to display dangerous goods declaration details.
- Updated URL constants to include CLEARANCE_PROCEED endpoint for re-requesting operations.
- Enhanced permissions to include hazardous approval roles for contract approvals.
- Integrated HazardDeclarationPanel into ContractRequestDetailPage and ContractClearanceDetailPage.
- Added proceedToOperation method in bookings service for handling operation re-requests.
- Updated contract forms and schemas to include hazard class and UN number fields.
- Implemented validation for hazardous contracts in the contract creation flow.
- Added expiry notice functionality for contracts nearing validity end.
- Created tests for expiry notice calculations and labels.
- Updated UI components to reflect hazardous cargo information and validation errors.
2026-07-25 21:10:09 +00:00
Marshal
fde5e6de4b add company stamp upload functionality for contract signing
- Introduced StampUpload component for uploading company stamp images.
- Integrated stamp upload in contract signing modal, supporting PNG and JPG formats.
- Implemented validation for file type and size (max 5 MB).
- Added visual feedback for drag-and-drop functionality.
- Updated contract-related pages to handle duplicate contract alerts and pricing notices.
- Enhanced contract expiry management with a nightly sweep service.
- Added unit tests for new features and updated existing tests for contract handling.
2026-07-25 17:14:58 +00:00
Hagernesh
6983645347 feat(warehouses): gate double-handling fee on a per-booking Yes/No
Double handling billed every import with a matching rule. Add
bookings.double_handling (+ set_at/by), charge only when Yes, expose a
PATCH endpoint (import-only, locked after invoicing, audited) and Yes/No
items in the inventory row menu.
2026-07-25 10:45:34 +00:00
Hagernesh
a544bebc51 fix(operations): last-mile assign until load fully trucked + 40ft cap
Assign was gated on any truck assigned, blocking multi-truck
deliveries. Gate on remaining containers (or bulk tonnage) instead, show
covered/total in the modal, cap a 40ft container to one truck with no
size mixing (mirrors assertTruckLoad), and lock arrived/departed rows.
2026-07-25 10:29:44 +00:00
mulish77
d4695ba9eb Merge pull request #959 from Tria-plc/tests
Adding exact reason why train is not available to users search results
2026-07-25 12:29:41 +03:00
Muluhabt
d175514f85 Adding exact reason why train is not available to users search results 2026-07-25 12:28:07 +03:00
ghost2023
6fb9107e43 fix 2026-07-25 12:11:04 +03:00
mulish77
f24c7015e0 Merge pull request #956 from Tria-plc/tests
Adding ticket generation and booking for staff employees logic
2026-07-25 11:22:59 +03:00
Muluhabt
2a0fd9bda5 Adding ticket generation and booking for staff employees logic 2026-07-25 11:20:47 +03:00
marshal
ae6751a7d0 Merge pull request #955 from Tria-plc/freight_feature/usermanagement
Freight feature/usermanagement
2026-07-25 09:06:58 +03:00
Marshal
54b5882355 changes 2026-07-25 06:05:20 +00:00
Stephanos A.
ed5de9a214 Merge pull request #954 from Tria-plc/alpha
Set boardedAt in addition to validatedAt on ticket boarding action
2026-07-24 19:59:32 +03:00
Stephanos A
fa7fb6b7ea Set boardedAt in addition to validatedAt on ticket boarding action 2026-07-24 19:57:29 +03:00
Stephanos A.
06787aeaaf Merge pull request #953 from Tria-plc/alpha
Alpha
2026-07-24 17:00:06 +03:00
Stephanos A
e4b60f28b5 Merge branch 'alpha' of github.com:Tria-plc/edr-platform into alpha 2026-07-24 16:49:50 +03:00
Marshal
286390a3cf change contrat creation 2026-07-24 13:26:19 +00:00
Stephanos A
050a08f330 Boarding report added 2026-07-24 16:09:27 +03:00
Hagernesh
2f124bc666 Intercity load unload with grn ,Warehouse , fleet , and allocation endpoints permission 2026-07-24 11:55:05 +00:00
Hagernesh
cf8a2e928d fix(warehouses): detention groups by canonical truck type
Join truck_types via vehicles.truck_type_id (normalized legacy
vehicle_type only as fallback) so type renames can't unmatch detention
rules and FK-less vehicles keep billing.
2026-07-24 11:55:05 +00:00
Abubeker Yasin
dfef97a718 Merge branch 'alpha' of github.com:Tria-plc/edr-platform into alpha 2026-07-24 13:59:21 +03:00
Abubeker Yasin
3d1b06b7ee fix: ( payment ) prevent duplicate booking charges and fix D-Money queryOrder 2026-07-24 13:51:53 +03:00
Roba Boru
5a89e296d6 Fix checkin time cutoff 2026-07-24 11:37:52 +03:00
mulish77
ac9ba43bd3 Merge pull request #948 from Tria-plc/tests
Cut off time configuration
2026-07-24 09:02:25 +03:00
Muluhabt
7320c359d1 Cut off time configuration 2026-07-24 09:01:27 +03:00
Marshal
668b5e1c9d add permissions and fix issues 2026-07-23 20:24:20 +00:00
mulish77
114709c995 Merge pull request #947 from Tria-plc/tests
Tests
2026-07-23 20:15:42 +03:00
Muluhabt
64e1130f7d Commiting stop based booking 2026-07-23 20:11:11 +03:00
Muluhabt
8bba882710 Adding stop based booking configuration 2026-07-23 20:03:35 +03:00
Stephanos A.
ac4fdf03ba Merge pull request #946 from Tria-plc/alpha
Generate missing ticket and payment report currency updates
2026-07-23 19:51:13 +03:00
Stephanos A
84346d77ac Generate missing ticket and payment report currency updates 2026-07-23 19:39:39 +03:00
marshal
d603c0973d Merge pull request #944 from Tria-plc/freight_feature/usermanagement
changes
2026-07-23 17:31:29 +03:00
Marshal
40f16f3cec changes 2026-07-23 14:30:49 +00:00
marshal
d585351501 Merge pull request #943 from Tria-plc/freight_feature/usermanagement
changes
2026-07-23 17:20:24 +03:00
Marshal
127676055b changes 2026-07-23 14:18:24 +00:00
marshal
cf13c8d175 Merge pull request #942 from Tria-plc/freight_feature/usermanagement
revert back the clerance payment
2026-07-23 16:56:56 +03:00
Marshal
15a6bab5d0 revert back the clerance payment 2026-07-23 13:54:09 +00:00
Nathnael Wondisha
b6c4a72d2b Merge pull request #941 from Tria-plc/freight/feat/fixes-v1
Freight/feat/fixes v1
2026-07-23 16:50:18 +03:00
Nathnael
dcc94643d0 feat(companies): enforce customers:* permissions on customer endpoints
The customers:* keys were seeded and present in the backoffice constants but
enforced nowhere except reset-password. Customer CRUD sat behind the coarse
edr_freight_app:admin umbrella, and every company read endpoint was unguarded.

Two routes could not be gated on the route alone, because the authority they
need depends on the request BODY, not the path:

  - PATCH /companies/:id carries `status` (UpdateCompanyDto extends
    PartialType(CreateCompanyDto)), so it both edits fields and blacklists.
  - PATCH /company-profiles/:profileId/status is approve, reject, suspend and
    blacklist on one route.

Both now take a one-of route guard and assert per-status against a shared
STATUS_PERM map: approving/reactivating needs customers:verify, suspending or
blacklisting needs customers:deactivate. PATCH /companies/:id additionally
requires customers:update when any non-status field is present, so a caller
holding only deactivate cannot rename a company. The backoffice mirrors the
same map so no button is offered that the server would reject.

GET /companies/:companyId/documents is left authenticated-only with the split
in the handler: it is dual-audience. The portal reads its own documents during
onboarding, and the contract-request detail page (gated on contracts:view)
reads the applicant's. Gating it on customers:view alone would have 403'd
customers on their own documents and blanked the contract reviewer's panel.

The two by-company customer-view reads take a one-of guard for the same reason
— otherwise a staffer granted only customers:view gets a detail page whose tabs
403 individually.

Frontend: the customers routes were sidebar-filtered but not wrapped in
RequirePermission, so direct URL navigation rendered them for anyone.

Verified: freight-api type-check clean; backoffice type-check unchanged from
HEAD (pre-existing errors only); 25 tests pass across the companies and
freight-permission suites. Not exercised against a running API.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 13:48:42 +00:00
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