dolibarr  18.0.6
card.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2004-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
5  * Copyright (C) 2005-2017 Regis Houssin <regis.houssin@inodbox.com>
6  * Copyright (C) 2007 Franky Van Liedekerke <franky.van.liedekerke@telenet.be>
7  * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
8  * Copyright (C) 2013-2016 Alexandre Spangaro <aspangaro@open-dsi.fr>
9  * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
10  * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
11  * Copyright (C) 2018-2023 Frédéric France <frederic.france@netlogic.fr>
12  * Copyright (C) 2019 Josep Lluís Amador <joseplluis@lliuretic.cat>
13  * Copyright (C) 2020 Open-Dsi <support@open-dsi.fr>
14  *
15  * This program is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 3 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program. If not, see <https://www.gnu.org/licenses/>.
27  */
28 
36 // Load Dolibarr environment
37 require '../main.inc.php';
38 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
39 require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
40 require_once DOL_DOCUMENT_ROOT.'/core/lib/contact.lib.php';
41 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
42 require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
43 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
44 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
45 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
46 require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
47 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
48 require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
49 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
50 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
51 
52 // Load translation files required by the page
53 $langs->loadLangs(array('companies', 'users', 'other', 'commercial'));
54 
55 $mesg = ''; $error = 0; $errors = array();
56 
57 // Get parameters
58 $action = (GETPOST('action', 'alpha') ? GETPOST('action', 'alpha') : 'view');
59 $confirm = GETPOST('confirm', 'alpha');
60 $backtopage = GETPOST('backtopage', 'alpha');
61 $cancel = GETPOST('cancel', 'alpha');
62 $id = GETPOST('id', 'int');
63 $socid = GETPOST('socid', 'int');
64 
65 // Initialize technical object
66 $object = new Contact($db);
67 $extrafields = new ExtraFields($db);
68 
69 // fetch optionals attributes and labels
70 $extrafields->fetch_name_optionals_label($object->table_element);
71 
72 $socialnetworks = getArrayOfSocialNetworks();
73 
74 // Get object canvas (By default, this is not defined, so standard usage of dolibarr)
75 $object->getCanvas($id);
76 $objcanvas = null;
77 $canvas = (!empty($object->canvas) ? $object->canvas : GETPOST("canvas"));
78 if (!empty($canvas)) {
79  require_once DOL_DOCUMENT_ROOT.'/core/class/canvas.class.php';
80  $objcanvas = new Canvas($db, $action);
81  $objcanvas->getCanvas('contact', 'contactcard', $canvas);
82 }
83 
84 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
85 $hookmanager->initHooks(array('contactcard', 'globalcard'));
86 
87 if ($id > 0) {
88  $object->fetch($id);
89  $object->info($id);
90 }
91 
92 if (!($object->id > 0) && $action == 'view') {
93  $langs->load("errors");
94  print($langs->trans('ErrorRecordNotFound'));
95  exit;
96 }
97 
98 $triggermodname = 'CONTACT_MODIFY';
99 $permissiontoadd = $user->hasRight('societe', 'contact', 'creer');
100 
101 // Security check
102 if ($user->socid) {
103  $socid = $user->socid;
104 }
105 if ($object->priv && $object->user_creation->id != $user->id) {
106  accessforbidden();
107 }
108 $result = restrictedArea($user, 'contact', $id, 'socpeople&societe', '', '', 'rowid', 0); // If we create a contact with no company (shared contacts), no check on write permission
109 
110 
111 /*
112  * Actions
113  */
114 
115 $parameters = array('id'=>$id, 'objcanvas'=>$objcanvas);
116 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
117 if ($reshook < 0) {
118  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
119 }
120 
121 if (empty($reshook)) {
122  $backurlforlist = DOL_URL_ROOT.'/contact/list.php';
123 
124  if (empty($backtopage) || ($cancel && empty($id))) {
125  if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
126  if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
127  $backtopage = $backurlforlist;
128  } else {
129  $backtopage = DOL_URL_ROOT.'/contact/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
130  }
131  }
132  }
133 
134  if ($cancel) {
135  if (!empty($backtopageforcancel)) {
136  header("Location: ".$backtopageforcancel);
137  exit;
138  } elseif (!empty($backtopage)) {
139  header("Location: ".$backtopage);
140  exit;
141  }
142  $action = '';
143  }
144 
145  // Creation utilisateur depuis contact
146  if ($action == 'confirm_create_user' && $confirm == 'yes' && $user->hasRight('user', 'user', 'creer')) {
147  // Recuperation contact actuel
148  $result = $object->fetch($id);
149 
150  if ($result > 0) {
151  $db->begin();
152 
153  // Creation user
154  $nuser = new User($db);
155  $result = $nuser->create_from_contact($object, GETPOST("login")); // Do not use GETPOST(alpha)
156 
157  if ($result > 0) {
158  $result2 = $nuser->setPassword($user, GETPOST("password"), 0, 0, 1); // Do not use GETPOST(alpha)
159  if (is_int($result2) && $result2 < 0) {
160  $error = $nuser->error; $errors = $nuser->errors;
161  $db->rollback();
162  } else {
163  $db->commit();
164  }
165  } else {
166  $error = $nuser->error; $errors = $nuser->errors;
167  $db->rollback();
168  }
169  } else {
170  $error = $object->error; $errors = $object->errors;
171  }
172  }
173 
174 
175  // Confirmation desactivation
176  if ($action == 'disable' && !empty($permissiontoadd)) {
177  $object->fetch($id);
178  if ($object->setstatus(0) < 0) {
179  setEventMessages($object->error, $object->errors, 'errors');
180  } else {
181  header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
182  exit;
183  }
184  }
185 
186  // Confirmation activation
187  if ($action == 'enable' && !empty($permissiontoadd)) {
188  $object->fetch($id);
189  if ($object->setstatus(1) < 0) {
190  setEventMessages($object->error, $object->errors, 'errors');
191  } else {
192  header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
193  exit;
194  }
195  }
196 
197  // Add contact
198  if ($action == 'add' && !empty($permissiontoadd)) {
199  $db->begin();
200 
201  if ($canvas) {
202  $object->canvas = $canvas;
203  }
204 
205  $object->entity = (GETPOSTISSET('entity') ?GETPOST('entity', 'int') : $conf->entity);
206  $object->socid = GETPOST("socid", 'int');
207  $object->lastname = (string) GETPOST("lastname", 'alpha');
208  $object->firstname = (string) GETPOST("firstname", 'alpha');
209  $object->civility_code = (string) GETPOST("civility_code", 'alpha');
210  $object->poste = (string) GETPOST("poste", 'alpha');
211  $object->address = (string) GETPOST("address", 'alpha');
212  $object->zip = (string) GETPOST("zipcode", 'alpha');
213  $object->town = (string) GETPOST("town", 'alpha');
214  $object->country_id = (int) GETPOST("country_id", 'int');
215  $object->state_id = (int) GETPOST("state_id", 'int');
216  $object->socialnetworks = array();
217  if (isModEnabled('socialnetworks')) {
218  foreach ($socialnetworks as $key => $value) {
219  if (GETPOSTISSET($key) && GETPOST($key, 'alphanohtml') != '') {
220  $object->socialnetworks[$key] = (string) GETPOST($key, 'alphanohtml');
221  }
222  }
223  }
224  $object->email = (string) GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL);
225  $object->no_email = GETPOST("no_email", "int");
226  $object->phone_pro = (string) GETPOST("phone_pro", 'alpha');
227  $object->phone_perso = (string) GETPOST("phone_perso", 'alpha');
228  $object->phone_mobile = (string) GETPOST("phone_mobile", 'alpha');
229  $object->fax = (string) GETPOST("fax", 'alpha');
230  $object->priv = GETPOST("priv", 'int');
231  $object->note_public = (string) GETPOST("note_public", 'restricthtml');
232  $object->note_private = (string) GETPOST("note_private", 'restricthtml');
233  $object->roles = GETPOST("roles", 'array');
234 
235  $object->statut = 1; //Default status to Actif
236 
237  // Note: Correct date should be completed with location to have exact GM time of birth.
238  $object->birthday = dol_mktime(0, 0, 0, GETPOST("birthdaymonth", 'int'), GETPOST("birthdayday", 'int'), GETPOST("birthdayyear", 'int'));
239  $object->birthday_alert = GETPOST("birthday_alert", 'alpha');
240 
241  //Default language
242  $object->default_lang = GETPOST('default_lang');
243 
244  // Fill array 'array_options' with data from add form
245  $ret = $extrafields->setOptionalsFromPost(null, $object);
246  if ($ret < 0) {
247  $error++;
248  $action = 'create';
249  }
250 
251  if (isModEnabled('mailing') && getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2 && $object->no_email == -1 && !empty($object->email)) {
252  $error++;
253  $errors[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("No_Email"));
254  $action = 'create';
255  }
256 
257  if (!empty($object->email) && !isValidEMail($object->email)) {
258  $langs->load("errors");
259  $error++;
260  $errors[] = $langs->trans("ErrorBadEMail", GETPOST('email', 'alpha'));
261  $action = 'create';
262  }
263 
264  if (empty($object->lastname)) {
265  $error++;
266  $errors[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Lastname").' / '.$langs->transnoentities("Label"));
267  $action = 'create';
268  }
269 
270  if (empty($error)) {
271  $id = $object->create($user);
272  if ($id <= 0) {
273  $error++;
274  $errors = array_merge($errors, ($object->error ? array($object->error) : $object->errors));
275  $action = 'create';
276  }
277  }
278 
279  if (empty($error)) {
280  // Categories association
281  $contcats = GETPOST('contcats', 'array');
282  if (count($contcats) > 0) {
283  $result = $object->setCategories($contcats);
284  if ($result <= 0) {
285  $error++;
286  $errors = array_merge($errors, ($object->error ? array($object->error) : $object->errors));
287  $action = 'create';
288  }
289  }
290  }
291 
292  if (empty($error) && isModEnabled('mailing') && !empty($object->email)) {
293  // Add mass emailing flag into table mailing_unsubscribe
294  $result = $object->setNoEmail($object->no_email);
295  if ($result < 0) {
296  $error++;
297  $errors = array_merge($errors, ($object->error ? array($object->error) : $object->errors));
298  $action = 'create';
299  }
300  }
301 
302  if (empty($error) && $id > 0) {
303  $db->commit();
304  if (!empty($backtopage)) {
305  $url = str_replace('__ID__', $id, $backtopage);
306  } else {
307  $url = 'card.php?id='.$id;
308  }
309  header("Location: ".$url);
310  exit;
311  } else {
312  $db->rollback();
313  }
314  }
315 
316  if ($action == 'confirm_delete' && $confirm == 'yes' && $user->hasRight('societe', 'contact', 'supprimer')) {
317  $result = $object->fetch($id);
318  $object->oldcopy = clone $object;
319 
320  $result = $object->delete(); // TODO Add $user as first param
321  if ($result > 0) {
322  setEventMessages("RecordDeleted", null, 'mesgs');
323  if ($backurlforlist) {
324  header("Location: ".$backurlforlist);
325  exit;
326  } else {
327  header("Location: ".DOL_URL_ROOT.'/contact/list.php');
328  exit;
329  }
330  } else {
331  setEventMessages($object->error, $object->errors, 'errors');
332  }
333  }
334 
335  if ($action == 'update' && empty($cancel) && !empty($permissiontoadd)) {
336  if (!GETPOST("lastname", 'alpha')) {
337  $error++; $errors = array($langs->trans("ErrorFieldRequired", $langs->transnoentities("Name").' / '.$langs->transnoentities("Label")));
338  $action = 'edit';
339  }
340 
341  if (isModEnabled('mailing') && getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2 && GETPOST("no_email", "int") == -1 && !empty(GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL))) {
342  $error++;
343  $errors[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("No_Email"));
344  $action = 'edit';
345  }
346 
347  if (!empty(GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL)) && !isValidEMail(GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL))) {
348  $langs->load("errors");
349  $error++;
350  $errors[] = $langs->trans("ErrorBadEMail", GETPOST('email', 'alpha'));
351  $action = 'edit';
352  }
353 
354  if (!$error) {
355  $contactid = GETPOST("contactid", 'int');
356  $object->fetch($contactid);
357  $object->fetchRoles();
358 
359  // Photo save
360  $dir = $conf->societe->multidir_output[$object->entity]."/contact/".$object->id."/photos";
361  $file_OK = is_uploaded_file($_FILES['photo']['tmp_name']);
362  if (GETPOST('deletephoto') && $object->photo) {
363  $fileimg = $dir.'/'.$object->photo;
364  $dirthumbs = $dir.'/thumbs';
365  dol_delete_file($fileimg);
366  dol_delete_dir_recursive($dirthumbs);
367  $object->photo = '';
368  }
369  if ($file_OK) {
370  if (image_format_supported($_FILES['photo']['name']) > 0) {
371  dol_mkdir($dir);
372 
373  if (@is_dir($dir)) {
374  $newfile = $dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']);
375  $result = dol_move_uploaded_file($_FILES['photo']['tmp_name'], $newfile, 1);
376 
377  if (!($result > 0)) {
378  $errors[] = "ErrorFailedToSaveFile";
379  } else {
380  $object->photo = dol_sanitizeFileName($_FILES['photo']['name']);
381 
382  // Create thumbs
383  $object->addThumbs($newfile);
384  }
385  }
386  } else {
387  $errors[] = "ErrorBadImageFormat";
388  }
389  } else {
390  switch ($_FILES['photo']['error']) {
391  case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini
392  case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form
393  $errors[] = "ErrorFileSizeTooLarge";
394  break;
395  case 3: //uploaded file was only partially uploaded
396  $errors[] = "ErrorFilePartiallyUploaded";
397  break;
398  }
399  }
400 
401  $object->oldcopy = clone $object;
402 
403  $object->socid = GETPOST("socid", 'int');
404  $object->lastname = (string) GETPOST("lastname", 'alpha');
405  $object->firstname = (string) GETPOST("firstname", 'alpha');
406  $object->civility_code = (string) GETPOST("civility_code", 'alpha');
407  $object->poste = (string) GETPOST("poste", 'alpha');
408 
409  $object->address = (string) GETPOST("address", 'alpha');
410  $object->zip = (string) GETPOST("zipcode", 'alpha');
411  $object->town = (string) GETPOST("town", 'alpha');
412  $object->state_id = GETPOST("state_id", 'int');
413  $object->country_id = GETPOST("country_id", 'int');
414 
415  $object->email = (string) GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL);
416  $object->no_email = GETPOST("no_email", "int");
417  $object->socialnetworks = array();
418  if (isModEnabled('socialnetworks')) {
419  foreach ($socialnetworks as $key => $value) {
420  if (GETPOSTISSET($key) && GETPOST($key, 'alphanohtml') != '') {
421  $object->socialnetworks[$key] = (string) GETPOST($key, 'alphanohtml');
422  }
423  }
424  }
425  $object->phone_pro = (string) GETPOST("phone_pro", 'alpha');
426  $object->phone_perso = (string) GETPOST("phone_perso", 'alpha');
427  $object->phone_mobile = (string) GETPOST("phone_mobile", 'alpha');
428  $object->fax = (string) GETPOST("fax", 'alpha');
429  $object->priv = (string) GETPOST("priv", 'int');
430  $object->note_public = (string) GETPOST("note_public", 'restricthtml');
431  $object->note_private = (string) GETPOST("note_private", 'restricthtml');
432 
433  $object->roles = GETPOST("roles", 'array'); // Note GETPOSTISSET("role") is null when combo is empty
434 
435  //Default language
436  $object->default_lang = GETPOST('default_lang');
437 
438  // Fill array 'array_options' with data from add form
439  $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
440  if ($ret < 0) {
441  $error++;
442  }
443 
444  if (!$error) {
445  $result = $object->update($contactid, $user);
446 
447  if ($result > 0) {
448  // Categories association
449  $categories = GETPOST('contcats', 'array');
450  $object->setCategories($categories);
451 
452  // Update mass emailing flag into table mailing_unsubscribe
453  if (GETPOSTISSET('no_email') && $object->email) {
454  $no_email = GETPOST('no_email', 'int');
455  $result = $object->setNoEmail($no_email);
456  if ($result < 0) {
457  setEventMessages($object->error, $object->errors, 'errors');
458  $action = 'edit';
459  }
460  }
461 
462  $action = 'view';
463  } else {
464  $error++;
465  setEventMessages($object->error, $object->errors, 'errors');
466  $action = 'edit';
467  }
468  }
469  }
470 
471  if (!$error && empty($errors)) {
472  if (!empty($backtopage)) {
473  header("Location: ".$backtopage);
474  exit;
475  }
476  }
477  }
478 
479  if ($action == 'setprospectcontactlevel' && !empty($permissiontoadd)) {
480  $object->fetch($id);
481  $object->fk_prospectlevel = GETPOST('prospect_contact_level_id', 'alpha');
482  $result = $object->update($object->id, $user);
483  if ($result < 0) {
484  setEventMessages($object->error, $object->errors, 'errors');
485  }
486  }
487 
488  // set communication status
489  if ($action == 'setstcomm' && !empty($permissiontoadd)) {
490  $object->fetch($id);
491  $object->stcomm_id = dol_getIdFromCode($db, GETPOST('stcomm', 'alpha'), 'c_stcommcontact');
492  $result = $object->update($object->id, $user);
493  if ($result < 0) {
494  setEventMessages($object->error, $object->errors, 'errors');
495  }
496  }
497 
498  // Update extrafields
499  if ($action == "update_extras" && !empty($permissiontoadd)) {
500  $object->fetch(GETPOST('id', 'int'));
501 
502  $attributekey = GETPOST('attribute', 'alpha');
503  $attributekeylong = 'options_'.$attributekey;
504 
505  if (GETPOSTISSET($attributekeylong.'day') && GETPOSTISSET($attributekeylong.'month') && GETPOSTISSET($attributekeylong.'year')) {
506  // This is properties of a date
507  $object->array_options['options_'.$attributekey] = dol_mktime(GETPOST($attributekeylong.'hour', 'int'), GETPOST($attributekeylong.'min', 'int'), GETPOST($attributekeylong.'sec', 'int'), GETPOST($attributekeylong.'month', 'int'), GETPOST($attributekeylong.'day', 'int'), GETPOST($attributekeylong.'year', 'int'));
508  //var_dump(dol_print_date($object->array_options['options_'.$attributekey]));exit;
509  } else {
510  $object->array_options['options_'.$attributekey] = GETPOST($attributekeylong, 'alpha');
511  }
512 
513  $result = $object->insertExtraFields(empty($triggermodname) ? '' : $triggermodname, $user);
514  if ($result > 0) {
515  setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
516  $action = 'view';
517  } else {
518  setEventMessages($object->error, $object->errors, 'errors');
519  $action = 'edit_extras';
520  }
521  }
522 
523  // Update extrafields
524  if ($action == 'update_extras' && !empty($user->rights->societe->contact->creer)) {
525  $object->oldcopy = dol_clone($object);
526 
527  // Fill array 'array_options' with data from update form
528  $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
529  if ($ret < 0) {
530  $error++;
531  }
532 
533  if (!$error) {
534  $result = $object->insertExtraFields('CONTACT_MODIFY');
535  if ($result < 0) {
536  setEventMessages($object->error, $object->errors, 'errors');
537  $error++;
538  }
539  }
540 
541  if ($error) {
542  $action = 'edit_extras';
543  }
544  }
545 
546  // Actions to send emails
547  $triggersendname = 'CONTACT_SENTBYMAIL';
548  $paramname = 'id';
549  $mode = 'emailfromcontact';
550  include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
551 }
552 
553 
554 /*
555  * View
556  */
557 
558 $form = new Form($db);
559 $formadmin = new FormAdmin($db);
560 $formcompany = new FormCompany($db);
561 
562 $objsoc = new Societe($db);
563 if ($socid > 0) {
564  $objsoc->fetch($socid);
565 }
566 
567 $title = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("Contacts") : $langs->trans("ContactsAddresses"));
568 if (!empty($conf->global->MAIN_HTML_TITLE) && preg_match('/contactnameonly/', $conf->global->MAIN_HTML_TITLE) && $object->lastname) {
569  $title = $object->lastname;
570 }
571 $help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
572 $title = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("NewContact") : $langs->trans("NewContactAddress"));
573 
574 llxHeader('', $title, $help_url);
575 
576 $countrynotdefined = $langs->trans("ErrorSetACountryFirst").' ('.$langs->trans("SeeAbove").')';
577 
578 if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
579  // -----------------------------------------
580  // When used with CANVAS
581  // -----------------------------------------
582  if (empty($object->error) && $id) {
583  $object = new Contact($db);
584  $result = $object->fetch($id);
585  if ($result <= 0) {
586  dol_print_error('', $object->error);
587  }
588  }
589  $objcanvas->assign_values($action, $object->id, $object->ref); // Set value for templates
590  $objcanvas->display_canvas($action); // Show template
591 } else {
592  // -----------------------------------------
593  // When used in standard mode
594  // -----------------------------------------
595 
596  // Confirm deleting contact
597  if ($user->rights->societe->contact->supprimer) {
598  if ($action == 'delete') {
599  print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id.($backtopage ? '&backtopage='.$backtopage : ''), $langs->trans("DeleteContact"), $langs->trans("ConfirmDeleteContact"), "confirm_delete", '', 0, 1);
600  }
601  }
602 
603  /*
604  * Onglets
605  */
606  $head = array();
607  if ($id > 0) {
608  // Si edition contact deja existant
609  $object = new Contact($db);
610  $res = $object->fetch($id, $user);
611  if ($res < 0) {
612  setEventMessages($object->error, $object->errors, 'errors');
613  }
614 
615  $object->fetchRoles();
616 
617  // Show tabs
618  $head = contact_prepare_head($object);
619  }
620 
621  if ($user->rights->societe->contact->creer) {
622  if ($action == 'create') {
623  /*
624  * Fiche en mode creation
625  */
626  $object->canvas = $canvas;
627 
628  $object->state_id = GETPOST("state_id", "int");
629 
630  // We set country_id, country_code and label for the selected country
631  $object->country_id = GETPOST("country_id") ? GETPOST("country_id", "int") : (empty($objsoc->country_id) ? $mysoc->country_id : $objsoc->country_id);
632  if ($object->country_id) {
633  $tmparray = getCountry($object->country_id, 'all');
634  $object->country_code = $tmparray['code'];
635  $object->country = $tmparray['label'];
636  }
637 
638  $linkback = '';
639 
640  print load_fiche_titre($title, $linkback, 'address');
641 
642  // Show errors
643  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
644 
645  if ($conf->use_javascript_ajax) {
646  print "\n".'<script type="text/javascript">'."\n";
647  print 'jQuery(document).ready(function () {
648  jQuery("#selectcountry_id").change(function() {
649  document.formsoc.action.value="create";
650  document.formsoc.submit();
651  });
652 
653  $("#copyaddressfromsoc").click(function() {
654  $(\'textarea[name="address"]\').val("'.dol_escape_js($objsoc->address).'");
655  $(\'input[name="zipcode"]\').val("'.dol_escape_js($objsoc->zip).'");
656  $(\'input[name="town"]\').val("'.dol_escape_js($objsoc->town).'");
657  console.log("Set state_id to '.dol_escape_js($objsoc->state_id).'");
658  $(\'select[name="state_id"]\').val("'.dol_escape_js($objsoc->state_id).'").trigger("change");
659  /* set country at end because it will trigger page refresh */
660  console.log("Set country id to '.dol_escape_js($objsoc->country_id).'");
661  $(\'select[name="country_id"]\').val("'.dol_escape_js($objsoc->country_id).'").trigger("change"); /* trigger required to update select2 components */
662  });
663  })'."\n";
664  print '</script>'."\n";
665  }
666 
667  print '<form method="post" name="formsoc" action="'.$_SERVER["PHP_SELF"].'">';
668  print '<input type="hidden" name="token" value="'.newToken().'">';
669  print '<input type="hidden" name="action" value="add">';
670  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
671  if (!empty($objsoc)) {
672  print '<input type="hidden" name="entity" value="'.$objsoc->entity.'">';
673  }
674 
675  print dol_get_fiche_head($head, 'card', '', 0, '');
676 
677  print '<table class="border centpercent">';
678 
679  // Name
680  print '<tr><td class="titlefieldcreate fieldrequired"><label for="lastname">'.$langs->trans("Lastname").' / '.$langs->trans("Label").'</label></td>';
681  print '<td colspan="3"><input name="lastname" id="lastname" type="text" class="maxwidth100onsmartphone" maxlength="80" value="'.dol_escape_htmltag(GETPOST("lastname", 'alpha') ?GETPOST("lastname", 'alpha') : $object->lastname).'" autofocus="autofocus"></td>';
682  print '</tr>';
683 
684  // Firstname
685  print '<tr>';
686  print '<td><label for="firstname">';
687  print $form->textwithpicto($langs->trans("Firstname"), $langs->trans("KeepEmptyIfGenericAddress")).'</label></td>';
688  print '<td colspan="3"><input name="firstname" id="firstname"type="text" class="maxwidth100onsmartphone" maxlength="80" value="'.dol_escape_htmltag(GETPOST("firstname", 'alpha') ?GETPOST("firstname", 'alpha') : $object->firstname).'"></td>';
689  print '</tr>';
690 
691  // Company
692  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
693  if ($socid > 0) {
694  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td>';
695  print '<td colspan="3" class="maxwidthonsmartphone">';
696  print $objsoc->getNomUrl(1, 'contact');
697  print '</td>';
698  print '<input type="hidden" name="socid" id="socid" value="'.$objsoc->id.'">';
699  print '</td></tr>';
700  } else {
701  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
702  print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company($socid, 'socid', '', 'SelectThirdParty', 0, 0, null, 0, 'minwidth300 maxwidth500 widthcentpercentminusxx');
703  print '</td></tr>';
704  }
705  }
706 
707  // Civility
708  print '<tr><td><label for="civility_code">'.$langs->trans("UserTitle").'</label></td><td colspan="3">';
709  print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", 'alpha') : $object->civility_code, 'civility_code');
710  print '</td></tr>';
711 
712  // Job position
713  print '<tr><td><label for="title">'.$langs->trans("PostOrFunction").'</label></td>';
714  print '<td colspan="3"><input name="poste" id="title" type="text" class="minwidth100" maxlength="255" value="'.dol_escape_htmltag(GETPOSTISSET("poste") ?GETPOST("poste", 'alphanohtml') : $object->poste).'"></td>';
715 
716  $colspan = 3;
717  if ($conf->use_javascript_ajax && $socid > 0) {
718  $colspan = 2;
719  }
720 
721  // Address
722  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->address)) == 0) {
723  $object->address = $objsoc->address; // Predefined with third party
724  }
725  print '<tr><td><label for="address">'.$langs->trans("Address").'</label></td>';
726  print '<td colspan="'.$colspan.'"><textarea class="flat quatrevingtpercent" name="address" id="address" rows="'.ROWS_2.'">'.(GETPOST("address", 'alpha') ?GETPOST("address", 'alpha') : $object->address).'</textarea></td>';
727 
728  if ($conf->use_javascript_ajax && $socid > 0) {
729  $rowspan = 3;
730  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
731  $rowspan++;
732  }
733 
734  print '<td class="valignmiddle center" rowspan="'.$rowspan.'">';
735  print '<a href="#" id="copyaddressfromsoc">'.$langs->trans('CopyAddressFromSoc').'</a>';
736  print '</td>';
737  }
738  print '</tr>';
739 
740  // Zip / Town
741  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->zip)) == 0) {
742  $object->zip = $objsoc->zip; // Predefined with third party
743  }
744  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->town)) == 0) {
745  $object->town = $objsoc->town; // Predefined with third party
746  }
747  print '<tr><td><label for="zipcode">'.$langs->trans("Zip").'</label> / <label for="town">'.$langs->trans("Town").'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
748  print $formcompany->select_ziptown((GETPOST("zipcode", 'alpha') ? GETPOST("zipcode", 'alpha') : $object->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6).'&nbsp;';
749  print $formcompany->select_ziptown((GETPOST("town", 'alpha') ? GETPOST("town", 'alpha') : $object->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
750  print '</td></tr>';
751 
752  // Country
753  print '<tr><td><label for="selectcountry_id">'.$langs->trans("Country").'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
754  print img_picto('', 'globe-americas', 'class="pictofixedwidth"');
755  print $form->select_country((GETPOST("country_id", 'alpha') ? GETPOST("country_id", 'alpha') : $object->country_id), 'country_id');
756  if ($user->admin) {
757  print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
758  }
759  print '</td></tr>';
760 
761  // State
762  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
763  if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && ($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 || $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 2)) {
764  print '<tr><td><label for="state_id">'.$langs->trans('Region-State').'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
765  } else {
766  print '<tr><td><label for="state_id">'.$langs->trans('State').'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
767  }
768 
769  if ($object->country_id) {
770  print img_picto('', 'state', 'class="pictofixedwidth"');
771  print $formcompany->select_state(GETPOST("state_id", 'alpha') ? GETPOST("state_id", 'alpha') : $object->state_id, $object->country_code, 'state_id');
772  } else {
773  print $countrynotdefined;
774  }
775  print '</td></tr>';
776  }
777 
778  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->phone_pro)) == 0) {
779  $object->phone_pro = $objsoc->phone; // Predefined with third party
780  }
781  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->fax)) == 0) {
782  $object->fax = $objsoc->fax; // Predefined with third party
783  }
784 
785  // Phone / Fax
786  print '<tr><td>'.$form->editfieldkey('PhonePro', 'phone_pro', '', $object, 0).'</td>';
787  print '<td>';
788  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
789  print '<input type="text" name="phone_pro" id="phone_pro" class="maxwidth200" value="'.(GETPOSTISSET('phone_pro') ? GETPOST('phone_pro', 'alpha') : $object->phone_pro).'"></td>';
790  if ($conf->browser->layout == 'phone') {
791  print '</tr><tr>';
792  }
793  print '<td>'.$form->editfieldkey('PhonePerso', 'phone_perso', '', $object, 0).'</td>';
794  print '<td>';
795  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
796  print '<input type="text" name="phone_perso" id="phone_perso" class="maxwidth200" value="'.(GETPOSTISSET('phone_perso') ? GETPOST('phone_perso', 'alpha') : $object->phone_perso).'"></td>';
797  print '</tr>';
798 
799  print '<tr><td>'.$form->editfieldkey('PhoneMobile', 'phone_mobile', '', $object, 0).'</td>';
800  print '<td>';
801  print img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"');
802  print '<input type="text" name="phone_mobile" id="phone_mobile" class="maxwidth200" value="'.(GETPOSTISSET('phone_mobile') ? GETPOST('phone_mobile', 'alpha') : $object->phone_mobile).'"></td>';
803  if ($conf->browser->layout == 'phone') {
804  print '</tr><tr>';
805  }
806  print '<td>'.$form->editfieldkey('Fax', 'fax', '', $object, 0).'</td>';
807  print '<td>';
808  print img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"');
809  print '<input type="text" name="fax" id="fax" class="maxwidth200" value="'.(GETPOSTISSET('fax') ? GETPOST('fax', 'alpha') : $object->fax).'"></td>';
810  print '</tr>';
811 
812  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->email)) == 0) {
813  $object->email = $objsoc->email; // Predefined with third party
814  }
815 
816  // Email
817  print '<tr><td>'.$form->editfieldkey('EMail', 'email', '', $object, 0, 'string', '').'</td>';
818  print '<td>';
819  print img_picto('', 'object_email', 'class="pictofixedwidth"');
820  print '<input type="text" name="email" id="email" value="'.(GETPOSTISSET('email') ? GETPOST('email', 'alpha') : $object->email).'"></td>';
821  print '</tr>';
822 
823  // Unsubscribe
824  if (isModEnabled('mailing')) {
825  if ($conf->use_javascript_ajax && getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2) {
826  print "\n".'<script type="text/javascript">'."\n";
827  print '$(document).ready(function () {
828  $("#email").keyup(function() {
829  if ($(this).val()!="") {
830  $(".noemail").addClass("fieldrequired");
831  } else {
832  $(".noemail").removeClass("fieldrequired");
833  }
834  });
835  })'."\n";
836  print '</script>'."\n";
837  }
838  if (!GETPOSTISSET("no_email") && !empty($object->email)) {
839  $result = $object->getNoEmail();
840  if ($result < 0) {
841  setEventMessages($object->error, $object->errors, 'errors');
842  }
843  }
844  print '<tr>';
845  print '<td class="noemail"><label for="no_email">'.$langs->trans("No_Email").'</label></td>';
846  print '<td>';
847  print $form->selectyesno('no_email', (GETPOSTISSET("no_email") ? GETPOST("no_email", 'int') : getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS')), 1, false, (getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2));
848  print '</td>';
849  print '</tr>';
850  }
851 
852  // Social network
853  if (isModEnabled('socialnetworks')) {
854  $object->showSocialNetwork($socialnetworks, ($conf->browser->layout == 'phone' ? 2 : 4));
855  }
856 
857  // Visibility
858  print '<tr><td><label for="priv">'.$langs->trans("ContactVisibility").'</label></td><td colspan="3">';
859  $selectarray = array('0'=>$langs->trans("ContactPublic"), '1'=>$langs->trans("ContactPrivate"));
860  print $form->selectarray('priv', $selectarray, (GETPOST("priv", 'alpha') ?GETPOST("priv", 'alpha') : $object->priv), 0);
861  print '</td></tr>';
862 
863  //Default language
864  if (getDolGlobalInt('MAIN_MULTILANGS')) {
865  print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).'</td><td colspan="3" class="maxwidthonsmartphone">'."\n";
866  print img_picto('', 'language', 'class="pictofixedwidth"').$formadmin->select_language(GETPOST('default_lang', 'alpha') ? GETPOST('default_lang', 'alpha') : ($object->default_lang ? $object->default_lang : ''), 'default_lang', 0, 0, 1, 0, 0, 'maxwidth200onsmartphone');
867  print '</td>';
868  print '</tr>';
869  }
870 
871  // Categories
872  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
873  print '<tr><td>'.$form->editfieldkey('Categories', 'contcats', '', $object, 0).'</td><td colspan="3">';
874  $cate_arbo = $form->select_all_categories(Categorie::TYPE_CONTACT, null, 'parent', null, null, 1);
875  print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('contcats', $cate_arbo, GETPOST('contcats', 'array'), null, null, null, null, '90%');
876  print "</td></tr>";
877  }
878 
879  // Contact by default
880  if (!empty($socid)) {
881  print '<tr><td>'.$langs->trans("ContactByDefaultFor").'</td>';
882  print '<td colspan="3">';
883  $contactType = $object->listeTypeContacts('external', '', 1);
884  print $form->multiselectarray('roles', $contactType, array(), 0, 0, 'minwidth500');
885  print '</td></tr>';
886  }
887 
888  // Other attributes
889  $parameters = array('socid' => $socid, 'objsoc' => $objsoc, 'colspan' => ' colspan="3"', 'cols' => 3, 'colspanvalue' => 3);
890  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
891 
892  print "</table><br>";
893 
894  print '<hr style="margin-bottom: 20px">';
895 
896  // Add personnal information
897  print load_fiche_titre('<div class="comboperso">'.$langs->trans("PersonalInformations").'</div>', '', '');
898 
899  print '<table class="border centpercent">';
900 
901  // Date To Birth
902  print '<tr><td><label for="birthday">'.$langs->trans("DateOfBirth").'</label></td><td>';
903  $form = new Form($db);
904  if ($object->birthday) {
905  print $form->selectDate($object->birthday, 'birthday', 0, 0, 0, "perso", 1, 0);
906  } else {
907  print $form->selectDate('', 'birthday', 0, 0, 1, "perso", 1, 0);
908  }
909  print '</td>';
910 
911  print '<td><label for="birthday_alert">'.$langs->trans("Alert").'</label>: ';
912  if (!empty($object->birthday_alert)) {
913  print '<input type="checkbox" name="birthday_alert" id="birthday_alert" checked>';
914  } else {
915  print '<input type="checkbox" name="birthday_alert" id="birthday_alert">';
916  }
917  print '</td>';
918  print '</tr>';
919 
920  print "</table>";
921 
922  print dol_get_fiche_end();
923 
924  print $form->buttonsSaveCancel("Add");
925 
926  print "</form>";
927  } elseif ($action == 'edit' && !empty($id)) {
928  /*
929  * Fiche en mode edition
930  */
931 
932  // We set country_id, and country_code label of the chosen country
933  if (GETPOSTISSET("country_id") || $object->country_id) {
934  $tmparray = getCountry($object->country_id, 'all');
935  $object->country_code = $tmparray['code'];
936  $object->country = $tmparray['label'];
937  }
938 
939  $objsoc = new Societe($db);
940  $objsoc->fetch($object->socid);
941 
942  // Show errors
943  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
944 
945  if ($conf->use_javascript_ajax) {
946  print "\n".'<script type="text/javascript">'."\n";
947  print 'jQuery(document).ready(function () {
948  jQuery("#selectcountry_id").change(function() {
949  document.formsoc.action.value="edit";
950  document.formsoc.submit();
951  });
952 
953  $("#copyaddressfromsoc").click(function() {
954  $(\'textarea[name="address"]\').val("'.dol_escape_js($objsoc->address).'");
955  $(\'input[name="zipcode"]\').val("'.dol_escape_js($objsoc->zip).'");
956  $(\'input[name="town"]\').val("'.dol_escape_js($objsoc->town).'");
957  console.log("Set state_id to '.dol_escape_js($objsoc->state_id).'");
958  $(\'select[name="state_id"]\').val("'.dol_escape_js($objsoc->state_id).'").trigger("change");
959  /* set country at end because it will trigger page refresh */
960  console.log("Set country id to '.dol_escape_js($objsoc->country_id).'");
961  $(\'select[name="country_id"]\').val("'.dol_escape_js($objsoc->country_id).'").trigger("change"); /* trigger required to update select2 components */
962  });
963  })'."\n";
964  print '</script>'."\n";
965  }
966 
967  print '<form enctype="multipart/form-data" method="post" action="'.$_SERVER["PHP_SELF"].'?id='.$id.'" name="formsoc">';
968  print '<input type="hidden" name="token" value="'.newToken().'">';
969  print '<input type="hidden" name="id" value="'.$id.'">';
970  print '<input type="hidden" name="action" value="update">';
971  print '<input type="hidden" name="contactid" value="'.$object->id.'">';
972  if (!empty($backtopage)) {
973  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
974  }
975 
976  print dol_get_fiche_head($head, 'card', $title, 0, 'contact');
977 
978  print '<table class="border centpercent">';
979 
980  // Ref/ID
981  if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) {
982  print '<tr><td>'.$langs->trans("ID").'</td><td colspan="3">';
983  print $object->ref;
984  print '</td></tr>';
985  }
986 
987  // Lastname
988  print '<tr><td class="titlefieldcreate fieldrequired"><label for="lastname">'.$langs->trans("Lastname").' / '.$langs->trans("Label").'</label></td>';
989  print '<td colspan="3"><input name="lastname" id="lastname" type="text" class="minwidth200" maxlength="80" value="'.(GETPOSTISSET("lastname") ? GETPOST("lastname") : $object->lastname).'" autofocus="autofocus"></td>';
990  print '</tr>';
991  print '<tr>';
992  // Firstname
993  print '<td><label for="firstname">'.$langs->trans("Firstname").'</label></td>';
994  print '<td colspan="3"><input name="firstname" id="firstname" type="text" class="minwidth200" maxlength="80" value="'.(GETPOSTISSET("firstname") ? GETPOST("firstname") : $object->firstname).'"></td>';
995  print '</tr>';
996 
997  // Company
998  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
999  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td>';
1000  print '<td colspan="3" class="maxwidthonsmartphone">';
1001  print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(GETPOST('socid', 'int') ? GETPOST('socid', 'int') : ($object->socid ? $object->socid : -1), 'socid', '', $langs->trans("SelectThirdParty"));
1002  print '</td>';
1003  print '</tr>';
1004  }
1005 
1006  // Civility
1007  print '<tr><td><label for="civility_code">'.$langs->trans("UserTitle").'</label></td><td colspan="3">';
1008  print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", "aZ09") : $object->civility_code, 'civility_code');
1009  print '</td></tr>';
1010 
1011  // Job position
1012  print '<tr><td><label for="title">'.$langs->trans("PostOrFunction").'</label></td>';
1013  print '<td colspan="3"><input name="poste" id="title" type="text" class="minwidth100" maxlength="255" value="'.dol_escape_htmltag(GETPOSTISSET("poste") ? GETPOST("poste", 'alphanohtml') : $object->poste).'"></td></tr>';
1014 
1015  // Address
1016  print '<tr><td><label for="address">'.$langs->trans("Address").'</label></td>';
1017  print '<td colspan="3">';
1018  print '<div class="paddingrightonly valignmiddle inline-block quatrevingtpercent">';
1019  print '<textarea class="flat minwidth200 centpercent" name="address" id="address">'.(GETPOSTISSET("address") ? GETPOST("address", 'alphanohtml') : $object->address).'</textarea>';
1020  print '</div><div class="paddingrightonly valignmiddle inline-block">';
1021  if (!empty($conf->use_javascript_ajax)) {
1022  print '<a href="#" id="copyaddressfromsoc">'.$langs->trans('CopyAddressFromSoc').'</a><br>';
1023  }
1024  print '</div>';
1025  print '</td>';
1026 
1027  // Zip / Town
1028  print '<tr><td><label for="zipcode">'.$langs->trans("Zip").'</label> / <label for="town">'.$langs->trans("Town").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1029  print $formcompany->select_ziptown((GETPOSTISSET("zipcode") ? GETPOST("zipcode") : $object->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6).'&nbsp;';
1030  print $formcompany->select_ziptown((GETPOSTISSET("town") ? GETPOST("town") : $object->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
1031  print '</td></tr>';
1032 
1033  // Country
1034  print '<tr><td><label for="selectcountry_id">'.$langs->trans("Country").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1035  print img_picto('', 'globe-americas', 'class="pictofixedwidth"');
1036  print $form->select_country(GETPOSTISSET("country_id") ? GETPOST("country_id") : $object->country_id, 'country_id');
1037  if ($user->admin) {
1038  print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1039  }
1040  print '</td></tr>';
1041 
1042  // State
1043  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
1044  if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && ($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 || $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 2)) {
1045  print '<tr><td><label for="state_id">'.$langs->trans('Region-State').'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1046  } else {
1047  print '<tr><td><label for="state_id">'.$langs->trans('State').'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1048  }
1049 
1050  print img_picto('', 'state', 'class="pictofixedwidth"');
1051  print $formcompany->select_state(GETPOSTISSET('state_id') ? GETPOST('state_id', 'alpha') : $object->state_id, $object->country_code, 'state_id');
1052  print '</td></tr>';
1053  }
1054 
1055  // Phone
1056  print '<tr><td>'.$form->editfieldkey('PhonePro', 'phone_pro', GETPOST('phone_pro', 'alpha'), $object, 0).'</td>';
1057  print '<td>';
1058  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
1059  print '<input type="text" name="phone_pro" id="phone_pro" class="maxwidth200" maxlength="80" value="'.(GETPOSTISSET('phone_pro') ?GETPOST('phone_pro', 'alpha') : $object->phone_pro).'"></td>';
1060  if ($conf->browser->layout == 'phone') {
1061  print '</tr><tr>';
1062  }
1063  print '<td>'.$form->editfieldkey('PhonePerso', 'fax', GETPOST('phone_perso', 'alpha'), $object, 0).'</td>';
1064  print '<td>';
1065  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
1066  print '<input type="text" name="phone_perso" id="phone_perso" class="maxwidth200" maxlength="80" value="'.(GETPOSTISSET('phone_perso') ?GETPOST('phone_perso', 'alpha') : $object->phone_perso).'"></td></tr>';
1067 
1068  print '<tr><td>'.$form->editfieldkey('PhoneMobile', 'phone_mobile', GETPOST('phone_mobile', 'alpha'), $object, 0, 'string', '').'</td>';
1069  print '<td>';
1070  print img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"');
1071  print '<input type="text" name="phone_mobile" id="phone_mobile" class="maxwidth200" maxlength="80" value="'.(GETPOSTISSET('phone_mobile') ?GETPOST('phone_mobile', 'alpha') : $object->phone_mobile).'"></td>';
1072  if ($conf->browser->layout == 'phone') {
1073  print '</tr><tr>';
1074  }
1075  print '<td>'.$form->editfieldkey('Fax', 'fax', GETPOST('fax', 'alpha'), $object, 0).'</td>';
1076  print '<td>';
1077  print img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"');
1078  print '<input type="text" name="fax" id="fax" class="maxwidth200" maxlength="80" value="'.(GETPOSTISSET('phone_fax') ?GETPOST('phone_fax', 'alpha') : $object->fax).'"></td></tr>';
1079 
1080  // EMail
1081  print '<tr><td>'.$form->editfieldkey('EMail', 'email', GETPOST('email', 'alpha'), $object, 0, 'string', '', (!empty($conf->global->SOCIETE_EMAIL_MANDATORY))).'</td>';
1082  print '<td>';
1083  print img_picto('', 'object_email', 'class="pictofixedwidth"');
1084  print '<input type="text" name="email" id="email" class="maxwidth100onsmartphone quatrevingtpercent" value="'.(GETPOSTISSET('email') ?GETPOST('email', 'alpha') : $object->email).'"></td>';
1085  if (isModEnabled('mailing')) {
1086  $langs->load("mails");
1087  print '<td class="nowrap">'.$langs->trans("NbOfEMailingsSend").'</td>';
1088  print '<td>'.$object->getNbOfEMailings().'</td>';
1089  } else {
1090  print '<td colspan="2"></td>';
1091  }
1092  print '</tr>';
1093 
1094  // Unsubscribe
1095  if (isModEnabled('mailing')) {
1096  if ($conf->use_javascript_ajax && getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2) {
1097  print "\n".'<script type="text/javascript">'."\n";
1098 
1099  print '
1100  jQuery(document).ready(function () {
1101  function init_check_no_email(input) {
1102  if (input.val()!="") {
1103  $(".noemail").addClass("fieldrequired");
1104  } else {
1105  $(".noemail").removeClass("fieldrequired");
1106  }
1107  }
1108  $("#email").keyup(function() {
1109  init_check_no_email($(this));
1110  });
1111  init_check_no_email($("#email"));
1112  })'."\n";
1113  print '</script>'."\n";
1114  }
1115  if (!GETPOSTISSET("no_email") && !empty($object->email)) {
1116  $result = $object->getNoEmail();
1117  if ($result < 0) {
1118  setEventMessages($object->error, $object->errors, 'errors');
1119  }
1120  }
1121  print '<tr>';
1122  print '<td class="noemail"><label for="no_email">'.$langs->trans("No_Email").'</label></td>';
1123  print '<td>';
1124  $useempty = (getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2);
1125  print $form->selectyesno('no_email', (GETPOSTISSET("no_email") ? GETPOST("no_email", 'int') : $object->no_email), 1, false, $useempty);
1126  print '</td>';
1127  print '</tr>';
1128  }
1129 
1130  // Social network
1131  if (isModEnabled('socialnetworks')) {
1132  $object->showSocialNetwork($socialnetworks, ($conf->browser->layout == 'phone' ? 2 : 4));
1133  }
1134 
1135  // Visibility
1136  print '<tr><td><label for="priv">'.$langs->trans("ContactVisibility").'</label></td><td colspan="3">';
1137  $selectarray = array('0'=>$langs->trans("ContactPublic"), '1'=>$langs->trans("ContactPrivate"));
1138  print $form->selectarray('priv', $selectarray, $object->priv, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth150');
1139  print '</td></tr>';
1140 
1141  // Default language
1142  if (getDolGlobalInt('MAIN_MULTILANGS')) {
1143  print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).'</td><td colspan="3" class="maxwidthonsmartphone">'."\n";
1144  print img_picto('', 'language', 'class="pictofixedwidth"').$formadmin->select_language(GETPOST('default_lang', 'alpha') ? GETPOST('default_lang', 'alpha') : ($object->default_lang ? $object->default_lang : ''), 'default_lang', 0, 0, 1, 0, 0, 'maxwidth200onsmartphone');
1145  print '</td>';
1146  print '</tr>';
1147  }
1148 
1149  // Note Public
1150  print '<tr><td class="tdtop"><label for="note_public">'.$langs->trans("NotePublic").'</label></td><td colspan="3">';
1151  $doleditor = new DolEditor('note_public', $object->note_public, '', 80, 'dolibarr_notes', 'In', 0, false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PUBLIC) ? 0 : 1, ROWS_3, '90%');
1152  print $doleditor->Create(1);
1153  print '</td></tr>';
1154 
1155  // Note Private
1156  print '<tr><td class="tdtop"><label for="note_private">'.$langs->trans("NotePrivate").'</label></td><td colspan="3">';
1157  $doleditor = new DolEditor('note_private', $object->note_private, '', 80, 'dolibarr_notes', 'In', 0, false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PRIVATE) ? 0 : 1, ROWS_3, '90%');
1158  print $doleditor->Create(1);
1159  print '</td></tr>';
1160 
1161  // Status
1162  print '<tr><td>'.$langs->trans("Status").'</td>';
1163  print '<td colspan="3">';
1164  print $object->getLibStatut(4);
1165  print '</td></tr>';
1166 
1167  // Categories
1168  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
1169  $arrayselected = array();
1170  print '<tr><td>'.$form->editfieldkey('Categories', 'contcats', '', $object, 0).'</td>';
1171  print '<td colspan="3">';
1172  $cate_arbo = $form->select_all_categories(Categorie::TYPE_CONTACT, null, null, null, null, 1);
1173  $c = new Categorie($db);
1174  $cats = $c->containing($object->id, 'contact');
1175  foreach ($cats as $cat) {
1176  $arrayselected[] = $cat->id;
1177  }
1178  print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('contcats', $cate_arbo, $arrayselected, '', 0, '', 0, '90%');
1179  print "</td></tr>";
1180  }
1181 
1182  // Contact by default
1183  if (!empty($object->socid)) {
1184  print '<tr><td>'.$langs->trans("ContactByDefaultFor").'</td>';
1185  print '<td colspan="3">';
1186  print $formcompany->showRoles("roles", $object, 'edit', $object->roles);
1187  print '</td></tr>';
1188  }
1189 
1190  // Other attributes
1191  $parameters = array('colspan' => ' colspan="3"', 'cols'=> '3', 'colspanvalue'=> '3');
1192  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
1193 
1194  $object->load_ref_elements();
1195 
1196  if (isModEnabled('commande')) {
1197  print '<tr><td>'.$langs->trans("ContactForOrders").'</td><td colspan="3">';
1198  print $object->ref_commande ? $object->ref_commande : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyOrder").'</span>');
1199  print '</td></tr>';
1200  }
1201 
1202  if (isModEnabled("propal")) {
1203  print '<tr><td>'.$langs->trans("ContactForProposals").'</td><td colspan="3">';
1204  print $object->ref_propal ? $object->ref_propal : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyProposal").'</span>');
1205  print '</td></tr>';
1206  }
1207 
1208  if (isModEnabled('contrat')) {
1209  print '<tr><td>'.$langs->trans("ContactForContracts").'</td><td colspan="3">';
1210  print $object->ref_contrat ? $object->ref_contrat : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyContract").'</span>');
1211  print '</td></tr>';
1212  }
1213 
1214  if (isModEnabled('facture')) {
1215  print '<tr><td>'.$langs->trans("ContactForInvoices").'</td><td colspan="3">';
1216  print $object->ref_facturation ? $object->ref_facturation : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyInvoice").'</span>');
1217  print '</td></tr>';
1218  }
1219 
1220  // Login Dolibarr
1221  print '<tr><td>'.$langs->trans("DolibarrLogin").'</td><td colspan="3">';
1222  if ($object->user_id) {
1223  $dolibarr_user = new User($db);
1224  $result = $dolibarr_user->fetch($object->user_id);
1225  print $dolibarr_user->getLoginUrl(1);
1226  } else {
1227  print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
1228  }
1229  print '</td></tr>';
1230 
1231  // Photo
1232  print '<tr>';
1233  print '<td>'.$langs->trans("PhotoFile").'</td>';
1234  print '<td colspan="3">';
1235  if ($object->photo) {
1236  print $form->showphoto('contact', $object);
1237  print "<br>\n";
1238  }
1239  print '<table class="nobordernopadding">';
1240  if ($object->photo) {
1241  print '<tr><td><input type="checkbox" class="flat photodelete" name="deletephoto" id="photodelete"> '.$langs->trans("Delete").'<br><br></td></tr>';
1242  }
1243  //print '<tr><td>'.$langs->trans("PhotoFile").'</td></tr>';
1244  print '<tr><td>';
1245  $maxfilesizearray = getMaxFileSizeArray();
1246  $maxmin = $maxfilesizearray['maxmin'];
1247  if ($maxmin > 0) {
1248  print '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
1249  }
1250  print '<input type="file" class="flat maxwidth200" name="photo" id="photoinput">';
1251  print '</td></tr>';
1252  print '</table>';
1253 
1254  print '</td>';
1255  print '</tr>';
1256 
1257  print '</table>';
1258 
1259  print dol_get_fiche_end();
1260 
1261  print $form->buttonsSaveCancel();
1262 
1263  print "</form>";
1264  }
1265  }
1266 
1267  // Select mail models is same action as presend
1268  if (GETPOST('modelselected', 'alpha')) {
1269  $action = 'presend';
1270  }
1271 
1272  // View mode
1273  if (!empty($id) && $action != 'edit' && $action != 'create') {
1274  $objsoc = new Societe($db);
1275 
1276  // Show errors
1277  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
1278 
1279  print dol_get_fiche_head($head, 'card', $title, -1, 'contact');
1280 
1281  if ($action == 'create_user') {
1282  // Full firstname and lastname separated with a dot : firstname.lastname
1283  include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1284  $login = dol_buildlogin($object->lastname, $object->firstname);
1285 
1286  $generated_password = '';
1287  if (empty($ldap_sid)) { // TODO ldap_sid ?
1288  require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
1289  $generated_password = getRandomPassword(false);
1290  }
1291  $password = $generated_password;
1292 
1293  // Create a form array
1294  $formquestion = array(
1295  array('label' => $langs->trans("LoginToCreate"), 'type' => 'text', 'name' => 'login', 'value' => $login),
1296  array('label' => $langs->trans("Password"), 'type' => 'text', 'name' => 'password', 'value' => $password),
1297  //array('label' => $form->textwithpicto($langs->trans("Type"),$langs->trans("InternalExternalDesc")), 'type' => 'select', 'name' => 'intern', 'default' => 1, 'values' => array(0=>$langs->trans('Internal'),1=>$langs->trans('External')))
1298  );
1299  $text = $langs->trans("ConfirmCreateContact").'<br>';
1300  if (isModEnabled("societe")) {
1301  if ($object->socid > 0) {
1302  $text .= $langs->trans("UserWillBeExternalUser");
1303  } else {
1304  $text .= $langs->trans("UserWillBeInternalUser");
1305  }
1306  }
1307  print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("CreateDolibarrLogin"), $text, "confirm_create_user", $formquestion, 'yes');
1308  }
1309 
1310  $linkback = '<a href="'.DOL_URL_ROOT.'/contact/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1311 
1312  $morehtmlref = '<a href="'.DOL_URL_ROOT.'/contact/vcard.php?id='.$object->id.'" class="refid">';
1313  $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
1314  $morehtmlref .= '</a>';
1315 
1316  $morehtmlref .= '<div class="refidno">';
1317  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
1318  $objsoc->fetch($object->socid);
1319  // Thirdparty
1320  if ($objsoc->id > 0) {
1321  $morehtmlref .= $objsoc->getNomUrl(1, 'contact');
1322  } else {
1323  $morehtmlref .= '<span class="opacitymedium">'.$langs->trans("ContactNotLinkedToCompany").'</span>';
1324  }
1325  }
1326  $morehtmlref .= '</div>';
1327 
1328  dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref);
1329 
1330 
1331  print '<div class="fichecenter">';
1332  print '<div class="fichehalfleft">';
1333 
1334  print '<div class="underbanner clearboth"></div>';
1335  print '<table class="border tableforfield" width="100%">';
1336 
1337  // Civility
1338  print '<tr><td class="titlefield">'.$langs->trans("UserTitle").'</td><td>';
1339  print $object->getCivilityLabel();
1340  print '</td></tr>';
1341 
1342  // Job / position
1343  print '<tr><td>'.$langs->trans("PostOrFunction").'</td><td>'.$object->poste.'</td></tr>';
1344 
1345  // Email
1346  if (isModEnabled('mailing')) {
1347  $langs->load("mails");
1348  print '<tr><td>'.$langs->trans("NbOfEMailingsSend").'</td>';
1349  print '<td><a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?filteremail='.urlencode($object->email).'">'.$object->getNbOfEMailings().'</a></td></tr>';
1350  }
1351 
1352  // Unsubscribe opt-out
1353  if (isModEnabled('mailing')) {
1354  $result = $object->getNoEmail();
1355  if ($result < 0) {
1356  setEventMessages($object->error, $object->errors, 'errors');
1357  }
1358  print '<tr><td>'.$langs->trans("No_Email").'</td><td>';
1359  if ($object->email) {
1360  print yn($object->no_email);
1361  } else {
1362  print '<span class="opacitymedium">'.$langs->trans("EMailNotDefined").'</span>';
1363  }
1364  print '</td></tr>';
1365  }
1366 
1367  // Default language
1368  if (getDolGlobalInt('MAIN_MULTILANGS')) {
1369  require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1370  print '<tr><td>'.$langs->trans("DefaultLang").'</td><td>';
1371  //$s=picto_from_langcode($object->default_lang);
1372  //print ($s?$s.' ':'');
1373  $langs->load("languages");
1374  $labellang = ($object->default_lang ? $langs->trans('Language_'.$object->default_lang) : '');
1375  print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
1376  print $labellang;
1377  print '</td></tr>';
1378  }
1379 
1380  print '<tr><td>'.$langs->trans("ContactVisibility").'</td><td>';
1381  print $object->LibPubPriv($object->priv);
1382  print '</td></tr>';
1383 
1384  print '</table>';
1385  print '</div>';
1386 
1387  $object->fetch_thirdparty();
1388 
1389 
1390  print '<div class="fichehalfright">';
1391 
1392  print '<div class="underbanner clearboth"></div>';
1393  print '<table class="border tableforfield centpercent">';
1394 
1395 
1396  if (!empty($conf->global->THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES)) {
1397  if ($object->thirdparty->client == 2 || $object->thirdparty->client == 3) {
1398  // Level of prospect
1399  print '<tr><td class="titlefield">';
1400  print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1401  print $langs->trans('ProspectLevel');
1402  print '<td>';
1403  if ($action != 'editlevel' && $user->hasRight('societe', 'contact', 'creer')) {
1404  print '<td align="right"><a href="'.$_SERVER["PHP_SELF"].'?action=editlevel&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('Modify'), 1).'</a></td>';
1405  }
1406  print '</tr></table>';
1407  print '</td><td>';
1408  if ($action == 'editlevel') {
1409  $formcompany->formProspectContactLevel($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_prospectlevel, 'prospect_contact_level_id', 1);
1410  } else {
1411  print $object->getLibProspLevel();
1412  }
1413  print "</td>";
1414  print '</tr>';
1415 
1416  // Status of prospection
1417  $object->loadCacheOfProspStatus();
1418  print '<tr><td>'.$langs->trans("StatusProsp").'</td><td>'.$object->getLibProspCommStatut(4, $object->cacheprospectstatus[$object->stcomm_id]['label']);
1419  print ' &nbsp; &nbsp; ';
1420  print '<div class="floatright">';
1421  foreach ($object->cacheprospectstatus as $key => $val) {
1422  $titlealt = 'default';
1423  if (!empty($val['code']) && !in_array($val['code'], array('ST_NO', 'ST_NEVER', 'ST_TODO', 'ST_PEND', 'ST_DONE'))) {
1424  $titlealt = $val['label'];
1425  }
1426  if ($object->stcomm_id != $val['id']) {
1427  print '<a class="pictosubstatus" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&stcomm='.urlencode($val['code']).'&action=setstcomm&token='.newToken().'">'.img_action($titlealt, $val['code'], $val['picto']).'</a>';
1428  }
1429  }
1430  print '</div></td></tr>';
1431  }
1432  }
1433 
1434  // Categories
1435  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
1436  print '<tr><td class="titlefield">'.$langs->trans("Categories").'</td>';
1437  print '<td>';
1438  print $form->showCategories($object->id, Categorie::TYPE_CONTACT, 1);
1439  print '</td></tr>';
1440  }
1441 
1442  if (!empty($object->socid)) {
1443  print '<tr><td class="titlefield">'.$langs->trans("ContactByDefaultFor").'</td>';
1444  print '<td>';
1445  print $formcompany->showRoles("roles", $object, 'view', $object->roles);
1446  print '</td></tr>';
1447  }
1448 
1449  // Other attributes
1450  $parameters = array('socid'=>$socid);
1451  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1452 
1453  $object->load_ref_elements();
1454 
1455  if (isModEnabled("propal")) {
1456  print '<tr><td class="titlefield tdoverflow">'.$langs->trans("ContactForProposals").'</td><td>';
1457  print $object->ref_propal ? $object->ref_propal : $langs->trans("NoContactForAnyProposal");
1458  print '</td></tr>';
1459  }
1460 
1461  if (isModEnabled('commande') || isModEnabled("expedition")) {
1462  print '<tr><td class="titlefield tdoverflow">';
1463  if (isModEnabled("expedition")) {
1464  print $langs->trans("ContactForOrdersOrShipments");
1465  } else {
1466  print $langs->trans("ContactForOrders");
1467  }
1468  print '</td><td>';
1469  $none = $langs->trans("NoContactForAnyOrder");
1470  if (isModEnabled("expedition")) {
1471  $none = $langs->trans("NoContactForAnyOrderOrShipments");
1472  }
1473  print $object->ref_commande ? $object->ref_commande : $none;
1474  print '</td></tr>';
1475  }
1476 
1477  if (isModEnabled('contrat')) {
1478  print '<tr><td class="tdoverflow">'.$langs->trans("ContactForContracts").'</td><td>';
1479  print $object->ref_contrat ? $object->ref_contrat : $langs->trans("NoContactForAnyContract");
1480  print '</td></tr>';
1481  }
1482 
1483  if (isModEnabled('facture')) {
1484  print '<tr><td class="tdoverflow">'.$langs->trans("ContactForInvoices").'</td><td>';
1485  print $object->ref_facturation ? $object->ref_facturation : $langs->trans("NoContactForAnyInvoice");
1486  print '</td></tr>';
1487  }
1488 
1489  print '<tr><td>'.$langs->trans("DolibarrLogin").'</td><td>';
1490  if ($object->user_id) {
1491  $dolibarr_user = new User($db);
1492  $result = $dolibarr_user->fetch($object->user_id);
1493  print $dolibarr_user->getLoginUrl(-1);
1494  } else {
1495  //print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
1496  if (!$object->user_id && $user->hasRight('user', 'user', 'creer')) {
1497  print '<a class="aaa" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=create_user&token='.newToken().'">'.img_picto($langs->trans("CreateDolibarrLogin"), 'add', 'class="pictofixedwidth"').$langs->trans("CreateDolibarrLogin").'</a>';
1498  }
1499  }
1500  print '</td></tr>';
1501 
1502  print "</table>";
1503 
1504  print '</div></div>';
1505  print '<div class="clearboth"></div>';
1506 
1507  print dol_get_fiche_end();
1508 
1509  /*
1510  * Action bar
1511  */
1512  print '<div class="tabsAction">';
1513 
1514  $parameters = array();
1515  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1516  if (empty($reshook) && $action != 'presend') {
1517  if (empty($user->socid)) {
1518  if (!empty($object->email)) {
1519  $langs->load("mails");
1520  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans('SendMail').'</a></div>';
1521  } else {
1522  $langs->load("mails");
1523  print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NoEMail")).'">'.$langs->trans('SendMail').'</a></div>';
1524  }
1525  }
1526 
1527  if ($user->rights->societe->contact->creer) {
1528  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans('Modify').'</a>';
1529  }
1530 
1531  // Activer
1532  if ($object->statut == 0 && $user->hasRight('societe', 'contact', 'creer')) {
1533  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken().'">'.$langs->trans("Reactivate").'</a>';
1534  }
1535  // Desactiver
1536  if ($object->statut == 1 && $user->hasRight('societe', 'contact', 'creer')) {
1537  print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=disable&id='.$object->id.'&token='.newToken().'">'.$langs->trans("DisableUser").'</a>';
1538  }
1539 
1540  // Delete
1541  if ($user->rights->societe->contact->supprimer) {
1542  print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().($backtopage ? '&backtopage='.urlencode($backtopage) : ''), 'delete', $user->rights->societe->contact->supprimer);
1543  }
1544  }
1545 
1546  print "</div>";
1547 
1548  //Select mail models is same action as presend
1549  if (GETPOST('modelselected')) {
1550  $action = 'presend';
1551  }
1552 
1553  if ($action != 'presend') {
1554  print '<div class="fichecenter"><div class="fichehalfleft">';
1555 
1556  print '</div><div class="fichehalfright">';
1557 
1558  $MAXEVENT = 10;
1559 
1560  $morehtmlright = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/contact/agenda.php?id='.$object->id);
1561 
1562  // List of actions on element
1563  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1564  $formactions = new FormActions($db);
1565  $somethingshown = $formactions->showactions($object, 'contact', $object->socid, 1, '', $MAXEVENT, '', $morehtmlright); // Show all action for thirdparty
1566 
1567  print '</div></div>';
1568  }
1569 
1570  // Presend form
1571  $modelmail = 'contact';
1572  $defaulttopic = 'Information';
1573  $diroutput = $conf->societe->dir_output.'/contact/';
1574  $trackid = 'ctc'.$object->id;
1575 
1576  include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
1577  }
1578 }
1579 
1580 
1581 llxFooter();
1582 
1583 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage canvas.
Class to manage categories.
Class to manage contact/addresses.
Class to manage a WYSIWYG editor.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to generate html code for admin pages.
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
Definition: user.class.php:48
getCountry($searchkey, $withcode='', $dbtouse=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
$parameters
Actions.
Definition: card.php:83
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
contact_prepare_head(Contact $object)
Prepare array with list of tabs.
Definition: contact.lib.php:33
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
Definition: files.lib.php:1507
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
Definition: files.lib.php:1356
dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0, $uploaderrorcode=0, $nohook=0, $varfiles='addedfile', $upload_dir='')
Make control on an uploaded file from an GUI page and move it to final destination.
Definition: files.lib.php:1218
dol_buildlogin($lastname, $firstname)
Build a login from lastname, firstname.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_action($titlealt, $numaction, $picto='', $moreatt='')
Show logo action.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
getArrayOfSocialNetworks()
Get array of social network dictionary.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formated error messages to output (Used to show messages on html output).
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
Definition: images.lib.php:80
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
getMaxFileSizeArray()
Return the max allowed for file upload.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.