- GET reprise-dossier : parents[], enfants[], texte_motivation (famille) ou fiche AM (#119) - PATCH reprise-resoumettre : co-parent, enfants (update par id), motivation, fiche AM - Resoumission famille : tous les parents en en_attente + invalidation token groupée - DTOs étendus + est_multiple sur enfants dossier famille - Tests unitaires getRepriseDossier parent/AM Co-authored-by: Cursor <cursoragent@cursor.com>
206 lines
4.3 KiB
TypeScript
206 lines
4.3 KiB
TypeScript
import { ApiProperty } from '@nestjs/swagger';
|
||
import {
|
||
IsOptional,
|
||
IsString,
|
||
MaxLength,
|
||
IsUUID,
|
||
IsBoolean,
|
||
IsArray,
|
||
ValidateNested,
|
||
IsInt,
|
||
Min,
|
||
Max,
|
||
IsDateString,
|
||
Matches,
|
||
} from 'class-validator';
|
||
import { Type } from 'class-transformer';
|
||
import { EnfantRepriseDto } from './enfant-reprise.dto';
|
||
|
||
/** Body PATCH /auth/reprise-resoumettre – token + champs modifiables du wizard. #111 + #112 */
|
||
export class ResoumettreRepriseDto {
|
||
@ApiProperty({ description: 'Token reprise (reçu par email)' })
|
||
@IsUUID()
|
||
token: string;
|
||
|
||
// --- Identité titulaire (parent principal ou AM) ---
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(100)
|
||
prenom?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(100)
|
||
nom?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(20)
|
||
telephone?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
adresse?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(150)
|
||
ville?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(10)
|
||
code_postal?: string;
|
||
|
||
@ApiProperty({ required: false, description: 'Pour AM (URL photo existante)' })
|
||
@IsOptional()
|
||
@IsString()
|
||
photo_url?: string;
|
||
|
||
@ApiProperty({ required: false, description: 'Pour AM (nouvelle photo base64)' })
|
||
@IsOptional()
|
||
@IsString()
|
||
photo_base64?: string;
|
||
|
||
@ApiProperty({ required: false, description: 'Pour AM (nom fichier photo)' })
|
||
@IsOptional()
|
||
@IsString()
|
||
photo_filename?: string;
|
||
|
||
// --- Co-parent (reprise parent) ---
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
co_parent_email?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
co_parent_prenom?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
co_parent_nom?: string;
|
||
|
||
@ApiProperty({ 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({ 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;
|
||
|
||
// --- Motivation dossier famille ---
|
||
|
||
@ApiProperty({ required: false, description: 'Alias texte_motivation' })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(2000)
|
||
texte_motivation?: string;
|
||
|
||
@ApiProperty({ required: false, description: 'Alias presentation_dossier (inscription)' })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(2000)
|
||
presentation_dossier?: string;
|
||
|
||
@ApiProperty({ type: [EnfantRepriseDto], required: false })
|
||
@IsOptional()
|
||
@IsArray()
|
||
@ValidateNested({ each: true })
|
||
@Type(() => EnfantRepriseDto)
|
||
enfants?: EnfantRepriseDto[];
|
||
|
||
// --- AM ---
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsBoolean()
|
||
consentement_photo?: boolean;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsDateString()
|
||
date_naissance?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(100)
|
||
lieu_naissance_ville?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(100)
|
||
lieu_naissance_pays?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(50)
|
||
numero_agrement?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@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({ required: false })
|
||
@IsOptional()
|
||
@IsDateString()
|
||
date_agrement?: string;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsInt()
|
||
@Min(1)
|
||
@Max(10)
|
||
capacite_accueil?: number;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsInt()
|
||
@Min(0)
|
||
@Max(10)
|
||
places_disponibles?: number;
|
||
|
||
@ApiProperty({ required: false })
|
||
@IsOptional()
|
||
@IsString()
|
||
@MaxLength(2000)
|
||
biographie?: string;
|
||
}
|