Contextes Accounting — cycle, héritage et données entre périodes
Rôle des contextes Accounting
Un contexte représente une période/situation comptable simulée avant le current_module. Il permet de construire l'état initial du module courant à partir d'une ou plusieurs périodes précédentes : bills, comptes, inventaire, immobilisations, contrats, pages calculées et dynamic dropdowns.
Les contextes ne sont donc pas une simple configuration visuelle. Ils font partie du pipeline serveur de génération du TeamModuleTypeData.
flowchart LR
MS[modules_settings.context_list] --> CTX[modules_contexts.json]
CTX --> MERGE[getContextData]
MERGE --> DATA[Copy current ModuleTypeData]
DATA --> BILLS[Create bills for context]
BILLS --> AK[Answer Key du contexte]
AK --> NEXT[getModuleTypeDataFromAnswerKeyModule]
NEXT --> STATE[Accounts / inventory / immobilizations / contracts]
AK --> SAVE[Saved pages + dropdowns]
BILLS --> PREV[previousContextsBills]
STATE --> CURRENT[Generate current_module]
PREV --> CURRENT
SAVE --> TEAM[TeamModuleTypeData]
CURRENT --> TEAM
Les deux fichiers de configuration à ne pas confondre
| Fichier | Responsabilité |
|---|---|
modules_settings.json |
Choisit quels contextes un module utilise, dans quel ordre, avec quelles dates et quels overrides. |
modules_contexts.json |
Définit les templates réutilisables de contexte : bills à générer, pages disponibles et configuration partagée. |
context_list dans modules_settings.json
Chaque module peut avoir une context_list. Un élément ressemble conceptuellement à :
{
"uid": "last_year",
"context_uid": "module_context_aux_journals_with_regularizations_last_year",
"start_date": {
"day": 1,
"month": 1,
"year_offset": -1
},
"end_date": {
"day": 31,
"month": 12,
"year_offset": -1
},
"preferences": {
"uses_regularizations": false
},
"saved_pages": [
"trial_balance_before_regularizations_and_closure"
]
}
| Champ | Rôle |
|---|---|
uid |
Identité de l'instance de contexte dans ce module. Sert notamment de clé dans previousContextsBills et les snapshots. |
context_uid |
Template chargé depuis modules_contexts.json. |
start_date / end_date |
Bornes utilisées pour générer les bills et calculs de cette période. year_offset permet de viser l'année précédente. |
preferences |
Overrides propres à ce contexte. Ils sont résolus via les helpers de préférence avec override. |
saved_pages |
Pages de l'Answer Key de ce contexte à conserver dans le TeamModuleTypeData final. |
modules_contexts.json : templates réutilisables
modules_contexts.json contient des définitions comme module_context_aux_journals_with_regularizations. Elles peuvent notamment fournir :
bills_type_data— types et quantités de bills à générer;pages_order— pages comptables utilisées par l'Answer Key du contexte;- des propriétés réutilisées par le moteur de création.
Héritage avec base_context_uid
getContextData(moduleContext) charge le template correspondant à moduleContext.context_uid. Si ce template possède base_context_uid, le moteur :
- copie le contexte de base;
- merge ensuite le contexte enfant par-dessus;
- applique ensuite les règles/preferences propres à l'instance du module.
Utiliser ce mécanisme lorsqu'un nouveau contexte est une variante d'un contexte existant plutôt que de dupliquer un énorme bloc bills_type_data.
Pipeline réel de création des contextes
Le cœur se trouve dans byModule_utils_create_module_type_data.js.
1. Initialiser l'état de départ
Le moteur possède un currentModuleTypeDataBase qui contient l'état comptable courant : comptes, inventaire, immobilisations, contrats, taxes, services/expenses, etc.
2. Parcourir context_list dans l'ordre
Pour chaque moduleContext :
getContextData(moduleContext)résout le template et ses overrides;- les dates absolues sont calculées depuis
actSettings.year; - le moteur fait un
deepCopyde l'état comptable courant; - les bills du contexte sont générés;
BillContext.getBills()devient le jeu de bills du contexte;- un Answer Key complet du contexte est calculé;
- les pages demandées par
saved_pagessont snapshotées; - le contexte est transformé en nouvel état comptable de base pour le contexte suivant.
3. Conserver les bills des contextes précédents
Après chaque contexte :
currentModuleTypeDataBase.previousContextsBills[moduleContext.uid] =
previousModuleTypeData.bills;
Les bills ne disparaissent donc pas après leur période. Ils restent disponibles pour les moteurs qui doivent consulter l'historique.
4. Générer le current_module
Une fois tous les contextes calculés, le moteur utilise l'état final comme point de départ du current_module. Les bills du module étudiant sont alors générés avec les comptes/inventaire/immobilisations/contracts issus des contextes.
BillCreationContext vs BillContext vs “module context”
Ces trois termes sont proches mais ne désignent pas la même chose.
| Concept | Responsabilité |
|---|---|
| Module context | Période logique définie dans context_list / modules_contexts.json. |
BillCreationContext |
État temporaire global utilisé pendant la création des bills : RNG, dates, partners, inventory, comptes, ordre de calcul, etc. |
BillContext |
Vue runtime des bills/comptes/inventory utilisée par les bills, Answer Key et calculs comptables après/pendant génération. |
Ne pas documenter ou coder ces trois concepts comme s'ils étaient interchangeables.
previousContextsBills
TeamModuleTypeData.previousContextsBills est indexé par contextUid. Chaque contexte contient typiquement :
billsData;billsOrder;partners;taxeslorsque présentes.
BillContext expose ensuite :
getPreviousContextsBills()— tous les bills historiques;getPreviousContextsBillsByType(...)— filtre par type;getPreviousContextsBillsByContextUid(contextUid);getBillByUid()— cherche d'abord dans le contexte courant, puis dans les contextes précédents.
Cas particulier module_context_client/provider
BillContext.getSerializedBillsBase() exclut actuellement les bills dont le type contient module_context_client lors de certaines sérialisations. Le code contient d'ailleurs un TODO explicite sur ce cas. Avant de modifier ces types, inspecter leur lifecycle complet au lieu de supposer qu'ils se comportent comme un bill standard.
savedPagesDataByContextUids
Si un contexte déclare saved_pages, le moteur récupère les pages correspondantes depuis l'Answer Key de ce contexte :
savedPagesDataByContextUids
└── <moduleContext.uid>
├── trial_balance_before_regularizations_and_closure
├── statement_income
└── ...
Côté Unity, TeamByModuleController.GetContextSavedPageData(actModuleUid, moduleContextUid, modulePageUid) permet de relire ces snapshots.
Quand utiliser saved_pages
Utiliser saved_pages lorsqu'une page historique doit être consultable/référencée plus tard. Ne pas l'utiliser pour recopier toutes les pages “au cas où” : chaque snapshot augmente les données persistées dans teamsModules.
savedDynamicDropdownsDataByContextUids
Lorsqu'une saved page dépend d'un dynamic dropdown, le moteur conserve aussi les entrées correspondantes dans :
savedDynamicDropdownsDataByContextUids[contextUid]
Sinon la page historique pourrait contenir des tables indexées par des UIDs que le client ne saurait plus nommer/afficher.
Propagation entre contextes
getModuleTypeDataFromAnswerKeyModule() transforme la sortie du contexte en état de départ pour le suivant.
| Donnée | Comportement entre contextes |
|---|---|
| Comptes | Recalculés depuis l'Answer Key / account state puis propagés. |
| Inventaire | Copié/transformé à partir de l'état final de BillContext. |
| Immobilisations | Copiées avec mise à jour de l'usage/dépréciation lorsque les règles du contexte l'exigent. |
| Contrats | Copiés vers le contexte suivant. |
| Taxes immobilisations | Copiées vers le contexte suivant. |
| Services / expenses | Conservés lorsqu'ils existent. |
| Bills | Archivé dans previousContextsBills; le contexte suivant obtient ses propres bills. |
Overrides de préférences par contexte
Un contexte peut modifier temporairement des préférences du module. Le code utilise getPreferenceWithOverride(moduleSettings, moduleContext, preference) pour plusieurs règles.
Exemples visibles dans modules_settings.json :
answer_key_until;uses_accounting_closing;uses_regularizations;uses_stock_regularizations;uses_taxes_payment_form;has_new_immobilizations;has_new_contracts.
Une préférence mise dans le contexte doit affecter uniquement cette période de génération. Si le comportement doit aussi changer dans le current module, configurer la preference au bon niveau du module.
initial_pages_data et préfixe previous_
Après les contextes, current_module.initial_pages_data peut construire l'état initial de certaines pages depuis l'état actuel ou précédent.
Le moteur traite notamment :
ledger/previous_ledger;bank_statement/previous_bank_statement;clients_subledger;providers_subledger;stocks_subledger;- fallback vers une page de l'Answer Key précédent.
Le préfixe previous_ indique au générateur de prendre la donnée du contexte/module précédent puis le préfixe est retiré avant de sauvegarder dans initialPagesData.
Ajouter un nouveau contexte de A à Z
- Décider s'il faut vraiment un nouveau template. Si seule une préférence/date change, réutiliser un
context_uidexistant avec overrides. - Si nécessaire, créer le template dans
modules_contexts.json. - Préférer
base_context_uidsi le nouveau contexte est une variante d'un gros contexte existant. - Ajouter l'instance dans
modules_settings.context_listau bon ordre. - Donner un
uidstable à l'instance. - Définir
start_date/end_dateetyear_offset. - Ajouter les overrides
preferencesnécessaires. - Ajouter seulement les
saved_pagesqui doivent réellement survivre. - Importer la static data Google Sheets/JSON si la source officielle passe par le pipeline d'export.
- Générer le Module Type Data avec un seed fixe.
- Inspecter l'état avant/après ce contexte.
- Vérifier que le contexte suivant et le current module partent du bon état.
Ajouter une nouvelle donnée qui doit traverser les contextes
C'est une modification plus profonde. Il faut auditer au minimum :
createInitialModuleTypeData()— création initiale;createBills()/BillCreationContext— utilisation pendant la période;BillContext— état calculé;getModuleTypeDataFromAnswerKeyModule()— propagation vers le contexte suivant;TeamModuleTypeData.cs— désérialisation Unity;- migration
teamsModulessi vieux documents; - Answer Key et Grading si la donnée influence une page comptable.
Debug d'un contexte
Pour un bug “la bonne valeur existe dans l'année précédente mais disparaît dans le module courant”, inspecter dans cet ordre :
- Configuration — le contexte est-il réellement dans
context_list? - Template —
context_uidexiste-t-il dansmodules_contexts.json? - Merge —
base_context_uid+ overrides produisent-ils le contexte attendu ? - Dates — vérifier
year_offsetet les timestamps calculés. - Bills du contexte — inspecter
moduleTypeDataForContext.bills. - Answer Key du contexte — la valeur attendue existe-t-elle déjà ici ?
- Transformation — inspecter
getModuleTypeDataFromAnswerKeyModule(). - previousContextsBills — le contexte est-il présent sous le bon
uid? - saved_pages — le snapshot est-il présent ?
- current_module — la donnée est-elle encore correcte juste avant sa génération ?
Test de régression recommandé
| Cas | Vérification |
|---|---|
| Contexte année précédente | Dates avec year_offset = -1, balances correctement reportées. |
| Deux contextes successifs | Le second part de l'état final du premier. |
saved_pages |
Page + dynamic dropdowns relisibles côté Unity. |
| Inventory | Stock final du contexte précédent devient l'état de départ suivant. |
| Immobilisations | Usage/dépréciation cumulative correcte. |
| Contrats | Contrat encore disponible et régularisation correcte. |
| Bills historiques | BillContext.getBillByUid() retrouve un bill précédent. |
| Current module | Answer Key final et grading à 100 % avec les données propagées. |
Fichiers clés
Assets/GameSpecific/byModule/Resources/data_byModule/modules_settings.jsonAssets/GameSpecific/byModule/Resources/data_byModule/modules_contexts.jsonnode.js/backend/braincloud/server_scripts/_utils/by_module/byModule_utils_create_module_type_data.js.../_utils/by_module/contexts/BillCreationContext.js.../_utils/by_module/contexts/BillContext.jsAssets/Src/Game/Data/ByModule/TeamModuleTypeData.csAssets/Src/UI/SimByModule/Controllers/TeamByModuleController.cs