Atmail

Afin de parer au plus pressé et pour permettre la mise à jour des contacts, j'ai du modifié la structure du champ DateModified de la table Abook, voici la requete de modification:

ALTER TABLE `Abook` CHANGE `DateModified` `DateModified` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL 

Insertion d'un contact

INSERT INTO Abook (UserHomePhone, UserHomeMobile, UserHomeFax, UserWorkPhone, UserWorkMobile, UserWorkFax, UserEmail, UserEmail2, UserEmail3, UserEmail4, UserEmail5, UserFirstName, UserLastName, UserMiddleName, UserHomeAddress, UserHomeCity, UserHomeState, UserHomeZip, UserHomeCountry, UserWorkAddress, UserWorkCity, UserWorkState, UserWorkZip, UserWorkCountry, UserInfo, UserTitle, UserGender, UserDOB, UserURL, UserWorkCompany, UserWorkTitle, UserWorkDept, SIP, Shared, Account, DateAdded, DateModified) 
VALUES (//, //, //, '09 80 50 50 50', '06 00 00 00 00', //, 'f.laborde@aditu.fr', //, //, //, //, 'Franck', 'Laborde', //, //, //, //, //, //, 'Pavillon d'Izarbel - Terrasses Claude Shannon - Technopole Izarbel Côte Basque -', 'Bidart', //, '64210', 'France', //, //, //, 'DATE de naissance', 'http://www.aditu.fr', 'Aditu', 'Administrateur systèmes & réseaux', 'Exploitation', //, '0', 'b.perrin@hodei.net', NOW(), '41619.866250')

Partage du contact avec tous les utilisateurs du domaine

UPDATE Abook 
SET 
UserHomePhone = //, 
UserHomeMobile = //, 
UserHomeFax = //, 
UserWorkPhone = '09 80 50 50 50', 
UserWorkMobile = '06 00 00 00 00', 
UserWorkFax = //, 
UserEmail = 'f.laborde@aditu.fr', 
UserEmail2 = //, 
UserEmail3 = //, 
UserEmail4 = //, 
UserEmail5 = //, 
UserFirstName = 'Franck', 
UserLastName = 'Laborde', 
UserMiddleName = //, 
UserHomeAddress = //, 
UserHomeCity = //, 
UserHomeState = //, 
UserHomeZip = //, 
UserHomeCountry = //, 
UserWorkAddress = 'Pavillon d''Izarbel - Terrasses Claude Shannon - Technopole Izarbel Côte Basque -', 
UserWorkCity = 'Bidart', 
UserWorkState = //, 
UserWorkZip = '64210', 
UserWorkCountry = 'France', 
UserInfo = //, 
UserTitle = //, 
UserGender = //, 
UserDOB = NULL, 
UserURL = 'http://www.aditu.fr', 
UserWorkCompany = 'Aditu', 
UserWorkTitle = 'Administrateur systèmes & réseaux', 
UserWorkDept = 'Exploitation', 
SIP = //, 
Shared = '1', 
DateModified = '41619.873831' 
WHERE (id = 7)
 DELETE FROM `AbookPermissions` WHERE (AbookID = 7)
 INSERT INTO `AbookPermissions` (`Account`, `Permissions`, `AbookID`) VALUES ('f.milhau@hodei.net', '1', '7')
 INSERT INTO `AbookPermissions` (`Account`, `Permissions`, `AbookID`) VALUES ('f.patissier@hodei.net', '1', '7')
 INSERT INTO `AbookPermissions` (`Account`, `Permissions`, `AbookID`) VALUES ('b.perrin@hodei.net', '1', '7')
 INSERT INTO `AbookPermissions` (`Account`, `Permissions`, `AbookID`) VALUES ('b.perrin@hodei.net', '1', '7')

Dolibarr

Création d'un contact partagé

 INSERT INTO erp_socpeople ( datec, fk_soc, lastname, firstname, fk_user_creat, priv, canvas, entity, import_key) 
 VALUES ('20131203233615',NULL,'Perrin','Benjamin', '1', 0, NULL, 1, NULL)
UPDATE erp_socpeople 
SET  
fk_soc=NULL,  
civilite='MR', 
lastname='Perrin', 
firstname='Benjamin', 
address='22 avenue verdun', 
zip='92300', 
town='Courbevoie', 
fk_pays=1, 
fk_departement=NULL, 
poste='Admin sys', 
fax='0122334455', 
email='b.perrin@hodei.net', 
note_private = //, 
note_public = //, 
phone = '0199887766', 
phone_perso = '0134970404', 
phone_mobile = '0624632069', 
jabberid = //, 
priv = '0', 
fk_user_modif='1', 
default_lang=NULL, 
no_email=0 
WHERE rowid=2

Synchronisation Dolibarr/Contact vers Atmail

  • La synchronisation d'un contact, se fait en deux étapes du fait que Dolibarr effectue consécutivement un INSERT et un UPDATE pour la création d'un contact.
  • Le champ atmail.Abook.DateModified dans la base de données, a été détourné de son usage d'origine pour dorénavant stocker l'ID du contact Dolibarr et permettre sa mise à jour.
  • Il n'est pas possible de supprimer/modifier le contact depuis ATmail, le contact créé est associé à un compte inexistant.
  • La fonction de suppression des contacts doit être désactivé dans Dolibarr.

Trigger MYSQL lors d'un INSERT dans Dolibarr: erpINSabook

  • Lors de la détection de l'insertion, on vérifie si le contact est privé (socpeople.priv='1'), dans ce cas il ne se passe rien.
  • Dans le cas contraire on récupère le login de l'utilisateur dolibarr grace au champ fk_user_create.
  • Avec le login dolibarr on récupère le login Atmail de l'utilisateur (s'ils sont différent la procédure échoue)
  • On crée le contact dans atmail avec les informations suivantes:
    • Nom,
    • prénom,
    • partagé,
    • le propriétaire (login),
    • date de création,
    • on stock l'id du contact dolibarr dans le champ 'DateModified' (A noté que le champ 'DateModified' de Atmail.Abook a été détourné de son usage principal, il stock dorénavant l'id dolibarr du contact (nécessaire pour garantir les UPDATE)).
DELIMITER ;
 DROP TRIGGER erpINSabook;
 DELIMITER //
 CREATE TRIGGER erpINSabook AFTER INSERT ON llx_socpeople
 FOR EACH ROW BEGIN
   DECLARE Share INT(1);
   DECLARE LoginErp VARCHAR(255);
   DECLARE Owner VARCHAR(255);
   IF(NEW.priv=1)THEN
      SET Share = 0;
   ELSE
      SET LoginErp = (SELECT login FROM llx_user WHERE rowid = NEW.fk_user_creat);
      SET Owner = (SELECT Account FROM atmail.Users WHERE Account = LoginErp); 
      SET Share = 1;
      INSERT INTO atmail.Abook (UserLastName,UserFirstName, Shared, Account, DateAdded, DateModified) VALUES (NEW.lastname, NEW.firstname, Share, Owner, NOW(), NEW.rowid);
   END IF;
 END//
 DELIMITER ;

Trigger MYSQL avant un UPDATE dans contact Dolibarr: before_update_socpeople

  • On verifie si le contact est partagé et si il existe dans atmail
  • Si il est partagé et qu'il n'existe pas dans atmail on le créé.
 DELIMITER ;
 DROP TRIGGER before_update_socpeople;
 DELIMITER //
 CREATE TRIGGER before_update_socpeople BEFORE UPDATE ON llx_socpeople
 FOR EACH ROW BEGIN
  DECLARE LoginErp VARCHAR(255);
  DECLARE Owner VARCHAR(255);
  DECLARE DOMAIN VARCHAR(255);
  DECLARE DefAccount VARCHAR(255);
  DECLARE UidGen VARCHAR(50);
  DECLARE IdContact INT;
  SET LoginErp = (SELECT login FROM llx_user WHERE rowid = NEW.fk_user_modif);
  SET Owner = (SELECT Account FROM atmail.Users WHERE Account = LoginErp);
  SET DOMAIN = (SELECT SUBSTRING_INDEX(Owner, '@', -1));
  SET DefAccount = CONCAT('hodei-erp','@',DOMAIN);
  SET UidGen = (SELECT MD5(CONCAT(OLD.rowid,(SELECT unix_timestamp(OLD.datec)-3600),DefAccount)));
  SET IdContact = (SELECT id FROM atmail.Abook WHERE DateModified=UidGen);
  IF(IdContact IS NULL AND NEW.priv = 0)THEN
       INSERT INTO atmail.Abook (UserLastName,UserFirstName, Shared, Account, DateAdded, DateModified) VALUES (NEW.lastname, NEW.firstname, '0', Owner, NOW(), UidGen);
     END IF;
   END IF;
 END//
 DELIMITER ;

Trigger MYSQL après un UPDATE dans contact Dolibarr: after_update_socpeople

  • generateur d'id FIXME
  • Lors de l'update de Dolibarr, on vérifie que le contact est bien partagé (socpeople.priv='0').
  • On récupère le nom du pays et de la société si ils sont spécifié dans dolibarr
  • On met à jour le contact ATmail avec les informations dolibarr et on attribue le contact ATmail à un utilisateur type: erp-$client@$client.tld
  • On sélectionne tous les utilisateurs ATmail qui appartiennent au domaine de l'utilisateur qui vient de modifier le compte.
  • On supprime toutes les permissions sur le contact en question
  • On insert les utilisateurs du domaine dans la table des permissions du carnet d'adresse de ATMAIL
 DELIMITER ;
 DROP TRIGGER after_update_socpeople;
 DELIMITER //
 CREATE TRIGGER after_update_socpeople AFTER UPDATE ON llx_socpeople
 FOR EACH ROW BEGIN
  DECLARE Share INT(1);
  DECLARE LoginErp VARCHAR(255);
  DECLARE Owner VARCHAR(255);
  DECLARE DOMAIN VARCHAR(255);
  DECLARE done INT DEFAULT 0;
  DECLARE Country VARCHAR(255);
  DECLARE Company VARCHAR(255);
  DECLARE IdContact INT;
  DECLARE Ac1 VARCHAR(255);
  DECLARE CheckContact INT;
  DECLARE DefAccount VARCHAR(255);
  DECLARE UidGen VARCHAR(50);
  DECLARE ShareUsers CURSOR FOR SELECT Account FROM atmail.Users WHERE Account LIKE (CONCAT('%@',DOMAIN));
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  IF(NEW.priv=1)THEN
     SET Share = 0;
  ELSE
    SET LoginErp = (SELECT login FROM llx_user WHERE rowid = NEW.fk_user_modif);
    SET Owner = (SELECT Account FROM atmail.Users WHERE Account = LoginErp);
    SET DOMAIN = (SELECT SUBSTRING_INDEX(Owner, '@', -1));
    SET DefAccount = CONCAT('hodei-erp','@',DOMAIN);
    SET UidGen = (SELECT MD5(CONCAT(OLD.rowid,unix_timestamp(OLD.datec)-3600,DefAccount)));
    SET IdContact = (SELECT id FROM atmail.Abook WHERE DateModified=UidGen);
    IF(NEW.fk_soc > 0)THEN
      SET Company = (SELECT nom FROM llx_societe WHERE rowid = NEW.fk_soc);
    END IF;
    IF (NEW.fk_pays > 0)THEN
      SET Country = (SELECT libelle FROM llx_c_pays WHERE rowid = NEW.fk_pays);
    END IF;
    UPDATE atmail.Abook 
    SET 
    UserEmail=NEW.email,
    UserFirstName=NEW.firstname,
    UserLastName=NEW.lastname,
    UserTitle=NEW.civilite,
    UserDOB=NULL,
    UserHomePhone=NEW.phone_perso,
    UserWorkCompany=Company,
    UserWorkTitle=NEW.poste,
    UserWorkOffice=NULL,
    UserWorkAddress=NEW.address,
    UserWorkCity=NEW.town,
    UserWorkZip=NEW.zip,
    UserWorkCountry=Country,
    UserWorkPhone=NEW.phone,
    UserWorkMobile=NEW.phone_mobile,
    UserWorkFax=NEW.fax,
    UserType=NULL,Shared='1',
    Account=DefAccount 
    WHERE DateModified = UidGen;
    DELETE FROM atmail.AbookPermissions WHERE AbookID = IdContact;
    OPEN ShareUsers; REPEAT
      FETCH ShareUsers INTO Ac1;
        INSERT INTO atmail.AbookPermissions (AbookID, Account, Permissions) VALUES(IdContact, Ac1, '1' );
      UNTIL done END REPEAT;
    CLOSE ShareUsers;
  END IF;
 END//
 DELIMITER ;

Navigation

QR Code
QR Code systeme_informatique:atmail:synchro_dolibarr_contact (generated for current page)