---
# System prepended metadata

title: Budget OPTION 1

---

# Budget OPTION 1


## Vue d'ensemble

```plantuml
@startuml
hide circle 
skinparam class {
  BackgroundColor White
  BorderColor Black
  ArrowColor Black
}

class BudgetLine #lightgreen{
 
}

class FinancingSource #lightgreen {
   
}

class Cost #lightgreen{
   
}




class Session {

}

class Financing #lightgreen {
   
}

class Plan {

}

Plan  -l-  BudgetLine
Plan  -l-  Session
Cost -u- Session
Registration -r- Session
Registration -- Cost
FinancingSource - BudgetLine
Financing -u- BudgetLine 
Financing -- Session

@enduml
```


## MCD

```plantuml
@startuml
hide circle 
skinparam class {
  BackgroundColor White
  BorderColor Black
  ArrowColor Black
}

class BudgetLine #lightgreen{
    Id : int IDENTITY<1,1> NOT NULL
    ~~PlanId~~ : int NOT NULL
    ~~FinancingSourceId~~ : int NOT NULL
    
    Type : nvarchar<Subsidy | External | OwnFound > NOT NULL

    AmountExcludingTaxes : decimal
    Currency : nvarchar<3>
    CreatedAt : [datetimeoffset]<7> NULL
    CreatedBy : int NOT NULL
}

class FinancingSource #lightgreen {
    Id : int IDENTITY<1,1> NOT NULL,
    
    Type : nvarchar<Subsidy | External | OwnFound> NOT NULL
    
    Name : nvarchar<255> NOT NULL
    Description : nvarchar<600> NOT NULL
    CreatedAt : [datetimeoffset]<7> NULL
    CreatedBy : int NOT NULL
}

class SessionCost #lightgreen{
    Id : int IDENTITY<1,1> NOT NULL
    ~~SessionId~~ : int NOT NULL

    AmountExcludingTaxes : decimal DEFAULT 0
    Currency : nvarchar<3>
    Comment : nvarchar<250>
    CreatedAt : [datetimeoffset]<7> NULL
    CreatedBy : int NOT NULL
    DeletedAt : [datetimeoffset]<7> NULL
    DeletedBy : int NULL
}

class RegistrationCost #lightgreen{
    Id : int IDENTITY<1,1> NOT NULL
    ~~RegistrationId~~ : int 
    AmountExcludingTaxes : decimal DEFAULT 0
    Currency : nvarchar<3>
    Comment : nvarchar<250>
    CreatedAt : [datetimeoffset]<7> NULL
    CreatedBy : int NOT NULL
    DeletedAt : [datetimeoffset]<7> NULL
    DeletedBy : int NULL
}



class Session {
...
    OwnFinancingAmount: decimal
    OwnFinancingCurrency : nvarchar<3>
}

class Financing #lightgreen {
    Id : IDENTITY<1,1> NOT NULL
    ~~BudgetId~~ : int NOT NULL
    ~~SessionId~~ : int NOT NULL
    
    AmountExcludingTaxes : decimal NOT NULL DEFAULT 0
    Currency : nvarchar<3> NOT NULL
    CreatedAt : [datetimeoffset]<7> NULL
    CreatedBy : int NOT NULL
}

class Plan {
    ...
    TargetTrainingHours: int NOT NULL DEFAULT 0
    TargetCostPerHour: decimal NOT NULL DEFAULT 0
    OwnBudget : decimal NOT NULL DEFAULT 0

}

Plan  -l-  BudgetLine
Plan  -l-  Session
SessionCost -u- Session
Registration -r- Session
Registration -- RegistrationCost
FinancingSource - BudgetLine
Financing -u- BudgetLine 
Financing -- Session

@enduml
```



## API - Ressources

### Budget

#### Création

Pour chaque source de financement, à la création d'un plan, on va créer une ligne budgetaire. Impossible de créer à la main un budget. 

#### Edition
```javascript
PUT /talent-training/api/budgets
{
    items: [
        {
            id : 7,
            amount : 20000
        }
    ]
}
```
##### Regles
- La currency n'est pas possible de l'editer car elle est deduite du plan

#### Lecture
```javascript
GET /talent-training/api/budgets/42

query Parameters : planId, financingSourceId

return {
  'id' : 42,
  'type' : "external" ,
    
  'source' : {
    'id' : 0,
    'name' : "Externe 1",
    'description' : "lorem ipsum",
  },
    
  'planId' : 7,
  'currency' : 'EUR',
  'amount' : 7.00,
}
```
## Cost

### Création

La création des couts se fait à la création d’une registration ou d’une session

### Edition
La currency n'est pas possible de l'editer car elle est deduite du plan
```javascript
PUT /talent-training/api/costs/:id
{
    'amount' : 2000    
}


PUT /talent-training/api/costs
[
    {
        'id' : 7,
        'amount' : 2000,
        'comment' : 'lorem ipsum...'
    }
    ...
]
```

### Lecture
```javascript
GET /talent-training/api/costs/id

return {
    'id' : 7,
    'sessionId' : 42,
    'registrationId' : null,
    'amount' : 300,
    'currency' : 'EU',
    'comment' : 'lorem ipsum...'
}

GET /talent-training/api/costs
Query Parameters : sessionId, registrationId
```
## Financing Source

### Création
Pour l'MVP nous avons en dur dans la base un `financing-source` de type : 
- `subsidy` pour le subventions
-  `external` pour les fonds externes

### Edition
Pour l'MVP l'édition n'est pas prévu

### Lecture
```javascript
GET /talent-training/api/financing-sources

return {
    items : [
   
        {
            'id' : 0,
            'name' : 'External 1',
            'type' : 'External',
            'description' : 'lorem ipsum...'
        },
        {
            'id' : 1,
            'name' : 'Subsidy 1',
            'type' : 'Subsidy',
            'description' : 'lorem ipsum ...'
        },
        {
            'id' : 2,
            'name' : 'fond propres',
            'type' : 'Own',
            'description' : 'lorem ipsum ...'
        }
    ]
}
```

## Financing

### Création

Pour tout les budgets du plan, à la création d'une session, on créé les financing associés. 

### Edition
```javascript
PUT /talent-training/api/financings
[
    {
        'id' : 7,
        'amount' : 1000
    }
]

PUT /talent-training/api/financings/7

{
    'amount' : 1000
}

```
#### Regles
- La currency n'est pas possible de l'editer car elle est deduite du plan 

### Lecture
```javascript

GET /talent-training/api/financings/id

GET /talent-training/api/financings
queryParameters : budgetId, budget.type, sessionId
{
    items : 
    [
        {
            'id' : 7,
            'amount' : 1000,
            'courrency' :'EUR',
            'budget' : {
                id : 42,
                type : 'External',
            }
            'sessionId' : 1
        },
        ...
    ] 
}
```
## Creation du budget

```plantuml
@startuml
hide circle 
skinparam class {
  BackgroundColor White
  BorderColor Black
  ArrowColor Black
}

actor AdminRH


AdminRH -> Plan : Create
Plan -> FinancingSource : GetAll
Plan -> BudgetLine : Pour chaque source de financement, création d'un budget

@enduml
```

## Creation des couts
```plantuml
@startuml
hide circle 
skinparam class {
  BackgroundColor White
  BorderColor Black
  ArrowColor Black
}

actor AdminRH


AdminRH -> Session : Change status : opened
Session -> Cost : IF not exist, Create fixed cost for the session

@enduml
```

```plantuml
@startuml
hide circle 
skinparam class {
  BackgroundColor White
  BorderColor Black
  ArrowColor Black
}

actor AdminRH


AdminRH -> Registration : Create
Registration -> Cost : Create

@enduml
```
## Création des financings


```plantuml
@startuml
hide circle 
skinparam class {
  BackgroundColor White
  BorderColor Black
  ArrowColor Black
}

actor AdminRH


AdminRH -> Session : Create
Session -> Budget : Get All Plan budget
Session -> Financing : Foreach budget, create a Financing

@enduml
```


#

```plantuml
@startuml

node UpdateOwnBudget as "Update own budget"
interface AnyBudgetUpdated as "Event : Any budget updated"
interface TargetHoursUpdated as "Event : Target hours updated"
interface TargetCostPerHoursUpdated as "Event : Target avg cost per hours updated"



UpdateOwnBudget <-- AnyBudgetUpdated
UpdateOwnBudget <-- TargetHoursUpdated
UpdateOwnBudget <-- TargetCostPerHoursUpdated


@enduml
```
# 

```plantuml
@startuml

node UpdateOwnFinancing as "Update own financing"
interface AnyBudgetUpdated as "Event : Any cost updated"
interface TargetHoursUpdated as "Event : Any financing updated"
interface TargetCostPerHoursUpdated as "Event : Session place available updated"
interface Registered as "Event : employee registered to a session"



UpdateOwnFinancing <-- AnyBudgetUpdated
UpdateOwnFinancing <-- TargetHoursUpdated
UpdateOwnFinancing <-- TargetCostPerHoursUpdated
UpdateOwnFinancing <-- Registered


@enduml
```