# [Tech] Sessions
## UML Data Migration
### SessionParticularities (ou bien SessionParameters ou SessionDetails)
### WHY
Le but est de pouvoir centraliser les changements au sein de ce concept et modifier ainsi la table Training et Session au meme temps et eviter de la duplication dans le contexte d'une migration de BDD.
### WHAT
Modéliser une concept (class ou interface) qui permet de centraliser la saisie des champs communs entre Training et Session.
Ce concept dont on parle il correspond à un containeur de champs presents dans SessionTemplate mais ce n'est pas SessionTemplate.
### HOW
Ce concept ne bavera pas et on le trouvera pas ailleurs (d'autres csproj)
[AJOUTER ICI L'UML de DataMigration]
```plantuml
@startuml
hide circle
skinparam class {
BackgroundColor White
BorderColor Black
ArrowColor Black
}
@enduml
```
## UML
```plantuml
@startuml
hide circle
skinparam class {
BackgroundColor White
BorderColor Black
ArrowColor Black
}
class Session
{
Id: int
PlanId: int
TrainingId: int
StartOn: DateOnly
EndOn: DateOnly
SessionDuration: SessionDuration
Summary: string
Description: string
SessionDetails: SessionDetails
OwnerId: int
AuthorId: int
CreatedAt: DateTimeOffset
ClosedAt: DateTimeOffset
ClosedById: int
ModifiedAt: DateTimeOffset
ModifierId: int
Status: SessionStatus
ContactName: string
ContactDetails: string
}
class SessionStatus
{
Draft,
Open,
Closed,
Done
}
class SessionDuration
{
Duration: int
Type: DurationType
}
class DurationType
{
Day,
Hour
}
class Registration
{
SessionId: int
}
class Training
{
Id: int
Title: string
CategoryCode: CategoryCode
Level: TrainingLevel
IsCertifying: bool
DoesCertificationHaveDeadline: bool
Status: TrainingStatus
SessionDetails: SessionDetails
}
class SessionDetails
{
Description: string
Subtitle: string
ParticipantNumber: int
Visibility: TrainingVisibility
Localization: Localization
Cost: Cost
ProviderId: int
}
class Localization
{
Adress: string
IsRemote: bool
}
class Cost
{
AmountPerParticipantValue: decimal
AmountPerParticipantCurrency: CurrencyCode
AmountPerSessionValue: decimal
AmountPerSessionCurrency: CurrencyCode
}
Session -r- Training
Registration -- Session
Session -- SessionDuration
Training -- SessionDetails
Session -- SessionDetails
Localization -r- SessionDetails
SessionDetails -- Cost
@enduml
```
## MCD
```plantuml
@startuml
hide circle
skinparam class {
BackgroundColor White
BorderColor Black
ArrowColor Black
}
class Session
{
id(PK, int, not null)
planId(FK, int, not null)
trainingId(FK, int, not null)
startOn(date, not null)
endOn(date, not null)
duration(int, not null)
durationType(int, not null)
summary(nvarchar(500), null)
description(nvarchar(6000), null)
participantNumber(int, not null)
address(nvarchar(255), null)
isRemote(bit, null)
ownerId(FK, int, not null)
trainingSubTitle(nvarchar(255), null)
trainingDescription(nvarchar(6000), null)
trainingVisibility(int, not null)
providerId(FK, int, null)
contactName(nvarchar(255), null)
contactDetails(nvarchar(500), null)
amountPerParticipantCurrency(char(3), null)
amountPerParticipantValue(decimal(10,2), null)
amountPerSessionCurrency(char(3), null)
amountPerSessionValue(decimal(10,2), null)
}
class Training
{
id(PK, int, not null)
}
class Plan
{
id(PK, int, not null)
}
class Provider
{
id(PK, int, not null)
}
Session -l- Training
Session -- Plan
Session -- Provider
@enduml
```
## API
| Verbe | Route | Operations | Description |
| -------- | ------------------------------------------------------ | -------------- | ------------ |
| GET | GET /talent-training/api/sessions | Admin | Récupérer toutes les sessions. Filtres: planId, trainingId (providerId?) |
| GET | GET /talent-training/api/sessions/{id} | Admin | Récupérer une session |
| POST | POST /talent-training/api/sessions | Admin | Créer une nouvelle session |
| PUT | PUT /talent-training/api/sessions/{id} | Admin | Editer une session |
## Regles metiers
### Que fait-on quand on créée une session ?
- On copie tous les champs de la formation associé
- Champs en seule lecture :
- Titre de la formation
- Id Organisme
- Niveau
- Certification Oui/non
- Categories
### Comment on s'inscrit à une session ? via une route de sessions ? le PUT ? un POST sur une route dédiée ?
ça correspond à un changement d'etat d'une Registration, c'est hors-sujet par rapport à ces spés.
## Regles metiers : Formation
### Modification
* #### Brouillon:
- On peut tout modifier
- L'organisme est modifiable
* #### Au catalogue:
Les propriétées suivantes sont en lecteur seul et ne peuvent être modifiées:
- Titre
- Catégorie
- Niveau de la formation
L'organisme est modifiable
Tout le reste est modifiable.
On ne peut pas redéfinir une formation avec l'état `au catalogue` à l'état `brouillon`.
* #### Archivée
Une formation archivée n'est plus éditable
## Session
Une session comporte une date de début et une date de fin.
On ne modélise pas la notion de scéance de session pour l'instant.
### Création
- Je doit renseigner un organisme à la création d'une session
- Je ne peux plus modifier l'organisme d'une session créée
- A la création, on me propose implicitement l'organisme rattaché à la Formation (je peux quand même en choisir un autre si je le souhaite).
- Si pas d'organisme renseigné, je dois sélectionner un organisme dans une liste.
### Modification
## Prérequis technique
## Questions ouvertes
- Gestion des etats des sessions
- Définir la valeur/l'état par défaut du statut d'une session