Skip to content

Commit

Permalink
feat: ajoute nouveaux accompagnements (#1681)
Browse files Browse the repository at this point in the history
  • Loading branch information
arthurlbrjc authored Feb 12, 2025
1 parent 0480270 commit 4c46ec4
Show file tree
Hide file tree
Showing 14 changed files with 140 additions and 73 deletions.
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -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)
Expand All @@ -91,7 +92,7 @@ export class CreerJeunePoleEmploiCommandHandler extends CommandHandler<
}
}

function fromStructureToDispositif(
function fromStructureFTToDispositif(
structure: Core.Structure
): Jeune.Dispositif {
switch (structure) {
Expand All @@ -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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export class SendNotificationsNouveauxMessagesExternesCommandHandler extends Com
const jeunes =
await this.jeuneRepository.findAllJeunesByIdsAuthentificationAndStructures(
command.idsAuthentificationJeunes,
Core.structuresBeneficiaireFranceTravail
Core.structuresBeneficiaireFTConnect
)

if (!jeunes.length) {
Expand Down
90 changes: 58 additions & 32 deletions src/application/commands/update-utilisateur.command.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<Result> {
Expand All @@ -108,6 +88,51 @@ export class UpdateUtilisateurCommandHandler extends CommandHandler<
return
}

private recupererConseiller(
commandSanitized: UpdateUtilisateurCommand
): Promise<Result<UtilisateurQueryModel>> {
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<Result<UtilisateurQueryModel>> {
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<Result<UtilisateurQueryModel>> {
Expand Down Expand Up @@ -379,6 +404,7 @@ function verifierStructureBeneficiaire(
return emptySuccess()
}
}

if (utilisateurTrouve.structure !== structureAttendue) {
const reason = reasonFromStructure(utilisateurTrouve.structure)

Expand Down
13 changes: 10 additions & 3 deletions src/application/jobs/maj-segments.job.handler.db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -202,8 +205,12 @@ export class MajSegmentsJobHandler extends JobHandler<Job> {
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
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/building-blocks/types/domain-error.ts
Original file line number Diff line number Diff line change
@@ -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',
Expand Down
3 changes: 2 additions & 1 deletion src/domain/authentification.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: []
}
Expand Down
29 changes: 23 additions & 6 deletions src/domain/core.ts
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
}

Expand All @@ -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)
}

Expand Down Expand Up @@ -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)
}
5 changes: 4 additions & 1 deletion src/domain/jeune/jeune.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, 'JeuneId'>
Expand Down
33 changes: 17 additions & 16 deletions src/infrastructure/clients/mail-brevo.service.db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,22 +144,23 @@ export class MailBrevoService implements Mail.Service {
motif: ArchiveJeune.MotifSuppression | ArchiveJeune.MotifSuppressionSupport,
commentaire?: string
): Promise<void> {
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: [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
5 changes: 4 additions & 1 deletion src/infrastructure/routes/validation/conseillers.inputs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ describe('SendNotificationsNouveauxMessagesExternesCommandHandler', () => {
jeuneRepository.findAllJeunesByIdsAuthentificationAndStructures
.withArgs(
command.idsAuthentificationJeunes,
Core.structuresBeneficiaireFranceTravail
Core.structuresBeneficiaireFTConnect
)
.resolves(jeunes)

Expand Down Expand Up @@ -78,7 +78,7 @@ describe('SendNotificationsNouveauxMessagesExternesCommandHandler', () => {
jeuneRepository.findAllJeunesByIdsAuthentificationAndStructures
.withArgs(
command.idsAuthentificationJeunes,
Core.structuresBeneficiaireFranceTravail
Core.structuresBeneficiaireFTConnect
)
.resolves([jeune1])

Expand Down Expand Up @@ -108,7 +108,7 @@ describe('SendNotificationsNouveauxMessagesExternesCommandHandler', () => {
jeuneRepository.findAllJeunesByIdsAuthentificationAndStructures
.withArgs(
command.idsAuthentificationJeunes,
Core.structuresBeneficiaireFranceTravail
Core.structuresBeneficiaireFTConnect
)
.resolves([])

Expand Down
3 changes: 2 additions & 1 deletion test/fixtures/authentification.fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ export const unUtilisateurSupport = (
prenom: 'John',
type: Authentification.Type.SUPPORT,
email: '[email protected]',
structure: Core.Structure.SUPPORT,
// @ts-expect-error structure utilisateur SUPPORT inutile ailleurs
structure: 'SUPPORT',
roles: []
}

Expand Down
Loading

0 comments on commit 4c46ec4

Please sign in to comment.