feat(permissions): add granular permissions for train management actions

feat(train-builder): update permissions checks for train actions in UI
feat(contracts): enhance contract view and shipment request pages with new features
test(shipment-preview): add tests for customs clearing logic in booking preview
style(contract-sign-bar): create CSS for fixed sign bar layout
This commit is contained in:
marshalyordanos
2026-08-11 11:48:16 +03:00
parent ea6eccbf09
commit 07a120af5e
9 changed files with 267 additions and 73 deletions

View File

@@ -39,6 +39,10 @@ import { TrainBuilderService } from './train-builder.service';
FREIGHT_PERMS.trains.update,
FREIGHT_PERMS.trains.assignWagons,
FREIGHT_PERMS.trains.delete,
FREIGHT_PERMS.trains.changeLocomotives,
FREIGHT_PERMS.trains.changeYard,
FREIGHT_PERMS.trains.toggleActive,
FREIGHT_PERMS.trains.disband,
])
export class TrainBuilderController {
constructor(private readonly trainBuilderService: TrainBuilderService) {}
@@ -72,7 +76,7 @@ export class TrainBuilderController {
}
@Put(':id/locomotives')
@FleetManage(FREIGHT_PERMS.trains.update)
@FleetManage(FREIGHT_PERMS.trains.changeLocomotives)
@ApiOperation({ summary: 'Replace the locomotive set (minimum 1, same yard)' })
setLocomotives(
@Param('id', ParseUUIDPipe) id: string,
@@ -94,7 +98,7 @@ export class TrainBuilderController {
}
@Patch(':id/yard')
@FleetManage(FREIGHT_PERMS.trains.update)
@FleetManage(FREIGHT_PERMS.trains.changeYard)
@ApiOperation({
summary: 'Relocate the train — its locomotives and wagons move to the new yard with it',
})
@@ -143,7 +147,7 @@ export class TrainBuilderController {
}
@Post(':id/deactivate')
@FleetManage(FREIGHT_PERMS.trains.update)
@FleetManage(FREIGHT_PERMS.trains.toggleActive)
@ApiOperation({
summary: 'Deactivate the train (park it) — only allowed with no active schedule',
})
@@ -152,14 +156,14 @@ export class TrainBuilderController {
}
@Post(':id/activate')
@FleetManage(FREIGHT_PERMS.trains.update)
@FleetManage(FREIGHT_PERMS.trains.toggleActive)
@ApiOperation({ summary: 'Reactivate a deactivated train back to AVAILABLE' })
activate(@Param('id', ParseUUIDPipe) id: string) {
return this.trainBuilderService.activate(id);
}
@Delete(':id')
@FleetManage(FREIGHT_PERMS.trains.delete)
@FleetManage(FREIGHT_PERMS.trains.disband)
@HttpCode(HttpStatus.NO_CONTENT)
@ApiOperation({ summary: 'Disband the train (release wagons and locomotives)' })
disband(@Param('id', ParseUUIDPipe) id: string) {