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

[CREATION ESPACE AIDANT] Prends en compte la date de signature de la charte #831

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
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
5 changes: 5 additions & 0 deletions mon-aide-cyber-api/src/adaptateurs/adaptateurEnvironnement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,18 @@ const apiRechercheEntreprise = () => ({
url: () => process.env.URL_API_RECHERCHE_ENTREPRISE || '',
});

const nouveauParcoursDevenirAidant = () =>
process.env.DATE_NOUVEAU_PARCOURS_DEMANDE_DEVENIR_AIDANT ||
'2025-01-31T00:00:00';

const adaptateurEnvironnement = {
messagerie,
mac,
proConnect,
modeMaintenance,
siretsEntreprise,
apiRechercheEntreprise,
nouveauParcoursDevenirAidant,
};

export { sentry, adaptateurEnvironnement };
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,18 @@ import { Entrepots } from '../../domaine/Entrepots';
import { ServiceDeChiffrement } from '../../securite/ServiceDeChiffrement';
import { SagaDemandeAidantCreeEspaceAidant } from '../../gestion-demandes/devenir-aidant/CapteurSagaDemandeAidantCreeEspaceAidant';
import { ErreurMAC } from '../../domaine/erreurMAC';
import { FournisseurHorloge } from '../../infrastructure/horloge/FournisseurHorloge';
import { isAfter } from 'date-fns';
import { adaptateurEnvironnement } from '../../adaptateurs/adaptateurEnvironnement';

export const validateurDemande = (
entrepots: Entrepots,
serviceDeChiffrement: ServiceDeChiffrement
) => {
const { body } = new ExpressValidator({
verifieCoherenceDeLaDemande: async (value: string) => {
verifieCoherenceDeLaDemande: async (valeur: string) => {
const tokenConverti: { demande: string; mail: string } = JSON.parse(
atob(serviceDeChiffrement.dechiffre(value))
atob(serviceDeChiffrement.dechiffre(valeur))
);

await entrepots.demandesDevenirAidant().lis(tokenConverti.demande);
Expand All @@ -52,6 +55,45 @@ export const validateurDemande = (
];
};

const validateurNouveauParcoursDemandeDevenirAidant = () => {
const dateNouveauParcoursDemandeDevenirAidant =
adaptateurEnvironnement.nouveauParcoursDevenirAidant();
if (dateNouveauParcoursDemandeDevenirAidant) {
if (
isAfter(
FournisseurHorloge.maintenant(),
FournisseurHorloge.enDate(dateNouveauParcoursDemandeDevenirAidant)
)
) {
const { body } = new ExpressValidator({
typeEntite: async (valeur: string) => {
if (valeur !== ('ServicePublic' && 'ServiceEtat' && 'Association')) {
throw new Error(
'Veuillez fournir l’une des valeurs suivantes pour le type d’entité ’ServicePublic’, ’ServiceEtat’, ’Association’'
);
}
return true;
},
});
return [
body('signatureCharte')
.custom((value: boolean) => value)
.withMessage('Veuillez signer la Charte Aidant.'),
body('entite.nom')
.optional()
.notEmpty()
.withMessage('Veuillez renseigner un nom pour votre entité'),
body('entite.siret')
.optional()
.notEmpty()
.withMessage('Veuillez renseigner un SIRET pour votre entité'),
body('entite.type').optional().typeEntite(),
];
}
}
return [];
};

export const routesAPIDemandesDevenirAidant = (
configuration: ConfigurationServeur
) => {
Expand Down Expand Up @@ -82,6 +124,7 @@ export const routesAPIDemandesDevenirAidant = (
body('cguValidees')
.custom((value: boolean) => value)
.withMessage('Veuillez valider les CGU'),
validateurNouveauParcoursDemandeDevenirAidant(),
async (requete: Request, reponse: Response, suite: NextFunction) => {
try {
const resultatsValidation: Result<FieldValidationError> =
Expand Down
1 change: 1 addition & 0 deletions mon-aide-cyber-api/src/espace-aidant/Aidant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export type Aidant = Aggregat & {
consentementAnnuaire: boolean;
siret?: Siret;
dateSignatureCGU?: Date;
dateSignatureCharte?: Date;
};

export interface EntrepotAidant extends Entrepot<Aidant> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export type CommandeCreeEspaceAidant = Omit<Commande, 'type'> & {
nomPrenom: string;
departement: Departement;
siret?: Siret;
dateSignatureCharte?: Date;
};

export type EspaceAidantCree = {
Expand Down Expand Up @@ -66,6 +67,9 @@ export class CapteurCommandeCreeEspaceAidant
},
consentementAnnuaire: false,
...(commande.siret && { siret: commande.siret }),
...(commande.dateSignatureCharte && {
dateSignatureCharte: commande.dateSignatureCharte,
}),
};
return this.entrepots
.aidants()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { CapteurCommande, Commande } from '../../domaine/commande';
import { DemandeDevenirAidant, StatutDemande } from './DemandeDevenirAidant';
import {
DemandeDevenirAidant,
EntiteDemande,
StatutDemande,
TypeEntite,
} from './DemandeDevenirAidant';
import { Entrepots } from '../../domaine/Entrepots';
import { FournisseurHorloge } from '../../infrastructure/horloge/FournisseurHorloge';
import { ErreurMAC } from '../../domaine/erreurMAC';
Expand All @@ -11,13 +16,15 @@ import { BusEvenement, Evenement } from '../../domaine/BusEvenement';
import crypto from 'crypto';
import { ErreurEnvoiEmail } from '../../api/messagerie/Messagerie';
import { ServiceAidant } from '../../espace-aidant/ServiceAidant';
import { isBefore } from 'date-fns';

export type CommandeDevenirAidant = Omit<Commande, 'type'> & {
type: 'CommandeDevenirAidant';
departement: Departement;
mail: string;
prenom: string;
nom: string;
entite?: EntiteDemande;
};

class ErreurDemandeDevenirAidant extends Error {
Expand Down Expand Up @@ -72,6 +79,7 @@ export class CapteurCommandeDevenirAidant
nom: commande.nom,
prenom: commande.prenom,
statut: StatutDemande.EN_COURS,
...(commande.entite && { entite: commande.entite }),
};

return this.entrepots
Expand All @@ -95,7 +103,14 @@ export class CapteurCommandeDevenirAidant
}

private async demandeExiste(mail: string): Promise<boolean> {
return await this.entrepots.demandesDevenirAidant().demandeExiste(mail);
return (
isBefore(
FournisseurHorloge.maintenant(),
FournisseurHorloge.enDate(
adaptateurEnvironnement.nouveauParcoursDevenirAidant()
)
) && (await this.entrepots.demandesDevenirAidant().demandeExiste(mail))
);
}

private async aidantExiste(mailDemandeur: string) {
Expand Down Expand Up @@ -133,6 +148,9 @@ export class CapteurCommandeDevenirAidant
date: demandeDevenirAidant.date,
departement: demandeDevenirAidant.departement.nom,
identifiantDemande: demandeDevenirAidant.identifiant,
...(demandeDevenirAidant.entite && {
type: demandeDevenirAidant.entite.type,
}),
},
});
}
Expand All @@ -142,4 +160,5 @@ export type DemandeDevenirAidantCreee = Evenement<{
date: Date;
departement: string;
identifiantDemande: crypto.UUID;
type?: TypeEntite;
}>;
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export class CapteurSagaDemandeAidantCreeEspaceAidant
nomPrenom: utilisateur.nomPrenom,
type: 'CommandeCreeEspaceAidant',
departement: demande.departement,
dateSignatureCharte: demande.date,
})
.then((compte) => {
return this.entrepots
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export type DemandeDevenirAidant = Aggregat & {
mail: string;
departement: Departement;
statut: StatutDemande;
entite?: EntiteDemande;
};
export interface EntrepotDemandeDevenirAidant
extends Entrepot<DemandeDevenirAidant> {
Expand All @@ -23,3 +24,11 @@ export interface EntrepotDemandeDevenirAidant
mail: string
): Promise<DemandeDevenirAidant | undefined>;
}

export type TypeEntite = 'ServicePublic' | 'ServiceEtat' | 'Association';

export type EntiteDemande = {
type: TypeEntite;
nom?: string;
siret?: string;
};
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ type DonneesAidant = {
preferences: PreferencesDTO;
consentementAnnuaire: boolean;
dateSignatureCGU?: string;
dateSignatureCharte?: string;
siret?: string;
};

Expand Down Expand Up @@ -72,6 +73,11 @@ export class EntrepotAidantPostgres
),
}),
...(dto.donnees.siret && { siret: dto.donnees.siret }),
...(dto.donnees.dateSignatureCharte && {
dateSignatureCharte: FournisseurHorloge.enDate(
dto.donnees.dateSignatureCharte
),
}),
};
}

Expand All @@ -94,6 +100,9 @@ export class EntrepotAidantPostgres
dateSignatureCGU: entite.dateSignatureCGU.toISOString(),
}),
...(entite.siret && { siret: entite.siret }),
...(entite.dateSignatureCharte && {
dateSignatureCharte: entite.dateSignatureCharte.toISOString(),
}),
},
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ type RequeteDemandeDevenirAidant = {
mail: string;
departement: string;
cguValidees: boolean;
signatureCharte?: boolean;
entite?: { type: string; nom?: string; siret?: string };
};

class ConstructeurRequeteDemandeDevenirAidant
Expand All @@ -20,6 +22,9 @@ class ConstructeurRequeteDemandeDevenirAidant
private departement: string =
departements[fakerFR.number.int({ min: 0, max: departements.length - 1 })]
.nom;
private signatureCharte: boolean | undefined = undefined;
private entite: { type: string; nom?: string; siret?: string } | undefined =
undefined;

dansLeDepartement(
departement: string
Expand All @@ -38,13 +43,46 @@ class ConstructeurRequeteDemandeDevenirAidant
return this;
}

sansCharteAidant(): ConstructeurRequeteDemandeDevenirAidant {
this.signatureCharte = false;
return this;
}

dansUneEntite = (
nom: string,
siret: string,
type: string
): ConstructeurRequeteDemandeDevenirAidant => {
this.entite = {
nom,
siret,
type,
};
return this;
};

ayantSigneLaCharte(): ConstructeurRequeteDemandeDevenirAidant {
this.signatureCharte = true;
return this;
}

enAttenteAdhesionAssociation(): ConstructeurRequeteDemandeDevenirAidant {
this.signatureCharte = true;
this.entite = { type: 'Association' };
return this;
}

construis(): RequeteDemandeDevenirAidant {
return {
cguValidees: this.cguValidees,
departement: this.departement,
mail: this.mail,
nom: this.nom,
prenom: this.prenom,
...(this.signatureCharte !== undefined && {
signatureCharte: this.signatureCharte,
}),
...(this.entite !== undefined && { entite: this.entite }),
};
}
}
Expand Down
Loading
Loading