Backend: - Retrait des champs non-CDC: profession, situation_familiale, date_naissance - Nettoyage des DTOs RegisterParentCompletDto et RegisterParentDto - Mise à jour de la logique dans auth.service.ts (inscrireParentComplet et legacy) Frontend Step1: - Suppression des champs mot de passe et confirmation - Correction de l'indicateur d'étape: 1/5 → 1/6 - Améliorations visuelles: * Taille des labels: 18 → 22px * Taille de police des champs: 18 → 20px * Espacement entre champs: 20 → 32px * Meilleure répartition verticale avec spaceEvenly Note: Le champ password est conservé dans le modèle ParentData pour compatibilité avec Step2
167 lines
4.9 KiB
TypeScript
167 lines
4.9 KiB
TypeScript
import { ApiProperty } from '@nestjs/swagger';
|
|
import {
|
|
IsEmail,
|
|
IsNotEmpty,
|
|
IsOptional,
|
|
IsString,
|
|
IsDateString,
|
|
IsEnum,
|
|
IsBoolean,
|
|
IsArray,
|
|
ValidateNested,
|
|
MinLength,
|
|
MaxLength,
|
|
Matches,
|
|
} from 'class-validator';
|
|
import { Type } from 'class-transformer';
|
|
import { SituationFamilialeType } from 'src/entities/users.entity';
|
|
import { EnfantInscriptionDto } from './enfant-inscription.dto';
|
|
|
|
export class RegisterParentCompletDto {
|
|
// ============================================
|
|
// ÉTAPE 1 : PARENT 1 (Obligatoire)
|
|
// ============================================
|
|
|
|
@ApiProperty({ example: 'claire.martin@ptits-pas.fr' })
|
|
@IsEmail({}, { message: 'Email invalide' })
|
|
@IsNotEmpty({ message: 'L\'email est requis' })
|
|
email: string;
|
|
|
|
@ApiProperty({ example: 'Claire' })
|
|
@IsString()
|
|
@IsNotEmpty({ message: 'Le prénom est requis' })
|
|
@MinLength(2, { message: 'Le prénom doit contenir au moins 2 caractères' })
|
|
@MaxLength(100, { message: 'Le prénom ne peut pas dépasser 100 caractères' })
|
|
prenom: string;
|
|
|
|
@ApiProperty({ example: 'MARTIN' })
|
|
@IsString()
|
|
@IsNotEmpty({ message: 'Le nom est requis' })
|
|
@MinLength(2, { message: 'Le nom doit contenir au moins 2 caractères' })
|
|
@MaxLength(100, { message: 'Le nom ne peut pas dépasser 100 caractères' })
|
|
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 : PARENT 2 / CO-PARENT (Optionnel)
|
|
// ============================================
|
|
|
|
@ApiProperty({ example: 'thomas.martin@ptits-pas.fr', required: false })
|
|
@IsOptional()
|
|
@IsEmail({}, { message: 'Email du co-parent invalide' })
|
|
co_parent_email?: string;
|
|
|
|
@ApiProperty({ example: 'Thomas', required: false })
|
|
@IsOptional()
|
|
@IsString()
|
|
co_parent_prenom?: string;
|
|
|
|
@ApiProperty({ example: 'MARTIN', required: false })
|
|
@IsOptional()
|
|
@IsString()
|
|
co_parent_nom?: string;
|
|
|
|
@ApiProperty({ example: '0678456789', required: false })
|
|
@IsOptional()
|
|
@IsString()
|
|
@Matches(/^(\+33|0)[1-9](\d{2}){4}$/, {
|
|
message: 'Le numéro de téléphone du co-parent doit être valide',
|
|
})
|
|
co_parent_telephone?: string;
|
|
|
|
@ApiProperty({ example: true, description: 'Le co-parent habite à la même adresse', required: false })
|
|
@IsOptional()
|
|
@IsBoolean()
|
|
co_parent_meme_adresse?: boolean;
|
|
|
|
@ApiProperty({ required: false })
|
|
@IsOptional()
|
|
@IsString()
|
|
co_parent_adresse?: string;
|
|
|
|
@ApiProperty({ required: false })
|
|
@IsOptional()
|
|
@IsString()
|
|
co_parent_code_postal?: string;
|
|
|
|
@ApiProperty({ required: false })
|
|
@IsOptional()
|
|
@IsString()
|
|
co_parent_ville?: string;
|
|
|
|
// ============================================
|
|
// ÉTAPE 3 : ENFANT(S) (Au moins 1 requis)
|
|
// ============================================
|
|
|
|
@ApiProperty({
|
|
type: [EnfantInscriptionDto],
|
|
description: 'Liste des enfants (au moins 1 requis)',
|
|
example: [{
|
|
prenom: 'Emma',
|
|
nom: 'MARTIN',
|
|
date_naissance: '2023-02-15',
|
|
genre: 'F',
|
|
photo_base64: 'data:image/jpeg;base64,...',
|
|
photo_filename: 'emma_martin.jpg'
|
|
}]
|
|
})
|
|
@IsArray({ message: 'La liste des enfants doit être un tableau' })
|
|
@IsNotEmpty({ message: 'Au moins un enfant est requis' })
|
|
@ValidateNested({ each: true })
|
|
@Type(() => EnfantInscriptionDto)
|
|
enfants: EnfantInscriptionDto[];
|
|
|
|
// ============================================
|
|
// ÉTAPE 4 : PRÉSENTATION DU DOSSIER (Optionnel)
|
|
// ============================================
|
|
|
|
@ApiProperty({
|
|
example: 'Nous recherchons une assistante maternelle bienveillante pour nos triplés...',
|
|
required: false,
|
|
description: 'Présentation du dossier (max 2000 caractères)'
|
|
})
|
|
@IsOptional()
|
|
@IsString()
|
|
@MaxLength(2000, { message: 'La présentation ne peut pas dépasser 2000 caractères' })
|
|
presentation_dossier?: string;
|
|
|
|
// ============================================
|
|
// ÉTAPE 5 : ACCEPTATION CGU (Obligatoire)
|
|
// ============================================
|
|
|
|
@ApiProperty({ example: true, description: 'Acceptation des Conditions Générales d\'Utilisation' })
|
|
@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;
|
|
}
|
|
|