import { IsString, IsNotEmpty, IsEnum, IsOptional, IsArray, ValidateNested, Length, Matches, } from 'class-validator'; import { Type } from 'class-transformer'; import { TipoFiguraTransporte } from '../entities'; /** * DTO para partes de transporte (propietario/arrendador) */ export class PartesTransporteDto { @IsString() @IsNotEmpty() parteTransporte!: string; } /** * DTO para domicilio de figura de transporte */ export class DomicilioFiguraDto { @IsOptional() @IsString() @Length(2, 3) pais?: string; @IsOptional() @IsString() @Length(2, 3) estado?: string; @IsOptional() @IsString() @Length(5, 5) codigoPostal?: string; @IsOptional() @IsString() @Length(1, 100) calle?: string; @IsOptional() @IsString() @Length(1, 55) numExterior?: string; @IsOptional() @IsString() @Length(1, 30) numInterior?: string; @IsOptional() @IsString() @Length(1, 100) colonia?: string; @IsOptional() @IsString() @Length(1, 100) municipio?: string; @IsOptional() @IsString() @Length(1, 250) referencia?: string; } /** * DTO para agregar figura de transporte a Carta Porte * Tipos: Operador (01), Propietario (02), Arrendador (03), Notificado (04) */ export class CreateFiguraTransporteDto { /** * Tipo de figura de transporte (catalogo c_TipoFiguraTransporte) * 01 = Operador * 02 = Propietario * 03 = Arrendador * 04 = Notificado */ @IsEnum(TipoFiguraTransporte, { message: 'tipoFigura debe ser 01, 02, 03 o 04' }) @IsNotEmpty() tipoFigura!: TipoFiguraTransporte; /** * RFC de la figura (opcional para operadores extranjeros) */ @IsOptional() @IsString() @Matches(/^([A-Z&Ñ]{3,4}[0-9]{6}[A-Z0-9]{3}|XEXX010101000)$/, { message: 'rfcFigura debe ser un RFC valido o extranjero generico', }) rfcFigura?: string; /** * Nombre de la figura de transporte */ @IsString() @IsNotEmpty({ message: 'nombreFigura es requerido' }) @Length(1, 254) nombreFigura!: string; /** * Numero de licencia (requerido para operadores tipo 01) */ @IsOptional() @IsString() @Length(1, 16) numLicencia?: string; /** * Numero de registro tributario (para extranjeros) */ @IsOptional() @IsString() @Length(1, 40) numRegIdTribFigura?: string; /** * Residencia fiscal (ISO 3166-1 alpha-3, para extranjeros) */ @IsOptional() @IsString() @Length(3, 3) residenciaFiscalFigura?: string; /** * Partes de transporte (para propietario/arrendador) */ @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => PartesTransporteDto) partesTransporte?: PartesTransporteDto[]; /** * Domicilio de la figura */ @IsOptional() @ValidateNested() @Type(() => DomicilioFiguraDto) domicilio?: DomicilioFiguraDto; } /** * DTO para actualizar figura de transporte */ export class UpdateFiguraTransporteDto { @IsOptional() @IsString() @Length(1, 254) nombreFigura?: string; @IsOptional() @IsString() @Length(1, 16) numLicencia?: string; @IsOptional() @ValidateNested() @Type(() => DomicilioFiguraDto) domicilio?: DomicilioFiguraDto; }