dolibarr/htdocs/contact.class.php
Laurent Destailleur d1358b1d2c Réecriture gestion des notifications pour être gérées par un module indépendant et via le mécanisme des triggers.
Ceci afin de simplifier le code et de permettre le notifications sur n'importe quel évennement Dolibarr.
2006-08-05 16:44:43 +00:00

779 lines
23 KiB
PHP
Raw Blame History

<?php
/* Copyright (C) 2002-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
* Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005 Regis Houssin <regis.houssin@cap-networks.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Id$
* $Source$
*/
/**
\file htdocs/contact.class.php
\ingroup societe
\brief Fichier de la classe des contacts
\version $Revision$
*/
require_once (DOL_DOCUMENT_ROOT."/lib/authldap.lib.php");
/**
\class Contact
\brief Classe permettant la gestion des contacts
*/
class Contact
{
var $db;
var $error;
var $id;
var $fullname;
var $nom;
var $prenom;
var $name;
var $firstname;
var $address;
var $cp;
var $ville;
var $fk_pays;
var $code;
var $email;
var $birthday;
var $ref_facturation; // Nb de reference facture pour lequel il est contact
var $ref_contrat; // Nb de reference contrat pour lequel il est contact
var $ref_commande; // Nb de reference commande pour lequel il est contact
var $ref_propal; // Nb de reference propal pour lequel il est contact
/**
* \brief Constructeur de l'objet contact
* \param DB Habler d'acc<63>s base
* \param id Id contact
*/
function Contact($DB, $id=0)
{
$this->db = $DB;
$this->id = $id;
return 1;
}
/**
* \brief Ajout d'un contact en base
* \param user Utilisateur qui effectue l'ajout
* \return int <0 si ko, >0 si ok
*/
function create($user)
{
$this->name=trim($this->name);
if (! $this->socid)
{
$this->socid = 0;
}
$sql = "INSERT INTO ".MAIN_DB_PREFIX."socpeople (datec, fk_soc, name, fk_user)";
$sql.= " VALUES (now(),";
if ($this->socid > 0) $sql.= " $this->socid,";
else $sql.= "null,";
$sql.= "'$this->name',$user->id)";
if ($this->db->query($sql) )
{
$id = $this->db->last_insert_id(MAIN_DB_PREFIX."socpeople");
$ret=$this->update($id, $user);
if ($ret < 0)
{
$this->error=$this->db->error();
return -2;
}
return $id;
}
else
{
$this->error=$this->db->error();
return -1;
}
}
/*
* \brief Mise <20> jour des infos
* \param id id du contact <20> mettre <20> jour
* \param user Utilisateur qui effectue la mise <20> jour
* \return int <0 si erreur, >0 si ok
*/
function update($id, $user=0)
{
dolibarr_syslog("Contact::Update id=".$id,LOG_DEBUG);
$this->id = $id;
$this->name=trim($this->name);
$this->firstname=trim($this->firstname);
$this->email=trim($this->email);
$this->phone_pro=trim($this->phone_pro);
if ($this->phone_pro && $this->socid > 0)
{
$soc = new Societe($this->db);
$soc->fetch($this->socid);
$this->phone_pro = $soc->tel;
}
$sql = "UPDATE ".MAIN_DB_PREFIX."socpeople SET ";
$sql .= " civilite='".addslashes($this->civilite_id)."'";
$sql .= ", name='".addslashes($this->name)."'";
$sql .= ", firstname='".addslashes($this->firstname)."'";
$sql .= ", address='".addslashes($this->address)."'";
$sql .= ", cp='".addslashes($this->cp)."'";
$sql .= ", ville='".addslashes($this->ville)."'";
$sql .= ", fk_pays='".addslashes($this->fk_pays)."'";
$sql .= ", poste='".addslashes($this->poste)."'";
$sql .= ", fax='".addslashes($this->fax)."'";
$sql .= ", email='".addslashes($this->email)."'";
$sql .= ", note='".addslashes($this->note)."'";
$sql .= ", phone = '".addslashes($this->phone_pro)."'";
$sql .= ", phone_perso = '".addslashes($this->phone_perso)."'";
$sql .= ", phone_mobile = '".addslashes($this->phone_mobile)."'";
$sql .= ", jabberid = '".addslashes($this->jabberid)."'";
if ($user) $sql .= ", fk_user_modif=".$user->id;
$sql .= " WHERE idp=".$id;
$result = $this->db->query($sql);
if (! $result)
{
$this->error=$this->db->error();
return -1;
}
if ($conf->ldap->enabled)
{
if ($conf->global->LDAP_CONTACT_ACTIVE)
{
$this->update_ldap($user);
}
}
return 1;
}
/**
* \brief Mise <20> jour de l'arbre ldap
* \param user Utilisateur qui effectue la mise <20> jour
*
*/
function update_ldap($user)
{
$info = array();
dolibarr_syslog("Contact::update_ldap",LOG_DEBUG);
$this->fetch($this->id);
$ldap = New AuthLdap();
if ($ldap->connect())
{
if (bind())
{
if (LDAP_SERVER_TYPE == 'activedirectory') //enlever utf8 pour etre compatible Windows
{
$info["objectclass"][0] = "top";
$info["objectclass"][1] = "person";
$info["objectclass"][2] = "organizationalPerson";
//$info["objectclass"][3] = "inetOrgPerson";
$info["objectclass"][3] = "user";
$info["cn"] = $this->firstname." ".$this->name;
$info["sn"] = $this->name;
$info["givenName"] = $this->firstname;
if ($this->poste) $info["title"] = $this->poste;
if ($this->socid > 0)
{
$soc = new Societe($this->db);
$soc->fetch($this->socid);
$info["o"] = $soc->nom;
$info["company"] = $soc->nom;
if ($soc->client == 1)
{
$info["businessCategory"] = "Clients";
}
elseif ($soc->client == 2)
{
$info["businessCategory"] = "Prospects";
}
if ($soc->fournisseur == 1)
{
$info["businessCategory"] = "Fournisseurs";
}
if ($soc->ville)
{
if ($soc->adresse)
{
$info["streetAddress"] = $soc->adresse;
}
if ($soc->cp)
{
$info["postalCode"] = $soc->cp;
}
$info["l"] = $soc->ville;
}
}
if ($this->phone_pro)
$info["telephoneNumber"] = dolibarr_print_phone($this->phone_pro);
if ($this->phone_perso)
$info["homePhone"] = dolibarr_print_phone($this->phone_perso);
if ($this->phone_mobile)
$info["mobile"] = dolibarr_print_phone($this->phone_mobile);
if ($this->fax)
$info["facsimileTelephoneNumber"] = dolibarr_print_phone($this->fax);
if ($this->note)
$info["description"] = ($this->note);
if ($this->email)
$info["mail"] = $this->email;
$dn = "cn=".$info["cn"].",".LDAP_CONTACT_DN;
$r = @ldap_delete($ds, $dn);
if (! @ldap_add($ds, $dn, $info))
{
$this->error[0] = ldap_err2str(ldap_errno($ds));
}
}
else
{
$info["objectclass"][0] = "top";
$info["objectclass"][1] = "person";
$info["objectclass"][2] = "organizationalPerson";
$info["objectclass"][3] = "inetOrgPerson";
$info["cn"] = utf8_encode($this->firstname." ".$this->name);
$info["sn"] = utf8_encode($this->name);
$info["givenName"] = utf8_encode($this->firstname);
if ($this->poste)
$info["title"] = utf8_encode($this->poste);
if ($this->socid > 0)
{
$soc = new Societe($this->db);
$soc->fetch($this->socid);
$info["o"] = utf8_encode($soc->nom);
if ($soc->client == 1)
$info["businessCategory"] = utf8_encode("Clients");
elseif ($soc->client == 2)
$info["businessCategory"] = utf8_encode("Prospects");
if ($soc->fournisseur == 1)
$info["businessCategory"] = utf8_encode("Fournisseurs");
if ($soc->ville)
{
if ($soc->adresse)
$info["street"] = utf8_encode($soc->adresse);
if ($soc->cp)
$info["postalCode"] = utf8_encode($soc->cp);
$info["l"] = utf8_encode($soc->ville);
}
}
if ($this->phone_pro)
$info["telephoneNumber"] = dolibarr_print_phone($this->phone_pro);
if ($this->phone_perso)
$info["homePhone"] = dolibarr_print_phone($this->phone_perso);
if ($this->phone_mobile)
$info["mobile"] = dolibarr_print_phone($this->phone_mobile);
if ($this->fax)
$info["facsimileTelephoneNumber"] = dolibarr_print_phone($this->fax);
if ($this->note)
$info["description"] = ($this->note);
if(LDAP_SERVER_TYPE == 'egroupware')
{
$info["objectclass"][4] = "phpgwContact"; // compatibilite egroupware
if ($this->email)
$info["rfc822Mailbox"] = $this->email;
$info['uidnumber'] = $this->id;
$info['phpgwTz'] = 0;
$info['phpgwMailType'] = 'INTERNET';
$info['phpgwMailHomeType'] = 'INTERNET';
$info["uid"] = $this->id. ":".$info["sn"];
$info["phpgwContactTypeId"] = 'n';
$info["phpgwContactCatId"] = 0;
$info["phpgwContactAccess"] = "public";
if (strlen($user->egroupware_id) == 0)
{
$user->egroupware_id = 1;
}
$info["phpgwContactOwner"] = $user->egroupware_id;
if ($this->phone_mobile)
$info["phpgwCellTelephoneNumber"] = dolibarr_print_phone($this->phone_mobile);
}
else
{
if ($this->email)
$info["mail"] = $this->email;
}
$dn = "cn=".$info["cn"].",".LDAP_CONTACT_DN;
dolibarr_syslog("Contact::update_ldap dn : ".$dn,LOG_DEBUG);
$r = @ldap_delete($ds, $dn);
if (! @ldap_add($ds, $dn, $info))
{
$this->error[0] = ldap_err2str(ldap_errno($ds));
dolibarr_syslog("Contact::update_ldap error : ".$this->error[0],LOG_ERR);
}
}
}
else
{
dolibarr_syslog("Contact::update_ldap bind failed",LOG_DEBUG);
}
$ldap->unbind();
}
else
{
dolibarr_syslog("Contact::update_ldap Connexion failed",LOG_DEBUG);
echo "Impossible de se connecter au serveur LDAP !";
}
}
/*
* \brief Mise <20> jour des alertes
* \param id id du contact
* \param user Utilisateur qui demande l'alerte
*/
function update_perso($id, $user=0)
{
// Mis a jour contact
$sql = "UPDATE ".MAIN_DB_PREFIX."socpeople SET idp=$id ";
if ($this->birthday>0)
{
if (eregi('\-',$this->birthday))
{
// Si date = chaine
$sql .= ", birthday='".$this->birthday."'";
}
else
{
// Si date = timestamp
$sql .= ", birthday=".$this->db->idate($this->birthday);
}
}
$sql .= " WHERE idp=$id";
$result = $this->db->query($sql);
if (!$result)
{
$this->error='Echec sql='.$sql;
}
// Mis a jour alerte birthday
if ($this->birthday_alert)
{
$sql = "INSERT into ".MAIN_DB_PREFIX."user_alert(type,fk_contact,fk_user) ";
$sql.= "values (1,".$id.",".$user->id.")";
}
else
{
$sql = "DELETE from ".MAIN_DB_PREFIX."user_alert ";
$sql.= "where type=1 AND fk_contact=".$id." AND fk_user=".$user->id;
}
$result = $this->db->query($sql);
if (!$result)
{
$this->error='Echec sql='.$sql;
}
return $result;
}
/*
* \brief Charge l'objet contact
* \param id id du contact
* \param user Utilisateur li<6C> au contact pour une alerte
* \return int 1 si ok, -1 si erreur
*/
function fetch($id, $user=0)
{
$sql = "SELECT c.idp, c.fk_soc, c.civilite civilite_id, c.name, c.firstname,";
$sql.= " c.address, c.cp, c.ville,";
$sql.= " c.fk_pays, p.libelle as pays, p.code as pays_code,";
$sql.= " c.birthday as birthday, c.poste,";
$sql.= " c.phone, c.phone_perso, c.phone_mobile, c.fax, c.email, c.jabberid, c.note,";
$sql.= " u.rowid as user_id, u.login as user_login";
$sql.= " FROM ".MAIN_DB_PREFIX."socpeople as c";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_pays as p ON c.fk_pays = p.rowid";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON c.idp = u.fk_socpeople";
$sql.= " WHERE c.idp = ". $id;
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$obj = $this->db->fetch_object($resql);
$this->id = $obj->idp;
$this->civilite_id = $obj->civilite_id;
$this->name = $obj->name;
$this->firstname = $obj->firstname;
$this->nom = $obj->name;
$this->prenom = $obj->firstname;
$this->address = $obj->address;
$this->cp = $obj->cp;
$this->ville = $obj->ville;
$this->fk_pays = $obj->fk_pays;
$this->pays_code = $obj->fk_pays?$obj->pays_code:'';
$this->pays = $obj->fk_pays?$obj->pays:'';
$this->societeid = $obj->fk_soc;
$this->socid = $obj->fk_soc;
$this->poste = $obj->poste;
$this->fullname = $this->firstname . ' ' . $this->name;
$this->phone_pro = $obj->phone;
$this->fax = $obj->fax;
$this->phone_perso = $obj->phone_perso;
$this->phone_mobile = $obj->phone_mobile;
$this->code = $obj->code;
$this->email = $obj->email;
$this->jabberid = $obj->jabberid;
$this->mail = $obj->email;
$this->birthday = $obj->birthday;
$this->birthday_alert = $obj->birthday_alert;
$this->note = $obj->note;
$this->user_id = $obj->user_id;
$this->user_login = $obj->user_login;
}
$this->db->free($resql);
// Recherche le user Dolibarr li<6C> <20> ce contact
$sql = "SELECT u.rowid ";
$sql .= " FROM ".MAIN_DB_PREFIX."user as u";
$sql .= " WHERE u.fk_socpeople = ". $id;
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$uobj = $this->db->fetch_object($resql);
$this->user_id = $uobj->rowid;
}
$this->db->free($resql);
}
else
{
dolibarr_syslog("Error in Contact::fetch() selectuser sql=$sql");
$this->error="Error in Contact::fetch() selectuser - ".$this->db->error()." - ".$sql;
return -1;
}
// Charge alertes du user
if ($user)
{
$sql = "SELECT fk_user";
$sql .= " FROM ".MAIN_DB_PREFIX."user_alert";
$sql .= " WHERE fk_user = $user->id AND fk_contact = ".$id;
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$obj = $this->db->fetch_object($resql);
$this->birthday_alert = 1;
}
$this->db->free($resql);
}
else
{
dolibarr_syslog("Error in Contact::fetch() selectuseralert sql=$sql");
$this->error="Error in Contact::fetch() selectuseralert - ".$this->db->error()." - ".$sql;
return -1;
}
}
return 1;
}
else
{
dolibarr_syslog("Error in Contact::fetch() selectsocpeople sql=$sql");
$this->error="Error in Contact::fetch() selectsocpeople - ".$this->db->error()." - ".$sql;
return -1;
}
}
/*
* \brief Charge le nombre d'elements auquel est li<6C> ce contact
* ref_facturation
* ref_contrat
* ref_commande
* ref_propale
* \return int 0 si ok, -1 si erreur
*/
function load_ref_elements()
{
// Compte les elements pour lesquels il est contact
$sql ="SELECT tc.element, count(ec.rowid) as nb";
$sql.=" FROM ".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc";
$sql.=" WHERE ec.fk_c_type_contact = tc.rowid";
$sql.=" AND fk_socpeople = ". $this->id;
$sql.=" GROUP BY tc.element";
dolibarr_syslog("Contact::load_ref_elements sql=".$sql);
$resql=$this->db->query($sql);
if ($resql)
{
while($obj=$this->db->fetch_object($resql))
{
if ($obj->nb)
{
if ($obj->element=='facture') $this->ref_facturation = $obj->nb;
if ($obj->element=='contrat') $this->ref_contrat = $obj->nb;
if ($obj->element=='commande') $this->ref_commande = $obj->nb;
if ($obj->element=='propal') $this->ref_propal = $obj->nb;
}
}
$this->db->free($resql);
return 0;
}
else
{
$this->error=$this->db->error()." - ".$sql;
dolibarr_syslog("Contact::load_ref_elements Error ".$this->error);
return -1;
}
}
/*
* \brief Efface le contact de la base et <20>ventuellement de l'annuaire LDAP
* \param id id du contact a effacer
*/
function delete($id)
{
$sql = "SELECT c.name, c.firstname FROM ".MAIN_DB_PREFIX."socpeople as c";
$sql .= " WHERE c.idp = ". $id;
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$obj = $this->db->fetch_object($resql);
$this->old_name = $obj->name;
$this->old_firstname = $obj->firstname;
}
}
$sql = "DELETE FROM ".MAIN_DB_PREFIX."socpeople";
$sql .= " WHERE idp=$id";
$result = $this->db->query($sql);
if (!$result)
{
print $this->db->error() . '<br>' . $sql;
}
if (defined('MAIN_MODULE_LDAP') && MAIN_MODULE_LDAP)
{
if (defined('LDAP_CONTACT_ACTIVE') && LDAP_CONTACT_ACTIVE == 1)
{
$ldap = New AuthLdap();
if ($ldap->connect())
{
if ($ldap->bind())
{
// delete from ldap directory
if (LDAP_SERVER_TYPE == 'activedirectory')
{
$userdn = $this->old_firstname." ".$this->old_name; //enlever utf8 pour etre compatible Windows
}
else
{
$userdn = utf8_encode($this->old_firstname." ".$this->old_name);
}
$dn = "cn=".$userdn.",".LDAP_CONTACT_DN;
$r = @ldap_delete($ds, $dn);
}
else
{
echo "LDAP bind failed...";
}
$ldap->close();
}
else
{
echo "Unable to connect to LDAP server";
}
return $result;
}
}
}
/*
* \brief Charge les informations sur le contact, depuis la base
* \param id id du contact <20> charger
*/
function info($id)
{
$sql = "SELECT c.idp, ".$this->db->pdate("datec")." as datec, fk_user";
$sql .= ", ".$this->db->pdate("tms")." as tms, fk_user_modif";
$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c";
$sql .= " WHERE c.idp = $id";
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$obj = $this->db->fetch_object($resql);
$this->id = $obj->idp;
if ($obj->fk_user) {
$cuser = new User($this->db, $obj->fk_user);
$cuser->fetch();
$this->user_creation = $cuser;
}
if ($obj->fk_user_modif) {
$muser = new User($this->db, $obj->fk_user_modif);
$muser->fetch();
$this->user_modification = $muser;
}
$this->date_creation = $obj->datec;
$this->date_modification = $obj->tms;
}
$this->db->free($resql);
}
else
{
print $this->db->error();
}
}
/*
* \brief Renvoi nombre d'emailings re<72>u par le contact avec son email
* \return int Nombre d'emailings
*/
function getNbOfEMailings()
{
$sql = "SELECT count(mc.email) as nb";
$sql.= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc";
$sql.= " WHERE mc.email = '".addslashes($this->email)."'";
$sql.= " AND mc.statut=1"; // -1 erreur, 0 non envoy<6F>, 1 envoy<6F> avec succ<63>s
$resql=$this->db->query($sql);
if ($resql)
{
$obj = $this->db->fetch_object($resql);
$nb=$obj->nb;
$this->db->free($resql);
return $nb;
}
else
{
$this->error=$this->db->error();
return -1;
}
}
/**
* \brief Renvoie nom clicable (avec eventuellement le picto)
* \param withpicto Inclut le picto dans le lien
* \param option Sur quoi pointe le lien
* \return string Chaine avec URL
*/
function getNomUrl($withpicto=0,$option='')
{
global $langs;
$result='';
$lien = '<a href="'.DOL_URL_ROOT.'/contact/fiche.php?id='.$this->id.'">';
$lienfin='</a>';
if ($option == 'xxx')
{
$lien = '<a href="'.DOL_URL_ROOT.'/contact/fiche.php?id='.$this->id.'">';
$lienfin='</a>';
}
if ($withpicto) $result.=($lien.img_object($langs->trans("ShowContact"),'contact').$lienfin.' ');
$result.=$lien.$this->name.' '.$this->firstname.$lienfin;
return $result;
}
}
?>