import { Type } from "class-transformer"; import { IsArray, IsBoolean, IsDateString, IsEmail, IsIn, IsOptional, IsString, ValidateNested, } from "class-validator"; export const REGISTRATION_STATUSES = [ "rascunho", "pendente_validacao", "ativo", "bloqueado", "inativo", ] as const; export type RegistrationStatus = (typeof REGISTRATION_STATUSES)[number]; export class PortabilityRangeDto { @IsString() first!: string; @IsString() last!: string; } /** * Administratively editable fields per eden.md §1.1.2 — and *only* those. * `pfCpf`, `pjCnpj`, and `pjRepCpf` are deliberately not declared here: * with the global ValidationPipe's `forbidNonWhitelisted` (main.ts), any * request that tries to send them is rejected outright rather than * silently ignored. Changing the document itself would need a dedicated * re-verification flow — never a side effect of a generic admin PATCH. * * `registrationStatus` is validated as one of the 5 legal *values* here; * full state-machine transition legality (e.g. blocking `rascunho`→`ativo` * directly) is NOT enforced in this MVP — matches the legacy, which also * has no dedicated transition endpoint (eden.md §1.1.1: "não há endpoint * dedicado de transição", just this same generic PATCH). */ export class UpdateClientRegistrationDto { @IsOptional() @IsIn(REGISTRATION_STATUSES) registrationStatus?: RegistrationStatus; @IsOptional() @IsString() internalNotes?: string; @IsOptional() @IsString() ixcClientId?: string; @IsOptional() @IsString() ixcContractNumber?: string; @IsOptional() @IsString() addressZip?: string; @IsOptional() @IsString() addressStreet?: string; @IsOptional() @IsString() addressNumber?: string; @IsOptional() @IsString() addressComplement?: string; @IsOptional() @IsString() addressNeighborhood?: string; @IsOptional() @IsString() addressCity?: string; @IsOptional() @IsString() addressState?: string; @IsOptional() @IsString() addressCountry?: string; @IsOptional() @IsString() contactPrincipalName?: string; @IsOptional() @IsEmail() contactPrincipalEmail?: string; @IsOptional() @IsString() contactPrincipalPhone?: string; @IsOptional() @IsString() contactFinancialName?: string; @IsOptional() @IsEmail() contactFinancialEmail?: string; @IsOptional() @IsString() contactFinancialPhone?: string; @IsOptional() @IsString() contactTechnicalName?: string; @IsOptional() @IsEmail() contactTechnicalEmail?: string; @IsOptional() @IsString() contactTechnicalPhone?: string; // PF — pfCpf intentionally absent, see class comment. @IsOptional() @IsString() pfFullName?: string; @IsOptional() @IsDateString() pfBirthDate?: string; @IsOptional() @IsEmail() pfEmail?: string; @IsOptional() @IsString() pfMobilePhone?: string; @IsOptional() @IsString() pfAltPhone?: string; @IsOptional() @IsString() pfSocialName?: string; @IsOptional() @IsString() pfIdDocument?: string; @IsOptional() @IsString() pfIdIssuer?: string; // PJ — pjCnpj and pjRepCpf intentionally absent, see class comment. @IsOptional() @IsString() pjCompanyName?: string; @IsOptional() @IsString() pjTradeName?: string; @IsOptional() @IsString() pjStateRegistration?: string; @IsOptional() @IsString() pjMunicipalRegistration?: string; @IsOptional() @IsDateString() pjOpeningDate?: string; @IsOptional() @IsString() pjLegalNature?: string; @IsOptional() @IsString() pjCnpjSituation?: string; @IsOptional() @IsString() pjMainActivity?: string; @IsOptional() @IsString() pjRepFullName?: string; @IsOptional() @IsString() pjRepRole?: string; @IsOptional() @IsEmail() pjRepEmail?: string; @IsOptional() @IsString() pjRepMobilePhone?: string; @IsOptional() @IsBoolean() pjRepAuthorizationAck?: boolean; @IsOptional() @IsArray() @IsString({ each: true }) portabilityNumbers?: string[]; @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => PortabilityRangeDto) portabilityRanges?: PortabilityRangeDto[]; }