feat: v3 — refonte thème + avancement physique + exports conformes cibles

- index.html: refonte complète thème dark gradient (top-header + slide-nav, 9 vues)
- calc.js: ajout resultatPhysique(), avancement physique partout
- routes/pilotage.js: catégories Normal/Sous Avancement/Dépassement/Non déterminé
- services/export-xlsx.js: rapport complet multi-feuilles (Situation + Pilotage)
- routes/export.js: XLSX/PPTX/DOCX — sortie unique complète Zone Sud
  - PPTX: 5 slides (couverture, synthèse, alertes, pilotage, par région)
  - DOCX: rapport structuré (couverture, KPIs, alertes, par région, pilotage)
- services/export-pdf.js: colonnes avancement physique uniquement

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Nabil Derouiche
2026-03-13 19:45:53 +01:00
co-authored by Claude Sonnet 4.6
parent 88a0dbe6d2
commit 8d901da125
14 changed files with 1911 additions and 1861 deletions
+3 -3
View File
@@ -5,7 +5,7 @@
const express = require('express');
const router = express.Router();
const { getMarches } = require('../services/baserow');
const { isCloture, normalizeMarche, parseNum } = require('../services/calc');
const { isCloture, normalizeMarche, parseNum, selectVal } = require('../services/calc');
router.get('/', async (req, res) => {
try {
@@ -14,8 +14,8 @@ router.get('/', async (req, res) => {
let rows = await getMarches();
// Uniquement non clôturés
rows = rows.filter(r => !isCloture(r));
// Uniquement en service (non clôturés, observation = "En service")
rows = rows.filter(r => !isCloture(r) && selectVal(r.observation).toLowerCase().includes('en service'));
// Filtres
if (regionFilter) rows = rows.filter(r => r.region === regionFilter);