diff --git a/src/app.module.ts b/src/app.module.ts index 4543c212a..302344f10 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -159,7 +159,6 @@ import { GetEvenementsEmploiQueryHandler } from './application/queries/get-evene import { GetFavorisOffresEmploiJeuneQueryHandler } from './application/queries/get-favoris-offres-emploi-jeune.query.handler.db' import { GetFavorisOffresImmersionJeuneQueryHandler } from './application/queries/get-favoris-offres-immersion-jeune.query.handler.db' import { GetFavorisServiceCiviqueJeuneQueryHandler } from './application/queries/get-favoris-service-civique-jeune.query.handler.db' -import { GetHomeJeuneHandler } from './application/queries/get-home-jeune.query.handler' import { GetIndicateursPourConseillerQueryHandler } from './application/queries/get-indicateurs-pour-conseiller.query.handler.db' import { GetJeuneHomeActionsQueryHandler } from './application/queries/get-jeune-home-actions.query.handler' import { GetJeuneHomeAgendaQueryHandler } from './application/queries/get-jeune-home-agenda.query.handler.db' @@ -655,7 +654,6 @@ export function buildQueryCommandsProviders(): Provider[] { DeleteFavoriOffreImmersionCommandHandler, GetFavorisOffresEmploiJeuneQueryHandler, GetFavorisOffresImmersionJeuneQueryHandler, - GetHomeJeuneHandler, GetOffresEmploiQueryHandler, GetOffresImmersionQueryHandler, GetDetailOffreImmersionQueryHandler, diff --git a/src/application/queries/action/get-actions-jeune.query.handler.db.ts b/src/application/queries/action/get-actions-jeune.query.handler.db.ts index 7ee6c84ef..4d0e8fd50 100644 --- a/src/application/queries/action/get-actions-jeune.query.handler.db.ts +++ b/src/application/queries/action/get-actions-jeune.query.handler.db.ts @@ -6,7 +6,7 @@ import { QueryHandler } from '../../../building-blocks/types/query-handler' import { failure, Result, success } from '../../../building-blocks/types/result' import { Action } from '../../../domain/action/action' import { Authentification } from '../../../domain/authentification' -import { fromSqlToActionQueryModel } from '../../../infrastructure/repositories/mappers/actions.mappers' +import { fromSqlToActionQueryModelWithJeune } from '../../../infrastructure/repositories/mappers/actions.mappers' import { ActionSqlModel } from '../../../infrastructure/sequelize/models/action.sql-model' import { JeuneSqlModel } from '../../../infrastructure/sequelize/models/jeune.sql-model' import { SequelizeInjectionToken } from '../../../infrastructure/sequelize/providers' @@ -31,13 +31,6 @@ export interface ActionsJeuneQueryModel { metadonnees: { nombreTotal: number nombreFiltrees: number - nombrePasCommencees: number - nombreEnCours: number - nombreTerminees: number - nombreAnnulees: number - nombreNonQualifiables: number - nombreAQualifier: number - nombreQualifiees: number nombreActionsParPage: number } } @@ -47,12 +40,6 @@ export class GetActionsJeuneQueryHandler extends QueryHandler< GetActionsJeuneQuery, Result > { - private readonly CASE_ETATS_QUALIFICATION = `CASE - WHEN qualification_heures IS NOT null THEN 'QUALIFIEE' - WHEN statut = 'done' THEN 'A_QUALIFIER' - ELSE 'NON_QUALIFIABLE' - END` - constructor( @Inject(SequelizeInjectionToken) private readonly sequelize: Sequelize, private jeuneAuthorizer: JeuneAuthorizer, @@ -64,12 +51,10 @@ export class GetActionsJeuneQueryHandler extends QueryHandler< async handle( query: GetActionsJeuneQuery ): Promise> { - const [actionsFiltrees, statutRawCount, etatQualificationRawCount] = - await Promise.all([ - this.findAndCountAllActionsFiltrees(query), - this.compterActionsParStatut(query.idJeune), - this.compterActionsParEtatQualification(query.idJeune) - ]) + const [actionsFiltrees, statutRawCount] = await Promise.all([ + this.findAndCountAllActionsFiltrees(query), + this.compterActionsParStatut(query.idJeune) + ]) if (!laPageExiste(actionsFiltrees.count, query.page)) { return failure(new NonTrouveError('Page', query.page?.toString())) @@ -78,25 +63,6 @@ export class GetActionsJeuneQueryHandler extends QueryHandler< const metadonnees = { nombreTotal: this.compterToutesLesActions(statutRawCount), nombreFiltrees: actionsFiltrees.count, - nombrePasCommencees: this.getCompte( - statutRawCount, - Action.Statut.PAS_COMMENCEE - ), - nombreEnCours: this.getCompte(statutRawCount, Action.Statut.EN_COURS), - nombreTerminees: this.getCompte(statutRawCount, Action.Statut.TERMINEE), - nombreAnnulees: this.getCompte(statutRawCount, Action.Statut.ANNULEE), - nombreNonQualifiables: this.getCompte( - etatQualificationRawCount, - Action.Qualification.Etat.NON_QUALIFIABLE - ), - nombreAQualifier: this.getCompte( - etatQualificationRawCount, - Action.Qualification.Etat.A_QUALIFIER - ), - nombreQualifiees: this.getCompte( - etatQualificationRawCount, - Action.Qualification.Etat.QUALIFIEE - ), nombreActionsParPage: LIMITE_NOMBRE_ACTIONS_PAR_PAGE } @@ -106,7 +72,7 @@ export class GetActionsJeuneQueryHandler extends QueryHandler< return success({ metadonnees, - actions: actionsFiltrees.rows.map(fromSqlToActionQueryModel) + actions: actionsFiltrees.rows.map(fromSqlToActionQueryModelWithJeune) }) } @@ -166,42 +132,25 @@ export class GetActionsJeuneQueryHandler extends QueryHandler< ) } - private compterActionsParEtatQualification( - idJeune: string - ): Promise>> { - return this.sequelize.query>( - ` - SELECT ${this.CASE_ETATS_QUALIFICATION} AS value, COUNT(*) - FROM action - WHERE id_jeune = :idJeune - GROUP BY value; - `, - { - type: QueryTypes.SELECT, - replacements: { - idJeune - } - } - ) - } - private compterToutesLesActions(rawCount: Array>): number { return rawCount.reduce((total, { count }) => total + parseInt(count), 0) } - private getCompte(rawCount: Array>, valueACompter: T): number { - const count = rawCount.find(({ value }) => value === valueACompter)?.count - return count ? parseInt(count) : 0 - } - private generateWhere(query: GetActionsJeuneQuery): WhereOptions { const where: WhereOptions = [{ id_jeune: query.idJeune }] if (query.etats?.length) { where.push( - Sequelize.where(this.sequelize.literal(this.CASE_ETATS_QUALIFICATION), { - [Op.in]: query.etats - }) + Sequelize.where( + this.sequelize.literal(`CASE + WHEN qualification_heures IS NOT null THEN 'QUALIFIEE' + WHEN statut = 'done' AND dispositif = 'CEJ' THEN 'A_QUALIFIER' + ELSE 'NON_QUALIFIABLE' + END`), + { + [Op.in]: query.etats + } + ) ) } if (query.statuts) where.push({ statut: query.statuts }) diff --git a/src/application/queries/get-home-jeune.query.handler.ts b/src/application/queries/get-home-jeune.query.handler.ts deleted file mode 100644 index e831a69ae..000000000 --- a/src/application/queries/get-home-jeune.query.handler.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common' -import { Result } from '../../building-blocks/types/result' -import { Authentification } from '../../domain/authentification' -import { Query } from '../../building-blocks/types/query' -import { QueryHandler } from '../../building-blocks/types/query-handler' -import { Jeune, JeuneRepositoryToken } from '../../domain/jeune/jeune' -import { JeuneAuthorizer } from '../authorizers/jeune-authorizer' -import { JeuneHomeQueryModel } from './query-models/home-jeune.query-model' - -export interface GetHomeJeune extends Query { - idJeune: string -} - -@Injectable() -export class GetHomeJeuneHandler extends QueryHandler< - GetHomeJeune, - JeuneHomeQueryModel -> { - constructor( - @Inject(JeuneRepositoryToken) private jeuneRepository: Jeune.Repository, - private jeuneAuthorizer: JeuneAuthorizer - ) { - super('GetHomeJeuneHandler') - } - - async handle(query: GetHomeJeune): Promise { - return this.jeuneRepository.getHomeQueryModel(query.idJeune) - } - async authorize( - query: GetHomeJeune, - utilisateur: Authentification.Utilisateur - ): Promise { - return this.jeuneAuthorizer.autoriserLeJeune(query.idJeune, utilisateur) - } - - async monitor(): Promise { - return - } -} diff --git a/src/application/queries/get-jeune-home-agenda.query.handler.db.ts b/src/application/queries/get-jeune-home-agenda.query.handler.db.ts index a3617474b..741287a87 100644 --- a/src/application/queries/get-jeune-home-agenda.query.handler.db.ts +++ b/src/application/queries/get-jeune-home-agenda.query.handler.db.ts @@ -17,7 +17,7 @@ import { } from 'src/config/feature-flipping' import { Action } from 'src/domain/action/action' import { Authentification } from 'src/domain/authentification' -import { fromSqlToActionQueryModel } from 'src/infrastructure/repositories/mappers/actions.mappers' +import { fromSqlToActionQueryModelWithJeune } from 'src/infrastructure/repositories/mappers/actions.mappers' import { ActionSqlModel } from 'src/infrastructure/sequelize/models/action.sql-model' import { ConseillerSqlModel } from 'src/infrastructure/sequelize/models/conseiller.sql-model' import { JeuneSqlModel } from 'src/infrastructure/sequelize/models/jeune.sql-model' @@ -75,7 +75,12 @@ export class GetJeuneHomeAgendaQueryHandler extends QueryHandler< const { lundiDernier, dimancheEnHuit } = this.recupererLesDatesEntreLundiDernierEtDeuxSemainesPlusTard(maintenant) const [actions, rendezVous, actionsEnRetard] = await Promise.all([ - this.recupererLesActions(query, lundiDernier, dimancheEnHuit), + this.recupererLesActions( + query, + lundiDernier, + dimancheEnHuit, + jeuneSqlModel + ), this.recupererLesRendezVous( query, lundiDernier, @@ -213,7 +218,8 @@ export class GetJeuneHomeAgendaQueryHandler extends QueryHandler< private async recupererLesActions( query: GetJeuneHomeAgendaQuery, dateDebut: DateTime, - dateFin: DateTime + dateFin: DateTime, + jeuneSqlModel: JeuneSqlModel ): Promise { const actionsSqlModel = await ActionSqlModel.findAll({ where: { @@ -226,7 +232,12 @@ export class GetJeuneHomeAgendaQueryHandler extends QueryHandler< order: [['dateEcheance', 'ASC']] }) - return actionsSqlModel.map(fromSqlToActionQueryModel) + return actionsSqlModel.map(actionSqlModel => + fromSqlToActionQueryModelWithJeune({ + ...actionSqlModel.dataValues, + jeune: jeuneSqlModel + } as ActionSqlModel) + ) } private async recupererLeNombreDactionsEnRetard( diff --git a/src/application/queries/milo/get-mon-suivi-jeune.milo.query.handler.db.ts b/src/application/queries/milo/get-mon-suivi-jeune.milo.query.handler.db.ts index da42a39d5..064859b97 100644 --- a/src/application/queries/milo/get-mon-suivi-jeune.milo.query.handler.db.ts +++ b/src/application/queries/milo/get-mon-suivi-jeune.milo.query.handler.db.ts @@ -20,7 +20,7 @@ import { DateTime } from 'luxon' import { ActionQueryModel } from '../query-models/actions.query-model' import { ActionSqlModel } from '../../../infrastructure/sequelize/models/action.sql-model' import { Op } from 'sequelize' -import { fromSqlToActionQueryModel } from '../../../infrastructure/repositories/mappers/actions.mappers' +import { fromSqlToActionQueryModelWithJeune } from '../../../infrastructure/repositories/mappers/actions.mappers' import { RendezVousJeuneQueryModel } from '../query-models/rendez-vous.query-model' import { RendezVousSqlModel } from '../../../infrastructure/sequelize/models/rendez-vous.sql-model' import { fromSqlToRendezVousJeuneQueryModel } from '../query-mappers/rendez-vous-milo.mappers' @@ -72,7 +72,7 @@ export class GetMonSuiviMiloQueryHandler extends QueryHandler< } const [actions, rendezVous, sessionsMilo] = await Promise.all([ - this.recupererLesActions(query), + this.recupererLesActions(query, jeuneSqlModel), this.recupererLesRendezVous(query, utilisateur.type), this.sessionsJeuneQueryGetter .handle(query.idJeune, jeuneSqlModel.idPartenaire, query.accessToken, { @@ -108,7 +108,8 @@ export class GetMonSuiviMiloQueryHandler extends QueryHandler< } private async recupererLesActions( - query: GetMonSuiviMiloQuery + query: GetMonSuiviMiloQuery, + jeuneSqlModel: JeuneSqlModel ): Promise { const actionsSqlModel = await ActionSqlModel.findAll({ where: { @@ -121,7 +122,12 @@ export class GetMonSuiviMiloQueryHandler extends QueryHandler< order: [['dateEcheance', 'ASC']] }) - return actionsSqlModel.map(fromSqlToActionQueryModel) + return actionsSqlModel.map(actionSqlModel => + fromSqlToActionQueryModelWithJeune({ + ...actionSqlModel.dataValues, + jeune: jeuneSqlModel + } as ActionSqlModel) + ) } private async recupererLesRendezVous( diff --git a/src/application/queries/query-models/actions.query-model.ts b/src/application/queries/query-models/actions.query-model.ts index e2f94472e..e296d3917 100644 --- a/src/application/queries/query-models/actions.query-model.ts +++ b/src/application/queries/query-models/actions.query-model.ts @@ -1,7 +1,6 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger' import { Action } from '../../../domain/action/action' import { Demarche } from '../../../domain/demarche' -import { JeuneQueryModel } from './jeunes.query-model' class CreateurQueryModel implements Action.Createur { @ApiProperty() @@ -31,6 +30,23 @@ export class QualificationActionQueryModel { commentaireQualification?: string } +export class BeneficiaireActionQueryModel { + @ApiProperty() + id: string + + @ApiProperty() + lastName: string + + @ApiProperty() + firstName: string + + @ApiProperty() + idConseiller: string + + @ApiProperty() + dispositif: string +} + export class ActionQueryModel { @ApiProperty() id: string @@ -56,11 +72,8 @@ export class ActionQueryModel { @ApiProperty() creator: string - @ApiProperty({ - type: JeuneQueryModel, - required: false - }) - jeune?: JeuneQueryModel + @ApiProperty({ type: BeneficiaireActionQueryModel }) + jeune: BeneficiaireActionQueryModel @ApiProperty() dateEcheance: string @@ -90,16 +103,21 @@ export class CommentaireActionQueryModel { } export class ActionsMetadonneesQueryModel { + @ApiProperty() nombreTotal: number - nombreEnCours: number - nombreTerminees: number - nombreAnnulees: number - nombrePasCommencees: number + + @ApiProperty() + nombreFiltrees: number + + @ApiProperty() nombreActionsParPage: number } export class ListeActionsV2QueryModel { + @ApiProperty({ type: ActionQueryModel, isArray: true }) actions: ActionQueryModel[] + + @ApiProperty({ type: ActionsMetadonneesQueryModel, isArray: true }) metadonnees: ActionsMetadonneesQueryModel } diff --git a/src/application/queries/query-models/home-jeune.query-model.ts b/src/application/queries/query-models/home-jeune.query-model.ts index 86b1bd0d0..7423a6ddd 100644 --- a/src/application/queries/query-models/home-jeune.query-model.ts +++ b/src/application/queries/query-models/home-jeune.query-model.ts @@ -1,89 +1,7 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger' -import { - RendezVous, - TypeRendezVous -} from '../../../domain/rendez-vous/rendez-vous' import { ActionQueryModel, DemarcheQueryModel } from './actions.query-model' -import { RendezVousBaseQueryModel } from './rendez-vous.query-model' import { CampagneQueryModel } from './campagne.query-model' -class RendezVousJeuneHomeQueryModel implements RendezVousBaseQueryModel { - @ApiProperty() - id: string - - @ApiProperty() - title: string - - @ApiProperty({ required: false }) - comment?: string - - @ApiProperty() - modality: string - - @ApiProperty() - date: string - - @ApiProperty() - dateUtc: string - - @ApiProperty() - duration: string - - @ApiProperty() - type: TypeRendezVous - - @ApiProperty({ required: false }) - precision?: string - - @ApiProperty({ required: false }) - adresse?: string - - @ApiProperty({ required: false }) - organisme?: string - - @ApiProperty() - presenceConseiller: boolean - - @ApiProperty({ required: true, enum: RendezVous.Source }) - source: RendezVous.Source -} - -export class ConseillerJeuneQueryModel { - @ApiProperty() - id: string - - @ApiProperty() - firstName: string - - @ApiProperty() - lastName: string - - @ApiPropertyOptional() - email?: string -} - -export class JeuneHomeQueryModel { - @ApiProperty({ - type: ActionQueryModel, - isArray: true - }) - actions: ActionQueryModel[] - - @ApiProperty() - doneActionsCount: number - - @ApiProperty({ - type: ConseillerJeuneQueryModel - }) - conseiller: ConseillerJeuneQueryModel - - @ApiProperty({ - type: RendezVousJeuneHomeQueryModel, - isArray: true - }) - rendezvous: RendezVousJeuneHomeQueryModel[] -} - export class JeuneHomeActionQueryModel { @ApiProperty({ type: ActionQueryModel, diff --git a/src/domain/jeune/jeune.ts b/src/domain/jeune/jeune.ts index 9c976cd5b..02ad0ea0e 100644 --- a/src/domain/jeune/jeune.ts +++ b/src/domain/jeune/jeune.ts @@ -1,6 +1,5 @@ import { Injectable } from '@nestjs/common' import { DateTime } from 'luxon' -import { JeuneHomeQueryModel } from '../../application/queries/query-models/home-jeune.query-model' import { Brand } from '../../building-blocks/types/brand' import { DateService } from '../../utils/date-service' import { IdService } from '../../utils/id-service' @@ -118,8 +117,6 @@ export namespace Jeune { supprimer(idJeune: Jeune.Id): Promise - getHomeQueryModel(idJeune: string): Promise - transferAndSaveAll( jeunes: Jeune[], idConseillerCible: string, diff --git a/src/infrastructure/repositories/jeune/jeune-sql.repository.db.ts b/src/infrastructure/repositories/jeune/jeune-sql.repository.db.ts index 6f693c3a2..87703ea66 100644 --- a/src/infrastructure/repositories/jeune/jeune-sql.repository.db.ts +++ b/src/infrastructure/repositories/jeune/jeune-sql.repository.db.ts @@ -1,22 +1,15 @@ -import { Inject, Injectable, NotFoundException } from '@nestjs/common' +import { Inject, Injectable } from '@nestjs/common' import { Op, Sequelize } from 'sequelize' -import { JeuneHomeQueryModel } from '../../../application/queries/query-models/home-jeune.query-model' -import { Action } from '../../../domain/action/action' import { Jeune } from '../../../domain/jeune/jeune' import { DateService } from '../../../utils/date-service' import { IdService } from '../../../utils/id-service' import { FirebaseClient } from '../../clients/firebase-client' -import { ActionSqlModel } from '../../sequelize/models/action.sql-model' import { ConseillerSqlModel } from '../../sequelize/models/conseiller.sql-model' import { JeuneDto, JeuneSqlModel } from '../../sequelize/models/jeune.sql-model' -import { RendezVousSqlModel } from '../../sequelize/models/rendez-vous.sql-model' import { TransfertConseillerSqlModel } from '../../sequelize/models/transfert-conseiller.sql-model' import { SequelizeInjectionToken } from '../../sequelize/providers' import { AsSql } from '../../sequelize/types' -import { - fromSqlToJeune, - fromSqlToJeuneHomeQueryModel -} from '../mappers/jeunes.mappers' +import { fromSqlToJeune } from '../mappers/jeunes.mappers' import { Core } from '../../../domain/core' @Injectable() @@ -183,35 +176,6 @@ export class JeuneSqlRepository implements Jeune.Repository { await JeuneSqlModel.supprimer(jeune) } - async getHomeQueryModel(idJeune: string): Promise { - const jeuneSqlModel = await JeuneSqlModel.findByPk(idJeune, { - include: [ - ConseillerSqlModel, - { - model: ActionSqlModel, - required: false, - where: { - statut: Action.Statut.PAS_COMMENCEE - }, - order: [['dateDerniereActualisation', 'DESC']], - limit: 2 - } - ] - }) - if (!jeuneSqlModel) { - throw new NotFoundException("Le jeune n'existe pas") - } - const rdvJeuneSqlModel = await RendezVousSqlModel.findAll({ - include: [ - { - model: JeuneSqlModel, - where: { id: idJeune } - } - ] - }) - return fromSqlToJeuneHomeQueryModel(jeuneSqlModel, rdvJeuneSqlModel) - } - async saveAllJeuneTransferes(jeunes: Jeune[]): Promise { for (const jeune of jeunes) { const jeuneTransfereSQL: Omit< diff --git a/src/infrastructure/repositories/mappers/actions.mappers.ts b/src/infrastructure/repositories/mappers/actions.mappers.ts index 00439378b..12f0bb45f 100644 --- a/src/infrastructure/repositories/mappers/actions.mappers.ts +++ b/src/infrastructure/repositories/mappers/actions.mappers.ts @@ -1,25 +1,17 @@ import { DateTime } from 'luxon' import { ActionQueryModel, + BeneficiaireActionQueryModel, QualificationActionQueryModel } from '../../../application/queries/query-models/actions.query-model' -import { JeuneQueryModel } from '../../../application/queries/query-models/jeunes.query-model' import { Action } from '../../../domain/action/action' +import { Jeune } from '../../../domain/jeune/jeune' import { DateService } from '../../../utils/date-service' import { ActionSqlModel } from '../../sequelize/models/action.sql-model' import { JeuneSqlModel } from '../../sequelize/models/jeune.sql-model' export function fromSqlToActionQueryModelWithJeune( actionSqlModel: ActionSqlModel -): ActionQueryModel { - return { - ...fromSqlToActionQueryModel(actionSqlModel), - jeune: fromSqlToJeuneQueryModel(actionSqlModel.jeune) - } -} - -export function fromSqlToActionQueryModel( - actionSqlModel: ActionSqlModel ): ActionQueryModel { return { id: actionSqlModel.id, @@ -40,24 +32,29 @@ export function fromSqlToActionQueryModel( dateFinReelle: actionSqlModel.dateFinReelle ? DateService.fromJSDateToISOString(actionSqlModel.dateFinReelle) : undefined, - etat: buildEtat(actionSqlModel), - qualification: buildQualificationQueryModel(actionSqlModel) + etat: buildEtat(actionSqlModel, { + qualifiable: actionSqlModel.jeune.dispositif === Jeune.Dispositif.CEJ + }), + qualification: buildQualificationQueryModel(actionSqlModel), + jeune: fromSqlToBeneficiarieActionQueryModel(actionSqlModel.jeune) } } -function fromSqlToJeuneQueryModel( +function fromSqlToBeneficiarieActionQueryModel( jeuneSqlModel: JeuneSqlModel -): JeuneQueryModel { +): BeneficiaireActionQueryModel { return { id: jeuneSqlModel.id, firstName: jeuneSqlModel.prenom, lastName: jeuneSqlModel.nom, - idConseiller: jeuneSqlModel.idConseiller! + idConseiller: jeuneSqlModel.idConseiller!, + dispositif: jeuneSqlModel.dispositif } } -export function buildEtat( - actionSqlModel: ActionSqlModel +function buildEtat( + actionSqlModel: ActionSqlModel, + { qualifiable }: { qualifiable: boolean } ): Action.Qualification.Etat { if ( actionSqlModel.codeQualification && @@ -65,7 +62,7 @@ export function buildEtat( ) { return Action.Qualification.Etat.QUALIFIEE } - if (actionSqlModel.statut === Action.Statut.TERMINEE) { + if (qualifiable && actionSqlModel.statut === Action.Statut.TERMINEE) { return Action.Qualification.Etat.A_QUALIFIER } return Action.Qualification.Etat.NON_QUALIFIABLE diff --git a/src/infrastructure/repositories/mappers/jeunes.mappers.ts b/src/infrastructure/repositories/mappers/jeunes.mappers.ts index 635a221b8..33030167d 100644 --- a/src/infrastructure/repositories/mappers/jeunes.mappers.ts +++ b/src/infrastructure/repositories/mappers/jeunes.mappers.ts @@ -1,12 +1,6 @@ -import { DateTime, Duration } from 'luxon' -import { JeuneHomeQueryModel } from '../../../application/queries/query-models/home-jeune.query-model' -import { Action } from '../../../domain/action/action' +import { DateTime } from 'luxon' import { Jeune } from '../../../domain/jeune/jeune' -import { mapCodeLabelTypeRendezVous } from '../../../domain/rendez-vous/rendez-vous' -import { ActionSqlModel } from '../../sequelize/models/action.sql-model' import { JeuneSqlModel } from '../../sequelize/models/jeune.sql-model' -import { RendezVousSqlModel } from '../../sequelize/models/rendez-vous.sql-model' -import { buildEtat } from './actions.mappers' export function fromSqlToJeune(jeuneSqlModel: JeuneSqlModel): Jeune { const jeune: Jeune = { @@ -56,75 +50,6 @@ export function fromSqlToPreferencesJeune( } } -export function fromSqlToJeuneHomeQueryModel( - jeuneSqlModel: JeuneSqlModel, - rdvJeuneSqlModel: RendezVousSqlModel[] -): JeuneHomeQueryModel { - return { - conseiller: { - id: jeuneSqlModel.conseiller!.id, - firstName: jeuneSqlModel.conseiller!.prenom, - lastName: jeuneSqlModel.conseiller!.nom, - email: jeuneSqlModel.conseiller!.email ?? undefined - }, - doneActionsCount: jeuneSqlModel.actions.filter( - actionsSql => actionsSql.statut === Action.Statut.TERMINEE - ).length, - actions: jeuneSqlModel.actions.map(actionSql => ({ - id: actionSql.id, - creationDate: DateTime.fromJSDate(actionSql.dateCreation).toFormat( - 'EEE, d MMM yyyy HH:mm:ss z' - ), - content: actionSql.contenu, - status: actionSql.statut, - comment: actionSql.description, - isDone: actionSql.statut === Action.Statut.TERMINEE, - lastUpdate: DateTime.fromJSDate( - actionSql.dateDerniereActualisation - ).toFormat('EEE, d MMM yyyy HH:mm:ss z'), - creatorType: actionSql.typeCreateur, - creator: toCreator(actionSql, jeuneSqlModel), - dateEcheance: actionSql.dateEcheance.toISOString(), - dateFinReelle: actionSql.dateFinReelle?.toISOString(), - etat: buildEtat(actionSql) - })), - rendezvous: - rdvJeuneSqlModel?.map(rendezVousSql => ({ - id: rendezVousSql.id, - comment: rendezVousSql.commentaire ?? '', - date: DateTime.fromJSDate(rendezVousSql.date) - .setZone('Europe/Paris') - .toFormat('EEE, d MMM yyyy HH:mm:ss z'), - dateUtc: DateTime.fromJSDate(rendezVousSql.date).toISO(), - duration: Duration.fromObject({ - minutes: rendezVousSql.duree - }).toFormat('h:mm:ss'), - modality: rendezVousSql.modalite ?? '', - title: rendezVousSql.titre, - subtitle: rendezVousSql.sousTitre, - type: { - code: rendezVousSql.type, - label: mapCodeLabelTypeRendezVous[rendezVousSql.type] - }, - precision: rendezVousSql.precision ?? undefined, - adresse: rendezVousSql.adresse ?? undefined, - organisme: rendezVousSql.organisme ?? undefined, - presenceConseiller: rendezVousSql.presenceConseiller, - source: rendezVousSql.source - })) ?? [] - } -} - -function toCreator( - actionSql: ActionSqlModel, - jeuneSqlModel: JeuneSqlModel -): string { - if (actionSql.typeCreateur === Action.TypeCreateur.JEUNE) { - return `${jeuneSqlModel.prenom} ${jeuneSqlModel.nom}` - } - return `${jeuneSqlModel.conseiller!.prenom} ${jeuneSqlModel.conseiller!.nom}` -} - export function toConfigurationApplication( jeuneSqlModel: JeuneSqlModel ): Jeune.ConfigurationApplication { diff --git a/test/application/queries/action/get-actions-jeune.query.handler.db.test.ts b/test/application/queries/action/get-actions-jeune.query.handler.db.test.ts index 78baf0ab7..1ed8cc0bd 100644 --- a/test/application/queries/action/get-actions-jeune.query.handler.db.test.ts +++ b/test/application/queries/action/get-actions-jeune.query.handler.db.test.ts @@ -131,14 +131,17 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(result.data.actions).to.be.deep.equal([ uneActionQueryModelFromDomain( actionTerminee2, + jeune, Action.Qualification.Etat.A_QUALIFIER ), uneActionQueryModelFromDomain( actionTerminee3, + jeune, Action.Qualification.Etat.A_QUALIFIER ), uneActionQueryModelFromDomain( actionTerminee1, + jeune, Action.Qualification.Etat.A_QUALIFIER ) ]) @@ -186,9 +189,9 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(isSuccess(result)).to.be.true() if (isSuccess(result)) { expect(result.data.actions).to.be.deep.equal([ - uneActionQueryModelFromDomain(actionEnCours2), - uneActionQueryModelFromDomain(actionPasCommencee), - uneActionQueryModelFromDomain(actionEnCours1) + uneActionQueryModelFromDomain(actionEnCours2, jeune), + uneActionQueryModelFromDomain(actionPasCommencee, jeune), + uneActionQueryModelFromDomain(actionEnCours1, jeune) ]) } }) @@ -243,14 +246,16 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(isSuccess(result)).to.be.true() if (isSuccess(result)) { expect(result.data.actions).to.be.deep.equal([ - uneActionQueryModelFromDomain(actionEnCours), - uneActionQueryModelFromDomain(actionPasCommencee), + uneActionQueryModelFromDomain(actionEnCours, jeune), + uneActionQueryModelFromDomain(actionPasCommencee, jeune), uneActionQueryModelFromDomain( actionTerminee2, + jeune, Action.Qualification.Etat.A_QUALIFIER ), uneActionQueryModelFromDomain( actionTerminee1, + jeune, Action.Qualification.Etat.A_QUALIFIER ) ]) @@ -318,7 +323,7 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(isSuccess(result)).to.be.true() if (isSuccess(result)) { expect(result.data.actions).to.be.deep.equal([ - uneActionQueryModelFromDomain(actionPage2) + uneActionQueryModelFromDomain(actionPage2, jeune) ]) expect(result.data.metadonnees.nombreTotal).to.equal(11) } @@ -370,11 +375,12 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(result.data.actions).to.be.deep.equal([ uneActionQueryModelFromDomain( actionTermineeRecente, + jeune, Action.Qualification.Etat.A_QUALIFIER ), - uneActionQueryModelFromDomain(actionPasCommencee), - uneActionQueryModelFromDomain(actionEnCours), - uneActionQueryModelFromDomain(actionCanceled) + uneActionQueryModelFromDomain(actionPasCommencee, jeune), + uneActionQueryModelFromDomain(actionEnCours, jeune), + uneActionQueryModelFromDomain(actionCanceled, jeune) ]) } }) @@ -427,11 +433,12 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(isSuccess(result)).to.be.true() if (isSuccess(result)) { expect(result.data.actions).to.be.deep.equal([ - uneActionQueryModelFromDomain(actionCanceled), - uneActionQueryModelFromDomain(actionEnCours), - uneActionQueryModelFromDomain(actionPasCommencee), + uneActionQueryModelFromDomain(actionCanceled, jeune), + uneActionQueryModelFromDomain(actionEnCours, jeune), + uneActionQueryModelFromDomain(actionPasCommencee, jeune), uneActionQueryModelFromDomain( actionTerminee, + jeune, Action.Qualification.Etat.A_QUALIFIER ) ]) @@ -484,10 +491,12 @@ describe('GetActionsByJeuneQueryHandler', () => { actionQMNonQualifiable = uneActionQueryModelFromDomain( actionNonQualifiable, + jeune, Action.Qualification.Etat.NON_QUALIFIABLE ) actionQMQualifiee = uneActionQueryModelFromDomain( actionQualifiee, + jeune, Action.Qualification.Etat.QUALIFIEE, { code: Action.Qualification.Code.SANTE, @@ -498,6 +507,7 @@ describe('GetActionsByJeuneQueryHandler', () => { ) actionQMAQualifier = uneActionQueryModelFromDomain( actionAQualifier, + jeune, Action.Qualification.Etat.A_QUALIFIER ) @@ -623,8 +633,8 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(isSuccess(result)).to.be.true() if (isSuccess(result)) { expect(result.data.actions).to.be.deep.equal([ - uneActionQueryModelFromDomain(actionEnCours), - uneActionQueryModelFromDomain(actionPasCommencee) + uneActionQueryModelFromDomain(actionEnCours, jeune), + uneActionQueryModelFromDomain(actionPasCommencee, jeune) ]) expect(result.data.metadonnees.nombreTotal).to.equal(4) } @@ -705,6 +715,7 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(result.data.actions).to.be.deep.equal([ uneActionQueryModelFromDomain( actionCitoyennete, + jeune, Action.Qualification.Etat.NON_QUALIFIABLE, { code: Action.Qualification.Code.CITOYENNETE, @@ -715,6 +726,7 @@ describe('GetActionsByJeuneQueryHandler', () => { ), uneActionQueryModelFromDomain( actionCitoyennete2, + jeune, Action.Qualification.Etat.NON_QUALIFIABLE, { code: Action.Qualification.Code.CITOYENNETE, @@ -806,13 +818,6 @@ describe('GetActionsByJeuneQueryHandler', () => { expect(result.data.metadonnees).to.deep.equal({ nombreTotal: 6, nombreFiltrees: 6, - nombrePasCommencees: 1, - nombreEnCours: 2, - nombreTerminees: 2, - nombreAnnulees: 1, - nombreNonQualifiables: 4, - nombreAQualifier: 1, - nombreQualifiees: 1, nombreActionsParPage: 10 }) } diff --git a/test/application/queries/action/get-detail-action.query.handler.db.test.ts b/test/application/queries/action/get-detail-action.query.handler.db.test.ts index c0018f9b5..6b125e008 100644 --- a/test/application/queries/action/get-detail-action.query.handler.db.test.ts +++ b/test/application/queries/action/get-detail-action.query.handler.db.test.ts @@ -93,7 +93,7 @@ describe('GetDetailActionQueryHandler', () => { // Then expect(actionQueryModel).to.deep.equal( - uneActionQueryModelTermineeAvecQualification(action) + uneActionQueryModelTermineeAvecQualification(action, jeune) ) }) }) @@ -113,13 +113,7 @@ describe('GetDetailActionQueryHandler', () => { // Then expect(actionQueryModel).to.deep.equal({ - ...uneActionQueryModelFromDomain(action), - jeune: { - id: action.idJeune, - firstName: jeune.firstName, - lastName: jeune.lastName, - idConseiller: jeune.conseiller.id - }, + ...uneActionQueryModelFromDomain(action, jeune), qualification: undefined }) }) diff --git a/test/application/queries/get-jeune-home-actions.query.handler.test.ts b/test/application/queries/get-jeune-home-actions.query.handler.test.ts index 584d6e3b9..4cb5e4016 100644 --- a/test/application/queries/get-jeune-home-actions.query.handler.test.ts +++ b/test/application/queries/get-jeune-home-actions.query.handler.test.ts @@ -9,7 +9,7 @@ import { GetCampagneQueryGetter } from '../../../src/application/queries/query-g import { Core } from '../../../src/domain/core' import { unUtilisateurJeune } from '../../fixtures/authentification.fixture' import { uneCampagneQueryModel } from '../../fixtures/campagne.fixture' -import { uneActionQueryModelFromDomain } from '../../fixtures/query-models/action.query-model.fixtures' +import { uneActionQueryModel } from '../../fixtures/query-models/action.query-model.fixtures' import { expect, StubbedClass, stubClass } from '../../utils' import Structure = Core.Structure @@ -20,7 +20,7 @@ describe('GetJeuneHomeActionsQueryHandler', () => { let getJeuneHomeActionsQueryHandler: GetJeuneHomeActionsQueryHandler const campagneQueryModel = uneCampagneQueryModel() - const actionsQueryModel = [uneActionQueryModelFromDomain()] + const actionsQueryModel = [uneActionQueryModel()] beforeEach(() => { getActionsByJeuneQueryHandler = stubClass(GetActionsJeuneQueryHandler) @@ -42,13 +42,6 @@ describe('GetJeuneHomeActionsQueryHandler', () => { metadonnees: { nombreTotal: 5, nombreFiltrees: 5, - nombreEnCours: 2, - nombreTerminees: 1, - nombreAnnulees: 1, - nombrePasCommencees: 1, - nombreNonQualifiables: 4, - nombreAQualifier: 1, - nombreQualifiees: 0, nombreActionsParPage: 10 } } diff --git a/test/application/queries/get-jeune-home-agenda.query.handler.db.test.ts b/test/application/queries/get-jeune-home-agenda.query.handler.db.test.ts index cce3b75a5..eb6152aa0 100644 --- a/test/application/queries/get-jeune-home-agenda.query.handler.db.test.ts +++ b/test/application/queries/get-jeune-home-agenda.query.handler.db.test.ts @@ -31,7 +31,7 @@ import { unUtilisateurJeune } from 'test/fixtures/authentification.fixture' import { unJeune } from 'test/fixtures/jeune.fixture' -import { uneActionQueryModelSansJeune } from 'test/fixtures/query-models/action.query-model.fixtures' +import { uneActionQueryModel } from 'test/fixtures/query-models/action.query-model.fixtures' import { unRendezVousQueryModel } from 'test/fixtures/query-models/rendez-vous.query-model.fixtures' import { uneSessionJeuneMiloQueryModel } from 'test/fixtures/sessions.fixture' import { uneActionDto } from 'test/fixtures/sql-models/action.sql-model' @@ -169,11 +169,11 @@ describe('GetJeuneHomeAgendaQueryHandler', () => { // Then const expected: JeuneHomeAgendaQueryModel = { actions: [ - uneActionQueryModelSansJeune({ + uneActionQueryModel({ id: lundiDernier.id, dateEcheance: DateTime.fromJSDate(lundiDernier.dateEcheance).toISO() }), - uneActionQueryModelSansJeune({ + uneActionQueryModel({ id: dimancheEnHuit.id, dateEcheance: DateTime.fromJSDate( dimancheEnHuit.dateEcheance @@ -208,11 +208,11 @@ describe('GetJeuneHomeAgendaQueryHandler', () => { it('renvoie les actions triées par date', async () => { // Then const actionsQM: ActionQueryModel[] = [ - uneActionQueryModelSansJeune({ + uneActionQueryModel({ id: demain.id, dateEcheance: DateTime.fromJSDate(demain.dateEcheance).toISO() }), - uneActionQueryModelSansJeune({ + uneActionQueryModel({ id: apresDemain.id, dateEcheance: DateTime.fromJSDate(apresDemain.dateEcheance).toISO() }) diff --git a/test/application/queries/milo/get-mon-suivi-jeune.milo.query.handler.db.test.ts b/test/application/queries/milo/get-mon-suivi-jeune.milo.query.handler.db.test.ts index ba7af0ea0..03a2617c8 100644 --- a/test/application/queries/milo/get-mon-suivi-jeune.milo.query.handler.db.test.ts +++ b/test/application/queries/milo/get-mon-suivi-jeune.milo.query.handler.db.test.ts @@ -32,7 +32,7 @@ import { import { uneActionDto } from '../../../fixtures/sql-models/action.sql-model' import { DateTime } from 'luxon' import { ActionQueryModel } from '../../../../src/application/queries/query-models/actions.query-model' -import { uneActionQueryModelSansJeune } from '../../../fixtures/query-models/action.query-model.fixtures' +import { uneActionQueryModel } from '../../../fixtures/query-models/action.query-model.fixtures' import { RendezVousDto, RendezVousSqlModel @@ -201,25 +201,25 @@ describe('GetMonSuiviMiloQueryHandler', () => { it('renvoie les actions triées par date', async () => { // Then const actionsQueryModel: ActionQueryModel[] = [ - uneActionQueryModelSansJeune({ + uneActionQueryModel({ id: actionApresDateDebutUneHeure.id, dateEcheance: DateTime.fromJSDate( actionApresDateDebutUneHeure.dateEcheance ).toISO() }), - uneActionQueryModelSansJeune({ + uneActionQueryModel({ id: actionApresDateDebutUnJour.id, dateEcheance: DateTime.fromJSDate( actionApresDateDebutUnJour.dateEcheance ).toISO() }), - uneActionQueryModelSansJeune({ + uneActionQueryModel({ id: actionAvantDateFinUnJour.id, dateEcheance: DateTime.fromJSDate( actionAvantDateFinUnJour.dateEcheance ).toISO() }), - uneActionQueryModelSansJeune({ + uneActionQueryModel({ id: actionAvantDateFinUneHeure.id, dateEcheance: DateTime.fromJSDate( actionAvantDateFinUneHeure.dateEcheance diff --git a/test/fixtures/query-models/action.query-model.fixtures.ts b/test/fixtures/query-models/action.query-model.fixtures.ts index 8d9cac823..3532054d1 100644 --- a/test/fixtures/query-models/action.query-model.fixtures.ts +++ b/test/fixtures/query-models/action.query-model.fixtures.ts @@ -1,15 +1,14 @@ +import { DateTime } from 'luxon' import { ActionQueryModel, QualificationActionQueryModel } from '../../../src/application/queries/query-models/actions.query-model' import { Action } from '../../../src/domain/action/action' import { Jeune } from '../../../src/domain/jeune/jeune' -import { uneAction } from '../action.fixture' -import { unJeune } from '../jeune.fixture' -import { DateTime } from 'luxon' export const uneActionQueryModelFromDomain = ( - action: Action = uneAction(), + action: Action, + jeune: Jeune, etat: Action.Qualification.Etat = Action.Qualification.Etat.NON_QUALIFIABLE, qualification: QualificationActionQueryModel | undefined = undefined ): ActionQueryModel => ({ @@ -25,22 +24,23 @@ export const uneActionQueryModelFromDomain = ( creatorType: Action.TypeCreateur.CONSEILLER, dateEcheance: action.dateEcheance.toISO(), dateFinReelle: undefined, + jeune: { + id: jeune.id, + lastName: jeune.lastName, + firstName: jeune.firstName, + idConseiller: jeune.conseiller!.id, + dispositif: jeune.dispositif + }, etat, qualification }) export const uneActionQueryModelTermineeAvecQualification = ( - action: Action = uneAction(), - jeune: Jeune = unJeune() + action: Action, + jeune: Jeune ): ActionQueryModel => ({ - ...uneActionQueryModelFromDomain(action), + ...uneActionQueryModelFromDomain(action, jeune), status: Action.Statut.TERMINEE, - jeune: { - id: action.idJeune, - firstName: jeune.firstName, - lastName: jeune.lastName, - idConseiller: jeune.conseiller!.id - }, dateFinReelle: action.dateFinReelle?.toISO(), etat: Action.Qualification.Etat.QUALIFIEE, qualification: { @@ -55,41 +55,23 @@ export function uneActionQueryModel( args: Partial = {} ): ActionQueryModel { const defaults: ActionQueryModel = { - id: '1', - content: "Ceci est un contenu d'action", - comment: 'Ceci est un commentaire', - status: Action.Statut.EN_COURS, - creationDate: '2021-11-11T08:03:30.000Z', - lastUpdate: '2021-11-11T09:03:30.000Z', - jeune: { - id: '1', - firstName: 'Damien', - lastName: 'Saez', - idConseiller: 'id-conseiller' - }, - creatorType: Action.TypeCreateur.CONSEILLER, - creator: 'Nils Tavernier', - dateEcheance: '2021-11-11T10:03:30.000Z', - etat: Action.Qualification.Etat.NON_QUALIFIABLE - } - - return { ...defaults, ...args } -} - -export function uneActionQueryModelSansJeune( - args: Partial = {} -): ActionQueryModel { - const defaults: ActionQueryModel = { + id: 'd2e48a82-c664-455a-b3a5-bb0465a72022', comment: "Description de l'action", content: "Contenu de l'action", creationDate: DateTime.fromISO('2021-11-11T08:03:30.000Z').toFormat( 'EEE, d MMM yyyy HH:mm:ss z' ), creator: 'Nils Tavernier', + jeune: { + firstName: 'John', + id: 'ABCDE', + idConseiller: '1', + lastName: 'Doe', + dispositif: 'CEJ' + }, creatorType: Action.TypeCreateur.CONSEILLER, dateEcheance: '2021-11-11T08:03:30.000Z', dateFinReelle: undefined, - id: 'd2e48a82-c664-455a-b3a5-bb0465a72022', lastUpdate: DateTime.fromISO('2021-11-11T08:03:30.000Z').toFormat( 'EEE, d MMM yyyy HH:mm:ss z' ), diff --git a/test/infrastructure/routes/actions.controller.test.ts b/test/infrastructure/routes/actions.controller.test.ts index 785b03d20..7643fb388 100644 --- a/test/infrastructure/routes/actions.controller.test.ts +++ b/test/infrastructure/routes/actions.controller.test.ts @@ -185,22 +185,23 @@ describe('ActionsController', () => { // When - Then const actionJson = { - id: idAction, - content: "Ceci est un contenu d'action", - comment: 'Ceci est un commentaire', - status: 'in_progress', - creationDate: '2021-11-11T08:03:30.000Z', - lastUpdate: '2021-11-11T09:03:30.000Z', + comment: "Description de l'action", + content: "Contenu de l'action", + creationDate: 'Thu, 11 Nov 2021 08:03:30 UTC', + creator: 'Nils Tavernier', + creatorType: 'conseiller', + dateEcheance: '2021-11-11T08:03:30.000Z', + etat: 'NON_QUALIFIABLE', + id: '13c11b33-751c-4e1b-a49d-1b5a473ba159', jeune: { - id: '1', - lastName: 'Saez', - firstName: 'Damien', - idConseiller: 'id-conseiller' + firstName: 'John', + id: 'ABCDE', + idConseiller: '1', + lastName: 'Doe', + dispositif: 'CEJ' }, - creatorType: 'conseiller', - creator: 'Nils Tavernier', - dateEcheance: '2021-11-11T10:03:30.000Z', - etat: 'NON_QUALIFIABLE' + lastUpdate: 'Thu, 11 Nov 2021 08:03:30 UTC', + status: 'not_started' } await request(app.getHttpServer()) .get(`/actions/${idAction}`) @@ -662,13 +663,6 @@ describe('ActionsController', () => { metadonnees: { nombreTotal: 1, nombreFiltrees: 1, - nombreEnCours: 2, - nombreTerminees: 3, - nombreAnnulees: 4, - nombrePasCommencees: 5, - nombreNonQualifiables: 6, - nombreAQualifier: 7, - nombreQualifiees: 8, nombreActionsParPage: 10 } } diff --git a/test/infrastructure/routes/jeunes.controller.test.ts b/test/infrastructure/routes/jeunes.controller.test.ts index eb9d7e1a5..9129e83c8 100644 --- a/test/infrastructure/routes/jeunes.controller.test.ts +++ b/test/infrastructure/routes/jeunes.controller.test.ts @@ -43,7 +43,7 @@ import { unUtilisateurDecode } from 'test/fixtures/authentification.fixture' import { uneDatetime } from 'test/fixtures/date.fixture' -import { uneActionQueryModelSansJeune } from 'test/fixtures/query-models/action.query-model.fixtures' +import { uneActionQueryModel } from 'test/fixtures/query-models/action.query-model.fixtures' import { StubbedClass, enleverLesUndefined, expect } from 'test/utils' import { ensureUserAuthenticationFailsIfInvalid } from 'test/utils/ensure-user-authentication-fails-if-invalid' import { getApplicationWithStubbedDependencies } from 'test/utils/module-for-testing' @@ -522,8 +522,8 @@ describe('JeunesController', () => { const maintenant = '2022-08-17T12:00:30+02:00' const queryModel: JeuneHomeAgendaQueryModel = { actions: [ - enleverLesUndefined(uneActionQueryModelSansJeune()), - enleverLesUndefined(uneActionQueryModelSansJeune()) + enleverLesUndefined(uneActionQueryModel()), + enleverLesUndefined(uneActionQueryModel()) ], rendezVous: [], sessionsMilo: [],