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