Test Failed
Branch main (fda838)
by Rafael
50:22
created

AdherentController   F

Complexity

Total Complexity 1417

Size/Duplication

Total Lines 7605
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 4613
dl 0
loc 7605
rs 0.8
c 1
b 0
f 0
wmc 1417

13 Methods

Rating   Name   Duplication   Size   Complexity  
D document() 0 178 26
F ldap() 0 201 28
F agenda() 0 175 31
F type() 0 989 161
C index() 0 143 10
F partnership() 0 258 41
C note() 0 144 17
F type_translation() 0 285 43
D vcard() 0 151 23
C type_ldap() 0 160 14
F card() 0 2071 442
F subscription() 0 1200 259
F list() 0 1559 322

How to fix   Complexity   

Complex Class

Complex classes like AdherentController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use AdherentController, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
/* Copyright (C) 2001-2007  Rodolphe Quiedeville    <[email protected]>
4
 * Copyright (C) 2002-2003	Jean-Louis Bergamo		<[email protected]>
5
 * Copyright (C) 2004-2020	Laurent Destailleur		<[email protected]>
6
 * Copyright (C) 2005-2021	Regis Houssin			<[email protected]>
7
 * Copyright (C) 2005       Brice Davoleau          <[email protected]>
8
 * Copyright (C) 2007       Patrick Raguin  		<[email protected]>
9
 * Copyright (C) 2010       Juanjo Menent           <[email protected]>
10
 * Copyright (C) 2013       Cédric Salvador         <[email protected]>
11
 * Copyright (C) 2014 	    Henry Florian           <[email protected]>
12
 * Copyright (C) 2015-2016  Alexandre Spangaro      <[email protected]>
13
 * Copyright (C) 2015-2023	Frédéric France			<[email protected]>
14
 * Copyright (C) 2019       Nicolas ZABOURI         <[email protected]>
15
 * Copyright (C) 2019       Thibault FOUCART        <[email protected]>
16
 * Copyright (C) 2020		Tobias Sekan		    <[email protected]>
17
 * Copyright (C) 2021       NextGestion 			<[email protected]>
18
 * Copyright (C) 2021-2023  Waël Almoman            <[email protected]>
19
 * Copyright (C) 2024		MDW						<[email protected]>
20
 * Copyright (C) 2024       Rafael San José         <[email protected]>
21
 *
22
 * This program is free software; you can redistribute it and/or modify
23
 * it under the terms of the GNU General Public License as published by
24
 * the Free Software Foundation; either version 3 of the License, or
25
 * (at your option) any later version.
26
 *
27
 * This program is distributed in the hope that it will be useful,
28
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30
 * GNU General Public License for more details.
31
 *
32
 * You should have received a copy of the GNU General Public License
33
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
34
 */
35
36
namespace DoliModules\Adherent\Controller;
37
38
global $conf;
39
global $db;
40
global $user;
41
global $hookmanager;
42
global $user;
43
global $menumanager;
44
global $langs;
45
46
// Load Dolibarr environment
47
require BASE_PATH . '/main.inc.php';
48
require_once BASE_PATH . '/accountancy/class/accountingjournal.class.php';
49
require_once BASE_PATH . '/adherents/class/adherent.class.php';
50
require_once BASE_PATH . '/adherents/class/subscription.class.php';
51
require_once BASE_PATH . '/core/class/extrafields.class.php';
52
require_once BASE_PATH . '/core/class/html.formadmin.class.php';
53
require_once BASE_PATH . '/core/class/html.formfile.class.php';
54
require_once BASE_PATH . '/core/class/html.formprojet.class.php';
55
require_once BASE_PATH . '/core/class/ldap.class.php';
56
require_once BASE_PATH . '/core/class/vcard.class.php';
57
require_once BASE_PATH . '/core/lib/date.lib.php';
58
require_once BASE_PATH . '/core/lib/company.lib.php';
59
require_once BASE_PATH . '/core/lib/files.lib.php';
60
require_once BASE_PATH . '/core/lib/functions2.lib.php';
61
require_once BASE_PATH . '/core/lib/images.lib.php';
62
require_once BASE_PATH . '/core/lib/ldap.lib.php';
63
require_once BASE_PATH . '/core/lib/member.lib.php';
64
require_once BASE_PATH . '/categories/class/categorie.class.php';
65
require_once BASE_PATH . '/compta/bank/class/account.class.php';
66
require_once BASE_PATH . '/contact/class/contact.class.php';
67
require_once BASE_PATH . '/core/class/extrafields.class.php';
68
require_once BASE_PATH . '/core/class/html.formadmin.class.php';
69
require_once BASE_PATH . '/core/class/html.formcompany.class.php';
70
require_once BASE_PATH . '/core/class/html.formfile.class.php';
71
require_once BASE_PATH . '/core/class/html.formother.class.php';
72
require_once BASE_PATH . '/partnership/class/partnership.class.php';
73
require_once BASE_PATH . '/partnership/lib/partnership.lib.php';
74
require_once BASE_PATH . '/product/class/html.formproduct.class.php';
75
require_once BASE_PATH . '/product/class/product.class.php';
76
require_once BASE_PATH . '/societe/class/societe.class.php';
77
78
use Account;
79
use Canvas;
80
use Categorie;
81
use Contact;
82
use DolEditor;
83
use DolGraph;
84
use DoliCore\Base\DolibarrController;
85
use DoliModules\Adherent\Model\Adherent;
86
use DoliModules\Adherent\Model\AdherentType;
87
use DoliModules\Adherent\Model\Subscription;
88
use DoliModules\Adherent\Statistics\AdherentStats;
89
use ExtraFields;
90
use Form;
91
use FormActions;
92
use FormAdmin;
93
use FormCompany;
94
use FormFile;
95
use FormMail;
96
use FormOther;
97
use FormProduct;
98
use InfoBox;
99
use Ldap;
100
use MailmanSpip;
101
use Societe;
102
use Translate;
103
104
class AdherentController extends DolibarrController
105
{
106
    /**
107
     *    \file       htdocs/adherents/agenda.php
108
     *    \ingroup    member
109
     *    \brief      Page of members events
110
     */
111
    public function agenda()
112
    {
113
        global $conf;
114
        global $db;
115
        global $user;
116
        global $hookmanager;
117
        global $user;
118
        global $menumanager;
119
        global $langs;
120
121
// Load translation files required by the page
122
        $langs->loadLangs(array('companies', 'members'));
123
124
// Get Parameters
125
        $id = GETPOSTINT('id') ? GETPOSTINT('id') : GETPOSTINT('rowid');
126
127
// Pagination
128
        $limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
129
        $sortfield = GETPOST('sortfield', 'aZ09comma');
130
        $sortorder = GETPOST('sortorder', 'aZ09comma');
131
        $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
132
        if (empty($page) || $page == -1) {
133
            $page = 0;
134
        }     // If $page is not defined, or '' or -1
135
        $offset = $limit * $page;
136
        $pageprev = $page - 1;
137
        $pagenext = $page + 1;
138
        if (!$sortfield) {
139
            $sortfield = 'a.datep,a.id';
140
        }
141
        if (!$sortorder) {
142
            $sortorder = 'DESC';
143
        }
144
145
        if (GETPOST('actioncode', 'array')) {
146
            $actioncode = GETPOST('actioncode', 'array', 3);
147
            if (!count($actioncode)) {
148
                $actioncode = '0';
149
            }
150
        } else {
151
            $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT'));
152
        }
153
        $search_rowid = GETPOST('search_rowid');
154
        $search_agenda_label = GETPOST('search_agenda_label');
155
156
// Get object canvas (By default, this is not defined, so standard usage of dolibarr)
157
        $objcanvas = null;
158
159
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
160
        $hookmanager->initHooks(array('memberagenda', 'globalcard'));
161
162
// Security check
163
        $result = restrictedArea($user, 'adherent', $id);
164
165
// Initialize technical objects
166
        $object = new Adherent($db);
167
        $result = $object->fetch($id);
168
        if ($result > 0) {
169
            $object->fetch_thirdparty();
170
171
            $adht = new AdherentType($db);
172
            $result = $adht->fetch($object->typeid);
173
        }
174
175
176
        /*
177
         *	Actions
178
         */
179
180
        $parameters = array('id' => $id, 'objcanvas' => $objcanvas);
181
        $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
182
        if ($reshook < 0) {
183
            setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
184
        }
185
186
        if (empty($reshook)) {
187
            // Cancel
188
            if (GETPOST('cancel', 'alpha') && !empty($backtopage)) {
189
                header("Location: " . $backtopage);
190
                exit;
191
            }
192
193
            // Purge search criteria
194
            if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
195
                $actioncode = '';
196
                $search_rowid = '';
197
                $search_agenda_label = '';
198
            }
199
        }
200
201
202
203
        /*
204
         *	View
205
         */
206
207
        $contactstatic = new Contact($db);
208
209
        $form = new Form($db);
210
211
212
        if ($object->id > 0) {
213
            require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php';
214
            require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
215
216
            $langs->load("companies");
217
218
            $title = $langs->trans("Member") . " - " . $langs->trans("Agenda");
219
220
            $help_url = "EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder";
221
222
            llxHeader("", $title, $help_url);
223
224
            if (isModEnabled('notification')) {
225
                $langs->load("mails");
226
            }
227
            $head = member_prepare_head($object);
228
229
            print dol_get_fiche_head($head, 'agenda', $langs->trans("Member"), -1, 'user');
230
231
            $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/list.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
232
233
            $morehtmlref = '<a href="' . DOL_URL_ROOT . '/adherents/vcard.php?id=' . $object->id . '" class="refid">';
234
            $morehtmlref .= img_picto($langs->trans("Download") . ' ' . $langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
235
            $morehtmlref .= '</a>';
236
237
            dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
238
239
            print '<div class="fichecenter">';
240
241
            print '<div class="underbanner clearboth"></div>';
242
243
            $object->info($id);
244
            dol_print_object_info($object, 1);
245
246
            print '</div>';
247
248
            print dol_get_fiche_end();
249
250
251
            //print '<div class="tabsAction">';
252
            //print '</div>';
253
254
255
            $newcardbutton = '';
256
            if (isModEnabled('agenda')) {
257
                $newcardbutton .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT . '/comm/action/card.php?action=create&backtopage=' . urlencode($_SERVER['PHP_SELF']) . ($object->id > 0 ? '?id=' . $object->id : '') . '&origin=member&originid=' . $id);
258
            }
259
260
            if (isModEnabled('agenda') && ($user->hasRight('agenda', 'myactions', 'read') || $user->hasRight('agenda', 'allactions', 'read'))) {
261
                print '<br>';
262
263
                $param = '&id=' . $id;
264
                if (!empty($contextpage) && $contextpage != $_SERVER['PHP_SELF']) {
265
                    $param .= '&contextpage=' . $contextpage;
266
                }
267
                if ($limit > 0 && $limit != $conf->liste_limit) {
268
                    $param .= '&limit=' . $limit;
269
                }
270
271
                print_barre_liste($langs->trans("ActionsOnMember"), 0, $_SERVER['PHP_SELF'], '', $sortfield, $sortorder, '', 0, -1, '', '', $newcardbutton, '', 0, 1, 1);
272
273
                // List of all actions
274
                $filters = array();
275
                $filters['search_agenda_label'] = $search_agenda_label;
276
                $filters['search_rowid'] = $search_rowid;
277
278
                // TODO Replace this with same code than into list.php
279
                show_actions_done($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
280
            }
281
        }
282
283
// End of page
284
        llxFooter();
285
        $db->close();
286
    }
287
288
    /**
289
     *  \file       htdocs/adherents/card.php
290
     *  \ingroup    member
291
     *  \brief      Page of a member
292
     */
293
    public function card()
294
    {
295
        global $conf;
296
        global $db;
297
        global $user;
298
        global $hookmanager;
299
        global $user;
300
        global $menumanager;
301
        global $langs;
302
303
// Load translation files required by the page
304
        $langs->loadLangs(array("companies", "bills", "members", "users", "other", "paypal"));
305
306
307
// Get parameters
308
        $action = GETPOST('action', 'aZ09');
309
        $cancel = GETPOST('cancel', 'alpha');
310
        $backtopage = GETPOST('backtopage', 'alpha');
311
        $confirm = GETPOST('confirm', 'alpha');
312
        $rowid = GETPOSTINT('rowid');
313
        $id = GETPOST('id') ? GETPOSTINT('id') : $rowid;
314
        $typeid = GETPOSTINT('typeid');
315
        $userid = GETPOSTINT('userid');
316
        $socid = GETPOSTINT('socid');
317
        $ref = GETPOST('ref', 'alpha');
318
319
        if (isModEnabled('mailmanspip')) {
320
            include_once DOL_DOCUMENT_ROOT . '/mailmanspip/class/mailmanspip.class.php';
321
322
            $langs->load('mailmanspip');
323
324
            $mailmanspip = new MailmanSpip($db);
325
        }
326
327
        $object = new Adherent($db);
328
        $extrafields = new ExtraFields($db);
329
330
// fetch optionals attributes and labels
331
        $extrafields->fetch_name_optionals_label($object->table_element);
332
333
        $socialnetworks = getArrayOfSocialNetworks();
334
335
// Get object canvas (By default, this is not defined, so standard usage of dolibarr)
336
        $object->getCanvas($id);
337
        $canvas = $object->canvas ? $object->canvas : GETPOST("canvas");
338
        $objcanvas = null;
339
        if (!empty($canvas)) {
340
            require_once DOL_DOCUMENT_ROOT . '/core/class/canvas.class.php';
341
            $objcanvas = new Canvas($db, $action);
342
            $objcanvas->getCanvas('adherent', 'membercard', $canvas);
343
        }
344
345
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
346
        $hookmanager->initHooks(array('membercard', 'globalcard'));
347
348
// Fetch object
349
        if ($id > 0 || !empty($ref)) {
350
            // Load member
351
            $result = $object->fetch($id, $ref);
352
353
            // Define variables to know what current user can do on users
354
            $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer'));
355
            // Define variables to know what current user can do on properties of user linked to edited member
356
            if ($object->user_id) {
357
                // $User is the user who edits, $object->user_id is the id of the related user in the edited member
358
                $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer'))
359
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
360
                $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
361
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
362
            }
363
        }
364
365
// Define variables to determine what the current user can do on the members
366
        $canaddmember = $user->hasRight('adherent', 'creer');
367
// Define variables to determine what the current user can do on the properties of a member
368
        if ($id) {
369
            $caneditfieldmember = $user->hasRight('adherent', 'creer');
370
        }
371
372
// Security check
373
        $result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
374
375
        if (!$user->hasRight('adherent', 'creer') && $action == 'edit') {
376
            accessforbidden('Not enough permission');
377
        }
378
379
        $linkofpubliclist = DOL_MAIN_URL_ROOT . '/public/members/public_list.php' . ((isModEnabled('multicompany')) ? '?entity=' . $conf->entity : '');
380
381
382
        /*
383
         *  Actions
384
         */
385
386
        $parameters = array('id' => $id, 'rowid' => $id, 'objcanvas' => $objcanvas, 'confirm' => $confirm);
387
        $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
388
        if ($reshook < 0) {
389
            setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
390
        }
391
392
        if (empty($reshook)) {
393
            $backurlforlist = '/adherents/list.php';
394
395
            if (empty($backtopage) || ($cancel && empty($id))) {
396
                if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
397
                    if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
398
                        $backtopage = $backurlforlist;
399
                    } else {
400
                        $backtopage = '/adherents/card.php?id=' . ((!empty($id) && $id > 0) ? $id : '__ID__');
401
                    }
402
                }
403
            }
404
405
            if ($cancel) {
406
                if (!empty($backtopageforcancel)) {
407
                    header("Location: " . $backtopageforcancel);
408
                    exit;
409
                } elseif (!empty($backtopage)) {
410
                    header("Location: " . $backtopage);
411
                    exit;
412
                }
413
                $action = '';
414
            }
415
416
            if ($action == 'setuserid' && ($user->hasRight('user', 'self', 'creer') || $user->hasRight('user', 'user', 'creer'))) {
417
                $error = 0;
418
                if (!$user->hasRight('user', 'user', 'creer')) {    // If can edit only itself user, we can link to itself only
419
                    if ($userid != $user->id && $userid != $object->user_id) {
420
                        $error++;
421
                        setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors');
422
                    }
423
                }
424
425
                if (!$error) {
426
                    if ($userid != $object->user_id) {  // If link differs from currently in database
427
                        $result = $object->setUserId($userid);
428
                        if ($result < 0) {
429
                            dol_print_error($object->db, $object->error);
430
                        }
431
                        $action = '';
432
                    }
433
                }
434
            }
435
436
            if ($action == 'setsocid') {
437
                $error = 0;
438
                if (!$error) {
439
                    if ($socid != $object->socid) { // If link differs from currently in database
440
                        $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "adherent";
441
                        $sql .= " WHERE socid = " . ((int) $socid);
442
                        $sql .= " AND entity = " . $conf->entity;
443
                        $resql = $db->query($sql);
444
                        if ($resql) {
445
                            $obj = $db->fetch_object($resql);
446
                            if ($obj && $obj->rowid > 0) {
447
                                $othermember = new Adherent($db);
448
                                $othermember->fetch($obj->rowid);
449
                                $thirdparty = new Societe($db);
450
                                $thirdparty->fetch($socid);
451
                                $error++;
452
                                setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty", $othermember->getFullName($langs), $othermember->login, $thirdparty->name), null, 'errors');
453
                            }
454
                        }
455
456
                        if (!$error) {
457
                            $result = $object->setThirdPartyId($socid);
458
                            if ($result < 0) {
459
                                dol_print_error($object->db, $object->error);
460
                            }
461
                            $action = '';
462
                        }
463
                    }
464
                }
465
            }
466
467
            // Create user from a member
468
            if ($action == 'confirm_create_user' && $confirm == 'yes' && $user->hasRight('user', 'user', 'creer')) {
469
                if ($result > 0) {
470
                    // Creation user
471
                    $nuser = new User($db);
472
                    $tmpuser = dol_clone($object);
473
                    if (GETPOST('internalorexternal', 'aZ09') == 'internal') {
474
                        $tmpuser->fk_soc = 0;
475
                    }
476
477
                    $result = $nuser->create_from_member($tmpuser, GETPOST('login', 'alphanohtml'));
478
479
                    if ($result < 0) {
480
                        $langs->load("errors");
481
                        setEventMessages($langs->trans($nuser->error), null, 'errors');
482
                    } else {
483
                        setEventMessages($langs->trans("NewUserCreated", $nuser->login), null, 'mesgs');
484
                        $action = '';
485
                    }
486
                } else {
487
                    setEventMessages($object->error, $object->errors, 'errors');
488
                }
489
            }
490
491
            // Create third party from a member
492
            if ($action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->hasRight('societe', 'creer')) {
493
                if ($result > 0) {
494
                    // User creation
495
                    $company = new Societe($db);
496
                    $result = $company->create_from_member($object, GETPOST('companyname', 'alpha'), GETPOST('companyalias', 'alpha'));
497
498
                    if ($result < 0) {
499
                        $langs->load("errors");
500
                        setEventMessages($langs->trans($company->error), null, 'errors');
501
                        setEventMessages($company->error, $company->errors, 'errors');
502
                    }
503
                } else {
504
                    setEventMessages($object->error, $object->errors, 'errors');
505
                }
506
            }
507
508
            if ($action == 'update' && !$cancel && $user->hasRight('adherent', 'creer')) {
509
                require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
510
511
                $birthdate = '';
512
                if (GETPOSTINT("birthday") && GETPOSTINT("birthmonth") && GETPOSTINT("birthyear")) {
513
                    $birthdate = dol_mktime(12, 0, 0, GETPOSTINT("birthmonth"), GETPOSTINT("birthday"), GETPOSTINT("birthyear"));
514
                }
515
                $lastname = GETPOST("lastname", 'alphanohtml');
516
                $firstname = GETPOST("firstname", 'alphanohtml');
517
                $gender = GETPOST("gender", 'alphanohtml');
518
                $societe = GETPOST("societe", 'alphanohtml');
519
                $morphy = GETPOST("morphy", 'alphanohtml');
520
                $login = GETPOST("login", 'alphanohtml');
521
                if ($morphy != 'mor' && empty($lastname)) {
522
                    $error++;
523
                    $langs->load("errors");
524
                    setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Lastname")), null, 'errors');
525
                }
526
                if ($morphy != 'mor' && (!isset($firstname) || $firstname == '')) {
527
                    $error++;
528
                    $langs->load("errors");
529
                    setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Firstname")), null, 'errors');
530
                }
531
                if ($morphy == 'mor' && empty($societe)) {
532
                    $error++;
533
                    $langs->load("errors");
534
                    setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Company")), null, 'errors');
535
                }
536
                // Check if the login already exists
537
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
538
                    if (empty($login)) {
539
                        $error++;
540
                        setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Login")), null, 'errors');
541
                    }
542
                }
543
                // Create new object
544
                if ($result > 0 && !$error) {
545
                    $object->oldcopy = dol_clone($object, 2);
546
547
                    // Change values
548
                    $object->civility_id = trim(GETPOST("civility_id", 'alphanohtml'));
549
                    $object->firstname   = trim(GETPOST("firstname", 'alphanohtml'));
550
                    $object->lastname    = trim(GETPOST("lastname", 'alphanohtml'));
551
                    $object->gender      = trim(GETPOST("gender", 'alphanohtml'));
552
                    $object->login       = trim(GETPOST("login", 'alphanohtml'));
553
                    if (GETPOSTISSET('pass')) {
554
                        $object->pass        = trim(GETPOST("pass", 'none'));   // For password, we must use 'none'
555
                    }
556
557
                    $object->societe     = trim(GETPOST("societe", 'alphanohtml')); // deprecated
558
                    $object->company     = trim(GETPOST("societe", 'alphanohtml'));
559
560
                    $object->address     = trim(GETPOST("address", 'alphanohtml'));
561
                    $object->zip         = trim(GETPOST("zipcode", 'alphanohtml'));
562
                    $object->town        = trim(GETPOST("town", 'alphanohtml'));
563
                    $object->state_id    = GETPOSTINT("state_id");
564
                    $object->country_id  = GETPOSTINT("country_id");
565
566
                    $object->phone       = trim(GETPOST("phone", 'alpha'));
567
                    $object->phone_perso = trim(GETPOST("phone_perso", 'alpha'));
568
                    $object->phone_mobile = trim(GETPOST("phone_mobile", 'alpha'));
569
                    $object->email = preg_replace('/\s+/', '', GETPOST("member_email", 'alpha'));
570
                    $object->url = trim(GETPOST('member_url', 'custom', 0, FILTER_SANITIZE_URL));
571
                    $object->socialnetworks = array();
572
                    foreach ($socialnetworks as $key => $value) {
573
                        if (GETPOSTISSET($key) && GETPOST($key, 'alphanohtml') != '') {
574
                            $object->socialnetworks[$key] = trim(GETPOST($key, 'alphanohtml'));
575
                        }
576
                    }
577
                    $object->birth = $birthdate;
578
                    $object->default_lang = GETPOST('default_lang', 'alpha');
579
                    $object->typeid = GETPOSTINT("typeid");
580
                    //$object->note = trim(GETPOST("comment", "restricthtml"));
581
                    $object->morphy = GETPOST("morphy", 'alpha');
582
583
                    if (GETPOST('deletephoto', 'alpha')) {
584
                        $object->photo = '';
585
                    } elseif (!empty($_FILES['photo']['name'])) {
586
                        $object->photo = dol_sanitizeFileName($_FILES['photo']['name']);
587
                    }
588
589
                    // Get status and public property
590
                    $object->statut = GETPOSTINT("statut");
591
                    $object->status = GETPOSTINT("statut");
592
                    $object->public = GETPOSTINT("public");
593
594
                    // Fill array 'array_options' with data from add form
595
                    $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
596
                    if ($ret < 0) {
597
                        $error++;
598
                    }
599
600
                    // Check if we need to also synchronize user information
601
                    $nosyncuser = 0;
602
                    if ($object->user_id) { // If linked to a user
603
                        if ($user->id != $object->user_id && !$user->hasRight('user', 'user', 'creer')) {
604
                            $nosyncuser = 1; // Disable synchronizing
605
                        }
606
                    }
607
608
                    // Check if we need to also synchronize password information
609
                    $nosyncuserpass = 1;    // no by default
610
                    if (GETPOSTISSET('pass')) {
611
                        if ($object->user_id) { // If member is linked to a user
612
                            $nosyncuserpass = 0;    // We may try to sync password
613
                            if ($user->id == $object->user_id) {
614
                                if (!$user->hasRight('user', 'self', 'password')) {
615
                                    $nosyncuserpass = 1; // Disable synchronizing
616
                                }
617
                            } else {
618
                                if (!$user->hasRight('user', 'user', 'password')) {
619
                                    $nosyncuserpass = 1; // Disable synchronizing
620
                                }
621
                            }
622
                        }
623
                    }
624
625
                    if (!$error) {
626
                        $result = $object->update($user, 0, $nosyncuser, $nosyncuserpass);
627
628
                        if ($result >= 0 && !count($object->errors)) {
629
                            $categories = GETPOST('memcats', 'array');
630
                            $object->setCategories($categories);
631
632
                            // Logo/Photo save
633
                            $dir = $conf->adherent->dir_output . '/' . get_exdir(0, 0, 0, 1, $object, 'member') . '/photos';
634
                            $file_OK = is_uploaded_file($_FILES['photo']['tmp_name']);
635
                            if ($file_OK) {
636
                                if (GETPOST('deletephoto')) {
637
                                    require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
638
                                    $fileimg = $conf->adherent->dir_output . '/' . get_exdir(0, 0, 0, 1, $object, 'member') . '/photos/' . $object->photo;
639
                                    $dirthumbs = $conf->adherent->dir_output . '/' . get_exdir(0, 0, 0, 1, $object, 'member') . '/photos/thumbs';
640
                                    dol_delete_file($fileimg);
641
                                    dol_delete_dir_recursive($dirthumbs);
642
                                }
643
644
                                if (image_format_supported($_FILES['photo']['name']) > 0) {
645
                                    dol_mkdir($dir);
646
647
                                    if (@is_dir($dir)) {
648
                                        $newfile = $dir . '/' . dol_sanitizeFileName($_FILES['photo']['name']);
649
                                        if (!dol_move_uploaded_file($_FILES['photo']['tmp_name'], $newfile, 1, 0, $_FILES['photo']['error']) > 0) {
650
                                            setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors');
651
                                        } else {
652
                                            // Create thumbs
653
                                            $object->addThumbs($newfile);
654
                                        }
655
                                    }
656
                                } else {
657
                                    setEventMessages("ErrorBadImageFormat", null, 'errors');
658
                                }
659
                            } else {
660
                                switch ($_FILES['photo']['error']) {
661
                                    case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini
662
                                    case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form
663
                                        $errors[] = "ErrorFileSizeTooLarge";
664
                                        break;
665
                                    case 3: //uploaded file was only partially uploaded
666
                                        $errors[] = "ErrorFilePartiallyUploaded";
667
                                        break;
668
                                }
669
                            }
670
671
                            $rowid = $object->id;
672
                            $id = $object->id;
673
                            $action = '';
674
675
                            if (!empty($backtopage)) {
676
                                header("Location: " . $backtopage);
677
                                exit;
678
                            }
679
                        } else {
680
                            setEventMessages($object->error, $object->errors, 'errors');
681
                            $action = '';
682
                        }
683
                    } else {
684
                        $action = 'edit';
685
                    }
686
                } else {
687
                    $action = 'edit';
688
                }
689
            }
690
691
            if ($action == 'add' && $user->hasRight('adherent', 'creer')) {
692
                if ($canvas) {
693
                    $object->canvas = $canvas;
694
                }
695
                $birthdate = '';
696
                if (GETPOSTISSET("birthday") && GETPOST("birthday") && GETPOSTISSET("birthmonth") && GETPOST("birthmonth") && GETPOSTISSET("birthyear") && GETPOST("birthyear")) {
697
                    $birthdate = dol_mktime(12, 0, 0, GETPOSTINT("birthmonth"), GETPOSTINT("birthday"), GETPOSTINT("birthyear"));
698
                }
699
                $datesubscription = '';
700
                if (GETPOSTISSET("reday") && GETPOSTISSET("remonth") && GETPOSTISSET("reyear")) {
701
                    $datesubscription = dol_mktime(12, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
702
                }
703
704
                $typeid = GETPOSTINT("typeid");
705
                $civility_id = GETPOST("civility_id", 'alphanohtml');
706
                $lastname = GETPOST("lastname", 'alphanohtml');
707
                $firstname = GETPOST("firstname", 'alphanohtml');
708
                $gender = GETPOST("gender", 'alphanohtml');
709
                $societe = GETPOST("societe", 'alphanohtml');
710
                $address = GETPOST("address", 'alphanohtml');
711
                $zip = GETPOST("zipcode", 'alphanohtml');
712
                $town = GETPOST("town", 'alphanohtml');
713
                $state_id = GETPOSTINT("state_id");
714
                $country_id = GETPOSTINT("country_id");
715
716
                $phone = GETPOST("phone", 'alpha');
717
                $phone_perso = GETPOST("phone_perso", 'alpha');
718
                $phone_mobile = GETPOST("phone_mobile", 'alpha');
719
                $email = preg_replace('/\s+/', '', GETPOST("member_email", 'alpha'));
720
                $url = trim(GETPOST('url', 'custom', 0, FILTER_SANITIZE_URL));
721
                $login = GETPOST("member_login", 'alphanohtml');
722
                $pass = GETPOST("password", 'none');    // For password, we use 'none'
723
                $photo = GETPOST("photo", 'alphanohtml');
724
                $morphy = GETPOST("morphy", 'alphanohtml');
725
                $public = GETPOST("public", 'alphanohtml');
726
727
                $userid = GETPOSTINT("userid");
728
                $socid = GETPOSTINT("socid");
729
                $default_lang = GETPOST('default_lang', 'alpha');
730
731
                $object->civility_id = $civility_id;
732
                $object->firstname   = $firstname;
733
                $object->lastname    = $lastname;
734
                $object->gender      = $gender;
735
                $object->societe     = $societe; // deprecated
736
                $object->company     = $societe;
737
                $object->address     = $address;
738
                $object->zip         = $zip;
739
                $object->town        = $town;
740
                $object->state_id    = $state_id;
741
                $object->country_id  = $country_id;
742
                $object->phone       = $phone;
743
                $object->phone_perso = $phone_perso;
744
                $object->phone_mobile = $phone_mobile;
745
                $object->socialnetworks = array();
746
                if (isModEnabled('socialnetworks')) {
747
                    foreach ($socialnetworks as $key => $value) {
748
                        if (GETPOSTISSET($key) && GETPOST($key, 'alphanohtml') != '') {
749
                            $object->socialnetworks[$key] = GETPOST("member_" . $key, 'alphanohtml');
750
                        }
751
                    }
752
                }
753
754
                $object->email       = $email;
755
                $object->url         = $url;
756
                $object->login       = $login;
757
                $object->pass        = $pass;
758
                $object->birth       = $birthdate;
759
                $object->photo       = $photo;
760
                $object->typeid      = $typeid;
761
                //$object->note        = $comment;
762
                $object->morphy      = $morphy;
763
                $object->user_id     = $userid;
764
                $object->socid = $socid;
765
                $object->public      = $public;
766
                $object->default_lang = $default_lang;
767
                // Fill array 'array_options' with data from add form
768
                $ret = $extrafields->setOptionalsFromPost(null, $object);
769
                if ($ret < 0) {
770
                    $error++;
771
                }
772
773
                // Check parameters
774
                if (empty($morphy) || $morphy == "-1") {
775
                    $error++;
776
                    setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("MemberNature")), null, 'errors');
777
                }
778
                // Tests if the login already exists
779
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
780
                    if (empty($login)) {
781
                        $error++;
782
                        setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Login")), null, 'errors');
783
                    } else {
784
                        $sql = "SELECT login FROM " . MAIN_DB_PREFIX . "adherent WHERE login='" . $db->escape($login) . "'";
785
                        $result = $db->query($sql);
786
                        if ($result) {
787
                            $num = $db->num_rows($result);
788
                        }
789
                        if ($num) {
790
                            $error++;
791
                            $langs->load("errors");
792
                            setEventMessages($langs->trans("ErrorLoginAlreadyExists", $login), null, 'errors');
793
                        }
794
                    }
795
                    if (empty($pass)) {
796
                        $error++;
797
                        setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Password")), null, 'errors');
798
                    }
799
                }
800
                if ($morphy == 'mor' && empty($societe)) {
801
                    $error++;
802
                    $langs->load("errors");
803
                    setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Company")), null, 'errors');
804
                }
805
                if ($morphy != 'mor' && empty($lastname)) {
806
                    $error++;
807
                    $langs->load("errors");
808
                    setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Lastname")), null, 'errors');
809
                }
810
                if ($morphy != 'mor' && (!isset($firstname) || $firstname == '')) {
811
                    $error++;
812
                    $langs->load("errors");
813
                    setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Firstname")), null, 'errors');
814
                }
815
                if (!($typeid > 0)) {   // Keep () before !
816
                    $error++;
817
                    setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors');
818
                }
819
                if (getDolGlobalString('ADHERENT_MAIL_REQUIRED') && !isValidEmail($email)) {
820
                    $error++;
821
                    $langs->load("errors");
822
                    setEventMessages($langs->trans("ErrorBadEMail", $email), null, 'errors');
823
                }
824
                if (!empty($object->url) && !isValidUrl($object->url)) {
825
                    $langs->load("errors");
826
                    setEventMessages($langs->trans("ErrorBadUrl", $object->url), null, 'errors');
827
                }
828
                $public = 0;
829
                if (isset($public)) {
830
                    $public = 1;
831
                }
832
833
                if (!$error) {
834
                    $db->begin();
835
836
                    // Create the member
837
                    $result = $object->create($user);
838
                    if ($result > 0) {
839
                        // Foundation categories
840
                        $memcats = GETPOST('memcats', 'array');
841
                        $object->setCategories($memcats);
842
843
                        $db->commit();
844
845
                        $rowid = $object->id;
846
                        $id = $object->id;
847
848
                        $backtopage = preg_replace('/__ID__/', $id, $backtopage);
849
                    } else {
850
                        $db->rollback();
851
852
                        $error++;
853
                        setEventMessages($object->error, $object->errors, 'errors');
854
                    }
855
856
                    // Auto-create thirdparty on member creation
857
                    if (getDolGlobalString('ADHERENT_DEFAULT_CREATE_THIRDPARTY')) {
858
                        if ($result > 0) {
859
                            // Create third party out of a member
860
                            $company = new Societe($db);
861
                            $result = $company->create_from_member($object);
862
                            if ($result < 0) {
863
                                $langs->load("errors");
864
                                setEventMessages($langs->trans($company->error), null, 'errors');
865
                                setEventMessages($company->error, $company->errors, 'errors');
866
                            }
867
                        } else {
868
                            setEventMessages($object->error, $object->errors, 'errors');
869
                        }
870
                    }
871
                }
872
                $action = ($result < 0 || !$error) ? '' : 'create';
873
874
                if (!$error && $backtopage) {
875
                    header("Location: " . $backtopage);
876
                    exit;
877
                }
878
            }
879
880
            if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_delete' && $confirm == 'yes') {
881
                $result = $object->delete($user);
882
                if ($result > 0) {
883
                    setEventMessages($langs->trans("RecordDeleted"), null, 'errors');
884
                    if (!empty($backtopage) && !preg_match('/' . preg_quote($_SERVER['PHP_SELF'], '/') . '/', $backtopage)) {
885
                        header("Location: " . $backtopage);
886
                        exit;
887
                    } else {
888
                        header("Location: list.php");
889
                        exit;
890
                    }
891
                } else {
892
                    setEventMessages($object->error, null, 'errors');
893
                }
894
            }
895
896
            if ($user->hasRight('adherent', 'creer') && $action == 'confirm_valid' && $confirm == 'yes') {
897
                $error = 0;
898
899
                $db->begin();
900
901
                $adht = new AdherentType($db);
902
                $adht->fetch($object->typeid);
903
904
                $result = $object->validate($user);
905
906
                if ($result >= 0 && !count($object->errors)) {
907
                    // Send confirmation email (according to parameters of member type. Otherwise generic)
908
                    if ($object->email && GETPOST("send_mail")) {
909
                        $subject = '';
910
                        $msg = '';
911
912
                        // Send subscription email
913
                        include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
914
                        $formmail = new FormMail($db);
915
                        // Set output language
916
                        $outputlangs = new Translate('', $conf);
917
                        $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
918
                        // Load traductions files required by page
919
                        $outputlangs->loadLangs(array("main", "members", "companies", "install", "other"));
920
                        // Get email content from template
921
                        $arraydefaultmessage = null;
922
                        $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION');
923
924
                        if (!empty($labeltouse)) {
925
                            $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
926
                        }
927
928
                        if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
929
                            $subject = $arraydefaultmessage->topic;
930
                            $msg     = $arraydefaultmessage->content;
931
                        }
932
933
                        if (empty($labeltouse) || (int) $labeltouse === -1) {
934
                            //fallback on the old configuration.
935
                            $langs->load("errors");
936
                            setEventMessages('<a href="' . DOL_URL_ROOT . '/adherents/admin/member_emails.php">' . $langs->trans('WarningMandatorySetupNotComplete') . '</a>', null, 'errors');
937
                            $error++;
938
                        } else {
939
                            $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
940
                            complete_substitutions_array($substitutionarray, $outputlangs, $object);
941
                            $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
942
                            $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs);
943
944
                            $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/card.php' . "\r\n";
945
946
                            $result = $object->sendEmail($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
947
                            if ($result < 0) {
948
                                $error++;
949
                                setEventMessages($object->error, $object->errors, 'errors');
950
                            }
951
                        }
952
                    }
953
                } else {
954
                    $error++;
955
                    setEventMessages($object->error, $object->errors, 'errors');
956
                }
957
958
                if (!$error) {
959
                    $db->commit();
960
                } else {
961
                    $db->rollback();
962
                }
963
                $action = '';
964
            }
965
966
            if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_resiliate') {
967
                $error = 0;
968
969
                if ($confirm == 'yes') {
970
                    $adht = new AdherentType($db);
971
                    $adht->fetch($object->typeid);
972
973
                    $result = $object->resiliate($user);
974
975
                    if ($result >= 0 && !count($object->errors)) {
976
                        if ($object->email && GETPOST("send_mail")) {
977
                            $subject = '';
978
                            $msg = '';
979
980
                            // Send subscription email
981
                            include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
982
                            $formmail = new FormMail($db);
983
                            // Set output language
984
                            $outputlangs = new Translate('', $conf);
985
                            $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
986
                            // Load traductions files required by page
987
                            $outputlangs->loadLangs(array("main", "members", "companies", "install", "other"));
988
                            // Get email content from template
989
                            $arraydefaultmessage = null;
990
                            $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_CANCELATION');
991
992
                            if (!empty($labeltouse)) {
993
                                $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
994
                            }
995
996
                            if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
997
                                $subject = $arraydefaultmessage->topic;
998
                                $msg     = $arraydefaultmessage->content;
999
                            }
1000
1001
                            if (empty($labeltouse) || (int) $labeltouse === -1) {
1002
                                //fallback on the old configuration.
1003
                                setEventMessages('WarningMandatorySetupNotComplete', null, 'errors');
1004
                                $error++;
1005
                            } else {
1006
                                $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1007
                                complete_substitutions_array($substitutionarray, $outputlangs, $object);
1008
                                $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1009
                                $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnResiliate()), $substitutionarray, $outputlangs);
1010
1011
                                $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/card.php' . "\r\n";
1012
1013
                                $result = $object->sendEmail($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
1014
                                if ($result < 0) {
1015
                                    $error++;
1016
                                    setEventMessages($object->error, $object->errors, 'errors');
1017
                                }
1018
                            }
1019
                        }
1020
                    } else {
1021
                        $error++;
1022
1023
                        setEventMessages($object->error, $object->errors, 'errors');
1024
                        $action = '';
1025
                    }
1026
                }
1027
                if (!empty($backtopage) && !$error) {
1028
                    header("Location: " . $backtopage);
1029
                    exit;
1030
                }
1031
            }
1032
1033
            if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_exclude') {
1034
                $error = 0;
1035
1036
                if ($confirm == 'yes') {
1037
                    $adht = new AdherentType($db);
1038
                    $adht->fetch($object->typeid);
1039
1040
                    $result = $object->exclude($user);
1041
1042
                    if ($result >= 0 && !count($object->errors)) {
1043
                        if ($object->email && GETPOST("send_mail")) {
1044
                            $subject = '';
1045
                            $msg = '';
1046
1047
                            // Send subscription email
1048
                            include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
1049
                            $formmail = new FormMail($db);
1050
                            // Set output language
1051
                            $outputlangs = new Translate('', $conf);
1052
                            $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
1053
                            // Load traductions files required by page
1054
                            $outputlangs->loadLangs(array("main", "members", "companies", "install", "other"));
1055
                            // Get email content from template
1056
                            $arraydefaultmessage = null;
1057
                            $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_EXCLUSION');
1058
1059
                            if (!empty($labeltouse)) {
1060
                                $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1061
                            }
1062
1063
                            if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1064
                                $subject = $arraydefaultmessage->topic;
1065
                                $msg     = $arraydefaultmessage->content;
1066
                            }
1067
1068
                            if (empty($labeltouse) || (int) $labeltouse === -1) {
1069
                                //fallback on the old configuration.
1070
                                setEventMessages('WarningMandatorySetupNotComplete', null, 'errors');
1071
                                $error++;
1072
                            } else {
1073
                                $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1074
                                complete_substitutions_array($substitutionarray, $outputlangs, $object);
1075
                                $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1076
                                $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnExclude()), $substitutionarray, $outputlangs);
1077
1078
                                $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/card.php' . "\r\n";
1079
1080
                                $result = $object->sendEmail($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
1081
                                if ($result < 0) {
1082
                                    $error++;
1083
                                    setEventMessages($object->error, $object->errors, 'errors');
1084
                                }
1085
                            }
1086
                        }
1087
                    } else {
1088
                        $error++;
1089
1090
                        setEventMessages($object->error, $object->errors, 'errors');
1091
                        $action = '';
1092
                    }
1093
                }
1094
                if (!empty($backtopage) && !$error) {
1095
                    header("Location: " . $backtopage);
1096
                    exit;
1097
                }
1098
            }
1099
1100
            // SPIP Management
1101
            if ($user->hasRight('adherent', 'supprimer') && $action == 'confirm_del_spip' && $confirm == 'yes') {
1102
                if (!count($object->errors)) {
1103
                    if (!$mailmanspip->del_to_spip($object)) {
1104
                        setEventMessages($langs->trans('DeleteIntoSpipError') . ': ' . $mailmanspip->error, null, 'errors');
1105
                    }
1106
                }
1107
            }
1108
1109
            if ($user->hasRight('adherent', 'creer') && $action == 'confirm_add_spip' && $confirm == 'yes') {
1110
                if (!count($object->errors)) {
1111
                    if (!$mailmanspip->add_to_spip($object)) {
1112
                        setEventMessages($langs->trans('AddIntoSpipError') . ': ' . $mailmanspip->error, null, 'errors');
1113
                    }
1114
                }
1115
            }
1116
1117
            // Actions when printing a doc from card
1118
            include DOL_DOCUMENT_ROOT . '/core/actions_printing.inc.php';
1119
1120
            // Actions to build doc
1121
            $upload_dir = $conf->adherent->dir_output;
1122
            $permissiontoadd = $user->hasRight('adherent', 'creer');
1123
            include DOL_DOCUMENT_ROOT . '/core/actions_builddoc.inc.php';
1124
1125
            // Actions to send emails
1126
            $triggersendname = 'MEMBER_SENTBYMAIL';
1127
            $paramname = 'id';
1128
            $mode = 'emailfrommember';
1129
            $trackid = 'mem' . $object->id;
1130
            include DOL_DOCUMENT_ROOT . '/core/actions_sendmails.inc.php';
1131
        }
1132
1133
1134
        /*
1135
         * View
1136
         */
1137
1138
        $form = new Form($db);
1139
        $formfile = new FormFile($db);
1140
        $formadmin = new FormAdmin($db);
1141
        $formcompany = new FormCompany($db);
1142
1143
        $title = $langs->trans("Member") . " - " . $langs->trans("Card");
1144
        $help_url = 'EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder';
1145
        llxHeader('', $title, $help_url);
1146
1147
        $countrynotdefined = $langs->trans("ErrorSetACountryFirst") . ' (' . $langs->trans("SeeAbove") . ')';
1148
1149
        if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
1150
            // -----------------------------------------
1151
            // When used with CANVAS
1152
            // -----------------------------------------
1153
            if (empty($object->error) && $id) {
1154
                $object = new Adherent($db);
1155
                $result = $object->fetch($id);
1156
                if ($result <= 0) {
1157
                    dol_print_error(null, $object->error);
1158
                }
1159
            }
1160
            $objcanvas->assign_values($action, $object->id, $object->ref); // Set value for templates
1161
            $objcanvas->display_canvas($action); // Show template
1162
        } else {
1163
            // -----------------------------------------
1164
            // When used in standard mode
1165
            // -----------------------------------------
1166
1167
            // Create mode
1168
            if ($action == 'create') {
1169
                $object->canvas = $canvas;
1170
                $object->state_id = GETPOSTINT('state_id');
1171
1172
                // We set country_id, country_code and country for the selected country
1173
                $object->country_id = GETPOSTINT('country_id') ? GETPOSTINT('country_id') : $mysoc->country_id;
1174
                if ($object->country_id) {
1175
                    $tmparray = getCountry($object->country_id, 'all');
1176
                    $object->country_code = $tmparray['code'];
1177
                    $object->country = $tmparray['label'];
1178
                }
1179
1180
                $soc = new Societe($db);
1181
                if (!empty($socid)) {
1182
                    if ($socid > 0) {
1183
                        $soc->fetch($socid);
1184
                    }
1185
1186
                    if (!($soc->id > 0)) {
1187
                        $langs->load("errors");
1188
                        print($langs->trans('ErrorRecordNotFound'));
1189
                        exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
1190
                    }
1191
                }
1192
1193
                $adht = new AdherentType($db);
1194
1195
                print load_fiche_titre($langs->trans("NewMember"), '', $object->picto);
1196
1197
                if ($conf->use_javascript_ajax) {
1198
                    print "\n" . '<script type="text/javascript">' . "\n";
1199
                    print 'jQuery(document).ready(function () {
1200
						jQuery("#selectcountry_id").change(function() {
1201
							document.formsoc.action.value="create";
1202
							document.formsoc.submit();
1203
						});
1204
						function initfieldrequired() {
1205
							jQuery("#tdcompany").removeClass("fieldrequired");
1206
							jQuery("#tdlastname").removeClass("fieldrequired");
1207
							jQuery("#tdfirstname").removeClass("fieldrequired");
1208
							if (jQuery("#morphy").val() == \'mor\') {
1209
								jQuery("#tdcompany").addClass("fieldrequired");
1210
							}
1211
							if (jQuery("#morphy").val() == \'phy\') {
1212
								jQuery("#tdlastname").addClass("fieldrequired");
1213
								jQuery("#tdfirstname").addClass("fieldrequired");
1214
							}
1215
						}
1216
						jQuery("#morphy").change(function() {
1217
							initfieldrequired();
1218
						});
1219
						initfieldrequired();
1220
					})';
1221
                    print '</script>' . "\n";
1222
                }
1223
1224
                print '<form name="formsoc" action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">';
1225
                print '<input type="hidden" name="token" value="' . newToken() . '">';
1226
                print '<input type="hidden" name="action" value="add">';
1227
                print '<input type="hidden" name="socid" value="' . $socid . '">';
1228
                if ($backtopage) {
1229
                    print '<input type="hidden" name="backtopage" value="' . ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]) . '">';
1230
                }
1231
1232
                print dol_get_fiche_head('');
1233
1234
                print '<table class="border centpercent">';
1235
                print '<tbody>';
1236
1237
                // Login
1238
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1239
                    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>';
1240
                }
1241
1242
                // Password
1243
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1244
                    require_once DOL_DOCUMENT_ROOT . '/core/lib/security2.lib.php';
1245
                    $generated_password = getRandomPassword(false);
1246
                    print '<tr><td><span class="fieldrequired">' . $langs->trans("Password") . '</span></td><td>';
1247
                    print '<input type="text" class="minwidth300" maxlength="50" name="password" value="' . dol_escape_htmltag($generated_password) . '">';
1248
                    print '</td></tr>';
1249
                }
1250
1251
                // Type
1252
                print '<tr><td class="fieldrequired">' . $langs->trans("MemberType") . '</td><td>';
1253
                $listetype = $adht->liste_array(1);
1254
                print img_picto('', $adht->picto, 'class="pictofixedwidth"');
1255
                if (count($listetype)) {
1256
                    print $form->selectarray("typeid", $listetype, (GETPOSTINT('typeid') ? GETPOSTINT('typeid') : $typeid), (count($listetype) > 1 ? 1 : 0), 0, 0, '', 0, 0, 0, '', '', 1);
1257
                } else {
1258
                    print '<span class="error">' . $langs->trans("NoTypeDefinedGoToSetup") . '</span>';
1259
                }
1260
                print "</td>\n";
1261
1262
                // Morphy
1263
                $morphys = array();
1264
                $morphys["phy"] = $langs->trans("Physical");
1265
                $morphys["mor"] = $langs->trans("Moral");
1266
                print '<tr><td class="fieldrequired">' . $langs->trans("MemberNature") . "</td><td>\n";
1267
                print $form->selectarray("morphy", $morphys, (GETPOST('morphy', 'alpha') ? GETPOST('morphy', 'alpha') : $object->morphy), 1, 0, 0, '', 0, 0, 0, '', '', 1);
1268
                print "</td>\n";
1269
1270
                // Company
1271
                print '<tr><td id="tdcompany">' . $langs->trans("Company") . '</td><td><input type="text" name="societe" class="minwidth300" maxlength="128" value="' . (GETPOSTISSET('societe') ? GETPOST('societe', 'alphanohtml') : $soc->name) . '"></td></tr>';
1272
1273
                // Civility
1274
                print '<tr><td>' . $langs->trans("UserTitle") . '</td><td>';
1275
                print $formcompany->select_civility(GETPOSTINT('civility_id') ? GETPOSTINT('civility_id') : $object->civility_id, 'civility_id', 'maxwidth150', 1) . '</td>';
1276
                print '</tr>';
1277
1278
                // Lastname
1279
                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>';
1280
                print '</tr>';
1281
1282
                // Firstname
1283
                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>';
1284
                print '</tr>';
1285
1286
                // Gender
1287
                print '<tr><td>' . $langs->trans("Gender") . '</td>';
1288
                print '<td>';
1289
                $arraygender = array('man' => $langs->trans("Genderman"), 'woman' => $langs->trans("Genderwoman"), 'other' => $langs->trans("Genderother"));
1290
                print $form->selectarray('gender', $arraygender, GETPOST('gender', 'alphanohtml'), 1, 0, 0, '', 0, 0, 0, '', '', 1);
1291
                print '</td></tr>';
1292
1293
                // EMail
1294
                print '<tr><td>' . (getDolGlobalString('ADHERENT_MAIL_REQUIRED') ? '<span class="fieldrequired">' : '') . $langs->trans("EMail") . (getDolGlobalString('ADHERENT_MAIL_REQUIRED') ? '</span>' : '') . '</td>';
1295
                print '<td>' . img_picto('', 'object_email') . ' <input type="text" name="member_email" class="minwidth300" maxlength="255" value="' . (GETPOSTISSET('member_email') ? GETPOST('member_email', 'alpha') : $soc->email) . '"></td></tr>';
1296
1297
                // Website
1298
                print '<tr><td>' . $form->editfieldkey('Web', 'member_url', GETPOST('member_url', 'alpha'), $object, 0) . '</td>';
1299
                print '<td>' . img_picto('', 'globe') . ' <input type="text" class="maxwidth500 widthcentpercentminusx" name="member_url" id="member_url" value="' . (GETPOSTISSET('member_url') ? GETPOST('member_url', 'alpha') : $object->url) . '"></td></tr>';
1300
1301
                // Address
1302
                print '<tr><td class="tdtop">' . $langs->trans("Address") . '</td><td>';
1303
                print '<textarea name="address" wrap="soft" class="quatrevingtpercent" rows="2">' . (GETPOSTISSET('address') ? GETPOST('address', 'alphanohtml') : $soc->address) . '</textarea>';
1304
                print '</td></tr>';
1305
1306
                // Zip / Town
1307
                print '<tr><td>' . $langs->trans("Zip") . ' / ' . $langs->trans("Town") . '</td><td>';
1308
                print $formcompany->select_ziptown((GETPOSTISSET('zipcode') ? GETPOST('zipcode', 'alphanohtml') : $soc->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6);
1309
                print ' ';
1310
                print $formcompany->select_ziptown((GETPOSTISSET('town') ? GETPOST('town', 'alphanohtml') : $soc->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
1311
                print '</td></tr>';
1312
1313
                // Country
1314
                if (empty($soc->country_id)) {
1315
                    $soc->country_id = $mysoc->country_id;
1316
                    $soc->country_code = $mysoc->country_code;
1317
                    $soc->state_id = $mysoc->state_id;
1318
                }
1319
                print '<tr><td>' . $langs->trans('Country') . '</td><td>';
1320
                print img_picto('', 'country', 'class="pictofixedwidth"');
1321
                print $form->select_country(GETPOSTISSET('country_id') ? GETPOST('country_id', 'alpha') : $soc->country_id, 'country_id');
1322
                if ($user->admin) {
1323
                    print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1324
                }
1325
                print '</td></tr>';
1326
1327
                // State
1328
                if (!getDolGlobalString('MEMBER_DISABLE_STATE')) {
1329
                    print '<tr><td>' . $langs->trans('State') . '</td><td>';
1330
                    if ($soc->country_id) {
1331
                        print img_picto('', 'state', 'class="pictofixedwidth"');
1332
                        print $formcompany->select_state(GETPOSTISSET('state_id') ? GETPOSTINT('state_id') : $soc->state_id, $soc->country_code);
1333
                    } else {
1334
                        print $countrynotdefined;
1335
                    }
1336
                    print '</td></tr>';
1337
                }
1338
1339
                // Pro phone
1340
                print '<tr><td>' . $langs->trans("PhonePro") . '</td>';
1341
                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>';
1342
1343
                // Personal phone
1344
                print '<tr><td>' . $langs->trans("PhonePerso") . '</td>';
1345
                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>';
1346
1347
                // Mobile phone
1348
                print '<tr><td>' . $langs->trans("PhoneMobile") . '</td>';
1349
                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>';
1350
1351
                if (isModEnabled('socialnetworks')) {
1352
                    foreach ($socialnetworks as $key => $value) {
1353
                        if (!$value['active']) {
1354
                            break;
1355
                        }
1356
                        $val = (GETPOSTISSET('member_' . $key) ? GETPOST('member_' . $key, 'alpha') : (empty($object->socialnetworks[$key]) ? '' : $object->socialnetworks[$key]));
1357
                        print '<tr><td>' . $langs->trans($value['label']) . '</td><td><input type="text" name="member_' . $key . '" size="40" value="' . $val . '"></td></tr>';
1358
                    }
1359
                }
1360
1361
                // Birth Date
1362
                print "<tr><td>" . $langs->trans("DateOfBirth") . "</td><td>\n";
1363
                print img_picto('', 'object_calendar', 'class="pictofixedwidth"') . $form->selectDate(($object->birth ? $object->birth : -1), 'birth', 0, 0, 1, 'formsoc');
1364
                print "</td></tr>\n";
1365
1366
                // Public profil
1367
                print "<tr><td>";
1368
                $htmltext = $langs->trans("Public", getDolGlobalString('MAIN_INFO_SOCIETE_NOM'), $linkofpubliclist);
1369
                print $form->textwithpicto($langs->trans("MembershipPublic"), $htmltext, 1, 'help', '', 0, 3, 'membershippublic');
1370
                print "</td><td>\n";
1371
                print $form->selectyesno("public", $object->public, 1);
1372
                print "</td></tr>\n";
1373
1374
                // Categories
1375
                if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1376
                    print '<tr><td>' . $form->editfieldkey("Categories", 'memcats', '', $object, 0) . '</td><td>';
1377
                    $cate_arbo = $form->select_all_categories(Categorie::TYPE_MEMBER, null, 'parent', null, null, 1);
1378
                    print img_picto('', 'category') . $form->multiselectarray('memcats', $cate_arbo, GETPOST('memcats', 'array'), null, null, 'quatrevingtpercent widthcentpercentminusx', 0, 0);
1379
                    print "</td></tr>";
1380
                }
1381
1382
                // Other attributes
1383
                include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_add.tpl.php';
1384
1385
                print '<tbody>';
1386
                print "</table>\n";
1387
1388
                print dol_get_fiche_end();
1389
1390
                print $form->buttonsSaveCancel("AddMember");
1391
1392
                print "</form>\n";
1393
            }
1394
1395
            // Edit mode
1396
            if ($action == 'edit') {
1397
                $res = $object->fetch($id);
1398
                if ($res < 0) {
1399
                    dol_print_error($db, $object->error);
1400
                    exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
1401
                }
1402
                $res = $object->fetch_optionals();
1403
                if ($res < 0) {
1404
                    dol_print_error($db);
1405
                    exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
1406
                }
1407
1408
                $adht = new AdherentType($db);
1409
                $adht->fetch($object->typeid);
1410
1411
                // We set country_id, and country_code, country of the chosen country
1412
                $country = GETPOSTINT('country');
1413
                if (!empty($country) || $object->country_id) {
1414
                    $sql = "SELECT rowid, code, label from " . MAIN_DB_PREFIX . "c_country";
1415
                    $sql .= " WHERE rowid = " . (int) (!empty($country) ? $country : $object->country_id);
1416
                    $resql = $db->query($sql);
1417
                    if ($resql) {
1418
                        $obj = $db->fetch_object($resql);
1419
                    } else {
1420
                        dol_print_error($db);
1421
                    }
1422
                    $object->country_id = $obj->rowid;
1423
                    $object->country_code = $obj->code;
1424
                    $object->country = $langs->trans("Country" . $obj->code) ? $langs->trans("Country" . $obj->code) : $obj->label;
1425
                }
1426
1427
                $head = member_prepare_head($object);
1428
1429
1430
                if ($conf->use_javascript_ajax) {
1431
                    print "\n" . '<script type="text/javascript">';
1432
                    print 'jQuery(document).ready(function () {
1433
				jQuery("#selectcountry_id").change(function() {
1434
					document.formsoc.action.value="edit";
1435
					document.formsoc.submit();
1436
				});
1437
				function initfieldrequired() {
1438
					jQuery("#tdcompany").removeClass("fieldrequired");
1439
					jQuery("#tdlastname").removeClass("fieldrequired");
1440
					jQuery("#tdfirstname").removeClass("fieldrequired");
1441
					if (jQuery("#morphy").val() == \'mor\') {
1442
						jQuery("#tdcompany").addClass("fieldrequired");
1443
					}
1444
					if (jQuery("#morphy").val() == \'phy\') {
1445
						jQuery("#tdlastname").addClass("fieldrequired");
1446
						jQuery("#tdfirstname").addClass("fieldrequired");
1447
					}
1448
				}
1449
				jQuery("#morphy").change(function() {
1450
					initfieldrequired();
1451
				});
1452
				initfieldrequired();
1453
			})';
1454
                    print '</script>' . "\n";
1455
                }
1456
1457
                print '<form name="formsoc" action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">';
1458
                print '<input type="hidden" name="token" value="' . newToken() . '" />';
1459
                print '<input type="hidden" name="action" value="update" />';
1460
                print '<input type="hidden" name="rowid" value="' . $id . '" />';
1461
                print '<input type="hidden" name="statut" value="' . $object->statut . '" />';
1462
                if ($backtopage) {
1463
                    print '<input type="hidden" name="backtopage" value="' . ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]) . '">';
1464
                }
1465
1466
                print dol_get_fiche_head($head, 'general', $langs->trans("Member"), 0, 'user');
1467
1468
                print '<table class="border centpercent">';
1469
1470
                // Ref
1471
                print '<tr><td class="titlefieldcreate">' . $langs->trans("Ref") . '</td><td class="valeur">' . $object->ref . '</td></tr>';
1472
1473
                // Login
1474
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1475
                    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>';
1476
                }
1477
1478
                // Password
1479
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1480
                    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", 'none', 2) : '') . '"></td></tr>';
1481
                }
1482
1483
                // Type
1484
                print '<tr><td class="fieldrequired">' . $langs->trans("Type") . '</td><td>';
1485
                if ($user->hasRight('adherent', 'creer')) {
1486
                    print $form->selectarray("typeid", $adht->liste_array(), (GETPOSTISSET("typeid") ? GETPOSTINT("typeid") : $object->typeid), 0, 0, 0, '', 0, 0, 0, '', '', 1);
1487
                } else {
1488
                    print $adht->getNomUrl(1);
1489
                    print '<input type="hidden" name="typeid" value="' . $object->typeid . '">';
1490
                }
1491
                print "</td></tr>";
1492
1493
                // Morphy
1494
                $morphys["phy"] = $langs->trans("Physical");
1495
                $morphys["mor"] = $langs->trans("Moral");
1496
                print '<tr><td><span class="fieldrequired">' . $langs->trans("MemberNature") . '</span></td><td>';
1497
                print $form->selectarray("morphy", $morphys, (GETPOSTISSET("morphy") ? GETPOST("morphy", 'alpha') : $object->morphy), 0, 0, 0, '', 0, 0, 0, '', '', 1);
1498
                print "</td></tr>";
1499
1500
                // Company
1501
                print '<tr><td id="tdcompany">' . $langs->trans("Company") . '</td><td><input type="text" name="societe" class="minwidth300" maxlength="128" value="' . (GETPOSTISSET("societe") ? GETPOST("societe", 'alphanohtml', 2) : $object->company) . '"></td></tr>';
1502
1503
                // Civility
1504
                print '<tr><td>' . $langs->trans("UserTitle") . '</td><td>';
1505
                print $formcompany->select_civility(GETPOSTISSET("civility_id") ? GETPOST("civility_id", 'alpha') : $object->civility_id, 'civility_id', 'maxwidth150', 1);
1506
                print '</td>';
1507
                print '</tr>';
1508
1509
                // Lastname
1510
                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>';
1511
                print '</tr>';
1512
1513
                // Firstname
1514
                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>';
1515
                print '</tr>';
1516
1517
                // Gender
1518
                print '<tr><td>' . $langs->trans("Gender") . '</td>';
1519
                print '<td>';
1520
                $arraygender = array('man' => $langs->trans("Genderman"), 'woman' => $langs->trans("Genderwoman"), 'other' => $langs->trans("Genderother"));
1521
                print $form->selectarray('gender', $arraygender, GETPOSTISSET('gender') ? GETPOST('gender', 'alphanohtml') : $object->gender, 1, 0, 0, '', 0, 0, 0, '', '', 1);
1522
                print '</td></tr>';
1523
1524
                // Photo
1525
                print '<tr><td>' . $langs->trans("Photo") . '</td>';
1526
                print '<td class="hideonsmartphone" valign="middle">';
1527
                print $form->showphoto('memberphoto', $object) . "\n";
1528
                if ($caneditfieldmember) {
1529
                    if ($object->photo) {
1530
                        print "<br>\n";
1531
                    }
1532
                    print '<table class="nobordernopadding">';
1533
                    if ($object->photo) {
1534
                        print '<tr><td><input type="checkbox" class="flat photodelete" name="deletephoto" id="photodelete"> ' . $langs->trans("Delete") . '<br><br></td></tr>';
1535
                    }
1536
                    print '<tr><td>' . $langs->trans("PhotoFile") . '</td></tr>';
1537
                    print '<tr><td>';
1538
                    $maxfilesizearray = getMaxFileSizeArray();
1539
                    $maxmin = $maxfilesizearray['maxmin'];
1540
                    if ($maxmin > 0) {
1541
                        print '<input type="hidden" name="MAX_FILE_SIZE" value="' . ($maxmin * 1024) . '">';    // MAX_FILE_SIZE must precede the field type=file
1542
                    }
1543
                    print '<input type="file" class="flat" name="photo" id="photoinput">';
1544
                    print '</td></tr>';
1545
                    print '</table>';
1546
                }
1547
                print '</td></tr>';
1548
1549
                // EMail
1550
                print '<tr><td>' . (getDolGlobalString("ADHERENT_MAIL_REQUIRED") ? '<span class="fieldrequired">' : '') . $langs->trans("EMail") . (getDolGlobalString("ADHERENT_MAIL_REQUIRED") ? '</span>' : '') . '</td>';
1551
                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", '', 2) : $object->email) . '"></td></tr>';
1552
1553
                // Website
1554
                print '<tr><td>' . $form->editfieldkey('Web', 'member_url', GETPOST('member_url', 'alpha'), $object, 0) . '</td>';
1555
                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>';
1556
1557
                // Address
1558
                print '<tr><td>' . $langs->trans("Address") . '</td><td>';
1559
                print '<textarea name="address" wrap="soft" class="quatrevingtpercent" rows="' . ROWS_2 . '">' . (GETPOSTISSET("address") ? GETPOST("address", 'alphanohtml', 2) : $object->address) . '</textarea>';
1560
                print '</td></tr>';
1561
1562
                // Zip / Town
1563
                print '<tr><td>' . $langs->trans("Zip") . ' / ' . $langs->trans("Town") . '</td><td>';
1564
                print $formcompany->select_ziptown((GETPOSTISSET("zipcode") ? GETPOST("zipcode", 'alphanohtml', 2) : $object->zip), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6);
1565
                print ' ';
1566
                print $formcompany->select_ziptown((GETPOSTISSET("town") ? GETPOST("town", 'alphanohtml', 2) : $object->town), 'town', array('zipcode', 'selectcountry_id', 'state_id'));
1567
                print '</td></tr>';
1568
1569
                // Country
1570
                //$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
1571
                print '<tr><td>' . $langs->trans('Country') . '</td><td>';
1572
                print img_picto('', 'country', 'class="pictofixedwidth"');
1573
                print $form->select_country(GETPOSTISSET("country_id") ? GETPOST("country_id", "alpha") : $object->country_id, 'country_id');
1574
                if ($user->admin) {
1575
                    print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1576
                }
1577
                print '</td></tr>';
1578
1579
                // State
1580
                if (!getDolGlobalString('MEMBER_DISABLE_STATE')) {
1581
                    print '<tr><td>' . $langs->trans('State') . '</td><td>';
1582
                    print img_picto('', 'state', 'class="pictofixedwidth"');
1583
                    print $formcompany->select_state($object->state_id, GETPOSTISSET("country_id") ? GETPOST("country_id", "alpha") : $object->country_id);
1584
                    print '</td></tr>';
1585
                }
1586
1587
                // Pro phone
1588
                print '<tr><td>' . $langs->trans("PhonePro") . '</td>';
1589
                print '<td>' . img_picto('', 'object_phoning', 'class="pictofixedwidth"') . '<input type="text" name="phone" value="' . (GETPOSTISSET("phone") ? GETPOST("phone") : $object->phone) . '"></td></tr>';
1590
1591
                // Personal phone
1592
                print '<tr><td>' . $langs->trans("PhonePerso") . '</td>';
1593
                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>';
1594
1595
                // Mobile phone
1596
                print '<tr><td>' . $langs->trans("PhoneMobile") . '</td>';
1597
                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>';
1598
1599
                if (isModEnabled('socialnetworks')) {
1600
                    foreach ($socialnetworks as $key => $value) {
1601
                        if (!$value['active']) {
1602
                            break;
1603
                        }
1604
                        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>';
1605
                    }
1606
                }
1607
1608
                // Birth Date
1609
                print "<tr><td>" . $langs->trans("DateOfBirth") . "</td><td>\n";
1610
                print img_picto('', 'object_calendar', 'class="pictofixedwidth"') . $form->selectDate(($object->birth ? $object->birth : -1), 'birth', 0, 0, 1, 'formsoc');
1611
                print "</td></tr>\n";
1612
1613
                // Default language
1614
                if (getDolGlobalInt('MAIN_MULTILANGS')) {
1615
                    print '<tr><td>' . $form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0) . '</td><td colspan="3">' . "\n";
1616
                    print img_picto('', 'language', 'class="pictofixedwidth"') . $formadmin->select_language($object->default_lang, 'default_lang', 0, 0, 1);
1617
                    print '</td>';
1618
                    print '</tr>';
1619
                }
1620
1621
                // Public profil
1622
                print "<tr><td>";
1623
                $htmltext = $langs->trans("Public", getDolGlobalString('MAIN_INFO_SOCIETE_NOM'), $linkofpubliclist);
1624
                print $form->textwithpicto($langs->trans("MembershipPublic"), $htmltext, 1, 'help', '', 0, 3, 'membershippublic');
1625
                print "</td><td>\n";
1626
                print $form->selectyesno("public", (GETPOSTISSET("public") ? GETPOST("public", 'alphanohtml', 2) : $object->public), 1);
1627
                print "</td></tr>\n";
1628
1629
                // Categories
1630
                if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1631
                    print '<tr><td>' . $form->editfieldkey("Categories", 'memcats', '', $object, 0) . '</td>';
1632
                    print '<td>';
1633
                    $cate_arbo = $form->select_all_categories(Categorie::TYPE_MEMBER, null, null, null, null, 1);
1634
                    $c = new Categorie($db);
1635
                    $cats = $c->containing($object->id, Categorie::TYPE_MEMBER);
1636
                    $arrayselected = array();
1637
                    if (is_array($cats)) {
1638
                        foreach ($cats as $cat) {
1639
                            $arrayselected[] = $cat->id;
1640
                        }
1641
                    }
1642
                    print $form->multiselectarray('memcats', $cate_arbo, $arrayselected, '', 0, '', 0, '100%');
1643
                    print "</td></tr>";
1644
                }
1645
1646
                // Third party Dolibarr
1647
                if (isModEnabled('societe')) {
1648
                    print '<tr><td>' . $langs->trans("LinkedToDolibarrThirdParty") . '</td><td colspan="2" class="valeur">';
1649
                    if ($object->socid) {
1650
                        $company = new Societe($db);
1651
                        $result = $company->fetch($object->socid);
1652
                        print $company->getNomUrl(1);
1653
                    } else {
1654
                        print $langs->trans("NoThirdPartyAssociatedToMember");
1655
                    }
1656
                    print '</td></tr>';
1657
                }
1658
1659
                // Login Dolibarr
1660
                print '<tr><td>' . $langs->trans("LinkedToDolibarrUser") . '</td><td colspan="2" class="valeur">';
1661
                if ($object->user_id) {
1662
                    $form->form_users($_SERVER['PHP_SELF'] . '?rowid=' . $object->id, $object->user_id, 'none');
1663
                } else {
1664
                    print $langs->trans("NoDolibarrAccess");
1665
                }
1666
                print '</td></tr>';
1667
1668
                // Other attributes. Fields from hook formObjectOptions and Extrafields.
1669
                include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_add.tpl.php';
1670
1671
                print '</table>';
1672
                print dol_get_fiche_end();
1673
1674
                print $form->buttonsSaveCancel("Save", 'Cancel');
1675
1676
                print '</form>';
1677
            }
1678
1679
            // View
1680
            if ($id > 0 && $action != 'edit') {
1681
                $res = $object->fetch($id);
1682
                if ($res < 0) {
1683
                    dol_print_error($db, $object->error);
1684
                    exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
1685
                }
1686
                $res = $object->fetch_optionals();
1687
                if ($res < 0) {
1688
                    dol_print_error($db);
1689
                    exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
1690
                }
1691
1692
                $adht = new AdherentType($db);
1693
                $res = $adht->fetch($object->typeid);
1694
                if ($res < 0) {
1695
                    dol_print_error($db);
1696
                    exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
1697
                }
1698
1699
                /*
1700
                 * Show tabs
1701
                 */
1702
                $head = member_prepare_head($object);
1703
1704
                print dol_get_fiche_head($head, 'general', $langs->trans("Member"), -1, 'user');
1705
1706
                // Confirm create user
1707
                if ($action == 'create_user') {
1708
                    $login = (GETPOSTISSET('login') ? GETPOST('login', 'alphanohtml') : $object->login);
1709
                    if (empty($login)) {
1710
                        // Full firstname and name separated with a dot : firstname.name
1711
                        include_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php';
1712
                        $login = dol_buildlogin($object->lastname, $object->firstname);
1713
                    }
1714
                    if (empty($login)) {
1715
                        $login = strtolower(substr($object->firstname, 0, 4)) . strtolower(substr($object->lastname, 0, 4));
1716
                    }
1717
1718
                    // Create a form array
1719
                    $formquestion = array(
1720
                        array('label' => $langs->trans("LoginToCreate"), 'type' => 'text', 'name' => 'login', 'value' => $login)
1721
                    );
1722
                    if (isModEnabled('societe') && $object->socid > 0) {
1723
                        $object->fetch_thirdparty();
1724
                        $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")));
1725
                    }
1726
                    $text = '';
1727
                    if (isModEnabled('societe') && $object->socid <= 0) {
1728
                        $text .= $langs->trans("UserWillBeInternalUser") . '<br>';
1729
                    }
1730
                    $text .= $langs->trans("ConfirmCreateLogin");
1731
                    print $form->formconfirm($_SERVER['PHP_SELF'] . "?rowid=" . $object->id, $langs->trans("CreateDolibarrLogin"), $text, "confirm_create_user", $formquestion, 'yes');
1732
                }
1733
1734
                // Confirm create third party
1735
                if ($action == 'create_thirdparty') {
1736
                    $companyalias = '';
1737
                    $fullname = $object->getFullName($langs);
1738
1739
                    if ($object->morphy == 'mor') {
1740
                        $companyname = $object->company;
1741
                        if (!empty($fullname)) {
1742
                            $companyalias = $fullname;
1743
                        }
1744
                    } else {
1745
                        $companyname = $fullname;
1746
                        if (!empty($object->company)) {
1747
                            $companyalias = $object->company;
1748
                        }
1749
                    }
1750
1751
                    // Create a form array
1752
                    $formquestion = array(
1753
                        array('label' => $langs->trans("NameToCreate"), 'type' => 'text', 'name' => 'companyname', 'value' => $companyname, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"'),
1754
                        array('label' => $langs->trans("AliasNames"), 'type' => 'text', 'name' => 'companyalias', 'value' => $companyalias, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"')
1755
                    );
1756
1757
                    print $form->formconfirm($_SERVER['PHP_SELF'] . "?rowid=" . $object->id, $langs->trans("CreateDolibarrThirdParty"), $langs->trans("ConfirmCreateThirdParty"), "confirm_create_thirdparty", $formquestion, 'yes');
1758
                }
1759
1760
                // Confirm validate member
1761
                if ($action == 'valid') {
1762
                    $langs->load("mails");
1763
1764
                    $adht = new AdherentType($db);
1765
                    $adht->fetch($object->typeid);
1766
1767
                    $subject = '';
1768
                    $msg = '';
1769
1770
                    // Send subscription email
1771
                    include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
1772
                    $formmail = new FormMail($db);
1773
                    // Set output language
1774
                    $outputlangs = new Translate('', $conf);
1775
                    $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
1776
                    // Load traductions files required by page
1777
                    $outputlangs->loadLangs(array("main", "members", "companies", "install", "other"));
1778
                    // Get email content from template
1779
                    $arraydefaultmessage = null;
1780
                    $labeltouse = getDolGlobalString("ADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION");
1781
1782
                    if (!empty($labeltouse)) {
1783
                        $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1784
                    }
1785
1786
                    if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1787
                        $subject = $arraydefaultmessage->topic;
1788
                        $msg = $arraydefaultmessage->content;
1789
                    }
1790
1791
                    $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1792
                    complete_substitutions_array($substitutionarray, $outputlangs, $object);
1793
                    $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1794
                    $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs);
1795
1796
                    $tmp = $langs->trans("SendingAnEMailToMember");
1797
                    $tmp .= '<br>' . $langs->trans("MailFrom") . ': <b>' . getDolGlobalString('ADHERENT_MAIL_FROM') . '</b>, ';
1798
                    $tmp .= '<br>' . $langs->trans("MailRecipient") . ': <b>' . $object->email . '</b>';
1799
                    $helpcontent = '';
1800
                    $helpcontent .= '<b>' . $langs->trans("MailFrom") . '</b>: ' . getDolGlobalString('ADHERENT_MAIL_FROM') . '<br>' . "\n";
1801
                    $helpcontent .= '<b>' . $langs->trans("MailRecipient") . '</b>: ' . $object->email . '<br>' . "\n";
1802
                    $helpcontent .= '<b>' . $langs->trans("Subject") . '</b>:<br>' . "\n";
1803
                    $helpcontent .= $subjecttosend . "\n";
1804
                    $helpcontent .= "<br>";
1805
                    $helpcontent .= '<b>' . $langs->trans("Content") . '</b>:<br>';
1806
                    $helpcontent .= dol_htmlentitiesbr($texttosend) . "\n";
1807
                    // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1808
                    $label = $form->textwithpicto($tmp, $helpcontent, 1, 'help');
1809
1810
                    // Create form popup
1811
                    $formquestion = array();
1812
                    if ($object->email) {
1813
                        $formquestion[] = array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? true : false));
1814
                    }
1815
                    if (isModEnabled('mailman') && getDolGlobalString('ADHERENT_USE_MAILMAN')) {
1816
                        $formquestion[] = array('type' => 'other', 'label' => $langs->transnoentitiesnoconv("SynchroMailManEnabled"), 'value' => '');
1817
                    }
1818
                    if (isModEnabled('mailman') && getDolGlobalString('ADHERENT_USE_SPIP')) {
1819
                        $formquestion[] = array('type' => 'other', 'label' => $langs->transnoentitiesnoconv("SynchroSpipEnabled"), 'value' => '');
1820
                    }
1821
                    print $form->formconfirm("card.php?rowid=" . $id, $langs->trans("ValidateMember"), $langs->trans("ConfirmValidateMember"), "confirm_valid", $formquestion, 'yes', 1, 220);
1822
                }
1823
1824
                // Confirm resiliate
1825
                if ($action == 'resiliate') {
1826
                    $langs->load("mails");
1827
1828
                    $adht = new AdherentType($db);
1829
                    $adht->fetch($object->typeid);
1830
1831
                    $subject = '';
1832
                    $msg = '';
1833
1834
                    // Send subscription email
1835
                    include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
1836
                    $formmail = new FormMail($db);
1837
                    // Set output language
1838
                    $outputlangs = new Translate('', $conf);
1839
                    $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
1840
                    // Load traductions files required by page
1841
                    $outputlangs->loadLangs(array("main", "members"));
1842
                    // Get email content from template
1843
                    $arraydefaultmessage = null;
1844
                    $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_CANCELATION');
1845
1846
                    if (!empty($labeltouse)) {
1847
                        $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1848
                    }
1849
1850
                    if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1851
                        $subject = $arraydefaultmessage->topic;
1852
                        $msg     = $arraydefaultmessage->content;
1853
                    }
1854
1855
                    $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1856
                    complete_substitutions_array($substitutionarray, $outputlangs, $object);
1857
                    $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1858
                    $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnResiliate()), $substitutionarray, $outputlangs);
1859
1860
                    $tmp = $langs->trans("SendingAnEMailToMember");
1861
                    $tmp .= '<br>(' . $langs->trans("MailFrom") . ': <b>' . getDolGlobalString('ADHERENT_MAIL_FROM') . '</b>, ';
1862
                    $tmp .= $langs->trans("MailRecipient") . ': <b>' . $object->email . '</b>)';
1863
                    $helpcontent = '';
1864
                    $helpcontent .= '<b>' . $langs->trans("MailFrom") . '</b>: ' . getDolGlobalString('ADHERENT_MAIL_FROM') . '<br>' . "\n";
1865
                    $helpcontent .= '<b>' . $langs->trans("MailRecipient") . '</b>: ' . $object->email . '<br>' . "\n";
1866
                    $helpcontent .= '<b>' . $langs->trans("Subject") . '</b>:<br>' . "\n";
1867
                    $helpcontent .= $subjecttosend . "\n";
1868
                    $helpcontent .= "<br>";
1869
                    $helpcontent .= '<b>' . $langs->trans("Content") . '</b>:<br>';
1870
                    $helpcontent .= dol_htmlentitiesbr($texttosend) . "\n";
1871
                    // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1872
                    $label = $form->textwithpicto($tmp, $helpcontent, 1, 'help');
1873
1874
                    // Create an array
1875
                    $formquestion = array();
1876
                    if ($object->email) {
1877
                        $formquestion[] = array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? 'true' : 'false'));
1878
                    }
1879
                    if ($backtopage) {
1880
                        $formquestion[] = array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]));
1881
                    }
1882
                    print $form->formconfirm("card.php?rowid=" . $id, $langs->trans("ResiliateMember"), $langs->trans("ConfirmResiliateMember"), "confirm_resiliate", $formquestion, 'no', 1, 240);
1883
                }
1884
1885
                // Confirm exclude
1886
                if ($action == 'exclude') {
1887
                    $langs->load("mails");
1888
1889
                    $adht = new AdherentType($db);
1890
                    $adht->fetch($object->typeid);
1891
1892
                    $subject = '';
1893
                    $msg = '';
1894
1895
                    // Send subscription email
1896
                    include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
1897
                    $formmail = new FormMail($db);
1898
                    // Set output language
1899
                    $outputlangs = new Translate('', $conf);
1900
                    $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
1901
                    // Load traductions files required by page
1902
                    $outputlangs->loadLangs(array("main", "members"));
1903
                    // Get email content from template
1904
                    $arraydefaultmessage = null;
1905
                    $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_EXCLUSION');
1906
1907
                    if (!empty($labeltouse)) {
1908
                        $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1909
                    }
1910
1911
                    if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1912
                        $subject = $arraydefaultmessage->topic;
1913
                        $msg     = $arraydefaultmessage->content;
1914
                    }
1915
1916
                    $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1917
                    complete_substitutions_array($substitutionarray, $outputlangs, $object);
1918
                    $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1919
                    $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnExclude()), $substitutionarray, $outputlangs);
1920
1921
                    $tmp = $langs->trans("SendingAnEMailToMember");
1922
                    $tmp .= '<br>(' . $langs->trans("MailFrom") . ': <b>' . getDolGlobalString('ADHERENT_MAIL_FROM') . '</b>, ';
1923
                    $tmp .= $langs->trans("MailRecipient") . ': <b>' . $object->email . '</b>)';
1924
                    $helpcontent = '';
1925
                    $helpcontent .= '<b>' . $langs->trans("MailFrom") . '</b>: ' . getDolGlobalString('ADHERENT_MAIL_FROM') . '<br>' . "\n";
1926
                    $helpcontent .= '<b>' . $langs->trans("MailRecipient") . '</b>: ' . $object->email . '<br>' . "\n";
1927
                    $helpcontent .= '<b>' . $langs->trans("Subject") . '</b>:<br>' . "\n";
1928
                    $helpcontent .= $subjecttosend . "\n";
1929
                    $helpcontent .= "<br>";
1930
                    $helpcontent .= '<b>' . $langs->trans("Content") . '</b>:<br>';
1931
                    $helpcontent .= dol_htmlentitiesbr($texttosend) . "\n";
1932
                    // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1933
                    $label = $form->textwithpicto($tmp, $helpcontent, 1, 'help');
1934
1935
                    // Create an array
1936
                    $formquestion = array();
1937
                    if ($object->email) {
1938
                        $formquestion[] = array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? 'true' : 'false'));
1939
                    }
1940
                    if ($backtopage) {
1941
                        $formquestion[] = array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]));
1942
                    }
1943
                    print $form->formconfirm("card.php?rowid=" . $id, $langs->trans("ExcludeMember"), $langs->trans("ConfirmExcludeMember"), "confirm_exclude", $formquestion, 'no', 1, 240);
1944
                }
1945
1946
                // Confirm remove member
1947
                if ($action == 'delete') {
1948
                    $formquestion = array();
1949
                    if ($backtopage) {
1950
                        $formquestion[] = array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]));
1951
                    }
1952
                    print $form->formconfirm("card.php?rowid=" . $id, $langs->trans("DeleteMember"), $langs->trans("ConfirmDeleteMember"), "confirm_delete", $formquestion, 'no', 1);
1953
                }
1954
1955
                // Confirm add in spip
1956
                if ($action == 'add_spip') {
1957
                    print $form->formconfirm("card.php?rowid=" . $id, $langs->trans('AddIntoSpip'), $langs->trans('AddIntoSpipConfirmation'), 'confirm_add_spip');
1958
                }
1959
                // Confirm removed from spip
1960
                if ($action == 'del_spip') {
1961
                    print $form->formconfirm("card.php?rowid=$id", $langs->trans('DeleteIntoSpip'), $langs->trans('DeleteIntoSpipConfirmation'), 'confirm_del_spip');
1962
                }
1963
1964
                $rowspan = 17;
1965
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1966
                    $rowspan++;
1967
                }
1968
                if (isModEnabled('societe')) {
1969
                    $rowspan++;
1970
                }
1971
1972
                $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/list.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
1973
1974
                $morehtmlref = '<a href="' . DOL_URL_ROOT . '/adherents/vcard.php?id=' . $object->id . '" class="refid">';
1975
                $morehtmlref .= img_picto($langs->trans("Download") . ' ' . $langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
1976
                $morehtmlref .= '</a>';
1977
1978
1979
                dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
1980
1981
                print '<div class="fichecenter">';
1982
                print '<div class="fichehalfleft">';
1983
1984
                print '<div class="underbanner clearboth"></div>';
1985
                print '<table class="border tableforfield centpercent">';
1986
1987
                // Login
1988
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
1989
                    print '<tr><td class="titlefield">' . $langs->trans("Login") . ' / ' . $langs->trans("Id") . '</td><td class="valeur">' . dol_escape_htmltag($object->login) . '</td></tr>';
1990
                }
1991
1992
                // Type
1993
                print '<tr><td class="titlefield">' . $langs->trans("Type") . '</td>';
1994
                print '<td class="valeur">' . $adht->getNomUrl(1) . "</td></tr>\n";
1995
1996
                // Morphy
1997
                print '<tr><td>' . $langs->trans("MemberNature") . '</td>';
1998
                print '<td class="valeur" >' . $object->getmorphylib('', 1) . '</td>';
1999
                print '</tr>';
2000
2001
                // Company
2002
                print '<tr><td>' . $langs->trans("Company") . '</td><td class="valeur">' . dol_escape_htmltag($object->company) . '</td></tr>';
2003
2004
                // Civility
2005
                print '<tr><td>' . $langs->trans("UserTitle") . '</td><td class="valeur">' . $object->getCivilityLabel() . '</td>';
2006
                print '</tr>';
2007
2008
                // Password
2009
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
2010
                    print '<tr><td>' . $langs->trans("Password") . '</td><td>';
2011
                    if ($object->pass) {
2012
                        print preg_replace('/./i', '*', $object->pass);
2013
                    } else {
2014
                        if ($user->admin) {
2015
                            print '<!-- ' . $langs->trans("Crypted") . ': ' . $object->pass_indatabase_crypted . ' -->';
2016
                        }
2017
                        print '<span class="opacitymedium">' . $langs->trans("Hidden") . '</span>';
2018
                    }
2019
                    if (!empty($object->pass_indatabase) && empty($object->user_id)) {  // Show warning only for old password still in clear (does not happen anymore)
2020
                        $langs->load("errors");
2021
                        $htmltext = $langs->trans("WarningPasswordSetWithNoAccount");
2022
                        print ' ' . $form->textwithpicto('', $htmltext, 1, 'warning');
2023
                    }
2024
                    print '</td></tr>';
2025
                }
2026
2027
                // Date end subscription
2028
                print '<tr><td>' . $langs->trans("SubscriptionEndDate") . '</td><td class="valeur">';
2029
                if ($object->datefin) {
2030
                    print dol_print_date($object->datefin, 'day');
2031
                    if ($object->hasDelay()) {
2032
                        print " " . img_warning($langs->trans("Late"));
2033
                    }
2034
                } else {
2035
                    if ($object->need_subscription == 0) {
2036
                        print $langs->trans("SubscriptionNotNeeded");
2037
                    } elseif (!$adht->subscription) {
2038
                        print $langs->trans("SubscriptionNotRecorded");
2039
                        if (Adherent::STATUS_VALIDATED == $object->statut) {
2040
                            print " " . img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
2041
                        }
2042
                    } else {
2043
                        print $langs->trans("SubscriptionNotReceived");
2044
                        if (Adherent::STATUS_VALIDATED == $object->statut) {
2045
                            print " " . img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
2046
                        }
2047
                    }
2048
                }
2049
                print '</td></tr>';
2050
2051
                print '</table>';
2052
2053
                print '</div>';
2054
2055
                print '<div class="fichehalfright">';
2056
                print '<div class="underbanner clearboth"></div>';
2057
2058
                print '<table class="border tableforfield centpercent">';
2059
2060
                // Tags / Categories
2061
                if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
2062
                    print '<tr><td>' . $langs->trans("Categories") . '</td>';
2063
                    print '<td colspan="2">';
2064
                    print $form->showCategories($object->id, Categorie::TYPE_MEMBER, 1);
2065
                    print '</td></tr>';
2066
                }
2067
2068
                // Birth Date
2069
                print '<tr><td class="titlefield">' . $langs->trans("DateOfBirth") . '</td><td class="valeur">' . dol_print_date($object->birth, 'day') . '</td></tr>';
2070
2071
                // Default language
2072
                if (getDolGlobalInt('MAIN_MULTILANGS')) {
2073
                    require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php';
2074
                    print '<tr><td>' . $langs->trans("DefaultLang") . '</td><td>';
2075
                    //$s=picto_from_langcode($object->default_lang);
2076
                    //print ($s?$s.' ':'');
2077
                    $langs->load("languages");
2078
                    $labellang = ($object->default_lang ? $langs->trans('Language_' . $object->default_lang) : '');
2079
                    print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
2080
                    print $labellang;
2081
                    print '</td></tr>';
2082
                }
2083
2084
                // Public
2085
                print '<tr><td>';
2086
                $htmltext = $langs->trans("Public", getDolGlobalString('MAIN_INFO_SOCIETE_NOM'), $linkofpubliclist);
2087
                print $form->textwithpicto($langs->trans("MembershipPublic"), $htmltext, 1, 'help', '', 0, 3, 'membershippublic');
2088
                print '</td><td class="valeur">' . yn($object->public) . '</td></tr>';
2089
2090
                // Other attributes
2091
                include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
2092
2093
                // Third party Dolibarr
2094
                if (isModEnabled('societe')) {
2095
                    print '<tr><td>';
2096
                    $editenable = $user->hasRight('adherent', 'creer');
2097
                    print $form->editfieldkey('LinkedToDolibarrThirdParty', 'thirdparty', '', $object, $editenable);
2098
                    print '</td><td colspan="2" class="valeur">';
2099
                    if ($action == 'editthirdparty') {
2100
                        $htmlname = 'socid';
2101
                        print '<form method="POST" action="' . $_SERVER['PHP_SELF'] . '" name="form' . $htmlname . '">';
2102
                        print '<input type="hidden" name="rowid" value="' . $object->id . '">';
2103
                        print '<input type="hidden" name="action" value="set' . $htmlname . '">';
2104
                        print '<input type="hidden" name="token" value="' . newToken() . '">';
2105
                        print '<table class="nobordernopadding">';
2106
                        print '<tr><td>';
2107
                        print $form->select_company($object->socid, 'socid', '', 1);
2108
                        print '</td>';
2109
                        print '<td class="left"><input type="submit" class="button button-edit" value="' . $langs->trans("Modify") . '"></td>';
2110
                        print '</tr></table></form>';
2111
                    } else {
2112
                        if ($object->socid) {
2113
                            $company = new Societe($db);
2114
                            $result = $company->fetch($object->socid);
2115
                            print $company->getNomUrl(1);
2116
2117
                            // Show link to invoices
2118
                            $tmparray = $company->getOutstandingBills('customer');
2119
                            if (!empty($tmparray['refs'])) {
2120
                                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']) . ')';
2121
                                // TODO Add alert if warning on at least one invoice late
2122
                                print '</a>';
2123
                            }
2124
                        } else {
2125
                            print '<span class="opacitymedium">' . $langs->trans("NoThirdPartyAssociatedToMember") . '</span>';
2126
                        }
2127
                    }
2128
                    print '</td></tr>';
2129
                }
2130
2131
                // Login Dolibarr - Link to user
2132
                print '<tr><td>';
2133
                $editenable = $user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer');
2134
                print $form->editfieldkey('LinkedToDolibarrUser', 'login', '', $object, $editenable);
2135
                print '</td><td colspan="2" class="valeur">';
2136
                if ($action == 'editlogin') {
2137
                    $form->form_users($_SERVER['PHP_SELF'] . '?rowid=' . $object->id, $object->user_id, 'userid', '');
2138
                } else {
2139
                    if ($object->user_id) {
2140
                        $linkeduser = new User($db);
2141
                        $linkeduser->fetch($object->user_id);
2142
                        print $linkeduser->getNomUrl(-1);
2143
                    } else {
2144
                        print '<span class="opacitymedium">' . $langs->trans("NoDolibarrAccess") . '</span>';
2145
                    }
2146
                }
2147
                print '</td></tr>';
2148
2149
                print "</table>\n";
2150
2151
                print "</div></div>\n";
2152
                print '<div class="clearboth"></div>';
2153
2154
                print dol_get_fiche_end();
2155
2156
2157
                /*
2158
                 * Action bar
2159
                 */
2160
2161
                print '<div class="tabsAction">';
2162
                $isinspip = 0;
2163
                $parameters = array();
2164
                $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
2165
                if (empty($reshook)) {
2166
                    if ($action != 'editlogin' && $action != 'editthirdparty') {
2167
                        // Send
2168
                        if (empty($user->socid)) {
2169
                            if (Adherent::STATUS_VALIDATED == $object->statut) {
2170
                                print '<a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?id=' . ((int) $object->id) . '&action=presend&mode=init#formmailbeforetitle">' . $langs->trans('SendMail') . '</a>' . "\n";
2171
                            }
2172
                        }
2173
2174
                        // Send card by email
2175
                        // TODO Remove this to replace with a template
2176
                        /*
2177
                        if ($user->hasRight('adherent', 'creer')) {
2178
                            if (Adherent::STATUS_VALIDATED == $object->statut) {
2179
                                if ($object->email) print '<a class="butAction" href="card.php?rowid='.$object->id.'&action=sendinfo">'.$langs->trans("SendCardByMail")."</a>\n";
2180
                                else print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NoEMail")).'">'.$langs->trans("SendCardByMail")."</a>\n";
2181
                            } else {
2182
                                print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("ValidateBefore")).'">'.$langs->trans("SendCardByMail")."</span>";
2183
                            }
2184
                        } else {
2185
                            print '<span class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("SendCardByMail")."</span>";
2186
                        }*/
2187
2188
                        // Modify
2189
                        if ($user->hasRight('adherent', 'creer')) {
2190
                            print '<a class="butAction" href="card.php?rowid=' . ((int) $object->id) . '&action=edit&token=' . newToken() . '">' . $langs->trans("Modify") . '</a>' . "\n";
2191
                        } else {
2192
                            print '<span class="butActionRefused classfortooltip" title="' . dol_escape_htmltag($langs->trans("NotEnoughPermissions")) . '">' . $langs->trans("Modify") . '</span>' . "\n";
2193
                        }
2194
2195
                        // Validate
2196
                        if (Adherent::STATUS_DRAFT == $object->statut) {
2197
                            if ($user->hasRight('adherent', 'creer')) {
2198
                                print '<a class="butAction" href="card.php?rowid=' . ((int) $object->id) . '&action=valid&token=' . newToken() . '">' . $langs->trans("Validate") . '</a>' . "\n";
2199
                            } else {
2200
                                print '<span class="butActionRefused classfortooltip" title="' . dol_escape_htmltag($langs->trans("NotEnoughPermissions")) . '">' . $langs->trans("Validate") . '</span>' . "\n";
2201
                            }
2202
                        }
2203
2204
                        // Reactivate
2205
                        if (Adherent::STATUS_RESILIATED == $object->statut || Adherent::STATUS_EXCLUDED == $object->statut) {
2206
                            if ($user->hasRight('adherent', 'creer')) {
2207
                                print '<a class="butAction" href="card.php?rowid=' . ((int) $object->id) . '&action=valid">' . $langs->trans("Reenable") . "</a>\n";
2208
                            } else {
2209
                                print '<span class="butActionRefused classfortooltip" title="' . dol_escape_htmltag($langs->trans("NotEnoughPermissions")) . '">' . $langs->trans("Reenable") . '</span>' . "\n";
2210
                            }
2211
                        }
2212
2213
                        // Resiliate
2214
                        if (Adherent::STATUS_VALIDATED == $object->statut) {
2215
                            if ($user->hasRight('adherent', 'supprimer')) {
2216
                                print '<a class="butAction" href="card.php?rowid=' . ((int) $object->id) . '&action=resiliate">' . $langs->trans("Resiliate") . "</a></span>\n";
2217
                            } else {
2218
                                print '<span class="butActionRefused classfortooltip" title="' . dol_escape_htmltag($langs->trans("NotEnoughPermissions")) . '">' . $langs->trans("Resiliate") . '</span>' . "\n";
2219
                            }
2220
                        }
2221
2222
                        // Exclude
2223
                        if (Adherent::STATUS_VALIDATED == $object->statut) {
2224
                            if ($user->hasRight('adherent', 'supprimer')) {
2225
                                print '<a class="butAction" href="card.php?rowid=' . ((int) $object->id) . '&action=exclude">' . $langs->trans("Exclude") . "</a></span>\n";
2226
                            } else {
2227
                                print '<span class="butActionRefused classfortooltip" title="' . dol_escape_htmltag($langs->trans("NotEnoughPermissions")) . '">' . $langs->trans("Exclude") . '</span>' . "\n";
2228
                            }
2229
                        }
2230
2231
                        // Create third party
2232
                        if (isModEnabled('societe') && !$object->socid) {
2233
                            if ($user->hasRight('societe', 'creer')) {
2234
                                if (Adherent::STATUS_DRAFT != $object->statut) {
2235
                                    print '<a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?rowid=' . ((int) $object->id) . '&amp;action=create_thirdparty" title="' . dol_escape_htmltag($langs->trans("CreateDolibarrThirdPartyDesc")) . '">' . $langs->trans("CreateDolibarrThirdParty") . '</a>' . "\n";
2236
                                } else {
2237
                                    print '<a class="butActionRefused classfortooltip" href="#" title="' . dol_escape_htmltag($langs->trans("ValidateBefore")) . '">' . $langs->trans("CreateDolibarrThirdParty") . '</a>' . "\n";
2238
                                }
2239
                            } else {
2240
                                print '<span class="butActionRefused classfortooltip" title="' . dol_escape_htmltag($langs->trans("NotEnoughPermissions")) . '">' . $langs->trans("CreateDolibarrThirdParty") . '</span>' . "\n";
2241
                            }
2242
                        }
2243
2244
                        // Create user
2245
                        if (!$user->socid && !$object->user_id) {
2246
                            if ($user->hasRight('user', 'user', 'creer')) {
2247
                                if (Adherent::STATUS_DRAFT != $object->statut) {
2248
                                    print '<a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?rowid=' . ((int) $object->id) . '&amp;action=create_user" title="' . dol_escape_htmltag($langs->trans("CreateDolibarrLoginDesc")) . '">' . $langs->trans("CreateDolibarrLogin") . '</a>' . "\n";
2249
                                } else {
2250
                                    print '<a class="butActionRefused classfortooltip" href="#" title="' . dol_escape_htmltag($langs->trans("ValidateBefore")) . '">' . $langs->trans("CreateDolibarrLogin") . '</a>' . "\n";
2251
                                }
2252
                            } else {
2253
                                print '<span class="butActionRefused classfortooltip" title="' . dol_escape_htmltag($langs->trans("NotEnoughPermissions")) . '">' . $langs->trans("CreateDolibarrLogin") . '</span>' . "\n";
2254
                            }
2255
                        }
2256
2257
                        // Action SPIP
2258
                        if (isModEnabled('mailmanspip') && getDolGlobalString('ADHERENT_USE_SPIP')) {
2259
                            $isinspip = $mailmanspip->is_in_spip($object);
2260
2261
                            if ($isinspip == 1) {
2262
                                print '<a class="butAction" href="card.php?rowid=' . ((int) $object->id) . '&action=del_spip&token=' . newToken() . '">' . $langs->trans("DeleteIntoSpip") . '</a>' . "\n";
2263
                            }
2264
                            if ($isinspip == 0) {
2265
                                print '<a class="butAction" href="card.php?rowid=' . ((int) $object->id) . '&action=add_spip&token=' . newToken() . '">' . $langs->trans("AddIntoSpip") . '</a>' . "\n";
2266
                            }
2267
                        }
2268
2269
                        // Delete
2270
                        if ($user->hasRight('adherent', 'supprimer')) {
2271
                            print '<a class="butActionDelete" href="card.php?rowid=' . ((int) $object->id) . '&action=delete&token=' . newToken() . '">' . $langs->trans("Delete") . '</a>' . "\n";
2272
                        } else {
2273
                            print '<span class="butActionRefused classfortooltip" title="' . dol_escape_htmltag($langs->trans("NotEnoughPermissions")) . '">' . $langs->trans("Delete") . '</span>' . "\n";
2274
                        }
2275
                    }
2276
                }
2277
                print '</div>';
2278
2279
                if ($isinspip == -1) {
2280
                    print '<br><br><span class="error">' . $langs->trans('SPIPConnectionFailed') . ': ' . $mailmanspip->error . '</span>';
2281
                }
2282
2283
2284
                // Select mail models is same action as presend
2285
                if (GETPOST('modelselected')) {
2286
                    $action = 'presend';
2287
                }
2288
2289
                if ($action != 'presend') {
2290
                    print '<div class="fichecenter"><div class="fichehalfleft">';
2291
                    print '<a name="builddoc"></a>'; // ancre
2292
2293
                    // Generated documents
2294
                    $filename = dol_sanitizeFileName($object->ref);
2295
                    $filedir = $conf->adherent->dir_output . '/' . get_exdir(0, 0, 0, 1, $object, 'member');
2296
                    $urlsource = $_SERVER['PHP_SELF'] . '?id=' . $object->id;
2297
                    $genallowed = $user->hasRight('adherent', 'lire');
2298
                    $delallowed = $user->hasRight('adherent', 'creer');
2299
2300
                    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);
2301
                    $somethingshown = $formfile->numoffiles;
2302
2303
                    // Show links to link elements
2304
                    //$linktoelem = $form->showLinkToObjectBlock($object, null, array('subscription'));
2305
                    //$somethingshown = $form->showLinkedObjectBlock($object, '');
2306
2307
                    // Show links to link elements
2308
                    /*$linktoelem = $form->showLinkToObjectBlock($object,array('order'));
2309
                     if ($linktoelem) {
2310
                        print ($somethingshown?'':'<br>').$linktoelem;
2311
                    }
2312
                     */
2313
2314
                    // Show online payment link
2315
                    $useonlinepayment = (isModEnabled('paypal') || isModEnabled('stripe') || isModEnabled('paybox'));
2316
2317
                    $parameters = array();
2318
                    $reshook = $hookmanager->executeHooks('doShowOnlinePaymentUrl', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
2319
                    if ($reshook < 0) {
2320
                        setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2321
                    } else {
2322
                        $useonlinepayment = $reshook;
2323
                    }
2324
2325
                    if ($useonlinepayment) {
2326
                        print '<br>';
2327
                        if (empty($amount)) {   // Take the maximum amount among what the member is supposed to pay / has paid in the past
2328
                            $amount = max($adht->amount, $object->first_subscription_amount, $object->last_subscription_amount);
2329
                        }
2330
                        if (empty($amount)) {
2331
                            $amount = 0;
2332
                        }
2333
                        require_once DOL_DOCUMENT_ROOT . '/core/lib/payments.lib.php';
2334
                        print showOnlinePaymentUrl('membersubscription', $object->ref, $amount);
2335
                    }
2336
2337
                    print '</div><div class="fichehalfright">';
2338
2339
                    $MAX = 10;
2340
2341
                    $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT . '/adherents/agenda.php?id=' . $object->id);
2342
2343
                    // List of actions on element
2344
                    include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php';
2345
                    $formactions = new FormActions($db);
2346
                    $somethingshown = $formactions->showactions($object, $object->element, $socid, 1, 'listactions', $MAX, '', $morehtmlcenter);
2347
2348
                    print '</div></div>';
2349
                }
2350
2351
                // Presend form
2352
                $modelmail = 'member';
2353
                $defaulttopic = 'CardContent';
2354
                $diroutput = $conf->adherent->dir_output;
2355
                $trackid = 'mem' . $object->id;
2356
2357
                include DOL_DOCUMENT_ROOT . '/core/tpl/card_presend.tpl.php';
2358
            }
2359
        }
2360
2361
// End of page
2362
        llxFooter();
2363
        $db->close();
2364
    }
2365
2366
    /**
2367
     *  \file       htdocs/adherents/document.php
2368
     *  \brief      Tab for documents linked to third party
2369
     *  \ingroup    societe
2370
     */
2371
    public function document()
2372
    {
2373
        global $conf;
2374
        global $db;
2375
        global $user;
2376
        global $hookmanager;
2377
        global $user;
2378
        global $menumanager;
2379
        global $langs;
2380
2381
// Load translation files required by the page
2382
        $langs->loadLangs(array("companies", "members", "other"));
2383
2384
2385
        $id = GETPOSTISSET('id') ? GETPOSTINT('id') : GETPOSTINT('rowid');
2386
        $ref = GETPOST('ref', 'alphanohtml');
2387
        $action = GETPOST('action', 'aZ09');
2388
        $confirm = GETPOST('confirm', 'alpha');
2389
2390
// Get parameters
2391
        $limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
2392
        $sortfield = GETPOST('sortfield', 'aZ09comma');
2393
        $sortorder = GETPOST('sortorder', 'aZ09comma');
2394
        $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
2395
        if (empty($page) || $page == -1) {
2396
            $page = 0;
2397
        }     // If $page is not defined, or '' or -1
2398
        $offset = $limit * $page;
2399
        $pageprev = $page - 1;
2400
        $pagenext = $page + 1;
2401
        if (!$sortorder) {
2402
            $sortorder = "ASC";
2403
        }
2404
        if (!$sortfield) {
2405
            $sortfield = "name";
2406
        }
2407
2408
        $object = new Adherent($db);
2409
        $membert = new AdherentType($db);
2410
        $result = $object->fetch($id, $ref);
2411
        if ($result < 0) {
2412
            dol_print_error($db);
2413
            exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
2414
        }
2415
        $upload_dir = $conf->adherent->dir_output . "/" . get_exdir(0, 0, 0, 1, $object, 'member');
2416
2417
// Fetch object
2418
        if ($id > 0 || !empty($ref)) {
2419
            // Load member
2420
            $result = $object->fetch($id, $ref);
2421
2422
            // Define variables to know what current user can do on users
2423
            $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer'));
2424
            // Define variables to know what current user can do on properties of user linked to edited member
2425
            if ($object->user_id) {
2426
                // $User is the user who edits, $object->user_id is the id of the related user in the edited member
2427
                $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer'))
2428
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
2429
                $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
2430
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
2431
            }
2432
        }
2433
2434
// Define variables to determine what the current user can do on the members
2435
        $canaddmember = $user->hasRight('adherent', 'creer');
2436
// Define variables to determine what the current user can do on the properties of a member
2437
        if ($id) {
2438
            $caneditfieldmember = $user->hasRight('adherent', 'creer');
2439
        }
2440
2441
        $permissiontoadd = $canaddmember;
2442
2443
// Security check
2444
        $result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
2445
2446
2447
        /*
2448
         * Actions
2449
         */
2450
2451
        include DOL_DOCUMENT_ROOT . '/core/actions_linkedfiles.inc.php';
2452
2453
2454
        /*
2455
         * View
2456
         */
2457
2458
        $form = new Form($db);
2459
2460
        $title = $langs->trans("Member") . " - " . $langs->trans("Documents");
2461
2462
        $help_url = "EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder";
2463
2464
        llxHeader("", $title, $help_url);
2465
2466
        if ($id > 0) {
2467
            $result = $membert->fetch($object->typeid);
2468
            if ($result > 0) {
2469
                // Build file list
2470
                $filearray = dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) == 'desc' ? SORT_DESC : SORT_ASC), 1);
2471
                $totalsize = 0;
2472
                foreach ($filearray as $key => $file) {
2473
                    $totalsize += $file['size'];
2474
                }
2475
2476
                if (isModEnabled('notification')) {
2477
                    $langs->load("mails");
2478
                }
2479
2480
                $head = member_prepare_head($object);
2481
2482
                print dol_get_fiche_head($head, 'document', $langs->trans("Member"), -1, 'user');
2483
2484
                $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/list.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
2485
2486
                $morehtmlref = '<a href="' . DOL_URL_ROOT . '/adherents/vcard.php?id=' . $object->id . '" class="refid">';
2487
                $morehtmlref .= img_picto($langs->trans("Download") . ' ' . $langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
2488
                $morehtmlref .= '</a>';
2489
2490
                dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
2491
2492
                print '<div class="fichecenter">';
2493
2494
                print '<div class="underbanner clearboth"></div>';
2495
                print '<table class="border tableforfield centpercent">';
2496
2497
                $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/list.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
2498
2499
                // Login
2500
                if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
2501
                    print '<tr><td class="titlefield">' . $langs->trans("Login") . ' / ' . $langs->trans("Id") . '</td><td class="valeur">' . dol_escape_htmltag($object->login) . '</td></tr>';
2502
                }
2503
2504
                // Type
2505
                print '<tr><td>' . $langs->trans("Type") . '</td>';
2506
                print '<td class="valeur">' . $membert->getNomUrl(1) . "</td></tr>\n";
2507
2508
                // Morphy
2509
                print '<tr><td class="titlefield">' . $langs->trans("MemberNature") . '</td>';
2510
                print '<td class="valeur" >' . $object->getmorphylib('', 1) . '</td>';
2511
                print '</tr>';
2512
2513
                // Company
2514
                print '<tr><td>' . $langs->trans("Company") . '</td><td class="valeur">' . dol_escape_htmltag($object->company) . '</td></tr>';
2515
2516
                // Civility
2517
                print '<tr><td>' . $langs->trans("UserTitle") . '</td><td class="valeur">' . $object->getCivilityLabel() . '&nbsp;</td>';
2518
                print '</tr>';
2519
2520
                // Number of Attached Files
2521
                print '<tr><td>' . $langs->trans("NbOfAttachedFiles") . '</td><td colspan="3">' . count($filearray) . '</td></tr>';
2522
2523
                //Total Size Of Attached Files
2524
                print '<tr><td>' . $langs->trans("TotalSizeOfAttachedFiles") . '</td><td colspan="3">' . dol_print_size($totalsize, 1, 1) . '</td></tr>';
2525
2526
                print '</table>';
2527
2528
                print '</div>';
2529
2530
                print dol_get_fiche_end();
2531
2532
                $modulepart = 'member';
2533
                $permissiontoadd = $user->hasRight('adherent', 'creer');
2534
                $permtoedit = $user->hasRight('adherent', 'creer');
2535
                $param = '&id=' . $object->id;
2536
                include DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_post_headers.tpl.php';
2537
                print "<br><br>";
2538
            } else {
2539
                dol_print_error($db);
2540
            }
2541
        } else {
2542
            $langs->load("errors");
2543
            print $langs->trans("ErrorRecordNotFound");
2544
        }
2545
2546
// End of page
2547
        llxFooter();
2548
        $db->close();
2549
    }
2550
2551
    /**
2552
     *       \file       htdocs/adherents/index.php
2553
     *       \ingroup    member
2554
     *       \brief      Home page of membership module
2555
     */
2556
    public function index()
2557
    {
2558
        global $conf;
2559
        global $db;
2560
        global $user;
2561
        global $hookmanager;
2562
        global $user;
2563
        global $menumanager;
2564
        global $langs;
2565
2566
// Load translation files required by the page
2567
        $langs->loadLangs(["companies", "members"]);
2568
2569
        // $hookmanager = new HookManager($db);
2570
2571
// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array
2572
        $hookmanager->initHooks(['membersindex']);
2573
2574
// Security check
2575
        $result = restrictedArea($user, 'adherent');
2576
2577
        /*
2578
         * Actions
2579
         */
2580
2581
        $userid = GETPOSTINT('userid');
2582
        if (GETPOST('addbox')) {
2583
            // Add box (when submit is done from a form when ajax disabled)
2584
            require_once DOL_DOCUMENT_ROOT . '/core/class/infobox.class.php';
2585
            $zone = GETPOSTINT('areacode');
2586
            $boxorder = GETPOST('boxorder', 'aZ09');
2587
            $boxorder .= GETPOST('boxcombo', 'aZ09');
2588
            $result = InfoBox::saveboxorder($db, $zone, $boxorder, $userid);
2589
            if ($result > 0) {
2590
                setEventMessages($langs->trans("BoxAdded"), null);
2591
            }
2592
        }
2593
2594
        /*
2595
         * View
2596
         */
2597
2598
        $form = new Form($db);
2599
2600
// Load $resultboxes (selectboxlist + boxactivated + boxlista + boxlistb)
2601
        $resultboxes = FormOther::getBoxesArea($user, "2");
2602
2603
        llxHeader('', $langs->trans("Members"), 'EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder');
2604
2605
        $staticmember = new Adherent($db);
2606
        $statictype = new AdherentType($db);
2607
        $subscriptionstatic = new Subscription($db);
2608
2609
        print load_fiche_titre($langs->trans("MembersArea"), $resultboxes['selectboxlist'], 'members');
2610
2611
        /*
2612
         * Statistics
2613
         */
2614
2615
        $boxgraph = '';
2616
        if ($conf->use_javascript_ajax) {
2617
            $year = date('Y');
2618
            $numberyears = getDolGlobalInt("MAIN_NB_OF_YEAR_IN_MEMBERSHIP_WIDGET_GRAPH");
2619
2620
            $boxgraph .= '<div class="div-table-responsive-no-min">';
2621
            $boxgraph .= '<table class="noborder nohover centpercent">';
2622
            $boxgraph .= '<tr class="liste_titre"><th colspan="2">' . $langs->trans("Statistics") . ($numberyears ? ' (' . ($year - $numberyears) . ' - ' . $year . ')' : '') . '</th></tr>';
2623
            $boxgraph .= '<tr><td class="center" colspan="2">';
2624
2625
            $stats = new AdherentStats($db, 0, $userid);
2626
2627
            // Show array
2628
            $sumMembers = $stats->countMembersByTypeAndStatus($numberyears);
2629
            if (is_array($sumMembers) && !empty($sumMembers)) {
2630
                $total = $sumMembers['total']['members_draft'] + $sumMembers['total']['members_pending'] + $sumMembers['total']['members_uptodate'] + $sumMembers['total']['members_expired'] + $sumMembers['total']['members_excluded'] + $sumMembers['total']['members_resiliated'];
2631
            } else {
2632
                $total = 0;
2633
            }
2634
            foreach (['members_draft', 'members_pending', 'members_uptodate', 'members_expired', 'members_excluded', 'members_resiliated'] as $val) {
2635
                if (empty($sumMembers['total'][$val])) {
2636
                    $sumMembers['total'][$val] = 0;
2637
                }
2638
            }
2639
2640
            $dataseries = [];
2641
            $dataseries[] = [$langs->transnoentitiesnoconv("MembersStatusToValid"), $sumMembers['total']['members_draft']];            // Draft, not yet validated
2642
            $dataseries[] = [$langs->transnoentitiesnoconv("WaitingSubscription"), $sumMembers['total']['members_pending']];
2643
            $dataseries[] = [$langs->transnoentitiesnoconv("UpToDate"), $sumMembers['total']['members_uptodate']];
2644
            $dataseries[] = [$langs->transnoentitiesnoconv("OutOfDate"), $sumMembers['total']['members_expired']];
2645
            $dataseries[] = [$langs->transnoentitiesnoconv("MembersStatusExcluded"), $sumMembers['total']['members_excluded']];
2646
            $dataseries[] = [$langs->transnoentitiesnoconv("MembersStatusResiliated"), $sumMembers['total']['members_resiliated']];
2647
2648
            include DOL_DOCUMENT_ROOT . '/theme/' . $conf->theme . '/theme_vars.inc.php';
2649
2650
            include_once DOL_DOCUMENT_ROOT . '/core/class/dolgraph.class.php';
2651
            $dolgraph = new DolGraph();
2652
            $dolgraph->SetData($dataseries);
2653
            $dolgraph->SetDataColor(['-' . $badgeStatus0, $badgeStatus1, $badgeStatus4, $badgeStatus8, '-' . $badgeStatus8, $badgeStatus6]);
2654
            $dolgraph->setShowLegend(2);
2655
            $dolgraph->setShowPercent(1);
2656
            $dolgraph->SetType(['pie']);
2657
            $dolgraph->setHeight('200');
2658
            $dolgraph->draw('idgraphstatus');
2659
            $boxgraph .= $dolgraph->show($total ? 0 : 1);
2660
2661
            $boxgraph .= '</td></tr>';
2662
            $boxgraph .= '<tr class="liste_total"><td>' . $langs->trans("Total") . '</td><td class="right">';
2663
            $boxgraph .= $total;
2664
            $boxgraph .= '</td></tr>';
2665
            $boxgraph .= '</table>';
2666
            $boxgraph .= '</div>';
2667
            $boxgraph .= '<br>';
2668
        }
2669
2670
// boxes
2671
        print '<div class="clearboth"></div>';
2672
        print '<div class="fichecenter fichecenterbis">';
2673
2674
        print '<div class="twocolumns">';
2675
2676
        print '<div class="firstcolumn fichehalfleft boxhalfleft" id="boxhalfleft">';
2677
2678
        print $boxgraph;
2679
2680
        print $resultboxes['boxlista'];
2681
2682
        print '</div>' . "\n";
2683
2684
        print '<div class="secondcolumn fichehalfright boxhalfright" id="boxhalfright">';
2685
2686
        print $resultboxes['boxlistb'];
2687
2688
        print '</div>' . "\n";
2689
2690
        print '</div>';
2691
        print '</div>';
2692
2693
        $parameters = ['user' => $user];
2694
        $reshook = $hookmanager->executeHooks('dashboardMembers', $parameters, $object); // Note that $action and $object may have been modified by hook
2695
2696
// End of page
2697
        llxFooter();
2698
        $db->close();
2699
    }
2700
2701
    /**
2702
     *       \file       htdocs/adherents/ldap.php
2703
     *       \ingroup    ldap member
2704
     *       \brief      Page fiche LDAP adherent
2705
     */
2706
    public function ldap()
2707
    {
2708
        global $conf;
2709
        global $db;
2710
        global $user;
2711
        global $hookmanager;
2712
        global $user;
2713
        global $menumanager;
2714
        global $langs;
2715
2716
// Load translation files required by the page
2717
        $langs->loadLangs(array("companies", "members", "ldap", "admin"));
2718
2719
        $id = GETPOSTINT('id');
2720
        $ref = GETPOST('ref', 'alphanohtml');
2721
        $action = GETPOST('action', 'aZ09');
2722
2723
// Protection
2724
        $socid = 0;
2725
        if ($user->socid > 0) {
2726
            $socid = $user->socid;
2727
        }
2728
2729
        $object = new Adherent($db);
2730
2731
// Fetch object
2732
        if ($id > 0 || !empty($ref)) {
2733
            // Load member
2734
            $result = $object->fetch($id, $ref);
2735
2736
            // Define variables to know what current user can do on users
2737
            $canadduser = (!empty($user->admin) || $user->hasRight('user', 'user', 'creer'));
2738
            // Define variables to know what current user can do on properties of user linked to edited member
2739
            if ($object->user_id) {
2740
                // $User is the user who edits, $object->user_id is the id of the related user in the edited member
2741
                $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer'))
2742
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
2743
                $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
2744
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
2745
            }
2746
        }
2747
2748
// Define variables to determine what the current user can do on the members
2749
        $canaddmember = $user->hasRight('adherent', 'creer');
2750
// Define variables to determine what the current user can do on the properties of a member
2751
        if ($id) {
2752
            $caneditfieldmember = $user->hasRight('adherent', 'creer');
2753
        }
2754
2755
// Security check
2756
        $result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
2757
2758
2759
        /*
2760
         * Actions
2761
         */
2762
2763
        if ($action == 'dolibarr2ldap') {
2764
            $ldap = new Ldap();
2765
            $result = $ldap->connectBind();
2766
2767
            if ($result > 0) {
2768
                $info = $object->_load_ldap_info();
2769
                $dn = $object->_load_ldap_dn($info);
2770
                $olddn = $dn; // We can say that old dn = dn as we force synchro
2771
2772
                $result = $ldap->update($dn, $info, $user, $olddn);
2773
            }
2774
2775
            if ($result >= 0) {
2776
                setEventMessages($langs->trans("MemberSynchronized"), null, 'mesgs');
2777
            } else {
2778
                setEventMessages($ldap->error, $ldap->errors, 'errors');
2779
            }
2780
        }
2781
2782
2783
2784
        /*
2785
         *	View
2786
         */
2787
2788
        $form = new Form($db);
2789
2790
        llxHeader('', $langs->trans("Member"), 'EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder');
2791
2792
        $head = member_prepare_head($object);
2793
2794
        print dol_get_fiche_head($head, 'ldap', $langs->trans("Member"), 0, 'user');
2795
2796
        $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/list.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
2797
2798
        dol_banner_tab($object, 'rowid', $linkback);
2799
2800
        print '<div class="fichecenter">';
2801
2802
        print '<div class="underbanner clearboth"></div>';
2803
        print '<table class="border centpercent tableforfield">';
2804
2805
// Login
2806
        print '<tr><td class="titlefield">' . $langs->trans("Login") . ' / ' . $langs->trans("Id") . '</td><td class="valeur">' . dol_escape_htmltag($object->login) . '&nbsp;</td></tr>';
2807
2808
// If there is a link to the unencrypted password, we show the value in database here so we can compare because it is shown nowhere else
2809
// This is for very old situation. Password are now encrypted and $object->pass is empty.
2810
        if (getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD')) {
2811
            print '<tr><td>' . $langs->trans("LDAPFieldPasswordNotCrypted") . '</td>';
2812
            print '<td class="valeur">' . dol_escape_htmltag($object->pass) . '</td>';
2813
            print "</tr>\n";
2814
        }
2815
2816
        $adht = new AdherentType($db);
2817
        $adht->fetch($object->typeid);
2818
2819
// Type
2820
        print '<tr><td>' . $langs->trans("Type") . '</td><td class="valeur">' . $adht->getNomUrl(1) . "</td></tr>\n";
2821
2822
// LDAP DN
2823
        print '<tr><td>LDAP ' . $langs->trans("LDAPMemberDn") . '</td><td class="valeur">' . getDolGlobalString('LDAP_MEMBER_DN') . "</td></tr>\n";
2824
2825
// LDAP Cle
2826
        print '<tr><td>LDAP ' . $langs->trans("LDAPNamingAttribute") . '</td><td class="valeur">' . getDolGlobalString('LDAP_KEY_MEMBERS') . "</td></tr>\n";
2827
2828
// LDAP Server
2829
        print '<tr><td>LDAP ' . $langs->trans("Type") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_TYPE') . "</td></tr>\n";
2830
        print '<tr><td>LDAP ' . $langs->trans("Version") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_PROTOCOLVERSION') . "</td></tr>\n";
2831
        print '<tr><td>LDAP ' . $langs->trans("LDAPPrimaryServer") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_HOST') . "</td></tr>\n";
2832
        print '<tr><td>LDAP ' . $langs->trans("LDAPSecondaryServer") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_HOST_SLAVE') . "</td></tr>\n";
2833
        print '<tr><td>LDAP ' . $langs->trans("LDAPServerPort") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_PORT') . "</td></tr>\n";
2834
2835
        print '</table>';
2836
2837
        print '</div>';
2838
2839
        print dol_get_fiche_end();
2840
2841
        /*
2842
         * Action bar
2843
         */
2844
        print '<div class="tabsAction">';
2845
2846
        if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalString('LDAP_MEMBER_ACTIVE') != Ldap::SYNCHRO_LDAP_TO_DOLIBARR) {
2847
            print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&amp;action=dolibarr2ldap">' . $langs->trans("ForceSynchronize") . '</a></div>';
2848
        }
2849
2850
        print "</div>\n";
2851
2852
        if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalString('LDAP_MEMBER_ACTIVE') != Ldap::SYNCHRO_LDAP_TO_DOLIBARR) {
2853
            print "<br>\n";
2854
        }
2855
2856
2857
2858
// Affichage attributes LDAP
2859
        print load_fiche_titre($langs->trans("LDAPInformationsForThisMember"));
2860
2861
        print '<table width="100%" class="noborder">';
2862
2863
        print '<tr class="liste_titre">';
2864
        print '<td>' . $langs->trans("LDAPAttributes") . '</td>';
2865
        print '<td>' . $langs->trans("Value") . '</td>';
2866
        print '</tr>';
2867
2868
// Lecture LDAP
2869
        $ldap = new Ldap();
2870
        $result = $ldap->connectBind();
2871
        if ($result > 0) {
2872
            $info = $object->_load_ldap_info();
2873
            $dn = $object->_load_ldap_dn($info, 1);
2874
            $search = "(" . $object->_load_ldap_dn($info, 2) . ")";
2875
2876
            if (empty($dn)) {
2877
                $langs->load("errors");
2878
                print '<tr class="oddeven"><td colspan="2"><span class="error">' . $langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Member")) . '</span></td></tr>';
2879
            } else {
2880
                $records = $ldap->getAttribute($dn, $search);
2881
2882
                //print_r($records);
2883
2884
                // Show tree
2885
                if (((!is_numeric($records)) || $records != 0) && (!isset($records['count']) || $records['count'] > 0)) {
2886
                    if (!is_array($records)) {
2887
                        print '<tr class="oddeven"><td colspan="2"><span class="error">' . $langs->trans("ErrorFailedToReadLDAP") . '</span></td></tr>';
2888
                    } else {
2889
                        $result = show_ldap_content($records, 0, $records['count'], true);
2890
                    }
2891
                } else {
2892
                    print '<tr class="oddeven"><td colspan="2">' . $langs->trans("LDAPRecordNotFound") . ' (dn=' . dol_escape_htmltag($dn) . ' - search=' . dol_escape_htmltag($search) . ')</td></tr>';
2893
                }
2894
            }
2895
2896
            $ldap->unbind();
2897
        } else {
2898
            setEventMessages($ldap->error, $ldap->errors, 'errors');
2899
        }
2900
2901
2902
        print '</table>';
2903
2904
// End of page
2905
        llxFooter();
2906
        $db->close();
2907
    }
2908
2909
    /**
2910
     *  \file       htdocs/adherents/list.php
2911
     *  \ingroup    member
2912
     *  \brief      Page to list all members of foundation
2913
     */
2914
    public function list()
2915
    {
2916
        global $conf;
2917
        global $db;
2918
        global $user;
2919
        global $hookmanager;
2920
        global $user;
2921
        global $menumanager;
2922
        global $langs;
2923
2924
// Load translation files required by the page
2925
        $langs->loadLangs(["members", "companies", "categories"]);
2926
2927
2928
// Get parameters
2929
        $action = GETPOST('action', 'aZ09');
2930
        $massaction = GETPOST('massaction', 'alpha');
2931
        $show_files = GETPOSTINT('show_files');
2932
        $confirm = GETPOST('confirm', 'alpha');
2933
        $cancel = GETPOST('cancel', 'alpha');
2934
        $toselect = GETPOST('toselect', 'array');
2935
        $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'memberslist'; // To manage different context of search
2936
        $backtopage = GETPOST('backtopage', 'alpha');
2937
        $optioncss = GETPOST('optioncss', 'aZ');
2938
        $mode = GETPOST('mode', 'alpha');
2939
2940
// Search fields
2941
        $search = GETPOST("search", 'alpha');
2942
        $search_ref = GETPOST("search_ref", 'alpha');
2943
        $search_lastname = GETPOST("search_lastname", 'alpha');
2944
        $search_firstname = GETPOST("search_firstname", 'alpha');
2945
        $search_gender = GETPOST("search_gender", 'alpha');
2946
        $search_civility = GETPOST("search_civility", 'alpha');
2947
        $search_company = GETPOST('search_company', 'alphanohtml');
2948
        $search_login = GETPOST("search_login", 'alpha');
2949
        $search_address = GETPOST("search_address", 'alpha');
2950
        $search_zip = GETPOST("search_zip", 'alpha');
2951
        $search_town = GETPOST("search_town", 'alpha');
2952
        $search_state = GETPOST("search_state", 'alpha');  // county / departement / federal state
2953
        $search_country = GETPOST("search_country", 'alpha');
2954
        $search_phone = GETPOST("search_phone", 'alpha');
2955
        $search_phone_perso = GETPOST("search_phone_perso", 'alpha');
2956
        $search_phone_mobile = GETPOST("search_phone_mobile", 'alpha');
2957
        $search_type = GETPOST("search_type", 'alpha');
2958
        $search_email = GETPOST("search_email", 'alpha');
2959
        $search_categ = GETPOSTINT("search_categ");
2960
        $search_morphy = GETPOST("search_morphy", 'alpha');
2961
        $search_import_key = trim(GETPOST("search_import_key", 'alpha'));
2962
2963
        $catid = GETPOSTINT("catid");
2964
        $socid = GETPOSTINT('socid');
2965
2966
        $search_filter = GETPOST("search_filter", 'alpha');
2967
        $search_status = GETPOST("search_status", 'intcomma');  // status
2968
        $search_datec_start = dol_mktime(0, 0, 0, GETPOSTINT('search_datec_start_month'), GETPOSTINT('search_datec_start_day'), GETPOSTINT('search_datec_start_year'));
2969
        $search_datec_end = dol_mktime(23, 59, 59, GETPOSTINT('search_datec_end_month'), GETPOSTINT('search_datec_end_day'), GETPOSTINT('search_datec_end_year'));
2970
        $search_datem_start = dol_mktime(0, 0, 0, GETPOSTINT('search_datem_start_month'), GETPOSTINT('search_datem_start_day'), GETPOSTINT('search_datem_start_year'));
2971
        $search_datem_end = dol_mktime(23, 59, 59, GETPOSTINT('search_datem_end_month'), GETPOSTINT('search_datem_end_day'), GETPOSTINT('search_datem_end_year'));
2972
2973
        $filter = GETPOST("filter", 'alpha');
2974
        if ($filter) {
2975
            $search_filter = $filter; // For backward compatibility
2976
        }
2977
2978
        $statut = GETPOST("statut", 'alpha');
2979
        if ($statut != '') {
2980
            $search_status = $statut; // For backward compatibility
2981
        }
2982
2983
        $search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
2984
2985
        if ($search_status < -2) {
2986
            $search_status = '';
2987
        }
2988
2989
// Pagination parameters
2990
        $limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
2991
        $sortfield = GETPOST('sortfield', 'aZ09comma');
2992
        $sortorder = GETPOST('sortorder', 'aZ09comma');
2993
        $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
2994
        if (empty($page) || $page == -1) {
2995
            $page = 0;
2996
        }     // If $page is not defined, or '' or -1
2997
        $offset = $limit * $page;
2998
        $pageprev = $page - 1;
2999
        $pagenext = $page + 1;
3000
        if (!$sortorder) {
3001
            $sortorder = ($filter == 'outofdate' ? "DESC" : "ASC");
3002
        }
3003
        if (!$sortfield) {
3004
            $sortfield = ($filter == 'outofdate' ? "d.datefin" : "d.lastname");
3005
        }
3006
3007
        $object = new Adherent($db);
3008
3009
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
3010
        $hookmanager->initHooks(['memberlist']);
3011
        $extrafields = new ExtraFields($db);
3012
3013
// fetch optionals attributes and labels
3014
        $extrafields->fetch_name_optionals_label($object->table_element);
3015
3016
        $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
3017
3018
// List of fields to search into when doing a "search in all"
3019
        $fieldstosearchall = [
3020
            'd.ref' => 'Ref',
3021
            'd.login' => 'Login',
3022
            'd.lastname' => 'Lastname',
3023
            'd.firstname' => 'Firstname',
3024
            'd.societe' => "Company",
3025
            'd.email' => 'EMail',
3026
            'd.address' => 'Address',
3027
            'd.zip' => 'Zip',
3028
            'd.town' => 'Town',
3029
            'd.phone' => "Phone",
3030
            'd.phone_perso' => "PhonePerso",
3031
            'd.phone_mobile' => "PhoneMobile",
3032
            'd.note_public' => 'NotePublic',
3033
            'd.note_private' => 'NotePrivate',
3034
        ];
3035
3036
        $arrayfields = [
3037
            'd.ref' => ['label' => "Ref", 'checked' => 1],
3038
            'd.civility' => ['label' => "Civility", 'checked' => 0],
3039
            'd.lastname' => ['label' => "Lastname", 'checked' => 1],
3040
            'd.firstname' => ['label' => "Firstname", 'checked' => 1],
3041
            'd.gender' => ['label' => "Gender", 'checked' => 0],
3042
            'd.company' => ['label' => "Company", 'checked' => 1, 'position' => 70],
3043
            'd.login' => ['label' => "Login", 'checked' => 1],
3044
            'd.morphy' => ['label' => "MemberNature", 'checked' => 1],
3045
            't.libelle' => ['label' => "Type", 'checked' => 1, 'position' => 55],
3046
            'd.address' => ['label' => "Address", 'checked' => 0],
3047
            'd.zip' => ['label' => "Zip", 'checked' => 0],
3048
            'd.town' => ['label' => "Town", 'checked' => 0],
3049
            'd.phone' => ['label' => "Phone", 'checked' => 0],
3050
            'd.phone_perso' => ['label' => "PhonePerso", 'checked' => 0],
3051
            'd.phone_mobile' => ['label' => "PhoneMobile", 'checked' => 0],
3052
            'd.email' => ['label' => "Email", 'checked' => 1],
3053
            'state.nom' => ['label' => "State", 'checked' => 0, 'position' => 90],
3054
            'country.code_iso' => ['label' => "Country", 'checked' => 0, 'position' => 95],
3055
            /*'d.note_public'=>array('label'=>"NotePublic", 'checked'=>0),
3056
            'd.note_private'=>array('label'=>"NotePrivate", 'checked'=>0),*/
3057
            'd.datefin' => ['label' => "EndSubscription"],
3058
            'd.datec' => ['label' => "DateCreation"],
3059
            'd.birth' => ['label' => "Birthday"],
3060
            'd.tms' => ['label' => "DateModificationShort"],
3061
            'd.statut' => ['label' => "Status"],
3062
            'd.import_key' => ['label' => "ImportId"],
3063
        ];
3064
3065
// Extra fields
3066
        include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_array_fields.tpl.php';
3067
3068
        $object->fields = dol_sort_array($object->fields, 'position');
3069
//$arrayfields['anotherfield'] = array('type'=>'integer', 'label'=>'AnotherField', 'checked'=>1, 'enabled'=>1, 'position'=>90, 'csslist'=>'right');
3070
3071
// Complete array of fields for columns
3072
        $tableprefix = 'd';
3073
        foreach ($object->fields as $key => $val) {
3074
            if (!array_key_exists($tableprefix . '.' . $key, $arrayfields)) {   // Discard record not into $arrayfields
3075
                continue;
3076
            }
3077
            // If $val['visible']==0, then we never show the field
3078
3079
            if (!empty($val['visible'])) {
3080
                $visible = (int) dol_eval($val['visible'], 1);
3081
                $arrayfields[$tableprefix . '.' . $key] = [
3082
                    'label' => $val['label'],
3083
                    'checked' => (($visible < 0) ? 0 : 1),
3084
                    'enabled' => (abs($visible) != 3 && (int) dol_eval($val['enabled'], 1)),
3085
                    'position' => $val['position'],
3086
                    'help' => isset($val['help']) ? $val['help'] : '',
3087
                ];
3088
            }
3089
        }
3090
        $arrayfields = dol_sort_array($arrayfields, 'position');
3091
//var_dump($arrayfields);exit;
3092
3093
// Security check
3094
        $result = restrictedArea($user, 'adherent');
3095
3096
3097
        /*
3098
         * Actions
3099
         */
3100
3101
        if (GETPOST('cancel', 'alpha')) {
3102
            $action = 'list';
3103
            $massaction = '';
3104
        }
3105
        if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
3106
            $massaction = '';
3107
        }
3108
3109
        $parameters = ['socid' => isset($socid) ? $socid : null];
3110
        $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
3111
        if ($reshook < 0) {
3112
            setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
3113
        }
3114
3115
        if (empty($reshook)) {
3116
            // Selection of new fields
3117
            include DOL_DOCUMENT_ROOT . '/core/actions_changeselectedfields.inc.php';
3118
3119
            // Purge search criteria
3120
            if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
3121
                $statut = '';
3122
                $filter = '';
3123
3124
                $search = "";
3125
                $search_ref = "";
3126
                $search_lastname = "";
3127
                $search_firstname = "";
3128
                $search_gender = "";
3129
                $search_civility = "";
3130
                $search_login = "";
3131
                $search_company = "";
3132
                $search_type = "";
3133
                $search_email = "";
3134
                $search_address = "";
3135
                $search_zip = "";
3136
                $search_town = "";
3137
                $search_state = "";
3138
                $search_country = '';
3139
                $search_phone = '';
3140
                $search_phone_perso = '';
3141
                $search_phone_mobile = '';
3142
                $search_morphy = "";
3143
                $search_categ = "";
3144
                $search_filter = "";
3145
                $search_status = "";
3146
                $search_import_key = '';
3147
                $catid = "";
3148
                $search_all = "";
3149
                $toselect = [];
3150
                $search_datec_start = '';
3151
                $search_datec_end = '';
3152
                $search_datem_start = '';
3153
                $search_datem_end = '';
3154
                $search_array_options = [];
3155
            }
3156
3157
            // Close
3158
            if ($massaction == 'close' && $user->hasRight('adherent', 'creer')) {
3159
                $tmpmember = new Adherent($db);
3160
                $error = 0;
3161
                $nbclose = 0;
3162
3163
                $db->begin();
3164
3165
                foreach ($toselect as $idtoclose) {
3166
                    $tmpmember->fetch($idtoclose);
3167
                    $result = $tmpmember->resiliate($user);
3168
3169
                    if ($result < 0 && !count($tmpmember->errors)) {
3170
                        setEventMessages($tmpmember->error, $tmpmember->errors, 'errors');
3171
                    } else {
3172
                        if ($result > 0) {
3173
                            $nbclose++;
3174
                        }
3175
                    }
3176
                }
3177
3178
                if (!$error) {
3179
                    setEventMessages($langs->trans("XMembersClosed", $nbclose), null, 'mesgs');
3180
3181
                    $db->commit();
3182
                } else {
3183
                    $db->rollback();
3184
                }
3185
            }
3186
3187
            // Create external user
3188
            if ($massaction == 'createexternaluser' && $user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer')) {
3189
                $tmpmember = new Adherent($db);
3190
                $error = 0;
3191
                $nbcreated = 0;
3192
3193
                $db->begin();
3194
3195
                foreach ($toselect as $idtoclose) {
3196
                    $tmpmember->fetch($idtoclose);
3197
3198
                    if (!empty($tmpmember->fk_soc)) {
3199
                        $nuser = new User($db);
3200
                        $tmpuser = dol_clone($tmpmember);
3201
3202
                        $result = $nuser->create_from_member($tmpuser, $tmpmember->login);
3203
3204
                        if ($result < 0 && !count($tmpmember->errors)) {
3205
                            setEventMessages($tmpmember->error, $tmpmember->errors, 'errors');
3206
                        } else {
3207
                            if ($result > 0) {
3208
                                $nbcreated++;
3209
                            }
3210
                        }
3211
                    }
3212
                }
3213
3214
                if (!$error) {
3215
                    setEventMessages($langs->trans("XExternalUserCreated", $nbcreated), null, 'mesgs');
3216
3217
                    $db->commit();
3218
                } else {
3219
                    $db->rollback();
3220
                }
3221
            }
3222
3223
            // Create external user
3224
            if ($action == 'createsubscription_confirm' && $confirm == "yes" && $user->hasRight('adherent', 'creer')) {
3225
                $tmpmember = new Adherent($db);
3226
                $adht = new AdherentType($db);
3227
                $error = 0;
3228
                $nbcreated = 0;
3229
                $now = dol_now();
3230
                $amount = price2num(GETPOST('amount', 'alpha'));
3231
                $db->begin();
3232
                foreach ($toselect as $id) {
3233
                    $res = $tmpmember->fetch($id);
3234
                    if ($res > 0) {
3235
                        $result = $tmpmember->subscription($now, $amount);
3236
                        if ($result < 0) {
3237
                            $error++;
3238
                        } else {
3239
                            $nbcreated++;
3240
                        }
3241
                    } else {
3242
                        $error++;
3243
                    }
3244
                }
3245
3246
                if (!$error) {
3247
                    setEventMessages($langs->trans("XSubsriptionCreated", $nbcreated), null, 'mesgs');
3248
                    $db->commit();
3249
                } else {
3250
                    setEventMessages($langs->trans("XSubsriptionError", $error), null, 'mesgs');
3251
                    $db->rollback();
3252
                }
3253
            }
3254
3255
            // Mass actions
3256
            $objectclass = 'Adherent';
3257
            $objectlabel = 'Members';
3258
            $permissiontoread = $user->hasRight('adherent', 'lire');
3259
            $permissiontodelete = $user->hasRight('adherent', 'supprimer');
3260
            $permissiontoadd = $user->hasRight('adherent', 'creer');
3261
            $uploaddir = $conf->adherent->dir_output;
3262
            include DOL_DOCUMENT_ROOT . '/core/actions_massactions.inc.php';
3263
        }
3264
3265
3266
        /*
3267
         * View
3268
         */
3269
3270
        $form = new Form($db);
3271
        $formother = new FormOther($db);
3272
        $membertypestatic = new AdherentType($db);
3273
        $memberstatic = new Adherent($db);
3274
3275
        $now = dol_now();
3276
3277
// Page Header
3278
        $title = $langs->trans("Members") . " - " . $langs->trans("List");
3279
        $help_url = 'EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder';
3280
        $morejs = [];
3281
        $morecss = [];
3282
3283
3284
// Build and execute select
3285
// --------------------------------------------------------------------
3286
        if ((!empty($search_categ) && $search_categ > 0) || !empty($catid)) {
3287
            $sql = "SELECT DISTINCT";
3288
        } else {
3289
            $sql = "SELECT";
3290
        }
3291
        $sql .= " d.rowid, d.ref, d.login, d.lastname, d.firstname, d.gender, d.societe as company, d.fk_soc,";
3292
        $sql .= " d.civility, d.datefin, d.address, d.zip, d.town, d.state_id, d.country,";
3293
        $sql .= " d.email, d.phone, d.phone_perso, d.phone_mobile, d.birth, d.public, d.photo,";
3294
        $sql .= " d.fk_adherent_type as type_id, d.morphy, d.statut as status, d.datec as date_creation, d.tms as date_modification,";
3295
        $sql .= " d.note_private, d.note_public, d.import_key,";
3296
        $sql .= " s.nom,";
3297
        $sql .= " " . $db->ifsql("d.societe IS NULL", "s.nom", "d.societe") . " as companyname,";
3298
        $sql .= " t.libelle as type, t.subscription,";
3299
        $sql .= " state.code_departement as state_code, state.nom as state_name";
3300
3301
// Add fields from extrafields
3302
        if (!empty($extrafields->attributes[$object->table_element]['label'])) {
3303
            foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
3304
                $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef." . $key . " as options_" . $key : '');
3305
            }
3306
        }
3307
3308
// Add fields from hooks
3309
        $parameters = [];
3310
        $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
3311
        $sql .= $hookmanager->resPrint;
3312
        $sql = preg_replace('/,\s*$/', '', $sql);
3313
3314
        $sqlfields = $sql; // $sql fields to remove for count total
3315
3316
// SQL Alias adherent
3317
        $sql .= " FROM " . MAIN_DB_PREFIX . "adherent as d";  // maybe better to use ad (adh) instead of d
3318
        if (!empty($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
3319
            $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . $object->table_element . "_extrafields as ef on (d.rowid = ef.fk_object)";
3320
        }
3321
        $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_country as country on (country.rowid = d.country)";
3322
        $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_departements as state on (state.rowid = d.state_id)";
3323
        $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe as s on (s.rowid = d.fk_soc)";
3324
3325
// SQL Alias adherent_type
3326
        $sql .= ", " . MAIN_DB_PREFIX . "adherent_type as t";
3327
        $sql .= " WHERE d.fk_adherent_type = t.rowid";
3328
3329
        if ($catid && empty($search_categ)) {
3330
            $search_categ = $catid;
3331
        }
3332
3333
        $searchCategoryContactList = $search_categ ? [$search_categ] : [];
3334
        $searchCategoryContactOperator = 0;
3335
// Search for tag/category ($searchCategoryContactList is an array of ID)
3336
        if (!empty($searchCategoryContactList)) {
3337
            $searchCategoryContactSqlList = [];
3338
            $listofcategoryid = '';
3339
            foreach ($searchCategoryContactList as $searchCategoryContact) {
3340
                if (intval($searchCategoryContact) == -2) {
3341
                    $searchCategoryContactSqlList[] = "NOT EXISTS (SELECT ck.fk_categorie FROM " . MAIN_DB_PREFIX . "categorie_member as ck WHERE d.rowid = ck.fk_member)";
3342
                } elseif (intval($searchCategoryContact) > 0) {
3343
                    if ($searchCategoryContactOperator == 0) {
3344
                        $searchCategoryContactSqlList[] = " EXISTS (SELECT ck.fk_categorie FROM " . MAIN_DB_PREFIX . "categorie_member as ck WHERE d.rowid = ck.fk_member AND ck.fk_categorie = " . ((int) $searchCategoryContact) . ")";
3345
                    } else {
3346
                        $listofcategoryid .= ($listofcategoryid ? ', ' : '') . ((int) $searchCategoryContact);
3347
                    }
3348
                }
3349
            }
3350
            if ($listofcategoryid) {
3351
                $searchCategoryContactSqlList[] = " EXISTS (SELECT ck.fk_categorie FROM " . MAIN_DB_PREFIX . "categorie_member as ck WHERE d.rowid = ck.fk_member AND ck.fk_categorie IN (" . $db->sanitize($listofcategoryid) . "))";
3352
            }
3353
            if ($searchCategoryContactOperator == 1) {
3354
                if (!empty($searchCategoryContactSqlList)) {
3355
                    $sql .= " AND (" . implode(' OR ', $searchCategoryContactSqlList) . ")";
3356
                }
3357
            } else {
3358
                if (!empty($searchCategoryContactSqlList)) {
3359
                    $sql .= " AND (" . implode(' AND ', $searchCategoryContactSqlList) . ")";
3360
                }
3361
            }
3362
        }
3363
3364
        $sql .= " AND d.entity IN (" . getEntity('adherent') . ")";
3365
        if ($search_all) {
3366
            $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
3367
        }
3368
        if ($search_type > 0) {
3369
            $sql .= " AND t.rowid=" . ((int) $search_type);
3370
        }
3371
        if ($search_filter == 'withoutsubscription') {
3372
            $sql .= " AND (datefin IS NULL)";
3373
        }
3374
        if ($search_filter == 'waitingsubscription') {
3375
            $sql .= " AND (datefin IS NULL AND t.subscription = '1')";
3376
        }
3377
        if ($search_filter == 'uptodate') {
3378
            $sql .= " AND (datefin >= '" . $db->idate($now) . "' OR (datefin IS NULL AND t.subscription = '0'))";
3379
        }
3380
        if ($search_filter == 'outofdate') {
3381
            $sql .= " AND (datefin < '" . $db->idate($now) . "')";
3382
        }
3383
        if ($search_status != '') {
3384
            // Peut valoir un nombre ou liste de nombre separates par virgules
3385
            $sql .= " AND d.statut in (" . $db->sanitize($db->escape($search_status)) . ")";
3386
        }
3387
        if ($search_morphy != '' && $search_morphy != '-1') {
3388
            $sql .= natural_search("d.morphy", $search_morphy);
3389
        }
3390
        if ($search_ref) {
3391
            $sql .= natural_search("d.ref", $search_ref);
3392
        }
3393
        if ($search_civility) {
3394
            $sql .= natural_search("d.civility", $search_civility);
3395
        }
3396
        if ($search_firstname) {
3397
            $sql .= natural_search("d.firstname", $search_firstname);
3398
        }
3399
        if ($search_lastname) {
3400
            $sql .= natural_search(["d.firstname", "d.lastname", "d.societe"], $search_lastname);
3401
        }
3402
        if ($search_gender != '' && $search_gender != '-1') {
3403
            $sql .= natural_search("d.gender", $search_gender);
3404
        }
3405
        if ($search_login) {
3406
            $sql .= natural_search("d.login", $search_login);
3407
        }
3408
        if ($search_company) {
3409
            $sql .= natural_search("s.nom", $search_company);
3410
        }
3411
        if ($search_email) {
3412
            $sql .= natural_search("d.email", $search_email);
3413
        }
3414
        if ($search_address) {
3415
            $sql .= natural_search("d.address", $search_address);
3416
        }
3417
        if ($search_town) {
3418
            $sql .= natural_search("d.town", $search_town);
3419
        }
3420
        if ($search_zip) {
3421
            $sql .= natural_search("d.zip", $search_zip);
3422
        }
3423
        if ($search_state) {
3424
            $sql .= natural_search("state.nom", $search_state);
3425
        }
3426
        if ($search_phone) {
3427
            $sql .= natural_search("d.phone", $search_phone);
3428
        }
3429
        if ($search_phone_perso) {
3430
            $sql .= natural_search("d.phone_perso", $search_phone_perso);
3431
        }
3432
        if ($search_phone_mobile) {
3433
            $sql .= natural_search("d.phone_mobile", $search_phone_mobile);
3434
        }
3435
        if ($search_country) {
3436
            $sql .= " AND d.country IN (" . $db->sanitize($search_country) . ')';
3437
        }
3438
        if ($search_import_key) {
3439
            $sql .= natural_search("d.import_key", $search_import_key);
3440
        }
3441
        if ($search_datec_start) {
3442
            $sql .= " AND d.datec >= '" . $db->idate($search_datec_start) . "'";
3443
        }
3444
        if ($search_datec_end) {
3445
            $sql .= " AND d.datec <= '" . $db->idate($search_datec_end) . "'";
3446
        }
3447
        if ($search_datem_start) {
3448
            $sql .= " AND d.tms >= '" . $db->idate($search_datem_start) . "'";
3449
        }
3450
        if ($search_datem_end) {
3451
            $sql .= " AND d.tms <= '" . $db->idate($search_datem_end) . "'";
3452
        }
3453
// Add where from extra fields
3454
        include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_sql.tpl.php';
3455
// Add where from hooks
3456
        $parameters = [];
3457
        $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
3458
        $sql .= $hookmanager->resPrint;
3459
3460
// Count total nb of records
3461
        $nbtotalofrecords = '';
3462
        if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
3463
            /* The fast and low memory method to get and count full list converts the sql into a sql count */
3464
            $sqlforcount = preg_replace('/^' . preg_quote($sqlfields, '/') . '/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
3465
            $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
3466
            $resql = $db->query($sqlforcount);
3467
            if ($resql) {
3468
                $objforcount = $db->fetch_object($resql);
3469
                $nbtotalofrecords = $objforcount->nbtotalofrecords;
3470
            } else {
3471
                dol_print_error($db);
3472
            }
3473
3474
            if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
3475
                $page = 0;
3476
                $offset = 0;
3477
            }
3478
            $db->free($resql);
3479
        }
3480
//print $sql;
3481
3482
// Complete request and execute it with limit
3483
        $sql .= $db->order($sortfield, $sortorder);
3484
        if ($limit) {
3485
            $sql .= $db->plimit($limit + 1, $offset);
3486
        }
3487
3488
        $resql = $db->query($sql);
3489
        if (!$resql) {
3490
            dol_print_error($db);
3491
            exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
3492
        }
3493
3494
        $num = $db->num_rows($resql);
3495
3496
3497
// Direct jump if only one record found
3498
        if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
3499
            $obj = $db->fetch_object($resql);
3500
            $id = $obj->rowid;
3501
            header("Location: " . DOL_URL_ROOT . '/adherents/card.php?id=' . $id);
3502
            exit;
3503
        }
3504
3505
// Output page
3506
// --------------------------------------------------------------------
3507
3508
        llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');   // Can use also classforhorizontalscrolloftabs instead of bodyforlist for no horizontal scroll
3509
3510
        $arrayofselected = is_array($toselect) ? $toselect : [];
3511
3512
3513
        if ($search_type > 0) {
3514
            $membertype = new AdherentType($db);
3515
            $result = $membertype->fetch($search_type);
3516
            $title .= " (" . $membertype->label . ")";
3517
        }
3518
3519
// $parameters
3520
        $param = '';
3521
        if (!empty($mode)) {
3522
            $param .= '&mode=' . urlencode($mode);
3523
        }
3524
        if (!empty($contextpage) && $contextpage != $_SERVER['PHP_SELF']) {
3525
            $param .= '&contextpage=' . urlencode($contextpage);
3526
        }
3527
        if ($limit > 0 && $limit != $conf->liste_limit) {
3528
            $param .= '&limit=' . ((int) $limit);
3529
        }
3530
        if ($optioncss != '') {
3531
            $param .= '&optioncss=' . urlencode($optioncss);
3532
        }
3533
        if ($search_all != "") {
3534
            $param .= "&search_all=" . urlencode($search_all);
3535
        }
3536
        if ($search_ref) {
3537
            $param .= "&search_ref=" . urlencode($search_ref);
3538
        }
3539
        if ($search_civility) {
3540
            $param .= "&search_civility=" . urlencode($search_civility);
3541
        }
3542
        if ($search_firstname) {
3543
            $param .= "&search_firstname=" . urlencode($search_firstname);
3544
        }
3545
        if ($search_lastname) {
3546
            $param .= "&search_lastname=" . urlencode($search_lastname);
3547
        }
3548
        if ($search_gender) {
3549
            $param .= "&search_gender=" . urlencode($search_gender);
3550
        }
3551
        if ($search_login) {
3552
            $param .= "&search_login=" . urlencode($search_login);
3553
        }
3554
        if ($search_email) {
3555
            $param .= "&search_email=" . urlencode($search_email);
3556
        }
3557
        if ($search_categ > 0 || $search_categ == -2) {
3558
            $param .= "&search_categ=" . urlencode((string) ($search_categ));
3559
        }
3560
        if ($search_company) {
3561
            $param .= "&search_company=" . urlencode($search_company);
3562
        }
3563
        if ($search_address != '') {
3564
            $param .= "&search_address=" . urlencode($search_address);
3565
        }
3566
        if ($search_town != '') {
3567
            $param .= "&search_town=" . urlencode($search_town);
3568
        }
3569
        if ($search_zip != '') {
3570
            $param .= "&search_zip=" . urlencode($search_zip);
3571
        }
3572
        if ($search_state != '') {
3573
            $param .= "&search_state=" . urlencode($search_state);
3574
        }
3575
        if ($search_country != '') {
3576
            $param .= "&search_country=" . urlencode($search_country);
3577
        }
3578
        if ($search_phone != '') {
3579
            $param .= "&search_phone=" . urlencode($search_phone);
3580
        }
3581
        if ($search_phone_perso != '') {
3582
            $param .= "&search_phone_perso=" . urlencode($search_phone_perso);
3583
        }
3584
        if ($search_phone_mobile != '') {
3585
            $param .= "&search_phone_mobile=" . urlencode($search_phone_mobile);
3586
        }
3587
        if ($search_filter && $search_filter != '-1') {
3588
            $param .= "&search_filter=" . urlencode($search_filter);
3589
        }
3590
        if ($search_status != "" && $search_status != -3) {
3591
            $param .= "&search_status=" . urlencode($search_status);
3592
        }
3593
        if ($search_import_key != '') {
3594
            $param .= '&search_import_key=' . urlencode($search_import_key);
3595
        }
3596
        if ($search_type > 0) {
3597
            $param .= "&search_type=" . urlencode($search_type);
3598
        }
3599
        if ($search_datec_start) {
3600
            $param .= '&search_datec_start_day=' . dol_print_date($search_datec_start, '%d') . '&search_datec_start_month=' . dol_print_date($search_datec_start, '%m') . '&search_datec_start_year=' . dol_print_date($search_datec_start, '%Y');
3601
        }
3602
        if ($search_datem_end) {
3603
            $param .= '&search_datem_end_day=' . dol_print_date($search_datem_end, '%d') . '&search_datem_end_month=' . dol_print_date($search_datem_end, '%m') . '&search_datem_end_year=' . dol_print_date($search_datem_end, '%Y');
3604
        }
3605
3606
// Add $param from extra fields
3607
        include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_param.tpl.php';
3608
3609
// List of mass actions available
3610
        $arrayofmassactions = [
3611
            //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
3612
            //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
3613
        ];
3614
        if ($user->hasRight('adherent', 'creer')) {
3615
            $arrayofmassactions['close'] = img_picto('', 'close_title', 'class="pictofixedwidth"') . $langs->trans("Resiliate");
3616
        }
3617
        if ($user->hasRight('adherent', 'supprimer')) {
3618
            $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"') . $langs->trans("Delete");
3619
        }
3620
        if (isModEnabled('category') && $user->hasRight('adherent', 'creer')) {
3621
            $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"') . $langs->trans("AffectTag");
3622
        }
3623
        if ($user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer')) {
3624
            $arrayofmassactions['createexternaluser'] = img_picto('', 'user', 'class="pictofixedwidth"') . $langs->trans("CreateExternalUser");
3625
        }
3626
        if ($user->hasRight('adherent', 'creer')) {
3627
            $arrayofmassactions['createsubscription'] = img_picto('', 'payment', 'class="pictofixedwidth"') . $langs->trans("CreateSubscription");
3628
        }
3629
        if (GETPOSTINT('nomassaction') || in_array($massaction, ['presend', 'predelete', 'preaffecttag'])) {
3630
            $arrayofmassactions = [];
3631
        }
3632
        $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
3633
3634
        print '<form method="POST" id="searchFormList" action="' . $_SERVER['PHP_SELF'] . '">' . "\n";
3635
        if ($optioncss != '') {
3636
            print '<input type="hidden" name="optioncss" value="' . $optioncss . '">';
3637
        }
3638
        print '<input type="hidden" name="token" value="' . newToken() . '">';
3639
        print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
3640
        print '<input type="hidden" name="action" value="list">';
3641
        print '<input type="hidden" name="sortfield" value="' . $sortfield . '">';
3642
        print '<input type="hidden" name="sortorder" value="' . $sortorder . '">';
3643
        print '<input type="hidden" name="page" value="' . $page . '">';
3644
        print '<input type="hidden" name="contextpage" value="' . $contextpage . '">';
3645
        print '<input type="hidden" name="page_y" value="">';
3646
        print '<input type="hidden" name="mode" value="' . $mode . '">';
3647
3648
3649
        $newcardbutton = '';
3650
        $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER['PHP_SELF'] . '?mode=common' . preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), ['morecss' => 'reposition']);
3651
        $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER['PHP_SELF'] . '?mode=kanban' . preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), ['morecss' => 'reposition']);
3652
        if ($user->hasRight('adherent', 'creer')) {
3653
            $newcardbutton .= dolGetButtonTitleSeparator();
3654
            $newcardbutton .= dolGetButtonTitle($langs->trans('NewMember'), '', 'fa fa-plus-circle', DOL_URL_ROOT . '/adherents/card.php?action=create');
3655
        }
3656
3657
        print_barre_liste($title, $page, $_SERVER['PHP_SELF'], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
3658
3659
        $topicmail = "Information";
3660
        $modelmail = "member";
3661
        $objecttmp = new Adherent($db);
3662
        $trackid = 'mem' . $object->id;
3663
        if ($massaction == 'createsubscription') {
3664
            $tmpmember = new Adherent($db);
3665
            $adht = new AdherentType($db);
3666
            $amount = 0;
3667
            foreach ($toselect as $id) {
3668
                $now = dol_now();
3669
                $tmpmember->fetch($id);
3670
                $res = $adht->fetch($tmpmember->typeid);
3671
                if ($res > 0) {
3672
                    $amounttmp = $adht->amount;
3673
                    if (!empty($tmpmember->last_subscription_amount) && !GETPOSTISSET('newamount') && is_numeric($amounttmp)) {
3674
                        $amounttmp = max($tmpmember->last_subscription_amount, $amount);
3675
                    }
3676
                    $amount = max(0, $amounttmp, $amount);
3677
                } else {
3678
                    $error++;
3679
                }
3680
            }
3681
3682
            $date = dol_print_date(dol_now(), "%d/%m/%Y");
3683
            $formquestion = [
3684
                ['label' => $langs->trans("DateSubscription"), 'type' => 'other', 'value' => $date],
3685
                ['label' => $langs->trans("Amount"), 'type' => 'text', 'value' => price($amount, 0, '', 0), 'name' => 'amount'],
3686
                ['type' => 'separator'],
3687
                ['label' => $langs->trans("MoreActions"), 'type' => 'other', 'value' => $langs->trans("None") . ' ' . img_warning($langs->trans("WarningNoComplementaryActionDone"))],
3688
            ];
3689
            print $form->formconfirm($_SERVER['PHP_SELF'], $langs->trans("ConfirmMassSubsriptionCreation"), $langs->trans("ConfirmMassSubsriptionCreationQuestion", count($toselect)), "createsubscription_confirm", $formquestion, '', 0, 200, 500, 1);
3690
        }
3691
        include DOL_DOCUMENT_ROOT . '/core/tpl/massactions_pre.tpl.php';
3692
3693
        if ($search_all) {
3694
            $setupstring = '';
3695
            foreach ($fieldstosearchall as $key => $val) {
3696
                $fieldstosearchall[$key] = $langs->trans($val);
3697
                $setupstring .= $key . "=" . $val . ";";
3698
            }
3699
            print '<!-- Search done like if MYOBJECT_QUICKSEARCH_ON_FIELDS = ' . $setupstring . ' -->' . "\n";
3700
            print '<div class="divsearchfieldfilter">' . $langs->trans("FilterOnInto", $search_all) . implode(', ', $fieldstosearchall) . '</div>' . "\n";
3701
        }
3702
3703
        $varpage = empty($contextpage) ? $_SERVER['PHP_SELF'] : $contextpage;
3704
        $selectedfields = ($mode != 'kanban' ? $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) : ''); // This also change content of $arrayfields
3705
        $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
3706
3707
        $moreforfilter = '';
3708
// Filter on categories
3709
        if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
3710
            require_once BASE_PATH . '/categories/class/categorie.class.php';
3711
            $moreforfilter .= '<div class="divsearchfield">';
3712
            $moreforfilter .= img_picto($langs->trans('Categories'), 'category', 'class="pictofixedwidth"') . $formother->select_categories(Categorie::TYPE_MEMBER, $search_categ, 'search_categ', 1, $langs->trans("MembersCategoriesShort"));
3713
            $moreforfilter .= '</div>';
3714
        }
3715
        $parameters = [
3716
            'arrayfields' => &$arrayfields,
3717
        ];
3718
        $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
3719
        if (empty($reshook)) {
3720
            $moreforfilter .= $hookmanager->resPrint;
3721
        } else {
3722
            $moreforfilter = $hookmanager->resPrint;
3723
        }
3724
        if (!empty($moreforfilter)) {
3725
            print '<div class="liste_titre liste_titre_bydiv centpercent">';
3726
            print $moreforfilter;
3727
            $parameters = [];
3728
            $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
3729
            print $hookmanager->resPrint;
3730
            print '</div>';
3731
        }
3732
3733
        print '<div class="div-table-responsive">';
3734
        print '<table class="tagtable nobottomiftotal liste' . ($moreforfilter ? " listwithfilterbefore" : "") . '">' . "\n";
3735
3736
// Fields title search
3737
// --------------------------------------------------------------------
3738
        print '<tr class="liste_titre_filter">';
3739
3740
// Action column
3741
        if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
3742
            print '<td class="liste_titre center maxwidthsearch">';
3743
            $searchpicto = $form->showFilterButtons('left');
3744
            print $searchpicto;
3745
            print '</td>';
3746
        }
3747
3748
// Line numbering
3749
        if (getDolGlobalString('MAIN_SHOW_TECHNICAL_ID')) {
3750
            print '<td class="liste_titre">&nbsp;</td>';
3751
        }
3752
3753
// Ref
3754
        if (!empty($arrayfields['d.ref']['checked'])) {
3755
            print '<td class="liste_titre">';
3756
            print '<input type="text" class="flat maxwidth75imp" name="search_ref" value="' . dol_escape_htmltag($search_ref) . '">';
3757
            print '</td>';
3758
        }
3759
3760
// Civility
3761
        if (!empty($arrayfields['d.civility']['checked'])) {
3762
            print '<td class="liste_titre left">';
3763
            print '<input class="flat maxwidth50imp" type="text" name="search_civility" value="' . dol_escape_htmltag($search_civility) . '"></td>';
3764
        }
3765
3766
// First Name
3767
        if (!empty($arrayfields['d.firstname']['checked'])) {
3768
            print '<td class="liste_titre left">';
3769
            print '<input class="flat maxwidth75imp" type="text" name="search_firstname" value="' . dol_escape_htmltag($search_firstname) . '"></td>';
3770
        }
3771
3772
// Last Name
3773
        if (!empty($arrayfields['d.lastname']['checked'])) {
3774
            print '<td class="liste_titre left">';
3775
            print '<input class="flat maxwidth75imp" type="text" name="search_lastname" value="' . dol_escape_htmltag($search_lastname) . '"></td>';
3776
        }
3777
3778
// Gender
3779
        if (!empty($arrayfields['d.gender']['checked'])) {
3780
            print '<td class="liste_titre">';
3781
            $arraygender = ['man' => $langs->trans("Genderman"), 'woman' => $langs->trans("Genderwoman"), 'other' => $langs->trans("Genderother")];
3782
            print $form->selectarray('search_gender', $arraygender, $search_gender, 1);
3783
            print '</td>';
3784
        }
3785
3786
// Company
3787
        if (!empty($arrayfields['d.company']['checked'])) {
3788
            print '<td class="liste_titre left">';
3789
            print '<input class="flat maxwidth75imp" type="text" name="search_company" value="' . dol_escape_htmltag($search_company) . '"></td>';
3790
        }
3791
3792
// Login
3793
        if (!empty($arrayfields['d.login']['checked'])) {
3794
            print '<td class="liste_titre left">';
3795
            print '<input class="flat maxwidth75imp" type="text" name="search_login" value="' . dol_escape_htmltag($search_login) . '"></td>';
3796
        }
3797
3798
// Nature
3799
        if (!empty($arrayfields['d.morphy']['checked'])) {
3800
            print '<td class="liste_titre center">';
3801
            $arraymorphy = ['mor' => $langs->trans("Moral"), 'phy' => $langs->trans("Physical")];
3802
            print $form->selectarray('search_morphy', $arraymorphy, $search_morphy, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100');
3803
            print '</td>';
3804
        }
3805
3806
// Member Type
3807
        if (!empty($arrayfields['t.libelle']['checked'])) {
3808
            print '</td>';
3809
        }
3810
        if (!empty($arrayfields['t.libelle']['checked'])) {
3811
            print '<td class="liste_titre">';
3812
            $listetype = $membertypestatic->liste_array();
3813
            // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
3814
            print $form->selectarray("search_type", $listetype, $search_type, 1, 0, 0, '', 0, 32);
3815
            print '</td>';
3816
        }
3817
3818
// Address - Street
3819
        if (!empty($arrayfields['d.address']['checked'])) {
3820
            print '<td class="liste_titre left">';
3821
            print '<input class="flat maxwidth75imp" type="text" name="search_address" value="' . dol_escape_htmltag($search_address) . '"></td>';
3822
        }
3823
3824
// ZIP
3825
        if (!empty($arrayfields['d.zip']['checked'])) {
3826
            print '<td class="liste_titre left">';
3827
            print '<input class="flat maxwidth50imp" type="text" name="search_zip" value="' . dol_escape_htmltag($search_zip) . '"></td>';
3828
        }
3829
3830
// Town/City
3831
        if (!empty($arrayfields['d.town']['checked'])) {
3832
            print '<td class="liste_titre left">';
3833
            print '<input class="flat maxwidth75imp" type="text" name="search_town" value="' . dol_escape_htmltag($search_town) . '"></td>';
3834
        }
3835
3836
// State / County / Departement
3837
        if (!empty($arrayfields['state.nom']['checked'])) {
3838
            print '<td class="liste_titre">';
3839
            print '<input class="flat searchstring maxwidth75imp" type="text" name="search_state" value="' . dol_escape_htmltag($search_state) . '">';
3840
            print '</td>';
3841
        }
3842
3843
// Country
3844
        if (!empty($arrayfields['country.code_iso']['checked'])) {
3845
            print '<td class="liste_titre center">';
3846
            print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
3847
            print '</td>';
3848
        }
3849
3850
// Phone pro
3851
        if (!empty($arrayfields['d.phone']['checked'])) {
3852
            print '<td class="liste_titre left">';
3853
            print '<input class="flat maxwidth75imp" type="text" name="search_phone" value="' . dol_escape_htmltag($search_phone) . '"></td>';
3854
        }
3855
3856
// Phone perso
3857
        if (!empty($arrayfields['d.phone_perso']['checked'])) {
3858
            print '<td class="liste_titre left">';
3859
            print '<input class="flat maxwidth75imp" type="text" name="search_phone_perso" value="' . dol_escape_htmltag($search_phone_perso) . '"></td>';
3860
        }
3861
3862
// Phone mobile
3863
        if (!empty($arrayfields['d.phone_mobile']['checked'])) {
3864
            print '<td class="liste_titre left">';
3865
            print '<input class="flat maxwidth75imp" type="text" name="search_phone_mobile" value="' . dol_escape_htmltag($search_phone_mobile) . '"></td>';
3866
        }
3867
3868
// Email
3869
        if (!empty($arrayfields['d.email']['checked'])) {
3870
            print '<td class="liste_titre left">';
3871
            print '<input class="flat maxwidth75imp" type="text" name="search_email" value="' . dol_escape_htmltag($search_email) . '"></td>';
3872
        }
3873
3874
// End of subscription date
3875
        if (!empty($arrayfields['d.datefin']['checked'])) {
3876
            print '<td class="liste_titre center">';
3877
            //$selectarray = array('-1'=>'', 'withoutsubscription'=>$langs->trans("WithoutSubscription"), 'uptodate'=>$langs->trans("UpToDate"), 'outofdate'=>$langs->trans("OutOfDate"));
3878
            $selectarray = ['-1' => '', 'waitingsubscription' => $langs->trans("WaitingSubscription"), 'uptodate' => $langs->trans("UpToDate"), 'outofdate' => $langs->trans("OutOfDate")];
3879
            print $form->selectarray('search_filter', $selectarray, $search_filter);
3880
            print '</td>';
3881
        }
3882
3883
// Extra fields
3884
        include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_input.tpl.php';
3885
3886
// Fields from hook
3887
        $parameters = ['arrayfields' => $arrayfields];
3888
        $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
3889
        print $hookmanager->resPrint;
3890
3891
// Date creation
3892
        if (!empty($arrayfields['d.datec']['checked'])) {
3893
            print '<td class="liste_titre">';
3894
            print '<div class="nowrapfordate">';
3895
            print $form->selectDate($search_datec_start ? $search_datec_start : -1, 'search_datec_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
3896
            print '</div>';
3897
            print '<div class="nowrapfordate">';
3898
            print $form->selectDate($search_datec_end ? $search_datec_end : -1, 'search_datec_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
3899
            print '</div>';
3900
            print '</td>';
3901
        }
3902
3903
// Birthday
3904
        if (!empty($arrayfields['d.birth']['checked'])) {
3905
            print '<td class="liste_titre">';
3906
            print '</td>';
3907
        }
3908
3909
// Date modification
3910
        if (!empty($arrayfields['d.tms']['checked'])) {
3911
            print '<td class="liste_titre">';
3912
            print '<div class="nowrapfordate">';
3913
            print $form->selectDate($search_datem_start ? $search_datem_start : -1, 'search_datem_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
3914
            print '</div>';
3915
            print '<div class="nowrapfordate">';
3916
            print $form->selectDate($search_datem_end ? $search_datem_end : -1, 'search_datem_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
3917
            print '</div>';
3918
            print '</td>';
3919
        }
3920
3921
// Import Key
3922
        if (!empty($arrayfields['d.import_key']['checked'])) {
3923
            print '<td class="liste_titre center">';
3924
            print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="' . dol_escape_htmltag($search_import_key) . '">';
3925
            print '</td>';
3926
        }
3927
3928
// Status
3929
        if (!empty($arrayfields['d.statut']['checked'])) {
3930
            print '<td class="liste_titre center parentonrightofpage">';
3931
            $liststatus = [
3932
                Adherent::STATUS_DRAFT => $langs->trans("Draft"),
3933
                Adherent::STATUS_VALIDATED => $langs->trans("Validated"),
3934
                Adherent::STATUS_RESILIATED => $langs->trans("MemberStatusResiliatedShort"),
3935
                Adherent::STATUS_EXCLUDED => $langs->trans("MemberStatusExcludedShort"),
3936
            ];
3937
            // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
3938
            print $form->selectarray('search_status', $liststatus, $search_status, -3, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
3939
            print '</td>';
3940
        }
3941
3942
// Action column
3943
        if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
3944
            print '<td class="liste_titre center maxwidthsearch">';
3945
            $searchpicto = $form->showFilterButtons();
3946
            print $searchpicto;
3947
            print '</td>';
3948
        }
3949
        print '</tr>' . "\n";
3950
3951
        $totalarray = [];
3952
        $totalarray['nbfield'] = 0;
3953
3954
// Fields title label
3955
// --------------------------------------------------------------------
3956
        print '<tr class="liste_titre">';
3957
// Action column
3958
        if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
3959
            print_liste_field_titre($selectedfields, $_SERVER['PHP_SELF'], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');
3960
            $totalarray['nbfield']++;
3961
        }
3962
        if (getDolGlobalString('MAIN_SHOW_TECHNICAL_ID')) {
3963
            print_liste_field_titre("ID", $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'center ');
3964
            $totalarray['nbfield']++;
3965
        }
3966
        if (!empty($arrayfields['d.ref']['checked'])) {
3967
            print_liste_field_titre($arrayfields['d.ref']['label'], $_SERVER['PHP_SELF'], 'd.ref', '', $param, '', $sortfield, $sortorder);
3968
            $totalarray['nbfield']++;
3969
        }
3970
        if (!empty($arrayfields['d.civility']['checked'])) {
3971
            print_liste_field_titre($arrayfields['d.civility']['label'], $_SERVER['PHP_SELF'], 'd.civility', '', $param, '', $sortfield, $sortorder);
3972
            $totalarray['nbfield']++;
3973
        }
3974
        if (!empty($arrayfields['d.firstname']['checked'])) {
3975
            print_liste_field_titre($arrayfields['d.firstname']['label'], $_SERVER['PHP_SELF'], 'd.firstname', '', $param, '', $sortfield, $sortorder);
3976
            $totalarray['nbfield']++;
3977
        }
3978
        if (!empty($arrayfields['d.lastname']['checked'])) {
3979
            print_liste_field_titre($arrayfields['d.lastname']['label'], $_SERVER['PHP_SELF'], 'd.lastname', '', $param, '', $sortfield, $sortorder);
3980
            $totalarray['nbfield']++;
3981
        }
3982
        if (!empty($arrayfields['d.gender']['checked'])) {
3983
            print_liste_field_titre($arrayfields['d.gender']['label'], $_SERVER['PHP_SELF'], 'd.gender', $param, "", "", $sortfield, $sortorder);
3984
            $totalarray['nbfield']++;
3985
        }
3986
        if (!empty($arrayfields['d.company']['checked'])) {
3987
            print_liste_field_titre($arrayfields['d.company']['label'], $_SERVER['PHP_SELF'], 'companyname', '', $param, '', $sortfield, $sortorder);
3988
            $totalarray['nbfield']++;
3989
        }
3990
        if (!empty($arrayfields['d.login']['checked'])) {
3991
            print_liste_field_titre($arrayfields['d.login']['label'], $_SERVER['PHP_SELF'], 'd.login', '', $param, '', $sortfield, $sortorder);
3992
            $totalarray['nbfield']++;
3993
        }
3994
        if (!empty($arrayfields['d.morphy']['checked'])) {
3995
            print_liste_field_titre($arrayfields['d.morphy']['label'], $_SERVER['PHP_SELF'], 'd.morphy', '', $param, '', $sortfield, $sortorder);
3996
            $totalarray['nbfield']++;
3997
        }
3998
        if (!empty($arrayfields['t.libelle']['checked'])) {
3999
            print_liste_field_titre($arrayfields['t.libelle']['label'], $_SERVER['PHP_SELF'], 't.libelle', '', $param, '', $sortfield, $sortorder);
4000
            $totalarray['nbfield']++;
4001
        }
4002
        if (!empty($arrayfields['d.address']['checked'])) {
4003
            print_liste_field_titre($arrayfields['d.address']['label'], $_SERVER['PHP_SELF'], 'd.address', '', $param, '', $sortfield, $sortorder);
4004
            $totalarray['nbfield']++;
4005
        }
4006
        if (!empty($arrayfields['d.zip']['checked'])) {
4007
            print_liste_field_titre($arrayfields['d.zip']['label'], $_SERVER['PHP_SELF'], 'd.zip', '', $param, '', $sortfield, $sortorder);
4008
            $totalarray['nbfield']++;
4009
        }
4010
        if (!empty($arrayfields['d.town']['checked'])) {
4011
            print_liste_field_titre($arrayfields['d.town']['label'], $_SERVER['PHP_SELF'], 'd.town', '', $param, '', $sortfield, $sortorder);
4012
            $totalarray['nbfield']++;
4013
        }
4014
        if (!empty($arrayfields['state.nom']['checked'])) {
4015
            print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER['PHP_SELF'], "state.nom", "", $param, '', $sortfield, $sortorder);
4016
            $totalarray['nbfield']++;
4017
        }
4018
        if (!empty($arrayfields['country.code_iso']['checked'])) {
4019
            print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER['PHP_SELF'], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
4020
            $totalarray['nbfield']++;
4021
        }
4022
        if (!empty($arrayfields['d.phone']['checked'])) {
4023
            print_liste_field_titre($arrayfields['d.phone']['label'], $_SERVER['PHP_SELF'], 'd.phone', '', $param, '', $sortfield, $sortorder);
4024
            $totalarray['nbfield']++;
4025
        }
4026
        if (!empty($arrayfields['d.phone_perso']['checked'])) {
4027
            print_liste_field_titre($arrayfields['d.phone_perso']['label'], $_SERVER['PHP_SELF'], 'd.phone_perso', '', $param, '', $sortfield, $sortorder);
4028
            $totalarray['nbfield']++;
4029
        }
4030
        if (!empty($arrayfields['d.phone_mobile']['checked'])) {
4031
            print_liste_field_titre($arrayfields['d.phone_mobile']['label'], $_SERVER['PHP_SELF'], 'd.phone_mobile', '', $param, '', $sortfield, $sortorder);
4032
            $totalarray['nbfield']++;
4033
        }
4034
        if (!empty($arrayfields['d.email']['checked'])) {
4035
            print_liste_field_titre($arrayfields['d.email']['label'], $_SERVER['PHP_SELF'], 'd.email', '', $param, '', $sortfield, $sortorder);
4036
            $totalarray['nbfield']++;
4037
        }
4038
        if (!empty($arrayfields['d.datefin']['checked'])) {
4039
            print_liste_field_titre($arrayfields['d.datefin']['label'], $_SERVER['PHP_SELF'], 'd.datefin,t.subscription', '', $param, '', $sortfield, $sortorder, 'center ');
4040
            $totalarray['nbfield']++;
4041
        }
4042
// Extra fields
4043
        include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_title.tpl.php';
4044
4045
// Hook fields
4046
        $parameters = ['arrayfields' => $arrayfields, 'totalarray' => &$totalarray, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder];
4047
        $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
4048
        print $hookmanager->resPrint;
4049
4050
        if (!empty($arrayfields['d.datec']['checked'])) {
4051
            print_liste_field_titre($arrayfields['d.datec']['label'], $_SERVER['PHP_SELF'], "d.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
4052
            $totalarray['nbfield']++;
4053
        }
4054
        if (!empty($arrayfields['d.birth']['checked'])) {
4055
            print_liste_field_titre($arrayfields['d.birth']['label'], $_SERVER['PHP_SELF'], "d.birth", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
4056
            $totalarray['nbfield']++;
4057
        }
4058
        if (!empty($arrayfields['d.tms']['checked'])) {
4059
            print_liste_field_titre($arrayfields['d.tms']['label'], $_SERVER['PHP_SELF'], "d.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
4060
            $totalarray['nbfield']++;
4061
        }
4062
        if (!empty($arrayfields['d.import_key']['checked'])) {
4063
            print_liste_field_titre($arrayfields['d.import_key']['label'], $_SERVER['PHP_SELF'], "d.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
4064
            $totalarray['nbfield']++;
4065
        }
4066
        if (!empty($arrayfields['d.statut']['checked'])) {
4067
            print_liste_field_titre($arrayfields['d.statut']['label'], $_SERVER['PHP_SELF'], "d.statut,t.subscription,d.datefin", "", $param, '', $sortfield, $sortorder, 'center ');
4068
            $totalarray['nbfield']++;
4069
        }
4070
        if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
4071
            print_liste_field_titre($selectedfields, $_SERVER['PHP_SELF'], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
4072
            $totalarray['nbfield']++;
4073
        }
4074
        print "</tr>\n";
4075
4076
// Loop on record
4077
// --------------------------------------------------------------------
4078
        $i = 0;
4079
        $savnbfield = $totalarray['nbfield'];
4080
        $totalarray = [];
4081
        $totalarray['nbfield'] = 0;
4082
        $imaxinloop = ($limit ? min($num, $limit) : $num);
4083
        while ($i < $imaxinloop) {
4084
            $obj = $db->fetch_object($resql);
4085
            if (empty($obj)) {
4086
                break; // Should not happen
4087
            }
4088
4089
            $datefin = $db->jdate($obj->datefin);
4090
4091
            $memberstatic->id = $obj->rowid;
4092
            $memberstatic->ref = $obj->ref;
4093
            $memberstatic->civility_id = $obj->civility;
4094
            $memberstatic->login = $obj->login;
4095
            $memberstatic->lastname = $obj->lastname;
4096
            $memberstatic->firstname = $obj->firstname;
4097
            $memberstatic->gender = $obj->gender;
4098
            $memberstatic->statut = $obj->status;
4099
            $memberstatic->status = $obj->status;
4100
            $memberstatic->datefin = $datefin;
4101
            $memberstatic->socid = $obj->fk_soc;
4102
            $memberstatic->photo = $obj->photo;
4103
            $memberstatic->email = $obj->email;
4104
            $memberstatic->morphy = $obj->morphy;
4105
            $memberstatic->note_public = $obj->note_public;
4106
            $memberstatic->note_private = $obj->note_private;
4107
            $memberstatic->need_subscription = $obj->subscription;
4108
4109
            if (!empty($obj->fk_soc)) {
4110
                $memberstatic->fetch_thirdparty();
4111
                if ($memberstatic->thirdparty->id > 0) {
4112
                    $companyname = $memberstatic->thirdparty->name;
4113
                    $companynametoshow = $memberstatic->thirdparty->getNomUrl(1);
4114
                }
4115
            } else {
4116
                $companyname = $obj->company;
4117
                $companynametoshow = $obj->company;
4118
            }
4119
            $memberstatic->company = $companyname;
4120
4121
            $object = $memberstatic;
4122
4123
            if ($mode == 'kanban') {
4124
                if ($i == 0) {
4125
                    print '<tr class="trkanban"><td colspan="' . $savnbfield . '">';
4126
                    print '<div class="box-flex-container kanban">';
4127
                }
4128
                $membertypestatic->id = $obj->type_id;
4129
                $membertypestatic->label = $obj->type;
4130
                $memberstatic->type = $membertypestatic->label;
4131
                $memberstatic->photo = $obj->photo;
4132
                // Output Kanban
4133
                print $memberstatic->getKanbanView('', ['selected' => in_array($object->id, $arrayofselected)]);
4134
                if ($i == (min($num, $limit) - 1)) {
4135
                    print '</div>';
4136
                    print '</td></tr>';
4137
                }
4138
            } else {
4139
                // Show line of result
4140
                $j = 0;
4141
                print '<tr data-rowid="' . $object->id . '" class="oddeven">';
4142
4143
                // Action column
4144
                if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
4145
                    print '<td class="nowrap center">';
4146
                    if ($massactionbutton || $massaction) {   // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
4147
                        $selected = 0;
4148
                        if (in_array($obj->rowid, $arrayofselected)) {
4149
                            $selected = 1;
4150
                        }
4151
                        print '<input id="cb' . $obj->rowid . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $obj->rowid . '"' . ($selected ? ' checked="checked"' : '') . '>';
4152
                    }
4153
                    print '</td>';
4154
                    if (!$i) {
4155
                        $totalarray['nbfield']++;
4156
                    }
4157
                }
4158
                // Technical ID
4159
                if (getDolGlobalString('MAIN_SHOW_TECHNICAL_ID')) {
4160
                    print '<td class="center" data-key="id">' . $obj->rowid . '</td>';
4161
                    if (!$i) {
4162
                        $totalarray['nbfield']++;
4163
                    }
4164
                }
4165
                // Ref
4166
                if (!empty($arrayfields['d.ref']['checked'])) {
4167
                    print "<td>";
4168
                    print $memberstatic->getNomUrl(-1, 0, 'card', 'ref', '', -1, 0, 1);
4169
                    print "</td>\n";
4170
                    if (!$i) {
4171
                        $totalarray['nbfield']++;
4172
                    }
4173
                }
4174
                // Civility
4175
                if (!empty($arrayfields['d.civility']['checked'])) {
4176
                    print "<td>";
4177
                    print $obj->civility;
4178
                    print "</td>\n";
4179
                    if (!$i) {
4180
                        $totalarray['nbfield']++;
4181
                    }
4182
                }
4183
                // Firstname
4184
                if (!empty($arrayfields['d.firstname']['checked'])) {
4185
                    print '<td class="tdoverflowmax150" title="' . dol_escape_htmltag($obj->firstname) . '">';
4186
                    print $memberstatic->getNomUrl(0, 0, 'card', 'firstname');
4187
                    //print $obj->firstname;
4188
                    print "</td>\n";
4189
                    if (!$i) {
4190
                        $totalarray['nbfield']++;
4191
                    }
4192
                }
4193
                // Lastname
4194
                if (!empty($arrayfields['d.lastname']['checked'])) {
4195
                    print '<td class="tdoverflowmax150" title="' . dol_escape_htmltag($obj->lastname) . '">';
4196
                    print $memberstatic->getNomUrl(0, 0, 'card', 'lastname');
4197
                    //print $obj->lastname;
4198
                    print "</td>\n";
4199
                    if (!$i) {
4200
                        $totalarray['nbfield']++;
4201
                    }
4202
                }
4203
                // Gender
4204
                if (!empty($arrayfields['d.gender']['checked'])) {
4205
                    print '<td>';
4206
                    if ($obj->gender) {
4207
                        print $langs->trans("Gender" . $obj->gender);
4208
                    }
4209
                    print '</td>';
4210
                    if (!$i) {
4211
                        $totalarray['nbfield']++;
4212
                    }
4213
                }
4214
                // Company
4215
                if (!empty($arrayfields['d.company']['checked'])) {
4216
                    print '<td class="tdoverflowmax150" title="' . dol_escape_htmltag($companyname) . '">';
4217
                    print $companynametoshow;
4218
                    print "</td>\n";
4219
                }
4220
                // Login
4221
                if (!empty($arrayfields['d.login']['checked'])) {
4222
                    print '<td class="tdoverflowmax150" title="' . dol_escape_htmltag($obj->login) . '">' . $obj->login . "</td>\n";
4223
                    if (!$i) {
4224
                        $totalarray['nbfield']++;
4225
                    }
4226
                }
4227
                // Nature (Moral/Physical)
4228
                if (!empty($arrayfields['d.morphy']['checked'])) {
4229
                    print '<td class="center">';
4230
                    print $memberstatic->getmorphylib('', 2);
4231
                    print "</td>\n";
4232
                    if (!$i) {
4233
                        $totalarray['nbfield']++;
4234
                    }
4235
                }
4236
                // Type label
4237
                if (!empty($arrayfields['t.libelle']['checked'])) {
4238
                    $membertypestatic->id = $obj->type_id;
4239
                    $membertypestatic->label = $obj->type;
4240
                    print '<td class="nowraponall">';
4241
                    print $membertypestatic->getNomUrl(1, 32);
4242
                    print '</td>';
4243
                    if (!$i) {
4244
                        $totalarray['nbfield']++;
4245
                    }
4246
                }
4247
                // Address
4248
                if (!empty($arrayfields['d.address']['checked'])) {
4249
                    print '<td class="nocellnopadd tdoverflowmax200" title="' . dol_escape_htmltag($obj->address) . '">';
4250
                    print $obj->address;
4251
                    print '</td>';
4252
                    if (!$i) {
4253
                        $totalarray['nbfield']++;
4254
                    }
4255
                }
4256
                // Zip
4257
                if (!empty($arrayfields['d.zip']['checked'])) {
4258
                    print '<td class="nocellnopadd">';
4259
                    print $obj->zip;
4260
                    print '</td>';
4261
                    if (!$i) {
4262
                        $totalarray['nbfield']++;
4263
                    }
4264
                }
4265
                // Town
4266
                if (!empty($arrayfields['d.town']['checked'])) {
4267
                    print '<td class="nocellnopadd">';
4268
                    print $obj->town;
4269
                    print '</td>';
4270
                    if (!$i) {
4271
                        $totalarray['nbfield']++;
4272
                    }
4273
                }
4274
                // State / County / Departement
4275
                if (!empty($arrayfields['state.nom']['checked'])) {
4276
                    print "<td>" . $obj->state_name . "</td>\n";
4277
                    if (!$i) {
4278
                        $totalarray['nbfield']++;
4279
                    }
4280
                }
4281
                // Country
4282
                if (!empty($arrayfields['country.code_iso']['checked'])) {
4283
                    $tmparray = getCountry($obj->country, 'all');
4284
                    print '<td class="center tdoverflowmax100" title="' . dol_escape_htmltag($tmparray['label']) . '">';
4285
                    print dol_escape_htmltag($tmparray['label']);
4286
                    print '</td>';
4287
                    if (!$i) {
4288
                        $totalarray['nbfield']++;
4289
                    }
4290
                }
4291
                // Phone pro
4292
                if (!empty($arrayfields['d.phone']['checked'])) {
4293
                    print '<td class="nocellnopadd">';
4294
                    print $obj->phone;
4295
                    print '</td>';
4296
                    if (!$i) {
4297
                        $totalarray['nbfield']++;
4298
                    }
4299
                }
4300
                // Phone perso
4301
                if (!empty($arrayfields['d.phone_perso']['checked'])) {
4302
                    print '<td class="nocellnopadd">';
4303
                    print $obj->phone_perso;
4304
                    print '</td>';
4305
                    if (!$i) {
4306
                        $totalarray['nbfield']++;
4307
                    }
4308
                }
4309
                // Phone mobile
4310
                if (!empty($arrayfields['d.phone_mobile']['checked'])) {
4311
                    print '<td class="nocellnopadd">';
4312
                    print $obj->phone_mobile;
4313
                    print '</td>';
4314
                    if (!$i) {
4315
                        $totalarray['nbfield']++;
4316
                    }
4317
                }
4318
                // EMail
4319
                if (!empty($arrayfields['d.email']['checked'])) {
4320
                    print '<td class="tdoverflowmax150" title="' . dol_escape_htmltag($obj->email) . '">';
4321
                    print dol_print_email($obj->email, 0, 0, 1, 64, 1, 1);
4322
                    print "</td>\n";
4323
                    if (!$i) {
4324
                        $totalarray['nbfield']++;
4325
                    }
4326
                }
4327
                // End of subscription date
4328
                $datefin = $db->jdate($obj->datefin);
4329
                if (!empty($arrayfields['d.datefin']['checked'])) {
4330
                    print '<td class="nowraponall center">';
4331
                    if ($datefin) {
4332
                        print dol_print_date($datefin, 'day');
4333
                        if ($memberstatic->hasDelay()) {
4334
                            $textlate = ' (' . $langs->trans("DateReference") . ' > ' . $langs->trans("DateToday") . ' ' . (ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24) >= 0 ? '+' : '') . ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24) . ' ' . $langs->trans("days") . ')';
4335
                            print " " . img_warning($langs->trans("SubscriptionLate") . $textlate);
4336
                        }
4337
                    } else {
4338
                        if (!empty($obj->subscription)) {
4339
                            print '<span class="opacitymedium">' . $langs->trans("SubscriptionNotReceived") . '</span>';
4340
                            if ($obj->status > 0) {
4341
                                print " " . img_warning();
4342
                            }
4343
                        } else {
4344
                            print '&nbsp;';
4345
                        }
4346
                    }
4347
                    print '</td>';
4348
                    if (!$i) {
4349
                        $totalarray['nbfield']++;
4350
                    }
4351
                }
4352
                // Extra fields
4353
                include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_print_fields.tpl.php';
4354
                // Fields from hook
4355
                $parameters = ['arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray];
4356
                $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
4357
                print $hookmanager->resPrint;
4358
                // Date creation
4359
                if (!empty($arrayfields['d.datec']['checked'])) {
4360
                    print '<td class="nowrap center">';
4361
                    print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
4362
                    print '</td>';
4363
                    if (!$i) {
4364
                        $totalarray['nbfield']++;
4365
                    }
4366
                }
4367
                // Birth
4368
                if (!empty($arrayfields['d.birth']['checked'])) {
4369
                    print '<td class="nowrap center">';
4370
                    print dol_print_date($db->jdate($obj->birth), 'day', 'tzuser');
4371
                    print '</td>';
4372
                    if (!$i) {
4373
                        $totalarray['nbfield']++;
4374
                    }
4375
                }
4376
                // Date modification
4377
                if (!empty($arrayfields['d.tms']['checked'])) {
4378
                    print '<td class="nowrap center">';
4379
                    print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
4380
                    print '</td>';
4381
                    if (!$i) {
4382
                        $totalarray['nbfield']++;
4383
                    }
4384
                }
4385
                // Import key
4386
                if (!empty($arrayfields['d.import_key']['checked'])) {
4387
                    print '<td class="tdoverflowmax100 center" title="' . dol_escape_htmltag($obj->import_key) . '">';
4388
                    print dol_escape_htmltag($obj->import_key);
4389
                    print "</td>\n";
4390
                    if (!$i) {
4391
                        $totalarray['nbfield']++;
4392
                    }
4393
                }
4394
                // Status
4395
                if (!empty($arrayfields['d.statut']['checked'])) {
4396
                    print '<td class="nowrap center">';
4397
                    print $memberstatic->LibStatut($obj->status, $obj->subscription, $datefin, 5);
4398
                    print '</td>';
4399
                    if (!$i) {
4400
                        $totalarray['nbfield']++;
4401
                    }
4402
                }
4403
                // Action column
4404
                if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
4405
                    print '<td class="center">';
4406
                    if ($massactionbutton || $massaction) {   // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
4407
                        $selected = 0;
4408
                        if (in_array($obj->rowid, $arrayofselected)) {
4409
                            $selected = 1;
4410
                        }
4411
                        print '<input id="cb' . $obj->rowid . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $obj->rowid . '"' . ($selected ? ' checked="checked"' : '') . '>';
4412
                    }
4413
                    print '</td>';
4414
                    if (!$i) {
4415
                        $totalarray['nbfield']++;
4416
                    }
4417
                }
4418
4419
                print '</tr>' . "\n";
4420
            }
4421
            $i++;
4422
        }
4423
4424
// Show total line
4425
        include DOL_DOCUMENT_ROOT . '/core/tpl/list_print_total.tpl.php';
4426
4427
4428
// If no record found
4429
        if ($num == 0) {
4430
            $colspan = 1;
4431
            foreach ($arrayfields as $key => $val) {
4432
                if (!empty($val['checked'])) {
4433
                    $colspan++;
4434
                }
4435
            }
4436
            print '<tr><td colspan="' . $colspan . '"><span class="opacitymedium">' . $langs->trans("NoRecordFound") . '</span></td></tr>';
4437
        }
4438
4439
        $db->free($resql);
4440
4441
        $parameters = ['arrayfields' => $arrayfields, 'sql' => $sql];
4442
        $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
4443
        print $hookmanager->resPrint;
4444
4445
        print '</table>' . "\n";
4446
        print '</div>' . "\n";
4447
4448
        print '</form>' . "\n";
4449
4450
        if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
4451
            $hidegeneratedfilelistifempty = 1;
4452
            if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
4453
                $hidegeneratedfilelistifempty = 0;
4454
            }
4455
4456
            require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php';
4457
            $formfile = new FormFile($db);
4458
4459
            // Show list of available documents
4460
            $urlsource = $_SERVER['PHP_SELF'] . '?sortfield=' . $sortfield . '&sortorder=' . $sortorder;
4461
            $urlsource .= str_replace('&amp;', '&', $param);
4462
4463
            $filedir = $diroutputmassaction;
4464
            $genallowed = $permissiontoread;
4465
            $delallowed = $permissiontoadd;
4466
4467
            print $formfile->showdocuments('massfilesarea_' . $object->module, '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
4468
        }
4469
4470
// End of page
4471
        llxFooter();
4472
        $db->close();
4473
    }
4474
4475
    /**
4476
     *      \file       htdocs/adherents/note.php
4477
     *      \ingroup    member
4478
     *      \brief      Tab for note of a member
4479
     */
4480
    public function note()
4481
    {
4482
        global $conf;
4483
        global $db;
4484
        global $user;
4485
        global $hookmanager;
4486
        global $user;
4487
        global $menumanager;
4488
        global $langs;
4489
4490
// Load translation files required by the page
4491
        $langs->loadLangs(array("companies", "members", "bills"));
4492
4493
4494
// Get parameters
4495
        $action = GETPOST('action', 'aZ09');
4496
        $id = GETPOSTINT('id');
4497
        $ref = GETPOST('ref', 'alphanohtml');
4498
4499
4500
// Initialize objects
4501
        $object = new Adherent($db);
4502
4503
        $result = $object->fetch($id);
4504
        if ($result > 0) {
4505
            $adht = new AdherentType($db);
4506
            $result = $adht->fetch($object->typeid);
4507
        }
4508
4509
4510
        $permissionnote = $user->hasRight('adherent', 'creer'); // Used by the include of actions_setnotes.inc.php
4511
4512
// Fetch object
4513
        if ($id > 0 || !empty($ref)) {
4514
            // Load member
4515
            $result = $object->fetch($id, $ref);
4516
4517
            // Define variables to know what current user can do on users
4518
            $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer'));
4519
            // Define variables to know what current user can do on properties of user linked to edited member
4520
            if ($object->user_id) {
4521
                // $User is the user who edits, $object->user_id is the id of the related user in the edited member
4522
                $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer'))
4523
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
4524
                $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
4525
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
4526
            }
4527
        }
4528
4529
// Define variables to determine what the current user can do on the members
4530
        $canaddmember = $user->hasRight('adherent', 'creer');
4531
// Define variables to determine what the current user can do on the properties of a member
4532
        if ($id) {
4533
            $caneditfieldmember = $user->hasRight('adherent', 'creer');
4534
        }
4535
4536
        $hookmanager->initHooks(array('membernote'));
4537
4538
// Security check
4539
        $result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
4540
4541
        /*
4542
         * Actions
4543
         */
4544
        $parameters = array();
4545
        $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
4546
        if ($reshook < 0) {
4547
            setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
4548
        }
4549
        if (empty($reshook)) {
4550
            include DOL_DOCUMENT_ROOT . '/core/actions_setnotes.inc.php'; // Must be include, not include_once
4551
        }
4552
4553
4554
        /*
4555
         * View
4556
         */
4557
4558
        $title = $langs->trans("Member") . " - " . $langs->trans("Note");
4559
4560
        $help_url = "EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder";
4561
4562
        llxHeader("", $title, $help_url);
4563
4564
        $form = new Form($db);
4565
4566
        if ($id) {
4567
            $head = member_prepare_head($object);
4568
4569
            print dol_get_fiche_head($head, 'note', $langs->trans("Member"), -1, 'user');
4570
4571
            print '<form method="POST" action="' . $_SERVER['PHP_SELF'] . '">';
4572
            print '<input type="hidden" name="token" value="' . newToken() . '">';
4573
4574
            $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/list.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
4575
4576
            $morehtmlref = '<a href="' . DOL_URL_ROOT . '/adherents/vcard.php?id=' . $object->id . '" class="refid">';
4577
            $morehtmlref .= img_picto($langs->trans("Download") . ' ' . $langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
4578
            $morehtmlref .= '</a>';
4579
4580
            dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref);
4581
4582
            print '<div class="fichecenter">';
4583
4584
            print '<div class="underbanner clearboth"></div>';
4585
            print '<table class="border centpercent tableforfield">';
4586
4587
            // Login
4588
            if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
4589
                print '<tr><td class="titlefield">' . $langs->trans("Login") . ' / ' . $langs->trans("Id") . '</td><td class="valeur">' . dol_escape_htmltag($object->login) . '</td></tr>';
4590
            }
4591
4592
            // Type
4593
            print '<tr><td>' . $langs->trans("Type") . '</td>';
4594
            print '<td class="valeur">' . $adht->getNomUrl(1) . "</td></tr>\n";
4595
4596
            // Morphy
4597
            print '<tr><td class="titlefield">' . $langs->trans("MemberNature") . '</td>';
4598
            print '<td class="valeur" >' . $object->getmorphylib('', 1) . '</td>';
4599
            print '</tr>';
4600
4601
            // Company
4602
            print '<tr><td>' . $langs->trans("Company") . '</td><td class="valeur">' . dol_escape_htmltag($object->company) . '</td></tr>';
4603
4604
            // Civility
4605
            print '<tr><td>' . $langs->trans("UserTitle") . '</td><td class="valeur">' . $object->getCivilityLabel() . '</td>';
4606
            print '</tr>';
4607
4608
            print "</table>";
4609
4610
            print '</div>';
4611
4612
4613
            $cssclass = 'titlefield';
4614
            $permission = $user->hasRight('adherent', 'creer'); // Used by the include of notes.tpl.php
4615
            include DOL_DOCUMENT_ROOT . '/core/tpl/notes.tpl.php';
4616
4617
4618
            print dol_get_fiche_end();
4619
        }
4620
4621
// End of page
4622
        llxFooter();
4623
        $db->close();
4624
    }
4625
4626
    /**
4627
     *      \file       partnership_card.php
4628
     *      \ingroup    partnership
4629
     *      \brief      Page to create/edit/view partnership
4630
     */
4631
    public function partnership()
4632
    {
4633
        global $conf;
4634
        global $db;
4635
        global $user;
4636
        global $hookmanager;
4637
        global $user;
4638
        global $menumanager;
4639
        global $langs;
4640
4641
// Load translation files required by the page
4642
        $langs->loadLangs(array("companies","members","partnership", "other"));
4643
4644
// Get parameters
4645
        $id = GETPOSTINT('rowid') ? GETPOSTINT('rowid') : GETPOSTINT('id');
4646
        $ref = GETPOST('ref', 'alpha');
4647
        $action = GETPOST('action', 'aZ09');
4648
        $confirm = GETPOST('confirm', 'alpha');
4649
        $cancel = GETPOST('cancel', 'aZ09');
4650
        $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'partnershipcard'; // To manage different context of search
4651
        $backtopage = GETPOST('backtopage', 'alpha');
4652
        $backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
4653
//$lineid   = GETPOST('lineid', 'int');
4654
4655
        $object = new Adherent($db);
4656
        if ($id > 0) {
4657
            $object->fetch($id);
4658
        }
4659
4660
// Initialize technical objects
4661
        $object         = new Partnership($db);
4662
        $extrafields    = new ExtraFields($db);
4663
        $adht           = new AdherentType($db);
4664
        $diroutputmassaction = $conf->partnership->dir_output . '/temp/massgeneration/' . $user->id;
4665
        $hookmanager->initHooks(array('partnershipthirdparty', 'globalcard')); // Note that conf->hooks_modules contains array
4666
4667
// Fetch optionals attributes and labels
4668
        $extrafields->fetch_name_optionals_label($object->table_element);
4669
4670
        $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
4671
4672
// Initialize array of search criteria
4673
        $search_all = GETPOST("search_all", 'alpha');
4674
        $search = array();
4675
4676
        foreach ($object->fields as $key => $val) {
4677
            if (GETPOST('search_' . $key, 'alpha')) {
4678
                $search[$key] = GETPOST('search_' . $key, 'alpha');
4679
            }
4680
        }
4681
4682
// Load object
4683
        include DOL_DOCUMENT_ROOT . '/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
4684
4685
        $permissiontoread = $user->hasRight('partnership', 'read');
4686
        $permissiontoadd = $user->hasRight('partnership', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
4687
        $permissiontodelete = $user->hasRight('partnership', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
4688
        $permissionnote = $user->hasRight('partnership', 'write'); // Used by the include of actions_setnotes.inc.php
4689
        $permissiondellink = $user->hasRight('partnership', 'write'); // Used by the include of actions_dellink.inc.php
4690
        $usercanclose = $user->hasRight('partnership', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
4691
        $upload_dir = $conf->partnership->multidir_output[isset($object->entity) ? $object->entity : 1];
4692
4693
4694
        if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') != 'member') {
4695
            accessforbidden('Partnership module is not activated for members');
4696
        }
4697
        if (!isModEnabled('partnership')) {
4698
            accessforbidden();
4699
        }
4700
        if (empty($permissiontoread)) {
4701
            accessforbidden();
4702
        }
4703
        if ($action == 'edit' && empty($permissiontoadd)) {
4704
            accessforbidden();
4705
        }
4706
        if (($action == 'update' || $action == 'edit') && $object->status != $object::STATUS_DRAFT) {
4707
            accessforbidden();
4708
        }
4709
4710
4711
// Security check
4712
        $result = restrictedArea($user, 'adherent', $id, '', '', 'socid', 'rowid', 0);
4713
4714
4715
        /*
4716
         * Actions
4717
         */
4718
4719
        $parameters = array();
4720
        $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
4721
        if ($reshook < 0) {
4722
            setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
4723
        }
4724
4725
        $date_start = dol_mktime(0, 0, 0, GETPOSTINT('date_partnership_startmonth'), GETPOSTINT('date_partnership_startday'), GETPOSTINT('date_partnership_startyear'));
4726
        $date_end = dol_mktime(0, 0, 0, GETPOSTINT('date_partnership_endmonth'), GETPOSTINT('date_partnership_endday'), GETPOSTINT('date_partnership_endyear'));
4727
4728
        if (empty($reshook)) {
4729
            $error = 0;
4730
4731
            $backtopage = dol_buildpath('/partnership/partnership.php', 1) . '?rowid=' . ($id > 0 ? $id : '__ID__');
4732
4733
            // Actions when linking object each other
4734
            include DOL_DOCUMENT_ROOT . '/core/actions_dellink.inc.php';
4735
        }
4736
4737
        $object->fields['fk_member']['visible'] = 0;
4738
        if ($object->id > 0 && $object->status == $object::STATUS_REFUSED && empty($action)) {
4739
            $object->fields['reason_decline_or_cancel']['visible'] = 1;
4740
        }
4741
        $object->fields['note_public']['visible'] = 1;
4742
4743
4744
        /*
4745
         * View
4746
         */
4747
4748
        $form = new Form($db);
4749
        $formfile = new FormFile($db);
4750
4751
        $title = $langs->trans("Partnership");
4752
        llxHeader('', $title);
4753
4754
        $form = new Form($db);
4755
4756
        if ($id > 0) {
4757
            $langs->load("members");
4758
4759
            $object = new Adherent($db);
4760
            $result = $object->fetch($id);
4761
4762
            if (isModEnabled('notification')) {
4763
                $langs->load("mails");
4764
            }
4765
4766
            $adht->fetch($object->typeid);
4767
4768
            $head = member_prepare_head($object);
4769
4770
            print dol_get_fiche_head($head, 'partnership', $langs->trans("ThirdParty"), -1, 'user');
4771
4772
            $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/list.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
4773
4774
            dol_banner_tab($object, 'rowid', $linkback);
4775
4776
            print '<div class="fichecenter">';
4777
4778
            print '<div class="underbanner clearboth"></div>';
4779
            print '<table class="border centpercent tableforfield">';
4780
4781
            // Login
4782
            if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
4783
                print '<tr><td class="titlefield">' . $langs->trans("Login") . ' / ' . $langs->trans("Id") . '</td><td class="valeur">' . $object->login . '&nbsp;</td></tr>';
4784
            }
4785
4786
            // Type
4787
            print '<tr><td class="titlefield">' . $langs->trans("Type") . '</td><td class="valeur">' . $adht->getNomUrl(1) . "</td></tr>\n";
4788
4789
            // Morphy
4790
            print '<tr><td>' . $langs->trans("MemberNature") . '</td><td class="valeur" >' . $object->getmorphylib() . '</td>';
4791
            print '</tr>';
4792
4793
            // Company
4794
            print '<tr><td>' . $langs->trans("Company") . '</td><td class="valeur">' . $object->company . '</td></tr>';
4795
4796
            // Civility
4797
            print '<tr><td>' . $langs->trans("UserTitle") . '</td><td class="valeur">' . $object->getCivilityLabel() . '&nbsp;</td>';
4798
            print '</tr>';
4799
4800
            print '</table>';
4801
4802
            print '</div>';
4803
4804
            print dol_get_fiche_end();
4805
        } else {
4806
            dol_print_error(null, 'Parameter rowid not defined');
4807
        }
4808
4809
4810
// Part to show record
4811
        if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
4812
            // Buttons for actions
4813
4814
            if ($action != 'presend') {
4815
                print '<div class="tabsAction">' . "\n";
4816
                $parameters = array();
4817
                $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
4818
                if ($reshook < 0) {
4819
                    setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
4820
                }
4821
4822
                if (empty($reshook)) {
4823
                    // Show
4824
                    if ($permissiontoadd) {
4825
                        print dolGetButtonAction($langs->trans('AddPartnership'), '', 'default', DOL_URL_ROOT . '/partnership/partnership_card.php?action=create&fk_member=' . $object->id . '&backtopage=' . urlencode(DOL_URL_ROOT . '/adherents/partnership.php?id=' . $object->id), '', $permissiontoadd);
4826
                    }
4827
                }
4828
                print '</div>' . "\n";
4829
            }
4830
4831
4832
            //$morehtmlright = 'partnership/partnership_card.php?action=create&backtopage=%2Fdolibarr%2Fhtdocs%2Fpartnership%2Fpartnership_list.php';
4833
            $morehtmlright = '';
4834
4835
            print load_fiche_titre($langs->trans("PartnershipDedicatedToThisMember", $langs->transnoentitiesnoconv("Partnership")), $morehtmlright, '');
4836
4837
            $memberid = $object->id;
4838
4839
4840
            // TODO Replace this card with the list of all partnerships.
4841
4842
            $object = new Partnership($db);
4843
            $partnershipid = $object->fetch(0, "", $memberid);
4844
4845
            if ($partnershipid > 0) {
4846
                print '<div class="fichecenter">';
4847
                print '<div class="fichehalfleft">';
4848
                print '<div class="underbanner clearboth"></div>';
4849
                print '<table class="border centpercent tableforfield">' . "\n";
4850
4851
                // Common attributes
4852
                //$keyforbreak='fieldkeytoswitchonsecondcolumn';    // We change column just before this field
4853
                //unset($object->fields['fk_project']);             // Hide field already shown in banner
4854
                //unset($object->fields['fk_member']);                  // Hide field already shown in banner
4855
                include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_view.tpl.php';
4856
4857
                // End of subscription date
4858
                $fadherent = new Adherent($db);
4859
                $fadherent->fetch($object->fk_member);
4860
                print '<tr><td>' . $langs->trans("SubscriptionEndDate") . '</td><td class="valeur">';
4861
                if ($fadherent->datefin) {
4862
                    print dol_print_date($fadherent->datefin, 'day');
4863
                    if ($fadherent->hasDelay()) {
4864
                        print " " . img_warning($langs->trans("Late"));
4865
                    }
4866
                } else {
4867
                    if (!$adht->subscription) {
4868
                        print $langs->trans("SubscriptionNotRecorded");
4869
                        if ($fadherent->statut > 0) {
4870
                            print " " . img_warning($langs->trans("Late")); // Display a delay picto only if it is not a draft and is not canceled
4871
                        }
4872
                    } else {
4873
                        print $langs->trans("SubscriptionNotReceived");
4874
                        if ($fadherent->statut > 0) {
4875
                            print " " . img_warning($langs->trans("Late")); // Display a delay picto only if it is not a draft and is not canceled
4876
                        }
4877
                    }
4878
                }
4879
                print '</td></tr>';
4880
4881
                print '</table>';
4882
                print '</div>';
4883
            }
4884
        }
4885
4886
// End of page
4887
        llxFooter();
4888
        $db->close();
4889
    }
4890
4891
    /**
4892
     *       \file       htdocs/adherents/subscription.php
4893
     *       \ingroup    member
4894
     *       \brief      tab for Adding, editing, deleting a member's memberships
4895
     */
4896
    public function subscription()
4897
    {
4898
        global $conf;
4899
        global $db;
4900
        global $user;
4901
        global $hookmanager;
4902
        global $user;
4903
        global $menumanager;
4904
        global $langs;
4905
4906
        $langs->loadLangs(array("companies", "bills", "members", "users", "mails", 'other'));
4907
4908
        $action = GETPOST('action', 'aZ09');
4909
        $confirm = GETPOST('confirm', 'alpha');
4910
        $contextpage = GETPOST('contextpage', 'aZ09');
4911
        $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
4912
4913
        $id = GETPOSTINT('rowid') ? GETPOSTINT('rowid') : GETPOSTINT('id');
4914
        $rowid = $id;
4915
        $ref = GETPOST('ref', 'alphanohtml');
4916
        $typeid = GETPOSTINT('typeid');
4917
        $cancel = GETPOST('cancel');
4918
4919
// Load variable for pagination
4920
        $limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
4921
        $sortfield = GETPOST('sortfield', 'aZ09comma');
4922
        $sortorder = GETPOST('sortorder', 'aZ09comma');
4923
        $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
4924
        if (empty($page) || $page == -1) {
4925
            $page = 0;
4926
        }     // If $page is not defined, or '' or -1
4927
        $offset = $limit * $page;
4928
        $pageprev = $page - 1;
4929
        $pagenext = $page + 1;
4930
4931
// Default sort order (if not yet defined by previous GETPOST)
4932
        if (!$sortfield) {
4933
            $sortfield = "c.rowid";
4934
        }
4935
        if (!$sortorder) {
4936
            $sortorder = "DESC";
4937
        }
4938
4939
        $object = new Adherent($db);
4940
        $extrafields = new ExtraFields($db);
4941
        $adht = new AdherentType($db);
4942
4943
// fetch optionals attributes and labels
4944
        $extrafields->fetch_name_optionals_label($object->table_element);
4945
4946
        $errmsg = '';
4947
4948
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
4949
        $hookmanager->initHooks(array('subscription'));
4950
4951
// PDF
4952
        $hidedetails = (GETPOSTINT('hidedetails') ? GETPOSTINT('hidedetails') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS') ? 1 : 0));
4953
        $hidedesc = (GETPOSTINT('hidedesc') ? GETPOSTINT('hidedesc') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DESC') ? 1 : 0));
4954
        $hideref = (GETPOSTINT('hideref') ? GETPOSTINT('hideref') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_REF') ? 1 : 0));
4955
4956
        $datefrom = 0;
4957
        $dateto = 0;
4958
        $paymentdate = -1;
4959
4960
// Fetch object
4961
        if ($id > 0 || !empty($ref)) {
4962
            // Load member
4963
            $result = $object->fetch($id, $ref);
4964
4965
            // Define variables to know what current user can do on users
4966
            $canadduser = ($user->admin || $user->hasRight("user", "user", "creer"));
4967
            // Define variables to know what current user can do on properties of user linked to edited member
4968
            if ($object->user_id) {
4969
                // $User is the user who edits, $object->user_id is the id of the related user in the edited member
4970
                $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight("user", "self", "creer"))
4971
                    || (($user->id != $object->user_id) && $user->hasRight("user", "user", "creer")));
4972
                $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight("user", "self", "password"))
4973
                    || (($user->id != $object->user_id) && $user->hasRight("user", "user", "password")));
4974
            }
4975
        }
4976
4977
// Define variables to determine what the current user can do on the members
4978
        $canaddmember = $user->hasRight('adherent', 'creer');
4979
// Define variables to determine what the current user can do on the properties of a member
4980
        if ($id) {
4981
            $caneditfieldmember = $user->hasRight('adherent', 'creer');
4982
        }
4983
4984
// Security check
4985
        $result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
4986
4987
4988
        /*
4989
         * 	Actions
4990
         */
4991
4992
        $parameters = array();
4993
        $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
4994
        if ($reshook < 0) {
4995
            setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
4996
        }
4997
4998
// Create third party from a member
4999
        if (empty($reshook) && $action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->hasRight('societe', 'creer')) {
5000
            if ($result > 0) {
5001
                // Creation of thirdparty
5002
                $company = new Societe($db);
5003
                $result = $company->create_from_member($object, GETPOST('companyname', 'alpha'), GETPOST('companyalias', 'alpha'), GETPOST('customercode', 'alpha'));
5004
5005
                if ($result < 0) {
5006
                    $langs->load("errors");
5007
                    setEventMessages($company->error, $company->errors, 'errors');
5008
                } else {
5009
                    $action = 'addsubscription';
5010
                }
5011
            } else {
5012
                setEventMessages($object->error, $object->errors, 'errors');
5013
            }
5014
        }
5015
5016
        if (empty($reshook) && $action == 'setuserid' && ($user->hasRight('user', 'self', 'creer') || $user->hasRight('user', 'user', 'creer'))) {
5017
            $error = 0;
5018
            if (!$user->hasRight('user', 'user', 'creer')) {    // If can edit only itself user, we can link to itself only
5019
                if (GETPOSTINT("userid") != $user->id && GETPOSTINT("userid") != $object->user_id) {
5020
                    $error++;
5021
                    setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors');
5022
                }
5023
            }
5024
5025
            if (!$error) {
5026
                if (GETPOSTINT("userid") != $object->user_id) {  // If link differs from currently in database
5027
                    $result = $object->setUserId(GETPOSTINT("userid"));
5028
                    if ($result < 0) {
5029
                        dol_print_error(null, $object->error);
5030
                    }
5031
                    $action = '';
5032
                }
5033
            }
5034
        }
5035
5036
        if (empty($reshook) && $action == 'setsocid') {
5037
            $error = 0;
5038
            if (!$error) {
5039
                if (GETPOSTINT('socid') != $object->fk_soc) {    // If link differs from currently in database
5040
                    $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "adherent";
5041
                    $sql .= " WHERE fk_soc = '" . GETPOSTINT('socid') . "'";
5042
                    $resql = $db->query($sql);
5043
                    if ($resql) {
5044
                        $obj = $db->fetch_object($resql);
5045
                        if ($obj && $obj->rowid > 0) {
5046
                            $othermember = new Adherent($db);
5047
                            $othermember->fetch($obj->rowid);
5048
                            $thirdparty = new Societe($db);
5049
                            $thirdparty->fetch(GETPOSTINT('socid'));
5050
                            $error++;
5051
                            setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty", $othermember->getFullName($langs), $othermember->login, $thirdparty->name), null, 'errors');
5052
                        }
5053
                    }
5054
5055
                    if (!$error) {
5056
                        $result = $object->setThirdPartyId(GETPOSTINT('socid'));
5057
                        if ($result < 0) {
5058
                            dol_print_error(null, $object->error);
5059
                        }
5060
                        $action = '';
5061
                    }
5062
                }
5063
            }
5064
        }
5065
5066
        if ($user->hasRight('adherent', 'cotisation', 'creer') && $action == 'subscription' && !$cancel) {
5067
            $error = 0;
5068
5069
            $langs->load("banks");
5070
5071
            $result = $object->fetch($rowid);
5072
            $result = $adht->fetch($object->typeid);
5073
5074
            // Subscription information
5075
            $datesubscription = 0;
5076
            $datesubend = 0;
5077
            $defaultdelay = !empty($adht->duration_value) ? $adht->duration_value : 1;
5078
            $defaultdelayunit = !empty($adht->duration_unit) ? $adht->duration_unit : 'y';
5079
            $paymentdate = ''; // Do not use 0 here, default value is '' that means not filled where 0 means 1970-01-01
5080
            if (GETPOSTINT("reyear") && GETPOSTINT("remonth") && GETPOSTINT("reday")) {
5081
                $datesubscription = dol_mktime(0, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
5082
            }
5083
            if (GETPOSTINT("endyear") && GETPOSTINT("endmonth") && GETPOSTINT("endday")) {
5084
                $datesubend = dol_mktime(0, 0, 0, GETPOSTINT("endmonth"), GETPOSTINT("endday"), GETPOSTINT("endyear"));
5085
            }
5086
            if (GETPOSTINT("paymentyear") && GETPOSTINT("paymentmonth") && GETPOSTINT("paymentday")) {
5087
                $paymentdate = dol_mktime(0, 0, 0, GETPOSTINT("paymentmonth"), GETPOSTINT("paymentday"), GETPOSTINT("paymentyear"));
5088
            }
5089
            $amount = price2num(GETPOST("subscription", 'alpha')); // Amount of subscription
5090
            $label = GETPOST("label");
5091
5092
            // Payment information
5093
            $accountid = GETPOSTINT("accountid");
5094
            $operation = GETPOST("operation", "alphanohtml"); // Payment mode
5095
            $num_chq = GETPOST("num_chq", "alphanohtml");
5096
            $emetteur_nom = GETPOST("chqemetteur");
5097
            $emetteur_banque = GETPOST("chqbank");
5098
            $option = GETPOST("paymentsave");
5099
            if (empty($option)) {
5100
                $option = 'none';
5101
            }
5102
            $sendalsoemail = GETPOST("sendmail", 'alpha');
5103
5104
            // Check parameters
5105
            if (!$datesubscription) {
5106
                $error++;
5107
                $langs->load("errors");
5108
                $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateSubscription"));
5109
                setEventMessages($errmsg, null, 'errors');
5110
                $action = 'addsubscription';
5111
            }
5112
            if (GETPOST('end') && !$datesubend) {
5113
                $error++;
5114
                $langs->load("errors");
5115
                $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateEndSubscription"));
5116
                setEventMessages($errmsg, null, 'errors');
5117
                $action = 'addsubscription';
5118
            }
5119
            if (!$datesubend) {
5120
                $datesubend = dol_time_plus_duree(dol_time_plus_duree($datesubscription, $defaultdelay, $defaultdelayunit), -1, 'd');
5121
            }
5122
            if (($option == 'bankviainvoice' || $option == 'bankdirect') && !$paymentdate) {
5123
                $error++;
5124
                $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DatePayment"));
5125
                setEventMessages($errmsg, null, 'errors');
5126
                $action = 'addsubscription';
5127
            }
5128
5129
            // Check if a payment is mandatory or not
5130
            if ($adht->subscription) {  // Member type need subscriptions
5131
                if (!is_numeric($amount)) {
5132
                    // If field is '' or not a numeric value
5133
                    $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount"));
5134
                    setEventMessages($errmsg, null, 'errors');
5135
                    $error++;
5136
                    $action = 'addsubscription';
5137
                } else {
5138
                    // If an amount has been provided, we check also fields that becomes mandatory when amount is not null.
5139
                    if (isModEnabled('bank') && GETPOST("paymentsave") != 'none') {
5140
                        if (GETPOST("subscription")) {
5141
                            if (!GETPOST("label")) {
5142
                                $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Label"));
5143
                                setEventMessages($errmsg, null, 'errors');
5144
                                $error++;
5145
                                $action = 'addsubscription';
5146
                            }
5147
                            if (GETPOST("paymentsave") != 'invoiceonly' && !GETPOST("operation")) {
5148
                                $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("PaymentMode"));
5149
                                setEventMessages($errmsg, null, 'errors');
5150
                                $error++;
5151
                                $action = 'addsubscription';
5152
                            }
5153
                            if (GETPOST("paymentsave") != 'invoiceonly' && !(GETPOSTINT("accountid") > 0)) {
5154
                                $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("FinancialAccount"));
5155
                                setEventMessages($errmsg, null, 'errors');
5156
                                $error++;
5157
                                $action = 'addsubscription';
5158
                            }
5159
                        } else {
5160
                            if (GETPOSTINT("accountid")) {
5161
                                $errmsg = $langs->trans("ErrorDoNotProvideAccountsIfNullAmount");
5162
                                setEventMessages($errmsg, null, 'errors');
5163
                                $error++;
5164
                                $action = 'addsubscription';
5165
                            }
5166
                        }
5167
                    }
5168
                }
5169
            }
5170
5171
            // Record the subscription then complementary actions
5172
            if (!$error && $action == 'subscription') {
5173
                $db->begin();
5174
5175
                // Create subscription
5176
                $crowid = $object->subscription($datesubscription, $amount, $accountid, $operation, $label, $num_chq, $emetteur_nom, $emetteur_banque, $datesubend);
5177
                if ($crowid <= 0) {
5178
                    $error++;
5179
                    $errmsg = $object->error;
5180
                    setEventMessages($object->error, $object->errors, 'errors');
5181
                }
5182
5183
                if (!$error) {
5184
                    $result = $object->subscriptionComplementaryActions($crowid, $option, $accountid, $datesubscription, $paymentdate, $operation, $label, $amount, $num_chq, $emetteur_nom, $emetteur_banque);
5185
                    if ($result < 0) {
5186
                        $error++;
5187
                        setEventMessages($object->error, $object->errors, 'errors');
5188
                    } else {
5189
                        // If an invoice was created, it is into $object->invoice
5190
                    }
5191
                }
5192
5193
                if (!$error) {
5194
                    $db->commit();
5195
                } else {
5196
                    $db->rollback();
5197
                    $action = 'addsubscription';
5198
                }
5199
5200
                if (!$error) {
5201
                    setEventMessages("SubscriptionRecorded", null, 'mesgs');
5202
                }
5203
5204
                // Send email
5205
                if (!$error) {
5206
                    // Send confirmation Email
5207
                    if ($object->email && $sendalsoemail) {   // $object is 'Adherent'
5208
                        $parameters = array(
5209
                            'datesubscription' => $datesubscription,
5210
                            'amount' => $amount,
5211
                            'ccountid' => $accountid,
5212
                            'operation' => $operation,
5213
                            'label' => $label,
5214
                            'num_chq' => $num_chq,
5215
                            'emetteur_nom' => $emetteur_nom,
5216
                            'emetteur_banque' => $emetteur_banque,
5217
                            'datesubend' => $datesubend
5218
                        );
5219
                        $reshook = $hookmanager->executeHooks('sendMail', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
5220
                        if ($reshook < 0) {
5221
                            setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
5222
                        }
5223
5224
                        if (empty($reshook)) {
5225
                            $subject = '';
5226
                            $msg = '';
5227
5228
                            // Send subscription email
5229
                            include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
5230
                            $formmail = new FormMail($db);
5231
                            // Set output language
5232
                            $outputlangs = new Translate('', $conf);
5233
                            $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
5234
                            // Load traductions files required by page
5235
                            $outputlangs->loadLangs(array("main", "members"));
5236
5237
                            // Get email content from template
5238
                            $arraydefaultmessage = null;
5239
                            $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
5240
5241
                            if (!empty($labeltouse)) {
5242
                                $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
5243
                            }
5244
5245
                            if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
5246
                                $subject = $arraydefaultmessage->topic;
5247
                                $msg     = $arraydefaultmessage->content;
5248
                            }
5249
5250
                            $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
5251
                            complete_substitutions_array($substitutionarray, $outputlangs, $object);
5252
                            $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
5253
                            $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
5254
5255
                            // Attach a file ?
5256
                            $file = '';
5257
                            $listofpaths = array();
5258
                            $listofnames = array();
5259
                            $listofmimes = array();
5260
                            if (is_object($object->invoice) && (!is_object($arraydefaultmessage) || intval($arraydefaultmessage->joinfiles))) {
5261
                                $invoicediroutput = $conf->facture->dir_output;
5262
                                $fileparams = dol_most_recent_file($invoicediroutput . '/' . $object->invoice->ref, preg_quote($object->invoice->ref, '/') . '[^\-]+');
5263
                                $file = $fileparams['fullname'];
5264
5265
                                $listofpaths = array($file);
5266
                                $listofnames = array(basename($file));
5267
                                $listofmimes = array(dol_mimetype($file));
5268
                            }
5269
5270
                            $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/subscription.php' . "\r\n";
5271
5272
                            $result = $object->sendEmail($texttosend, $subjecttosend, $listofpaths, $listofmimes, $listofnames, "", "", 0, -1, '', $moreinheader);
5273
                            if ($result < 0) {
5274
                                $errmsg = $object->error;
5275
                                setEventMessages($object->error, $object->errors, 'errors');
5276
                            } else {
5277
                                setEventMessages($langs->trans("EmailSentToMember", $object->email), null, 'mesgs');
5278
                            }
5279
                        }
5280
                    } else {
5281
                        setEventMessages($langs->trans("NoEmailSentToMember"), null, 'mesgs');
5282
                    }
5283
                }
5284
5285
                // Clean some POST vars
5286
                if (!$error) {
5287
                    $_POST["subscription"] = '';
5288
                    $_POST["accountid"] = '';
5289
                    $_POST["operation"] = '';
5290
                    $_POST["label"] = '';
5291
                    $_POST["num_chq"] = '';
5292
                }
5293
            }
5294
        }
5295
5296
5297
5298
        /*
5299
         * View
5300
         */
5301
5302
        $form = new Form($db);
5303
5304
        $now = dol_now();
5305
5306
        $title = $langs->trans("Member") . " - " . $langs->trans("Subscriptions");
5307
5308
        $help_url = "EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder";
5309
5310
        llxHeader("", $title, $help_url);
5311
5312
5313
        $param = '';
5314
        if (!empty($contextpage) && $contextpage != $_SERVER['PHP_SELF']) {
5315
            $param .= '&contextpage=' . urlencode($contextpage);
5316
        }
5317
        if ($limit > 0 && $limit != $conf->liste_limit) {
5318
            $param .= '&limit=' . ((int) $limit);
5319
        }
5320
        $param .= '&id=' . $rowid;
5321
        if ($optioncss != '') {
5322
            $param .= '&optioncss=' . urlencode($optioncss);
5323
        }
5324
// Add $param from extra fields
5325
//include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
5326
5327
5328
        if (! ($object->id > 0)) {
5329
            $langs->load("errors");
5330
            print $langs->trans("ErrorRecordNotFound");
5331
        }
5332
5333
        /*$res = $object->fetch($rowid);
5334
            if ($res < 0) {
5335
                dol_print_error($db, $object->error);
5336
                exit;
5337
            }
5338
        */
5339
5340
        $adht->fetch($object->typeid);
5341
5342
        $defaultdelay = !empty($adht->duration_value) ? $adht->duration_value : 1;
5343
        $defaultdelayunit = !empty($adht->duration_unit) ? $adht->duration_unit : 'y';
5344
5345
        $head = member_prepare_head($object);
5346
5347
        $rowspan = 10;
5348
        if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
5349
            $rowspan++;
5350
        }
5351
        if (isModEnabled('societe')) {
5352
            $rowspan++;
5353
        }
5354
5355
        print '<form action="' . $_SERVER['PHP_SELF'] . '" method="POST">';
5356
        print '<input type="hidden" name="token" value="' . newToken() . '">';
5357
        print '<input type="hidden" name="rowid" value="' . $object->id . '">';
5358
5359
        print dol_get_fiche_head($head, 'subscription', $langs->trans("Member"), -1, 'user');
5360
5361
        $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/list.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
5362
5363
        $morehtmlref = '<a href="' . DOL_URL_ROOT . '/adherents/vcard.php?id=' . $object->id . '" class="refid">';
5364
        $morehtmlref .= img_picto($langs->trans("Download") . ' ' . $langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
5365
        $morehtmlref .= '</a>';
5366
5367
        dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
5368
5369
        print '<div class="fichecenter">';
5370
        print '<div class="fichehalfleft">';
5371
5372
        print '<div class="underbanner clearboth"></div>';
5373
        print '<table class="border centpercent tableforfield">';
5374
5375
// Login
5376
        if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
5377
            print '<tr><td class="titlefield">' . $langs->trans("Login") . ' / ' . $langs->trans("Id") . '</td><td class="valeur">' . dol_escape_htmltag($object->login) . '</td></tr>';
5378
        }
5379
5380
// Type
5381
        print '<tr><td class="titlefield">' . $langs->trans("Type") . '</td>';
5382
        print '<td class="valeur">' . $adht->getNomUrl(1) . "</td></tr>\n";
5383
5384
// Morphy
5385
        print '<tr><td>' . $langs->trans("MemberNature") . '</td>';
5386
        print '<td class="valeur" >' . $object->getmorphylib('', 1) . '</td>';
5387
        print '</tr>';
5388
5389
// Company
5390
        print '<tr><td>' . $langs->trans("Company") . '</td><td class="valeur">' . dol_escape_htmltag($object->company) . '</td></tr>';
5391
5392
// Civility
5393
        print '<tr><td>' . $langs->trans("UserTitle") . '</td><td class="valeur">' . $object->getCivilityLabel() . '</td>';
5394
        print '</tr>';
5395
5396
// Password
5397
        if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
5398
            print '<tr><td>' . $langs->trans("Password") . '</td><td>';
5399
            if ($object->pass) {
5400
                print preg_replace('/./i', '*', $object->pass);
5401
            } else {
5402
                if ($user->admin) {
5403
                    print '<!-- ' . $langs->trans("Crypted") . ': ' . $object->pass_indatabase_crypted . ' -->';
5404
                }
5405
                print '<span class="opacitymedium">' . $langs->trans("Hidden") . '</span>';
5406
            }
5407
            if (!empty($object->pass_indatabase) && empty($object->user_id)) {  // Show warning only for old password still in clear (does not happen anymore)
5408
                $langs->load("errors");
5409
                $htmltext = $langs->trans("WarningPasswordSetWithNoAccount");
5410
                print ' ' . $form->textwithpicto('', $htmltext, 1, 'warning');
5411
            }
5412
            print '</td></tr>';
5413
        }
5414
5415
// Date end subscription
5416
        print '<tr><td>' . $langs->trans("SubscriptionEndDate") . '</td><td class="valeur">';
5417
        if ($object->datefin) {
5418
            print dol_print_date($object->datefin, 'day');
5419
            if ($object->hasDelay()) {
5420
                print " " . img_warning($langs->trans("Late"));
5421
            }
5422
        } else {
5423
            if ($object->need_subscription == 0) {
5424
                print $langs->trans("SubscriptionNotNeeded");
5425
            } elseif (!$adht->subscription) {
5426
                print $langs->trans("SubscriptionNotRecorded");
5427
                if (Adherent::STATUS_VALIDATED == $object->statut) {
5428
                    print " " . img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
5429
                }
5430
            } else {
5431
                print $langs->trans("SubscriptionNotReceived");
5432
                if (Adherent::STATUS_VALIDATED == $object->statut) {
5433
                    print " " . img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
5434
                }
5435
            }
5436
        }
5437
        print '</td></tr>';
5438
5439
        print '</table>';
5440
5441
        print '</div>';
5442
5443
        print '<div class="fichehalfright">';
5444
        print '<div class="underbanner clearboth"></div>';
5445
5446
        print '<table class="border tableforfield centpercent">';
5447
5448
// Tags / Categories
5449
        if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
5450
            print '<tr><td>' . $langs->trans("Categories") . '</td>';
5451
            print '<td colspan="2">';
5452
            print $form->showCategories($object->id, Categorie::TYPE_MEMBER, 1);
5453
            print '</td></tr>';
5454
        }
5455
5456
// Birth Date
5457
        print '<tr><td class="titlefield">' . $langs->trans("DateOfBirth") . '</td><td class="valeur">' . dol_print_date($object->birth, 'day') . '</td></tr>';
5458
5459
// Default language
5460
        if (getDolGlobalInt('MAIN_MULTILANGS')) {
5461
            require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php';
5462
            print '<tr><td>' . $langs->trans("DefaultLang") . '</td><td>';
5463
            //$s=picto_from_langcode($object->default_lang);
5464
            //print ($s?$s.' ':'');
5465
            $langs->load("languages");
5466
            $labellang = ($object->default_lang ? $langs->trans('Language_' . $object->default_lang) : '');
5467
            print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
5468
            print $labellang;
5469
            print '</td></tr>';
5470
        }
5471
5472
// Public
5473
        $linkofpubliclist = DOL_MAIN_URL_ROOT . '/public/members/public_list.php' . ((isModEnabled('multicompany')) ? '?entity=' . $conf->entity : '');
5474
        print '<tr><td>' . $form->textwithpicto($langs->trans("PublicFile"), $langs->trans("Public", getDolGlobalString('MAIN_INFO_SOCIETE_NOM'), $linkofpubliclist), 1, 'help', '', 0, 3, 'publicfile') . '</td><td class="valeur">' . yn($object->public) . '</td></tr>';
5475
5476
// Other attributes
5477
        $cols = 2;
5478
        include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
5479
5480
// Third party Dolibarr
5481
        if (isModEnabled('societe')) {
5482
            print '<tr><td>';
5483
            print '<table class="nobordernopadding" width="100%"><tr><td>';
5484
            print $langs->trans("LinkedToDolibarrThirdParty");
5485
            print '</td>';
5486
            if ($action != 'editthirdparty' && $user->hasRight('adherent', 'creer')) {
5487
                print '<td class="right"><a class="editfielda" href="' . $_SERVER['PHP_SELF'] . '?action=editthirdparty&token=' . newToken() . '&rowid=' . $object->id . '">' . img_edit($langs->trans('SetLinkToThirdParty'), 1) . '</a></td>';
5488
            }
5489
            print '</tr></table>';
5490
            print '</td><td colspan="2" class="valeur">';
5491
            if ($action == 'editthirdparty') {
5492
                $htmlname = 'socid';
5493
                print '<form method="POST" action="' . $_SERVER['PHP_SELF'] . '" name="form' . $htmlname . '">';
5494
                print '<input type="hidden" name="rowid" value="' . $object->id . '">';
5495
                print '<input type="hidden" name="action" value="set' . $htmlname . '">';
5496
                print '<input type="hidden" name="token" value="' . newToken() . '">';
5497
                print '<table class="nobordernopadding">';
5498
                print '<tr><td>';
5499
                print $form->select_company($object->fk_soc, 'socid', '', 1);
5500
                print '</td>';
5501
                print '<td class="left"><input type="submit" class="button button-edit" value="' . $langs->trans("Modify") . '"></td>';
5502
                print '</tr></table></form>';
5503
            } else {
5504
                if ($object->fk_soc) {
5505
                    $company = new Societe($db);
5506
                    $result = $company->fetch($object->fk_soc);
5507
                    print $company->getNomUrl(1);
5508
5509
                    // Show link to invoices
5510
                    $tmparray = $company->getOutstandingBills('customer');
5511
                    if (!empty($tmparray['refs'])) {
5512
                        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']) . ')';
5513
                        // TODO Add alert if warning on at least one invoice late
5514
                        print '</a>';
5515
                    }
5516
                } else {
5517
                    print '<span class="opacitymedium">' . $langs->trans("NoThirdPartyAssociatedToMember") . '</span>';
5518
                }
5519
            }
5520
            print '</td></tr>';
5521
        }
5522
5523
// Login Dolibarr - Link to user
5524
        print '<tr><td>';
5525
        print '<table class="nobordernopadding" width="100%"><tr><td>';
5526
        print $langs->trans("LinkedToDolibarrUser");
5527
        print '</td>';
5528
        if ($action != 'editlogin' && $user->hasRight('adherent', 'creer')) {
5529
            print '<td class="right">';
5530
            if ($user->hasRight("user", "user", "creer")) {
5531
                print '<a class="editfielda" href="' . $_SERVER['PHP_SELF'] . '?action=editlogin&token=' . newToken() . '&rowid=' . $object->id . '">' . img_edit($langs->trans('SetLinkToUser'), 1) . '</a>';
5532
            }
5533
            print '</td>';
5534
        }
5535
        print '</tr></table>';
5536
        print '</td><td colspan="2" class="valeur">';
5537
        if ($action == 'editlogin') {
5538
            $form->form_users($_SERVER['PHP_SELF'] . '?rowid=' . $object->id, $object->user_id, 'userid', '');
5539
        } else {
5540
            if ($object->user_id) {
5541
                $linkeduser = new User($db);
5542
                $linkeduser->fetch($object->user_id);
5543
                print $linkeduser->getNomUrl(-1);
5544
            } else {
5545
                print '<span class="opacitymedium">' . $langs->trans("NoDolibarrAccess") . '</span>';
5546
            }
5547
        }
5548
        print '</td></tr>';
5549
5550
        print "</table>\n";
5551
5552
        print "</div></div>\n";
5553
        print '<div class="clearboth"></div>';
5554
5555
        print dol_get_fiche_end();
5556
5557
5558
        /*
5559
         * Action bar
5560
         */
5561
5562
// Button to create a new subscription if member no draft (-1) neither resiliated (0) neither excluded (-2)
5563
        if ($user->hasRight('adherent', 'cotisation', 'creer')) {
5564
            if ($action != 'addsubscription' && $action != 'create_thirdparty') {
5565
                print '<div class="tabsAction">';
5566
5567
                if ($object->statut > 0) {
5568
                    print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?rowid=' . $rowid . '&action=addsubscription&token=' . newToken() . '">' . $langs->trans("AddSubscription") . "</a></div>";
5569
                } else {
5570
                    print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' . dol_escape_htmltag($langs->trans("ValidateBefore")) . '">' . $langs->trans("AddSubscription") . '</a></div>';
5571
                }
5572
5573
                print '</div>';
5574
            }
5575
        }
5576
5577
        /*
5578
         * List of subscriptions
5579
         */
5580
        if ($action != 'addsubscription' && $action != 'create_thirdparty') {
5581
            $sql = "SELECT d.rowid, d.firstname, d.lastname, d.societe, d.fk_adherent_type as type,";
5582
            $sql .= " c.rowid as crowid, c.subscription,";
5583
            $sql .= " c.datec, c.fk_type as cfk_type,";
5584
            $sql .= " c.dateadh as dateh,";
5585
            $sql .= " c.datef,";
5586
            $sql .= " c.fk_bank,";
5587
            $sql .= " b.rowid as bid,";
5588
            $sql .= " ba.rowid as baid, ba.label, ba.bank, ba.ref, ba.account_number, ba.fk_accountancy_journal, ba.number, ba.currency_code";
5589
            $sql .= " FROM " . MAIN_DB_PREFIX . "adherent as d, " . MAIN_DB_PREFIX . "subscription as c";
5590
            $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank as b ON c.fk_bank = b.rowid";
5591
            $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_account as ba ON b.fk_account = ba.rowid";
5592
            $sql .= " WHERE d.rowid = c.fk_adherent AND d.rowid=" . ((int) $rowid);
5593
            $sql .= $db->order($sortfield, $sortorder);
5594
5595
            $result = $db->query($sql);
5596
            if ($result) {
5597
                $subscriptionstatic = new Subscription($db);
5598
5599
                $num = $db->num_rows($result);
5600
5601
                print '<table class="noborder centpercent">' . "\n";
5602
5603
                print '<tr class="liste_titre">';
5604
                print_liste_field_titre('Ref', $_SERVER['PHP_SELF'], 'c.rowid', '', $param, '', $sortfield, $sortorder);
5605
                print_liste_field_titre('DateCreation', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'center ');
5606
                print_liste_field_titre('Type', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'center ');
5607
                print_liste_field_titre('DateStart', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'center ');
5608
                print_liste_field_titre('DateEnd', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'center ');
5609
                print_liste_field_titre('Amount', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
5610
                if (isModEnabled('bank')) {
5611
                    print_liste_field_titre('Account', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
5612
                }
5613
                print "</tr>\n";
5614
5615
                $accountstatic = new Account($db);
5616
                $adh = new Adherent($db);
5617
                $adht = new AdherentType($db);
5618
5619
                $i = 0;
5620
                while ($i < $num) {
5621
                    $objp = $db->fetch_object($result);
5622
5623
                    $adh->id = $objp->rowid;
5624
                    $adh->typeid = $objp->type;
5625
5626
                    $subscriptionstatic->ref = $objp->crowid;
5627
                    $subscriptionstatic->id = $objp->crowid;
5628
5629
                    $typeid = $objp->cfk_type;
5630
                    if ($typeid > 0) {
5631
                        $adht->fetch($typeid);
5632
                    }
5633
5634
                    print '<tr class="oddeven">';
5635
                    print '<td>' . $subscriptionstatic->getNomUrl(1) . '</td>';
5636
                    print '<td class="center">' . dol_print_date($db->jdate($objp->datec), 'dayhour') . "</td>\n";
5637
                    print '<td class="center">';
5638
                    if ($typeid > 0) {
5639
                        print $adht->getNomUrl(1);
5640
                    }
5641
                    print '</td>';
5642
                    print '<td class="center">' . dol_print_date($db->jdate($objp->dateh), 'day') . "</td>\n";
5643
                    print '<td class="center">' . dol_print_date($db->jdate($objp->datef), 'day') . "</td>\n";
5644
                    print '<td class="right amount">' . price($objp->subscription) . '</td>';
5645
                    if (isModEnabled('bank')) {
5646
                        print '<td class="right">';
5647
                        if ($objp->bid) {
5648
                            $accountstatic->label = $objp->label;
5649
                            $accountstatic->id = $objp->baid;
5650
                            $accountstatic->number = $objp->number;
5651
                            $accountstatic->account_number = $objp->account_number;
5652
                            $accountstatic->currency_code = $objp->currency_code;
5653
5654
                            if (isModEnabled('accounting') && $objp->fk_accountancy_journal > 0) {
5655
                                $accountingjournal = new AccountingJournal($db);
5656
                                $accountingjournal->fetch($objp->fk_accountancy_journal);
5657
5658
                                $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
5659
                            }
5660
5661
                            $accountstatic->ref = $objp->ref;
5662
                            print $accountstatic->getNomUrl(1);
5663
                        } else {
5664
                            print '&nbsp;';
5665
                        }
5666
                        print '</td>';
5667
                    }
5668
                    print "</tr>";
5669
                    $i++;
5670
                }
5671
5672
                if (empty($num)) {
5673
                    $colspan = 6;
5674
                    if (isModEnabled('bank')) {
5675
                        $colspan++;
5676
                    }
5677
                    print '<tr><td colspan="' . $colspan . '"><span class="opacitymedium">' . $langs->trans("None") . '</span></td></tr>';
5678
                }
5679
5680
                print "</table>";
5681
            } else {
5682
                dol_print_error($db);
5683
            }
5684
        }
5685
5686
5687
        if (($action != 'addsubscription' && $action != 'create_thirdparty')) {
5688
            // Shon online payment link
5689
            $useonlinepayment = (isModEnabled('paypal') || isModEnabled('stripe') || isModEnabled('paybox'));
5690
5691
            $parameters = array();
5692
            $reshook = $hookmanager->executeHooks('doShowOnlinePaymentUrl', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
5693
            if ($reshook > 0) {
5694
                if (isset($hookmanager->resArray['showonlinepaymenturl'])) {
5695
                    $useonlinepayment = $hookmanager->resArray['showonlinepaymenturl'];
5696
                }
5697
            }
5698
5699
            if ($useonlinepayment) {
5700
                print '<br>';
5701
5702
                require_once DOL_DOCUMENT_ROOT . '/core/lib/payments.lib.php';
5703
                print showOnlinePaymentUrl('membersubscription', $object->ref);
5704
                print '<br>';
5705
            }
5706
        }
5707
5708
        /*
5709
         * Add new subscription form
5710
         */
5711
        if (($action == 'addsubscription' || $action == 'create_thirdparty') && $user->hasRight('adherent', 'cotisation', 'creer')) {
5712
            print '<br>';
5713
5714
            print load_fiche_titre($langs->trans("NewCotisation"));
5715
5716
            // Define default choice for complementary actions
5717
            $bankdirect = 0; // 1 means option by default is write to bank direct with no invoice
5718
            $invoiceonly = 0; // 1 means option by default is invoice only
5719
            $bankviainvoice = 0; // 1 means option by default is write to bank via invoice
5720
            if (GETPOST('paymentsave')) {
5721
                if (GETPOST('paymentsave') == 'bankdirect') {
5722
                    $bankdirect = 1;
5723
                }
5724
                if (GETPOST('paymentsave') == 'invoiceonly') {
5725
                    $invoiceonly = 1;
5726
                }
5727
                if (GETPOST('paymentsave') == 'bankviainvoice') {
5728
                    $bankviainvoice = 1;
5729
                }
5730
            } else {
5731
                if (getDolGlobalString('ADHERENT_BANK_USE') == 'bankviainvoice' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
5732
                    $bankviainvoice = 1;
5733
                } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'bankdirect' && isModEnabled('bank')) {
5734
                    $bankdirect = 1;
5735
                } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'invoiceonly' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
5736
                    $invoiceonly = 1;
5737
                }
5738
            }
5739
5740
            print "\n\n<!-- Form add subscription -->\n";
5741
5742
            if ($conf->use_javascript_ajax) {
5743
                //var_dump($bankdirect.'-'.$bankviainvoice.'-'.$invoiceonly);
5744
                print "\n" . '<script type="text/javascript">';
5745
                print '$(document).ready(function () {
5746
					$(".bankswitchclass, .bankswitchclass2").' . (($bankdirect || $bankviainvoice) ? 'show()' : 'hide()') . ';
5747
					$("#none, #invoiceonly").click(function() {
5748
						$(".bankswitchclass").hide();
5749
						$(".bankswitchclass2").hide();
5750
					});
5751
					$("#bankdirect, #bankviainvoice").click(function() {
5752
						$(".bankswitchclass").show();
5753
						$(".bankswitchclass2").show();
5754
					});
5755
					$("#selectoperation").change(function() {
5756
						var code = $(this).val();
5757
						if (code == "CHQ")
5758
						{
5759
							$(".fieldrequireddyn").addClass("fieldrequired");
5760
							if ($("#fieldchqemetteur").val() == "")
5761
							{
5762
								$("#fieldchqemetteur").val($("#memberlabel").val());
5763
							}
5764
						}
5765
						else
5766
						{
5767
							$(".fieldrequireddyn").removeClass("fieldrequired");
5768
						}
5769
					});
5770
					';
5771
                if (GETPOST('paymentsave')) {
5772
                    print '$("#' . GETPOST('paymentsave', 'aZ09') . '").prop("checked", true);';
5773
                }
5774
                print '});';
5775
                print '</script>' . "\n";
5776
            }
5777
5778
5779
            // Confirm create third party
5780
            if ($action == 'create_thirdparty') {
5781
                $companyalias = '';
5782
                $fullname = $object->getFullName($langs);
5783
5784
                if ($object->morphy == 'mor') {
5785
                    $companyname = $object->company;
5786
                    if (!empty($fullname)) {
5787
                        $companyalias = $fullname;
5788
                    }
5789
                } else {
5790
                    $companyname = $fullname;
5791
                    if (!empty($object->company)) {
5792
                        $companyalias = $object->company;
5793
                    }
5794
                }
5795
5796
                // Create a form array
5797
                $formquestion = array(
5798
                    array('label' => $langs->trans("NameToCreate"), 'type' => 'text', 'name' => 'companyname', 'value' => $companyname, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"'),
5799
                    array('label' => $langs->trans("AliasNames"), 'type' => 'text', 'name' => 'companyalias', 'value' => $companyalias, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"')
5800
                );
5801
                // If customer code was forced to "required", we ask it at creation to avoid error later
5802
                if (getDolGlobalString('MAIN_COMPANY_CODE_ALWAYS_REQUIRED')) {
5803
                    $tmpcompany = new Societe($db);
5804
                    $tmpcompany->name = $companyname;
5805
                    $tmpcompany->get_codeclient($tmpcompany, 0);
5806
                    $customercode = $tmpcompany->code_client;
5807
                    $formquestion[] = array(
5808
                        'label' => $langs->trans("CustomerCode"),
5809
                        'type' => 'text',
5810
                        'name' => 'customercode',
5811
                        'value' => $customercode,
5812
                        'morecss' => 'minwidth300',
5813
                        'moreattr' => 'maxlength="128"',
5814
                    );
5815
                }
5816
                // @todo Add other extrafields mandatory for thirdparty creation
5817
5818
                print $form->formconfirm($_SERVER['PHP_SELF'] . "?rowid=" . $object->id, $langs->trans("CreateDolibarrThirdParty"), $langs->trans("ConfirmCreateThirdParty"), "confirm_create_thirdparty", $formquestion, 1);
5819
            }
5820
5821
5822
            print '<form name="subscription" method="POST" action="' . $_SERVER['PHP_SELF'] . '">';
5823
            print '<input type="hidden" name="token" value="' . newToken() . '">';
5824
            print '<input type="hidden" name="action" value="subscription">';
5825
            print '<input type="hidden" name="rowid" value="' . $rowid . '">';
5826
            print '<input type="hidden" name="memberlabel" id="memberlabel" value="' . dol_escape_htmltag($object->getFullName($langs)) . '">';
5827
            print '<input type="hidden" name="thirdpartylabel" id="thirdpartylabel" value="' . dol_escape_htmltag($object->company) . '">';
5828
5829
            print dol_get_fiche_head('');
5830
5831
            print '<div class="div-table-responsive">';
5832
            print '<table class="border centpercent">' . "\n";
5833
            print '<tbody>';
5834
5835
            // Date payment
5836
            if (GETPOST('paymentyear') && GETPOST('paymentmonth') && GETPOST('paymentday')) {
5837
                $paymentdate = dol_mktime(0, 0, 0, GETPOST('paymentmonth'), GETPOST('paymentday'), GETPOST('paymentyear'));
5838
            }
5839
5840
            print '<tr>';
5841
            // Date start subscription
5842
            $currentyear = dol_print_date($now, "%Y");
5843
            $currentmonth = dol_print_date($now, "%m");
5844
            print '<td class="fieldrequired">' . $langs->trans("DateSubscription") . '</td><td>';
5845
            if (GETPOST('reday')) {
5846
                $datefrom = dol_mktime(0, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
5847
            }
5848
            if (!$datefrom) {
5849
                $datefrom = $object->datevalid;
5850
                if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER')) {
5851
                    $datefrom = dol_time_plus_duree($now, (int) substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), 0, -1), substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), -1));
5852
                } elseif ($object->datefin > 0 && dol_time_plus_duree($object->datefin, $defaultdelay, $defaultdelayunit) > $now) {
5853
                    $datefrom = dol_time_plus_duree($object->datefin, 1, 'd');
5854
                }
5855
5856
                if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "m") {
5857
                    $datefrom = dol_get_first_day(dol_print_date($datefrom, "%Y"), dol_print_date($datefrom, "%m"));
5858
                } elseif (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "Y") {
5859
                    $datefrom = dol_get_first_day(dol_print_date($datefrom, "%Y"));
5860
                }
5861
            }
5862
            print $form->selectDate($datefrom, '', 0, 0, 0, "subscription", 1, 1);
5863
            print "</td></tr>";
5864
5865
            // Date end subscription
5866
            if (GETPOST('endday')) {
5867
                $dateto = dol_mktime(0, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
5868
            }
5869
            if (!$dateto) {
5870
                if (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH')) {
5871
                    $dateto = dol_get_last_day(dol_print_date($datefrom, "%Y"), dol_print_date($datefrom, "%m"));
5872
                } elseif (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR')) {
5873
                    $dateto = dol_get_last_day(dol_print_date($datefrom, "%Y"));
5874
                } else {
5875
                    $dateto = -1; // By default, no date is suggested
5876
                }
5877
            }
5878
            print '<tr><td>' . $langs->trans("DateEndSubscription") . '</td><td>';
5879
            print $form->selectDate($dateto, 'end', 0, 0, 0, "subscription", 1, 0);
5880
            print "</td></tr>";
5881
5882
            if ($adht->subscription) {
5883
                // Amount
5884
                print '<tr><td class="fieldrequired">' . $langs->trans("Amount") . '</td><td><input type="text" name="subscription" size="6" value="' . (GETPOSTISSET('subscription') ? GETPOST('subscription') : price($adht->amount, 0, '', 0)) . '"> ' . $langs->trans("Currency" . $conf->currency) . '</td></tr>';
5885
5886
                // Label
5887
                print '<tr><td>' . $langs->trans("Label") . '</td>';
5888
                print '<td><input name="label" type="text" size="32" value="';
5889
                if (!getDolGlobalString('MEMBER_NO_DEFAULT_LABEL')) {
5890
                    print $langs->trans("Subscription") . ' ' . dol_print_date(($datefrom ? $datefrom : time()), "%Y");
5891
                }
5892
                print '"></td></tr>';
5893
5894
                // Complementary action
5895
                if ((isModEnabled('bank') || isModEnabled('invoice')) && !getDolGlobalString('ADHERENT_SUBSCRIPTION_HIDECOMPLEMENTARYACTIONS')) {
5896
                    $company = new Societe($db);
5897
                    if ($object->socid) {
5898
                        $result = $company->fetch($object->socid);
5899
                    }
5900
5901
                    // No more action
5902
                    print '<tr><td class="tdtop fieldrequired">' . $langs->trans('MoreActions');
5903
                    print '</td>';
5904
                    print '<td class="line-height-large">';
5905
5906
                    print '<input type="radio" class="moreaction" id="none" name="paymentsave" value="none"' . (empty($bankdirect) && empty($invoiceonly) && empty($bankviainvoice) ? ' checked' : '') . '>';
5907
                    print '<label for="none"> ' . $langs->trans("None") . '</label><br>';
5908
                    // Add entry into bank account
5909
                    if (isModEnabled('bank')) {
5910
                        print '<input type="radio" class="moreaction" id="bankdirect" name="paymentsave" value="bankdirect"' . (!empty($bankdirect) ? ' checked' : '');
5911
                        print '><label for="bankdirect">  ' . $langs->trans("MoreActionBankDirect") . '</label><br>';
5912
                    }
5913
                    // Add invoice with no payments
5914
                    if (isModEnabled('societe') && isModEnabled('invoice')) {
5915
                        print '<input type="radio" class="moreaction" id="invoiceonly" name="paymentsave" value="invoiceonly"' . (!empty($invoiceonly) ? ' checked' : '');
5916
                        //if (empty($object->fk_soc)) print ' disabled';
5917
                        print '><label for="invoiceonly"> ' . $langs->trans("MoreActionInvoiceOnly");
5918
                        if ($object->fk_soc) {
5919
                            print ' (' . $langs->trans("ThirdParty") . ': ' . $company->getNomUrl(1) . ')';
5920
                        } else {
5921
                            print ' (';
5922
                            if (empty($object->fk_soc)) {
5923
                                print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
5924
                            }
5925
                            print $langs->trans("NoThirdPartyAssociatedToMember");
5926
                            print ' - <a href="' . $_SERVER['PHP_SELF'] . '?rowid=' . $object->id . '&amp;action=create_thirdparty">';
5927
                            print $langs->trans("CreateDolibarrThirdParty");
5928
                            print '</a>)';
5929
                        }
5930
                        if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
5931
                            print '. <span class="opacitymedium">' . $langs->trans("NoVatOnSubscription", 0) . '</span>';
5932
                        }
5933
                        if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
5934
                            $prodtmp = new Product($db);
5935
                            $result = $prodtmp->fetch(getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
5936
                            if ($result < 0) {
5937
                                setEventMessage($prodtmp->error, 'errors');
5938
                            }
5939
                            print '. ' . $langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
5940
                        }
5941
                        print '</label><br>';
5942
                    }
5943
                    // Add invoice with payments
5944
                    if (isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
5945
                        print '<input type="radio" class="moreaction" id="bankviainvoice" name="paymentsave" value="bankviainvoice"' . (!empty($bankviainvoice) ? ' checked' : '');
5946
                        //if (empty($object->fk_soc)) print ' disabled';
5947
                        print '><label for="bankviainvoice">  ' . $langs->trans("MoreActionBankViaInvoice");
5948
                        if ($object->socid) {
5949
                            print ' (' . $langs->trans("ThirdParty") . ': ' . $company->getNomUrl(1) . ')';
5950
                        } else {
5951
                            print ' (';
5952
                            if (empty($object->socid)) {
5953
                                print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
5954
                            }
5955
                            print $langs->trans("NoThirdPartyAssociatedToMember");
5956
                            print ' - <a href="' . $_SERVER['PHP_SELF'] . '?rowid=' . $object->id . '&amp;action=create_thirdparty">';
5957
                            print $langs->trans("CreateDolibarrThirdParty");
5958
                            print '</a>)';
5959
                        }
5960
                        if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
5961
                            print '. <span class="opacitymedium">' . $langs->trans("NoVatOnSubscription", 0) . '</span>';
5962
                        }
5963
                        if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
5964
                            $prodtmp = new Product($db);
5965
                            $result = $prodtmp->fetch(getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
5966
                            if ($result < 0) {
5967
                                setEventMessage($prodtmp->error, 'errors');
5968
                            }
5969
                            print '. ' . $langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
5970
                        }
5971
                        print '</label><br>';
5972
                    }
5973
                    print '</td></tr>';
5974
5975
                    // Bank account
5976
                    print '<tr class="bankswitchclass"><td class="fieldrequired">' . $langs->trans("FinancialAccount") . '</td><td>';
5977
                    print img_picto('', 'bank_account');
5978
                    $form->select_comptes(GETPOST('accountid'), 'accountid', 0, '', 2, '', 0, 'minwidth200');
5979
                    print "</td></tr>\n";
5980
5981
                    // Payment mode
5982
                    print '<tr class="bankswitchclass"><td class="fieldrequired">' . $langs->trans("PaymentMode") . '</td><td>';
5983
                    print $form->select_types_paiements(GETPOST('operation'), 'operation', '', 2, 1, 0, 0, 1, 'minwidth200', 1);
5984
                    print "</td></tr>\n";
5985
5986
                    // Date of payment
5987
                    print '<tr class="bankswitchclass"><td class="fieldrequired">' . $langs->trans("DatePayment") . '</td><td>';
5988
                    print $form->selectDate(isset($paymentdate) ? $paymentdate : -1, 'payment', 0, 0, 1, 'subscription', 1, 1);
5989
                    print "</td></tr>\n";
5990
5991
                    print '<tr class="bankswitchclass2"><td>' . $langs->trans('Numero');
5992
                    print ' <em>(' . $langs->trans("ChequeOrTransferNumber") . ')</em>';
5993
                    print '</td>';
5994
                    print '<td><input id="fieldnum_chq" name="num_chq" type="text" size="8" value="' . (!GETPOST('num_chq') ? '' : GETPOST('num_chq')) . '"></td></tr>';
5995
5996
                    print '<tr class="bankswitchclass2 fieldrequireddyn"><td>' . $langs->trans('CheckTransmitter');
5997
                    print ' <em>(' . $langs->trans("ChequeMaker") . ')</em>';
5998
                    print '</td>';
5999
                    print '<td><input id="fieldchqemetteur" name="chqemetteur" size="32" type="text" value="' . (!GETPOST('chqemetteur') ? '' : GETPOST('chqemetteur')) . '"></td></tr>';
6000
6001
                    print '<tr class="bankswitchclass2"><td>' . $langs->trans('Bank');
6002
                    print ' <em>(' . $langs->trans("ChequeBank") . ')</em>';
6003
                    print '</td>';
6004
                    print '<td><input id="chqbank" name="chqbank" size="32" type="text" value="' . (!GETPOST('chqbank') ? '' : GETPOST('chqbank')) . '"></td></tr>';
6005
                }
6006
            }
6007
6008
            print '<tr><td></td><td></td></tr>';
6009
6010
            print '<tr><td>' . $langs->trans("SendAcknowledgementByMail") . '</td>';
6011
            print '<td>';
6012
            if (!$object->email) {
6013
                print $langs->trans("NoEMail");
6014
            } else {
6015
                $adht = new AdherentType($db);
6016
                $adht->fetch($object->typeid);
6017
6018
                // Send subscription email
6019
                $subject = '';
6020
                $msg = '';
6021
6022
                // Send subscription email
6023
                include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
6024
                $formmail = new FormMail($db);
6025
                // Set output language
6026
                $outputlangs = new Translate('', $conf);
6027
                $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
6028
                // Load traductions files required by page
6029
                $outputlangs->loadLangs(array("main", "members"));
6030
                // Get email content from template
6031
                $arraydefaultmessage = null;
6032
                $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
6033
6034
                if (!empty($labeltouse)) {
6035
                    $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
6036
                }
6037
6038
                if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
6039
                    $subject = $arraydefaultmessage->topic;
6040
                    $msg     = $arraydefaultmessage->content;
6041
                }
6042
6043
                $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
6044
                complete_substitutions_array($substitutionarray, $outputlangs, $object);
6045
                $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
6046
                $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
6047
6048
                $tmp = '<input name="sendmail" type="checkbox"' . (GETPOST('sendmail', 'alpha') ? ' checked' : (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? ' checked' : '')) . '>';
6049
                $helpcontent = '';
6050
                $helpcontent .= '<b>' . $langs->trans("MailFrom") . '</b>: ' . getDolGlobalString('ADHERENT_MAIL_FROM') . '<br>' . "\n";
6051
                $helpcontent .= '<b>' . $langs->trans("MailRecipient") . '</b>: ' . $object->email . '<br>' . "\n";
6052
                $helpcontent .= '<b>' . $langs->trans("MailTopic") . '</b>:<br>' . "\n";
6053
                if ($subjecttosend) {
6054
                    $helpcontent .= $subjecttosend . "\n";
6055
                } else {
6056
                    $langs->load("errors");
6057
                    $helpcontent .= '<span class="error">' . $langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")) . '</span>' . "\n";
6058
                }
6059
                $helpcontent .= "<br>";
6060
                $helpcontent .= '<b>' . $langs->trans("MailText") . '</b>:<br>';
6061
                if ($texttosend) {
6062
                    $helpcontent .= dol_htmlentitiesbr($texttosend) . "\n";
6063
                } else {
6064
                    $langs->load("errors");
6065
                    $helpcontent .= '<span class="error">' . $langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")) . '</span>' . "\n";
6066
                }
6067
                // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
6068
                print $form->textwithpicto($tmp, $helpcontent, 1, 'help', '', 0, 2, 'helpemailtosend');
6069
            }
6070
            print '</td></tr>';
6071
            print '</tbody>';
6072
            print '</table>';
6073
            print '</div>';
6074
6075
            print dol_get_fiche_end();
6076
6077
            print '<div class="center">';
6078
            $parameters = array();
6079
            $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action);
6080
            if (empty($reshook)) {
6081
                print '<input type="submit" class="button" name="add" value="' . $langs->trans("AddSubscription") . '">';
6082
                print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
6083
                print '<input type="submit" class="button button-cancel" name="cancel" value="' . $langs->trans("Cancel") . '">';
6084
            }
6085
            print '</div>';
6086
6087
            print '</form>';
6088
6089
            print "\n<!-- End form subscription -->\n\n";
6090
        }
6091
6092
6093
// End of page
6094
        llxFooter();
6095
        $db->close();
6096
    }
6097
6098
    /**
6099
     *      \file       htdocs/adherents/type.php
6100
     *      \ingroup    member
6101
     *      \brief      Member's type setup
6102
     */
6103
    public function type()
6104
    {
6105
        global $conf;
6106
        global $db;
6107
        global $user;
6108
        global $hookmanager;
6109
        global $user;
6110
        global $menumanager;
6111
        global $langs;
6112
6113
// Load translation files required by the page
6114
        $langs->load("members");
6115
6116
        $rowid  = GETPOSTINT('rowid');
6117
        $action = GETPOST('action', 'aZ09');
6118
        $massaction = GETPOST('massaction', 'alpha');
6119
        $cancel = GETPOST('cancel', 'alpha');
6120
        $toselect   = GETPOST('toselect', 'array');
6121
        $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)) . basename(__FILE__, '.php')); // To manage different context of search
6122
        $backtopage = GETPOST('backtopage', 'alpha');
6123
        $mode = GETPOST('mode', 'alpha');
6124
6125
        $sall = GETPOST("sall", "alpha");
6126
        $filter = GETPOST("filter", 'alpha');
6127
        $search_ref = GETPOST('search_ref', 'alpha');
6128
        $search_lastname = GETPOST('search_lastname', 'alpha');
6129
        $search_login = GETPOST('search_login', 'alpha');
6130
        $search_email = GETPOST('search_email', 'alpha');
6131
        $type = GETPOST('type', 'intcomma');
6132
        $status = GETPOST('status', 'alpha');
6133
        $optioncss = GETPOST('optioncss', 'alpha');
6134
6135
// Load variable for pagination
6136
        $limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
6137
        $sortfield = GETPOST('sortfield', 'aZ09comma');
6138
        $sortorder = GETPOST('sortorder', 'aZ09comma');
6139
        $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
6140
        if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
6141
            // If $page is not defined, or '' or -1 or if we click on clear filters
6142
            $page = 0;
6143
        }
6144
        $offset = $limit * $page;
6145
        $pageprev = $page - 1;
6146
        $pagenext = $page + 1;
6147
        if (!$sortorder) {
6148
            $sortorder = "DESC";
6149
        }
6150
        if (!$sortfield) {
6151
            $sortfield = "d.lastname";
6152
        }
6153
6154
        $label = GETPOST("label", "alpha");
6155
        $morphy = GETPOST("morphy", "alpha");
6156
        $status = GETPOSTINT("status");
6157
        $subscription = GETPOSTINT("subscription");
6158
        $amount = GETPOST('amount', 'alpha');
6159
        $duration_value = GETPOSTINT('duration_value');
6160
        $duration_unit = GETPOST('duration_unit', 'alpha');
6161
        $vote = GETPOSTINT("vote");
6162
        $comment = GETPOST("comment", 'restricthtml');
6163
        $mail_valid = GETPOST("mail_valid", 'restricthtml');
6164
        $caneditamount = GETPOSTINT("caneditamount");
6165
6166
// Initialize technical objects
6167
        $object = new AdherentType($db);
6168
        $extrafields = new ExtraFields($db);
6169
        $hookmanager->initHooks(array('membertypecard', 'globalcard'));
6170
6171
// Fetch optionals attributes and labels
6172
        $extrafields->fetch_name_optionals_label($object->table_element);
6173
6174
// Security check
6175
        $result = restrictedArea($user, 'adherent', $rowid, 'adherent_type');
6176
6177
6178
        /*
6179
         *  Actions
6180
         */
6181
6182
        if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
6183
            $search_ref = "";
6184
            $search_lastname = "";
6185
            $search_login = "";
6186
            $search_email = "";
6187
            $type = "";
6188
            $sall = "";
6189
        }
6190
6191
        if (GETPOST('cancel', 'alpha')) {
6192
            $action = 'list';
6193
            $massaction = '';
6194
        }
6195
        if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
6196
            $massaction = '';
6197
        }
6198
6199
        if ($cancel) {
6200
            $action = '';
6201
6202
            if (!empty($backtopage)) {
6203
                header("Location: " . $backtopage);
6204
                exit;
6205
            }
6206
        }
6207
6208
        if ($action == 'add' && $user->hasRight('adherent', 'configurer')) {
6209
            $object->label = trim($label);
6210
            $object->morphy = trim($morphy);
6211
            $object->status = (int) $status;
6212
            $object->subscription = (int) $subscription;
6213
            $object->amount = ($amount == '' ? '' : price2num($amount, 'MT'));
6214
            $object->caneditamount = $caneditamount;
6215
            $object->duration_value = $duration_value;
6216
            $object->duration_unit = $duration_unit;
6217
            $object->note_public = trim($comment);
6218
            $object->note_private = '';
6219
            $object->mail_valid = trim($mail_valid);
6220
            $object->vote = (int) $vote;
6221
6222
            // Fill array 'array_options' with data from add form
6223
            $ret = $extrafields->setOptionalsFromPost(null, $object);
6224
            if ($ret < 0) {
6225
                $error++;
6226
            }
6227
6228
            if (empty($object->label)) {
6229
                $error++;
6230
                setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Label")), null, 'errors');
6231
            } else {
6232
                $sql = "SELECT libelle FROM " . MAIN_DB_PREFIX . "adherent_type WHERE libelle = '" . $db->escape($object->label) . "'";
6233
                $sql .= " WHERE entity IN (" . getEntity('member_type') . ")";
6234
                $result = $db->query($sql);
6235
                $num = null;
6236
                if ($result) {
6237
                    $num = $db->num_rows($result);
6238
                }
6239
                if ($num) {
6240
                    $error++;
6241
                    $langs->load("errors");
6242
                    setEventMessages($langs->trans("ErrorLabelAlreadyExists", $login), null, 'errors');
6243
                }
6244
            }
6245
6246
            if (!$error) {
6247
                $id = $object->create($user);
6248
                if ($id > 0) {
6249
                    header("Location: " . $_SERVER['PHP_SELF']);
6250
                    exit;
6251
                } else {
6252
                    setEventMessages($object->error, $object->errors, 'errors');
6253
                    $action = 'create';
6254
                }
6255
            } else {
6256
                $action = 'create';
6257
            }
6258
        }
6259
6260
        if ($action == 'update' && $user->hasRight('adherent', 'configurer')) {
6261
            $object->fetch($rowid);
6262
6263
            $object->oldcopy = dol_clone($object, 2);
6264
6265
            $object->label = trim($label);
6266
            $object->morphy = trim($morphy);
6267
            $object->status = (int) $status;
6268
            $object->subscription = (int) $subscription;
6269
            $object->amount = ($amount == '' ? '' : price2num($amount, 'MT'));
6270
            $object->caneditamount = $caneditamount;
6271
            $object->duration_value = $duration_value;
6272
            $object->duration_unit = $duration_unit;
6273
            $object->note_public = trim($comment);
6274
            $object->note_private = '';
6275
            $object->mail_valid = trim($mail_valid);
6276
            $object->vote = (bool) trim($vote);
6277
6278
            // Fill array 'array_options' with data from add form
6279
            $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
6280
            if ($ret < 0) {
6281
                $error++;
6282
            }
6283
6284
            $ret = $object->update($user);
6285
6286
            if ($ret >= 0 && !count($object->errors)) {
6287
                setEventMessages($langs->trans("MemberTypeModified"), null, 'mesgs');
6288
            } else {
6289
                setEventMessages($object->error, $object->errors, 'errors');
6290
            }
6291
6292
            header("Location: " . $_SERVER['PHP_SELF'] . "?rowid=" . $object->id);
6293
            exit;
6294
        }
6295
6296
        if ($action == 'confirm_delete' && $user->hasRight('adherent', 'configurer')) {
6297
            $object->fetch($rowid);
6298
            $res = $object->delete($user);
6299
6300
            if ($res > 0) {
6301
                setEventMessages($langs->trans("MemberTypeDeleted"), null, 'mesgs');
6302
                header("Location: " . $_SERVER['PHP_SELF']);
6303
                exit;
6304
            } else {
6305
                setEventMessages($langs->trans("MemberTypeCanNotBeDeleted"), null, 'errors');
6306
                $action = '';
6307
            }
6308
        }
6309
6310
6311
        /*
6312
         * View
6313
         */
6314
6315
        $form = new Form($db);
6316
        $formproduct = new FormProduct($db);
6317
6318
        $help_url = 'EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder';
6319
6320
        llxHeader('', $langs->trans("MembersTypeSetup"), $help_url);
6321
6322
        $arrayofselected = is_array($toselect) ? $toselect : array();
6323
6324
// List of members type
6325
        if (!$rowid && $action != 'create' && $action != 'edit') {
6326
            //print dol_get_fiche_head('');
6327
6328
            $sql = "SELECT d.rowid, d.libelle as label, d.subscription, d.amount, d.caneditamount, d.vote, d.statut as status, d.morphy, d.duration";
6329
            $sql .= " FROM " . MAIN_DB_PREFIX . "adherent_type as d";
6330
            $sql .= " WHERE d.entity IN (" . getEntity('member_type') . ")";
6331
6332
            $result = $db->query($sql);
6333
            if ($result) {
6334
                $num = $db->num_rows($result);
6335
                $nbtotalofrecords = $num;
6336
6337
                $i = 0;
6338
6339
                $param = '';
6340
                if (!empty($mode)) {
6341
                    $param .= '&mode' . urlencode($mode);
6342
                }
6343
                if (!empty($contextpage) && $contextpage != $_SERVER['PHP_SELF']) {
6344
                    $param .= '&contextpage=' . $contextpage;
6345
                }
6346
                if ($limit > 0 && $limit != $conf->liste_limit) {
6347
                    $param .= '&limit=' . $limit;
6348
                }
6349
6350
                $newcardbutton = '';
6351
6352
                $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER['PHP_SELF'] . '?mode=common' . preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss' => 'reposition'));
6353
                $newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER['PHP_SELF'] . '?mode=kanban' . preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss' => 'reposition'));
6354
6355
                if ($user->hasRight('adherent', 'configurer')) {
6356
                    $newcardbutton .= dolGetButtonTitleSeparator();
6357
                    $newcardbutton .= dolGetButtonTitle($langs->trans('NewMemberType'), '', 'fa fa-plus-circle', DOL_URL_ROOT . '/adherents/type.php?action=create');
6358
                }
6359
6360
                print '<form method="POST" action="' . $_SERVER['PHP_SELF'] . '">';
6361
                if ($optioncss != '') {
6362
                    print '<input type="hidden" name="optioncss" value="' . $optioncss . '">';
6363
                }
6364
                print '<input type="hidden" name="token" value="' . newToken() . '">';
6365
                print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
6366
                print '<input type="hidden" name="action" value="list">';
6367
                print '<input type="hidden" name="sortfield" value="' . $sortfield . '">';
6368
                print '<input type="hidden" name="sortorder" value="' . $sortorder . '">';
6369
                print '<input type="hidden" name="mode" value="' . $mode . '">';
6370
6371
6372
                print_barre_liste($langs->trans("MembersTypes"), $page, $_SERVER['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'members', 0, $newcardbutton, '', $limit, 0, 0, 1);
6373
6374
                $moreforfilter = '';
6375
6376
                print '<div class="div-table-responsive">';
6377
                print '<table class="tagtable liste' . ($moreforfilter ? " listwithfilterbefore" : "") . '">' . "\n";
6378
6379
                print '<tr class="liste_titre">';
6380
                if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6381
                    print '<th>&nbsp;</th>';
6382
                }
6383
                print '<th>' . $langs->trans("Ref") . '</th>';
6384
                print '<th>' . $langs->trans("Label") . '</th>';
6385
                print '<th class="center">' . $langs->trans("MembersNature") . '</th>';
6386
                print '<th class="center">' . $langs->trans("MembershipDuration") . '</th>';
6387
                print '<th class="center">' . $langs->trans("SubscriptionRequired") . '</th>';
6388
                print '<th class="center">' . $langs->trans("Amount") . '</th>';
6389
                print '<th class="center">' . $langs->trans("CanEditAmountShort") . '</th>';
6390
                print '<th class="center">' . $langs->trans("VoteAllowed") . '</th>';
6391
                print '<th class="center">' . $langs->trans("Status") . '</th>';
6392
                if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6393
                    print '<th>&nbsp;</th>';
6394
                }
6395
                print "</tr>\n";
6396
6397
                $membertype = new AdherentType($db);
6398
6399
                $i = 0;
6400
                $savnbfield = 9;
6401
                /*$savnbfield = $totalarray['nbfield'];
6402
                $totalarray = array();
6403
                $totalarray['nbfield'] = 0;*/
6404
6405
                $imaxinloop = ($limit ? min($num, $limit) : $num);
6406
                while ($i < $imaxinloop) {
6407
                    $objp = $db->fetch_object($result);
6408
6409
                    $membertype->id = $objp->rowid;
6410
                    $membertype->ref = $objp->rowid;
6411
                    $membertype->label = $objp->rowid;
6412
                    $membertype->status = $objp->status;
6413
                    $membertype->subscription = $objp->subscription;
6414
                    $membertype->amount = $objp->amount;
6415
                    $membertype->caneditamount = $objp->caneditamount;
6416
6417
                    if ($mode == 'kanban') {
6418
                        if ($i == 0) {
6419
                            print '<tr class="trkanban"><td colspan="' . $savnbfield . '">';
6420
                            print '<div class="box-flex-container kanban">';
6421
                        }
6422
                        //output kanban
6423
                        $membertype->label = $objp->label;
6424
                        print $membertype->getKanbanView('', array('selected' => in_array($object->id, $arrayofselected)));
6425
                        if ($i == ($imaxinloop - 1)) {
6426
                            print '</div>';
6427
                            print '</td></tr>';
6428
                        }
6429
                    } else {
6430
                        print '<tr class="oddeven">';
6431
                        if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6432
                            if ($user->hasRight('adherent', 'configurer')) {
6433
                                print '<td class="center"><a class="editfielda" href="' . $_SERVER['PHP_SELF'] . '?action=edit&rowid=' . $objp->rowid . '">' . img_edit() . '</a></td>';
6434
                            }
6435
                        }
6436
                        print '<td class="nowraponall">';
6437
                        print $membertype->getNomUrl(1);
6438
                        //<a href="'.$_SERVER['PHP_SELF'].'?rowid='.$objp->rowid.'">'.img_object($langs->trans("ShowType"),'group').' '.$objp->rowid.'</a>
6439
                        print '</td>';
6440
                        print '<td>' . dol_escape_htmltag($objp->label) . '</td>';
6441
                        print '<td class="center">';
6442
                        if ($objp->morphy == 'phy') {
6443
                            print $langs->trans("Physical");
6444
                        } elseif ($objp->morphy == 'mor') {
6445
                            print $langs->trans("Moral");
6446
                        } else {
6447
                            print $langs->trans("MorAndPhy");
6448
                        }
6449
                        print '</td>';
6450
                        print '<td class="center nowrap">';
6451
                        if ($objp->duration) {
6452
                            $duration_value = intval($objp->duration);
6453
                            if ($duration_value > 1) {
6454
                                $dur = array("i" => $langs->trans("Minutes"), "h" => $langs->trans("Hours"), "d" => $langs->trans("Days"), "w" => $langs->trans("Weeks"), "m" => $langs->trans("Months"), "y" => $langs->trans("Years"));
6455
                            } else {
6456
                                $dur = array("i" => $langs->trans("Minute"), "h" => $langs->trans("Hour"), "d" => $langs->trans("Day"), "w" => $langs->trans("Week"), "m" => $langs->trans("Month"), "y" => $langs->trans("Year"));
6457
                            }
6458
                            $unit = preg_replace("/[^a-zA-Z]+/", "", $objp->duration);
6459
                            print max(1, $duration_value) . ' ' . $dur[$unit];
6460
                        }
6461
                        print '</td>';
6462
                        print '<td class="center">' . yn($objp->subscription) . '</td>';
6463
                        print '<td class="center"><span class="amount">' . (is_null($objp->amount) || $objp->amount === '' ? '' : price($objp->amount)) . '</span></td>';
6464
                        print '<td class="center">' . yn($objp->caneditamount) . '</td>';
6465
                        print '<td class="center">' . yn($objp->vote) . '</td>';
6466
                        print '<td class="center">' . $membertype->getLibStatut(5) . '</td>';
6467
                        if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6468
                            if ($user->hasRight('adherent', 'configurer')) {
6469
                                print '<td class="right"><a class="editfielda" href="' . $_SERVER['PHP_SELF'] . '?action=edit&rowid=' . $objp->rowid . '">' . img_edit() . '</a></td>';
6470
                            }
6471
                        }
6472
                        print "</tr>";
6473
                    }
6474
                    $i++;
6475
                }
6476
6477
                // If no record found
6478
                if ($num == 0) {
6479
                    /*$colspan = 1;
6480
                    foreach ($arrayfields as $key => $val) {
6481
                        if (!empty($val['checked'])) {
6482
                            $colspan++;
6483
                        }
6484
                    }*/
6485
                    $colspan = 9;
6486
                    print '<tr><td colspan="' . $colspan . '" class="opacitymedium">' . $langs->trans("NoRecordFound") . '</td></tr>';
6487
                }
6488
6489
                print "</table>";
6490
                print '</div>';
6491
6492
                print '</form>';
6493
            } else {
6494
                dol_print_error($db);
6495
            }
6496
        }
6497
6498
// Creation
6499
        if ($action == 'create') {
6500
            $object = new AdherentType($db);
6501
6502
            print load_fiche_titre($langs->trans("NewMemberType"), '', 'members');
6503
6504
            print '<form action="' . $_SERVER['PHP_SELF'] . '" method="POST">';
6505
            print '<input type="hidden" name="token" value="' . newToken() . '">';
6506
            print '<input type="hidden" name="action" value="add">';
6507
6508
            print dol_get_fiche_head('');
6509
6510
            print '<table class="border centpercent">';
6511
            print '<tbody>';
6512
6513
            print '<tr><td class="titlefieldcreate fieldrequired">' . $langs->trans("Label") . '</td><td><input type="text" class="minwidth200" name="label" autofocus="autofocus"></td></tr>';
6514
6515
            print '<tr><td>' . $langs->trans("Status") . '</td><td>';
6516
            print $form->selectarray('status', array('0' => $langs->trans('ActivityCeased'), '1' => $langs->trans('InActivity')), 1, 0, 0, 0, '', 0, 0, 0, '', 'minwidth100');
6517
            print '</td></tr>';
6518
6519
            // Morphy
6520
            $morphys = array();
6521
            $morphys[""] = $langs->trans("MorAndPhy");
6522
            $morphys["phy"] = $langs->trans("Physical");
6523
            $morphys["mor"] = $langs->trans("Moral");
6524
            print '<tr><td><span>' . $langs->trans("MembersNature") . '</span></td><td>';
6525
            print $form->selectarray("morphy", $morphys, GETPOSTISSET("morphy") ? GETPOST("morphy", 'aZ09') : 'morphy');
6526
            print "</td></tr>";
6527
6528
            print '<tr><td>' . $form->textwithpicto($langs->trans("SubscriptionRequired"), $langs->trans("SubscriptionRequiredDesc")) . '</td><td>';
6529
            print $form->selectyesno("subscription", 1, 1);
6530
            print '</td></tr>';
6531
6532
            print '<tr><td>' . $langs->trans("Amount") . '</td><td>';
6533
            print '<input name="amount" size="5" value="' . (GETPOSTISSET('amount') ? GETPOST('amount') : price($amount)) . '">';
6534
            print '</td></tr>';
6535
6536
            print '<tr><td>' . $form->textwithpicto($langs->trans("CanEditAmountShort"), $langs->transnoentities("CanEditAmount")) . '</td><td>';
6537
            print $form->selectyesno("caneditamount", GETPOSTISSET('caneditamount') ? GETPOST('caneditamount') : 0, 1);
6538
            print '</td></tr>';
6539
6540
            print '<tr><td>' . $langs->trans("VoteAllowed") . '</td><td>';
6541
            print $form->selectyesno("vote", GETPOSTISSET("vote") ? GETPOST('vote', 'aZ09') : 1, 1);
6542
            print '</td></tr>';
6543
6544
            print '<tr><td>' . $langs->trans("Duration") . '</td><td colspan="3">';
6545
            print '<input name="duration_value" size="5" value="' . GETPOST('duraction_unit', 'aZ09') . '"> ';
6546
            print $formproduct->selectMeasuringUnits("duration_unit", "time", GETPOSTISSET("duration_unit") ? GETPOST('duration_unit', 'aZ09') : 'y', 0, 1);
6547
            print '</td></tr>';
6548
6549
            print '<tr><td class="tdtop">' . $langs->trans("Description") . '</td><td>';
6550
            require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
6551
            $doleditor = new DolEditor('comment', (GETPOSTISSET('comment') ? GETPOST('comment', 'restricthtml') : $object->note_public), '', 200, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor'), 15, '90%');
6552
            $doleditor->Create();
6553
6554
            print '<tr><td class="tdtop">' . $langs->trans("WelcomeEMail") . '</td><td>';
6555
            require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
6556
            $doleditor = new DolEditor('mail_valid', GETPOSTISSET('mail_valid') ? GETPOST('mail_valid') : $object->mail_valid, '', 250, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor'), 15, '90%');
6557
            $doleditor->Create();
6558
            print '</td></tr>';
6559
6560
            // Other attributes
6561
            include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_add.tpl.php';
6562
6563
            print '<tbody>';
6564
            print "</table>\n";
6565
6566
            print dol_get_fiche_end();
6567
6568
            print $form->buttonsSaveCancel();
6569
6570
            print "</form>\n";
6571
        }
6572
6573
// View
6574
        if ($rowid > 0) {
6575
            if ($action != 'edit') {
6576
                $object = new AdherentType($db);
6577
                $object->fetch($rowid);
6578
                $object->fetch_optionals();
6579
6580
                /*
6581
                 * Confirmation deletion
6582
                 */
6583
                if ($action == 'delete') {
6584
                    print $form->formconfirm($_SERVER['PHP_SELF'] . "?rowid=" . $object->id, $langs->trans("DeleteAMemberType"), $langs->trans("ConfirmDeleteMemberType", $object->label), "confirm_delete", '', 0, 1);
6585
                }
6586
6587
                $head = member_type_prepare_head($object);
6588
6589
                print dol_get_fiche_head($head, 'card', $langs->trans("MemberType"), -1, 'group');
6590
6591
                $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/type.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
6592
6593
                dol_banner_tab($object, 'rowid', $linkback);
6594
6595
                print '<div class="fichecenter">';
6596
                print '<div class="underbanner clearboth"></div>';
6597
6598
                print '<table class="tableforfield border centpercent">';
6599
6600
                // Morphy
6601
                print '<tr><td>' . $langs->trans("MembersNature") . '</td><td class="valeur" >' . $object->getmorphylib($object->morphy) . '</td>';
6602
                print '</tr>';
6603
6604
                print '<tr><td>' . $form->textwithpicto($langs->trans("SubscriptionRequired"), $langs->trans("SubscriptionRequiredDesc")) . '</td><td>';
6605
                print yn($object->subscription);
6606
                print '</tr>';
6607
6608
                // Amount
6609
                print '<tr><td class="titlefield">' . $langs->trans("Amount") . '</td><td>';
6610
                print((is_null($object->amount) || $object->amount === '') ? '' : '<span class="amount">' . price($object->amount) . '</span>');
6611
                print '</tr>';
6612
6613
                print '<tr><td>' . $form->textwithpicto($langs->trans("CanEditAmountShort"), $langs->transnoentities("CanEditAmount")) . '</td><td>';
6614
                print yn($object->caneditamount);
6615
                print '</td></tr>';
6616
6617
                print '<tr><td>' . $langs->trans("VoteAllowed") . '</td><td>';
6618
                print yn($object->vote);
6619
                print '</tr>';
6620
6621
                print '<tr><td class="titlefield">' . $langs->trans("Duration") . '</td><td colspan="2">' . $object->duration_value . '&nbsp;';
6622
                if ($object->duration_value > 1) {
6623
                    $dur = array("i" => $langs->trans("Minutes"), "h" => $langs->trans("Hours"), "d" => $langs->trans("Days"), "w" => $langs->trans("Weeks"), "m" => $langs->trans("Months"), "y" => $langs->trans("Years"));
6624
                } elseif ($object->duration_value > 0) {
6625
                    $dur = array("i" => $langs->trans("Minute"), "h" => $langs->trans("Hour"), "d" => $langs->trans("Day"), "w" => $langs->trans("Week"), "m" => $langs->trans("Month"), "y" => $langs->trans("Year"));
6626
                }
6627
                print(!empty($object->duration_unit) && isset($dur[$object->duration_unit]) ? $langs->trans($dur[$object->duration_unit]) : '') . "&nbsp;";
6628
                print '</td></tr>';
6629
6630
                print '<tr><td class="tdtop">' . $langs->trans("Description") . '</td><td>';
6631
                print dol_string_onlythesehtmltags(dol_htmlentitiesbr($object->note_private));
6632
                print "</td></tr>";
6633
6634
                print '<tr><td class="tdtop">' . $langs->trans("WelcomeEMail") . '</td><td>';
6635
                print dol_string_onlythesehtmltags(dol_htmlentitiesbr($object->mail_valid));
6636
                print "</td></tr>";
6637
6638
                // Other attributes
6639
                include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
6640
6641
                print '</table>';
6642
                print '</div>';
6643
6644
                print dol_get_fiche_end();
6645
6646
6647
                /*
6648
                 * Buttons
6649
                 */
6650
6651
                print '<div class="tabsAction">';
6652
6653
                // Edit
6654
                if ($user->hasRight('adherent', 'configurer')) {
6655
                    print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?action=edit&token=' . newToken() . '&rowid=' . $object->id . '">' . $langs->trans("Modify") . '</a></div>';
6656
                }
6657
6658
                // Add
6659
                if ($object->morphy == 'phy') {
6660
                    $morphy = 'phy';
6661
                } elseif ($object->morphy == 'mor') {
6662
                    $morphy = 'mor';
6663
                } else {
6664
                    $morphy = '';
6665
                }
6666
6667
                if ($user->hasRight('adherent', 'configurer') && !empty($object->status)) {
6668
                    print '<div class="inline-block divButAction"><a class="butAction" href="card.php?action=create&token=' . newToken() . '&typeid=' . $object->id . ($morphy ? '&morphy=' . urlencode($morphy) : '') . '&backtopage=' . urlencode($_SERVER['PHP_SELF'] . '?rowid=' . $object->id) . '">' . $langs->trans("AddMember") . '</a></div>';
6669
                } else {
6670
                    print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="' . dol_escape_htmltag($langs->trans("NoAddMember")) . '">' . $langs->trans("AddMember") . '</a></div>';
6671
                }
6672
6673
                // Delete
6674
                if ($user->hasRight('adherent', 'configurer')) {
6675
                    print '<div class="inline-block divButAction"><a class="butActionDelete" href="' . $_SERVER['PHP_SELF'] . '?action=delete&token=' . newToken() . '&rowid=' . $object->id . '">' . $langs->trans("DeleteType") . '</a></div>';
6676
                }
6677
6678
                print "</div>";
6679
6680
6681
                // Show list of members (nearly same code than in page list.php)
6682
6683
                $membertypestatic = new AdherentType($db);
6684
6685
                $now = dol_now();
6686
6687
                $sql = "SELECT d.rowid, d.ref, d.entity, d.login, d.firstname, d.lastname, d.societe as company, d.fk_soc,";
6688
                $sql .= " d.datefin,";
6689
                $sql .= " d.email, d.photo, d.fk_adherent_type as type_id, d.morphy, d.statut as status,";
6690
                $sql .= " t.libelle as type, t.subscription, t.amount";
6691
6692
                $sqlfields = $sql; // $sql fields to remove for count total
6693
6694
                $sql .= " FROM " . MAIN_DB_PREFIX . "adherent as d, " . MAIN_DB_PREFIX . "adherent_type as t";
6695
                $sql .= " WHERE d.fk_adherent_type = t.rowid ";
6696
                $sql .= " AND d.entity IN (" . getEntity('adherent') . ")";
6697
                $sql .= " AND t.rowid = " . ((int) $object->id);
6698
                if ($sall) {
6699
                    $sql .= natural_search(array("d.firstname", "d.lastname", "d.societe", "d.email", "d.login", "d.address", "d.town", "d.note_public", "d.note_private"), $sall);
6700
                }
6701
                if ($status != '') {
6702
                    $sql .= natural_search('d.statut', $status, 2);
6703
                }
6704
                if ($action == 'search') {
6705
                    if (GETPOST('search', 'alpha')) {
6706
                        $sql .= natural_search(array("d.firstname", "d.lastname"), GETPOST('search', 'alpha'));
6707
                    }
6708
                }
6709
                if (!empty($search_ref)) {
6710
                    $sql .= natural_search("d.ref", $search_ref);
6711
                }
6712
                if (!empty($search_lastname)) {
6713
                    $sql .= natural_search(array("d.firstname", "d.lastname"), $search_lastname);
6714
                }
6715
                if (!empty($search_login)) {
6716
                    $sql .= natural_search("d.login", $search_login);
6717
                }
6718
                if (!empty($search_email)) {
6719
                    $sql .= natural_search("d.email", $search_email);
6720
                }
6721
                if ($filter == 'uptodate') {
6722
                    $sql .= " AND (datefin >= '" . $db->idate($now) . "') OR t.subscription = 0)";
6723
                }
6724
                if ($filter == 'outofdate') {
6725
                    $sql .= " AND (datefin < '" . $db->idate($now) . "' AND t.subscription = 1)";
6726
                }
6727
6728
                // Count total nb of records
6729
                $nbtotalofrecords = '';
6730
                if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
6731
                    /* The fast and low memory method to get and count full list converts the sql into a sql count */
6732
                    $sqlforcount = preg_replace('/^' . preg_quote($sqlfields, '/') . '/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
6733
                    $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
6734
                    $resql = $db->query($sqlforcount);
6735
                    if ($resql) {
6736
                        $objforcount = $db->fetch_object($resql);
6737
                        $nbtotalofrecords = $objforcount->nbtotalofrecords;
6738
                    } else {
6739
                        dol_print_error($db);
6740
                    }
6741
6742
                    if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
6743
                        $page = 0;
6744
                        $offset = 0;
6745
                    }
6746
                    $db->free($resql);
6747
                }
6748
6749
                // Complete request and execute it with limit
6750
                $sql .= $db->order($sortfield, $sortorder);
6751
                if ($limit) {
6752
                    $sql .= $db->plimit($limit + 1, $offset);
6753
                }
6754
6755
                $resql = $db->query($sql);
6756
                if ($resql) {
6757
                    $num = $db->num_rows($resql);
6758
                    $i = 0;
6759
6760
                    $titre = $langs->trans("MembersList");
6761
                    if ($status != '') {
6762
                        if ($status == '-1,1') {
6763
                            $titre = $langs->trans("MembersListQualified");
6764
                        } elseif ($status == '-1') {
6765
                            $titre = $langs->trans("MembersListToValid");
6766
                        } elseif ($status == '1' && !$filter) {
6767
                            $titre = $langs->trans("MembersListValid");
6768
                        } elseif ($status == '1' && $filter == 'uptodate') {
6769
                            $titre = $langs->trans("MembersListUpToDate");
6770
                        } elseif ($status == '1' && $filter == 'outofdate') {
6771
                            $titre = $langs->trans("MembersListNotUpToDate");
6772
                        } elseif ($status == '0') {
6773
                            $titre = $langs->trans("MembersListResiliated");
6774
                        } elseif ($status == '-2') {
6775
                            $titre = $langs->trans("MembersListExcluded");
6776
                        }
6777
                    } elseif ($action == 'search') {
6778
                        $titre = $langs->trans("MembersListQualified");
6779
                    }
6780
6781
                    if ($type > 0) {
6782
                        $membertype = new AdherentType($db);
6783
                        $result = $membertype->fetch($type);
6784
                        $titre .= " (" . $membertype->label . ")";
6785
                    }
6786
6787
                    $param = "&rowid=" . urlencode((string) ($object->id));
6788
                    if (!empty($mode)) {
6789
                        $param .= '&mode=' . urlencode($mode);
6790
                    }
6791
                    if (!empty($contextpage) && $contextpage != $_SERVER['PHP_SELF']) {
6792
                        $param .= '&contextpage=' . urlencode($contextpage);
6793
                    }
6794
                    if ($limit > 0 && $limit != $conf->liste_limit) {
6795
                        $param .= '&limit=' . ((int) $limit);
6796
                    }
6797
                    if (!empty($status)) {
6798
                        $param .= "&status=" . urlencode($status);
6799
                    }
6800
                    if (!empty($search_ref)) {
6801
                        $param .= "&search_ref=" . urlencode($search_ref);
6802
                    }
6803
                    if (!empty($search_lastname)) {
6804
                        $param .= "&search_lastname=" . urlencode($search_lastname);
6805
                    }
6806
                    if (!empty($search_firstname)) {
6807
                        $param .= "&search_firstname=" . urlencode($search_firstname);
6808
                    }
6809
                    if (!empty($search_login)) {
6810
                        $param .= "&search_login=" . urlencode($search_login);
6811
                    }
6812
                    if (!empty($search_email)) {
6813
                        $param .= "&search_email=" . urlencode($search_email);
6814
                    }
6815
                    if (!empty($filter)) {
6816
                        $param .= "&filter=" . urlencode($filter);
6817
                    }
6818
6819
                    if ($sall) {
6820
                        print $langs->trans("Filter") . " (" . $langs->trans("Lastname") . ", " . $langs->trans("Firstname") . ", " . $langs->trans("EMail") . ", " . $langs->trans("Address") . " " . $langs->trans("or") . " " . $langs->trans("Town") . "): " . $sall;
6821
                    }
6822
6823
                    print '<form method="POST" id="searchFormList" action="' . $_SERVER['PHP_SELF'] . '" name="formfilter" autocomplete="off">';
6824
                    print '<input type="hidden" name="token" value="' . newToken() . '">';
6825
                    print '<input class="flat" type="hidden" name="rowid" value="' . $object->id . '"></td>';
6826
6827
                    print_barre_liste('', $page, $_SERVER['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'generic', 0, '', '', $limit);
6828
6829
                    $moreforfilter = '';
6830
6831
                    print '<div class="div-table-responsive">';
6832
                    print '<table class="tagtable liste' . ($moreforfilter ? " listwithfilterbefore" : "") . '">' . "\n";
6833
6834
                    // Fields title search
6835
                    print '<tr class="liste_titre_filter">';
6836
6837
                    if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6838
                        print '<td class="liste_titre center maxwidthsearch">';
6839
                        $searchpicto = $form->showFilterButtons('left');
6840
                        print $searchpicto;
6841
                        print '</td>';
6842
                    }
6843
6844
                    print '<td class="liste_titre left">';
6845
                    print '<input class="flat maxwidth100" type="text" name="search_ref" value="' . dol_escape_htmltag($search_ref) . '"></td>';
6846
6847
                    print '<td class="liste_titre left">';
6848
                    print '<input class="flat maxwidth100" type="text" name="search_lastname" value="' . dol_escape_htmltag($search_lastname) . '"></td>';
6849
6850
                    print '<td class="liste_titre left">';
6851
                    print '<input class="flat maxwidth100" type="text" name="search_login" value="' . dol_escape_htmltag($search_login) . '"></td>';
6852
6853
                    print '<td class="liste_titre">&nbsp;</td>';
6854
6855
                    print '<td class="liste_titre left">';
6856
                    print '<input class="flat maxwidth100" type="text" name="search_email" value="' . dol_escape_htmltag($search_email) . '"></td>';
6857
6858
                    print '<td class="liste_titre">&nbsp;</td>';
6859
6860
                    print '<td class="liste_titre">&nbsp;</td>';
6861
6862
                    if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6863
                        print '<td class="liste_titre center nowraponall">';
6864
                        print '<input type="image" class="liste_titre" src="' . DOL_URL_ROOT . '/theme/' . $conf->theme . '/img/search.png" name="button_search" value="' . dol_escape_htmltag($langs->trans("Search")) . '" title="' . dol_escape_htmltag($langs->trans("Search")) . '">';
6865
                        print '&nbsp; ';
6866
                        print '<input type="image" class="liste_titre" src="' . DOL_URL_ROOT . '/theme/' . $conf->theme . '/img/searchclear.png" name="button_removefilter" value="' . dol_escape_htmltag($langs->trans("RemoveFilter")) . '" title="' . dol_escape_htmltag($langs->trans("RemoveFilter")) . '">';
6867
                        print '</td>';
6868
                    }
6869
6870
                    print "</tr>\n";
6871
6872
                    print '<tr class="liste_titre">';
6873
                    if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6874
                        print_liste_field_titre("Action", $_SERVER['PHP_SELF'], "", $param, "", 'width="60" align="center"', $sortfield, $sortorder);
6875
                    }
6876
                    print_liste_field_titre("Ref", $_SERVER['PHP_SELF'], "d.ref", $param, "", "", $sortfield, $sortorder);
6877
                    print_liste_field_titre("NameSlashCompany", $_SERVER['PHP_SELF'], "d.lastname", $param, "", "", $sortfield, $sortorder);
6878
                    print_liste_field_titre("Login", $_SERVER['PHP_SELF'], "d.login", $param, "", "", $sortfield, $sortorder);
6879
                    print_liste_field_titre("MemberNature", $_SERVER['PHP_SELF'], "d.morphy", $param, "", "", $sortfield, $sortorder);
6880
                    print_liste_field_titre("EMail", $_SERVER['PHP_SELF'], "d.email", $param, "", "", $sortfield, $sortorder);
6881
                    print_liste_field_titre("Status", $_SERVER['PHP_SELF'], "d.statut,d.datefin", $param, "", "", $sortfield, $sortorder);
6882
                    print_liste_field_titre("EndSubscription", $_SERVER['PHP_SELF'], "d.datefin", $param, "", 'align="center"', $sortfield, $sortorder);
6883
                    if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6884
                        print_liste_field_titre("Action", $_SERVER['PHP_SELF'], "", $param, "", 'width="60" align="center"', $sortfield, $sortorder);
6885
                    }
6886
                    print "</tr>\n";
6887
6888
                    $adh = new Adherent($db);
6889
6890
                    $imaxinloop = ($limit ? min($num, $limit) : $num);
6891
                    while ($i < $imaxinloop) {
6892
                        $objp = $db->fetch_object($resql);
6893
6894
                        $datefin = $db->jdate($objp->datefin);
6895
6896
                        $adh->id = $objp->rowid;
6897
                        $adh->ref = $objp->ref;
6898
                        $adh->login = $objp->login;
6899
                        $adh->lastname = $objp->lastname;
6900
                        $adh->firstname = $objp->firstname;
6901
                        $adh->datefin = $datefin;
6902
                        $adh->need_subscription = $objp->subscription;
6903
                        $adh->statut = $objp->status;
6904
                        $adh->email = $objp->email;
6905
                        $adh->photo = $objp->photo;
6906
6907
                        print '<tr class="oddeven">';
6908
6909
                        // Actions
6910
                        if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6911
                            print '<td class="center">';
6912
                            if ($user->hasRight('adherent', 'creer')) {
6913
                                print '<a class="editfielda marginleftonly" href="card.php?rowid=' . $objp->rowid . '&action=edit&token=' . newToken() . '&backtopage=' . urlencode($_SERVER['PHP_SELF'] . '?rowid=' . $object->id) . '">' . img_edit() . '</a>';
6914
                            }
6915
                            if ($user->hasRight('adherent', 'supprimer')) {
6916
                                print '<a class="marginleftonly" href="card.php?rowid=' . $objp->rowid . '&action=resiliate&token=' . newToken() . '">' . img_picto($langs->trans("Resiliate"), 'disable.png') . '</a>';
6917
                            }
6918
                            print "</td>";
6919
                        }
6920
6921
                        // Ref
6922
                        print "<td>";
6923
                        print $adh->getNomUrl(-1, 0, 'card', 'ref', '', -1, 0, 1);
6924
                        print "</td>\n";
6925
6926
                        // Lastname
6927
                        if ($objp->company != '') {
6928
                            print '<td><a href="card.php?rowid=' . $objp->rowid . '">' . img_object($langs->trans("ShowMember"), "user", 'class="paddingright"') . $adh->getFullName($langs, 0, -1, 20) . ' / ' . dol_trunc($objp->company, 12) . '</a></td>' . "\n";
6929
                        } else {
6930
                            print '<td><a href="card.php?rowid=' . $objp->rowid . '">' . img_object($langs->trans("ShowMember"), "user", 'class="paddingright"') . $adh->getFullName($langs, 0, -1, 32) . '</a></td>' . "\n";
6931
                        }
6932
6933
                        // Login
6934
                        print "<td>" . dol_escape_htmltag($objp->login) . "</td>\n";
6935
6936
                        // Type
6937
                        /*print '<td class="nowrap">';
6938
                        $membertypestatic->id=$objp->type_id;
6939
                        $membertypestatic->label=$objp->type;
6940
                        print $membertypestatic->getNomUrl(1,12);
6941
                        print '</td>';
6942
                        */
6943
6944
                        // Moral/Physique
6945
                        print "<td>" . $adh->getmorphylib($objp->morphy, 1) . "</td>\n";
6946
6947
                        // EMail
6948
                        print "<td>" . dol_print_email($objp->email, 0, 0, 1) . "</td>\n";
6949
6950
                        // Status
6951
                        print '<td class="nowrap">';
6952
                        print $adh->getLibStatut(2);
6953
                        print "</td>";
6954
6955
                        // Date end subscription
6956
                        if ($datefin) {
6957
                            print '<td class="nowrap center">';
6958
                            if ($datefin < dol_now() && $objp->status > 0) {
6959
                                print dol_print_date($datefin, 'day') . " " . img_warning($langs->trans("SubscriptionLate"));
6960
                            } else {
6961
                                print dol_print_date($datefin, 'day');
6962
                            }
6963
                            print '</td>';
6964
                        } else {
6965
                            print '<td class="nowrap center">';
6966
                            if (!empty($objp->subscription)) {
6967
                                print '<span class="opacitymedium">' . $langs->trans("SubscriptionNotReceived") . '</span>';
6968
                                if ($objp->status > 0) {
6969
                                    print " " . img_warning();
6970
                                }
6971
                            } else {
6972
                                print '&nbsp;';
6973
                            }
6974
                            print '</td>';
6975
                        }
6976
6977
                        // Actions
6978
                        if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
6979
                            print '<td class="center">';
6980
                            if ($user->hasRight('adherent', 'creer')) {
6981
                                print '<a class="editfielda marginleftonly" href="card.php?rowid=' . $objp->rowid . '&action=edit&token=' . newToken() . '&backtopage=' . urlencode($_SERVER['PHP_SELF'] . '?rowid=' . $object->id) . '">' . img_edit() . '</a>';
6982
                            }
6983
                            if ($user->hasRight('adherent', 'supprimer')) {
6984
                                print '<a class="marginleftonly" href="card.php?rowid=' . $objp->rowid . '&action=resiliate&token=' . newToken() . '">' . img_picto($langs->trans("Resiliate"), 'disable.png') . '</a>';
6985
                            }
6986
                            print "</td>";
6987
                        }
6988
                        print "</tr>\n";
6989
                        $i++;
6990
                    }
6991
6992
                    if ($i == 0) {
6993
                        print '<tr><td colspan="9"><span class="opacitymedium">' . $langs->trans("None") . '</span></td></tr>';
6994
                    }
6995
6996
                    print "</table>\n";
6997
                    print '</div>';
6998
                    print '</form>';
6999
                } else {
7000
                    dol_print_error($db);
7001
                }
7002
            }
7003
7004
            /* ************************************************************************** */
7005
            /*                                                                            */
7006
            /* Edition mode                                                               */
7007
            /*                                                                            */
7008
            /* ************************************************************************** */
7009
7010
            if ($action == 'edit') {
7011
                $object = new AdherentType($db);
7012
                $object->fetch($rowid);
7013
                $object->fetch_optionals();
7014
7015
                $head = member_type_prepare_head($object);
7016
7017
                print '<form method="post" action="' . $_SERVER['PHP_SELF'] . '?rowid=' . $object->id . '">';
7018
                print '<input type="hidden" name="token" value="' . newToken() . '">';
7019
                print '<input type="hidden" name="rowid" value="' . $object->id . '">';
7020
                print '<input type="hidden" name="action" value="update">';
7021
7022
                print dol_get_fiche_head($head, 'card', $langs->trans("MemberType"), 0, 'group');
7023
7024
                print '<table class="border centpercent">';
7025
7026
                print '<tr><td class="titlefield">' . $langs->trans("Ref") . '</td><td>' . $object->id . '</td></tr>';
7027
7028
                print '<tr><td class="fieldrequired">' . $langs->trans("Label") . '</td><td><input type="text" class="minwidth300" name="label" value="' . dol_escape_htmltag($object->label) . '"></td></tr>';
7029
7030
                print '<tr><td>' . $langs->trans("Status") . '</td><td>';
7031
                print $form->selectarray('status', array('0' => $langs->trans('ActivityCeased'), '1' => $langs->trans('InActivity')), $object->status, 0, 0, 0, '', 0, 0, 0, '', 'minwidth100');
7032
                print '</td></tr>';
7033
7034
                // Morphy
7035
                $morphys[""] = $langs->trans("MorAndPhy");
7036
                $morphys["phy"] = $langs->trans("Physical");
7037
                $morphys["mor"] = $langs->trans("Moral");
7038
                print '<tr><td><span>' . $langs->trans("MembersNature") . '</span></td><td>';
7039
                print $form->selectarray("morphy", $morphys, GETPOSTISSET("morphy") ? GETPOST("morphy", 'aZ09') : $object->morphy);
7040
                print "</td></tr>";
7041
7042
                print '<tr><td>' . $langs->trans("SubscriptionRequired") . '</td><td>';
7043
                print $form->selectyesno("subscription", $object->subscription, 1);
7044
                print '</td></tr>';
7045
7046
                print '<tr><td>' . $langs->trans("Amount") . '</td><td>';
7047
                print '<input name="amount" size="5" value="';
7048
                print((is_null($object->amount) || $object->amount === '') ? '' : price($object->amount));
7049
                print '">';
7050
                print '</td></tr>';
7051
7052
                print '<tr><td>' . $form->textwithpicto($langs->trans("CanEditAmountShort"), $langs->transnoentities("CanEditAmountDetail")) . '</td><td>';
7053
                print $form->selectyesno("caneditamount", $object->caneditamount, 1);
7054
                print '</td></tr>';
7055
7056
                print '<tr><td>' . $langs->trans("VoteAllowed") . '</td><td>';
7057
                print $form->selectyesno("vote", $object->vote, 1);
7058
                print '</td></tr>';
7059
7060
                print '<tr><td>' . $langs->trans("Duration") . '</td><td colspan="3">';
7061
                print '<input name="duration_value" size="5" value="' . $object->duration_value . '"> ';
7062
                print $formproduct->selectMeasuringUnits("duration_unit", "time", ($object->duration_unit === '' ? 'y' : $object->duration_unit), 0, 1);
7063
                print '</td></tr>';
7064
7065
                print '<tr><td class="tdtop">' . $langs->trans("Description") . '</td><td>';
7066
                require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
7067
                $doleditor = new DolEditor('comment', $object->note_public, '', 220, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor'), 15, '90%');
7068
                $doleditor->Create();
7069
                print "</td></tr>";
7070
7071
                print '<tr><td class="tdtop">' . $langs->trans("WelcomeEMail") . '</td><td>';
7072
                $doleditor = new DolEditor('mail_valid', $object->mail_valid, '', 280, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor'), 15, '90%');
7073
                $doleditor->Create();
7074
                print "</td></tr>";
7075
7076
                // Other attributes
7077
                include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_edit.tpl.php';
7078
7079
                print '</table>';
7080
7081
                print dol_get_fiche_end();
7082
7083
                print $form->buttonsSaveCancel();
7084
7085
                print "</form>";
7086
            }
7087
        }
7088
7089
// End of page
7090
        llxFooter();
7091
        $db->close();
7092
    }
7093
7094
    /**
7095
     *      \file       htdocs/adherents/type_ldap.php
7096
     *      \ingroup    ldap
7097
     *      \brief      Page fiche LDAP members types
7098
     */
7099
    public function type_ldap()
7100
    {
7101
        global $conf;
7102
        global $db;
7103
        global $user;
7104
        global $hookmanager;
7105
        global $user;
7106
        global $menumanager;
7107
        global $langs;
7108
7109
// Load translation files required by the page
7110
        $langs->loadLangs(array("admin", "members", "ldap"));
7111
7112
        $id = GETPOSTINT('rowid');
7113
        $action = GETPOST('action', 'aZ09');
7114
7115
// Security check
7116
        $result = restrictedArea($user, 'adherent', $id, 'adherent_type');
7117
7118
        $object = new AdherentType($db);
7119
        $object->fetch($id);
7120
7121
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
7122
        $hookmanager->initHooks(array('membertypeldapcard', 'globalcard'));
7123
7124
        /*
7125
         * Actions
7126
         */
7127
7128
7129
        $parameters = array();
7130
        $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
7131
        if ($reshook < 0) {
7132
            setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
7133
        }
7134
7135
        if (empty($reshook)) {
7136
            if ($action == 'dolibarr2ldap') {
7137
                $ldap = new Ldap();
7138
                $result = $ldap->connectBind();
7139
7140
                if ($result > 0) {
7141
                    $object->listMembersForMemberType('', 1);
7142
7143
                    $info = $object->_load_ldap_info();
7144
                    $dn = $object->_load_ldap_dn($info);
7145
                    $olddn = $dn; // We can say that old dn = dn as we force synchro
7146
7147
                    $result = $ldap->update($dn, $info, $user, $olddn);
7148
                }
7149
7150
                if ($result >= 0) {
7151
                    setEventMessages($langs->trans("MemberTypeSynchronized"), null, 'mesgs');
7152
                } else {
7153
                    setEventMessages($ldap->error, $ldap->errors, 'errors');
7154
                }
7155
            }
7156
        }
7157
7158
        /*
7159
         * View
7160
         */
7161
7162
        llxHeader();
7163
7164
        $form = new Form($db);
7165
7166
        $head = member_type_prepare_head($object);
7167
7168
        print dol_get_fiche_head($head, 'ldap', $langs->trans("MemberType"), -1, 'group');
7169
7170
        $linkback = '<a href="' . DOL_URL_ROOT . '/adherents/type.php?restore_lastsearch_values=1">' . $langs->trans("BackToList") . '</a>';
7171
7172
        dol_banner_tab($object, 'rowid', $linkback);
7173
7174
        print '<div class="fichecenter">';
7175
        print '<div class="underbanner clearboth"></div>';
7176
7177
        print '<table class="border centpercent">';
7178
7179
// LDAP DN
7180
        print '<tr><td>LDAP ' . $langs->trans("LDAPMemberTypeDn") . '</td><td class="valeur">' . getDolGlobalString('LDAP_MEMBER_TYPE_DN') . "</td></tr>\n";
7181
7182
// LDAP Cle
7183
        print '<tr><td>LDAP ' . $langs->trans("LDAPNamingAttribute") . '</td><td class="valeur">' . getDolGlobalString('LDAP_KEY_MEMBERS_TYPES') . "</td></tr>\n";
7184
7185
// LDAP Server
7186
        print '<tr><td>LDAP ' . $langs->trans("Type") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_TYPE') . "</td></tr>\n";
7187
        print '<tr><td>LDAP ' . $langs->trans("Version") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_PROTOCOLVERSION') . "</td></tr>\n";
7188
        print '<tr><td>LDAP ' . $langs->trans("LDAPPrimaryServer") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_HOST') . "</td></tr>\n";
7189
        print '<tr><td>LDAP ' . $langs->trans("LDAPSecondaryServer") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_HOST_SLAVE') . "</td></tr>\n";
7190
        print '<tr><td>LDAP ' . $langs->trans("LDAPServerPort") . '</td><td class="valeur">' . getDolGlobalString('LDAP_SERVER_PORT') . "</td></tr>\n";
7191
7192
        print '</table>';
7193
7194
        print '</div>';
7195
7196
        print dol_get_fiche_end();
7197
7198
        /*
7199
         * Action bar
7200
         */
7201
7202
        print '<div class="tabsAction">';
7203
7204
        if (getDolGlobalInt('LDAP_MEMBER_TYPE_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
7205
            print '<a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?rowid=' . $object->id . '&action=dolibarr2ldap">' . $langs->trans("ForceSynchronize") . '</a>';
7206
        }
7207
7208
        print "</div>\n";
7209
7210
        if (getDolGlobalInt('LDAP_MEMBER_TYPE_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
7211
            print "<br>\n";
7212
        }
7213
7214
7215
7216
// Display LDAP attributes
7217
        print load_fiche_titre($langs->trans("LDAPInformationsForThisMemberType"));
7218
7219
        print '<table width="100%" class="noborder">';
7220
7221
        print '<tr class="liste_titre">';
7222
        print '<td>' . $langs->trans("LDAPAttributes") . '</td>';
7223
        print '<td>' . $langs->trans("Value") . '</td>';
7224
        print '</tr>';
7225
7226
// LDAP reading
7227
        $ldap = new Ldap();
7228
        $result = $ldap->connectBind();
7229
        if ($result > 0) {
7230
            $info = $object->_load_ldap_info();
7231
            $dn = $object->_load_ldap_dn($info, 1);
7232
            $search = "(" . $object->_load_ldap_dn($info, 2) . ")";
7233
7234
            $records = $ldap->getAttribute($dn, $search);
7235
7236
            //print_r($records);
7237
7238
            // Show tree
7239
            if (((!is_numeric($records)) || $records != 0) && (!isset($records['count']) || $records['count'] > 0)) {
7240
                if (!is_array($records)) {
7241
                    print '<tr class="oddeven"><td colspan="2"><span class="error">' . $langs->trans("ErrorFailedToReadLDAP") . '</span></td></tr>';
7242
                } else {
7243
                    $result = show_ldap_content($records, 0, $records['count'], true);
7244
                }
7245
            } else {
7246
                print '<tr class="oddeven"><td colspan="2">' . $langs->trans("LDAPRecordNotFound") . ' (dn=' . dol_escape_htmltag($dn) . ' - search=' . dol_escape_htmltag($search) . ')</td></tr>';
7247
            }
7248
7249
            $ldap->unbind();
7250
        } else {
7251
            setEventMessages($ldap->error, $ldap->errors, 'errors');
7252
        }
7253
7254
        print '</table>';
7255
7256
// End of page
7257
        llxFooter();
7258
        $db->close();
7259
    }
7260
7261
    /**
7262
     *  \file       htdocs/adherents/type_translation.php
7263
     *  \ingroup    product
7264
     *  \brief      Member translation page
7265
     */
7266
    public function type_translation()
7267
    {
7268
        global $conf;
7269
        global $db;
7270
        global $user;
7271
        global $hookmanager;
7272
        global $user;
7273
        global $menumanager;
7274
        global $langs;
7275
7276
// Load translation files required by the page
7277
        $langs->loadLangs(array('members', 'languages'));
7278
7279
        $id = GETPOSTINT('rowid') ? GETPOSTINT('rowid') : GETPOSTINT('id');
7280
        $action = GETPOST('action', 'aZ09');
7281
        $cancel = GETPOST('cancel', 'alpha');
7282
        $ref = GETPOST('ref', 'alphanohtml');
7283
7284
// Security check
7285
        $fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
7286
        $fieldtype = (!empty($ref) ? 'ref' : 'rowid');
7287
        if ($user->socid) {
7288
            $socid = $user->socid;
7289
        }
7290
// Security check
7291
        $result = restrictedArea($user, 'adherent', $id, 'adherent_type');
7292
7293
7294
        /*
7295
         * Actions
7296
         */
7297
7298
// return to translation display if cancellation
7299
        if ($cancel == $langs->trans("Cancel")) {
7300
            $action = '';
7301
        }
7302
7303
        if ($action == 'delete' && GETPOST('langtodelete', 'alpha')) {
7304
            $object = new AdherentType($db);
7305
            $object->fetch($id);
7306
            $result = $object->delMultiLangs(GETPOST('langtodelete', 'alpha'), $user);
7307
            if ($result > 0) {
7308
                setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs');
7309
                header("Location: " . $_SERVER['PHP_SELF'] . '?id=' . $id);
7310
                exit;
7311
            }
7312
        }
7313
7314
// Add translation
7315
        if ($action == 'vadd' && $cancel != $langs->trans("Cancel") && $user->hasRight('adherent', 'configurer')) {
7316
            $object = new AdherentType($db);
7317
            $object->fetch($id);
7318
            $current_lang = $langs->getDefaultLang();
7319
7320
            $forcelangprod = GETPOST("forcelangprod", 'aZ09');
7321
7322
            // update of object
7323
            if ($forcelangprod == $current_lang) {
7324
                $object->label       = GETPOST("libelle", 'alphanohtml');
7325
                $object->description = dol_htmlcleanlastbr(GETPOST("desc", 'restricthtml'));
7326
                //$object->other         = dol_htmlcleanlastbr(GETPOST("other", 'restricthtml'));
7327
            } else {
7328
                $object->multilangs[$forcelangprod]["label"] = GETPOST("libelle", 'alphanohtml');
7329
                $object->multilangs[$forcelangprod]["description"] = dol_htmlcleanlastbr(GETPOST("desc", 'restricthtml'));
7330
                //$object->multilangs[$forcelangprod]["other"] = dol_htmlcleanlastbr(GETPOST("other", 'restricthtml'));
7331
            }
7332
7333
            // backup into database
7334
            if ($object->setMultiLangs($user) > 0) {
7335
                $action = '';
7336
            } else {
7337
                $action = 'create';
7338
                setEventMessages($object->error, $object->errors, 'errors');
7339
            }
7340
        }
7341
7342
// Edit translation
7343
        if ($action == 'vedit' && $cancel != $langs->trans("Cancel") && $user->hasRight('adherent', 'configurer')) {
7344
            $object = new AdherentType($db);
7345
            $object->fetch($id);
7346
            $current_lang = $langs->getDefaultLang();
7347
7348
            foreach ($object->multilangs as $key => $value) { // saving new values in the object
7349
                if ($key == $current_lang) {
7350
                    $object->label          = GETPOST("libelle-" . $key, 'alphanohtml');
7351
                    $object->description = dol_htmlcleanlastbr(GETPOST("desc-" . $key, 'restricthtml'));
7352
                    $object->other          = dol_htmlcleanlastbr(GETPOST("other-" . $key, 'restricthtml'));
7353
                } else {
7354
                    $object->multilangs[$key]["label"]          = GETPOST("libelle-" . $key, 'alphanohtml');
7355
                    $object->multilangs[$key]["description"] = dol_htmlcleanlastbr(GETPOST("desc-" . $key, 'restricthtml'));
7356
                    $object->multilangs[$key]["other"]          = dol_htmlcleanlastbr(GETPOST("other-" . $key, 'restricthtml'));
7357
                }
7358
            }
7359
7360
            if ($object->setMultiLangs($user) > 0) {
7361
                $action = '';
7362
            } else {
7363
                $action = 'edit';
7364
                setEventMessages($object->error, $object->errors, 'errors');
7365
            }
7366
        }
7367
7368
// Delete translation
7369
        if ($action == 'vdelete' && $cancel != $langs->trans("Cancel") && $user->hasRight('adherent', 'configurer')) {
7370
            $object = new AdherentType($db);
7371
            $object->fetch($id);
7372
            $langtodelete = GETPOST('langdel', 'alpha');
7373
7374
7375
            if ($object->delMultiLangs($langtodelete, $user) > 0) {
7376
                $action = '';
7377
            } else {
7378
                $action = 'edit';
7379
                setEventMessages($object->error, $object->errors, 'errors');
7380
            }
7381
        }
7382
7383
        $object = new AdherentType($db);
7384
        $result = $object->fetch($id);
7385
7386
7387
        /*
7388
         * View
7389
         */
7390
7391
        $title = $langs->trans('MemberTypeCard');
7392
7393
        $help_url = '';
7394
7395
        $shortlabel = dol_trunc($object->label, 16);
7396
7397
        $title = $langs->trans('MemberType') . " " . $shortlabel . " - " . $langs->trans('Translation');
7398
7399
        $help_url = 'EN:Module_Services_En|FR:Module_Services|ES:M&oacute;dulo_Servicios|DE:Modul_Mitglieder';
7400
7401
        llxHeader('', $title, $help_url);
7402
7403
        $form = new Form($db);
7404
        $formadmin = new FormAdmin($db);
7405
7406
        $head = member_type_prepare_head($object);
7407
        $titre = $langs->trans("MemberType" . $object->id);
7408
7409
// Calculate $cnt_trans
7410
        $cnt_trans = 0;
7411
        if (!empty($object->multilangs)) {
7412
            foreach ($object->multilangs as $key => $value) {
7413
                $cnt_trans++;
7414
            }
7415
        }
7416
7417
7418
        print dol_get_fiche_head($head, 'translation', $titre, 0, 'group');
7419
7420
        $linkback = '<a href="' . dol_buildpath('/adherents/type.php', 1) . '">' . $langs->trans("BackToList") . '</a>';
7421
7422
        dol_banner_tab($object, 'rowid', $linkback);
7423
7424
        print dol_get_fiche_end();
7425
7426
7427
7428
        /*
7429
         * Action bar
7430
         */
7431
        print "\n<div class=\"tabsAction\">\n";
7432
7433
        if ($action == '') {
7434
            if ($user->hasRight('produit', 'creer') || $user->hasRight('service', 'creer')) {
7435
                print '<a class="butAction" href="' . DOL_URL_ROOT . '/adherents/type_translation.php?action=create&token=' . newToken() . '&rowid=' . $object->id . '">' . $langs->trans("Add") . '</a>';
7436
                if ($cnt_trans > 0) {
7437
                    print '<a class="butAction" href="' . DOL_URL_ROOT . '/adherents/type_translation.php?action=edit&token=' . newToken() . '&rowid=' . $object->id . '">' . $langs->trans("Update") . '</a>';
7438
                }
7439
            }
7440
        }
7441
7442
        print "\n</div>\n";
7443
7444
7445
7446
        if ($action == 'edit') {
7447
            //WYSIWYG Editor
7448
            require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
7449
7450
            print '<form action="' . $_SERVER['PHP_SELF'] . '" method="POST">';
7451
            print '<input type="hidden" name="token" value="' . newToken() . '">';
7452
            print '<input type="hidden" name="action" value="vedit">';
7453
            print '<input type="hidden" name="rowid" value="' . $object->id . '">';
7454
7455
            if (!empty($object->multilangs)) {
7456
                foreach ($object->multilangs as $key => $value) {
7457
                    $s = picto_from_langcode($key);
7458
                    print '<br>';
7459
                    print '<div class="inline-block marginbottomonly">';
7460
                    print($s ? $s . ' ' : '') . '<b>' . $langs->trans('Language_' . $key) . ':</b>';
7461
                    print '</div>';
7462
                    print '<div class="inline-block marginbottomonly floatright">';
7463
                    print '<a href="' . $_SERVER['PHP_SELF'] . '?rowid=' . $object->id . '&action=delete&token=' . newToken() . '&langtodelete=' . $key . '">' . img_delete('', 'class="valigntextbottom"') . "</a><br>";
7464
                    print '</div>';
7465
7466
                    print '<div class="underbanner clearboth"></div>';
7467
                    print '<table class="border centpercent">';
7468
                    print '<tr><td class="tdtop titlefieldcreate fieldrequired">' . $langs->trans('Label') . '</td><td><input name="libelle-' . $key . '" class="minwidth300" value="' . dol_escape_htmltag($object->multilangs[$key]["label"]) . '"></td></tr>';
7469
                    print '<tr><td class="tdtop">' . $langs->trans('Description') . '</td><td>';
7470
                    $doleditor = new DolEditor("desc-$key", $object->multilangs[$key]["description"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
7471
                    $doleditor->Create();
7472
                    print '</td></tr>';
7473
                    print '</td></tr>';
7474
                    print '</table>';
7475
                }
7476
            }
7477
7478
            print $form->buttonsSaveCancel();
7479
7480
            print '</form>';
7481
        } elseif ($action != 'create') {
7482
            if (!empty($object->multilangs)) {
7483
                foreach ($object->multilangs as $key => $value) {
7484
                    $s = picto_from_langcode($key);
7485
                    print '<div class="inline-block marginbottomonly">';
7486
                    print($s ? $s . ' ' : '') . '<b>' . $langs->trans('Language_' . $key) . ':</b>';
7487
                    print '</div>';
7488
                    print '<div class="inline-block marginbottomonly floatright">';
7489
                    print '<a href="' . $_SERVER['PHP_SELF'] . '?rowid=' . $object->id . '&action=delete&token=' . newToken() . '&langtodelete=' . $key . '">' . img_delete('', 'class="valigntextbottom"') . '</a>';
7490
                    print '</div>';
7491
7492
7493
                    print '<div class="fichecenter">';
7494
                    print '<div class="underbanner clearboth"></div>';
7495
                    print '<table class="border centpercent">';
7496
                    print '<tr><td class="titlefieldcreate">' . $langs->trans('Label') . '</td><td>' . $object->multilangs[$key]["label"] . '</td></tr>';
7497
                    print '<tr><td class="tdtop">' . $langs->trans('Description') . '</td><td>' . $object->multilangs[$key]["description"] . '</td></tr>';
7498
                    print '</table>';
7499
                    print '</div>';
7500
7501
                    print '<br>';
7502
                }
7503
            }
7504
            if (!$cnt_trans && $action != 'create') {
7505
                print '<div class="opacitymedium">' . $langs->trans('NoTranslation') . '</div>';
7506
            }
7507
        }
7508
7509
7510
7511
        /*
7512
         * Form to add a new translation
7513
         */
7514
7515
        if ($action == 'create' && $user->hasRight('adherent', 'configurer')) {
7516
            //WYSIWYG Editor
7517
            require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
7518
7519
            print '<br>';
7520
            print '<form action="' . $_SERVER['PHP_SELF'] . '" method="post">';
7521
            print '<input type="hidden" name="token" value="' . newToken() . '">';
7522
            print '<input type="hidden" name="action" value="vadd">';
7523
            print '<input type="hidden" name="rowid" value="' . GETPOSTINT("rowid") . '">';
7524
7525
            print dol_get_fiche_head();
7526
7527
            print '<table class="border centpercent">';
7528
            print '<tr><td class="tdtop titlefieldcreate fieldrequired">' . $langs->trans('Language') . '</td><td>';
7529
            print $formadmin->select_language('', 'forcelangprod', 0, $object->multilangs, 1);
7530
            print '</td></tr>';
7531
            print '<tr><td class="tdtop fieldrequired">' . $langs->trans('Label') . '</td><td><input name="libelle" class="minwidth300" value="' . dol_escape_htmltag(GETPOST("libelle", 'alphanohtml')) . '"></td></tr>';
7532
            print '<tr><td class="tdtop">' . $langs->trans('Description') . '</td><td>';
7533
            $doleditor = new DolEditor('desc', '', '', 160, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor'), ROWS_3, '90%');
7534
            $doleditor->Create();
7535
            print '</td></tr>';
7536
7537
            print '</table>';
7538
7539
            print dol_get_fiche_end();
7540
7541
            print $form->buttonsSaveCancel();
7542
7543
            print '</form>';
7544
7545
            print '<br>';
7546
        }
7547
7548
// End of page
7549
        llxFooter();
7550
        $db->close();
7551
    }
7552
7553
    /**
7554
     *      \file       htdocs/adherents/vcard.php
7555
     *      \ingroup    societe
7556
     *      \brief      Vcard tab of a member
7557
     */
7558
    public function vcard()
7559
    {
7560
        global $conf;
7561
        global $db;
7562
        global $user;
7563
        global $hookmanager;
7564
        global $user;
7565
        global $menumanager;
7566
        global $langs;
7567
7568
        $id = GETPOSTINT('id');
7569
        $ref = GETPOST('ref', 'alphanohtml');
7570
7571
        $object = new Adherent($db);
7572
7573
// Fetch object
7574
        if ($id > 0 || !empty($ref)) {
7575
            // Load member
7576
            $result = $object->fetch($id, $ref);
7577
7578
            // Define variables to know what current user can do on users
7579
            $canadduser = ($user->admin || $user->hasRight('user', 'user', 'creer'));
7580
            // Define variables to know what current user can do on properties of user linked to edited member
7581
            if ($object->user_id) {
7582
                // $User is the user who edits, $object->user_id is the id of the related user in the edited member
7583
                $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'creer'))
7584
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'creer')));
7585
                $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight('user', 'self', 'password'))
7586
                    || (($user->id != $object->user_id) && $user->hasRight('user', 'user', 'password')));
7587
            }
7588
        }
7589
7590
// Define variables to determine what the current user can do on the members
7591
        $canaddmember = $user->hasRight('adherent', 'creer');
7592
// Define variables to determine what the current user can do on the properties of a member
7593
        if ($id) {
7594
            $caneditfieldmember = $user->hasRight('adherent', 'creer');
7595
        }
7596
7597
// Security check
7598
        $result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
7599
7600
7601
        /*
7602
         * Actions
7603
         */
7604
7605
// None
7606
7607
7608
        /*
7609
         * View
7610
         */
7611
7612
        $company = new Societe($db);
7613
        if ($object->socid) {
7614
            $result = $company->fetch($object->socid);
7615
        }
7616
7617
7618
7619
// We create VCard
7620
        $v = new vCard();
7621
        $v->setProdId('Dolibarr ' . DOL_VERSION);
7622
7623
        $v->setUid('DOLIBARR-ADHERENTID-' . $object->id);
7624
        $v->setName($object->lastname, $object->firstname, "", $object->civility, "");
7625
        $v->setFormattedName($object->getFullName($langs, 1));
7626
7627
        $v->setPhoneNumber($object->phone_pro, "TYPE=WORK;VOICE");
7628
//$v->setPhoneNumber($object->phone_perso,"TYPE=HOME;VOICE");
7629
        $v->setPhoneNumber($object->phone_mobile, "TYPE=CELL;VOICE");
7630
        $v->setPhoneNumber($object->fax, "TYPE=WORK;FAX");
7631
7632
        $country = $object->country_code ? $object->country : '';
7633
7634
        $v->setAddress("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=WORK;POSTAL");
7635
// @phan-suppress-next-line PhanDeprecatedFunction  (setLabel is the old method, new is setAddress)
7636
        $v->setLabel("", "", $object->address, $object->town, $object->state, $object->zip, $country, "TYPE=WORK");
7637
7638
        $v->setEmail($object->email);
7639
        $v->setNote($object->note_public);
7640
        $v->setTitle($object->poste);
7641
7642
// Data from linked company
7643
        if ($company->id) {
7644
            $v->setURL($company->url, "TYPE=WORK");
7645
            if (!$object->phone_pro) {
7646
                $v->setPhoneNumber($company->phone, "TYPE=WORK;VOICE");
7647
            }
7648
            if (!$object->fax) {
7649
                $v->setPhoneNumber($company->fax, "TYPE=WORK;FAX");
7650
            }
7651
            if (!$object->zip) {
7652
                $v->setAddress("", "", $company->address, $company->town, $company->state, $company->zip, $company->country, "TYPE=WORK;POSTAL");
7653
            }
7654
            // when company e-mail is empty, use only adherent e-mail
7655
            if (empty(trim($company->email))) {
7656
                // was set before, don't set twice
7657
            } elseif (empty(trim($object->email))) {
7658
                // when adherent e-mail is empty, use only company e-mail
7659
                $v->setEmail($company->email);
7660
            } else {
7661
                $tmpobject = explode("@", trim($object->email));
7662
                $tmpcompany = explode("@", trim($company->email));
7663
7664
                if (strtolower(end($tmpobject)) == strtolower(end($tmpcompany))) {
7665
                    // when e-mail domain of adherent and company are the same, use adherent e-mail at first (and company e-mail at second)
7666
                    $v->setEmail($object->email);
7667
7668
                    // support by Microsoft Outlook (2019 and possible earlier)
7669
                    $v->setEmail($company->email, 'INTERNET');
7670
                } else {
7671
                    // when e-mail of adherent and company complete different use company e-mail at first (and adherent e-mail at second)
7672
                    $v->setEmail($company->email);
7673
7674
                    // support by Microsoft Outlook (2019 and possible earlier)
7675
                    $v->setEmail($object->email, 'INTERNET');
7676
                }
7677
            }
7678
7679
            // Si adherent lie a un tiers non de type "particulier"
7680
            if ($company->typent_code != 'TE_PRIVATE') {
7681
                $v->setOrg($company->name);
7682
            }
7683
        }
7684
7685
// Personal information
7686
        $v->setPhoneNumber($object->phone_perso, "TYPE=HOME;VOICE");
7687
        if ($object->birth) {
7688
            $v->setBirthday($object->birth);
7689
        }
7690
7691
        $db->close();
7692
7693
7694
// Renvoi la VCard au navigateur
7695
7696
        $output = $v->getVCard();
7697
7698
        $filename = trim(urldecode($v->getFileName())); // "Nom prenom.vcf"
7699
        $filenameurlencoded = dol_sanitizeFileName(urlencode($filename));
7700
//$filename = dol_sanitizeFileName($filename);
7701
7702
7703
        header("Content-Disposition: attachment; filename=\"" . $filename . "\"");
7704
        header("Content-Length: " . dol_strlen($output));
7705
        header("Connection: close");
7706
        header("Content-Type: text/x-vcard; name=\"" . $filename . "\"");
7707
7708
        print $output;
7709
    }
7710
7711
}
7712