import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { PortDto, PricingDto } from './rate-search-response.dto'; export class BookingAddressDto { @ApiProperty({ example: '123 Main Street' }) street: string; @ApiProperty({ example: 'Rotterdam' }) city: string; @ApiProperty({ example: '3000 AB' }) postalCode: string; @ApiProperty({ example: 'NL' }) country: string; } export class BookingPartyDto { @ApiProperty({ example: 'Acme Corporation' }) name: string; @ApiProperty({ type: BookingAddressDto }) address: BookingAddressDto; @ApiProperty({ example: 'John Doe' }) contactName: string; @ApiProperty({ example: 'john.doe@acme.com' }) contactEmail: string; @ApiProperty({ example: '+31612345678' }) contactPhone: string; } export class BookingContainerDto { @ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000' }) id: string; @ApiProperty({ example: '40HC' }) type: string; @ApiPropertyOptional({ example: 'ABCU1234567' }) containerNumber?: string; @ApiPropertyOptional({ example: 22000 }) vgm?: number; @ApiPropertyOptional({ example: -18 }) temperature?: number; @ApiPropertyOptional({ example: 'SEAL123456' }) sealNumber?: string; } export class BookingRateQuoteDto { @ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000' }) id: string; @ApiProperty({ example: 'Maersk Line' }) carrierName: string; @ApiProperty({ example: 'MAERSK' }) carrierCode: string; @ApiProperty({ type: PortDto }) origin: PortDto; @ApiProperty({ type: PortDto }) destination: PortDto; @ApiProperty({ type: PricingDto }) pricing: PricingDto; @ApiProperty({ example: '40HC' }) containerType: string; @ApiProperty({ example: 'FCL' }) mode: string; @ApiProperty({ example: '2025-02-15T10:00:00Z' }) etd: string; @ApiProperty({ example: '2025-03-17T14:00:00Z' }) eta: string; @ApiProperty({ example: 30 }) transitDays: number; } export class BookingResponseDto { @ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000' }) id: string; @ApiProperty({ example: 'WCM-2025-ABC123', description: 'Unique booking number' }) bookingNumber: string; @ApiProperty({ example: 'draft', enum: ['draft', 'pending_confirmation', 'confirmed', 'in_transit', 'delivered', 'cancelled'], }) status: string; @ApiProperty({ type: BookingPartyDto }) shipper: BookingPartyDto; @ApiProperty({ type: BookingPartyDto }) consignee: BookingPartyDto; @ApiProperty({ example: 'Electronics and consumer goods' }) cargoDescription: string; @ApiProperty({ type: [BookingContainerDto] }) containers: BookingContainerDto[]; @ApiPropertyOptional({ example: 'Please handle with care. Delivery before 5 PM.' }) specialInstructions?: string; @ApiProperty({ type: BookingRateQuoteDto, description: 'Associated rate quote details' }) rateQuote: BookingRateQuoteDto; @ApiProperty({ example: '2025-02-15T10:00:00Z' }) createdAt: string; @ApiProperty({ example: '2025-02-15T10:00:00Z' }) updatedAt: string; } export class BookingListItemDto { @ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000' }) id: string; @ApiProperty({ example: 'WCM-2025-ABC123' }) bookingNumber: string; @ApiProperty({ example: 'draft' }) status: string; @ApiProperty({ example: 'Acme Corporation' }) shipperName: string; @ApiProperty({ example: 'Shanghai Imports Ltd' }) consigneeName: string; @ApiProperty({ example: 'NLRTM' }) originPort: string; @ApiProperty({ example: 'CNSHA' }) destinationPort: string; @ApiProperty({ example: 'Maersk Line' }) carrierName: string; @ApiProperty({ example: '2025-02-15T10:00:00Z' }) etd: string; @ApiProperty({ example: '2025-03-17T14:00:00Z' }) eta: string; @ApiProperty({ example: 1700.0 }) totalAmount: number; @ApiProperty({ example: 'USD' }) currency: string; @ApiProperty({ example: '2025-02-15T10:00:00Z' }) createdAt: string; } export class BookingListResponseDto { @ApiProperty({ type: [BookingListItemDto] }) bookings: BookingListItemDto[]; @ApiProperty({ example: 25, description: 'Total number of bookings' }) total: number; @ApiProperty({ example: 1, description: 'Current page number' }) page: number; @ApiProperty({ example: 20, description: 'Items per page' }) pageSize: number; @ApiProperty({ example: 2, description: 'Total number of pages' }) totalPages: number; }