Initial commit - Application CLEO de gestion de devis

- Architecture MVC avec framework maison d6
- Modules : devis, clients, marchés, SAP
- Documentation initiale (README et TODO)
- Configuration Composer avec dépendances

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-11 18:26:07 +02:00
commit 046c23f2d2
2378 changed files with 163904 additions and 0 deletions

114
pub/res/js/jglobal.js Normal file
View File

@@ -0,0 +1,114 @@
//! Librairie JS Globale
//! D6SOFT
function showModal(idModalElement) {
idModalElement.style.display = "block"
idModalElement.className += "show"
}
function hideModal(idModalElement) {
idModalElement.style.display = "none"
idModalElement.className += idModalElement.className.replace("show", "")
}
function showNotification(leTitre, leMessage, leTheme = "info", laPosition = "nfc-bottom-right") {
window.createNotification({
theme: leTheme, // success, info, warning, error, and none
positionClass: laPosition, // nfc-top-left, nfc-bottom-right, nfc-bottom-left, nfc-top-right
})({
title: leTitre,
message: leMessage
});
}
//! Gestion de l'animation de chargement lors de requêtes AJAX
const loader = document.querySelector("#loadingDiv");
function showLoading() {
loader.classList.add("display");
}
function hideLoading() {
loader.classList.remove("display");
}
function convertMySQLDateToFrenchDate(mysqlDate) {
const date = new Date(mysqlDate); // créer un objet Date à partir de la date MySQL
let day = date.getDate(); // extraire le jour du mois
if (day < 10) {
day = '0' + day; // ajouter un zéro devant si le jour est inférieur à 10
}
let month = date.getMonth() + 1; // extraire le mois (ajouter 1 car les mois commencent à 0)
if (month < 10) {
month = '0' + month; // ajouter un zéro devant si le mois est inférieur à 10
}
const year = date.getFullYear(); // extraire l'année
return day + '/' + month + '/' + year; // retourner la date au format français
}
function convertFrenchDateToMySQLDate(frenchDate) {
var parts = frenchDate.split('/'); // séparer la date en jour, mois et année
var date = new Date(parts[2], parts[1] - 1, parts[0]); // créer un objet Date à partir de la date française
return date.toISOString().slice(0, 19).replace('T', ' '); // retourner la date au format MySQL
}
function controlFrenchDate(laDateSaisie) {
const reg = new RegExp("^[0-9]{2}/[0-9]{2}/[0-9]{4}$");
if (reg.test(laDateSaisie)) {
// Convertir la chaîne de caractères en un objet Date
const parts = laDateSaisie.split('/');
const laDate = new Date(parts[2], parts[1] - 1, parts[0]);
if (laDate instanceof Date && !isNaN(laDate)) {
// la date est correcte, on la formate en JJ/MM/AAAA
const formattedDate = ('0' + laDate.getDate()).slice(-2) + '/' + ('0' + (laDate.getMonth() + 1)).slice(-2) + '/' + laDate.getFullYear();
return formattedDate;
} else {
return false;
}
} else {
return false;
}
}
function isDateValid(inputDate) {
const dateObj = new Date(inputDate);
return !isNaN(dateObj.getTime());
}
function parseFloatFromPercentageString(str) {
// Supprimer les espaces en début et fin de chaîne
str = str.trim();
// Supprimer le caractère de pourcentage en fin de chaîne
str = str.replace(/%$/, '');
// Convertir la chaîne en nombre float
var value = parseFloat(str);
return value;
}
//! Affiche un montant avec 2 décimales et un séparateur de milliers
function formatAmount(amount) {
const amountNumber = parseFloat(amount);
const amountFormat = amountNumber.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, " ");
return amountFormat;
}
//! affiche un effet blink sur les inputs qui ont atteint leur maxLength (seulement pour ceux qui on un attribut maxlength)
const inputs = document.querySelectorAll("input[type='text'][maxlength], input[type='number'][maxlength]");
inputs.forEach((input) => {
const maxLength = input.maxLength;
input.addEventListener("input", function () {
if (input.value.length >= maxLength) {
input.classList.add("blink-input");
setTimeout(() => input.classList.remove("blink-input"), 800);
}
});
});
//! lit les données d'un cookie ($_SESSION) et les retourne sous forme d'objet
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}