mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-04 12:33:42 +00:00
78 lines
5.8 KiB
TypeScript
78 lines
5.8 KiB
TypeScript
import { IsString, IsArray, ValidateNested, IsOptional, IsInt, IsEnum, IsDateString } from 'class-validator';
|
|
import { Type } from 'class-transformer';
|
|
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
|
import { Currency, IdDocumentType } from '@prisma/client';
|
|
|
|
export class PassengerInputDto {
|
|
@ApiProperty() @IsString() seatId: string;
|
|
@ApiProperty({ example: 'Abebe Kebede' }) @IsString() passengerName: string;
|
|
@ApiProperty({ example: '1990-05-15', description: 'Date of birth (YYYY-MM-DD) for age calculation. Age <5 = CHILD (first free), Age ≥5 = ADULT (full fare)' }) @IsDateString() dateOfBirth: string;
|
|
@ApiProperty({ example: 'NATIONAL_ID', enum: IdDocumentType, description: 'NATIONAL_ID for Ethiopians (Verifayda verified), PASSPORT for others' }) @IsEnum(IdDocumentType) idDocumentType: IdDocumentType;
|
|
@ApiPropertyOptional({ example: 'ET123456789', description: 'Ethiopian national ID - verified via Verifayda 2.0 (NOT stored in database)' }) @IsOptional() @IsString() idDocumentNumber?: string;
|
|
@ApiPropertyOptional({ example: 'P1234567', description: 'Passport number for non-Ethiopian passengers (no verification)' }) @IsOptional() @IsString() passportNumber?: string;
|
|
@ApiPropertyOptional({ example: 'Djibouti', description: 'Passport issuing country for non-Ethiopians' }) @IsOptional() @IsString() passportCountry?: string;
|
|
@ApiPropertyOptional({ example: 'Ethiopian', description: 'Ethiopian (Verifayda + Telebirr/CBE/eBirr), Djiboutian (Passport + Waafi), Other (Passport + Card)' }) @IsOptional() @IsString() nationality?: string;
|
|
}
|
|
|
|
export class RoundTripPassengerDto {
|
|
@ApiProperty({ description: 'Outbound segment seat ID' }) @IsString() outboundSeatId: string;
|
|
@ApiProperty({ description: 'Return segment seat ID' }) @IsString() returnSeatId: string;
|
|
@ApiProperty({ example: 'Abebe Kebede' }) @IsString() passengerName: string;
|
|
@ApiProperty({ example: '1990-05-15', description: 'Date of birth (YYYY-MM-DD)' }) @IsDateString() dateOfBirth: string;
|
|
@ApiProperty({ example: 'NATIONAL_ID', enum: IdDocumentType }) @IsEnum(IdDocumentType) idDocumentType: IdDocumentType;
|
|
@ApiPropertyOptional() @IsOptional() @IsString() idDocumentNumber?: string;
|
|
@ApiPropertyOptional() @IsOptional() @IsString() passportNumber?: string;
|
|
@ApiPropertyOptional() @IsOptional() @IsString() passportCountry?: string;
|
|
@ApiPropertyOptional() @IsOptional() @IsString() nationality?: string;
|
|
}
|
|
|
|
export class CreateBookingDto {
|
|
@ApiProperty() @IsString() passengerId: string;
|
|
@ApiProperty() @IsString() scheduleId: string;
|
|
@ApiProperty() @IsString() holdId: string;
|
|
@ApiProperty({ example: 'station-uuid', description: 'Origin station UUID for this leg (must match the hold)' }) @IsString() originStationId: string;
|
|
@ApiProperty({ example: 'station-uuid', description: 'Destination station UUID for this leg (must match the hold)' }) @IsString() destinationStationId: string;
|
|
@ApiProperty({ type: [PassengerInputDto], description: 'Array of passengers with age-based categorization. First child (<5 years) travels FREE.' }) @IsArray() @ValidateNested({ each: true }) @Type(() => PassengerInputDto) passengers: PassengerInputDto[];
|
|
@ApiProperty({ example: 'seat-class-uuid', description: 'Seat class UUID (Economy Regular, Economy Bed, VIP Bed)' })
|
|
@IsString() seatClassId: string;
|
|
@ApiPropertyOptional() @IsOptional() @IsString() promoCode?: string;
|
|
@ApiPropertyOptional() @IsOptional() @IsInt() loyaltyRedemptionPoints?: number;
|
|
@ApiPropertyOptional({ example: 'ONE_WAY' }) @IsOptional() @IsString() bookingType?: string;
|
|
@ApiPropertyOptional({ example: 'DJF', enum: Currency, description: 'Display currency for fare breakdown (ETB, DJF, USD). Transaction always in ETB.' }) @IsOptional() @IsEnum(Currency) displayCurrency?: Currency;
|
|
}
|
|
|
|
export class CreateRoundTripBookingDto {
|
|
@ApiProperty({ description: 'Passenger ID' }) @IsString() passengerId: string;
|
|
|
|
@ApiProperty({ description: 'Outbound schedule ID' }) @IsString() outboundScheduleId: string;
|
|
@ApiProperty({ description: 'Outbound origin station ID' }) @IsString() outboundOriginStationId: string;
|
|
@ApiProperty({ description: 'Outbound destination station ID' }) @IsString() outboundDestinationStationId: string;
|
|
@ApiProperty({ description: 'Outbound seat hold ID' }) @IsString() outboundHoldId: string;
|
|
|
|
@ApiProperty({ description: 'Return schedule ID' }) @IsString() returnScheduleId: string;
|
|
@ApiProperty({ description: 'Return origin station ID (usually same as outbound destination)' }) @IsString() returnOriginStationId: string;
|
|
@ApiProperty({ description: 'Return destination station ID (usually same as outbound origin)' }) @IsString() returnDestinationStationId: string;
|
|
@ApiProperty({ description: 'Return seat hold ID' }) @IsString() returnHoldId: string;
|
|
|
|
@ApiProperty({ type: [RoundTripPassengerDto], description: 'Array of passengers with seats for both outbound and return legs' })
|
|
@IsArray() @ValidateNested({ each: true }) @Type(() => RoundTripPassengerDto) passengers: RoundTripPassengerDto[];
|
|
|
|
@ApiProperty({ description: 'Seat class ID' }) @IsString() seatClassId: string;
|
|
|
|
@ApiPropertyOptional() @IsOptional() @IsString() promoCode?: string;
|
|
@ApiPropertyOptional() @IsOptional() @IsInt() loyaltyRedemptionPoints?: number;
|
|
@ApiPropertyOptional({ example: 'DJF', enum: Currency }) @IsOptional() @IsEnum(Currency) displayCurrency?: Currency;
|
|
}
|
|
|
|
export class ModifyBookingDto {
|
|
@ApiProperty() @IsString() bookingRef: string;
|
|
@ApiProperty({ example: 'schedule-uuid' }) @IsString() newScheduleId: string;
|
|
@ApiProperty({ type: [String] }) @IsArray() newSeatIds: string[];
|
|
@ApiPropertyOptional() @IsOptional() @IsString() reason?: string;
|
|
}
|
|
|
|
export class CancelBookingDto {
|
|
@ApiProperty() @IsString() bookingRef: string;
|
|
@ApiPropertyOptional() @IsOptional() @IsString() reason?: string;
|
|
}
|