erp-transportistas-backend-v2/src/modules/carta-porte/dto/figura-transporte.dto.ts
Adrian Flores Cortes 825e349f37 [SYNC] feat: Add Carta Porte DTOs and controller
- Add carta-porte controller with CRUD operations
- Add DTOs: create, update, cancelar, timbrar
- Add DTOs: autotransporte, mercancia, ubicacion, figura-transporte
- Add common utilities folder
- Add ordenes-transporte service tests
- Update index exports

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:11:29 -06:00

168 lines
3.1 KiB
TypeScript

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;
}