mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-07 11:55:42 +00:00
feat(train-scheduling): add wagon type, tare, equated length, station, seal no and note columns to import marshalling doc
Import Load List / Marshalling Document only rendered Seq, Wagon, Booking, Company, Load, Container numbers, Weight T — missing fields present on the physical marshaling sheet (wagon type, tare, equated length, departure/arrival station, seal no) and a blank note column for yard staff. Export marshalling doc already had most of these; import doc now matches. Existing columns kept in place, unchanged.
This commit is contained in:
@@ -48,6 +48,19 @@ export class LastMileRequestsController {
|
||||
return this.requestsService.freeTruckCount().then((count) => ({ count }));
|
||||
}
|
||||
|
||||
// Customer-facing like :id — booking detail (portal + backoffice) lists the
|
||||
// booking's requests to link the stored LM contract. Ownership-checked in
|
||||
// the service for portal callers.
|
||||
@Get('by-booking/:bookingId')
|
||||
@MixedAudience(FREIGHT_PERMS.lastMile.requestView)
|
||||
@ApiOperation({ summary: "A booking's last-mile requests, newest first — LM contract reference" })
|
||||
findForBooking(
|
||||
@Param('bookingId', ParseUUIDPipe) bookingId: string,
|
||||
@CurrentUser() user: TCurrentUser,
|
||||
) {
|
||||
return this.requestsService.findForBooking(bookingId, user?.id ?? null);
|
||||
}
|
||||
|
||||
@Get(':id/price-estimate')
|
||||
@BookingStaff(FREIGHT_PERMS.lastMile.requestView)
|
||||
@ApiOperation({
|
||||
|
||||
@@ -221,6 +221,28 @@ export class LastMileRequestsService {
|
||||
return record;
|
||||
}
|
||||
|
||||
/**
|
||||
* Every request on a booking, newest first — the booking-detail pages
|
||||
* (portal + backoffice) use this to surface the LM contract later. Portal
|
||||
* callers pass their userId and are ownership-checked against the booking's
|
||||
* company, mirroring findById.
|
||||
*/
|
||||
async findForBooking(bookingId: string, userId?: string | null): Promise<LastMileRequest[]> {
|
||||
if (userId) {
|
||||
const companyId = await this.bookingsService.resolveCustomerCompanyId(userId);
|
||||
if (companyId) {
|
||||
const booking = await this.bookingsRepository.findById(bookingId);
|
||||
if (booking?.companyId && booking.companyId !== companyId) {
|
||||
throw new BadRequestException('This booking does not belong to your company');
|
||||
}
|
||||
}
|
||||
}
|
||||
return this.requestsRepository.findAll({
|
||||
where: { bookingId },
|
||||
order: { createdAt: 'DESC' },
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Rule-based price estimate for the approval dialog: estimated km (yard GPS →
|
||||
* delivery point, straight-line) × the LIVE last-mile rate rules against the
|
||||
|
||||
Reference in New Issue
Block a user