feat(v2.0.3): Marchés hybrides et améliorations multiples
Fonctionnalités principales : 1. Marchés hybrides - Onglet Mercurial - Ajout onglet Mercurial avec style distinct (vert, gras, blanc) - Affichage des produits mercuriaux pour marchés hybrides - Filtrage automatique des produits "Hors Marché 999" - Documentation Phase 2 avec CAS 1 et CAS 2 de marchés hybrides - Règles métier pour validation différenciée (devis 100% mercurial vs mixte) 2. Corrections bugs - Fix flag chkChange sur onglet "Sélection Produits" (callback asynchrone) - Plus d'alerte intempestive après sauvegarde des produits 3. Outils de déploiement - Nouveau script deploy-file.sh pour déploiement unitaire (DEV/PROD) - Amélioration deploy-cleo.sh 4. Gestion multi-contacts (v2.0.3) - Contrôleur AJAX cjxcontacts.php - Script migration clients_contacts - Documentation complète 5. Documentation - Mise à jour TODO.md avec Phase 2 marchés hybrides - Mise à jour README.md v2.0.3 - Ajout RULES.md - Ajout migration_clients_contacts.sql 6. Nettoyage - Suppression fichiers obsolètes (conf_new.php, conf_old.php, uof_linet_20250911.sql) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -246,11 +246,113 @@ function timeStart() {
|
||||
function timeEnd($start, $label = '') {
|
||||
$end = microtime(true);
|
||||
$time = round(($end - $start) * 1000, 2);
|
||||
|
||||
|
||||
global $Conf;
|
||||
if (isset($Conf) && $Conf->_log_performance) {
|
||||
debug("Performance [$label]: {$time}ms", 'PERFORMANCE', 3);
|
||||
}
|
||||
|
||||
|
||||
return $time;
|
||||
}
|
||||
|
||||
function loadtel($numero, $prefix = "+33") {
|
||||
$lenumero = trim($numero);
|
||||
$lenumero = preg_replace('/[^0-9]/', '', $lenumero);
|
||||
if (strlen($lenumero) == 10) {
|
||||
$lenumero = substr($lenumero, 1);
|
||||
}
|
||||
if (strlen($lenumero) == 9) {
|
||||
$lenumero = $prefix . $lenumero;
|
||||
}
|
||||
return $lenumero;
|
||||
}
|
||||
|
||||
function formattel($numero, $separateur = " ") {
|
||||
if (strlen($numero) == 9) {
|
||||
$numero = "0" . $numero;
|
||||
}
|
||||
if (strlen($numero) == 10) {
|
||||
$numero = substr($numero, 0, 2) . $separateur . substr($numero, 2, 2) . $separateur . substr($numero, 4, 2) . $separateur . substr($numero, 6, 2) . $separateur . substr($numero, 8, 2);
|
||||
}
|
||||
return $numero;
|
||||
}
|
||||
|
||||
function str_normalize($string, $minuscules = true) {
|
||||
$result = "";
|
||||
$string = trim($string);
|
||||
if (strlen($string) > 0) {
|
||||
if ($minuscules) {
|
||||
$result = strtolower($string);
|
||||
} else {
|
||||
$result = $string;
|
||||
}
|
||||
$result = str_replace(" ", "_", $result);
|
||||
$result = str_replace("é", "e", $result);
|
||||
$result = str_replace("è", "e", $result);
|
||||
$result = str_replace("ê", "e", $result);
|
||||
$result = str_replace("ë", "e", $result);
|
||||
$result = str_replace("à", "a", $result);
|
||||
$result = str_replace("â", "a", $result);
|
||||
$result = str_replace("ä", "a", $result);
|
||||
$result = str_replace("ô", "o", $result);
|
||||
$result = str_replace("ö", "o", $result);
|
||||
$result = str_replace("ù", "u", $result);
|
||||
$result = str_replace("û", "u", $result);
|
||||
$result = str_replace("ü", "u", $result);
|
||||
$result = str_replace("ç", "c", $result);
|
||||
$result = str_replace("'", "", $result);
|
||||
$result = str_replace("\"", "", $result);
|
||||
$result = str_replace("/", "", $result);
|
||||
$result = str_replace("(", "_", $result);
|
||||
$result = str_replace(")", "_", $result);
|
||||
$result = str_replace("!", "_", $result);
|
||||
$result = str_replace("?", "_", $result);
|
||||
$result = trim($result);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
function generateRandomPassword() {
|
||||
$password = '';
|
||||
$desired_length = rand(8, 12);
|
||||
|
||||
for ($length = 0; $length < $desired_length; $length++) {
|
||||
$password .= chr(rand(44, 122));
|
||||
}
|
||||
$password = str_replace("/", "&", $password);
|
||||
$password = str_replace("<", "!", $password);
|
||||
$password = str_replace(">", "!", $password);
|
||||
$password = str_replace("=", "#", $password);
|
||||
$password = str_replace("\\", "&", $password);
|
||||
$password = str_replace("^", "%", $password);
|
||||
$password = str_replace(chr(96), "#", $password);
|
||||
|
||||
return $password;
|
||||
}
|
||||
|
||||
function purge_old_logs($log_dir, $app_name, $days_to_keep = 10) {
|
||||
if (!is_dir($log_dir)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$date_limit = strtotime("-{$days_to_keep} days");
|
||||
|
||||
$patterns = array(
|
||||
$app_name . '_????-??-??.log',
|
||||
$app_name . '_debug_????-??-??.log'
|
||||
);
|
||||
|
||||
foreach ($patterns as $pattern) {
|
||||
$files = glob($log_dir . $pattern);
|
||||
if ($files) {
|
||||
foreach ($files as $file) {
|
||||
if (preg_match('/(\d{4}-\d{2}-\d{2})\.log$/', $file, $matches)) {
|
||||
$file_date = strtotime($matches[1]);
|
||||
if ($file_date < $date_limit) {
|
||||
@unlink($file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user