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