diff --git a/ecole/src/app.js b/ecole/src/app.js index f1733da4..40da0a56 100644 --- a/ecole/src/app.js +++ b/ecole/src/app.js @@ -15,7 +15,6 @@ const routes = require('./routes'); const app = express(); // Configuration du moteur de rendu HTML avec EJS -app.set('views', path.join(process.cwd(), 'views')); app.set('view engine', 'ejs'); app.engine('ejs', require('ejs').__express); diff --git a/ecole/src/controllers/historiqueParcoursController.js b/ecole/src/controllers/historiqueParcoursController.js index aa65a926..65def7dc 100644 --- a/ecole/src/controllers/historiqueParcoursController.js +++ b/ecole/src/controllers/historiqueParcoursController.js @@ -5,8 +5,7 @@ const renderPage = require("../utils/renderHelper"); const logger = require("../utils/logger"); const parcoursService = require("../services/parcoursService"); const clientService = require("../services/clientService"); -const { fmtDateFR } = require("../utils/dateHelper"); -const { xmlEsc, cellXml, rowXml } = require("../utils/xmlHelper"); +const { fmtDateFR, xmlEsc, cellXml, rowXml } = require("../services/globalService"); /** * Construit les filtres et le tri PocketBase à partir des paramètres DataTables diff --git a/ecole/src/db/pb_data/logs.db-wal b/ecole/src/db/pb_data/logs.db-wal index 703b1724..deb3c7be 100644 Binary files a/ecole/src/db/pb_data/logs.db-wal and b/ecole/src/db/pb_data/logs.db-wal differ diff --git a/ecole/src/services/globalService.js b/ecole/src/services/globalService.js index 5c0481fb..2ef716e1 100644 --- a/ecole/src/services/globalService.js +++ b/ecole/src/services/globalService.js @@ -76,10 +76,71 @@ function cleanDoubleSpaces(inputString) { return inputString.replace(/\s{2,}/g, " "); } +/** + * Formate une date ISO en format français (jj/mm/aaaa) + * @param {string|Date} iso - Date au format ISO + * @param {boolean} withTime - Inclure l'heure (défaut: false) + * @returns {string} Date formatée (dd/mm/yyyy ou dd/mm/yyyy hh:mm) + */ +function fmtDateFR(iso, withTime = false) { + if (!iso) return "NC"; + + const d = new Date(iso); + if (isNaN(d.getTime())) return "NC"; + + const dd = String(d.getDate()).padStart(2, "0"); + const mm = String(d.getMonth() + 1).padStart(2, "0"); + const yyyy = d.getFullYear(); + + if (!withTime) { + return `${dd}/${mm}/${yyyy}`; + } + + const hh = String(d.getHours()).padStart(2, "0"); + const mi = String(d.getMinutes()).padStart(2, "0"); + return `${dd}/${mm}/${yyyy} ${hh}:${mi}`; +} + +/** + * Échappe les caractères spéciaux XML + * @param {string} s - Chaîne à échapper + * @returns {string} Chaîne échappée + */ +function xmlEsc(s) { + return String(s ?? "") + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + +/** + * Génère une cellule XML pour Excel + * @param {string} v - Valeur de la cellule + * @returns {string} Cellule XML formatée + */ +function cellXml(v) { + return `${xmlEsc(v)}`; +} + +/** + * Génère une ligne XML pour Excel + * @param {Array} cells - Tableau de valeurs pour les cellules + * @returns {string} Ligne XML formatée + */ +function rowXml(cells) { + return `${cells.map(cellXml).join("")}`; +} + module.exports = { getRecordIdFromFieldValue, fetchInfoByCriteria, updateRecordFromData, cleanDoubleSpaces, customFormatNumber, + fmtDateFR, + xmlEsc, + cellXml, + rowXml, }; diff --git a/ecole/src/utils/dateHelper.js b/ecole/src/utils/dateHelper.js deleted file mode 100644 index 1c04f2b1..00000000 --- a/ecole/src/utils/dateHelper.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Utilitaires de formatage de dates côté serveur - */ - -/** - * Formate une date ISO en format français (jj/mm/aaaa) - * @param {string|Date} iso - Date au format ISO - * @param {boolean} withTime - Inclure l'heure (défaut: false pour compatibilité avec fmtFR) - * @returns {string} Date formatée (dd/mm/yyyy ou dd/mm/yyyy hh:mm) - */ -function fmtDateFR(iso, withTime = false) { - if (!iso) return "NC"; - - const d = new Date(iso); - if (isNaN(d.getTime())) return "NC"; - - const dd = String(d.getDate()).padStart(2, "0"); - const mm = String(d.getMonth() + 1).padStart(2, "0"); - const yyyy = d.getFullYear(); - - if (!withTime) { - return `${dd}/${mm}/${yyyy}`; - } - - const hh = String(d.getHours()).padStart(2, "0"); - const mi = String(d.getMinutes()).padStart(2, "0"); - return `${dd}/${mm}/${yyyy} ${hh}:${mi}`; -} - -module.exports = { - fmtDateFR -}; - diff --git a/ecole/src/utils/renderHelper.js b/ecole/src/utils/renderHelper.js index 89c9598e..b9c6fdc6 100644 --- a/ecole/src/utils/renderHelper.js +++ b/ecole/src/utils/renderHelper.js @@ -1,6 +1,13 @@ const ejs = require('ejs'); const path = require('path'); +/** + * Rend une page EJS + * @param {string} routePath - Chemin vers le fichier EJS + * @param {Object} res - Objet response Express + * @param {Object} options - Options à passer au template + * @param {boolean} fragment - Si true, envoie uniquement le fragment sans layout + */ function renderPage(routePath, res, options = {}, fragment = false) { ejs.renderFile(path.join(process.cwd(), 'views', routePath), options, (err, str) => { if (err) { diff --git a/ecole/src/utils/xmlHelper.js b/ecole/src/utils/xmlHelper.js deleted file mode 100644 index c218872b..00000000 --- a/ecole/src/utils/xmlHelper.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Utilitaires pour la génération de fichiers XML (format Excel SpreadsheetML) - */ - -/** - * Échappe les caractères spéciaux XML - * @param {string} s - Chaîne à échapper - * @returns {string} Chaîne échappée - */ -function xmlEsc(s) { - return String(s ?? "") - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -} - -/** - * Génère une cellule XML pour Excel - * @param {string} v - Valeur de la cellule - * @returns {string} Cellule XML formatée - */ -function cellXml(v) { - return `${xmlEsc(v)}`; -} - -/** - * Génère une ligne XML pour Excel - * @param {Array} cells - Tableau de valeurs pour les cellules - * @returns {string} Ligne XML formatée - */ -function rowXml(cells) { - return `${cells.map(cellXml).join("")}`; -} - -module.exports = { - xmlEsc, - cellXml, - rowXml -}; -