doublon / contact

Bonjour,

Y a t il un moyen de fusionner 2 contacts qui se font doublon?

Merci,

Julien

1 « J'aime »

Bonjour,

Je suis également intéressé par la réponse à cette question.

Cordialement,

Marc

Bonjour
Non la fonctionnalité de fusion n’existe que sur la fiche tiers, pas sur les contacts. Même dans la future version 6.0 cela n’existe pas…à développer…
@+
Philippe

Bonjour,

Je réouvre ce sujet car nous observons des doublons dans nos contacts et sommes curieux de savoir comment les autres procèdent pour garder leur liste de contacts « propre ».

J’ai regardé sur le forum et les wiki (fr, en, es), mais à priori cette info n’y est pas détaillée.
Nous utilisons une v16.0.3.

Pour un même tiers, nous avons donc plusieurs contacts Dolibarr qui sont en fait une même personne.
Les principaux cas observés sont :

  • soit des coquilles dans l’email renseigné (un .fe au lieu d’un .fr),
  • soit le formatage d’une même adresse qui différe (un « Rue xxx » au lieu d’un « rue xxx »),
  • soit le formatage d’un même numéro de téléphone qui diffère (« +33 6 12 34 » vs « 06 12 34 »).

Du coup, autant pour un Tiers nous avons le bouton « FUSIONNER », autant pour un Contact nous avons seulement « MODIFIER », « DÉSACTIVER » ou « SUPPRIMER ». Quelle est selon vous la bonne manière de procéder ?

  • soit « SUPPRIMER » l’un de ces contacts (et perdre cette information dans les commandes/factures passées auxquelles il appartenait),
  • soit « DÉSACTIVER » l’un de ces contacts (avec quelles conséquences ?).

Je présents qu’il vaut mieux désactiver un contact pour le moment, en attendant une future implémentation d’une fonction de fusion des contacts. A moins que fusionner des contacts ne soit pas souhaitable pour une raison particulière.

Au passage, il y a peut-être un bogue à remonter en parallèle sur les termes utilisés par Dolibarr :

  • la fiche d’un contact (contact/card.php) utilise les boutons « DÉSACTIVER » ou « RÉACTIVER »,
  • la liste des contacts (contact/list.php) utilise un filtre sur l’État « Ouvert » ou « Clos ».

En fonction des réponses j’essaierai de compléter le wiki et renseigner le bogue sur GitHub.

1 « J'aime »

Bonjour,

J’ai fait un fichier PHP à mettre dans le répertoire /dolibarr/htdocs
Par simplicité je l’ai nommé « traitement.php » et je le lance depuis le navigateur avec l’URL

Mon fichier trouve le premier contact en doublon et affiche les valeurs de tous les champs pour le contact.
En dessous il affiche un bouton pour indiquer que c’est cette valeur qui est à garder…

Mon code ne fonctionne pas, il ne modifie pas la table ; je ne suis pas développeur et j’atteins les limites de mes compétences, donc je mets mon travail en partage et peut être que à plusieurs on va y arriver.

Voici mon fichier. Malheureusement je suis nouvel utilisateur et ne peut pas le mettre en pièce jointe. Libre à vous de vous en inspirer pour l’améliorer et si possible le recirculer ici.

<?php
// ------------------------------
// Connexion à la base de données
// ------------------------------
$pdo = new PDO('mysql:host=localhost;dbname=dolibarr', 'superuserdolibarr', 'motdepassesuperuserdolibarr');
//mettez à jour pour votre nom de table, user de maintenance base de données et mot de passe

// ------------------------------
// Récupération des enregistrements ayant le même firstname et lastname
// ------------------------------
$query = $pdo->query("
SELECT * 
FROM llx_socpeople 
WHERE (firstname, lastname) 
IN (SELECT firstname, lastname 
    FROM llx_socpeople 
    HAVING COUNT(*) > 1)
LIMIT 2;
");
$records = $query->fetchAll(PDO::FETCH_ASSOC);

// ------------------------------
// Parcours des enregistrements
// ------------------------------
foreach ($records as $record) {
echo "<tr></tr><tr> Doublon à comparer </tr>";

// ----------------------------
// style du tableau 
// ----------------------------

echo "<head>  
    <title> Doublon enregistrement </title>  
    <style>  
        table{border-collapse: collapse; width: 100%; }  
        th,td{border: 2px solid black; padding: 10px; }  
    </style>  
  </head>   
  <table><tr>
	<th>Nom du champ</th>
	<th>Valeur enregistrement du contact " . $records[0]['rowid'] ."</th>
	<th>Valeur enregistrement du contact " . $records[1]['rowid'] ."</th>
	</tr>" ;
    foreach ($record as $key => $value) {
        
	//colonne 1 : affichage du nom du champ
	echo "<tr><th rowspan=2>{$key}</th>";

        // colonne 2 - ligne 1 : affichage de la valeur pour enregistrement 1 
	echo "<td>". $records[0][$key] ." </td>";
	// colonne 2 - ligne 2 : demande de choix enregistrement 1
	echo "<td>". $records[1][$key] ." </td>";
        echo "</tr>";

        // colonne 3 - ligne 1 : affichage de la valeur pour enregistrement 2
        echo "<td><input type='radio' name='{$key}_{$record['rowid']}' value='1'>Conserver la valeur du premier enregistrement</td>";
        // colonne 3 - ligne 1 : demande de choix enregistrement 2
        echo "<td><input type='radio' name='{$key}_{$record['rowid']}' value='2'>Conserver la valeur du deuxième enregistrement</td>";
        echo "</tr>";

	// passage à ligne suivante, champ suivant
        echo "</tr>";
    }
    echo "</table>";

    // -------------------------------------	
    // Mise à jour des enregistrements
    // -------------------------------------

    foreach ($record as $key => $value) {
        $choice = $_POST[$key . '_' . $record['rowid']];
        if ($choice == 1)
        {   // Mise à jour avec la valeur du premier enregistrement
            $stmt = $pdo->prepare("UPDATE llx_socpeople SET {$key} = :value WHERE rowid = :rowid");
            $stmt->execute(array(':value' => $record[$key], ':rowid' => $record['rowid'])); 
        }
       if ($choice == 2)
       {    // Mise à jour avec la valeur du deuxième enregistrement
            $stmt = $pdo->prepare("UPDATE llx_socpeople SET {$key} = :value WHERE rowid = :rowid");
            $stmt->execute(array(':value' => $record[$key], ':rowid' => $record['rowid'] + 1));
        }
       else {
            echo "<tr>Aucun choix sélectionné.</tr>";
       }
    }
}
?>
1 « J'aime »

ce que j’ai essayé de faire, c’est d’afficher dans un tableau le premier doublon de contact trouvé.

Le tableau liste sur trois colonnes la liste des champs de la table contact, les valeurs pour le premier contact et les valeurs pour le deuxième contact, avec un bouton dans chaque case de valeur pour dire si c’est cette valeur qui est à garder.

Je ne sais pas comment ensuite passer ces choix à une requête qui actualiserai le premier contact avec les valeurs retenues et désactiverai le deuxième contact.

Toute aide serait la bienvenue ; en important mes contacts de ma messagerie et ceux de LinkedIn, j’ai beaucoup de doublons… le traitement à la main depuis l’écran de Dolibarr est long et fastidieux. Un outil aidant à automatiser une partie du travail serait très utile.

bonjour @pierrard
le principal pb que je « vois » est que au sens dolibarr il est « normal » d’avoir des doublons si on considère uniquement prénom/nom :

eric seigne est contact de cap-rel
eric seigne est contact de l’association bidule
eric seigne est également contact du club machin

mais aucun de ces eric seigne n’a la même adresse mail ou téléphone, dans le 1er cas c’est adresse et tel pro, dans les 2 autres cas c’est adresse mail perso différente (et probablement téléphone perso ou pas de tel)

… donc dans l’idée de proposer un outil qui permettrait de faire la « fusion » des contacts il faudrait aussi prendre ça en compte

1 « J'aime »

Merci Eric,

Effectivement il peut y avoir aussi plusieurs Laurent Pierrard ; j’ai cherché une fois sur LinkedIn et nous étions 3 en région parisienne…

L’idée ici n’est pas d’automatiser la fusion mais d’aider à détecter des doublons et d’offrir un outil qui donne un gain de temps pour nettoyer la donnée.

Idéalement, l’objet « contact » devrait même pouvoir être lié à plusieurs Tiers, mais cela n’est pas implémenté dans Dolibarr. Un commercial avec qui on travaille chez un sous-traitant peut changer d’entreprise et l’on peut souhaiter garder cet historique avec lui. On devrait aussi pouvoir assigner plusieurs rôles à un contact. Donc totalement d’accord, le modèle de données actuel n’est pas totalement abouti, mais pour ce qui est existant, j’essaie d’avoir un outil d’aide au nettoyage tout en gardant un contrôle humain sur le choix de désactiver un contact ou pas.

Dans mes imports de contacts de messagerie, j’aurais une adresse mail à garder,
Dans mes imports LinkedIn, j’ai peut être une autre adresse mail mais surtout un Tiers et un poste que je souhaite fusionner.

Idéalement j’aurais fait une fusion dans un tableur avant l’import mais j’ai commencé par ma base LinkedIn il y a quelques temps et j’essaie maintenant d’ajouter mes contacts prospects que j’ai en email et qui ne sont pas sur LinkedIn…

Voilà mon scénario, et aussi pourquoi mon PHP propose des boutons de choix afin de sélectionner les valeurs à garder. La désactivation du doublon resterait optionelle, au cas où, comme dans votre scénario, le deuxième contact avec nom et prénom identique soit justifié.

1 « J'aime »

J’essaye de voir si je peux vous donner un coup de pouce sur le code entre 2 dossiers …

Merci beaucoup Eric !