# HR1 — architecture et logique game-specific

## Positionnement

HR1 est le jeu By Year orienté gestion des ressources humaines : staffing, rémunération, avantages, postings, contrats, CEO et segments d'employés.

## Static data

Les datasets importés incluent `ceo`, `employees`, `strategies`, `advantages`, `events`, `scenario`, `segments`, `contracts` et `act_perf_pond`, plus `constants`.

## Modèles Unity

- `CeoData`;
- `EmployeeData` / `EmployeesAdvantage` / `AdvantageData`;
- `PostingData`, `LaunchedPosting`, `PostingResult`;
- `ContractData`, `ContractResult`;
- `Segment`, `SegmentResult`, `SegmentScores`;
- `TeamDecisionsHr1`, `TeamHr1`, `YearData`.

## Hooks serveur

`GameSpecificUtilsHr1` gère entre autres le démarrage d'année, génération de contrats, reset des avantages, events, CEOs, coûts d'avantages, coûts de postings/licenciements, coûts employés et rankings.

## Génération

```mermaid
flowchart LR
DEC[Staffing + rémunération + avantages + postings] --> HIRE[Hiring]
DEC --> RET[Retention / belonging]
DEC --> COST[Employee costs]
DEC --> CEO[CEO]
HIRE --> RES[Segment Results]
RET --> RES
COST --> RES
CEO --> RES
RES --> SCORE[Scores / ActPerf]

```

`GenerateResultsHr1` finalise contrats et CEOs, calcule hiring, averages, retention/belonging, scores de postings et segments, puis sauvegarde les résultats.

## Évaluation

`EvalHr1` fournit scenario score, segment score et performance annuelle. Les résultats HR alimentent ensuite le cadre commun d'évaluation By Year.

## UI

Les vues spécifiques comprennent CEO, staffing, employés, avantages, stratégies, postings, contrats, rémunération et rapports. Les classes sont sous `Assets/GameSpecific/hr1/Src/UI`.

## Debug

Pour un problème RH, isoler d'abord la décision (employee/segment/posting/advantage), puis le coût calculé dans `hr1_utils.js`, puis la phase correspondante de `GenerateResultsHr1`.

## Ajouter une feature HR1 de A à Z

### Custom commands réelles

`hr1_custom_command.js` route actuellement :

- `posting` / `delete_posting`;
- `dismiss` / `delete_dismiss`;
- `advantage` / `delete_advantage`;
- `salary`;
- `ceo_bid` / `delete_ceo_bid`;
- `change_wanted_contracts`;
- puis les commandes By Year communes en fallback.

Ces commandes ne font pas que sauvegarder une valeur : elles recalculent souvent un coût, modifient `cash`, sauvegardent `teams`, parfois `actDataGameSpec`, puis envoient des RTT comme `posting_changed`, `salary_changed`, `team_new_bid`.

### Carte résultats

- `finalizeContracts()` — contrats;
- `solveCeos()` — résolution des CEO bids;
- `computeAverages()` — références du marché RH;
- `computeHiring()` — embauche;
- `computeRetentionAndBelonging()` — rétention/appartenance;
- `computeScores()` — scores;
- `gatherSegments()` — collecte des décisions par segment;
- `generateCurrentYearResults()` / `saveResults()`.

## Ajouter une nouvelle décision RH

1. Définir si la décision appartient au segment, à l'employé, aux avantages, aux postings, CEO ou contrats.
2. Ajouter la donnée au bon niveau de `TeamDecisionsHr1`/`YearData`.
3. Ajouter l'UI sous `GameSpecific/hr1/Src/UI`.
4. Ajouter la branche dans `hr1_custom_command.js`.
5. Calculer le coût avec un helper `utilsHr1` partagé; ne pas dupliquer le calcul UI.
6. Appliquer/refund le delta de cash correctement lors d'une édition/suppression.
7. Envoyer le RTT approprié.
8. Consommer la décision dans `GenerateResultsHr1`.
9. Adapter `EvalHr1.computeActPerfScore()` si le score change.
10. Vérifier reopen/delete results.

## CEO bids : exemple d'opération multi-document

Un bid CEO modifie à la fois `teams` et un compteur dans `actDataGameSpec.ceos` via `saveDocumentIncrementData()`. Une nouvelle feature concurrentielle partagée entre équipes peut nécessiter le même pattern; il faut alors tester la concurrence entre plusieurs teams.

## Debug HR1

Quand un coût est faux : comparer static data → helper de coût → delta ancien/nouveau → cash sauvegardé. Quand le résultat annuel est faux : comparer segment decisions → averages → hiring/retention → result segment → ActPerf.