Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🔀 Intégration des modifications de la release 3.38 #2682

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/applications/bootstrap/src/setupLauréat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ export const setupLauréat = async ({
'ChangementActionnaireAccordé-V1',
'ChangementActionnaireRejeté-V1',
'ChangementActionnaireSupprimé-V1',
'ChangementActionnaireEnregistré-V1',
],
eventHandler: async (event) => {
await mediator.send<ActionnaireProjector.Execute>({
Expand Down Expand Up @@ -405,6 +406,7 @@ export const setupLauréat = async ({
'ChangementActionnaireAccordé-V1',
'ChangementActionnaireRejeté-V1',
'ChangementActionnaireAnnulé-V1',
'ChangementActionnaireEnregistré-V1',
],
eventHandler: async (event) =>
mediator.publish<ActionnaireNotification.Execute>({
Expand Down
14 changes: 7 additions & 7 deletions packages/applications/cli/src/commands/actionnaire/migrer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,15 @@ export class Migrer extends Command {
},
};

const eventModifié: Actionnaire.ActionnaireModifiéEvent = {
type: 'ActionnaireModifié-V1',
const eventEnregistré: Actionnaire.ChangementActionnaireEnregistréEvent = {
type: 'ChangementActionnaireEnregistré-V1',
payload: {
actionnaire: cleanInput(modification.actionnaire),
identifiantProjet,
modifiéLe: requestedOn,
modifiéPar: modification.email,
enregistréLe: requestedOn,
enregistréPar: modification.email,
raison: cleanInput(modification.justification),
pièceJustificative: formatRequestFile ? { format: formatRequestFile } : undefined,
pièceJustificative: { format: formatRequestFile || 'application/pdf' },
},
};

Expand Down Expand Up @@ -187,7 +187,7 @@ export class Migrer extends Command {
console.log(
`📨 Demande automatiquement acceptée pour ${identifiantProjet} (${candidature?.emailContact})`,
);
eventsPerProjet[modification.identifiantProjet].push(eventModifié);
eventsPerProjet[modification.identifiantProjet].push(eventEnregistré);
} else {
eventsPerProjet[modification.identifiantProjet].push(request);

Expand All @@ -209,7 +209,7 @@ export class Migrer extends Command {
}
break;
case 'information validée':
eventsPerProjet[modification.identifiantProjet].push(eventModifié);
eventsPerProjet[modification.identifiantProjet].push(eventEnregistré);
}
}

Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ export type ModèleRéponseActionnaire = ModèleRéponse & {
referenceParagrapheActionnaire: string;
contenuParagrapheActionnaire: string;
enCopies: Array<string>;
estAccordé: boolean;
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ 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 = {
nom: string;
affichage?: {
// label dans la page projet
label: string;
// action dans le menu déroulant page projet
action?: string;
url: string;
};
demandeEnCours?: {
Expand All @@ -33,61 +35,79 @@ export const getActionnaire = async ({
demandeNĂ©cessiteInstruction,
}: Props): Promise<GetActionnaireForProjectPage | undefined> => {
try {
const utilisateur = Role.convertirEnValueType(rĂ´le);
const role = Role.convertirEnValueType(rĂ´le);

const actionnaire = await mediator.send<Actionnaire.ConsulterActionnaireQuery>({
type: 'Lauréat.Actionnaire.Query.ConsulterActionnaire',
data: { identifiantProjet: identifiantProjet.formatter() },
});

const estAbandonnéOuEnCoursAbandonOuAchevé = await checkAbandonAndAchèvement(
identifiantProjet,
rĂ´le,
);

const nePeutFaireAucuneAction =
utilisateur.nom === 'porteur-projet' && estAbandonnéOuEnCoursAbandonOuAchevé;
const estAbandonnéOuAchevé = await checkAbandonAndAchèvement(identifiantProjet, rôle);

if (Option.isSome(actionnaire)) {
const nom = actionnaire.actionnaire;

const dateDemandeExistanteDeChangement =
await mediator.send<Actionnaire.ConsulterDateChangementActionnaireQuery>({
type: 'Lauréat.Actionnaire.Query.ConsulterDateChangementActionnaire',
data: { identifiantProjet: identifiantProjet.formatter() },
});

const aUneDemandeEnCours = Option.isSome(dateDemandeExistanteDeChangement);
if (Option.isSome(dateDemandeExistanteDeChangement)) {
return {
nom,
demandeEnCours: role.aLaPermission('actionnaire.consulterChangement')
? {
demandéeLe: dateDemandeExistanteDeChangement.formatter(),
}
: undefined,
};
}

const peutModifier = role.aLaPermission('actionnaire.modifier');
const peutFaireUneDemandeDeChangement =
demandeNĂ©cessiteInstruction &&
utilisateur.aLaPermission('actionnaire.demanderChangement') &&
!aUneDemandeEnCours;
role.aLaPermission('actionnaire.demanderChangement') &&
!estAbandonnéOuAchevé;

const peutModifier =
const peutEnregistrerChangement =
!demandeNĂ©cessiteInstruction &&
utilisateur.aLaPermission('actionnaire.modifier') &&
!aUneDemandeEnCours;

role.aLaPermission('actionnaire.enregistrerChangement') &&
!estAbandonnéOuAchevé;

if (peutModifier) {
return {
nom,
affichage: {
url: Routes.Actionnaire.modifier(identifiantProjet.formatter()),
label: 'Modifier',
},
};
}

if (peutEnregistrerChangement) {
return {
nom,
affichage: {
url: Routes.Actionnaire.changement.enregistrer(identifiantProjet.formatter()),
label: 'Faire un changement',
action: "Changer d'actionnaire(s)",
},
};
}

if (peutFaireUneDemandeDeChangement) {
return {
nom,
affichage: {
url: Routes.Actionnaire.changement.demander(identifiantProjet.formatter()),
label: 'Faire une demande de changement',
action: 'Demander un changement d’actionnaire(s)',
},
};
}
return {
nom: actionnaire.actionnaire,
affichage: nePeutFaireAucuneAction
? undefined
: peutModifier
? {
url: Routes.Actionnaire.modifier(identifiantProjet.formatter()),
label: "Changer d'actionnaire(s)",
}
: peutFaireUneDemandeDeChangement
? {
url: Routes.Actionnaire.changement.demander(identifiantProjet.formatter()),
label: 'Demander un changement d’actionnaire(s)',
}
: undefined,
demandeEnCours:
utilisateur.aLaPermission('actionnaire.consulterChangement') && aUneDemandeEnCours
? {
demandéeLe: dateDemandeExistanteDeChangement.formatter(),
}
: undefined,
nom,
};
}

Expand All @@ -101,7 +121,7 @@ export const getActionnaire = async ({
if (Option.isSome(candidature)) {
return {
nom: candidature.sociétéMère,
affichage: utilisateur.aLaPermission('candidature.corriger')
affichage: role.aLaPermission('candidature.corriger')
? {
url: Routes.Candidature.corriger(identifiantProjet.formatter()),
label: 'Modifier la candidature',
Expand All @@ -123,13 +143,24 @@ 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 &&
(Abandon.StatutAbandon.convertirEnValueType(statutAbandon.statut).estAccordé() ||
Abandon.StatutAbandon.convertirEnValueType(statutAbandon.statut).estEnCours())) ||
!!attestationConformitéExistante
);
if (attestationConformitéExistante) {
return true;
}

try {
const abandon = await mediator.send<Abandon.ConsulterAbandonQuery>({
type: 'Lauréat.Abandon.Query.ConsulterAbandon',
data: { identifiantProjetValue: identifiantProjet.formatter() },
});
if (Option.isNone(abandon)) return false;
return abandon.statut.estAccordé() || abandon.statut.estEnCours();
} catch (e) {
getLogger('getActionnaire.checkActionnaire').warn("Impossible de récupérer l'abandon", {
error: (e as Error)?.message,
identifiantProjet: identifiantProjet.formatter(),
});
return false;
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,22 @@ const MenuCre = (currentPage?: string) => (
>
Projets
</Header.MenuItem>
<Header.MenuItem href={Routes.Abandon.lister({ statut: 'demandé' })}>Abandons</Header.MenuItem>
<Header.MenuItem href={Routes.Recours.lister({ statut: 'demandé' })}>Recours</Header.MenuItem>
<DropdownMenu buttonChildren={'Demandes'}>
<DropdownMenu.DropdownItem href={Routes.Abandon.lister({ statut: 'demandé' })}>
Abandons
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem href={Routes.Recours.lister({ statut: 'demandé' })}>
Recours
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem
href={Routes.ReprésentantLégal.changement.lister({ statut: 'demandé' })}
>
Changements de représentant légal
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem href={Routes.Actionnaire.changement.lister({ statut: 'demandé' })}>
Actionnaire(s)
</DropdownMenu.DropdownItem>
</DropdownMenu>
<Header.MenuItem href={Routes.Raccordement.lister}>Raccordements</Header.MenuItem>
<Header.MenuItem
href={routes.GET_CRE_STATISTIQUES}
Expand Down Expand Up @@ -97,10 +111,12 @@ const MenuAdmin = (currentPage?: string) => (
<DropdownMenu.DropdownItem href={Routes.Recours.lister({ statut: 'demandé' })}>
Recours
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem href={Routes.ReprésentantLégal.changement.lister}>
<DropdownMenu.DropdownItem
href={Routes.ReprésentantLégal.changement.lister({ statut: 'demandé' })}
>
Changements de représentant légal
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem href={Routes.Actionnaire.changement.lister}>
<DropdownMenu.DropdownItem href={Routes.Actionnaire.changement.lister({ statut: 'demandé' })}>
Actionnaire(s)
</DropdownMenu.DropdownItem>
</DropdownMenu>
Expand Down Expand Up @@ -196,10 +212,12 @@ const MenuPorteurProjet = (currentPage?: string) => (
<DropdownMenu.DropdownItem href={Routes.Recours.lister({ statut: 'demandé' })}>
Recours
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem href={Routes.ReprésentantLégal.changement.lister}>
<DropdownMenu.DropdownItem
href={Routes.ReprésentantLégal.changement.lister({ statut: 'demandé' })}
>
Changements de représentant légal
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem href={Routes.Actionnaire.changement.lister}>
<DropdownMenu.DropdownItem href={Routes.Actionnaire.changement.lister({ statut: 'demandé' })}>
Actionnaire(s)
</DropdownMenu.DropdownItem>
</DropdownMenu>
Expand Down Expand Up @@ -268,10 +286,12 @@ const MenuDreal = (currentPage?: string) => (
<DropdownMenu.DropdownItem href={Routes.Recours.lister({ statut: 'demandé' })}>
Recours
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem href={Routes.ReprésentantLégal.changement.lister}>
<DropdownMenu.DropdownItem
href={Routes.ReprésentantLégal.changement.lister({ statut: 'demandé' })}
>
Changements de représentant légal
</DropdownMenu.DropdownItem>
<DropdownMenu.DropdownItem href={Routes.Actionnaire.changement.lister}>
<DropdownMenu.DropdownItem href={Routes.Actionnaire.changement.lister({ statut: 'demandé' })}>
Actionnaire(s)
</DropdownMenu.DropdownItem>
</DropdownMenu>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const EnregistrerUneModification = ({ project }: EnregistrerUneModificationProps
).formatter(),
)}
>
<span>Modification de l'actionnariat</span>
<span>Modification d'actionnaire(s)</span>
</DropdownMenuSecondaryButton.DropdownItem>
</DropdownMenuSecondaryButton>
);
Expand All @@ -46,7 +46,7 @@ type PorteurProjetActionsProps = {
hasAttestationConformité: boolean;
peutFaireDemandeChangementReprésentantLégal: boolean;
actionnaireMenu?: {
label: string;
action?: string;
url: string;
};
};
Expand Down Expand Up @@ -91,12 +91,12 @@ const PorteurProjetActions = ({
<DropdownMenuSecondaryButton.DropdownItem href={routes.CHANGER_FOURNISSEUR(project.id)}>
<span>Changer de fournisseur</span>
</DropdownMenuSecondaryButton.DropdownItem>
{actionnaireMenu ? (
{actionnaireMenu?.action ? (
<DropdownMenuSecondaryButton.DropdownItem
href={actionnaireMenu.url}
disabled={modificationsNonPermisesParLeCDCActuel ? true : undefined}
>
<span>{actionnaireMenu.label}</span>
<span>{actionnaireMenu.action}</span>
</DropdownMenuSecondaryButton.DropdownItem>
) : (
<></>
Expand Down Expand Up @@ -221,6 +221,7 @@ type ProjectActionsProps = {
peutFaireDemandeChangementReprésentantLégal: boolean;
actionnaireMenu?: {
label: string;
action?: string;
url: string;
};
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,7 @@ export const Contact = ({

{représentantLégal.modification && (
<Link href={représentantLégal.modification.url} aria-label="Modifier" className="mt-1">
Modifier{' '}
{représentantLégal.modification.type === 'lauréat'
? 'le représentant légal'
: 'la candidature'}
Modifier {représentantLégal.modification.type === 'lauréat' ? '' : 'la candidature'}
</Link>
)}
{représentantLégal.demandeDeModification?.peutConsulterLaDemandeExistante && (
Expand Down
Loading
Loading