feat(#103): Numéro de dossier – backend
- Colonne numero_dossier (utilisateurs, assistantes_maternelles, parents) - Table numero_dossier_sequence, format AAAA-NNNNNN, séquence par année - Génération à la soumission AM et parent (famille) - Backfill existants (famille = co_parent ou enfants partagés) - API PATCH /users/:id/numero-dossier (gestionnaire/admin) - Garde-fous: max 2 parents/dossier, pas de mélange AM/parent Made-with: Cursor
This commit is contained in:
@@ -270,6 +270,64 @@ export class UserService {
|
||||
await this.validationRepository.save(suspend);
|
||||
return savedUser;
|
||||
}
|
||||
/**
|
||||
* Affecter ou modifier le numéro de dossier d'un utilisateur (parent ou AM).
|
||||
* Permet au gestionnaire/admin de rapprocher deux dossiers (même numéro pour plusieurs personnes).
|
||||
* Garde-fou : au plus 2 parents par numéro de dossier (couple / co-parents).
|
||||
*/
|
||||
async affecterNumeroDossier(userId: string, numeroDossier: string): Promise<Users> {
|
||||
const user = await this.usersRepository.findOne({ where: { id: userId } });
|
||||
if (!user) throw new NotFoundException('Utilisateur introuvable');
|
||||
|
||||
if (user.role !== RoleType.PARENT && user.role !== RoleType.ASSISTANTE_MATERNELLE) {
|
||||
throw new BadRequestException(
|
||||
'Le numéro de dossier ne peut être affecté qu\'à un parent ou une assistante maternelle',
|
||||
);
|
||||
}
|
||||
|
||||
if (user.role === RoleType.PARENT) {
|
||||
const uneAMALe = await this.assistantesRepository.count({
|
||||
where: { numero_dossier: numeroDossier },
|
||||
});
|
||||
if (uneAMALe > 0) {
|
||||
throw new BadRequestException(
|
||||
'Ce numéro de dossier est celui d\'une assistante maternelle. Un numéro AM ne peut pas être affecté à un parent.',
|
||||
);
|
||||
}
|
||||
const parentsAvecCeNumero = await this.parentsRepository.count({
|
||||
where: { numero_dossier: numeroDossier },
|
||||
});
|
||||
const userADejaCeNumero = user.numero_dossier === numeroDossier;
|
||||
if (!userADejaCeNumero && parentsAvecCeNumero >= 2) {
|
||||
throw new BadRequestException(
|
||||
'Un numéro de dossier ne peut être associé qu\'à 2 parents au maximum (couple / co-parents). Ce dossier a déjà 2 parents.',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (user.role === RoleType.ASSISTANTE_MATERNELLE) {
|
||||
const unParentLA = await this.parentsRepository.count({
|
||||
where: { numero_dossier: numeroDossier },
|
||||
});
|
||||
if (unParentLA > 0) {
|
||||
throw new BadRequestException(
|
||||
'Ce numéro de dossier est celui d\'une famille (parent). Un numéro famille ne peut pas être affecté à une assistante maternelle.',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
user.numero_dossier = numeroDossier;
|
||||
const savedUser = await this.usersRepository.save(user);
|
||||
|
||||
if (user.role === RoleType.PARENT) {
|
||||
await this.parentsRepository.update({ user_id: userId }, { numero_dossier: numeroDossier });
|
||||
} else {
|
||||
await this.assistantesRepository.update({ user_id: userId }, { numero_dossier: numeroDossier });
|
||||
}
|
||||
|
||||
return savedUser;
|
||||
}
|
||||
|
||||
async remove(id: string, currentUser: Users): Promise<void> {
|
||||
if (currentUser.role !== RoleType.SUPER_ADMIN) {
|
||||
throw new ForbiddenException('Accès réservé aux super admins');
|
||||
|
||||
Reference in New Issue
Block a user