===== 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 ;