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

✨ Lister toutes les demandes de changement de représentant légal (demandée/accordée/rejetée) #2653

Merged
Merged
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { mediator } from 'mediateur';
import { IdentifiantProjet } from '@potentiel-domain/common';
import { ReprésentantLégal } from '@potentiel-domain/laureat';

import { listProjection } from '@potentiel-infrastructure/pg-projections';
import { Option } from '@potentiel-libraries/monads';
import { Candidature } from '@potentiel-domain/candidature';
import { Routes } from '@potentiel-applications/routes';
import { Role } from '@potentiel-domain/utilisateur';
import { getLogger } from '@potentiel-libraries/monitoring';
import { getAbandonStatut } from './getAbandon';
import { getAttestationDeConformité } from './getAttestationDeConformité';
import { Where } from '@potentiel-domain/entity';

export type GetReprésentantLégalForProjectPage =
| {
Expand All @@ -18,6 +19,7 @@ export type GetReprésentantLégalForProjectPage =
url: string;
};
demandeDeModification?: {
demandéLe: string;
peutConsulterLaDemandeExistante: boolean;
peutFaireUneDemande: boolean;
};
Expand All @@ -40,9 +42,9 @@ export const getReprésentantLégal: GetReprésentantLégal = async (identifiant
});

if (Option.isSome(représentantLégal)) {
const demandéLe = await getDateDemandeEnCours(identifiantProjet);
const demandeChangementExistante =
utilisateur.aLaPermission('représentantLégal.consulterChangement') &&
(await getChangementReprésentantLégal(identifiantProjet));
utilisateur.aLaPermission('représentantLégal.consulterChangement') && !!demandéLe;

const statutAbandon = await getAbandonStatut(identifiantProjet);
const abandonAccordé = statutAbandon?.statut === 'accordé';
Expand Down Expand Up @@ -77,6 +79,7 @@ export const getReprésentantLégal: GetReprésentantLégal = async (identifiant
}
: undefined,
demandeDeModification: {
demandéLe: demandéLe ?? '',
peutConsulterLaDemandeExistante,
peutFaireUneDemande,
},
Expand Down Expand Up @@ -114,17 +117,19 @@ export const getReprésentantLégal: GetReprésentantLégal = async (identifiant
}
};

const getChangementReprésentantLégal = async (identifiantProjet: IdentifiantProjet.ValueType) => {
const getDateDemandeEnCours = async (identifiantProjet: IdentifiantProjet.ValueType) => {
try {
const changement =
await mediator.send<ReprésentantLégal.ConsulterChangementReprésentantLégalQuery>({
type: 'Lauréat.ReprésentantLégal.Query.ConsulterChangementReprésentantLégal',
const représentantLégal =
await mediator.send<ReprésentantLégal.ConsulterReprésentantLégalQuery>({
type: 'Lauréat.ReprésentantLégal.Query.ConsulterReprésentantLégal',
data: { identifiantProjet: identifiantProjet.formatter() },
});

return Option.match(changement)
.some((changement) => changement.demande.statut.estDemandé())
.none(() => false);
if (Option.isSome(représentantLégal) && représentantLégal.demandeEnCours) {
return représentantLégal.demandeEnCours.demandéLe;
}

return;
} catch (error) {
getLogger('getChangementReprésentant').error(
`Impossible de consulter la demande de changement de représentant légal`,
Expand All @@ -133,6 +138,6 @@ const getChangementReprésentantLégal = async (identifiantProjet: IdentifiantPr
contexte: 'legacy',
},
);
return false;
return;
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ export const Contact = ({
)}
{représentantLégal.demandeDeModification?.peutConsulterLaDemandeExistante && (
<Link
href={Routes.ReprésentantLégal.changement.détail(identifiantProjet)}
href={Routes.ReprésentantLégal.changement.détail(
identifiantProjet,
représentantLégal.demandeDeModification.demandéLe,
)}
aria-label="Voir la demande de changement en cours"
className="block"
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export const changementReprésentantLégalDemandéNotification = async ({
variables: {
nom_projet: projet.nom,
departement_projet: projet.département,
url: `${baseUrl}${Routes.ReprésentantLégal.changement.détail(identifiantProjet.formatter())}`,
url: `${baseUrl}${Routes.ReprésentantLégal.changement.détail(identifiantProjet.formatter(), event.payload.demandéLe)}`,
},
});
};
Original file line number Diff line number Diff line change
Expand Up @@ -55,20 +55,40 @@ export const handleReprésentantLégalRappelInstructionÀDeuxMois = async ({
return;
}

const changement =
const représentantLégal = await mediator.send<ReprésentantLégal.ConsulterReprésentantLégalQuery>({
type: 'Lauréat.ReprésentantLégal.Query.ConsulterReprésentantLégal',
data: { identifiantProjet: identifiantProjet.formatter() },
});

if (Option.isNone(représentantLégal)) {
getLogger().warn(`Aucun représentant légal n'a été trouvé pour le rappel à 2 mois`, {
event,
});
return;
}
if (!représentantLégal.demandeEnCours) {
getLogger().warn(`Aucune demande en cours pour le rappel à 2 mois`, {
event,
});
return;
}

const changementReprésentantLégal =
await mediator.send<ReprésentantLégal.ConsulterChangementReprésentantLégalQuery>({
type: 'Lauréat.ReprésentantLégal.Query.ConsulterChangementReprésentantLégal',
data: {
identifiantProjet: identifiantProjet.formatter(),
demandéLe: représentantLégal.demandeEnCours.demandéLe,
},
});

if (Option.isNone(changement)) {
getLogger().error('Aucun changement de représentant légal à traiter', {
identifiantProjet: identifiantProjet.formatter(),
application: 'notifications',
fonction: 'handleReprésentantLégalRappelInstructionÀDeuxMois',
});
if (Option.isNone(changementReprésentantLégal)) {
getLogger().warn(
`Aucun changement de représentant légal n'a été trouvé pour le rappel à 2 mois`,
{
event,
},
);
return;
}

Expand All @@ -88,7 +108,7 @@ export const handleReprésentantLégalRappelInstructionÀDeuxMois = async ({
type: typeTâchePlanifiée === 'accord-automatique' ? 'accord' : 'rejet',
nom_projet: nom,
departement_projet: département,
url: `${baseUrl}${Routes.ReprésentantLégal.changement.détail(identifiantProjet.formatter())}`,
url: `${baseUrl}${Routes.ReprésentantLégal.changement.détail(identifiantProjet.formatter(), changementReprésentantLégal.demande.demandéLe.formatter())}`,
},
});
};
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ReprésentantLégal } from '@potentiel-domain/laureat';
import { findProjection } from '@potentiel-infrastructure/pg-projections';
import { Option } from '@potentiel-libraries/monads';
import { getLogger } from '@potentiel-libraries/monitoring';
import { Option } from '@potentiel-libraries/monads';

import { updateOneProjection, upsertProjection } from '../../../../infrastructure';
import { upsertProjection } from '../../../../infrastructure';

export const changementReprésentantLégalAccordéProjector = async (
event: ReprésentantLégal.ChangementReprésentantLégalAccordéEvent,
Expand All @@ -18,20 +18,45 @@ export const changementReprésentantLégalAccordéProjector = async (
},
} = event;

const représentantLégal = await findProjection<ReprésentantLégal.ReprésentantLégalEntity>(
`représentant-légal|${identifiantProjet}`,
);

if (Option.isNone(représentantLégal)) {
getLogger().error(
`Aucun représentant légal n'a été trouvé pour le changement de représentant accordé`,
{
event,
},
);
return;
}
if (!représentantLégal.demandeEnCours) {
getLogger().error(`Aucune demande en cours pour le changement de représentant accordé`, {
event,
});
return;
}

const identifiantChangement = `${identifiantProjet}#${représentantLégal.demandeEnCours.demandéLe}`;

const changementReprésentantLégal =
await findProjection<ReprésentantLégal.ChangementReprésentantLégalEntity>(
`changement-représentant-légal|${identifiantProjet}`,
`changement-représentant-légal|${identifiantChangement}`,
);

if (Option.isNone(changementReprésentantLégal)) {
getLogger().warn(`Aucune demande n'a été trouvée pour le changement de représentant accordé`, {
event,
});
getLogger().error(
`Aucun changement de représentant légal n'a été trouvé pour le changement de représentant accordé`,
{
event,
},
);
return;
}

await upsertProjection<ReprésentantLégal.ChangementReprésentantLégalEntity>(
`changement-représentant-légal|${identifiantProjet}`,
`changement-représentant-légal|${identifiantChangement}`,
{
...changementReprésentantLégal,
demande: {
Expand All @@ -47,9 +72,10 @@ export const changementReprésentantLégalAccordéProjector = async (
},
);

await updateOneProjection<ReprésentantLégal.ReprésentantLégalEntity>(
await upsertProjection<ReprésentantLégal.ReprésentantLégalEntity>(
`représentant-légal|${identifiantProjet}`,
{
identifiantProjet,
nomReprésentantLégal,
typeReprésentantLégal,
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ReprésentantLégal } from '@potentiel-domain/laureat';
import { getLogger } from '@potentiel-libraries/monitoring';
import { findProjection } from '@potentiel-infrastructure/pg-projections';
import { Option } from '@potentiel-libraries/monads';
import { getLogger } from '@potentiel-libraries/monitoring';

import { removeProjection } from '../../../../infrastructure';
import { removeProjection, upsertProjection } from '../../../../infrastructure';

export const changementReprésentantLégalAnnuléProjector = async (
event: ReprésentantLégal.ChangementReprésentantLégalAnnuléEvent,
Expand All @@ -12,20 +12,36 @@ export const changementReprésentantLégalAnnuléProjector = async (
payload: { identifiantProjet },
} = event;

const changementReprésentantLégal =
await findProjection<ReprésentantLégal.ChangementReprésentantLégalEntity>(
`changement-représentant-légal|${identifiantProjet}`,
);
const représentantLégal = await findProjection<ReprésentantLégal.ReprésentantLégalEntity>(
`représentant-légal|${identifiantProjet}`,
);

if (Option.isNone(changementReprésentantLégal)) {
getLogger().warn(
`Aucune demande n'a été trouvée pour l'annulation de la demande de changement de représentant légal`,
if (Option.isNone(représentantLégal)) {
getLogger().error(
`Aucun représentant légal n'a été trouvé pour le changement de représentant annulé`,
{
event,
},
);
return;
}
if (!représentantLégal.demandeEnCours) {
getLogger().error(`Aucune demande en cours pour le changement de représentant annulé`, {
event,
});
return;
}

const identifiantChangement = `${identifiantProjet}#${représentantLégal.demandeEnCours.demandéLe}`;

await removeProjection(`changement-représentant-légal|${identifiantChangement}`);

await removeProjection(`changement-représentant-légal|${identifiantProjet}`);
await upsertProjection<ReprésentantLégal.ReprésentantLégalEntity>(
`représentant-légal|${identifiantProjet}`,
{
identifiantProjet,
nomReprésentantLégal: représentantLégal.nomReprésentantLégal,
typeReprésentantLégal: représentantLégal.typeReprésentantLégal,
},
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { getLogger } from '@potentiel-libraries/monitoring';
import { IdentifiantProjet } from '@potentiel-domain/common';
import { findProjection } from '@potentiel-infrastructure/pg-projections';

import { upsertProjection } from '../../../../infrastructure';
import { updateOneProjection, upsertProjection } from '../../../../infrastructure';

export const changementReprésentantLégalDemandéProjector = async ({
payload: {
Expand Down Expand Up @@ -33,8 +33,10 @@ export const changementReprésentantLégalDemandéProjector = async ({
const { appelOffre, période, famille, numéroCRE } =
IdentifiantProjet.convertirEnValueType(identifiantProjet);

const identifiantChangement = `${identifiantProjet}#${demandéLe}`;

await upsertProjection<ReprésentantLégal.ChangementReprésentantLégalEntity>(
`changement-représentant-légal|${identifiantProjet}`,
`changement-représentant-légal|${identifiantChangement}`,
{
identifiantProjet,
projet: {
Expand All @@ -55,4 +57,11 @@ export const changementReprésentantLégalDemandéProjector = async ({
},
},
);

await updateOneProjection<ReprésentantLégal.ReprésentantLégalEntity>(
`représentant-légal|${identifiantProjet}`,
{
demandeEnCours: { demandéLe },
},
);
};
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ReprésentantLégal } from '@potentiel-domain/laureat';
import { getLogger } from '@potentiel-libraries/monitoring';
import { findProjection } from '@potentiel-infrastructure/pg-projections';
import { Option } from '@potentiel-libraries/monads';
import { getLogger } from '@potentiel-libraries/monitoring';

import { upsertProjection } from '../../../../infrastructure';

Expand All @@ -12,20 +12,45 @@ export const changementReprésentantLégalRejetéProjector = async (
payload: { identifiantProjet, motifRejet, rejetéLe, rejetéPar },
} = event;

const représentantLégal = await findProjection<ReprésentantLégal.ReprésentantLégalEntity>(
`représentant-légal|${identifiantProjet}`,
);

if (Option.isNone(représentantLégal)) {
getLogger().error(
`Aucun représentant légal n'a été trouvé pour le changement de représentant rejeté`,
{
event,
},
);
return;
}
if (!représentantLégal.demandeEnCours) {
getLogger().error(`Aucune demande en cours pour le changement de représentant rejeté`, {
event,
});
return;
}

const identifiantChangement = `${identifiantProjet}#${représentantLégal.demandeEnCours.demandéLe}`;

const changementReprésentantLégal =
await findProjection<ReprésentantLégal.ChangementReprésentantLégalEntity>(
`changement-représentant-légal|${identifiantProjet}`,
`changement-représentant-légal|${identifiantChangement}`,
);

if (Option.isNone(changementReprésentantLégal)) {
getLogger().warn(`Aucune demande n'a été trouvée pour le changement de représentant rejeté`, {
event,
});
getLogger().error(
`Aucun changement de représentant légal n'a été trouvé pour le changement de représentant rejeté`,
{
event,
},
);
return;
}

await upsertProjection<ReprésentantLégal.ChangementReprésentantLégalEntity>(
`changement-représentant-légal|${identifiantProjet}`,
`changement-représentant-légal|${identifiantChangement}`,
{
...changementReprésentantLégal,
demande: {
Expand All @@ -39,4 +64,13 @@ export const changementReprésentantLégalRejetéProjector = async (
},
},
);

await upsertProjection<ReprésentantLégal.ReprésentantLégalEntity>(
`représentant-légal|${identifiantProjet}`,
{
identifiantProjet,
nomReprésentantLégal: représentantLégal.nomReprésentantLégal,
typeReprésentantLégal: représentantLégal.typeReprésentantLégal,
},
);
};
Loading
Loading