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:
245
controllers/cjxcontacts.php
Normal file
245
controllers/cjxcontacts.php
Normal file
@@ -0,0 +1,245 @@
|
||||
<?php
|
||||
//! Page des requêtes AJAX pour la gestion des contacts clients
|
||||
|
||||
global $Session;
|
||||
global $Route;
|
||||
|
||||
$fk_user = $Session->_user["rowid"];
|
||||
|
||||
switch ($Route->_action) {
|
||||
case "load_contacts":
|
||||
// Charge tous les contacts d'un client
|
||||
$data = json_decode(file_get_contents("php://input"));
|
||||
if (isset($data->fk_client)) {
|
||||
$fk_client = nettoie_input($data->fk_client);
|
||||
$fkClientSafe = intval($fk_client);
|
||||
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
$sql = 'SELECT rowid, nom, prenom, fonction, telephone, mobile, email, principal, active
|
||||
FROM clients_contacts
|
||||
WHERE fk_client = :fk_client AND active = 1
|
||||
ORDER BY principal DESC, nom, prenom';
|
||||
$contacts = $db->fetchAll($sql, [':fk_client' => $fkClientSafe]);
|
||||
echo json_encode($contacts);
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur load_contacts : " . $e->getMessage());
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Erreur lors du chargement des contacts'));
|
||||
}
|
||||
} else {
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Client non spécifié'));
|
||||
}
|
||||
break;
|
||||
|
||||
case "load_contact":
|
||||
// Charge un contact spécifique
|
||||
$data = json_decode(file_get_contents("php://input"));
|
||||
if (isset($data->rowid)) {
|
||||
$rowid = nettoie_input($data->rowid);
|
||||
$rowidSafe = intval($rowid);
|
||||
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
$sql = 'SELECT rowid, fk_client, nom, prenom, fonction, telephone, mobile, email, principal, active
|
||||
FROM clients_contacts
|
||||
WHERE rowid = :rowid';
|
||||
$contact = $db->fetchAll($sql, [':rowid' => $rowidSafe]);
|
||||
if (count($contact) == 1) {
|
||||
echo json_encode($contact[0]);
|
||||
} else {
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Contact introuvable'));
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur load_contact : " . $e->getMessage());
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Erreur lors du chargement du contact'));
|
||||
}
|
||||
} else {
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Contact non spécifié'));
|
||||
}
|
||||
break;
|
||||
|
||||
case "save_contact":
|
||||
// Crée ou met à jour un contact
|
||||
if ($_POST) {
|
||||
$rowid = nettoie_input($_POST["rowid"]);
|
||||
$fk_client = nettoie_input($_POST["fk_client"]);
|
||||
$nom = nettoie_input($_POST["nom"]);
|
||||
$prenom = nettoie_input($_POST["prenom"]);
|
||||
$fonction = nettoie_input($_POST["fonction"]);
|
||||
$telephone = formattel(nettoie_input($_POST["telephone"]));
|
||||
$mobile = formattel(nettoie_input($_POST["mobile"]));
|
||||
$email = nettoie_input($_POST["email"]);
|
||||
|
||||
$principal = 0;
|
||||
if (isset($_POST["principal"]) && $_POST["principal"] == "1") {
|
||||
$principal = 1;
|
||||
}
|
||||
|
||||
$fkClientSafe = intval($fk_client);
|
||||
$fkUserSafe = intval($fk_user);
|
||||
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
|
||||
if ($rowid == 0) {
|
||||
// Création d'un nouveau contact
|
||||
// Si ce contact est marqué comme principal, on retire le flag principal des autres contacts du client
|
||||
if ($principal == 1) {
|
||||
$sqlUpdate = 'UPDATE clients_contacts SET principal = 0 WHERE fk_client = :fk_client';
|
||||
$db->query($sqlUpdate, [':fk_client' => $fkClientSafe]);
|
||||
}
|
||||
|
||||
$data = [
|
||||
'fk_client' => $fkClientSafe,
|
||||
'nom' => $nom,
|
||||
'prenom' => $prenom,
|
||||
'fonction' => $fonction,
|
||||
'telephone' => $telephone,
|
||||
'mobile' => $mobile,
|
||||
'email' => $email,
|
||||
'principal' => $principal,
|
||||
'active' => 1,
|
||||
'date_creat' => date("Y-m-d H:i:s"),
|
||||
'fk_user_creat' => $fkUserSafe
|
||||
];
|
||||
|
||||
$newId = $db->insert('clients_contacts', $data);
|
||||
eLog("Contact créé avec l'ID : " . $newId);
|
||||
echo json_encode(array('ret' => 'ok', 'msg' => 'Contact créé avec succès', 'rowid' => $newId));
|
||||
|
||||
} else {
|
||||
// Mise à jour d'un contact existant
|
||||
$rowidSafe = intval($rowid);
|
||||
|
||||
// Si ce contact est marqué comme principal, on retire le flag principal des autres contacts du client
|
||||
if ($principal == 1) {
|
||||
$sqlUpdate = 'UPDATE clients_contacts SET principal = 0 WHERE fk_client = :fk_client AND rowid != :rowid';
|
||||
$db->query($sqlUpdate, [':fk_client' => $fkClientSafe, ':rowid' => $rowidSafe]);
|
||||
}
|
||||
|
||||
$sql = 'UPDATE clients_contacts
|
||||
SET nom = :nom, prenom = :prenom, fonction = :fonction, telephone = :telephone,
|
||||
mobile = :mobile, email = :email, principal = :principal,
|
||||
date_modif = :date_modif, fk_user_modif = :fk_user_modif
|
||||
WHERE rowid = :rowid';
|
||||
$params = [
|
||||
':nom' => $nom,
|
||||
':prenom' => $prenom,
|
||||
':fonction' => $fonction,
|
||||
':telephone' => $telephone,
|
||||
':mobile' => $mobile,
|
||||
':email' => $email,
|
||||
':principal' => $principal,
|
||||
':date_modif' => date("Y-m-d H:i:s"),
|
||||
':fk_user_modif' => $fkUserSafe,
|
||||
':rowid' => $rowidSafe
|
||||
];
|
||||
|
||||
$db->query($sql, $params);
|
||||
eLog("Contact mis à jour : " . $rowidSafe);
|
||||
echo json_encode(array('ret' => 'ok', 'msg' => 'Contact mis à jour avec succès', 'rowid' => $rowidSafe));
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur save_contact : " . $e->getMessage());
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Erreur lors de l\'enregistrement du contact'));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "delete_contact":
|
||||
// Supprime (désactive) un contact
|
||||
$data = json_decode(file_get_contents("php://input"));
|
||||
if (isset($data->rowid)) {
|
||||
$rowid = nettoie_input($data->rowid);
|
||||
$rowidSafe = intval($rowid);
|
||||
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
|
||||
// Vérifier qu'il reste au moins un autre contact actif pour ce client
|
||||
$sqlCheck = 'SELECT cc.fk_client, COUNT(*) as nb_contacts
|
||||
FROM clients_contacts cc
|
||||
WHERE cc.rowid = :rowid';
|
||||
$result = $db->fetchAll($sqlCheck, [':rowid' => $rowidSafe]);
|
||||
|
||||
if (count($result) == 1) {
|
||||
$fkClient = $result[0]['fk_client'];
|
||||
|
||||
// Compter les contacts actifs restants
|
||||
$sqlCount = 'SELECT COUNT(*) as nb FROM clients_contacts WHERE fk_client = :fk_client AND active = 1 AND rowid != :rowid';
|
||||
$countResult = $db->fetchAll($sqlCount, [':fk_client' => $fkClient, ':rowid' => $rowidSafe]);
|
||||
|
||||
if ($countResult[0]['nb'] == 0) {
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Impossible de supprimer le dernier contact actif du client'));
|
||||
} else {
|
||||
// Désactiver le contact
|
||||
$fkUserSafe = intval($fk_user);
|
||||
$sql = 'UPDATE clients_contacts
|
||||
SET active = 0, date_modif = :date_modif, fk_user_modif = :fk_user_modif
|
||||
WHERE rowid = :rowid';
|
||||
$params = [
|
||||
':date_modif' => date("Y-m-d H:i:s"),
|
||||
':fk_user_modif' => $fkUserSafe,
|
||||
':rowid' => $rowidSafe
|
||||
];
|
||||
|
||||
$db->query($sql, $params);
|
||||
eLog("Contact désactivé : " . $rowidSafe);
|
||||
echo json_encode(array('ret' => 'ok', 'msg' => 'Contact supprimé avec succès'));
|
||||
}
|
||||
} else {
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Contact introuvable'));
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur delete_contact : " . $e->getMessage());
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Erreur lors de la suppression du contact'));
|
||||
}
|
||||
} else {
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Contact non spécifié'));
|
||||
}
|
||||
break;
|
||||
|
||||
case "set_principal":
|
||||
// Définit un contact comme principal
|
||||
$data = json_decode(file_get_contents("php://input"));
|
||||
if (isset($data->rowid) && isset($data->fk_client)) {
|
||||
$rowid = nettoie_input($data->rowid);
|
||||
$fk_client = nettoie_input($data->fk_client);
|
||||
$rowidSafe = intval($rowid);
|
||||
$fkClientSafe = intval($fk_client);
|
||||
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
$fkUserSafe = intval($fk_user);
|
||||
|
||||
// Retirer le flag principal de tous les contacts du client
|
||||
$sqlReset = 'UPDATE clients_contacts SET principal = 0 WHERE fk_client = :fk_client';
|
||||
$db->query($sqlReset, [':fk_client' => $fkClientSafe]);
|
||||
|
||||
// Définir le contact comme principal
|
||||
$sql = 'UPDATE clients_contacts
|
||||
SET principal = 1, date_modif = :date_modif, fk_user_modif = :fk_user_modif
|
||||
WHERE rowid = :rowid';
|
||||
$params = [
|
||||
':date_modif' => date("Y-m-d H:i:s"),
|
||||
':fk_user_modif' => $fkUserSafe,
|
||||
':rowid' => $rowidSafe
|
||||
];
|
||||
|
||||
$db->query($sql, $params);
|
||||
eLog("Contact principal défini : " . $rowidSafe);
|
||||
echo json_encode(array('ret' => 'ok', 'msg' => 'Contact principal défini avec succès'));
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur set_principal : " . $e->getMessage());
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Erreur lors de la définition du contact principal'));
|
||||
}
|
||||
} else {
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Données manquantes'));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
echo json_encode(array('ret' => 'ko', 'msg' => 'Action inconnue'));
|
||||
break;
|
||||
}
|
||||
exit();
|
||||
Reference in New Issue
Block a user