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