# Contrats

## Responsabilité

Les contrats Accounting sont des données métier persistées/générées qui servent à créer des bills et rapports de contrat, puis à calculer les montants payés/reçus d'avance ou restant à payer/recevoir en fin de période.

## Serveur

- `classes/bills/contracts/ContractBill.js` : création du contrat/bill;
- `classes/bills/reports/ContractsReportBill.js` : rapport des contrats utilisés;
- `BillCreationContext._usedContractsByType` : registre des contrats générés;
- `utilsByModule.getContractPaidOrReceivedInAdvance()`;
- `utilsByModule.getContractToPayOrReceive()`.

## Types de contrats

Le code traite notamment des contrats fournisseur, client, investissement et prêt court terme. Le type de contrat est stocké dans `billData.contractType` et influence taxes, comptes et sens de l'écriture.

## Modèle Unity

`SeededContract` contient date, `contractRegularizationData`, liste de `SeededContractBillEntry` et unités. Il peut calculer son subtotal pour un type de bill donné.

## Relation avec les produits/services

`ContractBill` réutilise les classes de bill data produit ou service pour stocker les entrées du contrat. Le contrat conserve aussi l'UID de régularisation correspondant.

```mermaid
flowchart LR
CFG[Contract config] --> CB[ContractBill]
CB --> USED[_usedContractsByType]
USED --> REPORT[ContractsReportBill]
USED --> REG[Contract Regularization]
REG --> GJ[Journal / Accounts]

```

## Debug

Pour un montant de contrat incorrect, inspecter d'abord le bill et ses entries, puis `contractType`, les dates fiscales, `contract_regularization_uid` et enfin le calcul de régularisation.

## Ajouter un type de contrat ou une règle de contrat

1. Définir le type dans la configuration/static data concernée.
2. Définir si le contrat représente fournisseur, client, investissement, prêt ou une nouvelle catégorie réellement différente.
3. Vérifier `ContractBill` et le type de `BillData` utilisé pour ses entries.
4. Enregistrer le contrat dans `BillCreationContext._usedContractsByType`.
5. Ajouter/adapter `ContractsReportBill`.
6. Définir le `contract_regularization_uid` correspondant.
7. Vérifier les calculs `getContractPaidOrReceivedInAdvance()` et `getContractToPayOrReceive()`.
8. Mettre à jour les relations de comptes Answer Key/Grading.
9. Ajouter le rendu/report Unity si les colonnes diffèrent.

## Dates et durée

Les calculs utilisent la date du contrat, le nombre d'unités/années et les bornes fiscales. Tester un contrat :

- commencé avant l'exercice;
- commencé pendant l'exercice;
- qui se termine pendant l'exercice;
- qui continue après la fin de l'exercice;
- sans fin explicite lorsque le helper accepte `-1`.

## Debug

Si un contrat apparaît dans le report mais régularise mal, le problème est probablement après `ContractBill`. Si le contrat lui-même manque, commencer par la génération/bill factory et `_usedContractsByType`.