dolibarr 21.0.0-alpha
contact.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
4 * Copyright (C) 2004-2013 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2007 Franky Van Liedekerke <franky.van.liedekerker@telenet.be>
7 * Copyright (C) 2008 Raphael Bertrand (Resultic) <raphael.bertrand@resultic.fr>
8 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
9 * Copyright (C) 2013 Alexandre Spangaro <aspangaro@open-dsi.fr>
10 * Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
11 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
12 * Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
13 * Copyright (C) 2020 Open-Dsi <support@open-dsi.fr>
14 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
15 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 3 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program. If not, see <https://www.gnu.org/licenses/>.
29 */
30
36require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/class/commonsocialnetworks.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/commonpeople.class.php';
39
40
44class Contact extends CommonObject
45{
47 use CommonPeople;
48
52 public $element = 'contact';
53
57 public $table_element = 'socpeople';
58
62 public $picto = 'contact';
63
88 // BEGIN MODULEBUILDER PROPERTIES
92 public $fields = array(
93 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'visible' => -2, 'noteditable' => 1, 'notnull' => 1, 'index' => 1, 'position' => 1, 'comment' => 'Id', 'css' => 'left'),
94 'entity' => array('type' => 'integer', 'label' => 'Entity', 'default' => '1', 'enabled' => 1, 'visible' => 3, 'notnull' => 1, 'position' => 30, 'index' => 1),
95 'ref_ext' => array('type' => 'varchar(255)', 'label' => 'Ref ext', 'enabled' => 1, 'visible' => 3, 'position' => 35),
96 'civility' => array('type' => 'varchar(6)', 'label' => 'Civility', 'enabled' => 1, 'visible' => 3, 'position' => 40),
97 'lastname' => array('type' => 'varchar(50)', 'label' => 'Lastname', 'enabled' => 1, 'visible' => 1, 'position' => 45, 'showoncombobox' => 1, 'searchall' => 1),
98 'name_alias' => array('type' => 'varchar(255)', 'label' => 'Name alias', 'enabled' => 1, 'visible' => -1, 'position' => 46, 'searchall' => 1),
99 'firstname' => array('type' => 'varchar(50)', 'label' => 'Firstname', 'enabled' => 1, 'visible' => 1, 'position' => 50, 'showoncombobox' => 1, 'searchall' => 1),
100 'poste' => array('type' => 'varchar(80)', 'label' => 'PostOrFunction', 'enabled' => 1, 'visible' => -1, 'position' => 52),
101 'address' => array('type' => 'varchar(255)', 'label' => 'Address', 'enabled' => 1, 'visible' => -1, 'position' => 55),
102 'zip' => array('type' => 'varchar(25)', 'label' => 'Zip', 'enabled' => 1, 'visible' => -1, 'position' => 60),
103 'town' => array('type' => 'varchar(50)', 'label' => 'Town', 'enabled' => 1, 'visible' => -1, 'position' => 65),
104 'fk_departement' => array('type' => 'integer', 'label' => 'Fk departement', 'enabled' => 1, 'visible' => 3, 'position' => 70),
105 'fk_pays' => array('type' => 'integer', 'label' => 'Fk pays', 'enabled' => 1, 'visible' => 3, 'position' => 75),
106 'fk_soc' => array('type' => 'integer', 'label' => 'ThirdParty', 'enabled' => 1, 'visible' => 1, 'position' => 77, 'searchall' => 1),
107 'birthday' => array('type' => 'date', 'label' => 'Birthday', 'enabled' => 1, 'visible' => -1, 'position' => 80),
108 'phone' => array('type' => 'varchar(30)', 'label' => 'Phone', 'enabled' => 1, 'visible' => 1, 'position' => 90, 'searchall' => 1),
109 'phone_perso' => array('type' => 'varchar(30)', 'label' => 'PhonePerso', 'enabled' => 1, 'visible' => -1, 'position' => 95, 'searchall' => 1),
110 'phone_mobile' => array('type' => 'varchar(30)', 'label' => 'PhoneMobile', 'enabled' => 1, 'visible' => 1, 'position' => 100, 'searchall' => 1),
111 'fax' => array('type' => 'varchar(30)', 'label' => 'Fax', 'enabled' => 1, 'visible' => -1, 'position' => 105, 'searchall' => 1),
112 'email' => array('type' => 'varchar(255)', 'label' => 'Email', 'enabled' => 1, 'visible' => 1, 'position' => 110, 'searchall' => 1),
113 'socialnetworks' => array('type' => 'text', 'label' => 'SocialNetworks', 'enabled' => 1, 'visible' => 3, 'position' => 115),
114 'photo' => array('type' => 'varchar(255)', 'label' => 'Photo', 'enabled' => 1, 'visible' => 3, 'position' => 170),
115 'priv' => array('type' => 'smallint(6)', 'label' => 'ContactVisibility', 'enabled' => 1, 'visible' => 1, 'notnull' => 1, 'position' => 175),
116 'fk_stcommcontact' => array('type' => 'integer', 'label' => 'ProspectStatus', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 220),
117 'fk_prospectcontactlevel' => array('type' => 'varchar(12)', 'label' => 'ProspectLevel', 'enabled' => 1, 'visible' => -1, 'position' => 255),
118 //no more used. Replace by a scan of email into mailing_unsubscribe. 'no_email' =>array('type'=>'smallint(6)', 'label'=>'No_Email', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>180),
119 'note_private' => array('type' => 'html', 'label' => 'NotePrivate', 'enabled' => 1, 'visible' => 3, 'position' => 195, 'searchall' => 1),
120 'note_public' => array('type' => 'html', 'label' => 'NotePublic', 'enabled' => 1, 'visible' => 3, 'position' => 200, 'searchall' => 1),
121 'default_lang' => array('type' => 'varchar(6)', 'label' => 'Default lang', 'enabled' => 1, 'visible' => 3, 'position' => 205),
122 'canvas' => array('type' => 'varchar(32)', 'label' => 'Canvas', 'enabled' => 1, 'visible' => 3, 'position' => 210),
123 'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -1, 'position' => 300),
124 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 305),
125 'fk_user_creat' => array('type' => 'integer', 'label' => 'UserAuthor', 'enabled' => 1, 'visible' => 3, 'position' => 310),
126 'fk_user_modif' => array('type' => 'integer', 'label' => 'UserModif', 'enabled' => 1, 'visible' => 3, 'position' => 315),
127 'statut' => array('type' => 'tinyint(4)', 'label' => 'Status', 'enabled' => 1, 'visible' => 1, 'notnull' => 1, 'position' => 500),
128 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'visible' => -1, 'position' => 1000),
129 );
130
131 public $civility_id; // In fact we store civility_code
132 public $civility_code;
133 public $civility;
134
138 public $gender;
139
143 //private $egroupware_id;
144
148 public $birthday_alert;
149
155 public $civilite;
156
160 public $fullname;
161
165 public $name_alias;
166
170 public $address;
171
175 public $zip;
176
180 public $town;
181
185 public $state_id;
186
190 public $state_code;
191
195 public $state;
196
200 public $poste;
201
205 public $socid; // both socid and fk_soc are used
206 public $fk_soc; // both socid and fk_soc are used
207
211 public $socname;
212
216 public $statut;
217
218 public $code;
219
224 public $email;
225
232 public $mail;
233
238 public $url;
239
245 public $no_email;
246
251 public $socialnetworks;
252
256 public $photo;
257
261 public $phone_pro;
262
266 public $phone_perso;
267
271 public $phone_mobile;
272
276 public $fax;
277
282 public $priv;
283
287 public $birthday;
288
292 public $default_lang;
293
297 public $ref_facturation;
298
302 public $ref_contrat;
303
307 public $ref_commande;
308
312 public $ref_propal;
313
317 public $user_id;
318
322 public $user_login;
323
324 // END MODULEBUILDER PROPERTIES
325
326
331 public $oldcopy; // To contains a clone of this when we need to save old properties of object
332
336 public $roles;
337
338 public $cacheprospectstatus = array();
339
343 public $fk_prospectlevel;
344
345 public $stcomm_id;
346
347 public $statut_commercial;
348
352 public $stcomm_picto;
353
354
360 public function __construct($db)
361 {
362 $this->db = $db;
363 $this->statut = 1; // By default, status is enabled
364 $this->ismultientitymanaged = 1;
365 $this->isextrafieldmanaged = 1;
366
367 if (!isModEnabled('mailing')) {
368 $this->fields['no_email']['enabled'] = 0;
369 }
370 // typical ['s.nom'] is used for third-parties
371 if (!getDolGlobalString('SOCIETE_DISABLE_CONTACTS')) {
372 $this->fields['fk_soc']['enabled'] = 0;
373 $this->fields['fk_soc']['searchall'] = 0;
374 }
375
376 // If THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES not set, there is no prospect level on contact level, only on thirdparty
377 if (getDolGlobalString('SOCIETE_DISABLE_PROSPECTS') || !getDolGlobalString('THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES')) { // Default behaviour
378 $this->fields['fk_stcommcontact']['enabled'] = 0;
379 $this->fields['fk_prospectcontactlevel']['enabled'] = 0;
380 }
381
382 // Unset fields that are disabled
383 foreach ($this->fields as $key => $val) {
384 if (isset($val['enabled']) && empty($val['enabled'])) {
385 unset($this->fields[$key]);
386 }
387 }
388
389 // Translate some data of arrayofkeyval
390 /*if (is_object($langs))
391 {
392 foreach($this->fields as $key => $val)
393 {
394 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval']))
395 {
396 foreach($val['arrayofkeyval'] as $key2 => $val2)
397 {
398 $this->fields[$key]['arrayofkeyval'][$key2]=$langs->trans($val2);
399 }
400 }
401 }
402 }*/
403 }
404
410 public function loadStateBoard()
411 {
412 global $user, $hookmanager;
413
414 $this->nb = array();
415 $clause = "WHERE";
416
417 $sql = "SELECT count(sp.rowid) as nb";
418 $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as sp";
419 if (!$user->hasRight('societe', 'client', 'voir')) {
420 $sql .= ", ".MAIN_DB_PREFIX."societe as s";
421 $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
422 $sql .= " WHERE sp.fk_soc = s.rowid AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
423 $clause = "AND";
424 }
425 $sql .= " ".$clause." sp.entity IN (".getEntity($this->element).")";
426 $sql .= " AND (sp.priv='0' OR (sp.priv='1' AND sp.fk_user_creat = ".((int) $user->id)."))";
427 if ($user->socid > 0) {
428 $sql .= " AND sp.fk_soc = ".((int) $user->socid);
429 }
430 // Add where from hooks
431 if (is_object($hookmanager)) {
432 $parameters = array();
433 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $this); // Note that $action and $object may have been modified by hook
434 $sql .= $hookmanager->resPrint;
435 }
436
437 $resql = $this->db->query($sql);
438 if ($resql) {
439 while ($obj = $this->db->fetch_object($resql)) {
440 $this->nb["contacts"] = $obj->nb;
441 }
442 $this->db->free($resql);
443 return 1;
444 } else {
445 dol_print_error($this->db);
446 $this->error = $this->db->lasterror();
447 return -1;
448 }
449 }
450
458 public function create($user, $notrigger = 0)
459 {
460 global $conf;
461
462 $error = 0;
463 $now = dol_now();
464
465 $this->db->begin();
466
467 // Clean parameters
468 $this->name_alias = trim($this->name_alias);
469 $this->lastname = $this->lastname ? trim($this->lastname) : trim($this->name);
470 $this->firstname = trim($this->firstname);
471 $this->setUpperOrLowerCase();
472 if (empty($this->socid)) {
473 $this->socid = 0;
474 }
475 if (empty($this->priv)) {
476 $this->priv = 0;
477 }
478 if (empty($this->statut)) {
479 $this->statut = 0; // This is to convert '' into '0' to avoid bad sql request
480 }
481
482 $this->entity = ((isset($this->entity) && is_numeric($this->entity)) ? $this->entity : $conf->entity);
483
484 $sql = "INSERT INTO ".MAIN_DB_PREFIX."socpeople (";
485 $sql .= " datec";
486 $sql .= ", fk_soc";
487 $sql .= ", name_alias";
488 $sql .= ", lastname";
489 $sql .= ", firstname";
490 $sql .= ", fk_user_creat";
491 $sql .= ", priv";
492 $sql .= ", fk_stcommcontact";
493 $sql .= ", statut";
494 $sql .= ", canvas";
495 $sql .= ", entity";
496 $sql .= ", ref_ext";
497 $sql .= ", import_key";
498 $sql .= ") VALUES (";
499 $sql .= "'".$this->db->idate($now)."',";
500 if ($this->socid > 0) {
501 $sql .= " ".((int) $this->socid).",";
502 } else {
503 $sql .= "null,";
504 }
505 $sql .= "'".$this->db->escape($this->name_alias)."',";
506 $sql .= "'".$this->db->escape($this->lastname)."',";
507 $sql .= "'".$this->db->escape($this->firstname)."',";
508 $sql .= " ".($user->id > 0 ? ((int) $user->id) : "null").",";
509 $sql .= " ".((int) $this->priv).",";
510 $sql .= " 0,";
511 $sql .= " ".((int) $this->statut).",";
512 $sql .= " ".(!empty($this->canvas) ? "'".$this->db->escape($this->canvas)."'" : "null").",";
513 $sql .= " ".((int) $this->entity).",";
514 $sql .= "'".$this->db->escape($this->ref_ext)."',";
515 $sql .= " ".(!empty($this->import_key) ? "'".$this->db->escape($this->import_key)."'" : "null");
516 $sql .= ")";
517
518 dol_syslog(get_class($this)."::create", LOG_DEBUG);
519 $resql = $this->db->query($sql);
520 if ($resql) {
521 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."socpeople");
522
523 if (!$error) {
524 $result = $this->update($this->id, $user, 1, 'add'); // This include updateRoles(), ...
525 if ($result < 0) {
526 $error++;
527 $this->error = $this->db->lasterror();
528 }
529 }
530
531 if (!$error) {
532 $result = $this->update_perso($this->id, $user, 1); // TODO Remove function update_perso, should be same than update
533 if ($result < 0) {
534 $error++;
535 $this->error = $this->db->lasterror();
536 }
537 }
538
539 if (!$error && !$notrigger) {
540 // Call trigger
541 $result = $this->call_trigger('CONTACT_CREATE', $user);
542 if ($result < 0) {
543 $error++;
544 }
545 // End call triggers
546 }
547
548 if (!$error) {
549 $this->db->commit();
550 return $this->id;
551 } else {
552 $this->db->rollback();
553 dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
554 return -2;
555 }
556 } else {
557 $this->error = $this->db->lasterror();
558
559 $this->db->rollback();
560 dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
561 return -1;
562 }
563 }
564
575 public function update($id, $user = null, $notrigger = 0, $action = 'update', $nosyncuser = 0)
576 {
577 global $conf;
578
579 $error = 0;
580
581 $this->id = $id;
582
583 $this->entity = ((isset($this->entity) && is_numeric($this->entity)) ? $this->entity : $conf->entity);
584
585 // Clean parameters
586 $this->ref_ext = (empty($this->ref_ext) ? '' : trim($this->ref_ext));
587 $this->name_alias = trim($this->name_alias);
588 $this->lastname = trim($this->lastname) ? trim($this->lastname) : trim($this->lastname);
589 $this->firstname = trim($this->firstname);
590 $this->email = trim($this->email);
591 $this->phone_pro = trim($this->phone_pro);
592 $this->phone_perso = trim($this->phone_perso);
593 $this->phone_mobile = trim($this->phone_mobile);
594 $this->photo = trim($this->photo);
595 $this->fax = trim($this->fax);
596 $this->zip = (empty($this->zip) ? '' : trim($this->zip));
597 $this->town = (empty($this->town) ? '' : trim($this->town));
598 $this->country_id = (empty($this->country_id) || $this->country_id < 0) ? 0 : $this->country_id;
599 if (empty($this->statut)) {
600 $this->statut = 0;
601 }
602 if (empty($this->civility_code) && !is_numeric($this->civility_id)) {
603 $this->civility_code = $this->civility_id; // For backward compatibility
604 }
605 $this->setUpperOrLowerCase();
606
607 $this->db->begin();
608
609 $sql = "UPDATE ".MAIN_DB_PREFIX."socpeople SET";
610 if ($this->socid > 0) {
611 $sql .= " fk_soc = ".((int) $this->socid).",";
612 } elseif ($this->socid == -1) {
613 $sql .= " fk_soc = NULL,";
614 }
615 $sql .= " civility='".$this->db->escape($this->civility_code)."'";
616 $sql .= ", name_alias='".$this->db->escape($this->name_alias)."'";
617 $sql .= ", lastname='".$this->db->escape($this->lastname)."'";
618 $sql .= ", firstname='".$this->db->escape($this->firstname)."'";
619 $sql .= ", address='".$this->db->escape($this->address)."'";
620 $sql .= ", zip='".$this->db->escape($this->zip)."'";
621 $sql .= ", town='".$this->db->escape($this->town)."'";
622 $sql .= ", ref_ext = ".(!empty($this->ref_ext) ? "'".$this->db->escape($this->ref_ext)."'" : "NULL");
623 $sql .= ", fk_pays=".($this->country_id > 0 ? $this->country_id : 'NULL');
624 $sql .= ", fk_departement=".($this->state_id > 0 ? $this->state_id : 'NULL');
625 $sql .= ", poste='".$this->db->escape($this->poste)."'";
626 $sql .= ", fax='".$this->db->escape($this->fax)."'";
627 $sql .= ", email='".$this->db->escape($this->email)."'";
628 $sql .= ", socialnetworks = '".$this->db->escape(json_encode($this->socialnetworks))."'";
629 $sql .= ", photo='".$this->db->escape($this->photo)."'";
630 $sql .= ", birthday=".($this->birthday ? "'".$this->db->idate($this->birthday)."'" : "null");
631 $sql .= ", note_private = ".(isset($this->note_private) ? "'".$this->db->escape($this->note_private)."'" : "NULL");
632 $sql .= ", note_public = ".(isset($this->note_public) ? "'".$this->db->escape($this->note_public)."'" : "NULL");
633 $sql .= ", phone = ".(isset($this->phone_pro) ? "'".$this->db->escape($this->phone_pro)."'" : "NULL");
634 $sql .= ", phone_perso = ".(isset($this->phone_perso) ? "'".$this->db->escape($this->phone_perso)."'" : "NULL");
635 $sql .= ", phone_mobile = ".(isset($this->phone_mobile) ? "'".$this->db->escape($this->phone_mobile)."'" : "NULL");
636 $sql .= ", priv = '".$this->db->escape($this->priv)."'";
637 $sql .= ", fk_prospectlevel = '".$this->db->escape($this->fk_prospectlevel)."'";
638 if (isset($this->stcomm_id)) {
639 $sql .= ", fk_stcommcontact = ".($this->stcomm_id > 0 || $this->stcomm_id == -1 ? $this->stcomm_id : "0");
640 }
641 $sql .= ", statut = ".((int) $this->statut);
642 $sql .= ", fk_user_modif=".($user->id > 0 ? "'".$this->db->escape($user->id)."'" : "NULL");
643 $sql .= ", default_lang=".($this->default_lang ? "'".$this->db->escape($this->default_lang)."'" : "NULL");
644 $sql .= ", entity = ".((int) $this->entity);
645 $sql .= " WHERE rowid = ".((int) $id);
646
647 dol_syslog(get_class($this)."::update", LOG_DEBUG);
648 $result = $this->db->query($sql);
649 if ($result) {
650 unset($this->country_code);
651 unset($this->country);
652 unset($this->state_code);
653 unset($this->state);
654
655 $action = 'update';
656
657 // Actions on extra fields
658 if (!$error) {
659 $result = $this->insertExtraFields();
660 if ($result < 0) {
661 $error++;
662 }
663 }
664
665 if (!$error) {
666 $result = $this->updateRoles();
667 if ($result < 0) {
668 $error++;
669 }
670 }
671
672 if (!$error && $this->user_id > 0) {
673 // If contact is linked to a user
674 $tmpobj = new User($this->db);
675 $tmpobj->fetch($this->user_id);
676 $usermustbemodified = 0;
677 if ($tmpobj->office_phone != $this->phone_pro) {
678 $tmpobj->office_phone = $this->phone_pro;
679 $usermustbemodified++;
680 }
681 if ($tmpobj->office_fax != $this->fax) {
682 $tmpobj->office_fax = $this->fax;
683 $usermustbemodified++;
684 }
685 if ($tmpobj->address != $this->address) {
686 $tmpobj->address = $this->address;
687 $usermustbemodified++;
688 }
689 if ($tmpobj->town != $this->town) {
690 $tmpobj->town = $this->town;
691 $usermustbemodified++;
692 }
693 if ($tmpobj->zip != $this->zip) {
694 $tmpobj->zip = $this->zip;
695 $usermustbemodified++;
696 }
697 if ($tmpobj->zip != $this->zip) {
698 $tmpobj->state_id = $this->state_id;
699 $usermustbemodified++;
700 }
701 if ($tmpobj->country_id != $this->country_id) {
702 $tmpobj->country_id = $this->country_id;
703 $usermustbemodified++;
704 }
705 if ($tmpobj->email != $this->email) {
706 $tmpobj->email = $this->email;
707 $usermustbemodified++;
708 }
709 if (!empty(array_diff($tmpobj->socialnetworks, $this->socialnetworks))) {
710 $tmpobj->socialnetworks = $this->socialnetworks;
711 $usermustbemodified++;
712 }
713 if ($usermustbemodified) {
714 $result = $tmpobj->update($user, 0, 1, 1, 1);
715 if ($result < 0) {
716 $error++;
717 }
718 }
719 }
720
721 if (!$error && !$notrigger) {
722 // Call trigger
723 $result = $this->call_trigger('CONTACT_MODIFY', $user);
724 if ($result < 0) {
725 $error++;
726 }
727 // End call triggers
728 }
729
730 if (!$error) {
731 $this->db->commit();
732 return 1;
733 } else {
734 dol_syslog(get_class($this)."::update Error ".$this->error, LOG_ERR);
735 $this->db->rollback();
736 return -$error;
737 }
738 } else {
739 $this->error = $this->db->lasterror().' sql='.$sql;
740 $this->db->rollback();
741 return -1;
742 }
743 }
744
745
746 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
747 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
757 public function _load_ldap_dn($info, $mode = 0)
758 {
759 // phpcs:enable
760 global $conf;
761 $dn = '';
762 if ($mode == 0) {
763 $dn = getDolGlobalString('LDAP_KEY_CONTACTS') . "=".$info[getDolGlobalString('LDAP_KEY_CONTACTS')]."," . getDolGlobalString('LDAP_CONTACT_DN');
764 } elseif ($mode == 1) {
765 $dn = getDolGlobalString('LDAP_CONTACT_DN');
766 } elseif ($mode == 2) {
767 $dn = getDolGlobalString('LDAP_KEY_CONTACTS') . "=".$info[getDolGlobalString('LDAP_KEY_CONTACTS')];
768 }
769 return $dn;
770 }
771
772
773 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
774 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
780 public function _load_ldap_info()
781 {
782 // phpcs:enable
783 global $conf, $langs;
784
785 $info = array();
786
787 // Object classes
788 $info["objectclass"] = explode(',', getDolGlobalString('LDAP_CONTACT_OBJECT_CLASS'));
789
790 $this->fullname = $this->getFullName($langs);
791
792 // Fields
793 if ($this->fullname && getDolGlobalString('LDAP_CONTACT_FIELD_FULLNAME')) {
794 $info[getDolGlobalString('LDAP_CONTACT_FIELD_FULLNAME')] = $this->fullname;
795 }
796 if ($this->lastname && getDolGlobalString('LDAP_CONTACT_FIELD_NAME')) {
797 $info[getDolGlobalString('LDAP_CONTACT_FIELD_NAME')] = $this->lastname;
798 }
799 if ($this->firstname && getDolGlobalString('LDAP_CONTACT_FIELD_FIRSTNAME')) {
800 $info[getDolGlobalString('LDAP_CONTACT_FIELD_FIRSTNAME')] = $this->firstname;
801 }
802
803 if ($this->poste) {
804 $info["title"] = $this->poste;
805 }
806 if ($this->socid > 0) {
807 $soc = new Societe($this->db);
808 $soc->fetch($this->socid);
809
810 $info[getDolGlobalString('LDAP_CONTACT_FIELD_COMPANY')] = $soc->name;
811 if ($soc->client == 1) {
812 $info["businessCategory"] = "Customers";
813 }
814 if ($soc->client == 2) {
815 $info["businessCategory"] = "Prospects";
816 }
817 if ($soc->fournisseur == 1) {
818 $info["businessCategory"] = "Suppliers";
819 }
820 }
821 if ($this->address && getDolGlobalString('LDAP_CONTACT_FIELD_ADDRESS')) {
822 $info[getDolGlobalString('LDAP_CONTACT_FIELD_ADDRESS')] = $this->address;
823 }
824 if ($this->zip && getDolGlobalString('LDAP_CONTACT_FIELD_ZIP')) {
825 $info[getDolGlobalString('LDAP_CONTACT_FIELD_ZIP')] = $this->zip;
826 }
827 if ($this->town && getDolGlobalString('LDAP_CONTACT_FIELD_TOWN')) {
828 $info[getDolGlobalString('LDAP_CONTACT_FIELD_TOWN')] = $this->town;
829 }
830 if ($this->country_code && getDolGlobalString('LDAP_CONTACT_FIELD_COUNTRY')) {
831 $info[getDolGlobalString('LDAP_CONTACT_FIELD_COUNTRY')] = $this->country_code;
832 }
833 if ($this->phone_pro && getDolGlobalString('LDAP_CONTACT_FIELD_PHONE')) {
834 $info[getDolGlobalString('LDAP_CONTACT_FIELD_PHONE')] = $this->phone_pro;
835 }
836 if ($this->phone_perso && getDolGlobalString('LDAP_CONTACT_FIELD_HOMEPHONE')) {
837 $info[getDolGlobalString('LDAP_CONTACT_FIELD_HOMEPHONE')] = $this->phone_perso;
838 }
839 if ($this->phone_mobile && getDolGlobalString('LDAP_CONTACT_FIELD_MOBILE')) {
840 $info[getDolGlobalString('LDAP_CONTACT_FIELD_MOBILE')] = $this->phone_mobile;
841 }
842 if ($this->fax && getDolGlobalString('LDAP_CONTACT_FIELD_FAX')) {
843 $info[getDolGlobalString('LDAP_CONTACT_FIELD_FAX')] = $this->fax;
844 }
845 if ($this->note_private && getDolGlobalString('LDAP_CONTACT_FIELD_DESCRIPTION')) {
846 $info[getDolGlobalString('LDAP_CONTACT_FIELD_DESCRIPTION')] = dol_string_nohtmltag($this->note_private, 2);
847 }
848 if ($this->email && getDolGlobalString('LDAP_CONTACT_FIELD_MAIL')) {
849 $info[getDolGlobalString('LDAP_CONTACT_FIELD_MAIL')] = $this->email;
850 }
851
852 if (getDolGlobalString('LDAP_SERVER_TYPE') == 'egroupware') {
853 $info["objectclass"][4] = "phpgwContact"; // compatibilite egroupware
854
855 $info['uidnumber'] = $this->id;
856
857 $info['phpgwTz'] = 0;
858 $info['phpgwMailType'] = 'INTERNET';
859 $info['phpgwMailHomeType'] = 'INTERNET';
860
861 $info["phpgwContactTypeId"] = 'n';
862 $info["phpgwContactCatId"] = 0;
863 $info["phpgwContactAccess"] = "public";
864
865 /*
866 if (dol_strlen($this->egroupware_id) == 0) {
867 $this->egroupware_id = 1;
868 }
869 $info["phpgwContactOwner"] = $this->egroupware_id;
870 */
871 $info["phpgwContactOwner"] = 1;
872
873 if ($this->email) {
874 $info["rfc822Mailbox"] = $this->email;
875 }
876 if ($this->phone_mobile) {
877 $info["phpgwCellTelephoneNumber"] = $this->phone_mobile;
878 }
879 }
880
881 return $info;
882 }
883
884
885 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
894 public function update_perso($id, $user = null, $notrigger = 0)
895 {
896 // phpcs:enable
897 $error = 0;
898 $result = false;
899
900 $this->db->begin();
901
902 // Update the contact
903 $sql = "UPDATE ".MAIN_DB_PREFIX."socpeople SET";
904 $sql .= " birthday = ".($this->birthday ? "'".$this->db->idate($this->birthday)."'" : "null");
905 $sql .= ", photo = ".($this->photo ? "'".$this->db->escape($this->photo)."'" : "null");
906 if ($user) {
907 $sql .= ", fk_user_modif = ".((int) $user->id);
908 }
909 $sql .= " WHERE rowid = ".((int) $id);
910
911 dol_syslog(get_class($this)."::update_perso this->birthday=".$this->birthday." -", LOG_DEBUG);
912 $resql = $this->db->query($sql);
913 if (!$resql) {
914 $error++;
915 $this->error = $this->db->lasterror();
916 }
917
918 if ($user) {
919 // Update birthday alert
920 if (!empty($this->birthday_alert)) {
921 //check existing
922 $sql_check = "SELECT rowid FROM " . MAIN_DB_PREFIX . "user_alert WHERE type = 1 AND fk_contact = " . ((int) $id) . " AND fk_user = " . ((int) $user->id);
923 $result_check = $this->db->query($sql_check);
924 if (!$result_check || ($this->db->num_rows($result_check) < 1)) {
925 //insert
926 $sql = "INSERT INTO " . MAIN_DB_PREFIX . "user_alert(type, fk_contact, fk_user) ";
927 $sql .= "VALUES (1," . ((int) $id) . "," . ((int) $user->id) . ")";
928 $result = $this->db->query($sql);
929 if (!$result) {
930 $error++;
931 $this->error = $this->db->lasterror();
932 }
933 } else {
934 $result = true;
935 }
936 } else {
937 $sql = "DELETE FROM " . MAIN_DB_PREFIX . "user_alert ";
938 $sql .= "WHERE type=1 AND fk_contact=" . ((int) $id) . " AND fk_user=" . ((int) $user->id);
939 $result = $this->db->query($sql);
940 if (!$result) {
941 $error++;
942 $this->error = $this->db->lasterror();
943 }
944 }
945 }
946
947 if (!$error && !$notrigger) {
948 // Call trigger
949 $result = $this->call_trigger('CONTACT_MODIFY', $user);
950 if ($result < 0) {
951 $error++;
952 }
953 // End call triggers
954 }
955
956 if (!$error) {
957 $this->db->commit();
958 return 1;
959 } else {
960 dol_syslog(get_class($this)."::update Error ".$this->error, LOG_ERR);
961 $this->db->rollback();
962 return -$error;
963 }
964 }
965
966
977 public function fetch($id, $user = null, $ref_ext = '', $email = '', $loadalsoroles = 0)
978 {
979 global $langs;
980
981 dol_syslog(get_class($this)."::fetch id=".$id." ref_ext=".$ref_ext." email=".$email, LOG_DEBUG);
982
983 if (empty($id) && empty($ref_ext) && empty($email)) {
984 $this->error = 'BadParameter';
985 return -1;
986 }
987
988 $langs->loadLangs(array("dict", "companies"));
989
990 $sql = "SELECT c.rowid, c.entity, c.fk_soc, c.ref_ext, c.civility as civility_code, c.name_alias, c.lastname, c.firstname,";
991 $sql .= " c.address, c.statut, c.zip, c.town,";
992 $sql .= " c.fk_pays as country_id,";
993 $sql .= " c.fk_departement as state_id,";
994 $sql .= " c.birthday,";
995 $sql .= " c.poste, c.phone, c.phone_perso, c.phone_mobile, c.fax, c.email,";
996 $sql .= " c.socialnetworks,";
997 $sql .= " c.photo,";
998 $sql .= " c.priv, c.note_private, c.note_public, c.default_lang, c.canvas,";
999 $sql .= " c.fk_prospectlevel, c.fk_stcommcontact, st.libelle as stcomm, st.picto as stcomm_picto,";
1000 $sql .= " c.import_key,";
1001 $sql .= " c.datec as date_creation, c.tms as date_modification,";
1002 $sql .= " co.label as country, co.code as country_code,";
1003 $sql .= " d.nom as state, d.code_departement as state_code,";
1004 $sql .= " u.rowid as user_id, u.login as user_login,";
1005 $sql .= " s.nom as socname, s.address as socaddress, s.zip as soccp, s.town as soccity, s.default_lang as socdefault_lang";
1006 $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c";
1007 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as co ON c.fk_pays = co.rowid";
1008 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as d ON c.fk_departement = d.rowid";
1009 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON c.rowid = u.fk_socpeople";
1010 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON c.fk_soc = s.rowid";
1011 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_stcommcontact as st ON c.fk_stcommcontact = st.id';
1012 if ($id) {
1013 $sql .= " WHERE c.rowid = ".((int) $id);
1014 } else {
1015 $sql .= " WHERE c.entity IN (".getEntity($this->element).")";
1016 if ($ref_ext) {
1017 $sql .= " AND c.ref_ext = '".$this->db->escape($ref_ext)."'";
1018 }
1019 if ($email) {
1020 $sql .= " AND c.email = '".$this->db->escape($email)."'";
1021 }
1022 }
1023
1024 $resql = $this->db->query($sql);
1025 if ($resql) {
1026 $num = $this->db->num_rows($resql);
1027 if ($num > 1) {
1028 $this->error = 'Fetch found several records. Rename one of contact to avoid duplicate.';
1029 dol_syslog($this->error, LOG_ERR);
1030
1031 return 2;
1032 } elseif ($num) { // $num = 1
1033 $obj = $this->db->fetch_object($resql);
1034
1035 $this->id = $obj->rowid;
1036 $this->entity = $obj->entity;
1037 $this->ref = $obj->rowid;
1038 $this->ref_ext = $obj->ref_ext;
1039
1040 $this->civility_code = $obj->civility_code;
1041 $this->civility = $obj->civility_code ? ($langs->trans("Civility".$obj->civility_code) != "Civility".$obj->civility_code ? $langs->trans("Civility".$obj->civility_code) : $obj->civility_code) : '';
1042
1043 $this->name_alias = $obj->name_alias;
1044 $this->lastname = $obj->lastname;
1045 $this->firstname = $obj->firstname;
1046 $this->address = $obj->address;
1047 $this->zip = $obj->zip;
1048 $this->town = $obj->town;
1049
1050 $this->date_creation = $this->db->jdate($obj->date_creation);
1051 $this->date_modification = $this->db->jdate($obj->date_modification);
1052
1053 $this->state_id = $obj->state_id;
1054 $this->state_code = $obj->state_code;
1055 $this->state = $obj->state;
1056
1057 $this->country_id = $obj->country_id;
1058 $this->country_code = $obj->country_id ? $obj->country_code : '';
1059 $this->country = $obj->country_id ? ($langs->trans('Country'.$obj->country_code) != 'Country'.$obj->country_code ? $langs->transnoentities('Country'.$obj->country_code) : $obj->country) : '';
1060
1061 $this->fk_soc = $obj->fk_soc; // Both fk_soc and socid are used
1062 $this->socid = $obj->fk_soc; // Both fk_soc and socid are used
1063 $this->socname = $obj->socname;
1064 $this->poste = $obj->poste;
1065 $this->statut = $obj->statut;
1066
1067 $this->fk_prospectlevel = $obj->fk_prospectlevel;
1068
1069 $transcode = $langs->trans('StatusProspect'.$obj->fk_stcommcontact);
1070 $libelle = ($transcode != 'StatusProspect'.$obj->fk_stcommcontact ? $transcode : $obj->stcomm);
1071 $this->stcomm_id = $obj->fk_stcommcontact; // id statut commercial
1072 $this->statut_commercial = $libelle; // libelle statut commercial
1073 $this->stcomm_picto = $obj->stcomm_picto; // Picto statut commercial
1074
1075 $this->phone_pro = trim($obj->phone);
1076 $this->fax = trim($obj->fax);
1077 $this->phone_perso = trim($obj->phone_perso);
1078 $this->phone_mobile = trim($obj->phone_mobile);
1079
1080 $this->email = $obj->email;
1081 $this->socialnetworks = ($obj->socialnetworks ? (array) json_decode($obj->socialnetworks, true) : array());
1082 $this->photo = $obj->photo;
1083 $this->priv = $obj->priv;
1084 $this->mail = $obj->email;
1085
1086 $this->birthday = $this->db->jdate($obj->birthday);
1087 $this->note = $obj->note_private; // deprecated
1088 $this->note_private = $obj->note_private;
1089 $this->note_public = $obj->note_public;
1090 $this->default_lang = $obj->default_lang;
1091 $this->user_id = $obj->user_id;
1092 $this->user_login = $obj->user_login;
1093 $this->canvas = $obj->canvas;
1094
1095 $this->import_key = $obj->import_key;
1096
1097 // Define gender according to civility
1098 $this->setGenderFromCivility();
1099
1100 // Search Dolibarr user linked to this contact
1101 $sql = "SELECT u.rowid ";
1102 $sql .= " FROM ".MAIN_DB_PREFIX."user as u";
1103 $sql .= " WHERE u.fk_socpeople = ".((int) $this->id);
1104
1105 $resql = $this->db->query($sql);
1106 if ($resql) {
1107 if ($this->db->num_rows($resql)) {
1108 $uobj = $this->db->fetch_object($resql);
1109
1110 $this->user_id = $uobj->rowid;
1111 }
1112 $this->db->free($resql);
1113 } else {
1114 $this->error = $this->db->error();
1115 return -1;
1116 }
1117
1118 // Retrieve all extrafield
1119 // fetch optionals attributes and labels
1120 $this->fetch_optionals();
1121
1122 // Load also alerts of this user
1123 if ($user) {
1124 $sql = "SELECT fk_user";
1125 $sql .= " FROM ".MAIN_DB_PREFIX."user_alert";
1126 $sql .= " WHERE fk_user = ".((int) $user->id)." AND fk_contact = ".((int) $id);
1127
1128 $resql = $this->db->query($sql);
1129 if ($resql) {
1130 if ($this->db->num_rows($resql)) {
1131 $obj = $this->db->fetch_object($resql);
1132
1133 $this->birthday_alert = 1;
1134 }
1135 $this->db->free($resql);
1136 } else {
1137 $this->error = $this->db->error();
1138 return -1;
1139 }
1140 }
1141
1142 // Load also roles of this address
1143 if ($loadalsoroles) {
1144 $resultRole = $this->fetchRoles();
1145 if ($resultRole < 0) {
1146 return $resultRole;
1147 }
1148 }
1149
1150 return 1;
1151 } else {
1152 $this->error = $langs->trans("RecordNotFound");
1153 return 0;
1154 }
1155 } else {
1156 $this->error = $this->db->error();
1157 return -1;
1158 }
1159 }
1160
1161
1162
1169 public function setGenderFromCivility()
1170 {
1171 unset($this->gender);
1172
1173 if (in_array($this->civility_id, array('MR')) || in_array($this->civility_code, array('MR'))) {
1174 $this->gender = 'man';
1175 } elseif (in_array($this->civility_id, array('MME', 'MLE')) || in_array($this->civility_code, array('MME', 'MLE'))) {
1176 $this->gender = 'woman';
1177 }
1178 }
1179
1180 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1190 public function load_ref_elements()
1191 {
1192 // phpcs:enable
1193 // Count the elements for which it is contact
1194 $sql = "SELECT tc.element, count(ec.rowid) as nb";
1195 $sql .= " FROM ".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc";
1196 $sql .= " WHERE ec.fk_c_type_contact = tc.rowid";
1197 $sql .= " AND fk_socpeople = ".((int) $this->id);
1198 $sql .= " AND tc.source = 'external'";
1199 $sql .= " GROUP BY tc.element";
1200
1201 dol_syslog(get_class($this)."::load_ref_elements", LOG_DEBUG);
1202
1203 $resql = $this->db->query($sql);
1204 if ($resql) {
1205 while ($obj = $this->db->fetch_object($resql)) {
1206 if ($obj->nb) {
1207 if ($obj->element == 'facture') {
1208 $this->ref_facturation = $obj->nb;
1209 } elseif ($obj->element == 'contrat') {
1210 $this->ref_contrat = $obj->nb;
1211 } elseif ($obj->element == 'commande') {
1212 $this->ref_commande = $obj->nb;
1213 } elseif ($obj->element == 'propal') {
1214 $this->ref_propal = $obj->nb;
1215 }
1216 }
1217 }
1218 $this->db->free($resql);
1219 return 0;
1220 } else {
1221 $this->error = $this->db->lasterror();
1222 return -1;
1223 }
1224 }
1225
1233 public function delete($user, $notrigger = 0)
1234 {
1235 $error = 0;
1236
1237 $this->db->begin();
1238
1239 if (!$error && !$notrigger) {
1240 // Call trigger
1241 $result = $this->call_trigger('CONTACT_DELETE', $user);
1242 if ($result < 0) {
1243 $error++;
1244 }
1245 // End call triggers
1246 }
1247
1248 if (!$error) {
1249 // Get all rowid of element_contact linked to a type that is link to llx_socpeople
1250 $sql = "SELECT ec.rowid";
1251 $sql .= " FROM ".MAIN_DB_PREFIX."element_contact ec,";
1252 $sql .= " ".MAIN_DB_PREFIX."c_type_contact tc";
1253 $sql .= " WHERE ec.fk_socpeople=".((int) $this->id);
1254 $sql .= " AND ec.fk_c_type_contact=tc.rowid";
1255 $sql .= " AND tc.source='external'";
1256 dol_syslog(__METHOD__, LOG_DEBUG);
1257 $resql = $this->db->query($sql);
1258 if ($resql) {
1259 $num = $this->db->num_rows($resql);
1260
1261 $i = 0;
1262 while ($i < $num && !$error) {
1263 $obj = $this->db->fetch_object($resql);
1264
1265 $sqldel = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
1266 $sqldel .= " WHERE rowid = ".((int) $obj->rowid);
1267 dol_syslog(__METHOD__, LOG_DEBUG);
1268 $result = $this->db->query($sqldel);
1269 if (!$result) {
1270 $error++;
1271 $this->error = $this->db->error().' sql='.$sqldel;
1272 }
1273
1274 $i++;
1275 }
1276 } else {
1277 $error++;
1278 $this->error = $this->db->error().' sql='.$sql;
1279 }
1280 }
1281
1282 if (!$error) {
1283 // Remove Roles
1284 $sql = "DELETE FROM ".MAIN_DB_PREFIX."societe_contacts WHERE fk_socpeople = ".((int) $this->id);
1285 dol_syslog(__METHOD__, LOG_DEBUG);
1286 $resql = $this->db->query($sql);
1287 if (!$resql) {
1288 $error++;
1289 $this->error .= $this->db->lasterror();
1290 $errorflag = -1;
1291 }
1292 }
1293
1294 if (!$error) {
1295 // Remove Notifications
1296 $sql = "DELETE FROM ".MAIN_DB_PREFIX."notify_def WHERE fk_contact = ".((int) $this->id);
1297 dol_syslog(__METHOD__, LOG_DEBUG);
1298 $resql = $this->db->query($sql);
1299 if (!$resql) {
1300 $error++;
1301 $this->error .= $this->db->lasterror();
1302 $errorflag = -1;
1303 }
1304 }
1305
1306 if (!$error) {
1307 // Remove category
1308 $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_contact WHERE fk_socpeople = ".((int) $this->id);
1309 dol_syslog(__METHOD__, LOG_DEBUG);
1310 $resql = $this->db->query($sql);
1311 if (!$resql) {
1312 $error++;
1313 $this->error .= $this->db->lasterror();
1314 $errorflag = -1;
1315 }
1316 }
1317
1318 if (!$error) {
1319 $sql = "DELETE FROM ".MAIN_DB_PREFIX."socpeople";
1320 $sql .= " WHERE rowid = ".((int) $this->id);
1321 dol_syslog(__METHOD__, LOG_DEBUG);
1322 $result = $this->db->query($sql);
1323 if (!$result) {
1324 $error++;
1325 $this->error = $this->db->error().' sql='.$sql;
1326 }
1327 }
1328
1329 // Remove extrafields
1330 if (!$error) {
1331 // For avoid conflicts if trigger used
1332 $result = $this->deleteExtraFields();
1333 if ($result < 0) {
1334 $error++;
1335 }
1336 }
1337
1338 if (!$error) {
1339 $this->db->commit();
1340 return 1;
1341 } else {
1342 $this->db->rollback();
1343 dol_syslog("Error ".$this->error, LOG_ERR);
1344 return -1;
1345 }
1346 }
1347
1348
1355 public function info($id)
1356 {
1357 $sql = "SELECT c.rowid, c.datec as datec, c.fk_user_creat,";
1358 $sql .= " c.tms as tms, c.fk_user_modif";
1359 $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c";
1360 $sql .= " WHERE c.rowid = ".((int) $id);
1361
1362 $resql = $this->db->query($sql);
1363 if ($resql) {
1364 if ($this->db->num_rows($resql)) {
1365 $obj = $this->db->fetch_object($resql);
1366
1367 $this->id = $obj->rowid;
1368
1369 $this->user_creation_id = $obj->fk_user_creat;
1370 $this->user_modification_id = $obj->fk_user_modif;
1371 $this->date_creation = $this->db->jdate($obj->datec);
1372 $this->date_modification = $this->db->jdate($obj->tms);
1373 }
1374
1375 $this->db->free($resql);
1376 } else {
1377 print $this->db->error();
1378 }
1379 }
1380
1386 public function getNbOfEMailings()
1387 {
1388 $sql = "SELECT count(mc.email) as nb";
1389 $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc, ".MAIN_DB_PREFIX."mailing as m";
1390 $sql .= " WHERE mc.fk_mailing=m.rowid AND mc.email = '".$this->db->escape($this->email)."' ";
1391 $sql .= " AND m.entity IN (".getEntity($this->element).") AND mc.statut NOT IN (-1,0)"; // -1 error, 0 not sent, 1 sent with success
1392
1393 $resql = $this->db->query($sql);
1394 if ($resql) {
1395 $obj = $this->db->fetch_object($resql);
1396 $nb = $obj->nb;
1397
1398 $this->db->free($resql);
1399 return $nb;
1400 } else {
1401 $this->error = $this->db->error();
1402 return -1;
1403 }
1404 }
1405
1412 public function getTooltipContentArray($params)
1413 {
1414 global $conf, $langs, $user;
1415
1416 $datas = [];
1417
1418 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
1419 return ['optimize' => $langs->trans("ShowContact")];
1420 }
1421 if (!empty($this->photo) && class_exists('Form')) {
1422 $photo = '<div class="photointooltip floatright">';
1423 $photo .= Form::showphoto('contact', $this, 0, 40, 0, 'photoref', 'mini', 0); // Important, we must force height so image will have height tags and if image is inside a tooltip, the tooltip manager can calculate height and position correctly the tooltip.
1424 $photo .= '</div>';
1425 $datas['photo'] = $photo;
1426 }
1427
1428 $datas['picto'] = img_picto('', $this->picto).' <u class="paddingrightonly">'.$langs->trans("Contact").'</u> ' . $this->getLibStatut(4);
1429 $datas['name'] = '<br><b>'.$langs->trans("Name").':</b> '.$this->getFullName($langs);
1430 // if ($this->civility_id) $datas['civility'] = '<br><b>' . $langs->trans("Civility") . ':</b> '.$this->civility_id; // TODO Translate civilty_id code
1431 if (!empty($this->poste)) {
1432 $datas['job'] = '<br><b>'.$langs->trans("Poste").':</b> '.$this->poste;
1433 }
1434 $datas['email'] = '<br><b>'.$langs->trans("EMail").':</b> '.$this->email;
1435 $phonelist = array();
1436 $country_code = empty($this->country_code) ? '' : $this->country_code;
1437 if ($this->phone_pro) {
1438 $phonelist[] = dol_print_phone($this->phone_pro, $country_code, $this->id, 0, '', '&nbsp;', 'phone');
1439 }
1440 if ($this->phone_mobile) {
1441 $phonelist[] = dol_print_phone($this->phone_mobile, $country_code, $this->id, 0, '', '&nbsp;', 'mobile');
1442 }
1443 if ($this->phone_perso) {
1444 $phonelist[] = dol_print_phone($this->phone_perso, $country_code, $this->id, 0, '', '&nbsp;', 'phone');
1445 }
1446 $datas['phonelist'] = '<br><b>'.$langs->trans("Phone").':</b> '.implode('&nbsp;', $phonelist);
1447 $datas['address'] = '<br><b>'.$langs->trans("Address").':</b> '.dol_format_address($this, 1, ' ', $langs);
1448
1449 return $datas;
1450 }
1451
1465 public function getNomUrl($withpicto = 0, $option = '', $maxlen = 0, $moreparam = '', $save_lastsearch_value = -1, $notooltip = 0, $morecss = '')
1466 {
1467 global $conf, $langs, $hookmanager;
1468
1469 if (!empty($conf->dol_no_mouse_hover)) {
1470 $notooltip = 1; // Force disable tooltips
1471 }
1472
1473 $result = '';
1474 $params = [
1475 'id' => $this->id,
1476 'objecttype' => $this->element,
1477 'option' => $option,
1478 ];
1479 $classfortooltip = 'classfortooltip';
1480 $dataparams = '';
1481 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
1482 $classfortooltip = 'classforajaxtooltip';
1483 $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
1484 $label = '';
1485 } else {
1486 $label = implode($this->getTooltipContentArray($params));
1487 }
1488
1489 $url = DOL_URL_ROOT.'/contact/card.php?id='.$this->id;
1490
1491 if ($option !== 'nolink') {
1492 // Add param to save lastsearch_values or not
1493 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1494 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
1495 $add_save_lastsearch_values = 1;
1496 }
1497 if ($url && $add_save_lastsearch_values) {
1498 $url .= '&save_lastsearch_values=1';
1499 }
1500 }
1501
1502 $url .= $moreparam;
1503
1504 $linkclose = '';
1505 if (empty($notooltip)) {
1506 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
1507 $label = $langs->trans("ShowContact");
1508 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
1509 }
1510 $linkclose .= ($label ? ' title="'.dol_escape_htmltag($label, 1).'"' : ' title="tocomplete"');
1511 $linkclose .= $dataparams.' class="'.$classfortooltip.($morecss ? ' '.$morecss : '').'"';
1512 } else {
1513 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
1514 }
1515
1516 if ($option == 'nolink' || empty($url)) {
1517 $linkstart = '<span';
1518 } else {
1519 $linkstart = '<a href="'.$url.'"';
1520 }
1521 $linkstart .= $linkclose.'>';
1522 if ($option == 'nolink' || empty($url)) {
1523 $linkend = '</span>';
1524 } else {
1525 $linkend = '</a>';
1526 }
1527
1528 $result .= $linkstart;
1529
1530 if ($withpicto) {
1531 if ($withpicto < 0) {
1532 $result .= '<!-- picto photo contact --><span class="nopadding userimg'.($morecss ? ' '.$morecss : '').'">'.Form::showphoto('contact', $this, 0, 0, 0, 'userphoto'.($withpicto == -3 ? 'small' : ''), 'mini', 0, 1).'</span>';
1533 if ($withpicto != 2 && $withpicto != -2) {
1534 $result .= ' ';
1535 }
1536 } else {
1537 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="pictofixedwidth valignmiddle"' : '') : 'class="'.(($withpicto != 2) ? 'pictofixedwidth valignmiddle' : '').'"'), 0, 0, $notooltip ? 0 : 1);
1538 }
1539 }
1540 if ($withpicto != 2 && $withpicto != -2) {
1541 $result .= '<span class="valigmiddle">'.($maxlen ? dol_trunc($this->getFullName($langs), $maxlen) : $this->getFullName($langs)).'</span>';
1542 }
1543
1544 $result .= $linkend;
1545
1546 global $action;
1547 $hookmanager->initHooks(array('contactdao'));
1548 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
1549 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1550 if ($reshook > 0) {
1551 $result = $hookmanager->resPrint;
1552 } else {
1553 $result .= $hookmanager->resPrint;
1554 }
1555
1556 return $result;
1557 }
1558
1564 public function getCivilityLabel()
1565 {
1566 global $langs;
1567
1568 $code = ($this->civility_code ? $this->civility_code : (!empty($this->civility_id) ? $this->civility : (!empty($this->civilite) ? $this->civilite : '')));
1569 if (empty($code)) {
1570 return '';
1571 }
1572
1573 $langs->load("dict");
1574 return $langs->getLabelFromKey($this->db, "Civility".$code, "c_civility", "code", "label", $code);
1575 }
1576
1583 public function getLibStatut($mode)
1584 {
1585 return $this->LibStatut($this->statut, $mode);
1586 }
1587
1588 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1596 public function LibStatut($status, $mode)
1597 {
1598 // phpcs:enable
1599 global $langs;
1600
1601 $labelStatus = array(
1602 0 => 'ActivityCeased',
1603 1 => 'InActivity',
1604 4 => 'InActivity',
1605 5 => 'ActivityCeased',
1606 );
1607 $labelStatusShort = array(
1608 0 => 'ActivityCeased',
1609 1 => 'InActivity',
1610 4 => 'InActivity',
1611 5 => 'ActivityCeased',
1612 );
1613
1614 $statusType = 'status4';
1615 if ($status == 0 || $status == 5) {
1616 $statusType = 'status5';
1617 }
1618
1619 $label = $langs->transnoentitiesnoconv($labelStatus[$status]);
1620 $labelshort = $langs->transnoentitiesnoconv($labelStatusShort[$status]);
1621
1622 return dolGetStatus($label, $labelshort, '', $statusType, $mode);
1623 }
1624
1625
1626 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1633 public function LibPubPriv($status)
1634 {
1635 // phpcs:enable
1636 global $langs;
1637 if ($status == '1') {
1638 return $langs->trans('ContactPrivate');
1639 } else {
1640 return $langs->trans('ContactPublic');
1641 }
1642 }
1643
1644
1652 public function initAsSpecimen()
1653 {
1654 // Get first id of existing company and save it into $socid
1655 $socid = 0;
1656 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe ORDER BY rowid LIMIT 1";
1657 $resql = $this->db->query($sql);
1658 if ($resql) {
1659 $obj = $this->db->fetch_object($resql);
1660 if ($obj) {
1661 $socid = $obj->rowid;
1662 }
1663 }
1664
1665 // Initialise parameters
1666 $this->id = 0;
1667 $this->entity = 1;
1668 $this->specimen = 1;
1669 $this->lastname = 'DOLIBARR';
1670 $this->firstname = 'SPECIMEN';
1671 $this->address = '21 jump street';
1672 $this->zip = '99999';
1673 $this->town = 'MyTown';
1674 $this->country_id = 1;
1675 $this->country_code = 'FR';
1676 $this->country = 'France';
1677 $this->email = 'specimen@specimen.com';
1678 $this->socialnetworks = array(
1679 'skype' => 'tom.hanson',
1680 'twitter' => 'tomhanson',
1681 'linkedin' => 'tomhanson',
1682 );
1683 $this->phone_pro = '0909090901';
1684 $this->phone_perso = '0909090902';
1685 $this->phone_mobile = '0909090903';
1686 $this->fax = '0909090909';
1687
1688 $this->note_public = 'This is a comment (public)';
1689 $this->note_private = 'This is a comment (private)';
1690
1691 $this->socid = $socid;
1692 $this->statut = 1;
1693
1694 return 1;
1695 }
1696
1703 public function setstatus($status)
1704 {
1705 global $conf, $langs, $user;
1706
1707 $error = 0;
1708
1709 // Check parameters
1710 if ($this->statut == $status) {
1711 return 0;
1712 } else {
1713 $this->statut = $status;
1714 }
1715
1716 $this->db->begin();
1717
1718 // User disable
1719 $sql = "UPDATE ".MAIN_DB_PREFIX."socpeople";
1720 $sql .= " SET statut = ".((int) $this->statut);
1721 $sql .= ", fk_user_modif = ".((int) $user->id);
1722 $sql .= " WHERE rowid = ".((int) $this->id);
1723 $result = $this->db->query($sql);
1724
1725 dol_syslog(get_class($this)."::setstatus", LOG_DEBUG);
1726 if ($result) {
1727 // Call trigger
1728 $result = $this->call_trigger('CONTACT_ENABLEDISABLE', $user);
1729 if ($result < 0) {
1730 $error++;
1731 }
1732 // End call triggers
1733 }
1734
1735 if ($error) {
1736 $this->db->rollback();
1737 return -$error;
1738 } else {
1739 $this->db->commit();
1740 return 1;
1741 }
1742 }
1743
1754 public function setCategories($categories)
1755 {
1756 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1757 return parent::setCategoriesCommon($categories, Categorie::TYPE_CONTACT);
1758 }
1759
1768 public static function replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
1769 {
1770 $tables = array(
1771 'socpeople', 'societe_contacts'
1772 );
1773
1774 return CommonObject::commonReplaceThirdparty($dbs, $origin_id, $dest_id, $tables);
1775 }
1776
1784 public function fetchRoles()
1785 {
1786 global $langs;
1787 $error = 0;
1788 $num = 0;
1789
1790 $sql = "SELECT tc.rowid, tc.element, tc.source, tc.code, tc.libelle as label, sc.rowid as contactroleid, sc.fk_soc as socid";
1791 $sql .= " FROM ".MAIN_DB_PREFIX."societe_contacts as sc, ".MAIN_DB_PREFIX."c_type_contact as tc";
1792 $sql .= " WHERE tc.rowid = sc.fk_c_type_contact";
1793 $sql .= " AND tc.source = 'external' AND tc.active=1";
1794 $sql .= " AND sc.fk_socpeople = ".((int) $this->id);
1795 $sql .= " AND sc.entity IN (".getEntity('societe').')';
1796
1797 $resql = $this->db->query($sql);
1798 if ($resql) {
1799 $this->roles = array();
1800
1801 $num = $this->db->num_rows($resql);
1802 if ($num > 0) {
1803 while ($obj = $this->db->fetch_object($resql)) {
1804 $transkey = "TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1805 $libelle_element = $langs->trans('ContactDefault_'.$obj->element);
1806 $this->roles[$obj->contactroleid] = array('id' => $obj->rowid, 'socid' => $obj->socid, 'element' => $obj->element, 'source' => $obj->source, 'code' => $obj->code, 'label' => $libelle_element.' - '.($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->label));
1807 }
1808 }
1809 } else {
1810 $error++;
1811 $this->error = $this->db->lasterror();
1812 $this->errors[] = $this->db->lasterror();
1813 }
1814
1815 if (empty($error)) {
1816 return $num;
1817 } else {
1818 return $error * -1;
1819 }
1820 }
1821
1829 public function getContactRoles($element = '')
1830 {
1831 $tab = array();
1832
1833 if ($element == 'action') {
1834 $element = 'agenda';
1835 }
1836
1837 $sql = "SELECT sc.fk_socpeople as id, sc.fk_c_type_contact";
1838 $sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1839 $sql .= ", ".MAIN_DB_PREFIX."societe_contacts sc";
1840 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."socpeople sp";
1841 $sql .= " ON sc.fk_socpeople = sp.rowid AND sp.statut = 1";
1842 $sql .= " WHERE sc.fk_soc =".((int) $this->socid);
1843 $sql .= " AND sc.fk_c_type_contact=tc.rowid";
1844 $sql .= " AND tc.element = '".$this->db->escape($element)."'";
1845 $sql .= " AND sp.entity IN (".getEntity('contact').")";
1846 $sql .= " AND tc.active = 1";
1847
1848 dol_syslog(__METHOD__, LOG_DEBUG);
1849 $resql = $this->db->query($sql);
1850 if ($resql) {
1851 $num = $this->db->num_rows($resql);
1852 $i = 0;
1853 while ($i < $num) {
1854 $obj = $this->db->fetch_object($resql);
1855 $tab[] = array('fk_socpeople' => $obj->id, 'type_contact' => $obj->fk_c_type_contact);
1856
1857 $i++;
1858 }
1859
1860 return $tab;
1861 } else {
1862 $this->error = $this->db->error();
1863 dol_print_error($this->db);
1864 return -1;
1865 }
1866 }
1867
1875 public function updateRoles()
1876 {
1877 global $conf;
1878
1879 $error = 0;
1880
1881 if (!isset($this->roles)) {
1882 return 0; // Avoid to loose roles when property not set
1883 }
1884
1885 $this->db->begin();
1886
1887 $sql = "DELETE FROM ".MAIN_DB_PREFIX."societe_contacts WHERE fk_socpeople=".((int) $this->id)." AND entity IN (".getEntity("contact").")";
1888
1889 $result = $this->db->query($sql);
1890 if (!$result) {
1891 $this->errors[] = $this->db->lasterror().' sql='.$sql;
1892 $error++;
1893 } else {
1894 if (count($this->roles) > 0) {
1895 foreach ($this->roles as $keyRoles => $valRoles) {
1896 $idrole = 0;
1897 if (is_array($valRoles)) {
1898 $idrole = $valRoles['id'];
1899 } else {
1900 $idrole = $valRoles;
1901 }
1902
1903 $socid = 0;
1904 if (is_array($valRoles)) {
1905 $socid = $valRoles['socid'];
1906 } else {
1907 $socid = $this->socid;
1908 }
1909
1910 if ($socid > 0) {
1911 $sql = "INSERT INTO ".MAIN_DB_PREFIX."societe_contacts";
1912 $sql .= " (entity,";
1913 $sql .= "date_creation,";
1914 $sql .= "fk_soc,";
1915 $sql .= "fk_c_type_contact,";
1916 $sql .= "fk_socpeople) ";
1917 $sql .= " VALUES (".$conf->entity.",";
1918 $sql .= "'".$this->db->idate(dol_now())."',";
1919 $sql .= $socid.", ";
1920 $sql .= $idrole." , ";
1921 $sql .= $this->id;
1922 $sql .= ")";
1923
1924 $result = $this->db->query($sql);
1925 if (!$result) {
1926 $this->errors[] = $this->db->lasterror().' sql='.$sql;
1927 $error++;
1928 }
1929 }
1930 }
1931 }
1932 }
1933 if (empty($error)) {
1934 $this->db->commit();
1935 return 1;
1936 } else {
1937 $this->error = implode(' ', $this->errors);
1938 $this->db->rollback();
1939 return $error * -1;
1940 }
1941 }
1942
1949 public function loadCacheOfProspStatus($active = 1)
1950 {
1951 global $langs;
1952
1953 $sql = "SELECT id, code, libelle as label, picto FROM ".MAIN_DB_PREFIX."c_stcommcontact";
1954 if ($active >= 0) {
1955 $sql .= " WHERE active = ".((int) $active);
1956 }
1957 $resql = $this->db->query($sql);
1958 $num = $this->db->num_rows($resql);
1959 $i = 0;
1960 while ($i < $num) {
1961 $obj = $this->db->fetch_object($resql);
1962 $this->cacheprospectstatus[$obj->id] = array('id' => $obj->id, 'code' => $obj->code, 'label' => ($langs->trans("ST_".strtoupper($obj->code)) == "ST_".strtoupper($obj->code)) ? $obj->label : $langs->trans("ST_".strtoupper($obj->code)), 'picto' => $obj->picto);
1963 $i++;
1964 }
1965 return 1;
1966 }
1967
1973 public function getLibProspLevel()
1974 {
1975 return $this->libProspLevel($this->fk_prospectlevel);
1976 }
1977
1984 public function libProspLevel($fk_prospectlevel)
1985 {
1986 global $langs;
1987
1988 $lib = $langs->trans("ProspectLevel".$fk_prospectlevel);
1989 // If lib not found in language file, we get label from cache/database
1990 if ($lib == "ProspectLevel".$fk_prospectlevel) {
1991 $lib = $langs->getLabelFromKey($this->db, $fk_prospectlevel, 'c_prospectlevel', 'code', 'label');
1992 }
1993 return $lib;
1994 }
1995
1996
2004 public function setProspectLevel(User $user)
2005 {
2006 return $this->update($this->id, $user);
2007 }
2008
2016 public function getLibProspCommStatut($mode = 0, $label = '')
2017 {
2018 return $this->libProspCommStatut($this->stcomm_id, $mode, $label, $this->stcomm_picto);
2019 }
2020
2034 public function libProspCommStatut($statut, $mode = 0, $label = '', $picto = '')
2035 {
2036 global $langs;
2037 $langs->load('customers');
2038
2039 if ($mode == 2) {
2040 if ($statut == '-1' || $statut == 'ST_NO') {
2041 return img_action($langs->trans("StatusProspect-1"), -1, $picto).' '.$langs->trans("StatusProspect-1");
2042 } elseif ($statut == '0' || $statut == 'ST_NEVER') {
2043 return img_action($langs->trans("StatusProspect0"), 0, $picto).' '.$langs->trans("StatusProspect0");
2044 } elseif ($statut == '1' || $statut == 'ST_TODO') {
2045 return img_action($langs->trans("StatusProspect1"), 1, $picto).' '.$langs->trans("StatusProspect1");
2046 } elseif ($statut == '2' || $statut == 'ST_PEND') {
2047 return img_action($langs->trans("StatusProspect2"), 2, $picto).' '.$langs->trans("StatusProspect2");
2048 } elseif ($statut == '3' || $statut == 'ST_DONE') {
2049 return img_action($langs->trans("StatusProspect3"), 3, $picto).' '.$langs->trans("StatusProspect3");
2050 } else {
2051 return img_action(($langs->trans("StatusProspect".$statut) != "StatusProspect".$statut) ? $langs->trans("StatusProspect".$statut) : $label, 0, $picto).' '.(($langs->trans("StatusProspect".$statut) != "StatusProspect".$statut) ? $langs->trans("StatusProspect".$statut) : $label);
2052 }
2053 }
2054 if ($mode == 3) {
2055 if ($statut == '-1' || $statut == 'ST_NO') {
2056 return img_action($langs->trans("StatusProspect-1"), -1, $picto);
2057 } elseif ($statut == '0' || $statut == 'ST_NEVER') {
2058 return img_action($langs->trans("StatusProspect0"), 0, $picto);
2059 } elseif ($statut == '1' || $statut == 'ST_TODO') {
2060 return img_action($langs->trans("StatusProspect1"), 1, $picto);
2061 } elseif ($statut == '2' || $statut == 'ST_PEND') {
2062 return img_action($langs->trans("StatusProspect2"), 2, $picto);
2063 } elseif ($statut == '3' || $statut == 'ST_DONE') {
2064 return img_action($langs->trans("StatusProspect3"), 3, $picto);
2065 } else {
2066 return img_action(($langs->trans("StatusProspect".$statut) != "StatusProspect".$statut) ? $langs->trans("StatusProspect".$statut) : $label, 0, $picto);
2067 }
2068 }
2069 if ($mode == 4) {
2070 if ($statut == '-1' || $statut == 'ST_NO') {
2071 return img_action($langs->trans("StatusProspect-1"), -1, $picto).' '.$langs->trans("StatusProspect-1");
2072 } elseif ($statut == '0' || $statut == 'ST_NEVER') {
2073 return img_action($langs->trans("StatusProspect0"), 0, $picto).' '.$langs->trans("StatusProspect0");
2074 } elseif ($statut == '1' || $statut == 'ST_TODO') {
2075 return img_action($langs->trans("StatusProspect1"), 1, $picto).' '.$langs->trans("StatusProspect1");
2076 } elseif ($statut == '2' || $statut == 'ST_PEND') {
2077 return img_action($langs->trans("StatusProspect2"), 2, $picto).' '.$langs->trans("StatusProspect2");
2078 } elseif ($statut == '3' || $statut == 'ST_DONE') {
2079 return img_action($langs->trans("StatusProspect3"), 3, $picto).' '.$langs->trans("StatusProspect3");
2080 } else {
2081 return img_action(($langs->trans("StatusProspect".$statut) != "StatusProspect".$statut) ? $langs->trans("StatusProspect".$statut) : $label, 0, $picto).' '.(($langs->trans("StatusProspect".$statut) != "StatusProspect".$statut) ? $langs->trans("StatusProspect".$statut) : $label);
2082 }
2083 }
2084
2085 return "Error, mode/status not found";
2086 }
2087
2088
2095 public function setNoEmail($no_email)
2096 {
2097 $error = 0;
2098
2099 // Update mass emailing flag into table mailing_unsubscribe
2100 if ($this->email) {
2101 $this->db->begin();
2102
2103 if ($no_email) {
2104 $sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."mailing_unsubscribe WHERE entity IN (".getEntity('mailing', 0).") AND email = '".$this->db->escape($this->email)."'";
2105 $resql = $this->db->query($sql);
2106 if ($resql) {
2107 $obj = $this->db->fetch_object($resql);
2108 $noemail = $obj->nb;
2109 if (empty($noemail)) {
2110 $sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_unsubscribe(email, entity, date_creat) VALUES ('".$this->db->escape($this->email)."', ".getEntity('mailing', 0).", '".$this->db->idate(dol_now())."')";
2111 $resql = $this->db->query($sql);
2112 if (!$resql) {
2113 $error++;
2114 $this->error = $this->db->lasterror();
2115 $this->errors[] = $this->error;
2116 }
2117 }
2118 } else {
2119 $error++;
2120 $this->error = $this->db->lasterror();
2121 $this->errors[] = $this->error;
2122 }
2123 } else {
2124 $sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_unsubscribe WHERE email = '".$this->db->escape($this->email)."' AND entity IN (".getEntity('mailing', 0).")";
2125 $resql = $this->db->query($sql);
2126 if (!$resql) {
2127 $error++;
2128 $this->error = $this->db->lasterror();
2129 $this->errors[] = $this->error;
2130 }
2131 }
2132
2133 if (empty($error)) {
2134 $this->no_email = $no_email;
2135 $this->db->commit();
2136 return 1;
2137 } else {
2138 $this->db->rollback();
2139 return $error * -1;
2140 }
2141 }
2142
2143 return 0;
2144 }
2145
2152 public function getNoEmail()
2153 {
2154 if ($this->email) {
2155 $sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."mailing_unsubscribe WHERE entity IN (".getEntity('mailing').") AND email = '".$this->db->escape($this->email)."'";
2156 $resql = $this->db->query($sql);
2157 if ($resql) {
2158 $obj = $this->db->fetch_object($resql);
2159 $this->no_email = $obj->nb;
2160 return 1;
2161 } else {
2162 $this->error = $this->db->lasterror();
2163 $this->errors[] = $this->error;
2164 return -1;
2165 }
2166 }
2167 return 0;
2168 }
2169
2170
2178 public function getKanbanView($option = '', $arraydata = null)
2179 {
2180 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
2181
2182 $return = '<div class="box-flex-item box-flex-grow-zero">';
2183 $return .= '<div class="info-box info-box-sm">';
2184 $return .= '<span class="info-box-icon bg-infobox-action">';
2185 //var_dump($this->photo);exit;
2186 if (property_exists($this, 'photo') && !is_null($this->photo)) {
2187 $return .= Form::showphoto('contact', $this, 0, 60, 0, 'photokanban photoref photowithmargin photologintooltip', 'small', 0, 1);
2188 } else {
2189 $return .= img_picto('', $this->picto);
2190 }
2191 $return .= '</span>';
2192 $return .= '<div class="info-box-content">';
2193 $return .= '<div class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(0) : $this->ref).'</div>';
2194 if ($selected >= 0) {
2195 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
2196 }
2197 if (property_exists($this, 'thirdparty') && is_object($this->thirdparty)) {
2198 $return .= '<div class="info-box-ref tdoverflowmax150">'.$this->thirdparty->getNomUrl(1).'</div>';
2199 }
2200 /*if (property_exists($this, 'phone_pro') && !empty($this->phone_pro)) {
2201 $return .= '<br>'.img_picto($langs->trans("Phone"), 'phone');
2202 $return .= ' <span class="info-box-label">'.$this->phone_pro.'</span>';
2203 }*/
2204 /*if (method_exists($this, 'LibPubPriv')) {
2205 $return .= '<br><span class="info-box-label opacitymedium">'.$langs->trans("Visibility").'</span>';
2206 $return .= '<span> : '.$this->LibPubPriv($this->priv).'</span>';
2207 }*/
2208 if (method_exists($this, 'getLibStatut')) {
2209 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
2210 }
2211 $return .= '</div>';
2212 $return .= '</div>';
2213 $return .= '</div>';
2214 return $return;
2215 }
2216}
$object ref
Definition info.php:79
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage contact/addresses.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
__construct($db)
Constructor.
update_perso($id, $user=null, $notrigger=0)
Update field alert birthday.
getLibProspCommStatut($mode=0, $label='')
Return status of prospect.
create($user, $notrigger=0)
Add a contact into database.
loadStateBoard()
Load indicators into this->nb for board.
getNomUrl($withpicto=0, $option='', $maxlen=0, $moreparam='', $save_lastsearch_value=-1, $notooltip=0, $morecss='')
Return name of contact with link (and eventually picto) Use $this->id, $this->lastname,...
getNoEmail()
get "blacklist" mailing status set no_email attribute to 1 or 0
getNbOfEMailings()
Return number of mass Emailing received by these contacts with its email.
libProspCommStatut($statut, $mode=0, $label='', $picto='')
Return label of a given status.
getTooltipContentArray($params)
getTooltipContentArray
libProspLevel($fk_prospectlevel)
Return label of prospect level.
getCivilityLabel()
Return civility label of contact.
fetch($id, $user=null, $ref_ext='', $email='', $loadalsoroles=0)
Load object contact.
setProspectLevel(User $user)
Set prospect level.
getKanbanView($option='', $arraydata=null)
Return clickable link of object (with eventually picto)
load_ref_elements()
Load number of elements the contact is used as a link for ref_facturation ref_contrat ref_commande (f...
getLibProspLevel()
Return prospect level.
fetchRoles()
Fetch roles (default contact of some companies) for the current contact.
getContactRoles($element='')
Get thirdparty contact roles of a given contact.
_load_ldap_dn($info, $mode=0)
Return DN string complete in the LDAP directory for the object.
LibStatut($status, $mode)
Return the label of a given status.
setGenderFromCivility()
Set the property "gender" of this class, based on the property "civility_id" or use property "civilit...
update($id, $user=null, $notrigger=0, $action='update', $nosyncuser=0)
Update information into database.
setstatus($status)
Change status of a user.
loadCacheOfProspStatus($active=1)
Load array of prospect status.
_load_ldap_info()
Initialize info table (LDAP attributes table)
updateRoles()
Updates all roles (default contact for companies) according to values inside the ->roles array.
info($id)
Load contact information from the database.
initAsSpecimen()
Initialise an instance with random values.
getLibStatut($mode)
Return the label of the status.
setNoEmail($no_email)
Set "blacklist" mailing status.
LibPubPriv($status)
Return translated label of Public or Private.
setCategories($categories)
Sets object to supplied categories.
Class to manage Dolibarr database access.
static showphoto($modulepart, $object, $width=100, $height=0, $caneditfield=0, $cssclass='photowithmargin', $imagesize='', $addlinktofullsize=1, $cache=0, $forcecapture='', $noexternsourceoverwrite=0)
Return HTML code to output a photo.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
trait CommonPeople
Support class for thirdparties, contacts, members, users or resources.
getFullName($langs, $option=0, $nameorder=-1, $maxlen=0)
Return full name (civility+' '+name+' '+lastname)
setUpperOrLowerCase()
Set to upper or ucwords/lower if needed.
trait CommonSocialNetworks
Superclass for social networks.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ="&nbsp;", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='')
Format phone numbers according to country.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_format_address($object, $withcountry=0, $sep="\n", $outputlangs=null, $mode=0, $extralangcode='')
Return a formatted address (part address/zip/town/state) according to country rules.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
img_action($titlealt, $numaction, $picto='', $moreatt='')
Show logo action.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition repair.php:142
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut
Definition invoice.php:1929