refactor(bookings): replace RFQ/quotation flow with submit, staff review, approval routing, and payment stubs

This commit is contained in:
marshal
2026-06-03 15:45:38 +03:00
parent f93a502247
commit 4ed0e22f55
16 changed files with 1448 additions and 367 deletions

View File

@@ -0,0 +1,32 @@
import { ApiProperty } from '@nestjs/swagger';
export class PriceLineItemDto {
@ApiProperty()
code!: string;
@ApiProperty()
description!: string;
@ApiProperty()
amount!: number;
@ApiProperty()
currency!: string;
}
export class GeneratePriceResponseDto {
@ApiProperty()
bookingId!: string;
@ApiProperty()
totalAmount!: number;
@ApiProperty()
currency!: string;
@ApiProperty({ type: [PriceLineItemDto] })
lineItems!: PriceLineItemDto[];
@ApiProperty({ type: [String] })
warnings!: string[];
}

View File

@@ -0,0 +1,74 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsOptional, IsString, IsUUID, MinLength } from 'class-validator';
export class RequestChangesDto {
@ApiProperty({ description: 'Staff note explaining what the customer must fix' })
@IsString()
@MinLength(1)
note!: string;
@ApiPropertyOptional({ format: 'uuid' })
@IsOptional()
@IsUUID()
actorId?: string;
}
export class StaffAcceptDto {
@ApiPropertyOptional({ format: 'uuid' })
@IsOptional()
@IsUUID()
actorId?: string;
}
export class MarketingApproveDto {
@ApiPropertyOptional({ format: 'uuid' })
@IsOptional()
@IsUUID()
actorId?: string;
}
export class StaffRejectDto {
@ApiProperty()
@IsString()
@MinLength(1)
reason!: string;
@ApiPropertyOptional({ format: 'uuid' })
@IsOptional()
@IsUUID()
actorId?: string;
}
export class ApproveStepDto {
@ApiProperty({ format: 'uuid' })
@IsUUID()
actorId!: string;
@ApiProperty({ description: 'LINE_STAFF | DIRECTOR | CEO' })
@IsString()
requiredRole!: string;
}
export class RejectStepDto {
@ApiProperty({ format: 'uuid' })
@IsUUID()
actorId!: string;
@ApiProperty()
@IsString()
@MinLength(1)
reason!: string;
}
export class CancelBookingDto {
@ApiProperty()
@IsString()
@MinLength(1)
reason!: string;
}
export class BankCallbackDto {
@ApiProperty()
@IsString()
pnrCode!: string;
}

View File

@@ -1,41 +0,0 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsIn, IsOptional, IsString, IsUUID } from 'class-validator';
const STATUS_ACTIONS = [
'SUBMIT',
'SEND_QUOTATION',
'APPROVE_QUOTATION',
'REJECT_QUOTATION',
'APPROVE_STEP',
'APPROVE',
'CUSTOMER_SIGN',
'MARK_FULLY_EXECUTED',
'MARK_PAID',
'START_TRANSIT',
'COMPLETE',
'REJECT',
'CANCEL',
] as const;
export { STATUS_ACTIONS };
export class UpdateStatusDto {
@ApiProperty({ enum: STATUS_ACTIONS })
@IsIn([...STATUS_ACTIONS])
action!: string;
@ApiPropertyOptional({ format: 'uuid', description: 'Staff/director/CEO actor' })
@IsOptional()
@IsUUID()
actorId?: string;
@ApiPropertyOptional({ description: 'Required role for APPROVE_STEP (LINE_STAFF, DIRECTOR, CEO)' })
@IsOptional()
@IsString()
requiredRole?: string;
@ApiPropertyOptional({ description: 'Required for REJECT, REJECT_QUOTATION, CANCEL' })
@IsOptional()
@IsString()
reason?: string;
}