diff --git "a/packages/applications/ssr/src/app/laureats/[identifiant]/raccordements/(raccordement-du-projet)/(d\303\251tails)/page.tsx" "b/packages/applications/ssr/src/app/laureats/[identifiant]/raccordements/(raccordement-du-projet)/(d\303\251tails)/page.tsx" index de4fa6a1c35..ff032bdb437 100644 --- "a/packages/applications/ssr/src/app/laureats/[identifiant]/raccordements/(raccordement-du-projet)/(d\303\251tails)/page.tsx" +++ "b/packages/applications/ssr/src/app/laureats/[identifiant]/raccordements/(raccordement-du-projet)/(d\303\251tails)/page.tsx" @@ -3,7 +3,7 @@ import type { Metadata } from 'next'; import { redirect } from 'next/navigation'; import { GestionnaireRéseau } from '@potentiel-domain/reseau'; -import { Utilisateur } from '@potentiel-domain/utilisateur'; +import { Role, Utilisateur } from '@potentiel-domain/utilisateur'; import { Option } from '@potentiel-libraries/monads'; import { Routes } from '@potentiel-applications/routes'; import { mapToPlainObject } from '@potentiel-domain/core'; @@ -35,7 +35,7 @@ export default async function Page({ params: { identifiant } }: PageProps) { decodeParameter(identifiant), ); - await récupérerLauréatNonAbandonné(identifiantProjet.formatter()); + const projet = await récupérerLauréatNonAbandonné(identifiantProjet.formatter()); const raccordement = await mediator.send({ type: 'Lauréat.Raccordement.Query.ConsulterRaccordement', @@ -73,7 +73,11 @@ export default async function Page({ params: { identifiant } }: PageProps) { @@ -82,10 +86,13 @@ export default async function Page({ params: { identifiant } }: PageProps) { ); } -const mapToDossierActions = ( - { rôle }: Utilisateur.ValueType, - dossiers: Lauréat.Raccordement.ConsulterRaccordementReadModel['dossiers'], -): DétailsRaccordementPageProps['dossiers'] => +type MapToDossierActions = (args: { + rôle: Role.ValueType; + projetAchevé: boolean; + dossiers: Lauréat.Raccordement.ConsulterRaccordementReadModel['dossiers']; +}) => DétailsRaccordementPageProps['dossiers']; + +const mapToDossierActions: MapToDossierActions = ({ rôle, projetAchevé, dossiers }) => dossiers.map((dossier) => mapToPlainObject({ ...dossier, @@ -94,7 +101,9 @@ const mapToDossierActions = ( demandeComplèteRaccordement: { transmettre: rôle.aLaPermission('raccordement.demande-complète-raccordement.transmettre'), - modifier: rôle.aLaPermission('raccordement.demande-complète-raccordement.modifier'), + modifier: + !projetAchevé && + rôle.aLaPermission('raccordement.demande-complète-raccordement.modifier'), modifierRéférence: rôle.aLaPermission('raccordement.référence-dossier.modifier') && !rôle.aLaPermission('raccordement.demande-complète-raccordement.modifier'), diff --git "a/packages/domain/projet/src/laur\303\251at/raccordement/errors.ts" "b/packages/domain/projet/src/laur\303\251at/raccordement/errors.ts" index a44e123ca08..fab60efdf9c 100644 --- "a/packages/domain/projet/src/laur\303\251at/raccordement/errors.ts" +++ "b/packages/domain/projet/src/laur\303\251at/raccordement/errors.ts" @@ -103,3 +103,11 @@ export class DossierRaccordementPasEnServiceError extends InvalidOperationError super(`Le dossier de raccordement n'est pas en service`); } } + +export class DemandeComplèteRaccordementNonModifiableCarProjetAchevéError extends InvalidOperationError { + constructor() { + super( + `La demande complète de raccordement du dossier ne peut pas être modifiée car le projet est achevé`, + ); + } +} diff --git "a/packages/domain/projet/src/laur\303\251at/raccordement/raccordement.aggregate.ts" "b/packages/domain/projet/src/laur\303\251at/raccordement/raccordement.aggregate.ts" index 58c1e9f7762..825f10fb2b1 100644 --- "a/packages/domain/projet/src/laur\303\251at/raccordement/raccordement.aggregate.ts" +++ "b/packages/domain/projet/src/laur\303\251at/raccordement/raccordement.aggregate.ts" @@ -54,6 +54,7 @@ import { RéférenceDossierRaccordementDéjàExistantePourLeProjetError, RéférenceDossierRaccordementNonModifiableCarDossierAvecDateDeMiseEnServiceError, RéférencesDossierRaccordementIdentiquesError, + DemandeComplèteRaccordementNonModifiableCarProjetAchevéError, } from './errors'; import { TransmettrePropositionTechniqueEtFinancièreOptions } from './transmettre/propositionTechniqueEtFinancière/transmettrePropositionTechniqueEtFinancière.options'; import { TransmettreDemandeOptions } from './transmettre/demandeComplèteDeRaccordement/transmettreDemandeComplèteRaccordement.options'; @@ -351,6 +352,10 @@ export class RaccordementAggregate extends AbstractAggregate< référenceDossierRaccordement, rôle, }: ModifierDemandeComplèteOptions) { + if (this.lauréat.achèvement.estAchevé) { + throw new DemandeComplèteRaccordementNonModifiableCarProjetAchevéError(); + } + if (dateQualification.estDansLeFutur()) { throw new DateDansLeFuturError(); } diff --git "a/packages/specifications/src/raccordement/demandeCompl\303\250teDeRaccordement/modifierDemandeCompl\303\250teDeRaccordement.feature" "b/packages/specifications/src/raccordement/demandeCompl\303\250teDeRaccordement/modifierDemandeCompl\303\250teDeRaccordement.feature" index 248c47589f6..d9562835eda 100644 --- "a/packages/specifications/src/raccordement/demandeCompl\303\250teDeRaccordement/modifierDemandeCompl\303\250teDeRaccordement.feature" +++ "b/packages/specifications/src/raccordement/demandeCompl\303\250teDeRaccordement/modifierDemandeCompl\303\250teDeRaccordement.feature" @@ -56,3 +56,9 @@ Fonctionnalité: Modifier une demande complète de raccordement Et une date de mise en service pour le dossier de raccordement du projet lauréat Quand la dreal modifie la demande complète de raccordement Alors la dreal devrait être informé que "La demande complète de raccordement du dossier ne peut pas être modifiée car celui-ci dispose déjà d'une date de mise en service" + + Scénario: Impossible pour un porteur de modifier une demande complète de raccordement si le projet est achevé + Etant donné une attestation de conformité transmise pour le projet lauréat + Et une demande complète de raccordement pour le projet lauréat + Quand le porteur modifie la demande complète de raccordement + Alors le porteur devrait être informé que "La demande complète de raccordement du dossier ne peut pas être modifiée car le projet est achevé" diff --git "a/packages/specifications/src/raccordement/demandeCompl\303\250teDeRaccordement/stepDefinitions/demandeCompl\303\250teRaccordement.when.ts" "b/packages/specifications/src/raccordement/demandeCompl\303\250teDeRaccordement/stepDefinitions/demandeCompl\303\250teRaccordement.when.ts" index 3f3e8525da9..2b985c7af2d 100644 --- "a/packages/specifications/src/raccordement/demandeCompl\303\250teDeRaccordement/stepDefinitions/demandeCompl\303\250teRaccordement.when.ts" +++ "b/packages/specifications/src/raccordement/demandeCompl\303\250teDeRaccordement/stepDefinitions/demandeCompl\303\250teRaccordement.when.ts" @@ -182,7 +182,7 @@ async function modifierDemandeComplèteRaccordement( }); try { - await mediator.send({ + await mediator.send({ type: 'Lauréat.Raccordement.UseCase.ModifierDemandeComplèteRaccordement', data: { identifiantProjetValue: identifiantProjet,