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:
@@ -211,9 +211,7 @@ switch ($Route->_action) {
|
||||
$db = Database::getInstance();
|
||||
// SÉCURITÉ : Utilisation de requête préparée pour l'ID
|
||||
$sql = "SELECT `$chp` AS data FROM clients WHERE rowid = :id";
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute([':id' => intval($fk_tiers)]);
|
||||
$result = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$result = $db->fetchOne($sql, [':id' => intval($fk_tiers)]);
|
||||
if ($result) {
|
||||
$upls = $result;
|
||||
}
|
||||
@@ -290,12 +288,8 @@ switch ($Route->_action) {
|
||||
OR c.email LIKE :search
|
||||
ORDER BY c.libelle';
|
||||
|
||||
$stmt = $db->prepare($sql);
|
||||
$searchParam = '%' . $search . '%';
|
||||
$stmt->bindParam(':search', $searchParam, PDO::PARAM_STR);
|
||||
$stmt->execute();
|
||||
|
||||
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$results = $db->fetchAll($sql, [':search' => $searchParam]);
|
||||
echo json_encode($results);
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur search_clients : " . $e->getMessage());
|
||||
@@ -522,16 +516,13 @@ switch ($Route->_action) {
|
||||
|
||||
// Utilisation de requêtes préparées pour la suppression
|
||||
$sql1 = 'DELETE FROM marches WHERE rowid = :id';
|
||||
$stmt1 = $db->prepare($sql1);
|
||||
$stmt1->execute(['id' => $cid]);
|
||||
$db->query($sql1, ['id' => $cid]);
|
||||
|
||||
$sql2 = 'DELETE FROM marches_listes WHERE fk_marche = :id';
|
||||
$stmt2 = $db->prepare($sql2);
|
||||
$stmt2->execute(['id' => $cid]);
|
||||
$db->query($sql2, ['id' => $cid]);
|
||||
|
||||
$sql3 = 'DELETE FROM produits WHERE fk_marche = :id';
|
||||
$stmt3 = $db->prepare($sql3);
|
||||
$stmt3->execute(['id' => $cid]);
|
||||
$db->query($sql3, ['id' => $cid]);
|
||||
|
||||
eLog("Marché supprimé : ID=$cid");
|
||||
$ret = array('ret' => "ok", 'msg' => 'Marché supprimé');
|
||||
@@ -785,9 +776,7 @@ switch ($Route->_action) {
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
$sql = 'SELECT c.code, c.libelle, c.adresse1, c.adresse2 FROM clients c WHERE c.rowid = :id';
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute([':id' => intval($devis["fk_client"])]);
|
||||
$client = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$client = $db->fetchOne($sql, [':id' => intval($devis["fk_client"])]);
|
||||
if (!$client) {
|
||||
$client = ['code' => '', 'libelle' => '', 'adresse1' => '', 'adresse2' => ''];
|
||||
}
|
||||
@@ -884,8 +873,8 @@ switch ($Route->_action) {
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
$sql = 'DELETE FROM infos WHERE rowid = :id';
|
||||
$stmt = $db->prepare($sql);
|
||||
$result = $stmt->execute(['id' => $cid]);
|
||||
$stmt = $db->query($sql, ['id' => $cid]);
|
||||
$result = $stmt->rowCount() > 0;
|
||||
|
||||
if ($result) {
|
||||
eLog("Info supprimée : ID=$cid");
|
||||
|
||||
Reference in New Issue
Block a user