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