123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- <?php
- /**
- * Define a person contact.
- * @author Valentin carrueso
- * @category Plugin
- * @license MIT
- */
- class ContactPerson extends Entity{
- public $id;
- public $name; //Nom (Texte)
- public $firstname; //Prénom (Texte)
- public $job; //Fonction (Texte)
- public $account; //Compte lié (uniqment si référent interne)
- public $civility; //Civilité (Texte)
- public $state; //Etat (Texte)
- public $type; //Type (Texte)
- public $phone; //Téléphone (Texte)
- public $mobile; //Téléphone Mobile (Texte)
- public $mail; //E-mail (Texte)
- public $scope; //Scope (Texte)
- public $comment; //Commentaire (Texte long)
- public $uid; //UID (Entier)
- public $meta = array();
- public $tag; //Etiquettes (Etiquettes)
- const TYPE_EXTERNAL = "external";
- const TYPE_CLIENT = "client";
- const TYPE_USER = "user";
- public $entityLabel = 'Contact';
- protected $TABLE_NAME = 'contact_person';
- public $fields = array(
- 'id' => array('type'=>'key', 'label' => 'Identifiant'),
- 'name' => array('type'=>'text', 'label' => 'Nom'),
- 'firstname' => array('type'=>'text', 'label' => 'Prénom'),
- 'job' => array('type'=>'text', 'label' => 'Métier/Fonction'),
- 'account' => array('label'=>'Compte utilisateur lié','type'=>'user'),
- 'civility' => array('type'=>'list', 'label' => 'Civilité'),
- 'state' => array('type'=>'text', 'label' => 'Etat'),
- 'type' => array('type'=>'text', 'label' => 'Type'),
- //'phone' => array('type'=>'phone', 'label' => 'Téléphone'),
- //'mail' => array('type'=>'mail', 'label' => 'Email'),
- 'scope' => array('type'=>'text', 'label' => 'Périmetre'),
- 'comment' => array('type'=>'textarea', 'label' => 'Commentaire'),
- 'uid' => array('type'=>'integer', 'label' => 'Identifiant de périmetre'),
- 'tag' => array('type'=>'tag', 'label' => 'Etiquettes')
- );
- //Colonnes indexées
- public $indexes = array('uid','scope');
- //remplis les métas (phones, mail principaux, phone et mails secondaires) par types si spécifiés
- public function meta($types = array(),$defaultOnly = false ){
- $filters = array('scope'=>'contact_person','uid'=>$this->id);
- if(!empty($types)) $filters['type:IN'] = implode(',',$types);
- if($defaultOnly) $filters['label'] = '';
- foreach(Contact::loadAll($filters) as $contact){
- if($contact->type==Contact::PHONE && $contact->label=='') $this->phone = $contact->value;
- if($contact->type==Contact::MOBILE && $contact->label=='') $this->mobile = $contact->value;
- if($contact->type=="mail" && $contact->label=='') $this->mail = $contact->value;
- if(!isset($this->meta[$contact->type])) $this->meta[$contact->type] = array();
- $this->meta[$contact->type][] = $contact;
- }
- }
- public function getTags(){
- $tags = explode(',', $this->tag);
- return array_values(array_filter($tags));
- }
- public function setTags($tags){
- if(is_array($tags)){
- $tags = array_filter($tags);
- $tags = implode(',', $tags);
- }
- $this->tag = ','.$tags.',';
- }
- public function toArray($decoded = false){
- $fields = parent::toArray();
- $fields['phone'] = $this->phone;
- $fields['mobile'] = $this->mobile;
- $fields['mail'] = $this->mail;
- $fields['meta'] = $this->meta;
- return $fields;
- }
- //récupere la liste d'entité et leurs entitées par défaut liées (téléphone et mail)
- public static function getAll($parameters = array()){
- $query = '';
- $data = array();
- $query .= 'SELECT *,';
- $query .= '(SELECT value FROM '.Contact::tableName().' c WHERE c.type=? AND c.scope=? AND c.uid={{table}}.id AND (c.label=? OR c.label IS NULL) LIMIT 1) as phone';
- $query .= ',(SELECT value FROM '.Contact::tableName().' c WHERE c.type=? AND c.scope=? AND c.uid={{table}}.id AND (c.label=? OR c.label IS NULL) LIMIT 1) as mobile';
- $query .= ',(SELECT value FROM '.Contact::tableName().' c WHERE c.type=? AND c.scope=? AND c.uid={{table}}.id AND (c.label=? OR c.label IS NULL) LIMIT 1) as mail';
- $query .= ' FROM {{table}}';
- $data[] = Contact::PHONE;
- $data[] = 'contact_person';
- $data[] = '';
- $data[] = Contact::MOBILE;
- $data[] = 'contact_person';
- $data[] = '';
- $data[] = 'mail';
- $data[] = 'contact_person';
- $data[] = '';
- $query .= ' WHERE 1 ';
- if(!empty($parameters['where'])){
- foreach($parameters['where'] as $key=>$value){
- $query .= ' AND '.$key.' = ? ';
- $data[] = $value;
- }
- }
- $rows = array();
- foreach(self::staticQuery($query,$data,true) as $item){
- $item->phone = $item->foreign('phone');
- $item->mobile = $item->foreign('mobile');
- $item->mail = $item->foreign('mail');
- $rows[] = $item;
- }
- return $rows;
- }
- //liste des Civilité possibles
- public static function civilities($key=null){
- $items = array(
- 'm' => array('label'=>'M.'),
- 'mme' => array('label'=>'Mme.')
- );
- if(!isset($key)) return $items;
- return isset($items[$key]) ? $items[$key] : array('label'=>'Non définis');
- }
- public static function remove($id){
- if(!isset($id)) throw new Exception("ID se suppression non spécifié");
- self::deleteById($id);
- Contact::delete(array('scope'=>'contact_person','uid'=>$id));
- }
- //Sauvegarde l'entité et ses entitées de contact liées (téléphones, mail...)
- public function save_all(){
- parent::save();
- $currentMeta = array('phone'=>$this->phone,'mobile'=>$this->mobile,'mail'=>$this->mail);
- //Enregistrement des mails et téléphones princpaux dans la table de contacts (si renseignés)
- if(!isset($this->phone) && !isset($this->mobile) && !isset($this->mail)) return;
- $metaContacts = array('phone','mail','mobile');
- //récuperation des contacts par defaut existants pour cette personne
- $this->meta($metaContacts,true);
- foreach ($metaContacts as $metaContact) {
- //si le champ est renseigné
- if(isset($currentMeta[$metaContact])){
- //on récupere le champ existant ou on en créé un nouveau
- $contact = !empty($this->meta[$metaContact]) ? $this->meta[$metaContact][0] : new Contact();
- //on ne save que si la valeur a changée
- if($contact->value != $currentMeta[$metaContact]){
- $contact->value = $currentMeta[$metaContact];
- $contact->scope = 'contact_person';
- $contact->uid = $this->id;
- $contact->type = $metaContact;
- $contact->label = '';
- $contact->save();
- }
- }
- }
- }
- public function avatar(){
- $mapping = array(
- '/pdg|directeur|dg/is' => 'job-direction.png',
- '/commercial(e)?|vente/is' => 'job-sales.png',
- '/communication|marketing|social/is' => 'job-communication.png',
- '/ingénieur|engineer|architect(e)?|recherche/is' => 'job-engineer.png',
- '/support|secrétaire|hotline/is' => 'job-support.png',
- '/ressources humaines|RH|HR/is' => 'job-rh.png',
- '/financ(e|ière|ier)|monnaie|comptab(le|bilitée)/is' => 'job-money.png',
- '/logistique|stock|atelier|livr(eur|aison)/is' => 'job-logistic.png',
- );
- $path = __ROOT__.SLASH.'img'.SLASH.'contact'.SLASH.'default-contact.png';
- foreach ($mapping as $regex => $relatedPath) {
- if( preg_match($regex,$this->job) ){
- $path = __ROOT__.SLASH.'img'.SLASH.'contact'.SLASH.$relatedPath;
- }
- }
- return $path;
- }
- public function fullName(){
- return ucfirst($this->firstname).' '.strtoupper($this->name);
- }
- public function toReadable(){
- $text = $this->civility.' '.$this->fullName();
- if(isset($this->phone) && !empty($this->phone)) $text .=' Tel: '.$this->phone;
- if(isset($this->mail) && !empty($this->mail)) $text .=' Mail : '.$this->mail;
- return $text;
- }
- }
- ?>
|