---
# System prepended metadata

title: '[Tech] Sessions'

---

# [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


