dolibarr  18.0.0
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 ($result2) {
160  $db->commit();
161  } else {
162  $error = $nuser->error; $errors = $nuser->errors;
163  $db->rollback();
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') && $conf->global->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') && $conf->global->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  setEventMessages($object->error, $object->errors, 'errors');
465  $action = 'edit';
466  }
467  }
468  }
469 
470  if (!$error && empty($errors)) {
471  if (!empty($backtopage)) {
472  header("Location: ".$backtopage);
473  exit;
474  }
475  }
476  }
477 
478  if ($action == 'setprospectcontactlevel' && !empty($permissiontoadd)) {
479  $object->fetch($id);
480  $object->fk_prospectlevel = GETPOST('prospect_contact_level_id', 'alpha');
481  $result = $object->update($object->id, $user);
482  if ($result < 0) {
483  setEventMessages($object->error, $object->errors, 'errors');
484  }
485  }
486 
487  // set communication status
488  if ($action == 'setstcomm' && !empty($permissiontoadd)) {
489  $object->fetch($id);
490  $object->stcomm_id = dol_getIdFromCode($db, GETPOST('stcomm', 'alpha'), 'c_stcommcontact');
491  $result = $object->update($object->id, $user);
492  if ($result < 0) {
493  setEventMessages($object->error, $object->errors, 'errors');
494  }
495  }
496 
497  // Update extrafields
498  if ($action == "update_extras" && !empty($permissiontoadd)) {
499  $object->fetch(GETPOST('id', 'int'));
500 
501  $attributekey = GETPOST('attribute', 'alpha');
502  $attributekeylong = 'options_'.$attributekey;
503 
504  if (GETPOSTISSET($attributekeylong.'day') && GETPOSTISSET($attributekeylong.'month') && GETPOSTISSET($attributekeylong.'year')) {
505  // This is properties of a date
506  $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'));
507  //var_dump(dol_print_date($object->array_options['options_'.$attributekey]));exit;
508  } else {
509  $object->array_options['options_'.$attributekey] = GETPOST($attributekeylong, 'alpha');
510  }
511 
512  $result = $object->insertExtraFields(empty($triggermodname) ? '' : $triggermodname, $user);
513  if ($result > 0) {
514  setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
515  $action = 'view';
516  } else {
517  setEventMessages($object->error, $object->errors, 'errors');
518  $action = 'edit_extras';
519  }
520  }
521 
522  // Update extrafields
523  if ($action == 'update_extras' && !empty($user->rights->societe->contact->creer)) {
524  $object->oldcopy = dol_clone($object);
525 
526  // Fill array 'array_options' with data from update form
527  $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
528  if ($ret < 0) {
529  $error++;
530  }
531 
532  if (!$error) {
533  $result = $object->insertExtraFields('CONTACT_MODIFY');
534  if ($result < 0) {
535  setEventMessages($object->error, $object->errors, 'errors');
536  $error++;
537  }
538  }
539 
540  if ($error) {
541  $action = 'edit_extras';
542  }
543  }
544 
545  // Actions to send emails
546  $triggersendname = 'CONTACT_SENTBYMAIL';
547  $paramname = 'id';
548  $mode = 'emailfromcontact';
549  include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
550 }
551 
552 
553 /*
554  * View
555  */
556 
557 $form = new Form($db);
558 $formadmin = new FormAdmin($db);
559 $formcompany = new FormCompany($db);
560 
561 $objsoc = new Societe($db);
562 if ($socid > 0) {
563  $objsoc->fetch($socid);
564 }
565 
566 $title = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("Contacts") : $langs->trans("ContactsAddresses"));
567 if (!empty($conf->global->MAIN_HTML_TITLE) && preg_match('/contactnameonly/', $conf->global->MAIN_HTML_TITLE) && $object->lastname) {
568  $title = $object->lastname;
569 }
570 $help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
571 $title = (!empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("NewContact") : $langs->trans("NewContactAddress"));
572 
573 llxHeader('', $title, $help_url);
574 
575 $countrynotdefined = $langs->trans("ErrorSetACountryFirst").' ('.$langs->trans("SeeAbove").')';
576 
577 if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
578  // -----------------------------------------
579  // When used with CANVAS
580  // -----------------------------------------
581  if (empty($object->error) && $id) {
582  $object = new Contact($db);
583  $result = $object->fetch($id);
584  if ($result <= 0) {
585  dol_print_error('', $object->error);
586  }
587  }
588  $objcanvas->assign_values($action, $object->id, $object->ref); // Set value for templates
589  $objcanvas->display_canvas($action); // Show template
590 } else {
591  // -----------------------------------------
592  // When used in standard mode
593  // -----------------------------------------
594 
595  // Confirm deleting contact
596  if ($user->rights->societe->contact->supprimer) {
597  if ($action == 'delete') {
598  print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id.($backtopage ? '&backtopage='.$backtopage : ''), $langs->trans("DeleteContact"), $langs->trans("ConfirmDeleteContact"), "confirm_delete", '', 0, 1);
599  }
600  }
601 
602  /*
603  * Onglets
604  */
605  $head = array();
606  if ($id > 0) {
607  // Si edition contact deja existant
608  $object = new Contact($db);
609  $res = $object->fetch($id, $user);
610  if ($res < 0) {
611  setEventMessages($object->error, $object->errors, 'errors');
612  }
613 
614  $object->fetchRoles();
615 
616  // Show tabs
617  $head = contact_prepare_head($object);
618  }
619 
620  if ($user->rights->societe->contact->creer) {
621  if ($action == 'create') {
622  /*
623  * Fiche en mode creation
624  */
625  $object->canvas = $canvas;
626 
627  $object->state_id = GETPOST("state_id", "int");
628 
629  // We set country_id, country_code and label for the selected country
630  $object->country_id = GETPOST("country_id") ? GETPOST("country_id", "int") : (empty($objsoc->country_id) ? $mysoc->country_id : $objsoc->country_id);
631  if ($object->country_id) {
632  $tmparray = getCountry($object->country_id, 'all');
633  $object->country_code = $tmparray['code'];
634  $object->country = $tmparray['label'];
635  }
636 
637  $linkback = '';
638 
639  print load_fiche_titre($title, $linkback, 'address');
640 
641  // Show errors
642  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
643 
644  if ($conf->use_javascript_ajax) {
645  print "\n".'<script type="text/javascript">'."\n";
646  print 'jQuery(document).ready(function () {
647  jQuery("#selectcountry_id").change(function() {
648  document.formsoc.action.value="create";
649  document.formsoc.submit();
650  });
651 
652  $("#copyaddressfromsoc").click(function() {
653  $(\'textarea[name="address"]\').val("'.dol_escape_js($objsoc->address).'");
654  $(\'input[name="zipcode"]\').val("'.dol_escape_js($objsoc->zip).'");
655  $(\'input[name="town"]\').val("'.dol_escape_js($objsoc->town).'");
656  console.log("Set state_id to '.dol_escape_js($objsoc->state_id).'");
657  $(\'select[name="state_id"]\').val("'.dol_escape_js($objsoc->state_id).'").trigger("change");
658  /* set country at end because it will trigger page refresh */
659  console.log("Set country id to '.dol_escape_js($objsoc->country_id).'");
660  $(\'select[name="country_id"]\').val("'.dol_escape_js($objsoc->country_id).'").trigger("change"); /* trigger required to update select2 components */
661  });
662  })'."\n";
663  print '</script>'."\n";
664  }
665 
666  print '<form method="post" name="formsoc" action="'.$_SERVER["PHP_SELF"].'">';
667  print '<input type="hidden" name="token" value="'.newToken().'">';
668  print '<input type="hidden" name="action" value="add">';
669  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
670  if (!empty($objsoc)) {
671  print '<input type="hidden" name="entity" value="'.$objsoc->entity.'">';
672  }
673 
674  print dol_get_fiche_head($head, 'card', '', 0, '');
675 
676  print '<table class="border centpercent">';
677 
678  // Name
679  print '<tr><td class="titlefieldcreate fieldrequired"><label for="lastname">'.$langs->trans("Lastname").' / '.$langs->trans("Label").'</label></td>';
680  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>';
681  print '</tr>';
682 
683  // Firstname
684  print '<tr>';
685  print '<td><label for="firstname">';
686  print $form->textwithpicto($langs->trans("Firstname"), $langs->trans("KeepEmptyIfGenericAddress")).'</label></td>';
687  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>';
688  print '</tr>';
689 
690  // Company
691  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
692  if ($socid > 0) {
693  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td>';
694  print '<td colspan="3" class="maxwidthonsmartphone">';
695  print $objsoc->getNomUrl(1, 'contact');
696  print '</td>';
697  print '<input type="hidden" name="socid" id="socid" value="'.$objsoc->id.'">';
698  print '</td></tr>';
699  } else {
700  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
701  print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company($socid, 'socid', '', 'SelectThirdParty', 0, 0, null, 0, 'minwidth300 maxwidth500 widthcentpercentminusxx');
702  print '</td></tr>';
703  }
704  }
705 
706  // Civility
707  print '<tr><td><label for="civility_code">'.$langs->trans("UserTitle").'</label></td><td colspan="3">';
708  print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", 'alpha') : $object->civility_code, 'civility_code');
709  print '</td></tr>';
710 
711  // Job position
712  print '<tr><td><label for="title">'.$langs->trans("PostOrFunction").'</label></td>';
713  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>';
714 
715  $colspan = 3;
716  if ($conf->use_javascript_ajax && $socid > 0) {
717  $colspan = 2;
718  }
719 
720  // Address
721  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->address)) == 0) {
722  $object->address = $objsoc->address; // Predefined with third party
723  }
724  print '<tr><td><label for="address">'.$langs->trans("Address").'</label></td>';
725  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>';
726 
727  if ($conf->use_javascript_ajax && $socid > 0) {
728  $rowspan = 3;
729  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
730  $rowspan++;
731  }
732 
733  print '<td class="valignmiddle center" rowspan="'.$rowspan.'">';
734  print '<a href="#" id="copyaddressfromsoc">'.$langs->trans('CopyAddressFromSoc').'</a>';
735  print '</td>';
736  }
737  print '</tr>';
738 
739  // Zip / Town
740  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->zip)) == 0) {
741  $object->zip = $objsoc->zip; // Predefined with third party
742  }
743  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->town)) == 0) {
744  $object->town = $objsoc->town; // Predefined with third party
745  }
746  print '<tr><td><label for="zipcode">'.$langs->trans("Zip").'</label> / <label for="town">'.$langs->trans("Town").'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
747  print $formcompany->select_ziptown((GETPOST("zipcode", 'alpha') ? GETPOST("zipcode", 'alpha') : $object->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6).'&nbsp;';
748  print $formcompany->select_ziptown((GETPOST("town", 'alpha') ? GETPOST("town", 'alpha') : $object->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
749  print '</td></tr>';
750 
751  // Country
752  print '<tr><td><label for="selectcountry_id">'.$langs->trans("Country").'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
753  print img_picto('', 'globe-americas', 'class="pictofixedwidth"');
754  print $form->select_country((GETPOST("country_id", 'alpha') ? GETPOST("country_id", 'alpha') : $object->country_id), 'country_id');
755  if ($user->admin) {
756  print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
757  }
758  print '</td></tr>';
759 
760  // State
761  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
762  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)) {
763  print '<tr><td><label for="state_id">'.$langs->trans('Region-State').'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
764  } else {
765  print '<tr><td><label for="state_id">'.$langs->trans('State').'</label></td><td colspan="'.$colspan.'" class="maxwidthonsmartphone">';
766  }
767 
768  if ($object->country_id) {
769  print img_picto('', 'state', 'class="pictofixedwidth"');
770  print $formcompany->select_state(GETPOST("state_id", 'alpha') ? GETPOST("state_id", 'alpha') : $object->state_id, $object->country_code, 'state_id');
771  } else {
772  print $countrynotdefined;
773  }
774  print '</td></tr>';
775  }
776 
777  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->phone_pro)) == 0) {
778  $object->phone_pro = $objsoc->phone; // Predefined with third party
779  }
780  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->fax)) == 0) {
781  $object->fax = $objsoc->fax; // Predefined with third party
782  }
783 
784  // Phone / Fax
785  print '<tr><td>'.$form->editfieldkey('PhonePro', 'phone_pro', '', $object, 0).'</td>';
786  print '<td>';
787  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
788  print '<input type="text" name="phone_pro" id="phone_pro" class="maxwidth200" value="'.(GETPOSTISSET('phone_pro') ? GETPOST('phone_pro', 'alpha') : $object->phone_pro).'"></td>';
789  if ($conf->browser->layout == 'phone') {
790  print '</tr><tr>';
791  }
792  print '<td>'.$form->editfieldkey('PhonePerso', 'phone_perso', '', $object, 0).'</td>';
793  print '<td>';
794  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
795  print '<input type="text" name="phone_perso" id="phone_perso" class="maxwidth200" value="'.(GETPOSTISSET('phone_perso') ? GETPOST('phone_perso', 'alpha') : $object->phone_perso).'"></td></tr>';
796 
797  print '<tr><td>'.$form->editfieldkey('PhoneMobile', 'phone_mobile', '', $object, 0).'</td>';
798  print '<td>';
799  print img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"');
800  print '<input type="text" name="phone_mobile" id="phone_mobile" class="maxwidth200" value="'.(GETPOSTISSET('phone_mobile') ? GETPOST('phone_mobile', 'alpha') : $object->phone_mobile).'"></td>';
801  if ($conf->browser->layout == 'phone') {
802  print '</tr><tr>';
803  }
804  print '<td>'.$form->editfieldkey('Fax', 'fax', '', $object, 0).'</td>';
805  print '<td>';
806  print img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"');
807  print '<input type="text" name="fax" id="fax" class="maxwidth200" value="'.(GETPOSTISSET('fax') ? GETPOST('fax', 'alpha') : $object->fax).'"></td>';
808  print '</tr>';
809 
810  if (((isset($objsoc->typent_code) && $objsoc->typent_code == 'TE_PRIVATE') || !empty($conf->global->CONTACT_USE_COMPANY_ADDRESS)) && dol_strlen(trim($object->email)) == 0) {
811  $object->email = $objsoc->email; // Predefined with third party
812  }
813 
814  // Email
815  print '<tr><td>'.$form->editfieldkey('EMail', 'email', '', $object, 0, 'string', '').'</td>';
816  print '<td>';
817  print img_picto('', 'object_email', 'class="pictofixedwidth"');
818  print '<input type="text" name="email" id="email" value="'.(GETPOSTISSET('email') ? GETPOST('email', 'alpha') : $object->email).'"></td>';
819  print '</tr>';
820 
821  // Unsubscribe
822  if (isModEnabled('mailing')) {
823  if ($conf->use_javascript_ajax && $conf->global->MAILING_CONTACT_DEFAULT_BULK_STATUS == 2) {
824  print "\n".'<script type="text/javascript">'."\n";
825  print '$(document).ready(function () {
826  $("#email").keyup(function() {
827  if ($(this).val()!="") {
828  $(".noemail").addClass("fieldrequired");
829  } else {
830  $(".noemail").removeClass("fieldrequired");
831  }
832  });
833  })'."\n";
834  print '</script>'."\n";
835  }
836  if (!GETPOSTISSET("no_email") && !empty($object->email)) {
837  $result = $object->getNoEmail();
838  if ($result < 0) {
839  setEventMessages($object->error, $object->errors, 'errors');
840  }
841  }
842  print '<tr>';
843  print '<td class="noemail"><label for="no_email">'.$langs->trans("No_Email").'</label></td>';
844  print '<td>';
845  print $form->selectyesno('no_email', (GETPOSTISSET("no_email") ? GETPOST("no_email", 'int') : $conf->global->MAILING_CONTACT_DEFAULT_BULK_STATUS), 1, false, ($conf->global->MAILING_CONTACT_DEFAULT_BULK_STATUS == 2));
846  print '</td>';
847  print '</tr>';
848  }
849 
850  // Social network
851  if (isModEnabled('socialnetworks')) {
852  $object->showSocialNetwork($socialnetworks, ($conf->browser->layout == 'phone' ? 2 : 4));
853  }
854 
855  // Visibility
856  print '<tr><td><label for="priv">'.$langs->trans("ContactVisibility").'</label></td><td colspan="3">';
857  $selectarray = array('0'=>$langs->trans("ContactPublic"), '1'=>$langs->trans("ContactPrivate"));
858  print $form->selectarray('priv', $selectarray, (GETPOST("priv", 'alpha') ?GETPOST("priv", 'alpha') : $object->priv), 0);
859  print '</td></tr>';
860 
861  //Default language
862  if (getDolGlobalInt('MAIN_MULTILANGS')) {
863  print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).'</td><td colspan="3" class="maxwidthonsmartphone">'."\n";
864  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');
865  print '</td>';
866  print '</tr>';
867  }
868 
869  // Categories
870  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
871  print '<tr><td>'.$form->editfieldkey('Categories', 'contcats', '', $object, 0).'</td><td colspan="3">';
872  $cate_arbo = $form->select_all_categories(Categorie::TYPE_CONTACT, null, 'parent', null, null, 1);
873  print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('contcats', $cate_arbo, GETPOST('contcats', 'array'), null, null, null, null, '90%');
874  print "</td></tr>";
875  }
876 
877  // Contact by default
878  if (!empty($socid)) {
879  print '<tr><td>'.$langs->trans("ContactByDefaultFor").'</td>';
880  print '<td colspan="3">';
881  $contactType = $object->listeTypeContacts('external', '', 1);
882  print $form->multiselectarray('roles', $contactType, array(), 0, 0, 'minwidth500');
883  print '</td></tr>';
884  }
885 
886  // Other attributes
887  $parameters = array('socid' => $socid, 'objsoc' => $objsoc, 'colspan' => ' colspan="3"', 'cols' => 3, 'colspanvalue' => 3);
888  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
889 
890  print "</table><br>";
891 
892  print '<hr style="margin-bottom: 20px">';
893 
894  // Add personnal information
895  print load_fiche_titre('<div class="comboperso">'.$langs->trans("PersonalInformations").'</div>', '', '');
896 
897  print '<table class="border centpercent">';
898 
899  // Date To Birth
900  print '<tr><td><label for="birthday">'.$langs->trans("DateOfBirth").'</label></td><td>';
901  $form = new Form($db);
902  if ($object->birthday) {
903  print $form->selectDate($object->birthday, 'birthday', 0, 0, 0, "perso", 1, 0);
904  } else {
905  print $form->selectDate('', 'birthday', 0, 0, 1, "perso", 1, 0);
906  }
907  print '</td>';
908 
909  print '<td><label for="birthday_alert">'.$langs->trans("Alert").'</label>: ';
910  if (!empty($object->birthday_alert)) {
911  print '<input type="checkbox" name="birthday_alert" id="birthday_alert" checked>';
912  } else {
913  print '<input type="checkbox" name="birthday_alert" id="birthday_alert">';
914  }
915  print '</td>';
916  print '</tr>';
917 
918  print "</table>";
919 
920  print dol_get_fiche_end();
921 
922  print $form->buttonsSaveCancel("Add");
923 
924  print "</form>";
925  } elseif ($action == 'edit' && !empty($id)) {
926  /*
927  * Fiche en mode edition
928  */
929 
930  // We set country_id, and country_code label of the chosen country
931  if (GETPOSTISSET("country_id") || $object->country_id) {
932  $tmparray = getCountry($object->country_id, 'all');
933  $object->country_code = $tmparray['code'];
934  $object->country = $tmparray['label'];
935  }
936 
937  $objsoc = new Societe($db);
938  $objsoc->fetch($object->socid);
939 
940  // Show errors
941  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
942 
943  if ($conf->use_javascript_ajax) {
944  print "\n".'<script type="text/javascript">'."\n";
945  print 'jQuery(document).ready(function () {
946  jQuery("#selectcountry_id").change(function() {
947  document.formsoc.action.value="edit";
948  document.formsoc.submit();
949  });
950 
951  $("#copyaddressfromsoc").click(function() {
952  $(\'textarea[name="address"]\').val("'.dol_escape_js($objsoc->address).'");
953  $(\'input[name="zipcode"]\').val("'.dol_escape_js($objsoc->zip).'");
954  $(\'input[name="town"]\').val("'.dol_escape_js($objsoc->town).'");
955  console.log("Set state_id to '.dol_escape_js($objsoc->state_id).'");
956  $(\'select[name="state_id"]\').val("'.dol_escape_js($objsoc->state_id).'").trigger("change");
957  /* set country at end because it will trigger page refresh */
958  console.log("Set country id to '.dol_escape_js($objsoc->country_id).'");
959  $(\'select[name="country_id"]\').val("'.dol_escape_js($objsoc->country_id).'").trigger("change"); /* trigger required to update select2 components */
960  });
961  })'."\n";
962  print '</script>'."\n";
963  }
964 
965  print '<form enctype="multipart/form-data" method="post" action="'.$_SERVER["PHP_SELF"].'?id='.$id.'" name="formsoc">';
966  print '<input type="hidden" name="token" value="'.newToken().'">';
967  print '<input type="hidden" name="id" value="'.$id.'">';
968  print '<input type="hidden" name="action" value="update">';
969  print '<input type="hidden" name="contactid" value="'.$object->id.'">';
970  if (!empty($backtopage)) {
971  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
972  }
973 
974  print dol_get_fiche_head($head, 'card', $title, 0, 'contact');
975 
976  print '<table class="border centpercent">';
977 
978  // Ref/ID
979  if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) {
980  print '<tr><td>'.$langs->trans("ID").'</td><td colspan="3">';
981  print $object->ref;
982  print '</td></tr>';
983  }
984 
985  // Lastname
986  print '<tr><td class="titlefieldcreate fieldrequired"><label for="lastname">'.$langs->trans("Lastname").' / '.$langs->trans("Label").'</label></td>';
987  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>';
988  print '</tr>';
989  print '<tr>';
990  // Firstname
991  print '<td><label for="firstname">'.$langs->trans("Firstname").'</label></td>';
992  print '<td colspan="3"><input name="firstname" id="firstname" type="text" class="minwidth200" maxlength="80" value="'.(GETPOSTISSET("firstname") ? GETPOST("firstname") : $object->firstname).'"></td>';
993  print '</tr>';
994 
995  // Company
996  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
997  print '<tr><td><label for="socid">'.$langs->trans("ThirdParty").'</label></td>';
998  print '<td colspan="3" class="maxwidthonsmartphone">';
999  print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(GETPOST('socid', 'int') ? GETPOST('socid', 'int') : ($object->socid ? $object->socid : -1), 'socid', '', $langs->trans("SelectThirdParty"));
1000  print '</td>';
1001  print '</tr>';
1002  }
1003 
1004  // Civility
1005  print '<tr><td><label for="civility_code">'.$langs->trans("UserTitle").'</label></td><td colspan="3">';
1006  print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", "aZ09") : $object->civility_code, 'civility_code');
1007  print '</td></tr>';
1008 
1009  // Job position
1010  print '<tr><td><label for="title">'.$langs->trans("PostOrFunction").'</label></td>';
1011  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>';
1012 
1013  // Address
1014  print '<tr><td><label for="address">'.$langs->trans("Address").'</label></td>';
1015  print '<td colspan="3">';
1016  print '<div class="paddingrightonly valignmiddle inline-block quatrevingtpercent">';
1017  print '<textarea class="flat minwidth200 centpercent" name="address" id="address">'.(GETPOSTISSET("address") ? GETPOST("address", 'alphanohtml') : $object->address).'</textarea>';
1018  print '</div><div class="paddingrightonly valignmiddle inline-block">';
1019  if (!empty($conf->use_javascript_ajax)) {
1020  print '<a href="#" id="copyaddressfromsoc">'.$langs->trans('CopyAddressFromSoc').'</a><br>';
1021  }
1022  print '</div>';
1023  print '</td>';
1024 
1025  // Zip / Town
1026  print '<tr><td><label for="zipcode">'.$langs->trans("Zip").'</label> / <label for="town">'.$langs->trans("Town").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1027  print $formcompany->select_ziptown((GETPOSTISSET("zipcode") ? GETPOST("zipcode") : $object->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6).'&nbsp;';
1028  print $formcompany->select_ziptown((GETPOSTISSET("town") ? GETPOST("town") : $object->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
1029  print '</td></tr>';
1030 
1031  // Country
1032  print '<tr><td><label for="selectcountry_id">'.$langs->trans("Country").'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1033  print img_picto('', 'globe-americas', 'class="pictofixedwidth"');
1034  print $form->select_country(GETPOSTISSET("country_id") ? GETPOST("country_id") : $object->country_id, 'country_id');
1035  if ($user->admin) {
1036  print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1037  }
1038  print '</td></tr>';
1039 
1040  // State
1041  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
1042  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)) {
1043  print '<tr><td><label for="state_id">'.$langs->trans('Region-State').'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1044  } else {
1045  print '<tr><td><label for="state_id">'.$langs->trans('State').'</label></td><td colspan="3" class="maxwidthonsmartphone">';
1046  }
1047 
1048  print img_picto('', 'state', 'class="pictofixedwidth"');
1049  print $formcompany->select_state(GETPOSTISSET('state_id') ? GETPOST('state_id', 'alpha') : $object->state_id, $object->country_code, 'state_id');
1050  print '</td></tr>';
1051  }
1052 
1053  // Phone
1054  print '<tr><td>'.$form->editfieldkey('PhonePro', 'phone_pro', GETPOST('phone_pro', 'alpha'), $object, 0).'</td>';
1055  print '<td>';
1056  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
1057  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>';
1058  print '<td>'.$form->editfieldkey('PhonePerso', 'fax', GETPOST('phone_perso', 'alpha'), $object, 0).'</td>';
1059  print '<td>';
1060  print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
1061  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>';
1062 
1063  print '<tr><td>'.$form->editfieldkey('PhoneMobile', 'phone_mobile', GETPOST('phone_mobile', 'alpha'), $object, 0, 'string', '').'</td>';
1064  print '<td>';
1065  print img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"');
1066  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>';
1067  print '<td>'.$form->editfieldkey('Fax', 'fax', GETPOST('fax', 'alpha'), $object, 0).'</td>';
1068  print '<td>';
1069  print img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"');
1070  print '<input type="text" name="fax" id="fax" class="maxwidth200" maxlength="80" value="'.(GETPOSTISSET('phone_fax') ?GETPOST('phone_fax', 'alpha') : $object->fax).'"></td></tr>';
1071 
1072  // EMail
1073  print '<tr><td>'.$form->editfieldkey('EMail', 'email', GETPOST('email', 'alpha'), $object, 0, 'string', '', (!empty($conf->global->SOCIETE_EMAIL_MANDATORY))).'</td>';
1074  print '<td>';
1075  print img_picto('', 'object_email', 'class="pictofixedwidth"');
1076  print '<input type="text" name="email" id="email" class="maxwidth100onsmartphone quatrevingtpercent" value="'.(GETPOSTISSET('email') ?GETPOST('email', 'alpha') : $object->email).'"></td>';
1077  if (isModEnabled('mailing')) {
1078  $langs->load("mails");
1079  print '<td class="nowrap">'.$langs->trans("NbOfEMailingsSend").'</td>';
1080  print '<td>'.$object->getNbOfEMailings().'</td>';
1081  } else {
1082  print '<td colspan="2"></td>';
1083  }
1084  print '</tr>';
1085 
1086  // Unsubscribe
1087  if (isModEnabled('mailing')) {
1088  if ($conf->use_javascript_ajax && isset($conf->global->MAILING_CONTACT_DEFAULT_BULK_STATUS) && $conf->global->MAILING_CONTACT_DEFAULT_BULK_STATUS == 2) {
1089  print "\n".'<script type="text/javascript">'."\n";
1090 
1091  print '
1092  jQuery(document).ready(function () {
1093  function init_check_no_email(input) {
1094  if (input.val()!="") {
1095  $(".noemail").addClass("fieldrequired");
1096  } else {
1097  $(".noemail").removeClass("fieldrequired");
1098  }
1099  }
1100  $("#email").keyup(function() {
1101  init_check_no_email($(this));
1102  });
1103  init_check_no_email($("#email"));
1104  })'."\n";
1105  print '</script>'."\n";
1106  }
1107  if (!GETPOSTISSET("no_email") && !empty($object->email)) {
1108  $result = $object->getNoEmail();
1109  if ($result < 0) {
1110  setEventMessages($object->error, $object->errors, 'errors');
1111  }
1112  }
1113  print '<tr>';
1114  print '<td class="noemail"><label for="no_email">'.$langs->trans("No_Email").'</label></td>';
1115  print '<td>';
1116  $useempty = (isset($conf->global->MAILING_CONTACT_DEFAULT_BULK_STATUS) && ($conf->global->MAILING_CONTACT_DEFAULT_BULK_STATUS == 2));
1117  print $form->selectyesno('no_email', (GETPOSTISSET("no_email") ? GETPOST("no_email", 'int') : $object->no_email), 1, false, $useempty);
1118  print '</td>';
1119  print '</tr>';
1120  }
1121 
1122  // Social network
1123  if (isModEnabled('socialnetworks')) {
1124  $object->showSocialNetwork($socialnetworks, ($conf->browser->layout == 'phone' ? 2 : 4));
1125  }
1126 
1127  // Visibility
1128  print '<tr><td><label for="priv">'.$langs->trans("ContactVisibility").'</label></td><td colspan="3">';
1129  $selectarray = array('0'=>$langs->trans("ContactPublic"), '1'=>$langs->trans("ContactPrivate"));
1130  print $form->selectarray('priv', $selectarray, $object->priv, 0);
1131  print '</td></tr>';
1132 
1133  //Default language
1134  if (getDolGlobalInt('MAIN_MULTILANGS')) {
1135  print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).'</td><td colspan="3" class="maxwidthonsmartphone">'."\n";
1136  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');
1137  print '</td>';
1138  print '</tr>';
1139  }
1140 
1141  // Note Public
1142  print '<tr><td class="tdtop"><label for="note_public">'.$langs->trans("NotePublic").'</label></td><td colspan="3">';
1143  $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%');
1144  print $doleditor->Create(1);
1145  print '</td></tr>';
1146 
1147  // Note Private
1148  print '<tr><td class="tdtop"><label for="note_private">'.$langs->trans("NotePrivate").'</label></td><td colspan="3">';
1149  $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%');
1150  print $doleditor->Create(1);
1151  print '</td></tr>';
1152 
1153  // Status
1154  print '<tr><td>'.$langs->trans("Status").'</td>';
1155  print '<td colspan="3">';
1156  print $object->getLibStatut(4);
1157  print '</td></tr>';
1158 
1159  // Categories
1160  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
1161  $arrayselected = array();
1162  print '<tr><td>'.$form->editfieldkey('Categories', 'contcats', '', $object, 0).'</td>';
1163  print '<td colspan="3">';
1164  $cate_arbo = $form->select_all_categories(Categorie::TYPE_CONTACT, null, null, null, null, 1);
1165  $c = new Categorie($db);
1166  $cats = $c->containing($object->id, 'contact');
1167  foreach ($cats as $cat) {
1168  $arrayselected[] = $cat->id;
1169  }
1170  print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('contcats', $cate_arbo, $arrayselected, '', 0, '', 0, '90%');
1171  print "</td></tr>";
1172  }
1173 
1174  // Contact by default
1175  if (!empty($object->socid)) {
1176  print '<tr><td>'.$langs->trans("ContactByDefaultFor").'</td>';
1177  print '<td colspan="3">';
1178  print $formcompany->showRoles("roles", $object, 'edit', $object->roles);
1179  print '</td></tr>';
1180  }
1181 
1182  // Other attributes
1183  $parameters = array('colspan' => ' colspan="3"', 'cols'=> '3', 'colspanvalue'=> '3');
1184  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
1185 
1186  $object->load_ref_elements();
1187 
1188  if (isModEnabled('commande')) {
1189  print '<tr><td>'.$langs->trans("ContactForOrders").'</td><td colspan="3">';
1190  print $object->ref_commande ? $object->ref_commande : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyOrder").'</span>');
1191  print '</td></tr>';
1192  }
1193 
1194  if (isModEnabled("propal")) {
1195  print '<tr><td>'.$langs->trans("ContactForProposals").'</td><td colspan="3">';
1196  print $object->ref_propal ? $object->ref_propal : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyProposal").'</span>');
1197  print '</td></tr>';
1198  }
1199 
1200  if (isModEnabled('contrat')) {
1201  print '<tr><td>'.$langs->trans("ContactForContracts").'</td><td colspan="3">';
1202  print $object->ref_contrat ? $object->ref_contrat : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyContract").'</span>');
1203  print '</td></tr>';
1204  }
1205 
1206  if (isModEnabled('facture')) {
1207  print '<tr><td>'.$langs->trans("ContactForInvoices").'</td><td colspan="3">';
1208  print $object->ref_facturation ? $object->ref_facturation : ('<span class="opacitymedium">'.$langs->trans("NoContactForAnyInvoice").'</span>');
1209  print '</td></tr>';
1210  }
1211 
1212  // Login Dolibarr
1213  print '<tr><td>'.$langs->trans("DolibarrLogin").'</td><td colspan="3">';
1214  if ($object->user_id) {
1215  $dolibarr_user = new User($db);
1216  $result = $dolibarr_user->fetch($object->user_id);
1217  print $dolibarr_user->getLoginUrl(1);
1218  } else {
1219  print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
1220  }
1221  print '</td></tr>';
1222 
1223  // Photo
1224  print '<tr>';
1225  print '<td>'.$langs->trans("PhotoFile").'</td>';
1226  print '<td colspan="3">';
1227  if ($object->photo) {
1228  print $form->showphoto('contact', $object);
1229  print "<br>\n";
1230  }
1231  print '<table class="nobordernopadding">';
1232  if ($object->photo) {
1233  print '<tr><td><input type="checkbox" class="flat photodelete" name="deletephoto" id="photodelete"> '.$langs->trans("Delete").'<br><br></td></tr>';
1234  }
1235  //print '<tr><td>'.$langs->trans("PhotoFile").'</td></tr>';
1236  print '<tr><td>';
1237  $maxfilesizearray = getMaxFileSizeArray();
1238  $maxmin = $maxfilesizearray['maxmin'];
1239  if ($maxmin > 0) {
1240  print '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
1241  }
1242  print '<input type="file" class="flat" name="photo" id="photoinput">';
1243  print '</td></tr>';
1244  print '</table>';
1245 
1246  print '</td>';
1247  print '</tr>';
1248 
1249  print '</table>';
1250 
1251  print dol_get_fiche_end();
1252 
1253  print $form->buttonsSaveCancel();
1254 
1255  print "</form>";
1256  }
1257  }
1258 
1259  // Select mail models is same action as presend
1260  if (GETPOST('modelselected', 'alpha')) {
1261  $action = 'presend';
1262  }
1263 
1264  // View mode
1265  if (!empty($id) && $action != 'edit' && $action != 'create') {
1266  $objsoc = new Societe($db);
1267 
1268  // Show errors
1269  dol_htmloutput_errors(is_numeric($error) ? '' : $error, $errors);
1270 
1271  print dol_get_fiche_head($head, 'card', $title, -1, 'contact');
1272 
1273  if ($action == 'create_user') {
1274  // Full firstname and lastname separated with a dot : firstname.lastname
1275  include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1276  $login = dol_buildlogin($object->lastname, $object->firstname);
1277 
1278  $generated_password = '';
1279  if (empty($ldap_sid)) { // TODO ldap_sid ?
1280  require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
1281  $generated_password = getRandomPassword(false);
1282  }
1283  $password = $generated_password;
1284 
1285  // Create a form array
1286  $formquestion = array(
1287  array('label' => $langs->trans("LoginToCreate"), 'type' => 'text', 'name' => 'login', 'value' => $login),
1288  array('label' => $langs->trans("Password"), 'type' => 'text', 'name' => 'password', 'value' => $password),
1289  //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')))
1290  );
1291  $text = $langs->trans("ConfirmCreateContact").'<br>';
1292  if (isModEnabled("societe")) {
1293  if ($object->socid > 0) {
1294  $text .= $langs->trans("UserWillBeExternalUser");
1295  } else {
1296  $text .= $langs->trans("UserWillBeInternalUser");
1297  }
1298  }
1299  print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("CreateDolibarrLogin"), $text, "confirm_create_user", $formquestion, 'yes');
1300  }
1301 
1302  $linkback = '<a href="'.DOL_URL_ROOT.'/contact/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1303 
1304  $morehtmlref = '<a href="'.DOL_URL_ROOT.'/contact/vcard.php?id='.$object->id.'" class="refid">';
1305  $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
1306  $morehtmlref .= '</a>';
1307 
1308  $morehtmlref .= '<div class="refidno">';
1309  if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) {
1310  $objsoc->fetch($object->socid);
1311  // Thirdparty
1312  if ($objsoc->id > 0) {
1313  $morehtmlref .= $objsoc->getNomUrl(1, 'contact');
1314  } else {
1315  $morehtmlref .= '<span class="opacitymedium">'.$langs->trans("ContactNotLinkedToCompany").'</span>';
1316  }
1317  }
1318  $morehtmlref .= '</div>';
1319 
1320  dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref);
1321 
1322 
1323  print '<div class="fichecenter">';
1324  print '<div class="fichehalfleft">';
1325 
1326  print '<div class="underbanner clearboth"></div>';
1327  print '<table class="border tableforfield" width="100%">';
1328 
1329  // Civility
1330  print '<tr><td class="titlefield">'.$langs->trans("UserTitle").'</td><td>';
1331  print $object->getCivilityLabel();
1332  print '</td></tr>';
1333 
1334  // Job / position
1335  print '<tr><td>'.$langs->trans("PostOrFunction").'</td><td>'.$object->poste.'</td></tr>';
1336 
1337  // Email
1338  if (isModEnabled('mailing')) {
1339  $langs->load("mails");
1340  print '<tr><td>'.$langs->trans("NbOfEMailingsSend").'</td>';
1341  print '<td><a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?filteremail='.urlencode($object->email).'">'.$object->getNbOfEMailings().'</a></td></tr>';
1342  }
1343 
1344  // Unsubscribe opt-out
1345  if (isModEnabled('mailing')) {
1346  $result = $object->getNoEmail();
1347  if ($result < 0) {
1348  setEventMessages($object->error, $object->errors, 'errors');
1349  }
1350  print '<tr><td>'.$langs->trans("No_Email").'</td><td>';
1351  if ($object->email) {
1352  print yn($object->no_email);
1353  } else {
1354  print '<span class="opacitymedium">'.$langs->trans("EMailNotDefined").'</span>';
1355  }
1356  print '</td></tr>';
1357  }
1358 
1359  // Default language
1360  if (getDolGlobalInt('MAIN_MULTILANGS')) {
1361  require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1362  print '<tr><td>'.$langs->trans("DefaultLang").'</td><td>';
1363  //$s=picto_from_langcode($object->default_lang);
1364  //print ($s?$s.' ':'');
1365  $langs->load("languages");
1366  $labellang = ($object->default_lang ? $langs->trans('Language_'.$object->default_lang) : '');
1367  print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
1368  print $labellang;
1369  print '</td></tr>';
1370  }
1371 
1372  print '<tr><td>'.$langs->trans("ContactVisibility").'</td><td>';
1373  print $object->LibPubPriv($object->priv);
1374  print '</td></tr>';
1375 
1376  print '</table>';
1377  print '</div>';
1378 
1379  $object->fetch_thirdparty();
1380 
1381  if (!empty($conf->global->THIRDPARTY_ENABLE_PROSPECTION_ON_ALTERNATIVE_ADRESSES)) {
1382  if ($object->thirdparty->client == 2 || $object->thirdparty->client == 3) {
1383  print '<br>';
1384 
1385  print '<div class="underbanner clearboth"></div>';
1386  print '<table class="border" width="100%">';
1387 
1388  // Level of prospect
1389  print '<tr><td class="titlefield nowrap">';
1390  print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
1391  print $langs->trans('ProspectLevel');
1392  print '<td>';
1393  if ($action != 'editlevel' && $user->hasRight('societe', 'contact', 'creer')) {
1394  print '<td align="right"><a href="'.$_SERVER["PHP_SELF"].'?action=editlevel&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('Modify'), 1).'</a></td>';
1395  }
1396  print '</tr></table>';
1397  print '</td><td>';
1398  if ($action == 'editlevel') {
1399  $formcompany->formProspectContactLevel($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_prospectlevel, 'prospect_contact_level_id', 1);
1400  } else {
1401  print $object->getLibProspLevel();
1402  }
1403  print "</td>";
1404  print '</tr>';
1405 
1406  // Status of prospection
1407  $object->loadCacheOfProspStatus();
1408  print '<tr><td>'.$langs->trans("StatusProsp").'</td><td>'.$object->getLibProspCommStatut(4, $object->cacheprospectstatus[$object->stcomm_id]['label']);
1409  print ' &nbsp; &nbsp; ';
1410  print '<div class="floatright">';
1411  foreach ($object->cacheprospectstatus as $key => $val) {
1412  $titlealt = 'default';
1413  if (!empty($val['code']) && !in_array($val['code'], array('ST_NO', 'ST_NEVER', 'ST_TODO', 'ST_PEND', 'ST_DONE'))) {
1414  $titlealt = $val['label'];
1415  }
1416  if ($object->stcomm_id != $val['id']) {
1417  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>';
1418  }
1419  }
1420  print '</div></td></tr>';
1421 
1422  print "</table>";
1423  print '</div>';
1424  }
1425  }
1426 
1427  print '<div class="fichehalfright">';
1428 
1429  print '<div class="underbanner clearboth"></div>';
1430  print '<table class="border tableforfield centpercent">';
1431 
1432  // Categories
1433  if (isModEnabled('categorie') && $user->hasRight('categorie', 'lire')) {
1434  print '<tr><td class="titlefield">'.$langs->trans("Categories").'</td>';
1435  print '<td>';
1436  print $form->showCategories($object->id, Categorie::TYPE_CONTACT, 1);
1437  print '</td></tr>';
1438  }
1439 
1440  if (!empty($object->socid)) {
1441  print '<tr><td class="titlefield">'.$langs->trans("ContactByDefaultFor").'</td>';
1442  print '<td>';
1443  print $formcompany->showRoles("roles", $object, 'view', $object->roles);
1444  print '</td></tr>';
1445  }
1446 
1447  // Other attributes
1448  $parameters = array('socid'=>$socid);
1449  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1450 
1451  $object->load_ref_elements();
1452 
1453  if (isModEnabled("propal")) {
1454  print '<tr><td class="titlefield tdoverflow">'.$langs->trans("ContactForProposals").'</td><td>';
1455  print $object->ref_propal ? $object->ref_propal : $langs->trans("NoContactForAnyProposal");
1456  print '</td></tr>';
1457  }
1458 
1459  if (isModEnabled('commande') || isModEnabled("expedition")) {
1460  print '<tr><td class="titlefield tdoverflow">';
1461  if (isModEnabled("expedition")) {
1462  print $langs->trans("ContactForOrdersOrShipments");
1463  } else {
1464  print $langs->trans("ContactForOrders");
1465  }
1466  print '</td><td>';
1467  $none = $langs->trans("NoContactForAnyOrder");
1468  if (isModEnabled("expedition")) {
1469  $none = $langs->trans("NoContactForAnyOrderOrShipments");
1470  }
1471  print $object->ref_commande ? $object->ref_commande : $none;
1472  print '</td></tr>';
1473  }
1474 
1475  if (isModEnabled('contrat')) {
1476  print '<tr><td class="tdoverflow">'.$langs->trans("ContactForContracts").'</td><td>';
1477  print $object->ref_contrat ? $object->ref_contrat : $langs->trans("NoContactForAnyContract");
1478  print '</td></tr>';
1479  }
1480 
1481  if (isModEnabled('facture')) {
1482  print '<tr><td class="tdoverflow">'.$langs->trans("ContactForInvoices").'</td><td>';
1483  print $object->ref_facturation ? $object->ref_facturation : $langs->trans("NoContactForAnyInvoice");
1484  print '</td></tr>';
1485  }
1486 
1487  print '<tr><td>'.$langs->trans("DolibarrLogin").'</td><td>';
1488  if ($object->user_id) {
1489  $dolibarr_user = new User($db);
1490  $result = $dolibarr_user->fetch($object->user_id);
1491  print $dolibarr_user->getLoginUrl(-1);
1492  } else {
1493  //print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
1494  if (!$object->user_id && $user->hasRight('user', 'user', 'creer')) {
1495  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>';
1496  }
1497  }
1498  print '</td></tr>';
1499 
1500  print "</table>";
1501 
1502  print '</div></div>';
1503  print '<div class="clearboth"></div>';
1504 
1505  print dol_get_fiche_end();
1506 
1507  /*
1508  * Action bar
1509  */
1510  print '<div class="tabsAction">';
1511 
1512  $parameters = array();
1513  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1514  if (empty($reshook) && $action != 'presend') {
1515  if (empty($user->socid)) {
1516  if (!empty($object->email)) {
1517  $langs->load("mails");
1518  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>';
1519  } else {
1520  $langs->load("mails");
1521  print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NoEMail")).'">'.$langs->trans('SendMail').'</a></div>';
1522  }
1523  }
1524 
1525  if ($user->rights->societe->contact->creer) {
1526  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans('Modify').'</a>';
1527  }
1528 
1529  // Activer
1530  if ($object->statut == 0 && $user->hasRight('societe', 'contact', 'creer')) {
1531  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken().'">'.$langs->trans("Reactivate").'</a>';
1532  }
1533  // Desactiver
1534  if ($object->statut == 1 && $user->hasRight('societe', 'contact', 'creer')) {
1535  print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=disable&id='.$object->id.'&token='.newToken().'">'.$langs->trans("DisableUser").'</a>';
1536  }
1537 
1538  // Delete
1539  if ($user->rights->societe->contact->supprimer) {
1540  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);
1541  }
1542  }
1543 
1544  print "</div>";
1545 
1546  //Select mail models is same action as presend
1547  if (GETPOST('modelselected')) {
1548  $action = 'presend';
1549  }
1550 
1551  if ($action != 'presend') {
1552  print '<div class="fichecenter"><div class="fichehalfleft">';
1553 
1554  print '</div><div class="fichehalfright">';
1555 
1556  $MAXEVENT = 10;
1557 
1558  $morehtmlright = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/contact/agenda.php?id='.$object->id);
1559 
1560  // List of actions on element
1561  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1562  $formactions = new FormActions($db);
1563  $somethingshown = $formactions->showactions($object, 'contact', $object->socid, 1, '', $MAXEVENT, '', $morehtmlright); // Show all action for thirdparty
1564 
1565  print '</div></div>';
1566  }
1567 
1568  // Presend form
1569  $modelmail = 'contact';
1570  $defaulttopic = 'Information';
1571  $diroutput = $conf->societe->dir_output.'/contact/';
1572  $trackid = 'ctc'.$object->id;
1573 
1574  include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
1575  }
1576 }
1577 
1578 
1579 llxFooter();
1580 
1581 $db->close();
Societe
Class to manage third parties objects (customers, suppliers, prospects...)
Definition: societe.class.php:51
yn
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
Definition: functions.lib.php:6824
dol_sanitizeFileName
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
Definition: functions.lib.php:1323
llxFooter
llxFooter()
Empty footer.
Definition: wrapper.php:70
dol_delete_dir_recursive
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:1485
dol_htmloutput_errors
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formated error messages to output (Used to show messages on html output).
Definition: functions.lib.php:8903
load_fiche_titre
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
Definition: functions.lib.php:5477
GETPOST
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
Definition: functions.lib.php:609
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:5107
FormActions
Class to manage building of HTML components.
Definition: html.formactions.class.php:30
picto_from_langcode
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
Definition: functions.lib.php:9305
$form
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
image_format_supported
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
Definition: images.lib.php:80
Categorie
Class to manage categories.
Definition: categorie.class.php:47
dol_clone
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
Definition: functions.lib.php:1255
FormAdmin
Class to generate html code for admin pages.
Definition: html.formadmin.class.php:30
img_edit
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
Definition: functions.lib.php:4652
getArrayOfSocialNetworks
getArrayOfSocialNetworks()
Get array of social network dictionary.
Definition: functions.lib.php:3243
dol_banner_tab
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.
Definition: functions.lib.php:2205
$help_url
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
getRandomPassword
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
Definition: security2.lib.php:487
FormCompany
Class to build HTML component for third parties management Only common components are here.
Definition: html.formcompany.class.php:40
img_picto
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
Definition: functions.lib.php:4135
llxHeader
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
dol_delete_file
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:1334
getMaxFileSizeArray
getMaxFileSizeArray()
Return the max allowed for file upload.
Definition: security.lib.php:1228
$formactions
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.
Definition: agenda_other.php:182
dol_move_uploaded_file
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:1196
dol_escape_js
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
Definition: functions.lib.php:1546
dol_getIdFromCode
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
Definition: functions.lib.php:9091
dolGetButtonTitle
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.
Definition: functions.lib.php:11263
Contact
Class to manage contact/addresses.
Definition: contact.class.php:42
setEventMessages
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
Definition: functions.lib.php:8673
Canvas
Class to manage canvas.
Definition: canvas.class.php:29
dol_strlen
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
Definition: functions.lib.php:3997
info_admin
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
Definition: functions.lib.php:5063
restrictedArea
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.
Definition: security.lib.php:353
newToken
newToken()
Return the value of token currently saved into session with name 'newtoken'.
Definition: functions.lib.php:11654
dol_get_fiche_end
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition: functions.lib.php:2177
isModEnabled
isModEnabled($module)
Is Dolibarr module enabled.
Definition: functions.lib.php:207
dol_get_fiche_head
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.
Definition: functions.lib.php:1979
User
Class to manage Dolibarr users.
Definition: user.class.php:47
GETPOSTISSET
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
Definition: functions.lib.php:509
dolGetButtonAction
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
Definition: functions.lib.php:11080
ExtraFields
Class to manage standard extra fields.
Definition: extrafields.class.php:39
Form
Class to manage generation of HTML components Only common components must be here.
Definition: html.form.class.php:53
contact_prepare_head
contact_prepare_head(Contact $object)
Prepare array with list of tabs.
Definition: contact.lib.php:33
$parameters
$parameters
Actions.
Definition: card.php:83
img_action
img_action($titlealt, $numaction, $picto='', $moreatt='')
Show logo action.
Definition: functions.lib.php:4559
getCountry
getCountry($searchkey, $withcode='', $dbtouse=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
Definition: company.lib.php:515
accessforbidden
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
Definition: security.lib.php:1164
dol_mkdir
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
Definition: functions.lib.php:6936
dol_mktime
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...
Definition: functions.lib.php:2968
getDolGlobalInt
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
Definition: functions.lib.php:156
dol_buildlogin
dol_buildlogin($lastname, $firstname)
Build a login from lastname, firstname.
Definition: functions2.lib.php:2045
DolEditor
Class to manage a WYSIWYG editor.
Definition: doleditor.class.php:30