dolibarr 24.0.2
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2002-2003 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2004-2012 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2005-2018 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2012 Marcos García <marcosgdf@gmail.com>
7 * Copyright (C) 2012-2020 Philippe Grand <philippe.grand@atoo-net.com>
8 * Copyright (C) 2015-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
9 * Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
10 * Copyright (C) 2021 Waël Almoman <info@almoman.com>
11 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <https://www.gnu.org/licenses/>.
25 */
26
34// Load Dolibarr environment
35require '../main.inc.php';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php';
46require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
47require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
48require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
49require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
50require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
51require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
52require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php';
53require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
54require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
55require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
56require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
57require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
58
59// Load translation files required by the page
60$langs->loadLangs(array("companies", "bills", "members", "users", "other", "paypal"));
61
62
63// Get parameters
64$action = GETPOST('action', 'aZ09');
65$cancel = GETPOST('cancel', 'alpha');
66$backtopage = GETPOST('backtopage', 'alpha');
67$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); // if not set, $backtopage will be used
68$confirm = GETPOST('confirm', 'alpha');
69$rowid = GETPOSTINT('rowid');
70$id = GETPOST('id') ? GETPOSTINT('id') : $rowid;
71$typeid = GETPOSTINT('typeid');
72$userid = GETPOSTINT('userid');
73$socid = GETPOSTINT('socid');
74$ref = GETPOST('ref', 'alpha');
75$error = 0;
76
77if (isModEnabled('mailmanspip')) {
78 include_once DOL_DOCUMENT_ROOT.'/mailmanspip/class/mailmanspip.class.php';
79
80 $langs->load('mailmanspip');
81
82 $mailmanspip = new MailmanSpip($db);
83} else {
84 $mailmanspip = null;
85}
86
87$object = new Adherent($db);
88
89$upload_dir = null;
90
91// fetch optionals attributes and labels
92$extrafields->fetch_name_optionals_label($object->table_element);
93
94$socialnetworks = getArrayOfSocialNetworks();
95
96// Get object canvas (By default, this is not defined, so standard usage of dolibarr)
97$object->getCanvas($id);
98$canvas = $object->canvas ? $object->canvas : GETPOST("canvas");
99$objcanvas = null;
100if (!empty($canvas)) {
101 require_once DOL_DOCUMENT_ROOT.'/core/class/canvas.class.php';
102 $objcanvas = new Canvas($db, $action);
103 $objcanvas->getCanvas('adherent', 'membercard', $canvas);
104}
105
106// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
107$hookmanager->initHooks(array('membercard', 'globalcard'));
108
109// Fetch object
110if ($id > 0 || !empty($ref)) {
111 // Load member
112 $result = $object->fetch($id, $ref);
113
114 // Define variables to know what current user can do on users
115 $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer'));
116 // Define variables to know what current user can do on properties of user linked to edited member
117 if ($object->user_id) {
118 // $User is the user who edits, $object->user_id is the id of the related user in the edited member
119 $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer'))
120 || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
121 $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
122 || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
123 }
124}
125
126// Define variables to determine what the current user can do on the members
127$canaddmember = $user->hasRight('adherent', 'creer');
128$caneditfieldmember = false;
129// Define variables to determine what the current user can do on the properties of a member
130if ($id) {
131 $caneditfieldmember = $user->hasRight('adherent', 'creer');
132}
133$permissiontoeditextra = $canaddmember;
134if (GETPOST('attribute', 'aZ09') && isset($extrafields->attributes[$object->table_element]['perms'][GETPOST('attribute', 'aZ09')])) {
135 // For action 'update_extras', is there a specific permission set for the attribute to update
136 $permissiontoeditextra = dol_eval((string) $extrafields->attributes[$object->table_element]['perms'][GETPOST('attribute', 'aZ09')]);
137}
138
139// Security check
140$result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
141
142if (!$user->hasRight('adherent', 'creer') && $action == 'edit') {
143 accessforbidden('Not enough permission');
144}
145
146$linkofpubliclist = DOL_MAIN_URL_ROOT.'/public/members/public_list.php'.((isModEnabled('multicompany')) ? '?entity='.$conf->entity : '');
147
148
149/*
150 * Actions
151 */
152
153$parameters = array('id' => $id, 'rowid' => $id, 'objcanvas' => $objcanvas, 'confirm' => $confirm);
154$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
155if ($reshook < 0) {
156 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
157}
158
159if (empty($reshook)) {
160 $backurlforlist = DOL_URL_ROOT.'/adherents/list.php';
161
162 if (empty($backtopage) || ($cancel && empty($id))) {
163 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
164 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
165 $backtopage = $backurlforlist;
166 } else {
167 $backtopage = DOL_URL_ROOT.'/adherents/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
168 }
169 }
170 }
171
172 if ($cancel) {
173 if (!empty($backtopageforcancel)) {
174 header("Location: ".$backtopageforcancel);
175 exit;
176 } elseif (!empty($backtopage)) {
177 header("Location: ".$backtopage);
178 exit;
179 }
180 $action = '';
181 }
182
183 if ($action == 'setuserid' && ($user->hasRight('user', 'self', 'creer') || $user->hasRight('user', 'user', 'creer'))) {
184 $error = 0;
185 if (!$user->hasRight('user', 'user', 'creer')) { // If can edit only itself user, we can link to itself only
186 if ($userid != $user->id && $userid != $object->user_id) {
187 $error++;
188 setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors');
189 }
190 }
191
192 if (!$error) {
193 if ($userid != $object->user_id) { // If link differs from currently in database
194 $result = $object->setUserId($userid);
195 if ($result < 0) {
196 dol_print_error($object->db, $object->error);
197 }
198 $action = '';
199 }
200 }
201 }
202
203 if ($action == 'setsocid' && $caneditfieldmember) {
204 $error = 0;
205 if (!$error) {
206 if ($socid != $object->socid) { // If link differs from currently in database
207 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."adherent";
208 $sql .= " WHERE socid = ".((int) $socid);
209 $sql .= " AND entity = ".((int) $conf->entity);
210 $resql = $db->query($sql);
211 if ($resql) {
212 $obj = $db->fetch_object($resql);
213 if ($obj && $obj->rowid > 0) {
214 $othermember = new Adherent($db);
215 $othermember->fetch($obj->rowid);
216 $thirdparty = new Societe($db);
217 $thirdparty->fetch($socid);
218 $error++;
219 setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty", $othermember->getFullName($langs), $othermember->login, $thirdparty->name), null, 'errors');
220 }
221 }
222
223 if (!$error) {
224 $result = $object->setThirdPartyId($socid);
225 if ($result < 0) {
226 dol_print_error($object->db, $object->error);
227 }
228 $action = '';
229 }
230 }
231 }
232 }
233
234 // Create user from a member
235 if ($action == 'confirm_create_user' && $confirm == 'yes' && $user->hasRight('user', 'user', 'creer')) {
236 if ($result > 0) {
237 // Creation user
238 $nuser = new User($db);
239 $tmpuser = dol_clone($object, 2);
240 if (GETPOST('internalorexternal', 'aZ09') == 'internal') {
241 $tmpuser->fk_soc = 0;
242 $tmpuser->socid = 0;
243 }
244
245 $result = $nuser->create_from_member($tmpuser, GETPOST('login', 'alphanohtml'));
246
247 if ($result < 0) {
248 $langs->load("errors");
249 setEventMessages($langs->trans($nuser->error), null, 'errors');
250 } else {
251 setEventMessages($langs->trans("NewUserCreated", $nuser->login), null, 'mesgs');
252 $action = '';
253 }
254 } else {
255 setEventMessages($object->error, $object->errors, 'errors');
256 }
257 }
258
259 // Create third party from a member
260 if ($action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->hasRight('societe', 'creer')) {
261 if ($result > 0) {
262 // User creation
263 $company = new Societe($db);
264 $result = $company->create_from_member($object, GETPOST('companyname', 'alpha'), GETPOST('companyalias', 'alpha'));
265
266 if ($result < 0) {
267 $langs->load("errors");
268 setEventMessages($langs->trans($company->error), null, 'errors');
269 setEventMessages($company->error, $company->errors, 'errors');
270 }
271 } else {
272 setEventMessages($object->error, $object->errors, 'errors');
273 }
274 }
275 if ($action == 'confirm_merge' && $confirm == 'yes' && $user->hasRight('adherent', 'creer')) {
276 $member_origin_id = GETPOSTINT('member_origin');
277 $member_origin = new Adherent($db); // The thirdparty that we will delete
278
279 if ($member_origin_id <= 0) {
280 $langs->load('errors');
281 setEventMessages($langs->trans('MergeOriginMemberIsMAndatory'), null, 'errors');
282 } else {
283 if (!$error && $member_origin->fetch($member_origin_id) < 1) {
284 setEventMessages($langs->trans('ErrorRecordNotFound'), null, 'errors');
285 $error++;
286 }
287 if (!$error) {
288 $result = $object->mergeMembers($member_origin_id);
289 if ($result < 0) {
290 $error++;
291 setEventMessages($object->error, $object->errors, 'errors');
292 } else {
293 setEventMessages($langs->trans('MemberMergeSuccess'), null, 'mesgs');
294 }
295 }
296 }
297 }
298
299 if ($action == 'update' && !$cancel && $user->hasRight('adherent', 'creer')) {
300 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
301
302 $birthdate = '';
303 if (GETPOSTINT("birthday") && GETPOSTINT("birthmonth") && GETPOSTINT("birthyear")) {
304 $birthdate = dol_mktime(12, 0, 0, GETPOSTINT("birthmonth"), GETPOSTINT("birthday"), GETPOSTINT("birthyear"));
305 }
306 $lastname = GETPOST("lastname", 'alphanohtml');
307 $firstname = GETPOST("firstname", 'alphanohtml');
308 $gender = GETPOST("gender", 'alphanohtml');
309 $societe = GETPOST("societe", 'alphanohtml');
310 $morphy = GETPOST("morphy", 'alphanohtml');
311 $login = GETPOST("login", 'alphanohtml');
312 if ($morphy != 'mor' && empty($lastname)) {
313 $error++;
314 $langs->load("errors");
315 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Lastname")), null, 'errors');
316 }
317 if ($morphy != 'mor' && (!isset($firstname) || $firstname == '')) {
318 $error++;
319 $langs->load("errors");
320 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Firstname")), null, 'errors');
321 }
322 if ($morphy == 'mor' && empty($societe)) {
323 $error++;
324 $langs->load("errors");
325 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Company")), null, 'errors');
326 }
327 // Check if the login already exists
328 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
329 if (empty($login)) {
330 $error++;
331 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Login")), null, 'errors');
332 }
333 }
334 // Create new object
335 if ($result > 0 && !$error) {
336 $object->oldcopy = dol_clone($object, 2); // @phan-suppress-current-line PhanTypeMismatchProperty
337
338 // Change values
339 $object->civility_code = trim(GETPOST("civility_code", 'alphanohtml'));
340 $object->firstname = trim(GETPOST("firstname", 'alphanohtml'));
341 $object->lastname = trim(GETPOST("lastname", 'alphanohtml'));
342 $object->gender = trim(GETPOST("gender", 'alphanohtml'));
343 $object->login = trim(GETPOST("login", 'alphanohtml'));
344 if (GETPOSTISSET('pass')) {
345 $object->pass = trim(GETPOST("pass", 'password')); // For password, we must use 'none'
346 }
347
348 $object->societe = trim(GETPOST("societe", 'alphanohtml')); // deprecated
349 $object->company = trim(GETPOST("societe", 'alphanohtml'));
350
351 $object->address = trim(GETPOST("address", 'alphanohtml'));
352 $object->zip = trim(GETPOST("zipcode", 'alphanohtml'));
353 $object->town = trim(GETPOST("town", 'alphanohtml'));
354 $object->state_id = GETPOSTINT("state_id");
355 $object->country_id = GETPOSTINT("country_id");
356
357 $object->phone = trim(GETPOST("phone", 'alpha'));
358 $object->phone_perso = trim(GETPOST("phone_perso", 'alpha'));
359 $object->phone_mobile = trim(GETPOST("phone_mobile", 'alpha'));
360 $object->email = preg_replace('/\s+/', '', GETPOST("member_email", 'alpha'));
361 $object->url = trim(GETPOST('member_url', 'url'));
362 $object->socialnetworks = array();
363 foreach ($socialnetworks as $key => $value) {
364 if (GETPOSTISSET($key) && GETPOST($key, 'alphanohtml') != '') {
365 $object->socialnetworks[$key] = trim(GETPOST($key, 'alphanohtml'));
366 }
367 }
368 $object->birth = $birthdate;
369 $object->default_lang = GETPOST('default_lang', 'alpha');
370 $object->typeid = GETPOSTINT("typeid");
371 //$object->note = trim(GETPOST("comment", "restricthtml"));
372 $object->morphy = GETPOST("morphy", 'alpha');
373
374 $current_photo = '';
375 if (!empty($_FILES['photo']['name']) && empty($_FILES['photo']['error'])) {
376 $current_photo = $object->photo;
377 $object->photo = dol_sanitizeFileName($_FILES['photo']['name']);
378 }
379 if (GETPOST('deletephoto')) {
380 $current_photo = $object->photo;
381 $object->photo = '';
382 }
383
384 // Get status and public property
385 $object->statut = GETPOSTINT("statut");
386 $object->status = GETPOSTINT("statut");
387 $object->public = GETPOSTINT("public");
388
389 // Fill array 'array_options' with data from add form
390 $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
391 if ($ret < 0) {
392 $error++;
393 }
394
395 // Check if we need to also synchronize user information
396 $nosyncuser = 0;
397 if ($object->user_id) { // If linked to a user
398 if ($user->id != $object->user_id && !$user->hasRight('user', 'user', 'creer')) {
399 $nosyncuser = 1; // Disable synchronizing
400 }
401 }
402
403 // Check if we need to also synchronize password information
404 $nosyncuserpass = 1; // no by default
405 if (GETPOSTISSET('pass')) {
406 if ($object->user_id) { // If member is linked to a user
407 $nosyncuserpass = 0; // We may try to sync password
408 if ($user->id == $object->user_id) {
409 if (!$user->hasRight('user', 'self', 'password')) {
410 $nosyncuserpass = 1; // Disable synchronizing
411 }
412 } else {
413 if (!$user->hasRight('user', 'user', 'password')) {
414 $nosyncuserpass = 1; // Disable synchronizing
415 }
416 }
417 }
418 }
419
420 if (!$error) {
421 $nosyncthirdparty = getDolGlobalInt('MEMBER_NO_SYNC_LINKED_THIRDPARTY');
422
423 $result = $object->update($user, 0, $nosyncuser, $nosyncuserpass, $nosyncthirdparty);
424
425 if ($result >= 0 && !count($object->errors)) {
426 $categories = GETPOST('memcats', 'array');
427 $object->setCategories($categories);
428
429 // Logo/Photo save
430 $dir = $conf->member->dir_output.'/'.get_exdir(0, 0, 0, 1, $object, 'member').'/photos';
431 $file_OK = is_uploaded_file($_FILES['photo']['tmp_name']);
432 if (GETPOST('deletephoto') && $current_photo) {
433 $fileimg = $dir.'/'.$current_photo;
434 $dirthumbs = $dir.'/thumbs';
435 dol_delete_file($fileimg);
436 dol_delete_dir_recursive($dirthumbs);
437 }
438 if ($file_OK) {
439 if (image_format_supported($_FILES['photo']['name']) > 0) {
440 if ($current_photo != $object->photo) {
441 $fileimg = $dir.'/'.$current_photo;
442 $dirthumbs = $dir.'/thumbs';
443 dol_delete_file($fileimg);
444 dol_delete_dir_recursive($dirthumbs);
445 }
446
447 dol_mkdir($dir);
448
449 if (@is_dir($dir)) {
450 $newfile = $dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']);
451 $resultupload = dol_move_uploaded_file($_FILES['photo']['tmp_name'], $newfile, 1, 0, $_FILES['photo']['error']);
452 // Note: $resultupload is a string when the file was refused and, in PHP 8, such a string compares as greater than 0
453 if (!is_numeric($resultupload) || $resultupload <= 0) {
454 setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors');
455 } else {
456 // Create thumbs
457 $object->addThumbs($newfile);
458
459 // Index file in database
460 if (getDolGlobalString('MEMBER_PHOTO_ALLOW_EXTERNAL_DOWNLOAD')) {
461 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
462 // the dir dirname($newfile) is directory of logo, so we should have only one file at once into index, so we delete indexes for the dir
463 deleteFilesIntoDatabaseIndex(dirname($newfile), '', '', $object);
464 // now we index the uploaded logo file
465 addFileIntoDatabaseIndex(dirname($newfile), basename($newfile), '', 'uploaded', 1, $object);
466 }
467 }
468 }
469 } else {
470 $langs->load("errors");
471 setEventMessages($langs->trans("ErrorBadImageFormat"), null, 'errors');
472 }
473 } else {
474 switch ($_FILES['photo']['error']) {
475 case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini
476 case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form
477 $langs->load("errors");
478 setEventMessages($langs->trans("ErrorFileSizeTooLarge"), null, 'errors');
479 break;
480 case 3: //uploaded file was only partially uploaded
481 setEventMessages($langs->trans("ErrorFileNotUploaded"), null, 'errors');
482 break;
483 }
484 }
485
486 $rowid = $object->id;
487 $id = $object->id;
488 $action = '';
489
490 if (!empty($backtopage)) {
491 header("Location: ".$backtopage);
492 exit;
493 }
494 } else {
495 setEventMessages($object->error, $object->errors, 'errors');
496 $action = '';
497 }
498 } else {
499 $action = 'edit';
500 }
501 } else {
502 $action = 'edit';
503 }
504 }
505
506 if ($action == 'add' && $user->hasRight('adherent', 'creer')) {
507 if ($canvas) {
508 $object->canvas = $canvas;
509 }
510 $birthdate = '';
511 if (GETPOSTISSET("birthday") && GETPOST("birthday") && GETPOSTISSET("birthmonth") && GETPOST("birthmonth") && GETPOSTISSET("birthyear") && GETPOST("birthyear")) {
512 $birthdate = dol_mktime(12, 0, 0, GETPOSTINT("birthmonth"), GETPOSTINT("birthday"), GETPOSTINT("birthyear"));
513 }
514 $datesubscription = '';
515 if (GETPOSTISSET("reday") && GETPOSTISSET("remonth") && GETPOSTISSET("reyear")) {
516 $datesubscription = dol_mktime(12, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
517 }
518
519 $typeid = GETPOSTINT("typeid");
520 $civility_code = GETPOST("civility_code", 'alphanohtml');
521 $lastname = GETPOST("lastname", 'alphanohtml');
522 $firstname = GETPOST("firstname", 'alphanohtml');
523 $gender = GETPOST("gender", 'alphanohtml');
524 $societe = GETPOST("societe", 'alphanohtml');
525 $address = GETPOST("address", 'alphanohtml');
526 $zip = GETPOST("zipcode", 'alphanohtml');
527 $town = GETPOST("town", 'alphanohtml');
528 $state_id = GETPOSTINT("state_id");
529 $country_id = GETPOSTINT("country_id");
530
531 $phone = GETPOST("phone", 'alpha');
532 $phone_perso = GETPOST("phone_perso", 'alpha');
533 $phone_mobile = GETPOST("phone_mobile", 'alpha');
534 $email = preg_replace('/\s+/', '', GETPOST("member_email", 'aZ09arobase'));
535 $url = trim(GETPOST('url', 'url'));
536 $login = GETPOST("member_login", 'alphanohtml');
537 $pass = GETPOST("password", 'password'); // For password, we use 'none'
538 $photo = GETPOST("photo", 'alphanohtml');
539 $morphy = GETPOST("morphy", 'alphanohtml');
540 $public = GETPOSTINT("public");
541
542 $userid = GETPOSTINT("userid");
543 $socid = GETPOSTINT("socid");
544 $default_lang = GETPOST('default_lang', 'alpha');
545
546 $object->civility_code = $civility_code;
547 $object->firstname = $firstname;
548 $object->lastname = $lastname;
549 $object->gender = $gender;
550 $object->societe = $societe; // deprecated
551 $object->company = $societe;
552 $object->address = $address;
553 $object->zip = $zip;
554 $object->town = $town;
555 $object->state_id = $state_id;
556 $object->country_id = $country_id;
557 $object->phone = $phone;
558 $object->phone_perso = $phone_perso;
559 $object->phone_mobile = $phone_mobile;
560 $object->socialnetworks = array();
561 if (isModEnabled('socialnetworks')) {
562 foreach ($socialnetworks as $key => $value) {
563 if (GETPOSTISSET($key) && GETPOST($key, 'alphanohtml') != '') {
564 $object->socialnetworks[$key] = GETPOST("member_".$key, 'alphanohtml');
565 }
566 }
567 }
568
569 $object->email = $email;
570 $object->url = $url;
571 $object->login = $login;
572 $object->pass = $pass;
573 $object->birth = $birthdate;
574 $object->photo = $photo;
575 $object->typeid = $typeid;
576 //$object->note = $comment;
577 $object->morphy = $morphy;
578 $object->user_id = $userid;
579 $object->socid = $socid;
580 $object->public = $public;
581 $object->default_lang = $default_lang;
582 // Fill array 'array_options' with data from add form
583 $ret = $extrafields->setOptionalsFromPost(null, $object);
584 if ($ret < 0) {
585 $error++;
586 }
587
588 // Check parameters
589 if (empty($morphy) || $morphy == "-1") {
590 $error++;
591 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("MemberNature")), null, 'errors');
592 }
593 // Tests if the login already exists
594 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
595 if (empty($login)) {
596 $error++;
597 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Login")), null, 'errors');
598 } else {
599 $sql = "SELECT login FROM ".MAIN_DB_PREFIX."adherent WHERE login='".$db->escape($login)."'";
600 $result = $db->query($sql);
601 $num = 0;
602 if ($result) {
603 $num = $db->num_rows($result);
604 }
605 if ($num) {
606 $error++;
607 $langs->load("errors");
608 setEventMessages($langs->trans("ErrorLoginAlreadyExists", $login), null, 'errors');
609 }
610 }
611 if (empty($pass)) {
612 $error++;
613 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Password")), null, 'errors');
614 }
615 }
616 if ($morphy == 'mor' && empty($societe)) {
617 $error++;
618 $langs->load("errors");
619 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Company")), null, 'errors');
620 }
621 if ($morphy != 'mor' && empty($lastname)) {
622 $error++;
623 $langs->load("errors");
624 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Lastname")), null, 'errors');
625 }
626 if ($morphy != 'mor' && (!isset($firstname) || $firstname == '')) {
627 $error++;
628 $langs->load("errors");
629 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Firstname")), null, 'errors');
630 }
631 if (!($typeid > 0)) { // Keep () before !
632 $error++;
633 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors');
634 }
635 if (getDolGlobalString('ADHERENT_MAIL_REQUIRED') && !isValidEmail($email)) {
636 $error++;
637 $langs->load("errors");
638 setEventMessages($langs->trans("ErrorBadEMail", $email), null, 'errors');
639 }
640 if (!empty($object->url) && !isValidUrl($object->url)) {
641 $langs->load("errors");
642 setEventMessages($langs->trans("ErrorBadUrl", $object->url), null, 'errors');
643 }
644
645 if (!$error) {
646 $db->begin();
647
648 // Create the member
649 $result = $object->create($user);
650 if ($result > 0) {
651 // Foundation categories
652 $memcats = GETPOST('memcats', 'array');
653 $object->setCategories($memcats);
654
655 $db->commit();
656
657 $rowid = $object->id;
658 $id = $object->id;
659
660 $backtopage = preg_replace('/__ID__/', (string) $id, $backtopage);
661 } else {
662 $db->rollback();
663
664 $error++;
665 setEventMessages($object->error, $object->errors, 'errors');
666 }
667
668 // Auto-create thirdparty on member creation
669 if (getDolGlobalString('ADHERENT_DEFAULT_CREATE_THIRDPARTY')) {
670 if ($result > 0) {
671 // Create third party out of a member
672 $company = new Societe($db);
673 $result = $company->create_from_member($object);
674 if ($result < 0) {
675 $langs->load("errors");
676 setEventMessages($langs->trans($company->error), null, 'errors');
677 setEventMessages($company->error, $company->errors, 'errors');
678 }
679 } else {
680 setEventMessages($object->error, $object->errors, 'errors');
681 }
682 }
683 }
684 $action = ($result < 0 || !$error) ? '' : 'create';
685
686 if (!$error && $backtopage) {
687 header("Location: ".$backtopage);
688 exit;
689 }
690 }
691
692 if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_delete' && $confirm == 'yes') {
693 $result = $object->delete($user);
694 if ($result > 0) {
695 setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs');
696 if (!empty($backtopage) && !preg_match('/'.preg_quote($_SERVER["PHP_SELF"], '/').'/', $backtopage)) {
697 header("Location: ".$backtopage);
698 exit;
699 } else {
700 header("Location: list.php");
701 exit;
702 }
703 } else {
704 setEventMessages($object->error, null, 'errors');
705 }
706 }
707
708 if ($user->hasRight('adherent', 'creer') && $action == 'confirm_valid' && $confirm == 'yes') {
709 $error = 0;
710
711 $db->begin();
712
713 $adht = new AdherentType($db);
714 $adht->fetch($object->typeid);
715
716 $result = $object->validate($user);
717
718 if ($result >= 0 && !count($object->errors)) {
719 // Send confirmation email (according to parameters of member type. Otherwise generic)
720 if ($object->email && GETPOST("send_mail")) {
721 $subject = '';
722 $msg = '';
723
724 // Send subscription email
725 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
726 $formmail = new FormMail($db);
727 // Set output language
728 $outputlangs = new Translate('', $conf);
729 $outputlangs->setDefaultLang(!empty($object->default_lang) ? $object->default_lang : (empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang));
730 // Load traductions files required by page
731 $outputlangs->loadLangs(array("main", "members", "companies", "install", "other"));
732 // Get email content from template
733 $arraydefaultmessage = null;
734 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION');
735
736 if (!empty($labeltouse)) {
737 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
738 }
739
740 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
741 $subject = (string) $arraydefaultmessage->topic;
742 $msg = (string) $arraydefaultmessage->content;
743 }
744
745 if (empty($labeltouse) || (int) $labeltouse === -1) {
746 //fallback on the old configuration.
747 $langs->load("errors");
748 setEventMessages('<a href="'.DOL_URL_ROOT.'/adherents/admin/member_emails.php">'.$langs->trans('WarningMandatorySetupNotComplete').'</a>', null, 'errors');
749 $error++;
750 } else {
751 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
752 complete_substitutions_array($substitutionarray, $outputlangs, $object);
753 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
754 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs);
755
756 $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/card.php'."\r\n";
757
758 $result = $object->sendEmail($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
759 if ($result < 0) {
760 $error++;
761 setEventMessages($object->error, $object->errors, 'errors');
762 }
763 }
764 }
765 } else {
766 $error++;
767 setEventMessages($object->error, $object->errors, 'errors');
768 }
769
770 if (!$error) {
771 $db->commit();
772 } else {
773 $db->rollback();
774 }
775 $action = '';
776 }
777
778 if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_resiliate') {
779 $error = 0;
780
781 if ($confirm == 'yes') {
782 $adht = new AdherentType($db);
783 $adht->fetch($object->typeid);
784
785 $result = $object->resiliate($user);
786
787 if ($result >= 0 && !count($object->errors)) {
788 if ($object->email && GETPOST("send_mail")) {
789 $subject = '';
790 $msg = '';
791
792 // Send subscription email
793 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
794 $formmail = new FormMail($db);
795 // Set output language
796 $outputlangs = new Translate('', $conf);
797 $outputlangs->setDefaultLang(!empty($object->default_lang) ? $object->default_lang : (empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang));
798 // Load traductions files required by page
799 $outputlangs->loadLangs(array("main", "members", "companies", "install", "other"));
800 // Get email content from template
801 $arraydefaultmessage = null;
802 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_CANCELATION');
803
804 if (!empty($labeltouse)) {
805 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
806 }
807
808 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
809 $subject = (string) $arraydefaultmessage->topic;
810 $msg = (string) $arraydefaultmessage->content;
811 }
812
813 if (empty($labeltouse) || (int) $labeltouse === -1) {
814 //fallback on the old configuration.
815 setEventMessages('WarningMandatorySetupNotComplete', null, 'errors');
816 $error++;
817 } else {
818 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
819 complete_substitutions_array($substitutionarray, $outputlangs, $object);
820 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
821 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnResiliate()), $substitutionarray, $outputlangs);
822
823 $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/card.php'."\r\n";
824
825 $result = $object->sendEmail($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
826 if ($result < 0) {
827 $error++;
828 setEventMessages($object->error, $object->errors, 'errors');
829 }
830 }
831 }
832 } else {
833 $error++;
834
835 setEventMessages($object->error, $object->errors, 'errors');
836 $action = '';
837 }
838 }
839 if (!empty($backtopage) && !$error) {
840 header("Location: ".$backtopage);
841 exit;
842 }
843 }
844
845 if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_exclude') {
846 $error = 0;
847
848 if ($confirm == 'yes') {
849 $adht = new AdherentType($db);
850 $adht->fetch($object->typeid);
851
852 $result = $object->exclude($user);
853
854 if ($result >= 0 && !count($object->errors)) {
855 if ($object->email && GETPOST("send_mail")) {
856 $subject = '';
857 $msg = '';
858
859 // Send subscription email
860 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
861 $formmail = new FormMail($db);
862 // Set output language
863 $outputlangs = new Translate('', $conf);
864 $outputlangs->setDefaultLang(!empty($object->default_lang) ? $object->default_lang : (empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang));
865 // Load traductions files required by page
866 $outputlangs->loadLangs(array("main", "members", "companies", "install", "other"));
867 // Get email content from template
868 $arraydefaultmessage = null;
869 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_EXCLUSION');
870
871 if (!empty($labeltouse)) {
872 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
873 }
874
875 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
876 $subject = (string) $arraydefaultmessage->topic;
877 $msg = (string) $arraydefaultmessage->content;
878 }
879
880 if (empty($labeltouse) || (int) $labeltouse === -1) {
881 //fallback on the old configuration.
882 setEventMessages('WarningMandatorySetupNotComplete', null, 'errors');
883 $error++;
884 } else {
885 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
886 complete_substitutions_array($substitutionarray, $outputlangs, $object);
887 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
888 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnExclude()), $substitutionarray, $outputlangs);
889
890 $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/card.php'."\r\n";
891
892 $result = $object->sendEmail($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
893 if ($result < 0) {
894 $error++;
895 setEventMessages($object->error, $object->errors, 'errors');
896 }
897 }
898 }
899 } else {
900 $error++;
901
902 setEventMessages($object->error, $object->errors, 'errors');
903 $action = '';
904 }
905 }
906 if (!empty($backtopage) && !$error) {
907 header("Location: ".$backtopage);
908 exit;
909 }
910 }
911
912 if ($action == 'update_extras' && $permissiontoeditextra) {
913 $object->oldcopy = dol_clone($object, 2); // @phan-suppress-current-line PhanTypeMismatchProperty
914 $attribute_name = GETPOST('attribute', 'aZ09');
915
916 // Fill array 'array_options' with data from update form
917 $ret = $extrafields->setOptionalsFromPost(null, $object, $attribute_name);
918 if ($ret < 0) {
919 $error++;
920 }
921 if (!$error) {
922 $result = $object->updateExtraField($attribute_name, 'MEMBER_MODIFY');
923 if ($result < 0) {
924 setEventMessages($object->error, $object->errors, 'errors');
925 $error++;
926 }
927 }
928 if ($error) {
929 $action = 'edit_extras';
930 }
931 }
932
933 // SPIP Management
934 if (is_object($mailmanspip)) {
935 if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_del_spip' && $confirm == 'yes') {
936 if (!count($object->errors)) {
937 if (!$mailmanspip->del_to_spip($object)) {
938 setEventMessages($langs->trans('DeleteIntoSpipError').': '.$mailmanspip->error, null, 'errors');
939 }
940 }
941 }
942
943 if ($user->hasRight('adherent', 'creer') && $action == 'confirm_add_spip' && $confirm == 'yes') {
944 if (!count($object->errors)) {
945 if (!$mailmanspip->add_to_spip($object)) {
946 setEventMessages($langs->trans('AddIntoSpipError').': '.$mailmanspip->error, null, 'errors');
947 }
948 }
949 }
950 }
951
952 // Actions when printing a doc from card
953 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
954
955 // Actions to build doc
956 $upload_dir = $conf->member->dir_output;
957 $permissiontoadd = $user->hasRight('adherent', 'creer');
958 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
959
960 // Actions to send emails
961 $triggersendname = 'MEMBER_SENTBYMAIL';
962 $paramname = 'id';
963 $mode = 'emailfrommember';
964 $trackid = 'mem'.$object->id;
965 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
966}
967
968
969/*
970 * View
971 */
972
973$form = new Form($db);
974$formfile = new FormFile($db);
975$formadmin = new FormAdmin($db);
976$formcompany = new FormCompany($db);
977
978$title = $langs->trans("Member")." - ".$langs->trans("Card");
979$help_url = 'EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder';
980
981llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-member page-card');
982
983$countrynotdefined = $langs->trans("ErrorSetACountryFirst").' ('.$langs->trans("SeeAbove").')';
984
985if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
986 // -----------------------------------------
987 // When used with CANVAS
988 // -----------------------------------------
989 if (empty($object->error) && $id) {
990 $object = new Adherent($db);
991 $result = $object->fetch($id);
992 if ($result <= 0) {
993 dol_print_error(null, $object->error);
994 }
995 }
996 $objcanvas->assign_values($action, $object->id, $object->ref); // Set value for templates
997 $objcanvas->display_canvas($action); // Show template
998} else {
999 // -----------------------------------------
1000 // When used in standard mode
1001 // -----------------------------------------
1002
1003 // Create mode
1004 if ($action == 'create') {
1005 $object->canvas = $canvas;
1006 $object->state_id = GETPOSTINT('state_id');
1007
1008 // We set country_id, country_code and country for the selected country
1009 $object->country_id = GETPOSTINT('country_id') ? GETPOSTINT('country_id') : $mysoc->country_id;
1010 if ($object->country_id) {
1011 $tmparray = getCountry($object->country_id, 'all');
1012 $object->country_code = $tmparray['code'];
1013 $object->country = $tmparray['label'];
1014 }
1015
1016 $soc = new Societe($db);
1017 if (!empty($socid)) {
1018 if ($socid > 0) {
1019 $soc->fetch($socid);
1020 }
1021
1022 if (!($soc->id > 0)) {
1023 $langs->load("errors");
1024 print($langs->trans('ErrorRecordNotFound'));
1025 exit;
1026 }
1027 }
1028
1029 $adht = new AdherentType($db);
1030
1031 print load_fiche_titre($langs->trans("NewMember"), '', $object->picto);
1032
1033 if ($conf->use_javascript_ajax) {
1034 print "\n".'<script type="text/javascript">'."\n";
1035 print 'jQuery(document).ready(function () {
1036 jQuery("#selectcountry_id").change(function() {
1037 document.formsoc.action.value="create";
1038 document.formsoc.submit();
1039 });
1040 function initfieldrequired() {
1041 jQuery("#tdcompany").removeClass("fieldrequired");
1042 jQuery("#tdlastname").removeClass("fieldrequired");
1043 jQuery("#tdfirstname").removeClass("fieldrequired");
1044 if (jQuery(\'input[name="morphy"]:checked\').val() == \'mor\') {
1045 jQuery("#tdcompany").addClass("fieldrequired");
1046 }
1047 if (jQuery(\'input[name="morphy"]:checked\').val() == \'phy\') {
1048 jQuery("#tdlastname").addClass("fieldrequired");
1049 jQuery("#tdfirstname").addClass("fieldrequired");
1050 }
1051 }
1052 jQuery(\'input[name="morphy"]\').change(function() {
1053 initfieldrequired();
1054 });
1055 initfieldrequired();
1056 })';
1057 print '</script>'."\n";
1058 }
1059
1060 print '<form name="formsoc" action="'.$_SERVER["PHP_SELF"].'" method="post" enctype="multipart/form-data" spellcheck="false">';
1061 print '<input type="hidden" name="token" value="'.newToken().'">';
1062 print '<input type="hidden" name="action" value="add">';
1063 print '<input type="hidden" name="socid" value="'.$socid.'">';
1064 if ($backtopage) {
1065 print '<input type="hidden" name="backtopage" value="'.($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]).'">';
1066 }
1067
1068 print dol_get_fiche_head(array());
1069
1070 print '<table class="border centpercent">';
1071 print '<tbody>';
1072
1073 // Login
1074 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1075 print '<tr><td><span class="fieldrequired">'.$langs->trans("Login").' / '.$langs->trans("Id").'</span></td><td><input type="text" name="member_login" class="minwidth300" maxlength="50" value="'.(GETPOSTISSET("member_login") ? GETPOST("member_login", 'alphanohtml', 2) : $object->login).'" autofocus="autofocus"></td></tr>';
1076 }
1077
1078 // Password
1079 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1080 require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
1081 $generated_password = getRandomPassword(false);
1082 print '<tr><td><span class="fieldrequired">'.$langs->trans("Password").'</span></td><td>';
1083 print '<input type="password" class="minwidth300" maxlength="50" name="password" value="'.dol_escape_htmltag(GETPOST('password') ? GETPOST('password') : $generated_password).'">';
1084 print '</td></tr>';
1085 }
1086
1087 // Type
1088 print '<tr><td class="fieldrequired">'.$langs->trans("MemberType").'</td><td>';
1089 $listetype = $adht->liste_array(1);
1090 print img_picto('', $adht->picto, 'class="pictofixedwidth"');
1091 if (count($listetype)) {
1092 print $form->selectarray("typeid", $listetype, (GETPOSTINT('typeid') ? GETPOSTINT('typeid') : $typeid), (count($listetype) > 1 ? 1 : 0), 0, 0, '', 0, 0, 0, '', 'minwidth200', 1);
1093 } else {
1094 print '<span class="error">'.$langs->trans("NoTypeDefinedGoToSetup").'</span>';
1095 }
1096 if ($user->hasRight('member', 'configurer')) {
1097 print ' <a href="'.dolBuildUrl(DOL_URL_ROOT.'/adherents/type.php', ['action' => 'create', 'backtopage' => dolBuildUrl($_SERVER["PHP_SELF"], ['action' => 'create', 'typeid' => '--IDFORBACKTOPAGE--'])]).'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("NewMemberType").'"></span></a>';
1098 }
1099 print "</td>\n";
1100
1101 // Legal entity or natural person
1102 $morphys = [
1103 "phy" => $langs->trans("Physical"),
1104 "mor" => $langs->trans("Moral"),
1105 ];
1106 $checkednature = GETPOST("morphy", 'alpha');
1107 $listetype_natures = $adht->morphyByType(1);
1108 $listetype_natures_json = json_encode($listetype_natures);
1109
1110 print '<tr><td class="fieldrequired">'.$langs->trans("MemberNature")."</td><td>\n";
1111 print '<span id="spannature1" class="nonature-back spannature paddinglarge marginrightonly"><label for="phisicalinput" class="spanlabel">'.$morphys["phy"].'</label><input id="phisicalinput" class="flat checkforselect marginleftonly valignmiddle" type="radio" name="morphy" value="phy"'.($checkednature == "phy" ? ' checked="checked"' : '').'></span>';
1112 print '<span id="spannature2" class="nonature-back spannature paddinglarge marginrightonly"><label for="moralinput" class="spanlabel">'.$morphys["mor"].'</label><input id="moralinput" class="flat checkforselect marginleftonly valignmiddle" type="radio" name="morphy" value="mor"'.($checkednature == "mor" ? ' checked="checked"' : '').'></span>';
1113
1114 // Add JS to manage the background of nature
1115 if ($conf->use_javascript_ajax) {
1116 print "<script>
1117 var listetype_natures = $listetype_natures_json;
1118 </script>";
1119 print '<script>
1120 jQuery(function($) {
1121 function refreshNatureCss() {
1122 $(".spannature").each(function(index) {
1123 let $span = $("#spannature" + (index + 1));
1124 let checked = $span.find(".checkforselect").is(":checked");
1125
1126 if (checked) {
1127 if (index === 0) {
1128 $span.addClass("member-individual-back").removeClass("nonature-back member-company-back");
1129 } else if (index === 1) {
1130 $span.addClass("member-company-back").removeClass("nonature-back member-individual-back");
1131 }
1132 } else {
1133 $span.removeClass("member-individual-back member-company-back")
1134 .addClass("nonature-back");
1135 }
1136 });
1137 }
1138
1139 $(".spannature").on("click", function() {
1140 console.log("Nature clicked");
1141 refreshNatureCss();
1142 });
1143
1144 $("#typeid").on("change", function() {
1145 let morphy = listetype_natures[$(this).val()];
1146
1147 let $phyInput = $("#phisicalinput");
1148 let $morInput = $("#moralinput");
1149 let $tdLast = $("#tdlastname");
1150 let $tdFirst = $("#tdfirstname");
1151 let $tdCompany = $("#tdcompany");
1152 let $span1 = $("#spannature1");
1153 let $span2 = $("#spannature2");
1154
1155 switch (morphy) {
1156 case "phy":
1157 $phyInput.prop({disabled: false, checked: true});
1158 $morInput.prop({disabled: true, checked: false});
1159 $span1.addClass("member-individual-back").removeClass("nonature-back");
1160 $span2.removeClass("member-company-back").addClass("nonature-back");
1161 $tdLast.addClass("fieldrequired");
1162 $tdFirst.addClass("fieldrequired");
1163 $tdCompany.removeClass("fieldrequired");
1164 break;
1165
1166 case "mor":
1167 $phyInput.prop({disabled: true, checked: false});
1168 $morInput.prop({disabled: false, checked: true});
1169 $span2.addClass("member-company-back").removeClass("nonature-back");
1170 $span1.removeClass("member-individual-back").addClass("nonature-back");
1171 $tdCompany.addClass("fieldrequired");
1172 $tdLast.removeClass("fieldrequired");
1173 $tdFirst.removeClass("fieldrequired");
1174 break;
1175
1176 default:
1177 $phyInput.prop({disabled: false, checked: false});
1178 $morInput.prop({disabled: false, checked: false});
1179 $span1.removeClass("member-individual-back").addClass("nonature-back");
1180 $span2.removeClass("member-company-back").addClass("nonature-back");
1181 }
1182 });
1183
1184 // Initial state
1185 refreshNatureCss();
1186 });
1187 </script>';
1188 }
1189
1190 print "</td>\n";
1191
1192 // Company
1193 print '<tr><td id="tdcompany">'.$langs->trans("Company").' / '.$langs->trans("Organization").'</td><td>'.img_picto('', 'company', 'class="pictofixedwidth"').'<input type="text" name="societe" class="minwidth300" maxlength="128" value="'.(GETPOSTISSET('societe') ? GETPOST('societe', 'alphanohtml') : $soc->name).'"></td></tr>';
1194
1195 // Civility
1196 if (getDolGlobalString('MAIN_USE_TITLE_FOR_MEMBER')) {
1197 print '<tr><td>'.$langs->trans("UserTitle").'</td><td>';
1198 print $formcompany->select_civility(GETPOSTISSET('civility_code') ? GETPOST('civility_code', "aZ09") : $object->civility_code, 'civility_code', 'maxwidth150', 1);
1199 print '</td>';
1200 print '</tr>';
1201 }
1202
1203 // Lastname
1204 print '<tr><td id="tdlastname">'.$langs->trans("Lastname").'</td><td><input type="text" name="lastname" class="minwidth300" maxlength="50" value="'.(GETPOSTISSET('lastname') ? GETPOST('lastname', 'alphanohtml') : $object->lastname).'"></td>';
1205 print '</tr>';
1206
1207 // Firstname
1208 print '<tr><td id="tdfirstname">'.$langs->trans("Firstname").'</td><td><input type="text" name="firstname" class="minwidth300" maxlength="50" value="'.(GETPOSTISSET('firstname') ? GETPOST('firstname', 'alphanohtml') : $object->firstname).'"></td>';
1209 print '</tr>';
1210
1211 // Gender
1212 print '<tr><td>'.$langs->trans("Gender").'</td>';
1213 print '<td>';
1214 $arraygender = array('man' => $langs->trans("Genderman"), 'woman' => $langs->trans("Genderwoman"), 'other' => $langs->trans("Genderother"));
1215 print $form->selectarray('gender', $arraygender, GETPOST('gender', 'alphanohtml'), 1, 0, 0, '', 0, 0, 0, '', 'minwidth100', 1);
1216 print '</td></tr>';
1217
1218 // EMail
1219 print '<tr><td>'.(getDolGlobalString('ADHERENT_MAIL_REQUIRED') ? '<span class="fieldrequired">' : '').$langs->trans("EMail").(getDolGlobalString('ADHERENT_MAIL_REQUIRED') ? '</span>' : '').'</td>';
1220 print '<td>'.img_picto('', 'object_email', 'class="pictofixedwidth"').' <input type="text" name="member_email" class="minwidth300" maxlength="255" value="'.(GETPOSTISSET('member_email') ? GETPOST('member_email', 'alpha') : $soc->email).'"></td></tr>';
1221
1222 // Website
1223 print '<tr><td>'.$form->editfieldkey('Web', 'member_url', GETPOST('member_url', 'alpha'), $object, 0).'</td>';
1224 print '<td>'.img_picto('', 'globe', 'class="pictofixedwidth"').' <input type="text" class="maxwidth500 widthcentpercentminusx" name="member_url" id="member_url" value="'.(GETPOSTISSET('member_url') ? GETPOST('member_url', 'alpha') : $object->url).'"></td></tr>';
1225
1226 // Address
1227 print '<tr><td class="tdtop">'.$langs->trans("Address").'</td><td>';
1228 print '<textarea name="address" wrap="soft" class="quatrevingtpercent" rows="2">'.(GETPOSTISSET('address') ? GETPOST('address', 'alphanohtml') : $soc->address).'</textarea>';
1229 print '</td></tr>';
1230
1231 // Zip / Town
1232 print '<tr><td>'.$langs->trans("Zip").' / '.$langs->trans("Town").'</td><td>';
1233 print $formcompany->select_ziptown((GETPOSTISSET('zipcode') ? GETPOST('zipcode', 'alphanohtml') : $soc->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6);
1234 print ' ';
1235 print $formcompany->select_ziptown((GETPOSTISSET('town') ? GETPOST('town', 'alphanohtml') : $soc->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
1236 print '</td></tr>';
1237
1238 // Country
1239 if (empty($soc->country_id)) {
1240 $soc->country_id = $mysoc->country_id;
1241 $soc->country_code = $mysoc->country_code;
1242 $soc->state_id = $mysoc->state_id;
1243 }
1244 print '<tr><td>'.$langs->trans('Country').'</td><td>';
1245 print img_picto('', 'country', 'class="pictofixedwidth"');
1246 print $form->select_country(GETPOSTISSET('country_id') ? GETPOST('country_id', 'alpha') : $soc->country_id, 'country_id');
1247 if ($user->admin) {
1248 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1249 }
1250 print '</td></tr>';
1251
1252 // State
1253 if (!getDolGlobalString('MEMBER_DISABLE_STATE')) {
1254 print '<tr><td>'.$langs->trans('State').'</td><td>';
1255 if ($soc->country_id || GETPOSTISSET('country_id')) {
1256 print img_picto('', 'state', 'class="pictofixedwidth"');
1257 print $formcompany->select_state(GETPOSTISSET('state_id') ? GETPOSTINT('state_id') : $soc->state_id, GETPOSTISSET('country_id') ? GETPOSTINT('country_id') : $soc->country_code);
1258 } else {
1259 print $countrynotdefined;
1260 }
1261 print '</td></tr>';
1262 }
1263
1264 // Pro phone
1265 print '<tr><td>'.$langs->trans("PhonePro").'</td>';
1266 print '<td>'.img_picto('', 'object_phoning', 'class="pictofixedwidth"').'<input type="text" name="phone" size="20" value="'.(GETPOSTISSET('phone') ? GETPOST('phone', 'alpha') : $soc->phone).'"></td></tr>';
1267
1268 // Personal phone
1269 print '<tr><td>'.$langs->trans("PhonePerso").'</td>';
1270 print '<td>'.img_picto('', 'object_phoning', 'class="pictofixedwidth"').'<input type="text" name="phone_perso" size="20" value="'.(GETPOSTISSET('phone_perso') ? GETPOST('phone_perso', 'alpha') : $object->phone_perso).'"></td></tr>';
1271
1272 // Mobile phone
1273 print '<tr><td>'.$langs->trans("PhoneMobile").'</td>';
1274 print '<td>'.img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"').'<input type="text" name="phone_mobile" size="20" value="'.(GETPOSTISSET('phone_mobile') ? GETPOST('phone_mobile', 'alpha') : $object->phone_mobile).'"></td></tr>';
1275
1276 if (isModEnabled('socialnetworks')) {
1277 foreach ($socialnetworks as $key => $value) {
1278 if (!$value['active']) {
1279 break;
1280 }
1281 $val = (GETPOSTISSET('member_'.$key) ? GETPOST('member_'.$key, 'alpha') : (empty($object->socialnetworks[$key]) ? '' : $object->socialnetworks[$key]));
1282 print '<tr><td>'.$langs->trans($value['label']).'</td><td><input type="text" name="member_'.$key.'" size="40" value="'.$val.'"></td></tr>';
1283 }
1284 }
1285
1286 // Birth Date
1287 print "<tr><td>".$langs->trans("DateOfBirth")."</td><td>\n";
1288 print img_picto('', 'object_calendar', 'class="pictofixedwidth"').$form->selectDate(($object->birth ? $object->birth : -1), 'birth', 0, 0, 1, 'formsoc');
1289 print "</td></tr>\n";
1290
1291 // Public profil
1292 print "<tr><td>";
1293 $htmltext = $langs->trans("Public", getDolGlobalString('MAIN_INFO_SOCIETE_NOM'), $linkofpubliclist);
1294 print $form->textwithpicto($langs->trans("MembershipPublic"), $htmltext, 1, 'help', '', 0, 3, 'membershippublic');
1295 print "</td><td>\n";
1296 print $form->selectyesno("public", $object->public, 1, false, 0, 1);
1297 print "</td></tr>\n";
1298
1299 // Categories
1300 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1301 print '<tr><td>'.$form->editfieldkey("Categories", 'memcats', '', $object, 0).'</td><td>';
1302 print $form->selectCategories(Categorie::TYPE_MEMBER, 'memcats', $object);
1303 print "</td></tr>";
1304 }
1305
1306 // Other attributes
1307 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
1308
1309 print '<tbody>';
1310 print "</table>\n";
1311
1312 print dol_get_fiche_end();
1313
1314 print $form->buttonsSaveCancel("AddMember");
1315
1316 print "</form>\n";
1317 }
1318
1319 // Edit mode
1320 if ($action == 'edit') {
1321 $res = $object->fetch($id);
1322 if ($res < 0) {
1323 dol_print_error($db, $object->error);
1324 exit;
1325 }
1326 $res = $object->fetch_optionals();
1327 if ($res < 0) {
1329 exit;
1330 }
1331
1332 $adht = new AdherentType($db);
1333 $adht->fetch($object->typeid);
1334
1335 // We set country_id, and country_code, country of the chosen country
1336 $country = GETPOSTINT('country');
1337 if (!empty($country) || $object->country_id) {
1338 $sql = "SELECT rowid, code, label from ".MAIN_DB_PREFIX."c_country";
1339 $sql .= " WHERE rowid = ".(int) (!empty($country) ? $country : $object->country_id);
1340 $resql = $db->query($sql);
1341 if ($resql) {
1342 $obj = $db->fetch_object($resql);
1343 } else {
1345 $obj = null;
1346 }
1347 if (is_object($obj)) {
1348 $object->country_id = $obj->rowid;
1349 $object->country_code = $obj->code;
1350 $object->country = $langs->trans("Country".$obj->code) ? $langs->trans("Country".$obj->code) : $obj->label;
1351 }
1352 }
1353
1354 $head = member_prepare_head($object);
1355
1356
1357 if ($conf->use_javascript_ajax) {
1358 print "\n".'<script type="text/javascript">';
1359 print 'jQuery(document).ready(function () {
1360 jQuery("#selectcountry_id").change(function() {
1361 document.formsoc.action.value="edit";
1362 document.formsoc.submit();
1363 });
1364 function initfieldrequired() {
1365 jQuery("#tdcompany").removeClass("fieldrequired");
1366 jQuery("#tdlastname").removeClass("fieldrequired");
1367 jQuery("#tdfirstname").removeClass("fieldrequired");
1368 if (jQuery(\'input[name="morphy"]:checked\').val() == \'mor\') {
1369 jQuery("#tdcompany").addClass("fieldrequired");
1370 }
1371 if (jQuery(\'input[name="morphy"]:checked\').val() == \'phy\') {
1372 jQuery("#tdlastname").addClass("fieldrequired");
1373 jQuery("#tdfirstname").addClass("fieldrequired");
1374 }
1375 }
1376 jQuery(\'input[name="morphy"]\').change(function() {
1377 initfieldrequired();
1378 });
1379 initfieldrequired();
1380 })';
1381 print '</script>'."\n";
1382 }
1383
1384 print '<form name="formsoc" action="'.$_SERVER["PHP_SELF"].'" method="post" enctype="multipart/form-data">';
1385 print '<input type="hidden" name="token" value="'.newToken().'" />';
1386 print '<input type="hidden" name="action" value="update" />';
1387 print '<input type="hidden" name="rowid" value="'.$id.'" />';
1388 print '<input type="hidden" name="statut" value="'.$object->status.'" />';
1389 if ($backtopage) {
1390 print '<input type="hidden" name="backtopage" value="'.($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]).'">';
1391 }
1392
1393 print dol_get_fiche_head($head, 'general', $langs->trans("Member"), 0, 'user');
1394
1395 print '<table class="border centpercent">';
1396
1397 // Ref
1398 print '<tr><td class="titlefieldcreate">'.$langs->trans("Ref").'</td><td class="valeur">'.$object->ref.'</td></tr>';
1399
1400 // Login
1401 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1402 print '<tr><td><span class="fieldrequired">'.$langs->trans("Login").' / '.$langs->trans("Id").'</span></td><td><input type="text" name="login" class="minwidth300" maxlength="50" value="'.(GETPOSTISSET("login") ? GETPOST("login", 'alphanohtml', 2) : $object->login).'"></td></tr>';
1403 }
1404
1405 // Password
1406 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1407 print '<tr><td class="fieldrequired">'.$langs->trans("Password").'</td><td><input type="password" name="pass" class="minwidth300" maxlength="50" value="'.dol_escape_htmltag(GETPOSTISSET("pass") ? GETPOST("pass", 'password', 2) : '').'"></td></tr>';
1408 }
1409
1410 // Type
1411 print '<tr><td class="fieldrequired">'.$langs->trans("Type").'</td><td>';
1412 if ($user->hasRight('adherent', 'creer')) {
1413 print $form->selectarray("typeid", $adht->liste_array(), (GETPOSTISSET("typeid") ? GETPOSTINT("typeid") : $object->typeid), 0, 0, 0, '', 0, 0, 0, '', 'minwidth200', 1);
1414 } else {
1415 print $adht->getNomUrl(1);
1416 print '<input type="hidden" name="typeid" value="'.$object->typeid.'">';
1417 }
1418 print "</td></tr>";
1419
1420 // Morphy
1421 $morphys["phy"] = $langs->trans("Physical");
1422 $morphys["mor"] = $langs->trans("Moral");
1423 $checkednature = (GETPOSTISSET("morphy") ? GETPOST("morphy", 'alpha') : $object->morphy);
1424 print '<tr><td><span class="fieldrequired">'.$langs->trans("MemberNature").'</span></td><td>';
1425 print '<span id="spannature1" class="member-individual-back spannature paddinglarge marginrightonly"><label for="phisicalinput" class="">'.$morphys["phy"].'<input id="phisicalinput" class="flat checkforselect marginleftonly valignmiddle" type="radio" name="morphy" value="phy"'.($checkednature == "phy" ? ' checked="checked"' : '').'></label></span>';
1426 print '<span id="spannature1" class="member-company-back spannature paddinglarge marginrightonly"><label for="moralinput" class="">'.$morphys["mor"].'<input id="moralinput" class="flat checkforselect marginleftonly valignmiddle" type="radio" name="morphy" value="mor"'.($checkednature == "mor" ? ' checked="checked"' : '').'></label></span>';
1427 print "</td></tr>";
1428
1429 // Company
1430 print '<tr><td id="tdcompany">'.$langs->trans("Company").'</td><td>'.img_picto('', 'company', 'class="pictofixedwidth"').'<input type="text" name="societe" class="minwidth300" maxlength="128" value="'.(GETPOSTISSET("societe") ? GETPOST("societe", 'alphanohtml', 2) : $object->company).'"></td></tr>';
1431
1432 // Civility
1433 if (getDolGlobalString('MAIN_USE_TITLE_FOR_MEMBER')) {
1434 print '<tr><td>'.$langs->trans("UserTitle").'</td><td>';
1435 print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", 'aZ09') : $object->civility_code, 'civility_code', 'maxwidth150', 1);
1436 print '</td>';
1437 print '</tr>';
1438 }
1439
1440 // Lastname
1441 print '<tr><td id="tdlastname">'.$langs->trans("Lastname").'</td><td><input type="text" name="lastname" class="minwidth300" maxlength="50" value="'.(GETPOSTISSET("lastname") ? GETPOST("lastname", 'alphanohtml', 2) : $object->lastname).'"></td>';
1442 print '</tr>';
1443
1444 // Firstname
1445 print '<tr><td id="tdfirstname">'.$langs->trans("Firstname").'</td><td><input type="text" name="firstname" class="minwidth300" maxlength="50" value="'.(GETPOSTISSET("firstname") ? GETPOST("firstname", 'alphanohtml', 3) : $object->firstname).'"></td>';
1446 print '</tr>';
1447
1448 // Gender
1449 print '<tr><td>'.$langs->trans("Gender").'</td>';
1450 print '<td>';
1451 $arraygender = array('man' => $langs->trans("Genderman"), 'woman' => $langs->trans("Genderwoman"), 'other' => $langs->trans("Genderother"));
1452 print $form->selectarray('gender', $arraygender, GETPOSTISSET('gender') ? GETPOST('gender', 'alphanohtml') : $object->gender, 1, 0, 0, '', 0, 0, 0, '', 'minwidth100', 1);
1453 print '</td></tr>';
1454
1455 // Photo
1456 print '<tr><td>'.$langs->trans("Photo").'</td>';
1457 print '<td class="hideonsmartphone" valign="middle">';
1458 print $form->showphoto('memberphoto', $object)."\n";
1459 if ($caneditfieldmember) {
1460 if ($object->photo) {
1461 print "<br>\n";
1462 }
1463 print '<table class="nobordernopadding">';
1464 if ($object->photo) {
1465 print '<tr><td><input type="checkbox" class="flat photodelete" name="deletephoto" id="photodelete"><label for="photodelete" class="paddingleft">'.$langs->trans("Delete").'</label><br></td></tr>';
1466 }
1467 print '<tr><td>';
1468 $maxfilesizearray = getMaxFileSizeArray();
1469 $maxmin = $maxfilesizearray['maxmin'];
1470 if ($maxmin > 0) {
1471 print '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
1472 }
1473 print '<input type="file" class="flat" name="photo" id="photoinput">';
1474 print '</td></tr>';
1475 print '</table>';
1476 }
1477 print '</td></tr>';
1478
1479 // EMail
1480 print '<tr><td>'.(getDolGlobalString("ADHERENT_MAIL_REQUIRED") ? '<span class="fieldrequired">' : '').$langs->trans("EMail").(getDolGlobalString("ADHERENT_MAIL_REQUIRED") ? '</span>' : '').'</td>';
1481 print '<td>'.img_picto('', 'object_email', 'class="pictofixedwidth"').'<input type="text" name="member_email" class="minwidth300" maxlength="255" value="'.(GETPOSTISSET("member_email") ? GETPOST("member_email", 'alphanohtml', 2) : $object->email).'"></td></tr>';
1482
1483 // Website
1484 print '<tr><td>'.$form->editfieldkey('Web', 'member_url', GETPOST('member_url', 'alpha'), $object, 0).'</td>';
1485 print '<td>'.img_picto('', 'globe', 'class="pictofixedwidth"').'<input type="text" name="member_url" id="member_url" class="maxwidth200onsmartphone maxwidth500 widthcentpercentminusx " value="'.(GETPOSTISSET('member_url') ? GETPOST('member_url', 'alpha') : $object->url).'"></td></tr>';
1486
1487 // Address
1488 print '<tr><td>'.$langs->trans("Address").'</td><td>';
1489 print '<textarea name="address" wrap="soft" class="quatrevingtpercent" rows="'.ROWS_2.'">'.(GETPOSTISSET("address") ? GETPOST("address", 'alphanohtml', 2) : $object->address).'</textarea>';
1490 print '</td></tr>';
1491
1492 // Zip / Town
1493 print '<tr><td>'.$langs->trans("Zip").' / '.$langs->trans("Town").'</td><td>';
1494 print $formcompany->select_ziptown((GETPOSTISSET("zipcode") ? GETPOST("zipcode", 'alphanohtml', 2) : $object->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6);
1495 print ' ';
1496 print $formcompany->select_ziptown((GETPOSTISSET("town") ? GETPOST("town", 'alphanohtml', 2) : $object->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
1497 print '</td></tr>';
1498
1499 // Country
1500 //$object->country_id=$object->country_id?$object->country_id:$mysoc->country_id; // In edit mode we don't force to company country if not defined
1501 print '<tr><td>'.$langs->trans('Country').'</td><td>';
1502 print img_picto('', 'country', 'class="pictofixedwidth"');
1503 print $form->select_country(GETPOSTISSET("country_id") ? GETPOST("country_id", "alpha") : $object->country_id, 'country_id');
1504 if ($user->admin) {
1505 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1506 }
1507 print '</td></tr>';
1508
1509 // State
1510 if (!getDolGlobalString('MEMBER_DISABLE_STATE')) {
1511 print '<tr><td>'.$langs->trans('State').'</td><td>';
1512 print img_picto('', 'state', 'class="pictofixedwidth"');
1513 print $formcompany->select_state($object->state_id, GETPOSTISSET("country_id") ? GETPOST("country_id", "alpha") : $object->country_id);
1514 print '</td></tr>';
1515 }
1516
1517 // Pro phone
1518 print '<tr><td>'.$langs->trans("PhonePro").'</td>';
1519 print '<td>'.img_picto('', 'object_phoning', 'class="pictofixedwidth"').'<input type="text" name="phone" value="'.(GETPOSTISSET("phone") ? GETPOST("phone") : $object->phone).'"></td></tr>';
1520
1521 // Personal phone
1522 print '<tr><td>'.$langs->trans("PhonePerso").'</td>';
1523 print '<td>'.img_picto('', 'object_phoning', 'class="pictofixedwidth"').'<input type="text" name="phone_perso" value="'.(GETPOSTISSET("phone_perso") ? GETPOST("phone_perso") : $object->phone_perso).'"></td></tr>';
1524
1525 // Mobile phone
1526 print '<tr><td>'.$langs->trans("PhoneMobile").'</td>';
1527 print '<td>'.img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"').'<input type="text" name="phone_mobile" value="'.(GETPOSTISSET("phone_mobile") ? GETPOST("phone_mobile") : $object->phone_mobile).'"></td></tr>';
1528
1529 if (isModEnabled('socialnetworks')) {
1530 foreach ($socialnetworks as $key => $value) {
1531 if (!$value['active']) {
1532 break;
1533 }
1534 print '<tr><td>'.$langs->trans($value['label']).'</td><td><input type="text" name="'.$key.'" class="minwidth100" value="'.(GETPOSTISSET($key) ? GETPOST($key, 'alphanohtml') : (isset($object->socialnetworks[$key]) ? $object->socialnetworks[$key] : null)).'"></td></tr>';
1535 }
1536 }
1537
1538 // Birth Date
1539 print "<tr><td>".$langs->trans("DateOfBirth")."</td><td>\n";
1540 print img_picto('', 'object_calendar', 'class="pictofixedwidth"').$form->selectDate(($object->birth ? $object->birth : -1), 'birth', 0, 0, 1, 'formsoc');
1541 print "</td></tr>\n";
1542
1543 // Default language
1544 if (getDolGlobalInt('MAIN_MULTILANGS')) {
1545 print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).'</td><td colspan="3">'."\n";
1546 print img_picto('', 'language', 'class="pictofixedwidth"').$formadmin->select_language($object->default_lang, 'default_lang', 0, array(), 1);
1547 print '</td>';
1548 print '</tr>';
1549 }
1550
1551 // Public profil
1552 print "<tr><td>";
1553 $htmltext = $langs->trans("Public", getDolGlobalString('MAIN_INFO_SOCIETE_NOM'), $linkofpubliclist);
1554 print $form->textwithpicto($langs->trans("MembershipPublic"), $htmltext, 1, 'help', '', 0, 3, 'membershippublic');
1555 print "</td><td>\n";
1556 print $form->selectyesno("public", (GETPOSTISSET("public") ? GETPOST("public", 'alphanohtml', 2) : $object->public), 1, false, 0, 1);
1557 print "</td></tr>\n";
1558
1559 // Categories
1560 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1561 print '<tr><td>'.$form->editfieldkey("Categories", 'memcats', '', $object, 0).'</td>';
1562 print '<td>';
1563 print $form->selectCategories(Categorie::TYPE_MEMBER, 'memcats', $object);
1564 print "</td></tr>";
1565 }
1566
1567 // Third party Dolibarr
1568 if (isModEnabled('societe')) {
1569 print '<tr><td>'.$langs->trans("LinkedToDolibarrThirdParty").'</td><td colspan="2" class="valeur">';
1570 if ($object->socid) {
1571 $company = new Societe($db);
1572 $result = $company->fetch($object->socid);
1573 print $company->getNomUrl(1);
1574 } else {
1575 print $langs->trans("NoThirdPartyAssociatedToMember");
1576 }
1577 print '</td></tr>';
1578 }
1579
1580 // Login Dolibarr
1581 print '<tr><td>'.$langs->trans("LinkedToDolibarrUser").'</td><td colspan="2" class="valeur">';
1582 if ($object->user_id) {
1583 $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id, (string) $object->user_id, 'none');
1584 } else {
1585 print $langs->trans("NoDolibarrAccess");
1586 }
1587 print '</td></tr>';
1588
1589 // Other attributes. Fields from hook formObjectOptions and Extrafields.
1590 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
1591
1592 print '</table>';
1593 print dol_get_fiche_end();
1594
1595 print $form->buttonsSaveCancel("Save", 'Cancel');
1596
1597 print '</form>';
1598 }
1599
1600 // View
1601 if ($id > 0 && $action != 'edit') {
1602 $res = $object->fetch($id);
1603 if ($res < 0) {
1604 dol_print_error($db, $object->error);
1605 exit;
1606 }
1607 $res = $object->fetch_optionals();
1608 if ($res < 0) {
1610 exit;
1611 }
1612
1613 $adht = new AdherentType($db);
1614 $res = $adht->fetch($object->typeid);
1615 if ($res < 0) {
1617 exit;
1618 }
1619
1620
1621 /*
1622 * Show tabs
1623 */
1624 $head = member_prepare_head($object);
1625
1626 print dol_get_fiche_head($head, 'general', $langs->trans("Member"), -1, 'user', 0, '', '', 0, '', 1);
1627
1628 // Confirm create user
1629 if ($action == 'create_user') {
1630 $login = (GETPOSTISSET('login') ? GETPOST('login', 'alphanohtml') : $object->login);
1631 if (empty($login)) {
1632 // Full firstname and name separated with a dot : firstname.name
1633 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1634 $login = dol_buildlogin($object->lastname, $object->firstname);
1635 }
1636 if (empty($login)) {
1637 $login = strtolower(substr($object->firstname, 0, 4)).strtolower(substr($object->lastname, 0, 4));
1638 }
1639
1640 // Create a form array
1641 $formquestion = array(
1642 array('label' => $langs->trans("LoginToCreate"), 'type' => 'text', 'name' => 'login', 'value' => $login)
1643 );
1644 if (isModEnabled('societe') && $object->socid > 0) {
1645 $object->fetch_thirdparty();
1646 $formquestion[] = array('label' => $langs->trans("UserWillBe"), 'type' => 'radio', 'name' => 'internalorexternal', 'default' => 'external', 'values' => array('external' => $langs->trans("External").' - '.$langs->trans("LinkedToDolibarrThirdParty").' '.$object->thirdparty->getNomUrl(1, '', 0, 1), 'internal' => $langs->trans("Internal")));
1647 }
1648 $text = '';
1649 if (isModEnabled('societe') && $object->socid <= 0) {
1650 $text .= $langs->trans("UserWillBeInternalUser").'<br>';
1651 }
1652 $text .= $langs->trans("ConfirmCreateLogin");
1653 print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id, $langs->trans("CreateDolibarrLogin"), $text, "confirm_create_user", $formquestion, 'yes');
1654 }
1655
1656 // Confirm create third party
1657 if ($action == 'create_thirdparty') {
1658 $companyalias = '';
1659 $fullname = $object->getFullName($langs);
1660
1661 if ($object->morphy == 'mor') {
1662 $companyname = (string) $object->company;
1663 if (!empty($fullname)) {
1664 $companyalias = (string) $fullname;
1665 }
1666 } else {
1667 $companyname = $fullname;
1668 if (!empty($object->company)) {
1669 $companyalias = (string) $object->company;
1670 }
1671 }
1672
1673 // Create a form array
1674 $formquestion = array(
1675 array('label' => $langs->trans("NameToCreate"), 'type' => 'text', 'name' => 'companyname', 'value' => $companyname, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"'),
1676 array('label' => $langs->trans("AliasNames"), 'type' => 'text', 'name' => 'companyalias', 'value' => $companyalias, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"')
1677 );
1678
1679 print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id, $langs->trans("CreateDolibarrThirdParty"), $langs->trans("ConfirmCreateThirdParty"), "confirm_create_thirdparty", $formquestion, 'yes');
1680 }
1681
1682 // Confirm validate member
1683 if ($action == 'valid') {
1684 $langs->load("mails");
1685
1686 $adht = new AdherentType($db);
1687 $adht->fetch($object->typeid);
1688
1689 $subject = '';
1690 $msg = '';
1691
1692 // Send subscription email
1693 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1694 $formmail = new FormMail($db);
1695 // Set output language
1696 $outputlangs = new Translate('', $conf);
1697 $outputlangs->setDefaultLang(!empty($object->default_lang) ? $object->default_lang : (empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang));
1698 // Load traductions files required by page
1699 $outputlangs->loadLangs(array("main", "members", "companies", "install", "other"));
1700 // Get email content from template
1701 $arraydefaultmessage = null;
1702 $labeltouse = getDolGlobalString("ADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION");
1703
1704 if (!empty($labeltouse)) {
1705 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1706 }
1707
1708 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1709 $subject = (string) $arraydefaultmessage->topic;
1710 $msg = (string) $arraydefaultmessage->content;
1711 }
1712
1713 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1714 complete_substitutions_array($substitutionarray, $outputlangs, $object);
1715 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1716 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs);
1717
1718 $tmp = $langs->trans("SendingAnEMailToMember");
1719 $tmp .= '<br>'.$langs->trans("MailFrom").': <b>'.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'</b>, ';
1720 $tmp .= '<br>'.$langs->trans("MailRecipient").': <b>'.$object->email.'</b>';
1721 $helpcontent = '';
1722 $helpcontent .= '<b>'.$langs->trans("MailFrom").'</b>: '.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'<br>'."\n";
1723 $helpcontent .= '<b>'.$langs->trans("MailRecipient").'</b>: '.$object->email.'<br>'."\n";
1724 $helpcontent .= '<b>'.$langs->trans("Subject").'</b>:<br>'."\n";
1725 $helpcontent .= $subjecttosend."\n";
1726 $helpcontent .= "<br>";
1727 $helpcontent .= '<b>'.$langs->trans("Content").'</b>:<br>';
1728 $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
1729 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1730 $label = $form->textwithpicto($tmp, $helpcontent, 1, 'help');
1731
1732 // Create form popup
1733 $formquestion = array();
1734 if ($object->email) {
1735 $formquestion[] = array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? true : false));
1736 }
1737 if (isModEnabled('mailman') && getDolGlobalString('ADHERENT_USE_MAILMAN')) {
1738 $formquestion[] = array('type' => 'other', 'label' => $langs->transnoentitiesnoconv("SynchroMailManEnabled"), 'value' => '');
1739 }
1740 if (isModEnabled('mailman') && getDolGlobalString('ADHERENT_USE_SPIP')) {
1741 $formquestion[] = array('type' => 'other', 'label' => $langs->transnoentitiesnoconv("SynchroSpipEnabled"), 'value' => '');
1742 }
1743 print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ValidateMember"), $langs->trans("ConfirmValidateMember"), "confirm_valid", $formquestion, 'yes', 1, 0);
1744 }
1745
1746 // Confirm resiliate
1747 if ($action == 'resiliate') {
1748 $langs->load("mails");
1749
1750 $adht = new AdherentType($db);
1751 $adht->fetch($object->typeid);
1752
1753 $subject = '';
1754 $msg = '';
1755
1756 // Send subscription email
1757 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1758 $formmail = new FormMail($db);
1759 // Set output language
1760 $outputlangs = new Translate('', $conf);
1761 $outputlangs->setDefaultLang(!empty($object->default_lang) ? $object->default_lang : (empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang));
1762 // Load traductions files required by page
1763 $outputlangs->loadLangs(array("main", "members"));
1764 // Get email content from template
1765 $arraydefaultmessage = null;
1766 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_CANCELATION');
1767
1768 if (!empty($labeltouse)) {
1769 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1770 }
1771
1772 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1773 $subject = (string) $arraydefaultmessage->topic;
1774 $msg = (string) $arraydefaultmessage->content;
1775 }
1776
1777 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1778 complete_substitutions_array($substitutionarray, $outputlangs, $object);
1779 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1780 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnResiliate()), $substitutionarray, $outputlangs);
1781
1782 $tmp = $langs->trans("SendingAnEMailToMember");
1783 $tmp .= '<br>('.$langs->trans("MailFrom").': <b>'.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'</b>, ';
1784 $tmp .= $langs->trans("MailRecipient").': <b>'.$object->email.'</b>)';
1785 $helpcontent = '';
1786 $helpcontent .= '<b>'.$langs->trans("MailFrom").'</b>: '.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'<br>'."\n";
1787 $helpcontent .= '<b>'.$langs->trans("MailRecipient").'</b>: '.$object->email.'<br>'."\n";
1788 $helpcontent .= '<b>'.$langs->trans("Subject").'</b>:<br>'."\n";
1789 $helpcontent .= $subjecttosend."\n";
1790 $helpcontent .= "<br>";
1791 $helpcontent .= '<b>'.$langs->trans("Content").'</b>:<br>';
1792 $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
1793 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1794 $label = $form->textwithpicto($tmp, $helpcontent, 1, 'help');
1795
1796 // Create an array
1797 $formquestion = array();
1798 if ($object->email) {
1799 $formquestion[] = array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? 'true' : 'false'));
1800 }
1801 if ($backtopage) {
1802 $formquestion[] = array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]));
1803 }
1804 print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ResiliateMember"), $langs->trans("ConfirmResiliateMember"), "confirm_resiliate", $formquestion, 'no', 1, 240);
1805 }
1806
1807 // Confirm exclude
1808 if ($action == 'exclude') {
1809 $langs->load("mails");
1810
1811 $adht = new AdherentType($db);
1812 $adht->fetch($object->typeid);
1813
1814 $subject = '';
1815 $msg = '';
1816
1817 // Send subscription email
1818 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1819 $formmail = new FormMail($db);
1820 // Set output language
1821 $outputlangs = new Translate('', $conf);
1822 $outputlangs->setDefaultLang(!empty($object->default_lang) ? $object->default_lang : (empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang));
1823 // Load traductions files required by page
1824 $outputlangs->loadLangs(array("main", "members"));
1825 // Get email content from template
1826 $arraydefaultmessage = null;
1827 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_EXCLUSION');
1828
1829 if (!empty($labeltouse)) {
1830 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1831 }
1832
1833 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1834 $subject = (string) $arraydefaultmessage->topic;
1835 $msg = (string) $arraydefaultmessage->content;
1836 }
1837
1838 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1839 complete_substitutions_array($substitutionarray, $outputlangs, $object);
1840 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1841 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnExclude()), $substitutionarray, $outputlangs);
1842
1843 $tmp = $langs->trans("SendingAnEMailToMember");
1844 $tmp .= '<br>('.$langs->trans("MailFrom").': <b>'.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'</b>, ';
1845 $tmp .= $langs->trans("MailRecipient").': <b>'.$object->email.'</b>)';
1846 $helpcontent = '';
1847 $helpcontent .= '<b>'.$langs->trans("MailFrom").'</b>: '.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'<br>'."\n";
1848 $helpcontent .= '<b>'.$langs->trans("MailRecipient").'</b>: '.$object->email.'<br>'."\n";
1849 $helpcontent .= '<b>'.$langs->trans("Subject").'</b>:<br>'."\n";
1850 $helpcontent .= $subjecttosend."\n";
1851 $helpcontent .= "<br>";
1852 $helpcontent .= '<b>'.$langs->trans("Content").'</b>:<br>';
1853 $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
1854 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1855 $label = $form->textwithpicto($tmp, $helpcontent, 1, 'help');
1856
1857 // Create an array
1858 $formquestion = array();
1859 if ($object->email) {
1860 $formquestion[] = array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? 'true' : 'false'));
1861 }
1862 if ($backtopage) {
1863 $formquestion[] = array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]));
1864 }
1865 print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ExcludeMember"), $langs->trans("ConfirmExcludeMember"), "confirm_exclude", $formquestion, 'no', 1, 240);
1866 }
1867
1868 // Confirm remove member
1869 if ($action == 'delete') {
1870 $formquestion = array();
1871 if ($backtopage) {
1872 $formquestion[] = array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]));
1873 }
1874 print $form->formconfirm("card.php?rowid=".$id, $langs->trans("DeleteMember"), $langs->trans("ConfirmDeleteMember"), "confirm_delete", $formquestion, 'no', 1);
1875 }
1876
1877 // Confirm add in spip
1878 if ($action == 'add_spip') {
1879 print $form->formconfirm("card.php?rowid=".$id, $langs->trans('AddIntoSpip'), $langs->trans('AddIntoSpipConfirmation'), 'confirm_add_spip');
1880 }
1881
1882 // Confirm merge
1883 if ($action == 'merge') {
1884 $formquestion = array(
1885 array(
1886 'name' => 'member_origin',
1887 'label' => $langs->trans('MergeOriginMember'),
1888 'type' => 'other',
1889 'value' => $form->selectMembers('', 'member_origin', '', 0, 1, '', 0, array(), 0, 'SelectMember', 0, 'minwidth200', array(), 1, array($object->id))
1890 )
1891 );
1892
1893 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("MergeMembers"), $langs->trans("ConfirmMergeMembers"), "confirm_merge", $formquestion, 'no', 1, 300);
1894 }
1895
1896 // Confirm removed from spip
1897 if ($action == 'del_spip') {
1898 print $form->formconfirm("card.php?rowid=$id", $langs->trans('DeleteIntoSpip'), $langs->trans('DeleteIntoSpipConfirmation'), 'confirm_del_spip');
1899 }
1900
1901 $rowspan = 17;
1902 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1903 $rowspan++;
1904 }
1905 if (isModEnabled('societe')) {
1906 $rowspan++;
1907 }
1908
1909 $linkback = '<a href="'.dolBuildUrl(DOL_URL_ROOT.'/adherents/list.php', ['restore_lastsearch_values' => 1]).'">'.$langs->trans("BackToList").'</a>';
1910
1911 $morehtmlref = '<a href="'.dolBuildUrl(DOL_URL_ROOT.'/adherents/vcard.php', ['id' => $object->id]).'" class="refid valignmiddle">';
1912 $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard', 'class="valignmiddle marginleftonly paddingrightonly"');
1913 $morehtmlref .= '</a>';
1914
1915
1916 dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
1917
1918 print '<div class="fichecenter">';
1919 print '<div class="fichehalfleft">';
1920
1921 print '<div class="underbanner clearboth"></div>';
1922 print '<table class="border tableforfield centpercent">';
1923
1924 // Login
1925 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1926 print '<tr><td class="titlefieldmiddle">'.$langs->trans("Login").' / '.$langs->trans("Id").'</td><td class="valeur">'.dol_escape_htmltag($object->login).'</td></tr>';
1927 }
1928
1929 // Type
1930 print '<tr><td class="titlefieldmiddle">'.$langs->trans("Type").'</td>';
1931 print '<td class="valeur">'.$adht->getNomUrl(1)."</td></tr>\n";
1932
1933 // Morphy
1934 print '<tr><td>'.$langs->trans("MemberNature").'</td>';
1935 print '<td class="valeur">'.$object->getmorphylib('', 1).'</td>';
1936 print '</tr>';
1937
1938 // Company
1939 print '<tr><td>'.$langs->trans("Company").'</td><td class="valeur">'.dol_escape_htmltag($object->company).'</td></tr>';
1940
1941 // Civility
1942 print '<tr><td>'.$langs->trans("UserTitle").'</td><td class="valeur">'.$object->getCivilityLabel().'</td>';
1943 print '</tr>';
1944
1945 // Password
1946 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1947 print '<tr><td>'.$langs->trans("Password").'</td><td>';
1948 if ($object->pass) {
1949 print preg_replace('/./i', '*', $object->pass);
1950 } else {
1951 if ($user->admin) {
1952 print '<!-- '.$langs->trans("Crypted").': '.$object->pass_indatabase_crypted.' -->';
1953 }
1954 print '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
1955 }
1956 if (!empty($object->pass_indatabase) && empty($object->user_id)) { // Show warning only for old password still in clear (does not happen anymore)
1957 $langs->load("errors");
1958 $htmltext = $langs->trans("WarningPasswordSetWithNoAccount");
1959 print ' '.$form->textwithpicto('', $htmltext, 1, 'warning');
1960 }
1961 print '</td></tr>';
1962 }
1963
1964 // Date end subscription
1965 print '<tr><td>'.$langs->trans("SubscriptionEndDate").'</td><td class="valeur">';
1966 if ($object->datefin) {
1967 print dol_print_date($object->datefin, 'day');
1968 if ($object->hasDelay()) {
1969 print " ".img_warning($langs->trans("Late"));
1970 }
1971 } else {
1972 if ($object->need_subscription == 0) {
1973 print $langs->trans("SubscriptionNotNeeded");
1974 } elseif (!$adht->subscription) {
1975 print $langs->trans("SubscriptionNotRecorded");
1976 if (Adherent::STATUS_VALIDATED == $object->status) {
1977 print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
1978 }
1979 } else {
1980 print $langs->trans("SubscriptionNotReceived");
1981 if (Adherent::STATUS_VALIDATED == $object->status) {
1982 print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
1983 }
1984 }
1985 }
1986 print '</td></tr>';
1987
1988 print '</table>';
1989
1990 print '</div>';
1991
1992 print '<div class="fichehalfright">';
1993 print '<div class="underbanner clearboth"></div>';
1994
1995 print '<table class="border tableforfield centpercent">';
1996
1997 // Tags / Categories
1998 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1999 print '<tr><td>'.$langs->trans("Categories").'</td>';
2000 print '<td>';
2001 print $form->showCategories($object->id, Categorie::TYPE_MEMBER, 1);
2002 print '</td></tr>';
2003 }
2004
2005 // Birth Date
2006 print '<tr><td class="titlefieldmiddle">'.$langs->trans("DateOfBirth").'</td><td class="valeur">'.dol_print_date($object->birth, 'day').'</td></tr>';
2007
2008 // Default language
2009 if (getDolGlobalInt('MAIN_MULTILANGS')) {
2010 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
2011 print '<tr><td>'.$langs->trans("DefaultLang").'</td><td>';
2012 //$s=picto_from_langcode($object->default_lang);
2013 //print ($s?$s.' ':'');
2014 $langs->load("languages");
2015 $labellang = ($object->default_lang ? $langs->trans('Language_'.$object->default_lang) : '');
2016 print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
2017 print $labellang;
2018 print '</td></tr>';
2019 }
2020
2021 // Public
2022 print '<tr><td>';
2023 $htmltext = $langs->trans("Public", getDolGlobalString('MAIN_INFO_SOCIETE_NOM'), $linkofpubliclist);
2024 print $form->textwithpicto($langs->trans("MembershipPublic"), $htmltext, 1, 'help', '', 0, 3, 'membershippublic');
2025 print '</td><td class="valeur">'.yn($object->public).'</td></tr>';
2026
2027 // Other attributes
2028 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
2029
2030 // Third party Dolibarr
2031 if (isModEnabled('societe')) {
2032 print '<tr><td>';
2033 $editenable = $user->hasRight('adherent', 'creer');
2034 print $form->editfieldkey('LinkedToDolibarrThirdParty', 'thirdparty', '', $object, $editenable);
2035 print '</td><td colspan="2" class="valeur">';
2036 if ($action == 'editthirdparty') {
2037 $htmlname = 'socid';
2038 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" name="form'.$htmlname.'">';
2039 print '<input type="hidden" name="rowid" value="'.$object->id.'">';
2040 print '<input type="hidden" name="action" value="set'.$htmlname.'">';
2041 print '<input type="hidden" name="token" value="'.newToken().'">';
2042 print '<table class="nobordernopadding">';
2043 print '<tr><td>';
2044 print $form->select_company($object->socid, 'socid', '', 1);
2045 print '</td>';
2046 print '<td class="left"><input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans("Modify").'"></td>';
2047 print '</tr></table></form>';
2048 } else {
2049 if ($object->socid) {
2050 $company = new Societe($db);
2051 $result = $company->fetch($object->socid);
2052 print $company->getNomUrl(1);
2053
2054 // Show link to invoices
2055 $tmparray = $company->getOutstandingBills('customer');
2056 if (!empty($tmparray['refs'])) {
2057 print ' - '.img_picto($langs->trans("Invoices"), 'bill', 'class="paddingright"').'<a href="'.DOL_URL_ROOT.'/compta/facture/list.php?socid='.$object->socid.'">'.$langs->trans("Invoices").' ('.count($tmparray['refs']).')';
2058 // TODO Add alert if warning on at least one invoice late
2059 print '</a>';
2060 }
2061 } else {
2062 print '<span class="opacitymedium">'.$langs->trans("NoThirdPartyAssociatedToMember").'</span>';
2063 }
2064 }
2065 print '</td></tr>';
2066 }
2067
2068 // Login Dolibarr - Link to user
2069 print '<tr><td>';
2070 $editenable = $user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer');
2071 print $form->editfieldkey('LinkedToDolibarrUser', 'login', '', $object, (int) $editenable);
2072 print '</td><td colspan="2" class="valeur">';
2073 if ($action == 'editlogin') {
2074 $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id, (string) $object->user_id, 'userid', array());
2075 } else {
2076 if ($object->user_id) {
2077 $linkeduser = new User($db);
2078 $linkeduser->fetch($object->user_id);
2079 print $linkeduser->getNomUrl(-1);
2080 } else {
2081 print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
2082 }
2083 }
2084 print '</td></tr>';
2085
2086 print "</table>\n";
2087
2088 print "</div></div>\n";
2089 print '<div class="clearboth"></div>';
2090
2091 print dol_get_fiche_end();
2092
2093
2094 /*
2095 * Action bar
2096 */
2097
2098 print '<div class="tabsAction">';
2099 $isinspip = 0;
2100 $parameters = array();
2101 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
2102 if (empty($reshook)) {
2103 if ($action != 'editlogin' && $action != 'editthirdparty') {
2104 // Send
2105 if (empty($user->socid)) {
2106 if (Adherent::STATUS_VALIDATED == $object->status) {
2107 print dolGetButtonAction('', $langs->trans('SendMail'), 'email', dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'presend', 'mode' => 'init'], true).'#formmailbeforetitle', '');
2108 }
2109 }
2110
2111 // Send card by email
2112 // TODO Remove this to replace with a template
2113 /*
2114 if ($user->hasRight('adherent', 'creer')) {
2115 if (Adherent::STATUS_VALIDATED == $object->status) {
2116 if ($object->email) print '<a class="butAction" href="card.php?rowid='.$object->id.'&action=sendinfo&token='.newToken().'">'.$langs->trans("SendCardByMail")."</a>\n";
2117 else print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NoEMail")).'">'.$langs->trans("SendCardByMail")."</a>\n";
2118 } else {
2119 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("ValidateBefore")).'">'.$langs->trans("SendCardByMail")."</span>";
2120 }
2121 } else {
2122 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("SendCardByMail")."</span>";
2123 }*/
2124
2125 // Modify
2126 if ($user->hasRight('adherent', 'creer')) {
2127 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'edit'], true).'">'.$langs->trans("Modify").'</a>'."\n";
2128 } else {
2129 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("Modify").'</span>'."\n";
2130 }
2131
2132 // Validate
2133 if (Adherent::STATUS_DRAFT == $object->status) {
2134 if ($user->hasRight('adherent', 'creer')) {
2135 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'valid'], true).'">'.$langs->trans("Validate").'</a>'."\n";
2136 } else {
2137 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("Validate").'</span>'."\n";
2138 }
2139 }
2140
2141 // Reactivate
2143 if ($user->hasRight('adherent', 'creer')) {
2144 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'valid'], true).'">'.$langs->trans("Reenable")."</a>\n";
2145 } else {
2146 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("Reenable").'</span>'."\n";
2147 }
2148 }
2149
2150 // Resiliate
2151 if (Adherent::STATUS_VALIDATED == $object->status) {
2152 if ($user->hasRight('adherent', 'supprimer')) {
2153 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'resiliate'], true).'">'.$langs->trans("Resiliate")."</a></span>\n";
2154 } else {
2155 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("Resiliate").'</span>'."\n";
2156 }
2157 }
2158
2159 // Exclude
2160 if (Adherent::STATUS_VALIDATED == $object->status) {
2161 if ($user->hasRight('adherent', 'supprimer')) {
2162 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'exclude'], true).'">'.$langs->trans("Exclude")."</a></span>\n";
2163 } else {
2164 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("Exclude").'</span>'."\n";
2165 }
2166 }
2167
2168 // Create third party
2169 if (isModEnabled('societe') && !$object->socid) {
2170 if ($user->hasRight('societe', 'creer')) {
2171 if (Adherent::STATUS_DRAFT != $object->status) {
2172 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'create_thirdparty'], true).'" title="'.dol_escape_htmltag($langs->trans("CreateDolibarrThirdPartyDesc")).'">'.$langs->trans("CreateDolibarrThirdParty").'</a>'."\n";
2173 } else {
2174 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("ValidateBefore")).'">'.$langs->trans("CreateDolibarrThirdParty").'</a>'."\n";
2175 }
2176 } else {
2177 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("CreateDolibarrThirdParty").'</span>'."\n";
2178 }
2179 }
2180
2181 // Create user
2182 if (!$user->socid && !$object->user_id) {
2183 if ($user->hasRight('user', 'user', 'creer')) {
2184 if (Adherent::STATUS_DRAFT != $object->status) {
2185 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'create_user'], true).'" title="'.dol_escape_htmltag($langs->trans("CreateDolibarrLoginDesc")).'">'.$langs->trans("CreateDolibarrLogin").'</a>'."\n";
2186 } else {
2187 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("ValidateBefore")).'">'.$langs->trans("CreateDolibarrLogin").'</a>'."\n";
2188 }
2189 } else {
2190 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("CreateDolibarrLogin").'</span>'."\n";
2191 }
2192 }
2193
2194 // Action SPIP
2195 if (isModEnabled('mailmanspip') && getDolGlobalString('ADHERENT_USE_SPIP')) {
2196 $isinspip = $mailmanspip->is_in_spip($object);
2197
2198 if ($isinspip == 1) {
2199 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'del_spip'], true).'">'.$langs->trans("DeleteIntoSpip").'</a>'."\n";
2200 }
2201 if ($isinspip == 0) {
2202 print '<a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'add_spip'], true).'">'.$langs->trans("AddIntoSpip").'</a>'."\n";
2203 }
2204 }
2205
2206 // Merge
2207 print dolGetButtonAction($langs->trans('MergeMembers'), $langs->trans('Merge'), 'danger', dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'merge'], true), '', $user->hasRight('adherent', 'supprimer'));
2208
2209 // Delete
2210 if ($user->hasRight('adherent', 'supprimer')) {
2211 print '<a class="butActionDelete" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['id' => $object->id, 'action' => 'delete'], true).'">'.$langs->trans("Delete").'</a>'."\n";
2212 } else {
2213 print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("Delete").'</span>'."\n";
2214 }
2215 }
2216 }
2217 print '</div>';
2218
2219 if ($isinspip == -1) {
2220 print '<br><br><span class="error">'.$langs->trans('SPIPConnectionFailed').': '.$mailmanspip->error.'</span>';
2221 }
2222
2223
2224 // Select mail models is same action as presend
2225 if (GETPOST('modelselected')) {
2226 $action = 'presend';
2227 }
2228
2229 if ($action != 'presend') {
2230 print '<div class="fichecenter"><div class="fichehalfleft">';
2231 print '<a name="builddoc"></a>'; // ancre
2232
2233 // Generated documents
2234 $filename = dol_sanitizeFileName($object->ref);
2235 $filedir = $conf->member->dir_output.'/'.get_exdir(0, 0, 0, 1, $object, 'member');
2236 $urlsource = $_SERVER['PHP_SELF'].'?id='.$object->id;
2237 $genallowed = $user->hasRight('adherent', 'lire');
2238 $delallowed = $user->hasRight('adherent', 'creer');
2239
2240 print $formfile->showdocuments('member', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', (empty($object->default_lang) ? '' : $object->default_lang), '', $object);
2241 $somethingshown = $formfile->numoffiles;
2242
2243 // Show links to link elements
2244 //$tmparray = $form->showLinkToObjectBlock($object, null, array('subscription'), 1);
2245 //$somethingshown = $form->showLinkedObjectBlock($object, '');
2246
2247 // Show online payment link
2248 // The list can be complete by the hook 'doValidatePayment' executed inside getValidOnlinePaymentMethods()
2249 include_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
2250 $validpaymentmethod = getValidOnlinePaymentMethods('');
2251 $useonlinepayment = count($validpaymentmethod);
2252
2253 if ($useonlinepayment) {
2254 print '<br>';
2255 // Take the maximum amount among what the member is supposed to pay / has paid in the past
2256 $amount = max($adht->amount, $object->first_subscription_amount, $object->last_subscription_amount);
2257 if (!empty($adht->caneditamount)) {
2258 $amount = max($amount, $adht->minimumamount);
2259 }
2260 if (empty($amount)) {
2261 $amount = 0;
2262 }
2263 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
2264 print showOnlinePaymentUrl('membersubscription', $object->ref, $amount);
2265 }
2266
2267 print '</div><div class="fichehalfright">';
2268
2269 $MAXEVENT = 10;
2270
2271 $morehtmlcenter = '';
2272 $messagingUrl = dolBuildUrl(DOL_URL_ROOT.'/adherents/messaging.php', ['id' => $object->id]);
2273 $morehtmlcenter .= dolGetButtonTitle($langs->trans('ShowAsConversation'), '', 'fa fa-comments imgforviewmode', $messagingUrl, '', 1);
2274 $morehtmlcenter .= dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', dolBuildUrl(DOL_URL_ROOT.'/adherents/agenda.php', ['id' => $object->id]));
2275
2276 // List of actions on element
2277 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
2278 $formactions = new FormActions($db);
2279 $somethingshown = $formactions->showactions($object, $object->element, $socid, 1, 'listactions', $MAXEVENT, '', $morehtmlcenter);
2280
2281 print '</div></div>';
2282 }
2283
2284 // Presend form
2285 $modelmail = 'member';
2286 $defaulttopic = 'CardContent';
2287 $diroutput = $conf->member->dir_output;
2288 $trackid = 'mem'.$object->id;
2289
2290 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
2291 }
2292}
2293
2294// End of page
2295llxFooter();
2296$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
Class to manage members of a foundation.
const STATUS_EXCLUDED
Excluded.
const STATUS_DRAFT
Draft status.
const STATUS_RESILIATED
Resiliated (membership end and was not renew)
const STATUS_VALIDATED
Validated status.
Class to manage members type.
Class to manage canvas.
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 offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage a HTML form to send a unitary email Usage: $formail = new FormMail($db) $formmail->pr...
Class to manage mailman and spip.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
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
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.
addFileIntoDatabaseIndex($dir, $file, $fullpathorig='', $mode='uploaded', $setsharekey=0, $object=null, $forceFullTextIndexation='')
Add a file into database index.
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.
deleteFilesIntoDatabaseIndex($dir, $file, $mode='uploaded', $object=null)
Delete files into database index using search criteria.
dol_buildlogin($lastname, $firstname)
Build a login from lastname, firstname.
isValidUrl($url, $http=0, $pass=0, $port=0, $path=0, $query=0, $anchor=0)
Url string validation <http[s]> :// [user[:pass]@] hostname [port] [/path] [?getquery] [anchor].
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...
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)
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
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.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
getArrayOfSocialNetworks()
Get array of social network dictionary.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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
member_prepare_head(Adherent $object)
Return array head with list of tabs to view object information.
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition repair.php:140
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.
getMaxFileSizeArray()
Return the max allowed for file upload.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.