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
-};
-