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  $error++;
458  setEventMessages($object->error, $object->errors, 'errors');
459  }
460  }
461  } else {
462  $error++;
463  setEventMessages($object->error, $object->errors, 'errors');
464  }
465  }
466  }
467 
468  if (!$error && empty($errors)) {
469  if (!empty($backtopage)) {
470  header("Location: ".$backtopage);
471  exit;
472  }
473  $action = 'view';
474  } else {
475  $action = 'edit';
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 if (empty($object->id)) {
573  $title = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("NewContact") : $langs->trans("NewContactAddress"));
574 }
575 
576 llxHeader('', $title, $help_url);
577 
578 $countrynotdefined = $langs->trans("ErrorSetACountryFirst").' ('.$langs->trans("SeeAbove").')';
579 
580 if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
581  // -----------------------------------------
582  // When used with CANVAS
583  // -----------------------------------------
584  if (empty($object->error) && $id) {
585  $object = new Contact($db);
586  $result = $object->fetch($id);
587  if ($result <= 0) {
588  dol_print_error('', $object->error);
589  }
590  }
591  $objcanvas->assign_values($action, $object->id, $object->ref); // Set value for templates
592  $objcanvas->display_canvas($action); // Show template
593 } else {
594  // -----------------------------------------
595  // When used in standard mode
596  // -----------------------------------------
597 
598  // Confirm deleting contact
599  if ($user->rights->societe->contact->supprimer) {
600  if ($action == 'delete') {
601  print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id.($backtopage ? '&backtopage='.$backtopage : ''), $langs->trans("DeleteContact"), $langs->trans("ConfirmDeleteContact"), "confirm_delete", '', 0, 1);
602  }
603  }
604 
605  /*
606  * Onglets
607  */
608  $head = array();
609  if ($id > 0) {
610  // Si edition contact deja existant
611  $object = new Contact($db);
612  $res = $object->fetch($id, $user);
613  if ($res < 0) {
614  setEventMessages($object->error, $object->errors, 'errors');
615  }
616 
617  $object->fetchRoles();
618 
619  // Show tabs
620  $head = contact_prepare_head($object);
621  }
622 
623  if ($user->rights->societe->contact->creer) {
624  if ($action == 'create') {
625  /*
626  * Fiche en mode creation
627  */
628  $object->canvas = $canvas;
629 
630  $object->state_id = GETPOST("state_id", "int");
631 
632  // We set country_id, country_code and label for the selected country
633  $object->country_id = GETPOST("country_id") ? GETPOST("country_id", "int") : (empty($objsoc->country_id) ? $mysoc->country_id : $objsoc->country_id);
634  if ($object->country_id) {
635  $tmparray = getCountry($object->country_id, 'all');
636  $object->country_code = $tmparray['code'];
637  $object->country = $tmparray['label'];
638  }
639 
640  $linkback = '';
641 
642  print load_fiche_titre($title, $linkback, 'address');
643 
644  // Show errors
645  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
646 
647  if ($conf->use_javascript_ajax) {
648  print "\n".'<script type="text/javascript">'."\n";
649  print 'jQuery(document).ready(function () {
650  jQuery("#selectcountry_id").change(function() {
651  document.formsoc.action.value="create";
652  document.formsoc.submit();
653  });
654 
655  $("#copyaddressfromsoc").click(function() {
656  $(\'textarea[name="address"]\').val("'.dol_escape_js($objsoc->address).'");
657  $(\'input[name="zipcode"]\').val("'.dol_escape_js($objsoc->zip).'");
658  $(\'input[name="town"]\').val("'.dol_escape_js($objsoc->town).'");
659  console.log("Set state_id to '.dol_escape_js($objsoc->state_id).'");
660  $(\'select[name="state_id"]\').val("'.dol_escape_js($objsoc->state_id).'").trigger("change");
661  /* set country at end because it will trigger page refresh */
662  console.log("Set country id to '.dol_escape_js($objsoc->country_id).'");
663  $(\'select[name="country_id"]\').val("'.dol_escape_js($objsoc->country_id).'").trigger("change"); /* trigger required to update select2 components */
664  });
665  })'."\n";
666  print '</script>'."\n";
667  }
668 
669  print '<form method="post" name="formsoc" action="'.$_SERVER["PHP_SELF"].'">';
670  print '<input type="hidden" name="token" value="'.newToken().'">';
671  print '<input type="hidden" name="action" value="add">';
672  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
673  if (!empty($objsoc)) {
674  print '<input type="hidden" name="entity" value="'.$objsoc->entity.'">';
675  }
676 
677  print dol_get_fiche_head($head, 'card', '', 0, '');
678 
679  print '<table class="border centpercent">';
680 
681  // Name
682  print '<tr><td class="titlefieldcreate fieldrequired"><label for="lastname">'.$langs->trans("Lastname").' / '.$langs->trans("Label").'</label></td>';
683  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>';
684  print '</tr>';
685 
686  // Firstname
687  print '<tr>';
688  print '<td><label for="firstname">';
689  print $form->textwithpicto($langs->trans("Firstname"), $langs->trans("KeepEmptyIfGenericAddress")).'</label></td>';
690  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>';
691  print '</tr>';
692 
693  // Company
694  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
695  if ($socid > 0) {
696  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td>';
697  print '<td colspan="3" class="maxwidthonsmartphone">';
698  print $objsoc->getNomUrl(1, 'contact');
699  print '</td>';
700  print '<input type="hidden" name="socid" id="socid" value="'.$objsoc->id.'">';
701  print '</td></tr>';
702  } else {
703  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
704  print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company($socid, 'socid', '', 'SelectThirdParty', 0, 0, null, 0, 'minwidth300 maxwidth500 widthcentpercentminusxx');
705  print '</td></tr>';
706  }
707  }
708 
709  // Civility
710  print '<tr><td><label for="civility_code">'.$langs->trans("UserTitle").'</label></td><td colspan="3">';
711  print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", 'alpha') : $object->civility_code, 'civility_code');
712  print '</td></tr>';
713 
714  // Job position
715  print '<tr><td><label for="title">'.$langs->trans("PostOrFunction").'</label></td>';
716  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>';
717 
718  $colspan = 3;
719  if ($conf->use_javascript_ajax && $socid > 0) {
720  $colspan = 2;
721  }
722 
723  // Address
724  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->address)) == 0) {
725  $object->address = $objsoc->address; // Predefined with third party
726  }
727  print '<tr><td><label for="address">'.$langs->trans("Address").'</label></td>';
728  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>';
729 
730  if ($conf->use_javascript_ajax && $socid > 0) {
731  $rowspan = 3;
732  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
733  $rowspan++;
734  }
735 
736  print '<td class="valignmiddle center" rowspan="'.$rowspan.'">';
737  print '<a href="#" id="copyaddressfromsoc">'.$langs->trans('CopyAddressFromSoc').'</a>';
738  print '</td>';
739  }
740  print '</tr>';
741 
742  // Zip / Town
743  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->zip)) == 0) {
744  $object->zip = $objsoc->zip; // Predefined with third party
745  }
746  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->town)) == 0) {
747  $object->town = $objsoc->town; // Predefined with third party
748  }
749  print '<tr><td><label for="zipcode">'.$langs->trans("Zip").'</label> / <label for="town">'.$langs->trans("Town").'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
750  print $formcompany->select_ziptown((GETPOST("zipcode", 'alpha') ? GETPOST("zipcode", 'alpha') : $object->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6).'&nbsp;';
751  print $formcompany->select_ziptown((GETPOST("town", 'alpha') ? GETPOST("town", 'alpha') : $object->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
752  print '</td></tr>';
753 
754  // Country
755  print '<tr><td><label for="selectcountry_id">'.$langs->trans("Country").'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
756  print img_picto('', 'globe-americas', 'class="pictofixedwidth"');
757  print $form->select_country((GETPOST("country_id", 'alpha') ? GETPOST("country_id", 'alpha') : $object->country_id), 'country_id');
758  if ($user->admin) {
759  print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
760  }
761  print '</td></tr>';
762 
763  // State
764  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
765  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)) {
766  print '<tr><td><label for="state_id">'.$langs->trans('Region-State').'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
767  } else {
768  print '<tr><td><label for="state_id">'.$langs->trans('State').'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
769  }
770 
771  if ($object->country_id) {
772  print img_picto('', 'state', 'class="pictofixedwidth"');
773  print $formcompany->select_state(GETPOST("state_id", 'alpha') ? GETPOST("state_id", 'alpha') : $object->state_id, $object->country_code, 'state_id');
774  } else {
775  print $countrynotdefined;
776  }
777  print '</td></tr>';
778  }
779 
780  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->phone_pro)) == 0) {
781  $object->phone_pro = $objsoc->phone; // Predefined with third party
782  }
783  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->fax)) == 0) {
784  $object->fax = $objsoc->fax; // Predefined with third party
785  }
786 
787  // Phone / Fax
788  print '<tr><td>'.$form->editfieldkey('PhonePro', 'phone_pro', '', $object, 0).'</td>';
789  print '<td>';
790  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
791  print '<input type="text" name="phone_pro" id="phone_pro" class="maxwidth200" value="'.(GETPOSTISSET('phone_pro') ? GETPOST('phone_pro', 'alpha') : $object->phone_pro).'"></td>';
792  if ($conf->browser->layout == 'phone') {
793  print '</tr><tr>';
794  }
795  print '<td>'.$form->editfieldkey('PhonePerso', 'phone_perso', '', $object, 0).'</td>';
796  print '<td>';
797  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
798  print '<input type="text" name="phone_perso" id="phone_perso" class="maxwidth200" value="'.(GETPOSTISSET('phone_perso') ? GETPOST('phone_perso', 'alpha') : $object->phone_perso).'"></td>';
799  print '</tr>';
800 
801  print '<tr><td>'.$form->editfieldkey('PhoneMobile', 'phone_mobile', '', $object, 0).'</td>';
802  print '<td>';
803  print img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"');
804  print '<input type="text" name="phone_mobile" id="phone_mobile" class="maxwidth200" value="'.(GETPOSTISSET('phone_mobile') ? GETPOST('phone_mobile', 'alpha') : $object->phone_mobile).'"></td>';
805  if ($conf->browser->layout == 'phone') {
806  print '</tr><tr>';
807  }
808  print '<td>'.$form->editfieldkey('Fax', 'fax', '', $object, 0).'</td>';
809  print '<td>';
810  print img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"');
811  print '<input type="text" name="fax" id="fax" class="maxwidth200" value="'.(GETPOSTISSET('fax') ? GETPOST('fax', 'alpha') : $object->fax).'"></td>';
812  print '</tr>';
813 
814  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->email)) == 0) {
815  $object->email = $objsoc->email; // Predefined with third party
816  }
817 
818  // Email
819  print '<tr><td>'.$form->editfieldkey('EMail', 'email', '', $object, 0, 'string', '').'</td>';
820  print '<td>';
821  print img_picto('', 'object_email', 'class="pictofixedwidth"');
822  print '<input type="text" name="email" id="email" value="'.(GETPOSTISSET('email') ? GETPOST('email', 'alpha') : $object->email).'"></td>';
823  print '</tr>';
824 
825  // Unsubscribe
826  if (isModEnabled('mailing')) {
827  if ($conf->use_javascript_ajax && getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2) {
828  print "\n".'<script type="text/javascript">'."\n";
829  print '$(document).ready(function () {
830  $("#email").keyup(function() {
831  if ($(this).val()!="") {
832  $(".noemail").addClass("fieldrequired");
833  } else {
834  $(".noemail").removeClass("fieldrequired");
835  }
836  });
837  })'."\n";
838  print '</script>'."\n";
839  }
840  if (!GETPOSTISSET("no_email") && !empty($object->email)) {
841  $result = $object->getNoEmail();
842  if ($result < 0) {
843  setEventMessages($object->error, $object->errors, 'errors');
844  }
845  }
846  print '<tr>';
847  print '<td class="noemail"><label for="no_email">'.$langs->trans("No_Email").'</label></td>';
848  print '<td>';
849  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));
850  print '</td>';
851  print '</tr>';
852  }
853 
854  // Social network
855  if (isModEnabled('socialnetworks')) {
856  $object->showSocialNetwork($socialnetworks, ($conf->browser->layout == 'phone' ? 2 : 4));
857  }
858 
859  // Visibility
860  print '<tr><td><label for="priv">'.$langs->trans("ContactVisibility").'</label></td><td colspan="3">';
861  $selectarray = array('0'=>$langs->trans("ContactPublic"), '1'=>$langs->trans("ContactPrivate"));
862  print $form->selectarray('priv', $selectarray, (GETPOST("priv", 'alpha') ?GETPOST("priv", 'alpha') : $object->priv), 0);
863  print '</td></tr>';
864 
865  //Default language
866  if (getDolGlobalInt('MAIN_MULTILANGS')) {
867  print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).'</td><td colspan="3" class="maxwidthonsmartphone">'."\n";
868  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');
869  print '</td>';
870  print '</tr>';
871  }
872 
873  // Categories
874  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
875  print '<tr><td>'.$form->editfieldkey('Categories', 'contcats', '', $object, 0).'</td><td colspan="3">';
876  $cate_arbo = $form->select_all_categories(Categorie::TYPE_CONTACT, null, 'parent', null, null, 1);
877  print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('contcats', $cate_arbo, GETPOST('contcats', 'array'), null, null, null, null, '90%');
878  print "</td></tr>";
879  }
880 
881  // Contact by default
882  if (!empty($socid)) {
883  print '<tr><td>'.$langs->trans("ContactByDefaultFor").'</td>';
884  print '<td colspan="3">';
885  $contactType = $object->listeTypeContacts('external', '', 1);
886  print $form->multiselectarray('roles', $contactType, array(), 0, 0, 'minwidth500');
887  print '</td></tr>';
888  }
889 
890  // Other attributes
891  $parameters = array('socid' => $socid, 'objsoc' => $objsoc, 'colspan' => ' colspan="3"', 'cols' => 3, 'colspanvalue' => 3);
892  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
893 
894  print "</table><br>";
895 
896  print '<hr style="margin-bottom: 20px">';
897 
898  // Add personnal information
899  print load_fiche_titre('<div class="comboperso">'.$langs->trans("PersonalInformations").'</div>', '', '');
900 
901  print '<table class="border centpercent">';
902 
903  // Date To Birth
904  print '<tr><td><label for="birthday">'.$langs->trans("DateOfBirth").'</label></td><td>';
905  $form = new Form($db);
906  if ($object->birthday) {
907  print $form->selectDate($object->birthday, 'birthday', 0, 0, 0, "perso", 1, 0);
908  } else {
909  print $form->selectDate('', 'birthday', 0, 0, 1, "perso", 1, 0);
910  }
911  print '</td>';
912 
913  print '<td><label for="birthday_alert">'.$langs->trans("Alert").'</label>: ';
914  if (!empty($object->birthday_alert)) {
915  print '<input type="checkbox" name="birthday_alert" id="birthday_alert" checked>';
916  } else {
917  print '<input type="checkbox" name="birthday_alert" id="birthday_alert">';
918  }
919  print '</td>';
920  print '</tr>';
921 
922  print "</table>";
923 
924  print dol_get_fiche_end();
925 
926  print $form->buttonsSaveCancel("Add");
927 
928  print "</form>";
929  } elseif ($action == 'edit' && !empty($id)) {
930  /*
931  * Fiche en mode edition
932  */
933 
934  // We set country_id, and country_code label of the chosen country
935  if (GETPOSTISSET("country_id") || $object->country_id) {
936  $tmparray = getCountry($object->country_id, 'all');
937  $object->country_code = $tmparray['code'];
938  $object->country = $tmparray['label'];
939  }
940 
941  $objsoc = new Societe($db);
942  $objsoc->fetch($object->socid);
943 
944  // Show errors
945  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
946 
947  if ($conf->use_javascript_ajax) {
948  print "\n".'<script type="text/javascript">'."\n";
949  print 'jQuery(document).ready(function () {
950  jQuery("#selectcountry_id").change(function() {
951  document.formsoc.action.value="edit";
952  document.formsoc.submit();
953  });
954 
955  $("#copyaddressfromsoc").click(function() {
956  $(\'textarea[name="address"]\').val("'.dol_escape_js($objsoc->address).'");
957  $(\'input[name="zipcode"]\').val("'.dol_escape_js($objsoc->zip).'");
958  $(\'input[name="town"]\').val("'.dol_escape_js($objsoc->town).'");
959  console.log("Set state_id to '.dol_escape_js($objsoc->state_id).'");
960  $(\'select[name="state_id"]\').val("'.dol_escape_js($objsoc->state_id).'").trigger("change");
961  /* set country at end because it will trigger page refresh */
962  console.log("Set country id to '.dol_escape_js($objsoc->country_id).'");
963  $(\'select[name="country_id"]\').val("'.dol_escape_js($objsoc->country_id).'").trigger("change"); /* trigger required to update select2 components */
964  });
965  })'."\n";
966  print '</script>'."\n";
967  }
968 
969  print '<form enctype="multipart/form-data" method="post" action="'.$_SERVER["PHP_SELF"].'?id='.$id.'" name="formsoc">';
970  print '<input type="hidden" name="token" value="'.newToken().'">';
971  print '<input type="hidden" name="id" value="'.$id.'">';
972  print '<input type="hidden" name="action" value="update">';
973  print '<input type="hidden" name="contactid" value="'.$object->id.'">';
974  if (!empty($backtopage)) {
975  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
976  }
977 
978  print dol_get_fiche_head($head, 'card', $title, 0, 'contact');
979 
980  print '<table class="border centpercent">';
981 
982  // Ref/ID
983  if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) {
984  print '<tr><td>'.$langs->trans("ID").'</td><td colspan="3">';
985  print $object->ref;
986  print '</td></tr>';
987  }
988 
989  // Lastname
990  print '<tr><td class="titlefieldcreate fieldrequired"><label for="lastname">'.$langs->trans("Lastname").' / '.$langs->trans("Label").'</label></td>';
991  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>';
992  print '</tr>';
993  print '<tr>';
994  // Firstname
995  print '<td><label for="firstname">'.$langs->trans("Firstname").'</label></td>';
996  print '<td colspan="3"><input name="firstname" id="firstname" type="text" class="minwidth200" maxlength="80" value="'.(GETPOSTISSET("firstname") ? GETPOST("firstname") : $object->firstname).'"></td>';
997  print '</tr>';
998 
999  // Company
1000  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
1001  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td>';
1002  print '<td colspan="3" class="maxwidthonsmartphone">';
1003  print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(GETPOST('socid', 'int') ? GETPOST('socid', 'int') : ($object->socid ? $object->socid : -1), 'socid', '', $langs->trans("SelectThirdParty"));
1004  print '</td>';
1005  print '</tr>';
1006  }
1007 
1008  // Civility
1009  print '<tr><td><label for="civility_code">'.$langs->trans("UserTitle").'</label></td><td colspan="3">';
1010  print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", "aZ09") : $object->civility_code, 'civility_code');
1011  print '</td></tr>';
1012 
1013  // Job position
1014  print '<tr><td><label for="title">'.$langs->trans("PostOrFunction").'</label></td>';
1015  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>';
1016 
1017  // Address
1018  print '<tr><td><label for="address">'.$langs->trans("Address").'</label></td>';
1019  print '<td colspan="3">';
1020  print '<div class="paddingrightonly valignmiddle inline-block quatrevingtpercent">';
1021  print '<textarea class="flat minwidth200 centpercent" name="address" id="address">'.(GETPOSTISSET("address") ? GETPOST("address", 'alphanohtml') : $object->address).'</textarea>';
1022  print '</div><div class="paddingrightonly valignmiddle inline-block">';
1023  if (!empty($conf->use_javascript_ajax)) {
1024  print '<a href="#" id="copyaddressfromsoc">'.$langs->trans('CopyAddressFromSoc').'</a><br>';
1025  }
1026  print '</div>';
1027  print '</td>';
1028 
1029  // Zip / Town
1030  print '<tr><td><label for="zipcode">'.$langs->trans("Zip").'</label> / <label for="town">'.$langs->trans("Town").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1031  print $formcompany->select_ziptown((GETPOSTISSET("zipcode") ? GETPOST("zipcode") : $object->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6).'&nbsp;';
1032  print $formcompany->select_ziptown((GETPOSTISSET("town") ? GETPOST("town") : $object->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
1033  print '</td></tr>';
1034 
1035  // Country
1036  print '<tr><td><label for="selectcountry_id">'.$langs->trans("Country").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1037  print img_picto('', 'globe-americas', 'class="pictofixedwidth"');
1038  print $form->select_country(GETPOSTISSET("country_id") ? GETPOST("country_id") : $object->country_id, 'country_id');
1039  if ($user->admin) {
1040  print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1041  }
1042  print '</td></tr>';
1043 
1044  // State
1045  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
1046  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)) {
1047  print '<tr><td><label for="state_id">'.$langs->trans('Region-State').'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1048  } else {
1049  print '<tr><td><label for="state_id">'.$langs->trans('State').'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1050  }
1051 
1052  print img_picto('', 'state', 'class="pictofixedwidth"');
1053  print $formcompany->select_state(GETPOSTISSET('state_id') ? GETPOST('state_id', 'alpha') : $object->state_id, $object->country_code, 'state_id');
1054  print '</td></tr>';
1055  }
1056 
1057  // Phone
1058  print '<tr><td>'.$form->editfieldkey('PhonePro', 'phone_pro', GETPOST('phone_pro', 'alpha'), $object, 0).'</td>';
1059  print '<td>';
1060  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
1061  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>';
1062  if ($conf->browser->layout == 'phone') {
1063  print '</tr><tr>';
1064  }
1065  print '<td>'.$form->editfieldkey('PhonePerso', 'fax', GETPOST('phone_perso', 'alpha'), $object, 0).'</td>';
1066  print '<td>';
1067  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
1068  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>';
1069 
1070  print '<tr><td>'.$form->editfieldkey('PhoneMobile', 'phone_mobile', GETPOST('phone_mobile', 'alpha'), $object, 0, 'string', '').'</td>';
1071  print '<td>';
1072  print img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"');
1073  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>';
1074  if ($conf->browser->layout == 'phone') {
1075  print '</tr><tr>';
1076  }
1077  print '<td>'.$form->editfieldkey('Fax', 'fax', GETPOST('fax', 'alpha'), $object, 0).'</td>';
1078  print '<td>';
1079  print img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"');
1080  print '<input type="text" name="fax" id="fax" class="maxwidth200" maxlength="80" value="'.(GETPOSTISSET('phone_fax') ?GETPOST('phone_fax', 'alpha') : $object->fax).'"></td></tr>';
1081 
1082  // EMail
1083  print '<tr><td>'.$form->editfieldkey('EMail', 'email', GETPOST('email', 'alpha'), $object, 0, 'string', '', (!empty($conf->global->SOCIETE_EMAIL_MANDATORY))).'</td>';
1084  print '<td>';
1085  print img_picto('', 'object_email', 'class="pictofixedwidth"');
1086  print '<input type="text" name="email" id="email" class="maxwidth100onsmartphone quatrevingtpercent" value="'.(GETPOSTISSET('email') ?GETPOST('email', 'alpha') : $object->email).'"></td>';
1087  if (isModEnabled('mailing')) {
1088  $langs->load("mails");
1089  print '<td class="nowrap">'.$langs->trans("NbOfEMailingsSend").'</td>';
1090  print '<td>'.$object->getNbOfEMailings().'</td>';
1091  } else {
1092  print '<td colspan="2"></td>';
1093  }
1094  print '</tr>';
1095 
1096  // Unsubscribe
1097  if (isModEnabled('mailing')) {
1098  if ($conf->use_javascript_ajax && getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2) {
1099  print "\n".'<script type="text/javascript">'."\n";
1100 
1101  print '
1102  jQuery(document).ready(function () {
1103  function init_check_no_email(input) {
1104  if (input.val()!="") {
1105  $(".noemail").addClass("fieldrequired");
1106  } else {
1107  $(".noemail").removeClass("fieldrequired");
1108  }
1109  }
1110  $("#email").keyup(function() {
1111  init_check_no_email($(this));
1112  });
1113  init_check_no_email($("#email"));
1114  })'."\n";
1115  print '</script>'."\n";
1116  }
1117  if (!GETPOSTISSET("no_email") && !empty($object->email)) {
1118  $result = $object->getNoEmail();
1119  if ($result < 0) {
1120  setEventMessages($object->error, $object->errors, 'errors');
1121  }
1122  }
1123  print '<tr>';
1124  print '<td class="noemail"><label for="no_email">'.$langs->trans("No_Email").'</label></td>';
1125  print '<td>';
1126  $useempty = (getDolGlobalInt('MAILING_CONTACT_DEFAULT_BULK_STATUS') == 2);
1127  print $form->selectyesno('no_email', (GETPOSTISSET("no_email") ? GETPOST("no_email", 'int') : $object->no_email), 1, false, $useempty);
1128  print '</td>';
1129  print '</tr>';
1130  }
1131 
1132  // Social network
1133  if (isModEnabled('socialnetworks')) {
1134  $object->showSocialNetwork($socialnetworks, ($conf->browser->layout == 'phone' ? 2 : 4));
1135  }
1136 
1137  // Visibility
1138  print '<tr><td><label for="priv">'.$langs->trans("ContactVisibility").'</label></td><td colspan="3">';
1139  $selectarray = array('0'=>$langs->trans("ContactPublic"), '1'=>$langs->trans("ContactPrivate"));
1140  print $form->selectarray('priv', $selectarray, $object->priv, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth150');
1141  print '</td></tr>';
1142 
1143  // Default language
1144  if (getDolGlobalInt('MAIN_MULTILANGS')) {
1145  print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).'</td><td colspan="3" class="maxwidthonsmartphone">'."\n";
1146  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');
1147  print '</td>';
1148  print '</tr>';
1149  }
1150 
1151  // Note Public
1152  print '<tr><td class="tdtop"><label for="note_public">'.$langs->trans("NotePublic").'</label></td><td colspan="3">';
1153  $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%');
1154  print $doleditor->Create(1);
1155  print '</td></tr>';
1156 
1157  // Note Private
1158  print '<tr><td class="tdtop"><label for="note_private">'.$langs->trans("NotePrivate").'</label></td><td colspan="3">';
1159  $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%');
1160  print $doleditor->Create(1);
1161  print '</td></tr>';
1162 
1163  // Status
1164  print '<tr><td>'.$langs->trans("Status").'</td>';
1165  print '<td colspan="3">';
1166  print $object->getLibStatut(4);
1167  print '</td></tr>';
1168 
1169  // Categories
1170  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
1171  $arrayselected = array();
1172  print '<tr><td>'.$form->editfieldkey('Categories', 'contcats', '', $object, 0).'</td>';
1173  print '<td colspan="3">';
1174  $cate_arbo = $form->select_all_categories(Categorie::TYPE_CONTACT, null, null, null, null, 1);
1175  $c = new Categorie($db);
1176  $cats = $c->containing($object->id, 'contact');
1177  foreach ($cats as $cat) {
1178  $arrayselected[] = $cat->id;
1179  }
1180  print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('contcats', $cate_arbo, $arrayselected, '', 0, '', 0, '90%');
1181  print "</td></tr>";
1182  }
1183 
1184  // Contact by default
1185  if (!empty($object->socid)) {
1186  print '<tr><td>'.$langs->trans("ContactByDefaultFor").'</td>';
1187  print '<td colspan="3">';
1188  print $formcompany->showRoles("roles", $object, 'edit', $object->roles);
1189  print '</td></tr>';
1190  }
1191 
1192  // Other attributes
1193  $parameters = array('colspan' => ' colspan="3"', 'cols'=> '3', 'colspanvalue'=> '3');
1194  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
1195 
1196  $object->load_ref_elements();
1197 
1198  if (isModEnabled('commande')) {
1199  print '<tr><td>'.$langs->trans("ContactForOrders").'</td><td colspan="3">';
1200  print $object->ref_commande ? $object->ref_commande : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyOrder").'</span>');
1201  print '</td></tr>';
1202  }
1203 
1204  if (isModEnabled("propal")) {
1205  print '<tr><td>'.$langs->trans("ContactForProposals").'</td><td colspan="3">';
1206  print $object->ref_propal ? $object->ref_propal : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyProposal").'</span>');
1207  print '</td></tr>';
1208  }
1209 
1210  if (isModEnabled('contrat')) {
1211  print '<tr><td>'.$langs->trans("ContactForContracts").'</td><td colspan="3">';
1212  print $object->ref_contrat ? $object->ref_contrat : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyContract").'</span>');
1213  print '</td></tr>';
1214  }
1215 
1216  if (isModEnabled('facture')) {
1217  print '<tr><td>'.$langs->trans("ContactForInvoices").'</td><td colspan="3">';
1218  print $object->ref_facturation ? $object->ref_facturation : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyInvoice").'</span>');
1219  print '</td></tr>';
1220  }
1221 
1222  // Login Dolibarr
1223  print '<tr><td>'.$langs->trans("DolibarrLogin").'</td><td colspan="3">';
1224  if ($object->user_id) {
1225  $dolibarr_user = new User($db);
1226  $result = $dolibarr_user->fetch($object->user_id);
1227  print $dolibarr_user->getLoginUrl(1);
1228  } else {
1229  print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
1230  }
1231  print '</td></tr>';
1232 
1233  // Photo
1234  print '<tr>';
1235  print '<td>'.$langs->trans("PhotoFile").'</td>';
1236  print '<td colspan="3">';
1237  if ($object->photo) {
1238  print $form->showphoto('contact', $object);
1239  print "<br>\n";
1240  }
1241  print '<table class="nobordernopadding">';
1242  if ($object->photo) {
1243  print '<tr><td><input type="checkbox" class="flat photodelete" name="deletephoto" id="photodelete"> '.$langs->trans("Delete").'<br><br></td></tr>';
1244  }
1245  //print '<tr><td>'.$langs->trans("PhotoFile").'</td></tr>';
1246  print '<tr><td>';
1247  $maxfilesizearray = getMaxFileSizeArray();
1248  $maxmin = $maxfilesizearray['maxmin'];
1249  if ($maxmin > 0) {
1250  print '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
1251  }
1252  print '<input type="file" class="flat maxwidth200" name="photo" id="photoinput">';
1253  print '</td></tr>';
1254  print '</table>';
1255 
1256  print '</td>';
1257  print '</tr>';
1258 
1259  print '</table>';
1260 
1261  print dol_get_fiche_end();
1262 
1263  print $form->buttonsSaveCancel();
1264 
1265  print "</form>";
1266  }
1267  }
1268 
1269  // Select mail models is same action as presend
1270  if (GETPOST('modelselected', 'alpha')) {
1271  $action = 'presend';
1272  }
1273 
1274  // View mode
1275  if (!empty($id) && $action != 'edit' && $action != 'create') {
1276  $objsoc = new Societe($db);
1277 
1278  // Show errors
1279  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
1280 
1281  print dol_get_fiche_head($head, 'card', $title, -1, 'contact');
1282 
1283  if ($action == 'create_user') {
1284  // Full firstname and lastname separated with a dot : firstname.lastname
1285  include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1286  $login = dol_buildlogin($object->lastname, $object->firstname);
1287 
1288  $generated_password = '';
1289  if (empty($ldap_sid)) { // TODO ldap_sid ?
1290  require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
1291  $generated_password = getRandomPassword(false);
1292  }
1293  $password = $generated_password;
1294 
1295  // Create a form array
1296  $formquestion = array(
1297  array('label' => $langs->trans("LoginToCreate"), 'type' => 'text', 'name' => 'login', 'value' => $login),
1298  array('label' => $langs->trans("Password"), 'type' => 'text', 'name' => 'password', 'value' => $password),
1299  //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')))
1300  );
1301  $text = $langs->trans("ConfirmCreateContact").'<br>';
1302  if (isModEnabled("societe")) {
1303  if ($object->socid > 0) {
1304  $text .= $langs->trans("UserWillBeExternalUser");
1305  } else {
1306  $text .= $langs->trans("UserWillBeInternalUser");
1307  }
1308  }
1309  print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("CreateDolibarrLogin"), $text, "confirm_create_user", $formquestion, 'yes');
1310  }
1311 
1312  $linkback = '<a href="'.DOL_URL_ROOT.'/contact/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1313 
1314  $morehtmlref = '<a href="'.DOL_URL_ROOT.'/contact/vcard.php?id='.$object->id.'" class="refid">';
1315  $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
1316  $morehtmlref .= '</a>';
1317 
1318  $morehtmlref .= '<div class="refidno">';
1319  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
1320  $objsoc->fetch($object->socid);
1321  // Thirdparty
1322  if ($objsoc->id > 0) {
1323  $morehtmlref .= $objsoc->getNomUrl(1, 'contact');
1324  } else {
1325  $morehtmlref .= '<span class="opacitymedium">'.$langs->trans("ContactNotLinkedToCompany").'</span>';
1326  }
1327  }
1328  $morehtmlref .= '</div>';
1329 
1330  dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref);
1331 
1332 
1333  print '<div class="fichecenter">';
1334  print '<div class="fichehalfleft">';
1335 
1336  print '<div class="underbanner clearboth"></div>';
1337  print '<table class="border tableforfield" width="100%">';
1338 
1339  // Civility
1340  print '<tr><td class="titlefield">'.$langs->trans("UserTitle").'</td><td>';
1341  print $object->getCivilityLabel();
1342  print '</td></tr>';
1343 
1344  // Job / position
1345  print '<tr><td>'.$langs->trans("PostOrFunction").'</td><td>'.$object->poste.'</td></tr>';
1346 
1347  // Email
1348  if (isModEnabled('mailing')) {
1349  $langs->load("mails");
1350  print '<tr><td>'.$langs->trans("NbOfEMailingsSend").'</td>';
1351  print '<td><a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?filteremail='.urlencode($object->email).'">'.$object->getNbOfEMailings().'</a></td></tr>';
1352  }
1353 
1354  // Unsubscribe opt-out
1355  if (isModEnabled('mailing')) {
1356  $result = $object->getNoEmail();
1357  if ($result < 0) {
1358  setEventMessages($object->error, $object->errors, 'errors');
1359  }
1360  print '<tr><td>'.$langs->trans("No_Email").'</td><td>';
1361  if ($object->email) {
1362  print yn($object->no_email);
1363  } else {
1364  print '<span class="opacitymedium">'.$langs->trans("EMailNotDefined").'</span>';
1365  }
1366  print '</td></tr>';
1367  }
1368 
1369  // Default language
1370  if (getDolGlobalInt('MAIN_MULTILANGS')) {
1371  require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1372  print '<tr><td>'.$langs->trans("DefaultLang").'</td><td>';
1373  //$s=picto_from_langcode($object->default_lang);
1374  //print ($s?$s.' ':'');
1375  $langs->load("languages");
1376  $labellang = ($object->default_lang ? $langs->trans('Language_'.$object->default_lang) : '');
1377  print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
1378  print $labellang;
1379  print '</td></tr>';
1380  }
1381 
1382  print '<tr><td>'.$langs->trans("ContactVisibility").'</td><td>';
1383  print $object->LibPubPriv($object->priv);
1384  print '</td></tr>';
1385 
1386  print '</table>';
1387  print '</div>';
1388 
1389  $object->fetch_thirdparty();
1390 
1391 
1392  print '<div class="fichehalfright">';
1393 
1394  print '<div class="underbanner clearboth"></div>';
1395  print '<table class="border tableforfield centpercent">';
1396 
1397 
1398  if (!empty($conf->global->THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES)) {
1399  if ($object->thirdparty->client == 2 || $object->thirdparty->client == 3) {
1400  // Level of prospect
1401  print '<tr><td class="titlefield">';
1402  print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1403  print $langs->trans('ProspectLevel');
1404  print '<td>';
1405  if ($action != 'editlevel' && $user->hasRight('societe', 'contact', 'creer')) {
1406  print '<td align="right"><a href="'.$_SERVER["PHP_SELF"].'?action=editlevel&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('Modify'), 1).'</a></td>';
1407  }
1408  print '</tr></table>';
1409  print '</td><td>';
1410  if ($action == 'editlevel') {
1411  $formcompany->formProspectContactLevel($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_prospectlevel, 'prospect_contact_level_id', 1);
1412  } else {
1413  print $object->getLibProspLevel();
1414  }
1415  print "</td>";
1416  print '</tr>';
1417 
1418  // Status of prospection
1419  $object->loadCacheOfProspStatus();
1420  print '<tr><td>'.$langs->trans("StatusProsp").'</td><td>'.$object->getLibProspCommStatut(4, $object->cacheprospectstatus[$object->stcomm_id]['label']);
1421  print ' &nbsp; &nbsp; ';
1422  print '<div class="floatright">';
1423  foreach ($object->cacheprospectstatus as $key => $val) {
1424  $titlealt = 'default';
1425  if (!empty($val['code']) && !in_array($val['code'], array('ST_NO', 'ST_NEVER', 'ST_TODO', 'ST_PEND', 'ST_DONE'))) {
1426  $titlealt = $val['label'];
1427  }
1428  if ($object->stcomm_id != $val['id']) {
1429  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>';
1430  }
1431  }
1432  print '</div></td></tr>';
1433  }
1434  }
1435 
1436  // Categories
1437  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
1438  print '<tr><td class="titlefield">'.$langs->trans("Categories").'</td>';
1439  print '<td>';
1440  print $form->showCategories($object->id, Categorie::TYPE_CONTACT, 1);
1441  print '</td></tr>';
1442  }
1443 
1444  if (!empty($object->socid)) {
1445  print '<tr><td class="titlefield">'.$langs->trans("ContactByDefaultFor").'</td>';
1446  print '<td>';
1447  print $formcompany->showRoles("roles", $object, 'view', $object->roles);
1448  print '</td></tr>';
1449  }
1450 
1451  // Other attributes
1452  $parameters = array('socid'=>$socid);
1453  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1454 
1455  $object->load_ref_elements();
1456 
1457  if (isModEnabled("propal")) {
1458  print '<tr><td class="titlefield tdoverflow">'.$langs->trans("ContactForProposals").'</td><td>';
1459  print $object->ref_propal ? $object->ref_propal : $langs->trans("NoContactForAnyProposal");
1460  print '</td></tr>';
1461  }
1462 
1463  if (isModEnabled('commande') || isModEnabled("expedition")) {
1464  print '<tr><td class="titlefield tdoverflow">';
1465  if (isModEnabled("expedition")) {
1466  print $langs->trans("ContactForOrdersOrShipments");
1467  } else {
1468  print $langs->trans("ContactForOrders");
1469  }
1470  print '</td><td>';
1471  $none = $langs->trans("NoContactForAnyOrder");
1472  if (isModEnabled("expedition")) {
1473  $none = $langs->trans("NoContactForAnyOrderOrShipments");
1474  }
1475  print $object->ref_commande ? $object->ref_commande : $none;
1476  print '</td></tr>';
1477  }
1478 
1479  if (isModEnabled('contrat')) {
1480  print '<tr><td class="tdoverflow">'.$langs->trans("ContactForContracts").'</td><td>';
1481  print $object->ref_contrat ? $object->ref_contrat : $langs->trans("NoContactForAnyContract");
1482  print '</td></tr>';
1483  }
1484 
1485  if (isModEnabled('facture')) {
1486  print '<tr><td class="tdoverflow">'.$langs->trans("ContactForInvoices").'</td><td>';
1487  print $object->ref_facturation ? $object->ref_facturation : $langs->trans("NoContactForAnyInvoice");
1488  print '</td></tr>';
1489  }
1490 
1491  print '<tr><td>'.$langs->trans("DolibarrLogin").'</td><td>';
1492  if ($object->user_id) {
1493  $dolibarr_user = new User($db);
1494  $result = $dolibarr_user->fetch($object->user_id);
1495  print $dolibarr_user->getLoginUrl(-1);
1496  } else {
1497  //print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
1498  if (!$object->user_id && $user->hasRight('user', 'user', 'creer')) {
1499  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>';
1500  }
1501  }
1502  print '</td></tr>';
1503 
1504  print "</table>";
1505 
1506  print '</div></div>';
1507  print '<div class="clearboth"></div>';
1508 
1509  print dol_get_fiche_end();
1510 
1511  /*
1512  * Action bar
1513  */
1514  print '<div class="tabsAction">';
1515 
1516  $parameters = array();
1517  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1518  if (empty($reshook) && $action != 'presend') {
1519  if (empty($user->socid)) {
1520  if (!empty($object->email)) {
1521  $langs->load("mails");
1522  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>';
1523  } else {
1524  $langs->load("mails");
1525  print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NoEMail")).'">'.$langs->trans('SendMail').'</a></div>';
1526  }
1527  }
1528 
1529  if ($user->rights->societe->contact->creer) {
1530  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans('Modify').'</a>';
1531  }
1532 
1533  // Activer
1534  if ($object->statut == 0 && $user->hasRight('societe', 'contact', 'creer')) {
1535  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken().'">'.$langs->trans("Reactivate").'</a>';
1536  }
1537  // Desactiver
1538  if ($object->statut == 1 && $user->hasRight('societe', 'contact', 'creer')) {
1539  print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=disable&id='.$object->id.'&token='.newToken().'">'.$langs->trans("DisableUser").'</a>';
1540  }
1541 
1542  // Delete
1543  if ($user->rights->societe->contact->supprimer) {
1544  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);
1545  }
1546  }
1547 
1548  print "</div>";
1549 
1550  //Select mail models is same action as presend
1551  if (GETPOST('modelselected')) {
1552  $action = 'presend';
1553  }
1554 
1555  if ($action != 'presend') {
1556  print '<div class="fichecenter"><div class="fichehalfleft">';
1557 
1558  print '</div><div class="fichehalfright">';
1559 
1560  $MAXEVENT = 10;
1561 
1562  $morehtmlright = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/contact/agenda.php?id='.$object->id);
1563 
1564  // List of actions on element
1565  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1566  $formactions = new FormActions($db);
1567  $somethingshown = $formactions->showactions($object, 'contact', $object->socid, 1, '', $MAXEVENT, '', $morehtmlright); // Show all action for thirdparty
1568 
1569  print '</div></div>';
1570  }
1571 
1572  // Presend form
1573  $modelmail = 'contact';
1574  $defaulttopic = 'Information';
1575  $diroutput = $conf->societe->dir_output.'/contact/';
1576  $trackid = 'ctc'.$object->id;
1577 
1578  include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
1579  }
1580 }
1581 
1582 
1583 llxFooter();
1584 
1585 $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.