Configuration & Reference
Prérequis
Runtime
Python ≥ 3.10
Packages
pip install jinja2 pyyaml openpyxl
Prévisualisation
py serve.py puis ouvrir http://localhost:8080
Génération
py build.py — depuis la racine du projet, tous les fichiers Excel fermés.
Résultat attendu
Console se termine par ✓ No warnings — tout warning signale une incohérence de données ou un fichier manquant à corriger avant livraison.
Arborescence du projet
RetroDoc Tagetik/
├── build.py ← Script de génération principal
├── rd_render_runner.py ← Runner de rendu parallèle (ProcessPoolExecutor)
├── rd_form_parser.py ← Parser XML forms parallèle (ProcessPoolExecutor)
├── rd_helpers.py ← Helpers purs partagés (decode_form_oid, etc.)
├── serve.py ← Serveur de prévisualisation local (file://)
├── annotate_sql.py ← Annotation SQL (utilitaire optionnel)
├── CLAUDE.md ← Guide de projet (conventions, règles UI)
├── RETRODOC_DESIGN_SYSTEM.md ← Spécification UI/UX (lire avant tout travail UI)
│
├── annotations/ ← Surcharges YAML par objet (descriptions, notes)
│ ├── processes.yaml
│ └── dimensions.yaml
│
├── inputs/ ← Données sources
│ ├── processes.csv ← ) Sorties de requêtes SQL sur la base Tagetik
│ ├── process_steps.csv ← ) (voir dossier queries/ pour les scripts)
│ ├── dimensions.csv ← )
│ ├── aih_dtps.csv ← )
│ ├── aih_datasets.csv ← )
│ ├── aih_process_links.csv ← ) (optionnel)
│ ├── app_setup.csv ← ) (optionnel)
│ │
│ └── raw_schema/ ← Exports directs depuis Tagetik
│ ├── configurazione.xlsx
│ ├── WORKBOOK - OWS.xlsx ← ows · ows_dtp · ows_attivita · ows_operazione
│ │ ows_operazione_parametro · ows_abbinamento_campo
│ │ ows_tabella · ows_tabella_campo · ows_tabella_tipologia
│ │ ows_metodo_speciale · ows_metodo_speciale_parametro
│ │ ows_metodo_speciale_valore
│ ├── ows_dimensione.xlsx (optionnel — dims analytiques ; séparé du workbook)
│ ├── WORKBOOK - raccolta.xlsx
│ ├── WORKBOOK - Workflow.xlsx
│ ├── WORKBOOK - ETL.xlsx
│ ├── WORKBOOK - ETL Jobs.xlsx (optionnel)
│ ├── WORKBOOK - Forms.xlsx (optionnel)
│ ├── WORKBOOK - CPM Dimension.xlsx ← (peut aussi être dans data_model/)
│ ├── WORKBOOK - FST.xlsx ← (optionnel ; peut aussi être dans data_model/)
│ └── data_model/ ← Variante de placement pour les dims CPM
│ ├── WORKBOOK - CPM Dimension.xlsx
│ └── WORKBOOK - FST.xlsx
│
│ └── backup_export/ ← (optionnel) Exports binaires Tagetik — fallback zip
│ ├── *.zip ← Un ou plusieurs zips Tagetik (.TABLE + metadata_*.txt)
│ ├── read_tagetik_export.py ← Décodeur inclus dans le projet (Base64 → valeurs Python)
│ └── .row_cache.pkl.gz ← (auto-généré) Cache des lignes décodées — économise ~90s/build
│
│ └── .ctx_cache/ ← (auto-généré) Cache de contexte par page (mode --only)
│ └── *.pkl ← Un fichier par page ; alimenté par --only, consommé par --fast
│
├── knowledge/ ← Documentation de référence Tagetik
├── queries/ ← Requêtes SQL sources (PostgreSQL / Tagetik schema)
│ ├── 02_processes.sql → inputs/processes.csv
│ ├── 03_process_steps.sql → inputs/process_steps.csv
│ └── ...
├── templates/ ← Templates Jinja2
│ ├── base.html ← Layout partagé (sidebar, topbar, dark mode, JS)
│ ├── style.css ← Design system tokens + breakpoints responsive
│ └── *.html ← ~40 pages spécialisées
└── output/ ← Généré par build.py (ne pas versionner)
├── index.html
├── style.css
├── search_index.json
├── build_manifest.json ← Présent seulement si le build est complet (crash = absent)
├── build_stats.js ← Timings + refs non résolues du dernier build (chargé par index.html)
└── *.html ← 968 pages HTML statiques
Procédure de mise à jour
- Exécuter les requêtes SQL du dossier
queries/sur la base Tagetik (PostgreSQL on-prem) - Déposer les CSV générés dans
inputs/— encodage UTF-8 ; délimiteur,ou;auto-détecté - Ré-exporter les workbooks Excel depuis Tagetik et les déposer dans
inputs/raw_schema/ - S'assurer que tous les fichiers Excel sont fermés dans Excel et que OneDrive a fini de synchroniser (sinon build.py les ignore avec un message [WARN] … is locked)
- Lancer
py build.pydepuis la racine du projet — build complet en ~50s ; pour itérer sur une seule page :py build.py --only rules.html(~8s, crée un cache de contexte dansinputs/.ctx_cache/) ; puispy build.py --fast --only rules.htmlpour re-générer cette page seule en ~1s (charge le cache, évite tout rechargement de données) - Vérifier la sortie console : elle doit se terminer par ✓ No warnings — chaque warning pointe une incohérence de données ou un fichier manquant
- Ouvrir
output/index.htmldirectement ou lancerpy serve.pypour prévisualiser viahttp://localhost:8080
Options de build.py
| Flag | Effet | Quand l'utiliser |
|---|---|---|
--only <motif> |
Ne rend que les pages dont le nom de fichier correspond au motif glob (ex.
'etl_domain_*'). Les données sont quand même entièrement chargées
(~8s) ; un cache de contexte est écrit dans inputs/.ctx_cache/<page>.pkl.
Un seul motif à la fois — | n'est pas interprété comme
alternation. |
Premier rendu d'une page après modif de template, pour amorcer le cache. |
--fast |
Charge le contexte depuis .ctx_cache/*.pkl et re-rend en ~1s, en
sautant tout le chargement de données. Nécessite un cache déjà amorcé
(par un --only ou un build complet préalable). |
Itération rapide sur le HTML/CSS d'une page déjà construite une fois. |
--clean |
Supprime les fichiers output/*.html (ou ceux qui correspondent au motif
--only) avant le build. Évite qu'un mélange d'anciennes et
de nouvelles pages laisse des liens croisés incohérents. |
Après un renommage / split de pages, ou pour purger des fichiers obsolètes. |
--serial |
Désactive les deux runners parallèles (rd_render_runner et
rd_form_parser) et force l'exécution série. Le build prend ~2× plus de
temps mais la sortie console est interleaved et le débogage plus aisé. |
Diagnostic d'un crash dans le pool parallèle, ou environnement sans multiprocessing. |
--include-standard |
Inclut les domaines / routines ETL marqués is_system=True (contenu
standard Tagetik), exclus par défaut. |
Audit exhaustif incluant le contenu livré en standard. |
Combinaisons utiles
py build.py --only rules.html— premier rendu derules.htmlseule (~265s) ; amorce.ctx_cache/rules.pkl.py build.py --fast --only rules.html— re-rendrules.htmlen ~1s depuis le cache. La combinaison d'itération par défaut.py build.py --fast --only 'dimension_*'— re-rend toutes les pages de dimension d'un coup depuis le cache (glob).py build.py --clean --only 'dimension_*'— supprime les anciennes pagesdimension_*puis les régénère (sans--fast: recharge les données). À utiliser après un split / renommage de pages de dimension.py build.py --clean— build complet propre : purge toutoutput/*.htmletinputs/.ctx_cache/*.pklpuis régénère. Le build de référence avant livraison.
Points d'attention
- Fichiers Excel verrouillés — un fichier ouvert dans Excel ou en cours de sync OneDrive est ignoré silencieusement ; la section correspondante apparaît vide dans l'output. Fermer tous les fichiers avant le build.
- Noms de feuilles — la correspondance est insensible à la casse (
MAP_IMPORTetmap_importsont équivalents) ; si une feuille est introuvable, build.py liste les feuilles disponibles dans le warning. - Encodage CSV — UTF-8 obligatoire (UTF-8-sig avec BOM accepté) ; Latin-1 / Windows-1252 provoquera des caractères corrompus dans les descriptions.
- Fichiers manquants ≠ erreur fatale — chaque section est masquée gracieusement si son fichier source est absent. Aucun fichier n'est strictement bloquant ; un warning BUILD_WARNINGS signale les sections vides.
- Placement des workbooks CPM —
WORKBOOK - CPM Dimension.xlsxetWORKBOOK - FST.xlsxpeuvent être dansraw_schema/ouraw_schema/data_model/indifféremment. - Nouvelles dimensions CPM — ajouter 3 feuilles dans le workbook :
{dim},{dim}_gerarchia,{dim}_gerarchia_abbiou{dim}_gerarchia_abbim. Pas de modification de code nécessaire. - Nouvelles dimensions Analytiques — déposer
WORKBOOK - ed_{dim}.xlsxdansinputs/raw_schema/data_model/(ouinputs/raw_schema/en nommage plated_{dim}.xlsx). Le workbook doit contenir 3 feuilles :ed_{dim},ed_{dim}_gerarchia,ed_{dim}_gerarchia_abbi(ou_abbim). La dimension est auto-détectée au build suivant, sans modification de code. Pour personnaliser le libellé affiché, ajouter"{DIM}": "Libellé"dans le dict_AIH_DIM_NAMESdebuild.py. Alternativement, si un zip dansbackup_export/contient la tableDIMENSIONE_ANALITICA, les dimensions sont auto-détectées depuis la colonneID_DIMENSIONEsans déposer de fichier Excel. - Design system lint — build.py vérifie 7 règles CSS/HTML à chaque build (tokens indéfinis, collapse-first, hex brut en inline style, table non wrappée, budget font-size inline, et — depuis la session 37 — hex codé en dur dans
style.csssans override[data-theme="dark"], qui rendrait la couleur illisible en dark mode) ; un warning de lint = régression à corriger avant livraison. - Control Groups (CONTROLLO*) — tables
CONTROLLO,CONTROLLO_CONTO_DEF,CONTROLLO_CONTO,CONTROLLO_GERARCHIA,CONTROLLO_GERARCHIA_ABBIMchargées exclusivement depuis le zipbackup_export/. La section Control Groups (sidebar Dimensions) est masquée siCONTROLLOest absent ou vide. La sous-page Grouping n'est générée que siCONTROLLO_GERARCHIAcontient au moins une hiérarchie. - prospetto_xml.csv — généré hors pipeline standard (export XML Tagetik ou requête ad-hoc) en raison de sa volumétrie ; à déposer dans
inputs/raw_schema/si disponible. Auto-chargé également depuis un zip dansbackup_export/si le CSV est absent. La section détail PROSPETTO reste masquée si ni l'un ni l'autre n'est présent. - Caches de build — deux caches auto-générés accélèrent les itérations : (1) row cache (
inputs/backup_export/.row_cache.pkl.gz) — lignes zip décodées, invalidé automatiquement quand un.zipest plus récent, économise ~90s par build complet ; (2) context cache (inputs/.ctx_cache/*.pkl) — contexte Jinja par page, alimenté par--only, consommé par--fast(~1s de re-génération). Pour forcer le recalcul d'une page : supprimer son.pkl. Pour forcer la re-lecture complète du zip : supprimer.row_cache.pkl.gz. - Zip backup export (fallback) — si un workbook ou CSV est absent, build.py cherche la table Tagetik correspondante dans tout
*.zipdéposé dansinputs/backup_export/(décodé viaread_tagetik_export.py). xlsx/csv ont toujours priorité ; le zip est le dernier recours. Ce mécanisme permet d'alimenter le build depuis un export Tagetik natif sans accès SQL direct. Plusieurs zips peuvent coexister — build.py parcourt tous dans l'ordre alphabétique et utilise le premier qui contient la table cherchée.
Annotations YAML
Emplacement
annotations/ à la racine du projetFichiers existants
processes.yaml · dimensions.yaml · aih_workspaces.yaml · aih_dtps.yaml · sql_descriptions.yaml
CléCode de l'objet Tagetik (ex. code du process, code de la dimension)
Exemple — annotations/processes.yaml
CLOSE_MONTHLY_2025: note: "Main monthly close cycle. Replaces legacy MAP_IMPORT_GL routine from v4." owner: "Group Consolidation Team" status: active # active | deprecated | under-review last_reviewed: "2026-05" tags: [critical, statutory] known_issues: "Step 3 IC elimination takes ~45min on large periods — known perf issue."
Exemple — annotations/dimensions.yaml
CONTO: note: "5,234 active accounts. ST hierarchy used for statutory reporting." owner: "Group Accounting" status: active last_reviewed: "2026-05" known_issues: "CF hierarchy has FLAG_GENERA_FLAT=0 — use recursive CTE for tree."
Fichiers sources
| Module | Fichier | Description | Requis | Feuilles / Données | Dernière modif. | Ko | Notes |
|---|---|---|---|---|---|---|---|
| — |
version.csv
|
— | optionnel | — | 2026-06-16 11:11 | 0.2 | |
| Analytical (AIH) |
WORKBOOK - OWS.xlsx
|
Toutes les tables AIH/OWS consolidées — workspaces, DTPs, activités, opérations, mappings, datasets, méthodes spéciales | optionnel | ows · ows_tabella · ows_tabella_campo · ows_tabella_tipologia · ows_dtp · ows_attivita · ows_operazione · ows_operazione_parametro · ows_abbinamento_campo · ows_metodo_speciale · ows_metodo_speciale_parametro · ows_metodo_speciale_valore | 2026-06-30 14:12 | 238.7 | Section AIH masquée si fichier absent. |
| Export |
tcpm_mdmTables__TGK_APP_02_SEBASTIEN.ROBERT_EXP_ED_30_06_2026_13_26.zip
|
Export binaire Tagetik (tables .TABLE + métadonnées) | optionnel | 39 tables | 2026-06-30 13:26 | 269.7 | SQL Server 2022 |
| Export |
tcpm_SEBASTIEN.ROBERT_EXP_TGK_APP_02_v000_39313006_1322_61334_part_1_of_1.zip
|
Export binaire Tagetik (tables .TABLE + métadonnées) | optionnel | 712 tables | 2026-06-30 13:25 | 77546.8 | SQL Server 2022 |
Entités — couleurs et classes
Process / WFM
--c-process
Workspace
--c-workspace
DTP
--c-dtp
Dataset / Entity
--c-dataset
Datasource
--c-datasource
Dimension
--c-dim
Special Method
--c-sm
Classic ETL
--c-etl
Form (PROSPETTO)
--c-form
Rule / Script
--c-rule
Codes entité en inline — classes
<code>PROCESS
WS
DTP
DATASET
DS
DIM
SM
ETL
Pills — statuts et types
Statut
actif
verrouillé
archivé
Taille XS
ok
warn
danger
neutre
Entité (SM)
special-method
etl
Typographie — classes de scale
| Classe | Rendu | Usage |
|---|---|---|
.t-label / .field-label |
LABEL UPPERCASE | En-têtes de section micro (10px majuscules, letterspacing) |
.t-meta |
Descriptions secondaires, dates, valeurs de faible importance (12px) | |
.t-micro / code.code-xs |
Micro text | Codes très compacts, badges de dimension (11px) |
.kv |
grille label · valeur | Propriétés d'un objet — container de .field-row |
.field-row |
inline label + valeur | Une ligne dans un .kv ; label à gauche, valeur à droite |
.empty-state |
composant vide | <div class="card empty-state"> — copie : "No {things} yet — drop <code>{file}</code> and rebuild." |
Tableaux et navigation
Tableau liste
<div class="table-wrap"><table class="data sortable"> — obligatoire, tri au clic, overflow horizontal
Tri par défaut
data-default-sort="asc" sur la <th> de tri initial — le premier clic sort DESC comme attendu
Filtre entonnoir
th.col-filterable + data-filter-kind="select" ou "text" — popup filtre par valeur ou saisie libre
En-tête sticky
<div class="page-sticky-header"> — enveloppe breadcrumb + page-head + sub-nav sur chaque page détail
Collapse-first
Les
.step-block démarrent fermés — pas d'attribut open ni data-default-open="true"
Dark mode
Toute couleur sémantique via
var(--c-*) — jamais de hex brut dans un attribut style=""