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