import { ApiProperty } from '@nestjs/swagger'; import { IsEmail, IsNotEmpty, IsOptional, IsString, IsBoolean, IsInt, Min, Max, MinLength, MaxLength, Matches, IsDateString, } from 'class-validator'; export class RegisterAMCompletDto { // ============================================ // ÉTAPE 1 : IDENTITÉ (Obligatoire) // ============================================ @ApiProperty({ example: 'marie.dupont@ptits-pas.fr' }) @IsEmail({}, { message: 'Email invalide' }) @IsNotEmpty({ message: "L'email est requis" }) email: string; @ApiProperty({ example: 'Marie' }) @IsString() @IsNotEmpty({ message: 'Le prénom est requis' }) @MinLength(2, { message: 'Le prénom doit contenir au moins 2 caractères' }) @MaxLength(100) prenom: string; @ApiProperty({ example: 'DUPONT' }) @IsString() @IsNotEmpty({ message: 'Le nom est requis' }) @MinLength(2, { message: 'Le nom doit contenir au moins 2 caractères' }) @MaxLength(100) nom: string; @ApiProperty({ example: '0689567890' }) @IsString() @IsNotEmpty({ message: 'Le téléphone est requis' }) @Matches(/^(\+33|0)[1-9](\d{2}){4}$/, { message: 'Le numéro de téléphone doit être valide (ex: 0689567890 ou +33689567890)', }) telephone: string; @ApiProperty({ example: '5 Avenue du Général de Gaulle', required: false }) @IsOptional() @IsString() adresse?: string; @ApiProperty({ example: '95870', required: false }) @IsOptional() @IsString() @MaxLength(10) code_postal?: string; @ApiProperty({ example: 'Bezons', required: false }) @IsOptional() @IsString() @MaxLength(150) ville?: string; // ============================================ // ÉTAPE 2 : PHOTO + INFOS PRO // ============================================ @ApiProperty({ example: 'data:image/jpeg;base64,/9j/4AAQ...', required: false, description: 'Photo de profil en base64', }) @IsOptional() @IsString() photo_base64?: string; @ApiProperty({ example: 'photo_profil.jpg', required: false }) @IsOptional() @IsString() photo_filename?: string; @ApiProperty({ example: true, description: 'Consentement utilisation photo' }) @IsBoolean() @IsNotEmpty({ message: 'Le consentement photo est requis' }) consentement_photo: boolean; @ApiProperty({ example: '2024-01-15', required: false, description: 'Date de naissance' }) @IsOptional() @IsDateString() date_naissance?: string; @ApiProperty({ example: 'Paris', required: false, description: 'Ville de naissance' }) @IsOptional() @IsString() @MaxLength(100) lieu_naissance_ville?: string; @ApiProperty({ example: 'France', required: false, description: 'Pays de naissance' }) @IsOptional() @IsString() @MaxLength(100) lieu_naissance_pays?: string; @ApiProperty({ example: '123456789012345', description: 'NIR 15 caractères (chiffres, ou 2A/2B pour la Corse)' }) @IsString() @IsNotEmpty({ message: 'Le NIR est requis' }) @Matches(/^[1-3]\d{4}(?:2A|2B|\d{2})\d{6}\d{2}$/, { message: 'Le NIR doit contenir 15 caractères (chiffres, ou 2A/2B pour la Corse)', }) nir: string; @ApiProperty({ example: 'AGR-2024-12345', description: "Numéro d'agrément" }) @IsString() @IsNotEmpty({ message: "Le numéro d'agrément est requis" }) @MaxLength(50) numero_agrement: string; @ApiProperty({ example: '2024-06-01', required: false, description: "Date d'obtention de l'agrément" }) @IsOptional() @IsDateString() date_agrement?: string; @ApiProperty({ example: 4, description: 'Capacité d\'accueil (nombre d\'enfants)', minimum: 1, maximum: 10 }) @IsInt() @Min(1, { message: 'La capacité doit être au moins 1' }) @Max(10, { message: 'La capacité ne peut pas dépasser 10' }) capacite_accueil: number; // ============================================ // ÉTAPE 3 : PRÉSENTATION (Optionnel) // ============================================ @ApiProperty({ example: 'Assistante maternelle expérimentée, accueil bienveillant...', required: false, description: 'Présentation / biographie (max 2000 caractères)', }) @IsOptional() @IsString() @MaxLength(2000, { message: 'La présentation ne peut pas dépasser 2000 caractères' }) biographie?: string; // ============================================ // ÉTAPE 4 : ACCEPTATION CGU (Obligatoire) // ============================================ @ApiProperty({ example: true, description: "Acceptation des CGU" }) @IsBoolean() @IsNotEmpty({ message: "L'acceptation des CGU est requise" }) acceptation_cgu: boolean; @ApiProperty({ example: true, description: 'Acceptation de la Politique de confidentialité' }) @IsBoolean() @IsNotEmpty({ message: "L'acceptation de la politique de confidentialité est requise" }) acceptation_privacy: boolean; }