Skip to content

Commit

Permalink
feat: permet config autoinscription session
Browse files Browse the repository at this point in the history
  • Loading branch information
arthurlbrjc committed Jan 31, 2025
1 parent 4dcd5ce commit dc3be84
Show file tree
Hide file tree
Showing 15 changed files with 158 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export class EmargerSessionMiloCommandHandler extends CommandHandler<
private dateService: DateService,
private conseillerAuthorizer: ConseillerAuthorizer
) {
super('UpdateSessionMiloCommandHandler')
super('EmargerSessionMiloCommandHandler')
}

async handle(command: EmargerSessionMiloCommand): Promise<Result> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export interface UpdateSessionMiloCommand extends Command {
idConseiller: string
accessToken: string
estVisible?: boolean
autoinscription?: boolean
inscriptions?: SessionMilo.Modification.Inscription[]
}

Expand Down Expand Up @@ -78,7 +79,8 @@ export class UpdateSessionMiloCommandHandler extends CommandHandler<
const sessionModifiee = SessionMilo.modifier(
session,
this.dateService.now(),
command.estVisible
command.estVisible,
command.autoinscription
)

const resultInscriptions = SessionMilo.extraireInscriptionsATraiter(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,11 @@ export class GetSessionsConseillerMiloQueryGetter {
const sessionSqlModel = sessionsSqlModels.find(
({ id }) => id === sessionMilo.session.id.toString()
)
const dateCloture = sessionSqlModel?.dateCloture
return mapSessionConseillerDtoToQueryModel(
sessionMilo,
sessionSqlModel?.estVisible ?? false,
timezoneStructure,
this.dateService.now(),
dateCloture ? DateTime.fromJSDate(dateCloture) : undefined
sessionSqlModel
)
})

Expand Down
13 changes: 10 additions & 3 deletions src/application/queries/query-mappers/milo.mappers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
SessionJeuneDetailDto,
SessionParDossierJeuneDto
} from 'src/infrastructure/clients/dto/milo.dto'
import { SessionMiloSqlModel } from 'src/infrastructure/sequelize/models/session-milo.sql-model'
import {
AgendaConseillerMiloSessionListItemQueryModel,
DetailSessionConseillerMiloQueryModel,
Expand Down Expand Up @@ -73,16 +74,18 @@ export function mapSessionJeuneDtoToQueryModel(

export function mapSessionConseillerDtoToQueryModel(
{ offre, session }: SessionConseillerDetailDto,
estVisible: boolean,
timezone: string,
maintenant: DateTime,
dateCloture?: DateTime
parametrageSqlModel?: SessionMiloSqlModel
): SessionConseillerMiloQueryModel {
const dateHeureFin = DateTime.fromFormat(
session.dateHeureFin,
MILO_DATE_FORMAT,
{ zone: timezone }
).toUTC()
const dateCloture = parametrageSqlModel?.dateCloture
? DateTime.fromJSDate(parametrageSqlModel.dateCloture)
: undefined

const nombreParticipants = (session.instances ?? [])
.map(({ idDossier, statut }) =>
Expand All @@ -94,11 +97,14 @@ export function mapSessionConseillerDtoToQueryModel(
statut === SessionMilo.Inscription.Statut.PRESENT
).length

const autoinscription = parametrageSqlModel?.autoinscription ?? false

const queryModel: SessionConseillerMiloQueryModel = {
id: session.id.toString(),
nomSession: session.nom,
nomOffre: offre.nom,
estVisible: estVisible,
estVisible: (autoinscription || parametrageSqlModel?.estVisible) ?? false,
autoinscription,
dateHeureDebut: DateTime.fromFormat(
session.dateHeureDebut,
MILO_DATE_FORMAT,
Expand Down Expand Up @@ -214,6 +220,7 @@ export function mapSessionToDetailSessionConseillerQueryModel(
animateur: session.animateur,
lieu: session.lieu,
estVisible: session.estVisible,
autoinscription: session.autoinscription,
statut: SessionMilo.calculerStatut(
maintenant,
session.fin,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ export class SessionConseillerMiloQueryModel {
@ApiProperty()
estVisible: boolean

@ApiProperty()
autoinscription: boolean

@ApiProperty()
dateHeureDebut: string

Expand Down Expand Up @@ -148,6 +151,9 @@ export class DetailSessionConseillerQueryModel {
@ApiProperty()
estVisible: boolean

@ApiProperty()
autoinscription: boolean

@ApiProperty({ required: false })
nbPlacesDisponibles?: number

Expand Down
18 changes: 7 additions & 11 deletions src/domain/milo/session.milo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export interface SessionMilo {
animateur: string
lieu: string
estVisible: boolean
autoinscription: boolean
idStructureMilo: string
offre: SessionMilo.Offre
inscriptions: SessionMilo.Inscription[]
Expand Down Expand Up @@ -66,11 +67,15 @@ export namespace SessionMilo {
export function modifier(
session: SessionMilo,
dateModification: DateTime,
visibilite?: boolean
nouvelleVisibilite?: boolean,
nouvelleAutoinscription?: boolean
): Omit<SessionMilo, 'inscriptions'> {
const autoinscription = nouvelleAutoinscription ?? session.autoinscription

return {
...supprimerInscriptions(session),
estVisible: visibilite ?? session.estVisible,
estVisible: (autoinscription || nouvelleVisibilite) ?? session.estVisible,
autoinscription,
dateModification
}
}
Expand Down Expand Up @@ -215,15 +220,6 @@ export namespace SessionMilo {
REFUS_TIERS = 'REFUS_TIERS',
PRESENT = 'PRESENT'
}

export function estInscrit(
statut?: SessionMilo.Inscription.Statut
): boolean {
return (
statut === SessionMilo.Inscription.Statut.INSCRIT ||
statut === SessionMilo.Inscription.Statut.PRESENT
)
}
}

export namespace Modification {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ export class SessionMiloHttpSqlRepository implements SessionMilo.Repository {
const sessionMiloSqlModel: AsSql<SessionMiloDto> = {
id: sessionSansInscription.id,
estVisible: sessionSansInscription.estVisible,
autoinscription: sessionSansInscription.autoinscription,
idStructureMilo: sessionSansInscription.idStructureMilo,
dateModification:
sessionSansInscription.dateModification?.toJSDate() ?? new Date(),
Expand Down Expand Up @@ -318,6 +319,7 @@ function dtoToSessionMilo(
lieu: sessionDto.lieu,
nbPlacesDisponibles: sessionDto.nbPlacesDisponibles ?? undefined,
estVisible: false,
autoinscription: false,
idStructureMilo: structureMilo.id,
offre: dtoToOffre(offreDto),
inscriptions: dtoToInscriptions(listeInscrits, jeunes),
Expand All @@ -335,7 +337,8 @@ function dtoToSessionMilo(
).endOf('day')
}
if (sessionSql) {
session.estVisible = sessionSql.estVisible
session.estVisible = sessionSql.autoinscription || sessionSql.estVisible
session.autoinscription = sessionSql.autoinscription
session.dateModification = DateTime.fromJSDate(sessionSql.dateModification)
}
if (sessionDto.commentaire) session.commentaire = sessionDto.commentaire
Expand Down
1 change: 1 addition & 0 deletions src/infrastructure/routes/conseillers.milo.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ export class ConseillersMiloController {
idConseiller,
accessToken: accessToken,
estVisible: updateSessionMiloPayload.estVisible,
autoinscription: updateSessionMiloPayload.autoinscription,
inscriptions: updateSessionMiloPayload.inscriptions
}

Expand Down
20 changes: 18 additions & 2 deletions src/infrastructure/routes/validation/conseillers.milo.inputs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ export class UpdateSessionMiloPayload {
@ApiProperty()
@ValidateIf(
payload =>
payload.inscriptions === undefined || payload.estVisible !== undefined
(payload.inscriptions === undefined &&
payload.autoinscription === undefined) ||
payload.estVisible !== undefined
)
@IsDefined({ message: 'Au moins un des champs doit être renseigné' })
@IsBoolean()
Expand All @@ -94,8 +96,22 @@ export class UpdateSessionMiloPayload {
@ApiProperty()
@ValidateIf(
payload =>
payload.estVisible === undefined || payload.inscriptions !== undefined
(payload.inscriptions === undefined &&
payload.estVisible === undefined) ||
payload.autoinscription !== undefined
)
@IsDefined({ message: 'Au moins un des champs doit être renseigné' })
@IsBoolean()
autoinscription?: boolean

@ApiProperty()
@ValidateIf(
payload =>
(payload.estVisible === undefined &&
payload.autoinscription === undefined) ||
payload.inscriptions !== undefined
)
@IsDefined({ message: 'Au moins un des champs doit être renseigné' })
@IsArray()
@ValidateNested({ each: true })
@Type(() => InscriptionSessionMiloPayload)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
'use strict'

/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.addColumn('session_milo', 'autoinscription', {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false
})
},

async down(queryInterface) {
await queryInterface.removeColumn('session_milo', 'autoinscription')
}
}
3 changes: 3 additions & 0 deletions src/infrastructure/sequelize/models/session-milo.sql-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ export class SessionMiloDto extends Model {
@Column({ field: 'est_visible', type: DataType.BOOLEAN })
estVisible: boolean

@Column({ field: 'autoinscription', type: DataType.BOOLEAN })
autoinscription: boolean

@Column({
field: 'date_modification',
type: DataType.DATE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,7 @@ describe('UpdateSessionMiloCommandHandler', () => {
const commandSansInscription: UpdateSessionMiloCommand = {
idSession: 'idSession',
idConseiller: conseiller.id,
accessToken: 'token',
estVisible: true
accessToken: 'token'
}

it('n’autorise pas un conseiller sans structure', async () => {
Expand Down Expand Up @@ -139,7 +138,7 @@ describe('UpdateSessionMiloCommandHandler', () => {
sessionMiloRepository.save.resolves(emptySuccess())
})

it('la met à jour + planifie rappels', async () => {
it('met à jour la visibilité', async () => {
// Given
const session = uneSessionMilo({
inscriptions: [],
Expand All @@ -149,7 +148,7 @@ describe('UpdateSessionMiloCommandHandler', () => {

// When
const result = await updateSessionMiloCommandHandler.handle(
commandSansInscription,
{ ...commandSansInscription, estVisible: true },
utilisateur
)

Expand All @@ -170,6 +169,38 @@ describe('UpdateSessionMiloCommandHandler', () => {
)
})

it('met à jour l’autoinscription (et la visibilité)', async () => {
// Given
const session = uneSessionMilo({
inscriptions: [],
nbPlacesDisponibles: 3
})
sessionMiloRepository.getForConseiller.resolves(success(session))

// When
const result = await updateSessionMiloCommandHandler.handle(
{ ...commandSansInscription, autoinscription: true },
utilisateur
)

// Then
expect(result).to.deep.equal(emptySuccess())
expect(sessionMiloRepository.save).to.have.been.calledWithExactly(
{
...supprimerInscriptions(session),
estVisible: true,
autoinscription: true,
dateModification: uneDatetime()
},
{
idsJeunesAInscrire: [],
inscriptionsASupprimer: [],
inscriptionsAModifier: []
},
idpToken
)
})

it('permet d’inscrire des jeunes à la session', async () => {
// Given
const session = uneSessionMilo({
Expand Down Expand Up @@ -217,7 +248,6 @@ describe('UpdateSessionMiloCommandHandler', () => {
expect(sessionMiloRepository.save).to.have.been.calledWithExactly(
{
...supprimerInscriptions(session),
estVisible: true,
dateModification: uneDatetime()
},
{
Expand Down Expand Up @@ -280,7 +310,6 @@ describe('UpdateSessionMiloCommandHandler', () => {
expect(sessionMiloRepository.save).to.have.been.calledWithExactly(
{
...supprimerInscriptions(session),
estVisible: true,
dateModification: uneDatetime()
},
{
Expand Down Expand Up @@ -387,7 +416,6 @@ describe('UpdateSessionMiloCommandHandler', () => {
expect(sessionMiloRepository.save).to.have.been.calledWithExactly(
{
...supprimerInscriptions(session),
estVisible: true,
dateModification: uneDatetime()
},
{
Expand Down Expand Up @@ -495,7 +523,6 @@ describe('UpdateSessionMiloCommandHandler', () => {
expect(sessionMiloRepository.save).to.have.been.calledWithExactly(
{
...supprimerInscriptions(session),
estVisible: true,
dateModification: uneDatetime()
},
{
Expand Down Expand Up @@ -605,7 +632,6 @@ describe('UpdateSessionMiloCommandHandler', () => {
it('authorize le conseiller', async () => {
// Given
const command: UpdateSessionMiloCommand = {
estVisible: true,
idSession: 'idSession',
idConseiller: conseiller.id,
accessToken: 'token'
Expand Down
3 changes: 3 additions & 0 deletions test/fixtures/sessions.fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export const uneSessionConseillerMiloQueryModel: SessionConseillerMiloQueryModel
nomSession: 'Une-session',
nomOffre: 'Une-offre',
estVisible: false,
autoinscription: false,
dateHeureDebut: '2020-04-06T13:20:00.000Z',
dateHeureFin: '2020-04-08T13:20:00.000Z',
type: {
Expand Down Expand Up @@ -53,6 +54,7 @@ export const unDetailSessionConseillerMiloQueryModel: DetailSessionConseillerMil
animateur: 'Un-animateur',
lieu: 'Un-lieu',
estVisible: false,
autoinscription: false,
nbPlacesDisponibles: 10,
commentaire: 'Un-commentaire',
statut: SessionMilo.Statut.A_CLOTURER
Expand Down Expand Up @@ -123,6 +125,7 @@ export const uneSessionMilo = (
animateur: 'Un-animateur',
commentaire: 'Un-commentaire',
estVisible: false,
autoinscription: false,
dateMaxInscription: DateTime.fromISO('2020-04-07T23:59:59.999Z'),
debut: DateTime.fromISO('2020-04-06T13:20:00.000Z', {
zone: 'America/Cayenne'
Expand Down
Loading

0 comments on commit dc3be84

Please sign in to comment.