From 4a8e22803f705aa6580d5a60682dae52ed5514ad Mon Sep 17 00:00:00 2001 From: Violette <27735540+VioMrqs@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:55:24 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Bloquer=20le=20front=20si=20aban?= =?UTF-8?q?don=20/=20achevement=20ETQ=20PP=20(#2659)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../getProjectPage/_utils/getActionnaire.ts | 53 +++++++++++++++---- .../project/getProjectPage/index.ts | 10 ++-- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getActionnaire.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getActionnaire.ts index faf87edb05..3aeb7817e3 100644 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getActionnaire.ts +++ b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getActionnaire.ts @@ -1,5 +1,5 @@ import { mediator } from 'mediateur'; -import { Actionnaire } from '@potentiel-domain/laureat'; +import { Abandon, Actionnaire } from '@potentiel-domain/laureat'; import { Option } from '@potentiel-libraries/monads'; import { Candidature } from '@potentiel-domain/candidature'; @@ -7,6 +7,8 @@ import { Routes } from '@potentiel-applications/routes'; import { Role } from '@potentiel-domain/utilisateur'; import { getLogger } from '@potentiel-libraries/monitoring'; import { IdentifiantProjet } from '@potentiel-domain/common'; +import { getAbandonStatut } from './getAbandon'; +import { getAttestationDeConformité } from './getAttestationDeConformité'; export type GetActionnaireForProjectPage = | { @@ -19,11 +21,17 @@ export type GetActionnaireForProjectPage = } | undefined; -export const getActionnaire = async ( - identifiantProjet: IdentifiantProjet.ValueType, - rôle: string, - demandeNécessiteInstruction: boolean, -): Promise => { +type Props = { + identifiantProjet: IdentifiantProjet.ValueType; + rôle: string; + demandeNécessiteInstruction: boolean; +}; + +export const getActionnaire = async ({ + identifiantProjet, + rôle, + demandeNécessiteInstruction, +}: Props): Promise => { try { const utilisateur = Role.convertirEnValueType(rôle); @@ -32,6 +40,14 @@ export const getActionnaire = async ( data: { identifiantProjet: identifiantProjet.formatter() }, }); + const estAbandonnéOuEnCoursAbandonOuAchevé = await checkAbandonAndAchèvement( + identifiantProjet, + rôle, + ); + + const nePeutFaireAucuneAction = + utilisateur.nom === 'porteur-projet' && estAbandonnéOuEnCoursAbandonOuAchevé; + if (Option.isSome(actionnaire)) { const demandeExistanteDeChangement = await mediator.send({ @@ -46,12 +62,14 @@ export const getActionnaire = async ( const peutFaireUneDemandeDeChangement = demandeNécessiteInstruction && utilisateur.aLaPermission('actionnaire.demanderChangement') && - !aUneDemandeEnCours; + !aUneDemandeEnCours && + !nePeutFaireAucuneAction; - const peutModifierDirectement = + const peutModifier = !demandeNécessiteInstruction && utilisateur.aLaPermission('actionnaire.modifier') && - !aUneDemandeEnCours; + !aUneDemandeEnCours && + !nePeutFaireAucuneAction; return { nom: actionnaire.actionnaire, @@ -60,7 +78,7 @@ export const getActionnaire = async ( url: Routes.Actionnaire.changement.demander(identifiantProjet.formatter()), label: "Demander une modification de l'actionnariat", } - : peutModifierDirectement + : peutModifier ? { url: Routes.Actionnaire.modifier(identifiantProjet.formatter()), label: 'Modifier l’actionnariat', @@ -102,3 +120,18 @@ export const getActionnaire = async ( return undefined; } }; + +const checkAbandonAndAchèvement = async ( + identifiantProjet: Props['identifiantProjet'], + rôle: Props['rôle'], +) => { + const statutAbandon = await getAbandonStatut(identifiantProjet); + const attestationConformitéExistante = await getAttestationDeConformité(identifiantProjet, rôle); + + return ( + statutAbandon?.statut === 'accordé' || + (statutAbandon && + Abandon.StatutAbandon.convertirEnValueType(statutAbandon?.statut).estEnCours()) || + !!attestationConformitéExistante + ); +}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/index.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/index.ts index b98423cb08..3e8bca245e 100644 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/index.ts +++ b/packages/applications/legacy/src/controllers/project/getProjectPage/index.ts @@ -204,11 +204,11 @@ v1Router.get( garantiesFinancières, représentantLégal: await getReprésentantLégal(identifiantProjetValueType, user.role), demandeRecours: await getRecours(identifiantProjetValueType), - actionnaire: await getActionnaire( - identifiantProjetValueType, - user.role, - demandeNécessiteInstructionPourActionnaire, - ), + actionnaire: await getActionnaire({ + identifiantProjet: identifiantProjetValueType, + rôle: user.role, + demandeNécessiteInstruction: demandeNécessiteInstructionPourActionnaire, + }), hasAttestationConformité: !!attestationConformité, modificationsNonPermisesParLeCDCActuel: project.cahierDesChargesActuel.type === 'initial' &&