diff --git a/src/application/commands/pole-emploi/creer-jeune-pole-emploi.command.handler.ts b/src/application/commands/pole-emploi/creer-jeune-pole-emploi.command.handler.ts index f3cdbca5f..8358d2e08 100644 --- a/src/application/commands/pole-emploi/creer-jeune-pole-emploi.command.handler.ts +++ b/src/application/commands/pole-emploi/creer-jeune-pole-emploi.command.handler.ts @@ -1,4 +1,5 @@ import { Inject, Injectable } from '@nestjs/common' +import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception' import { Command } from '../../../building-blocks/types/command' import { CommandHandler } from '../../../building-blocks/types/command-handler' import { @@ -64,7 +65,7 @@ export class CreerJeunePoleEmploiCommandHandler extends CommandHandler< email: conseiller.email }, structure: conseiller.structure, - dispositif: fromStructureToDispositif(conseiller.structure) + dispositif: fromStructureFTToDispositif(conseiller.structure) } const nouveauJeune = this.jeuneFactory.creer(jeuneACreer) await this.jeuneRepository.save(nouveauJeune) @@ -91,7 +92,7 @@ export class CreerJeunePoleEmploiCommandHandler extends CommandHandler< } } -function fromStructureToDispositif( +function fromStructureFTToDispositif( structure: Core.Structure ): Jeune.Dispositif { switch (structure) { @@ -105,7 +106,13 @@ function fromStructureToDispositif( return Jeune.Dispositif.CONSEIL_DEPT case Core.Structure.AVENIR_PRO: return Jeune.Dispositif.AVENIR_PRO - default: - return Jeune.Dispositif.CEJ + case Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF: + return Jeune.Dispositif.ACCOMPAGNEMENT_INTENSIF + case Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL: + return Jeune.Dispositif.ACCOMPAGNEMENT_GLOBAL + case Core.Structure.FT_EQUIP_EMPLOI_RECRUT: + return Jeune.Dispositif.EQUIP_EMPLOI_RECRUT + case Core.Structure.MILO: + throw new RuntimeException() } } diff --git a/src/application/commands/send-notifications-nouveaux-messages-externes.command.handler.ts b/src/application/commands/send-notifications-nouveaux-messages-externes.command.handler.ts index d3c205142..f6ea5e89b 100644 --- a/src/application/commands/send-notifications-nouveaux-messages-externes.command.handler.ts +++ b/src/application/commands/send-notifications-nouveaux-messages-externes.command.handler.ts @@ -44,7 +44,7 @@ export class SendNotificationsNouveauxMessagesExternesCommandHandler extends Com const jeunes = await this.jeuneRepository.findAllJeunesByIdsAuthentificationAndStructures( command.idsAuthentificationJeunes, - Core.structuresBeneficiaireFranceTravail + Core.structuresBeneficiaireFTConnect ) if (!jeunes.length) { diff --git a/src/application/commands/update-utilisateur.command.handler.ts b/src/application/commands/update-utilisateur.command.handler.ts index 77a2f2eb4..a1f05eb55 100644 --- a/src/application/commands/update-utilisateur.command.handler.ts +++ b/src/application/commands/update-utilisateur.command.handler.ts @@ -27,6 +27,7 @@ import { export type StructureUtilisateurAuth = Core.Structure | 'FRANCE_TRAVAIL' export type TypeUtilisateurAuth = Authentification.Type | 'BENEFICIAIRE' + export interface UpdateUtilisateurCommand extends Command { idUtilisateurAuth: string nom?: string @@ -61,43 +62,22 @@ export class UpdateUtilisateurCommandHandler extends CommandHandler< ...command, email: command.email?.toLocaleLowerCase() } + switch (commandSanitized.type) { case Authentification.Type.CONSEILLER: - switch (commandSanitized.structure) { - case Core.Structure.MILO: - case Core.Structure.POLE_EMPLOI: - case Core.Structure.POLE_EMPLOI_BRSA: - case Core.Structure.POLE_EMPLOI_AIJ: - case Core.Structure.CONSEIL_DEPT: - case Core.Structure.AVENIR_PRO: - return this.recupererOuCreerUtilisateurConseiller(commandSanitized) - case 'FRANCE_TRAVAIL': - return this.recupererUtilisateurConseillerExistant(commandSanitized) - } - break + return this.recupererConseiller(commandSanitized) case Authentification.Type.JEUNE: - switch (commandSanitized.structure) { - case Core.Structure.MILO: - return this.authentificationJeuneMilo(commandSanitized) - case Core.Structure.POLE_EMPLOI: - case Core.Structure.POLE_EMPLOI_BRSA: - case Core.Structure.POLE_EMPLOI_AIJ: - return this.authentificationBeneficiaireFT(commandSanitized) - } - break case 'BENEFICIAIRE': - if (commandSanitized.structure === 'FRANCE_TRAVAIL') { - return this.authentificationBeneficiaireFT(commandSanitized) - } - break + return this.recupererBeneficiaire(commandSanitized) + case Authentification.Type.SUPPORT: + return failure( + new NonTraitableError( + 'Utilisateur', + commandSanitized.idUtilisateurAuth, + NonTraitableReason.TYPE_UTILISATEUR_NON_TRAITABLE + ) + ) } - return failure( - new NonTraitableError( - 'Utilisateur', - command.idUtilisateurAuth, - NonTraitableReason.TYPE_STRUCTURE_NON_TRATABLE - ) - ) } async authorize(): Promise { @@ -108,6 +88,51 @@ export class UpdateUtilisateurCommandHandler extends CommandHandler< return } + private recupererConseiller( + commandSanitized: UpdateUtilisateurCommand + ): Promise> { + switch (commandSanitized.structure) { + case Core.Structure.MILO: + case Core.Structure.POLE_EMPLOI: + case Core.Structure.POLE_EMPLOI_BRSA: + case Core.Structure.POLE_EMPLOI_AIJ: + case Core.Structure.CONSEIL_DEPT: + case Core.Structure.AVENIR_PRO: + case Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF: + case Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL: + case Core.Structure.FT_EQUIP_EMPLOI_RECRUT: + return this.recupererOuCreerUtilisateurConseiller(commandSanitized) + case 'FRANCE_TRAVAIL': + return this.recupererUtilisateurConseillerExistant(commandSanitized) + } + } + + private async recupererBeneficiaire( + commandSanitized: UpdateUtilisateurCommand + ): Promise> { + switch (commandSanitized.structure) { + case Core.Structure.MILO: + return this.authentificationJeuneMilo(commandSanitized) + case Core.Structure.POLE_EMPLOI: + case Core.Structure.POLE_EMPLOI_BRSA: + case Core.Structure.POLE_EMPLOI_AIJ: + case Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF: + case Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL: + case Core.Structure.FT_EQUIP_EMPLOI_RECRUT: + case 'FRANCE_TRAVAIL': + return this.authentificationBeneficiaireFT(commandSanitized) + case Core.Structure.CONSEIL_DEPT: + case Core.Structure.AVENIR_PRO: + return failure( + new NonTraitableError( + 'Utilisateur', + commandSanitized.idUtilisateurAuth, + NonTraitableReason.STRUCTURE_UTILISATEUR_NON_TRAITABLE + ) + ) + } + } + private async authentifierJeuneParEmail( command: UpdateUtilisateurCommand ): Promise> { @@ -379,6 +404,7 @@ function verifierStructureBeneficiaire( return emptySuccess() } } + if (utilisateurTrouve.structure !== structureAttendue) { const reason = reasonFromStructure(utilisateurTrouve.structure) diff --git a/src/application/jobs/maj-segments.job.handler.db.ts b/src/application/jobs/maj-segments.job.handler.db.ts index 0089473c2..aeff24a91 100644 --- a/src/application/jobs/maj-segments.job.handler.db.ts +++ b/src/application/jobs/maj-segments.job.handler.db.ts @@ -28,7 +28,10 @@ enum SEGMENTS { JEUNES_POLE_EMPLOI_BRSA = 'JEUNES_POLE_EMPLOI_BRSA', JEUNES_POLE_EMPLOI_AIJ = 'JEUNES_POLE_EMPLOI_AIJ', JEUNES_POLE_EMPLOI_CD = 'JEUNES_POLE_EMPLOI_CD', - JEUNES_POLE_EMPLOI_AVENIR_PRO = 'JEUNES_POLE_EMPLOI_AVENIR_PRO' + JEUNES_POLE_EMPLOI_AVENIR_PRO = 'JEUNES_POLE_EMPLOI_AVENIR_PRO', + BENEFICIAIRES_FRANCE_TRAVAIL_ACCOMPAGNEMENT_INTENSIF = 'BENEFICIAIRES_FRANCE_TRAVAIL_ACCOMPAGNEMENT_INTENSIF', + BENEFICIAIRES_FRANCE_TRAVAIL_ACCOMPAGNEMENT_GLOBAL = 'BENEFICIAIRES_FRANCE_TRAVAIL_ACCOMPAGNEMENT_GLOBAL', + BENEFICIAIRES_FRANCE_TRAVAIL_EQUIP_EMPLOI_RECRUT = 'BENEFICIAIRES_FRANCE_TRAVAIL_EQUIP_EMPLOI_RECRUT' } @Injectable() @@ -202,8 +205,12 @@ export class MajSegmentsJobHandler extends JobHandler { return SEGMENTS.JEUNES_POLE_EMPLOI_CD case Core.Structure.AVENIR_PRO: return SEGMENTS.JEUNES_POLE_EMPLOI_AVENIR_PRO - default: - throw new Error(`Unknown structure ${structure}`) + case Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF: + return SEGMENTS.BENEFICIAIRES_FRANCE_TRAVAIL_ACCOMPAGNEMENT_INTENSIF + case Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL: + return SEGMENTS.BENEFICIAIRES_FRANCE_TRAVAIL_ACCOMPAGNEMENT_GLOBAL + case Core.Structure.FT_EQUIP_EMPLOI_RECRUT: + return SEGMENTS.BENEFICIAIRES_FRANCE_TRAVAIL_EQUIP_EMPLOI_RECRUT } } diff --git a/src/building-blocks/types/domain-error.ts b/src/building-blocks/types/domain-error.ts index d6bfb51e2..7c4bc49c5 100644 --- a/src/building-blocks/types/domain-error.ts +++ b/src/building-blocks/types/domain-error.ts @@ -1,5 +1,6 @@ export enum NonTraitableReason { - TYPE_STRUCTURE_NON_TRATABLE = 'TYPE_STRUCTURE_NON_TRATABLE', + TYPE_UTILISATEUR_NON_TRAITABLE = 'TYPE_UTILISATEUR_NON_TRAITABLE', + STRUCTURE_UTILISATEUR_NON_TRAITABLE = 'STRUCTURE_UTILISATEUR_NON_TRAITABLE', EMAIL_BENEFICIAIRE_INTROUVABLE = 'EMAIL_BENEFICIAIRE_INTROUVABLE', UTILISATEUR_INEXISTANT = 'UTILISATEUR_INEXISTANT', UTILISATEUR_DEJA_MILO = 'UTILISATEUR_DEJA_MILO', diff --git a/src/domain/authentification.ts b/src/domain/authentification.ts index e14ddb230..a6ff69e26 100644 --- a/src/domain/authentification.ts +++ b/src/domain/authentification.ts @@ -32,7 +32,8 @@ export namespace Authentification { id: 'SUPPORT', prenom: 'support', nom: 'cej', - structure: Core.Structure.SUPPORT, + // @ts-expect-error structure utilisateur SUPPORT inutile ailleurs + structure: 'SUPPORT', type: Authentification.Type.SUPPORT, roles: [] } diff --git a/src/domain/core.ts b/src/domain/core.ts index e19824c59..c89fb84de 100644 --- a/src/domain/core.ts +++ b/src/domain/core.ts @@ -1,25 +1,35 @@ export namespace Core { export enum Structure { MILO = 'MILO', - SUPPORT = 'SUPPORT', POLE_EMPLOI = 'POLE_EMPLOI', POLE_EMPLOI_BRSA = 'POLE_EMPLOI_BRSA', POLE_EMPLOI_AIJ = 'POLE_EMPLOI_AIJ', CONSEIL_DEPT = 'CONSEIL_DEPT', - AVENIR_PRO = 'AVENIR_PRO' + AVENIR_PRO = 'AVENIR_PRO', + FT_ACCOMPAGNEMENT_INTENSIF = 'FT_ACCOMPAGNEMENT_INTENSIF', + FT_ACCOMPAGNEMENT_GLOBAL = 'FT_ACCOMPAGNEMENT_GLOBAL', + FT_EQUIP_EMPLOI_RECRUT = 'FT_EQUIP_EMPLOI_RECRUT' } - export const structuresBeneficiaireFranceTravail = [ + export const structuresBeneficiaireFTConnect = [ Core.Structure.POLE_EMPLOI, Core.Structure.CONSEIL_DEPT, Core.Structure.POLE_EMPLOI_BRSA, Core.Structure.POLE_EMPLOI_AIJ, - Core.Structure.AVENIR_PRO + Core.Structure.AVENIR_PRO, + Core.Structure.CONSEIL_DEPT, + Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF, + Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL, + Core.Structure.FT_EQUIP_EMPLOI_RECRUT ] + export type StructuresPoleEmploi = | Core.Structure.POLE_EMPLOI | Core.Structure.POLE_EMPLOI_BRSA | Core.Structure.POLE_EMPLOI_AIJ + | Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF + | Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL + | Core.Structure.FT_EQUIP_EMPLOI_RECRUT export interface Id { id: string @@ -44,7 +54,10 @@ export function estPoleEmploi(structure: Core.Structure): boolean { return [ Core.Structure.POLE_EMPLOI, Core.Structure.POLE_EMPLOI_BRSA, - Core.Structure.POLE_EMPLOI_AIJ + Core.Structure.POLE_EMPLOI_AIJ, + Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF, + Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL, + Core.Structure.FT_EQUIP_EMPLOI_RECRUT ].includes(structure) } @@ -53,7 +66,10 @@ export function estPassEmploi(structure: Core.Structure): boolean { Core.Structure.POLE_EMPLOI_BRSA, Core.Structure.POLE_EMPLOI_AIJ, Core.Structure.CONSEIL_DEPT, - Core.Structure.AVENIR_PRO + Core.Structure.AVENIR_PRO, + Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF, + Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL, + Core.Structure.FT_EQUIP_EMPLOI_RECRUT ].includes(structure) } @@ -82,6 +98,7 @@ export const structuresCampagnes = [ Core.Structure.POLE_EMPLOI_BRSA, Core.Structure.POLE_EMPLOI_AIJ ] + export function peutVoirLesCampagnes(structure: Core.Structure): boolean { return structuresCampagnes.includes(structure) } diff --git a/src/domain/jeune/jeune.ts b/src/domain/jeune/jeune.ts index 02ad0ea0e..e4884fa04 100644 --- a/src/domain/jeune/jeune.ts +++ b/src/domain/jeune/jeune.ts @@ -65,7 +65,10 @@ export namespace Jeune { BRSA = 'BRSA', AIJ = 'AIJ', CONSEIL_DEPT = 'CONSEIL_DEPT', - AVENIR_PRO = 'AVENIR_PRO' + AVENIR_PRO = 'AVENIR_PRO', + ACCOMPAGNEMENT_INTENSIF = 'ACCOMPAGNEMENT_INTENSIF', + ACCOMPAGNEMENT_GLOBAL = 'ACCOMPAGNEMENT_GLOBAL', + EQUIP_EMPLOI_RECRUT = 'EQUIP_EMPLOI_RECRUT' } export type Id = Brand diff --git a/src/infrastructure/clients/mail-brevo.service.db.ts b/src/infrastructure/clients/mail-brevo.service.db.ts index b02419e83..67a97c058 100644 --- a/src/infrastructure/clients/mail-brevo.service.db.ts +++ b/src/infrastructure/clients/mail-brevo.service.db.ts @@ -144,22 +144,23 @@ export class MailBrevoService implements Mail.Service { motif: ArchiveJeune.MotifSuppression | ArchiveJeune.MotifSuppressionSupport, commentaire?: string ): Promise { - let templateId - switch (jeune.structure) { - case Core.Structure.MILO: - case Core.Structure.POLE_EMPLOI_AIJ: - case Core.Structure.AVENIR_PRO: - case Core.Structure.SUPPORT: - templateId = parseInt(this.templates.compteJeuneArchiveMILO) - break - case Core.Structure.POLE_EMPLOI: - templateId = parseInt(this.templates.compteJeuneArchivePECEJ) - break - case Core.Structure.POLE_EMPLOI_BRSA: - case Core.Structure.CONSEIL_DEPT: - templateId = parseInt(this.templates.compteJeuneArchivePEBRSA) - break - } + const templateId = ((): number => { + switch (jeune.structure) { + case Core.Structure.MILO: + return parseInt(this.templates.compteJeuneArchiveMILO) + case Core.Structure.POLE_EMPLOI: + return parseInt(this.templates.compteJeuneArchivePECEJ) + case Core.Structure.POLE_EMPLOI_BRSA: + case Core.Structure.POLE_EMPLOI_AIJ: + case Core.Structure.CONSEIL_DEPT: + case Core.Structure.AVENIR_PRO: + case Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF: + case Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL: + case Core.Structure.FT_EQUIP_EMPLOI_RECRUT: + return parseInt(this.templates.compteJeuneArchivePEBRSA) + } + })() + const mailDataDto: MailDataDto = { to: [ { diff --git a/src/infrastructure/repositories/jeune/jeune-pole-emploi-sql.repository.db.ts b/src/infrastructure/repositories/jeune/jeune-pole-emploi-sql.repository.db.ts index 0dce4828e..0a6e3776b 100644 --- a/src/infrastructure/repositories/jeune/jeune-pole-emploi-sql.repository.db.ts +++ b/src/infrastructure/repositories/jeune/jeune-pole-emploi-sql.repository.db.ts @@ -10,7 +10,7 @@ export class JeunePoleEmploiSqlRepository const jeunesSqlModel = await JeuneSqlModel.findAll({ where: { structure: { - [Op.in]: Core.structuresBeneficiaireFranceTravail + [Op.in]: Core.structuresBeneficiaireFTConnect }, pushNotificationToken: { [Op.ne]: null }, notificationsRendezVousSessions: true, diff --git a/src/infrastructure/routes/validation/conseillers.inputs.ts b/src/infrastructure/routes/validation/conseillers.inputs.ts index a387e50af..23827b77d 100644 --- a/src/infrastructure/routes/validation/conseillers.inputs.ts +++ b/src/infrastructure/routes/validation/conseillers.inputs.ts @@ -42,7 +42,10 @@ export class GetConseillersQueryParams { @IsIn([ Core.Structure.POLE_EMPLOI, Core.Structure.POLE_EMPLOI_BRSA, - Core.Structure.POLE_EMPLOI_AIJ + Core.Structure.POLE_EMPLOI_AIJ, + Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF, + Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL, + Core.Structure.FT_EQUIP_EMPLOI_RECRUT ]) structure?: string } diff --git a/test/application/commands/send-notifications-nouveaux-messages-externes.command.handler.test.ts b/test/application/commands/send-notifications-nouveaux-messages-externes.command.handler.test.ts index 0be39f505..65bd5e781 100644 --- a/test/application/commands/send-notifications-nouveaux-messages-externes.command.handler.test.ts +++ b/test/application/commands/send-notifications-nouveaux-messages-externes.command.handler.test.ts @@ -50,7 +50,7 @@ describe('SendNotificationsNouveauxMessagesExternesCommandHandler', () => { jeuneRepository.findAllJeunesByIdsAuthentificationAndStructures .withArgs( command.idsAuthentificationJeunes, - Core.structuresBeneficiaireFranceTravail + Core.structuresBeneficiaireFTConnect ) .resolves(jeunes) @@ -78,7 +78,7 @@ describe('SendNotificationsNouveauxMessagesExternesCommandHandler', () => { jeuneRepository.findAllJeunesByIdsAuthentificationAndStructures .withArgs( command.idsAuthentificationJeunes, - Core.structuresBeneficiaireFranceTravail + Core.structuresBeneficiaireFTConnect ) .resolves([jeune1]) @@ -108,7 +108,7 @@ describe('SendNotificationsNouveauxMessagesExternesCommandHandler', () => { jeuneRepository.findAllJeunesByIdsAuthentificationAndStructures .withArgs( command.idsAuthentificationJeunes, - Core.structuresBeneficiaireFranceTravail + Core.structuresBeneficiaireFTConnect ) .resolves([]) diff --git a/test/fixtures/authentification.fixture.ts b/test/fixtures/authentification.fixture.ts index bfd74a724..232a3ab2d 100644 --- a/test/fixtures/authentification.fixture.ts +++ b/test/fixtures/authentification.fixture.ts @@ -82,7 +82,8 @@ export const unUtilisateurSupport = ( prenom: 'John', type: Authentification.Type.SUPPORT, email: 'john.doe@plop.io', - structure: Core.Structure.SUPPORT, + // @ts-expect-error structure utilisateur SUPPORT inutile ailleurs + structure: 'SUPPORT', roles: [] } diff --git a/test/infrastructure/repositories/jeune/jeune-sql.repository.db.test.ts b/test/infrastructure/repositories/jeune/jeune-sql.repository.db.test.ts index c3ac7cd0d..9dd893254 100644 --- a/test/infrastructure/repositories/jeune/jeune-sql.repository.db.test.ts +++ b/test/infrastructure/repositories/jeune/jeune-sql.repository.db.test.ts @@ -315,7 +315,7 @@ describe('JeuneSqlRepository', () => { const result = await jeuneSqlRepository.findAllJeunesByIdsAuthentificationAndStructures( ['id-auth-1', 'id-auth-2', 'id-auth-3'], - Core.structuresBeneficiaireFranceTravail + Core.structuresBeneficiaireFTConnect ) // Then @@ -331,7 +331,7 @@ describe('JeuneSqlRepository', () => { const result = await jeuneSqlRepository.findAllJeunesByIdsAuthentificationAndStructures( ['FAUX_ID'], - Core.structuresBeneficiaireFranceTravail + Core.structuresBeneficiaireFTConnect ) // Then