add booking request functionality for GENERAL customs contracts

- Create migration for booking_requests table with necessary fields and indexes.
- Implement BookingRequestRepository for database operations related to booking requests.
- Develop BookingRequestService to handle business logic for submitting, accepting, rejecting, and canceling booking requests.
- Create DTOs for creating booking requests and reviewing them.
- Define BookingRequest entity to map to the booking_requests table.
- Add UI components for managing shipment requests, including detail and list pages.
- Implement OperationDatePicker component for selecting available shipment days.
This commit is contained in:
Marshal
2026-06-29 09:30:44 +00:00
parent aeb5e0046e
commit 0f7cac2b68
46 changed files with 2665 additions and 992 deletions

View File

@@ -0,0 +1,66 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import {
IsArray,
IsEnum,
IsNumber,
IsOptional,
IsString,
IsUUID,
Min,
} from 'class-validator';
export interface CargoContainerLine {
containerSize: string;
quantity: number;
}
/**
* Cargo-aware availability query. Beyond the route yards, it carries the cargo
* sizing so the service can check matching-wagon + train capacity per day. The
* `containers` array is passed as a JSON string in the query string (GET) and
* parsed here.
*/
export class AvailableDaysForCargoQueryDto {
@ApiPropertyOptional({ format: 'uuid' })
@IsOptional()
@IsUUID()
originYardId?: string;
@ApiPropertyOptional({ format: 'uuid' })
@IsOptional()
@IsUUID()
destinationYardId?: string;
@ApiProperty({ enum: ['CONTAINER', 'BULK'] })
@IsEnum(['CONTAINER', 'BULK'])
freightType!: 'CONTAINER' | 'BULK';
@ApiPropertyOptional({ description: 'Bulk cargo type code (e.g. COFFEE).' })
@IsOptional()
@IsString()
cargoTypeCode?: string;
@ApiPropertyOptional({ description: 'Total bulk weight in tons.' })
@IsOptional()
@Transform(({ value }) => (value === '' || value == null ? undefined : Number(value)))
@IsNumber()
@Min(0)
totalWeightTons?: number;
@ApiPropertyOptional({
description: 'Container lines as a JSON string: [{containerSize,quantity}].',
})
@IsOptional()
@Transform(({ value }) => {
if (value == null || value === '') return undefined;
if (typeof value !== 'string') return value;
try {
return JSON.parse(value);
} catch {
return undefined;
}
})
@IsArray()
containers?: CargoContainerLine[];
}