dolibarr 22.0.5
adherent.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2002-2003 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2004-2012 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org>
6 * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
7 * Copyright (C) 2009-2017 Regis Houssin <regis.houssin@inodbox.com>
8 * Copyright (C) 2014-2018 Alexandre Spangaro <alexandre@inovea-conseil.com>
9 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
10 * Copyright (C) 2015-2025 Frédéric France <frederic.france@free.fr>
11 * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
12 * Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
13 * Copyright (C) 2018-2019 Thibault FOUCART <support@ptibogxiv.net>
14 * Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
15 * Copyright (C) 2020 Josep Lluís Amador <joseplluis@lliuretic.cat>
16 * Copyright (C) 2021 Waël Almoman <info@almoman.com>
17 * Copyright (C) 2021 Philippe Grand <philippe.grand@atoo-net.com>
18 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
19 *
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 3 of the License, or
23 * (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
29 *
30 * You should have received a copy of the GNU General Public License
31 * along with this program. If not, see <https://www.gnu.org/licenses/>.
32 */
33
39require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/class/commonpeople.class.php';
43
44
49{
50 use CommonPeople;
51
55 public $element = 'member';
56
60 public $table_element = 'adherent';
61
65 public $picto = 'member';
66
70 public $mesgs;
71
75 public $login;
76
80 public $pass;
81
85 public $pass_indatabase;
86
90 public $pass_indatabase_crypted;
91
95 public $fullname;
96
101 public $civility_id;
102
106 public $civility_code;
107
111 public $civility;
112
118 public $societe;
119
123 public $company;
124
130 public $fk_soc;
131
135 public $socid;
136
140 public $socialnetworks;
141
145 public $phone;
146
150 public $phone_perso;
151
155 public $phone_pro;
156
160 public $phone_mobile;
161
165 public $fax;
166
170 public $poste;
171
175 public $morphy;
176
180 public $public;
181
186 public $default_lang;
187
191 public $photo;
192
198 public $datec;
199
205 public $datem;
206
210 public $datevalid;
211
215 public $gender;
216
220 public $birth;
221
225 public $typeid;
226
230 public $type;
231
235 public $need_subscription;
236
240 public $user_id;
241
245 public $user_login;
246
250 public $datefin;
251
252
253 // Fields loaded by fetch_subscriptions() from member table
254
258 public $first_subscription_date;
259
263 public $first_subscription_date_start;
264
268 public $first_subscription_date_end;
269
273 public $first_subscription_amount;
274
278 public $last_subscription_date;
279
283 public $last_subscription_date_start;
284
288 public $last_subscription_date_end;
289
293 public $last_subscription_amount;
294
298 public $subscriptions = array();
299
303 public $ip;
304
305 // Fields loaded by fetchPartnerships() from partnership table
306
310 public $partnerships = array();
311
315 public $invoice;
316
317
359 public $fields = array(
360 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 10),
361 'ref' => array('type' => 'varchar(30)', 'label' => 'Ref', 'default' => '1', 'enabled' => 1, 'visible' => 1, 'notnull' => 1, 'position' => 12, 'index' => 1),
362 'entity' => array('type' => 'integer', 'label' => 'Entity', 'default' => '1', 'enabled' => 1, 'visible' => 3, 'notnull' => 1, 'position' => 15, 'index' => 1),
363 'ref_ext' => array('type' => 'varchar(128)', 'label' => 'RefExt', 'enabled' => 1, 'visible' => 0, 'position' => 20),
364 'civility' => array('type' => 'varchar(6)', 'label' => 'Civility', 'enabled' => 1, 'visible' => -1, 'position' => 25),
365 'lastname' => array('type' => 'varchar(50)', 'label' => 'Lastname', 'enabled' => 1, 'visible' => 1, 'position' => 30, 'showoncombobox' => 1),
366 'firstname' => array('type' => 'varchar(50)', 'label' => 'Firstname', 'enabled' => 1, 'visible' => 1, 'position' => 35, 'showoncombobox' => 1),
367 'login' => array('type' => 'varchar(50)', 'label' => 'Login', 'enabled' => 1, 'visible' => 1, 'position' => 40),
368 'pass' => array('type' => 'varchar(50)', 'label' => 'Pass', 'enabled' => 1, 'visible' => 3, 'position' => 45),
369 'pass_crypted' => array('type' => 'varchar(128)', 'label' => 'Pass crypted', 'enabled' => 1, 'visible' => 3, 'position' => 50),
370 'morphy' => array('type' => 'varchar(3)', 'label' => 'MemberNature', 'enabled' => 1, 'visible' => 1, 'notnull' => 1, 'position' => 55),
371 'fk_adherent_type' => array('type' => 'integer', 'label' => 'MemberType', 'enabled' => 1, 'visible' => 1, 'notnull' => 1, 'position' => 60),
372 'societe' => array('type' => 'varchar(128)', 'label' => 'Societe', 'enabled' => 1, 'visible' => 1, 'position' => 65, 'showoncombobox' => 2),
373 'fk_soc' => array('type' => 'integer:Societe:societe/class/societe.class.php', 'label' => 'ThirdParty', 'enabled' => 1, 'visible' => 1, 'position' => 70),
374 'address' => array('type' => 'text', 'label' => 'Address', 'enabled' => 1, 'visible' => -1, 'position' => 75),
375 'zip' => array('type' => 'varchar(10)', 'label' => 'Zip', 'enabled' => 1, 'visible' => -1, 'position' => 80),
376 'town' => array('type' => 'varchar(50)', 'label' => 'Town', 'enabled' => 1, 'visible' => -1, 'position' => 85),
377 'state_id' => array('type' => 'integer', 'label' => 'State', 'enabled' => 1, 'visible' => -1, 'position' => 90),
378 'country' => array('type' => 'integer:Ccountry:core/class/ccountry.class.php', 'label' => 'Country', 'enabled' => 1, 'visible' => 1, 'position' => 95),
379 'phone' => array('type' => 'varchar(30)', 'label' => 'Phone', 'enabled' => 1, 'visible' => -1, 'position' => 115),
380 'phone_perso' => array('type' => 'varchar(30)', 'label' => 'Phone perso', 'enabled' => 1, 'visible' => -1, 'position' => 120),
381 'phone_mobile' => array('type' => 'varchar(30)', 'label' => 'Phone mobile', 'enabled' => 1, 'visible' => -1, 'position' => 125),
382 'email' => array('type' => 'varchar(255)', 'label' => 'Email', 'enabled' => 1, 'visible' => 1, 'position' => 126),
383 'url' => array('type' => 'varchar(255)', 'label' => 'Url', 'enabled' => 1, 'visible' => -1, 'position' => 127),
384 'socialnetworks' => array('type' => 'text', 'label' => 'Socialnetworks', 'enabled' => 1, 'visible' => 3, 'position' => 128),
385 'birth' => array('type' => 'date', 'label' => 'DateOfBirth', 'enabled' => 1, 'visible' => -1, 'position' => 130),
386 'gender' => array('type' => 'varchar(10)', 'label' => 'Gender', 'enabled' => 1, 'visible' => -1, 'position' => 132),
387 'photo' => array('type' => 'varchar(255)', 'label' => 'Photo', 'enabled' => 1, 'visible' => -1, 'position' => 135),
388 'public' => array('type' => 'smallint(6)', 'label' => 'Public', 'enabled' => 1, 'visible' => 3, 'notnull' => 1, 'position' => 145),
389 'datefin' => array('type' => 'datetime', 'label' => 'DateEnd', 'enabled' => 1, 'visible' => 1, 'position' => 150),
390 'default_lang' => array('type' => 'varchar(6)', 'label' => 'Default lang', 'enabled' => 1, 'visible' => -1, 'position' => 153),
391 'note_public' => array('type' => 'text', 'label' => 'NotePublic', 'enabled' => 1, 'visible' => 0, 'position' => 155),
392 'note_private' => array('type' => 'text', 'label' => 'NotePrivate', 'enabled' => 1, 'visible' => 0, 'position' => 160),
393 'datevalid' => array('type' => 'datetime', 'label' => 'DateValidation', 'enabled' => 1, 'visible' => -1, 'position' => 165),
394 'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -1, 'position' => 170),
395 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 175),
396 'fk_user_author' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserCreation', 'enabled' => 1, 'visible' => 3, 'position' => 180),
397 'fk_user_mod' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModification', 'enabled' => 1, 'visible' => 3, 'position' => 185),
398 'fk_user_valid' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserValidation', 'enabled' => 1, 'visible' => 3, 'position' => 190),
399 'canvas' => array('type' => 'varchar(32)', 'label' => 'Canvas', 'enabled' => 1, 'visible' => 0, 'position' => 195),
400 'model_pdf' => array('type' => 'varchar(255)', 'label' => 'Model pdf', 'enabled' => 1, 'visible' => 0, 'position' => 800),
401 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'visible' => -2, 'position' => 805),
402 'statut' => array('type' => 'smallint(6)', 'label' => 'Statut', 'enabled' => 1, 'visible' => 1, 'notnull' => 1, 'position' => 1000, 'arrayofkeyval' => array(-1 => 'Draft', 1 => 'Validated', 0 => 'MemberStatusResiliatedShort', -2 => 'MemberStatusExcludedShort'))
403 );
404
408 const STATUS_DRAFT = -1;
420 const STATUS_EXCLUDED = -2;
421
422
428 public function __construct($db)
429 {
430 $this->db = $db;
431 $this->statut = self::STATUS_DRAFT;
432 $this->status = self::STATUS_DRAFT;
433 // l'adherent n'est pas public par default
434 $this->public = 0;
435 $this->ismultientitymanaged = 1;
436 $this->isextrafieldmanaged = 1;
437 // les champs optionnels sont vides
438 $this->array_options = array();
439
440 $this->fields['ref_ext']['visible'] = getDolGlobalInt('MAIN_LIST_SHOW_REF_EXT');
441 }
442
443
444 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
463 public function send_an_email($text, $subject, $filename_list = array(), $mimetype_list = array(), $mimefilename_list = array(), $addr_cc = "", $addr_bcc = "", $deliveryreceipt = 0, $msgishtml = -1, $errors_to = '', $moreinheader = '')
464 {
465 // phpcs:enable
466 dol_syslog('Warning using deprecated Adherent::send_an_email', LOG_WARNING);
467
468 return $this->sendEmail($text, $subject, $filename_list, $mimetype_list, $mimefilename_list, $addr_cc, $addr_bcc, $deliveryreceipt, $msgishtml, $errors_to, $moreinheader);
469 }
470
488 public function sendEmail($text, $subject, $filename_list = array(), $mimetype_list = array(), $mimefilename_list = array(), $addr_cc = "", $addr_bcc = "", $deliveryreceipt = 0, $msgishtml = -1, $errors_to = '', $moreinheader = '')
489 {
490 global $conf, $langs;
491
492 // Detect if message is HTML
493 if ($msgishtml == -1) {
494 $msgishtml = 0;
495 if (dol_textishtml($text, 0)) {
496 $msgishtml = 1;
497 }
498 }
499
500 dol_syslog('sendEmail msgishtml='.$msgishtml);
501
502 $texttosend = $this->makeSubstitution($text);
503 $subjecttosend = $this->makeSubstitution($subject);
504 if ($msgishtml) {
505 $texttosend = dol_htmlentitiesbr($texttosend);
506 }
507
508 // Send mail confirmation
509 $from = getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from);
510
511 $trackid = 'mem'.$this->id;
512
513 // Send email (substitutionarray must be done just before this)
514 include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
515 $mailfile = new CMailFile($subjecttosend, (string) $this->email, $from, $texttosend, $filename_list, $mimetype_list, $mimefilename_list, $addr_cc, $addr_bcc, $deliveryreceipt, $msgishtml, '', '', $trackid, $moreinheader);
516 if ($mailfile->sendfile()) {
517 return 1;
518 } else {
519 $this->error = $langs->trans("ErrorFailedToSendMail", $from, (string) $this->email).'. '.$mailfile->error;
520 return -1;
521 }
522 }
523
524
531 public function makeSubstitution($text)
532 {
533 global $langs;
534
535 $birthday = dol_print_date($this->birth, 'day');
536 $photo = isset($this->photo) ? $this->photo : '';
537 $login = isset($this->login) ? $this->login : '';
538 $type = isset($this->type) ? $this->type : '';
539 $pass = isset($this->pass) ? $this->pass : '';
540
541 $msgishtml = 0;
542 if (dol_textishtml($text, 1)) {
543 $msgishtml = 1;
544 }
545
546 $infos = '';
547 if ($this->civility_id) {
548 $infos .= $langs->transnoentities("UserTitle").": ".$this->getCivilityLabel()."\n";
549 }
550 $infos .= $langs->transnoentities("Id").": ".$this->id."\n";
551 $infos .= $langs->transnoentities("Ref").": ".$this->ref."\n";
552 $infos .= $langs->transnoentities("Lastname").": ".$this->lastname."\n";
553 $infos .= $langs->transnoentities("Firstname").": ".$this->firstname."\n";
554 $infos .= $langs->transnoentities("Company").": ".$this->company."\n";
555 $infos .= $langs->transnoentities("Address").": ".$this->address."\n";
556 $infos .= $langs->transnoentities("Zip").": ".$this->zip."\n";
557 $infos .= $langs->transnoentities("Town").": ".$this->town."\n";
558 $infos .= $langs->transnoentities("Country").": ".$this->country."\n";
559 $infos .= $langs->transnoentities("EMail").": ".$this->email."\n";
560 $infos .= $langs->transnoentities("PhonePro").": ".$this->phone."\n";
561 $infos .= $langs->transnoentities("PhonePerso").": ".$this->phone_perso."\n";
562 $infos .= $langs->transnoentities("PhoneMobile").": ".$this->phone_mobile."\n";
563 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
564 $infos .= $langs->transnoentities("Login").": ".$login."\n";
565 $infos .= $langs->transnoentities("Password").": ".$pass."\n";
566 }
567 $infos .= $langs->transnoentities("Birthday").": ".$birthday."\n";
568 $infos .= $langs->transnoentities("Photo").": ".$photo."\n";
569 $infos .= $langs->transnoentities("Public").": ".yn($this->public);
570
571 // Substitutions
572 $substitutionarray = array(
573 '__ID__' => $this->id,
574 '__REF__' => $this->ref,
575 '__MEMBER_ID__' => $this->id,
576 '__CIVILITY__' => $this->getCivilityLabel(),
577 '__FIRSTNAME__' => $msgishtml ? dol_htmlentitiesbr($this->firstname) : ($this->firstname ? $this->firstname : ''),
578 '__LASTNAME__' => $msgishtml ? dol_htmlentitiesbr($this->lastname) : ($this->lastname ? $this->lastname : ''),
579 '__FULLNAME__' => $msgishtml ? dol_htmlentitiesbr($this->getFullName($langs)) : $this->getFullName($langs),
580 '__COMPANY__' => $msgishtml ? dol_htmlentitiesbr((string) $this->company) : ($this->company ? $this->company : ''),
581 '__ADDRESS__' => $msgishtml ? dol_htmlentitiesbr((string) $this->address) : ($this->address ? $this->address : ''),
582 '__ZIP__' => $msgishtml ? dol_htmlentitiesbr((string) $this->zip) : ($this->zip ? $this->zip : ''),
583 '__TOWN__' => $msgishtml ? dol_htmlentitiesbr((string) $this->town) : ($this->town ? $this->town : ''),
584 '__COUNTRY__' => $msgishtml ? dol_htmlentitiesbr($this->country) : ($this->country ? $this->country : ''),
585 '__EMAIL__' => $msgishtml ? dol_htmlentitiesbr((string) $this->email) : ($this->email ? $this->email : ''),
586 '__BIRTH__' => $msgishtml ? dol_htmlentitiesbr($birthday) : ($birthday ? $birthday : ''),
587 '__PHOTO__' => $msgishtml ? dol_htmlentitiesbr($photo) : $photo,
588 '__LOGIN__' => $msgishtml ? dol_htmlentitiesbr($login) : $login,
589 '__PASSWORD__' => $msgishtml ? dol_htmlentitiesbr($pass) : $pass,
590 '__PHONE__' => $msgishtml ? dol_htmlentitiesbr($this->phone) : ($this->phone ? $this->phone : ''),
591 '__PHONEPRO__' => $msgishtml ? dol_htmlentitiesbr($this->phone_perso) : ($this->phone_perso ? $this->phone_perso : ''),
592 '__PHONEMOBILE__' => $msgishtml ? dol_htmlentitiesbr($this->phone_mobile) : ($this->phone_mobile ? $this->phone_mobile : ''),
593 '__TYPE__' => $msgishtml ? dol_htmlentitiesbr($type) : $type,
594 );
595
596 complete_substitutions_array($substitutionarray, $langs, $this);
597
598 return make_substitutions($text, $substitutionarray, $langs);
599 }
600
601
609 public function getmorphylib($morphy = '', $addbadge = 0)
610 {
611 global $langs;
612 $s = '';
613
614 // Clean var
615 if (!$morphy) {
616 $morphy = $this->morphy;
617 }
618
619 if ($addbadge) {
620 $labeltoshowm = $langs->trans("Moral");
621 $labeltoshowp = $langs->trans("Physical");
622 if ($morphy == 'phy') {
623 $labeltoshow = $labeltoshowp;
624 if ($addbadge == 2) {
625 $labeltoshow = dol_strtoupper(dolGetFirstLetters($labeltoshowp));
626 if ($labeltoshow == dol_strtoupper(dolGetFirstLetters($labeltoshowm))) {
627 $labeltoshow = dol_strtoupper(dolGetFirstLetters($labeltoshowp, 2));
628 }
629 }
630 $s .= '<span class="member-individual-back paddingleftimp paddingrightimp" title="'.$langs->trans("Physical").'">'.$labeltoshow.'</span>';
631 }
632 if ($morphy == 'mor') {
633 $labeltoshow = $labeltoshowm;
634 if ($addbadge == 2) {
635 $labeltoshow = dol_strtoupper(dolGetFirstLetters($labeltoshowm));
636 if ($labeltoshow == dol_strtoupper(dolGetFirstLetters($labeltoshowp))) {
637 $labeltoshow = dol_strtoupper(dolGetFirstLetters($labeltoshowm, 2));
638 }
639 }
640 $s .= '<span class="member-company-back paddingleftimp paddingrightimp" title="'.$langs->trans("Moral").'">'.$labeltoshow.'</span>';
641 }
642 } else {
643 if ($morphy == 'phy') {
644 $s = $langs->trans("Physical");
645 } elseif ($morphy == 'mor') {
646 $s = $langs->trans("Moral");
647 }
648 }
649
650 return $s;
651 }
652
660 public function create($user, $notrigger = 0)
661 {
662 global $conf, $langs, $mysoc;
663
664 $error = 0;
665
666 $now = dol_now();
667
668 // Clean parameters
669 if (isset($this->import_key)) {
670 $this->import_key = trim($this->import_key);
671 }
672
673 // Check parameters
674 if (getDolGlobalString('ADHERENT_MAIL_REQUIRED') && !isValidEmail((string) $this->email)) {
675 $langs->load("errors");
676 $this->error = $langs->trans("ErrorBadEMail", (string) $this->email);
677 return -1;
678 }
679 if (!$this->datec) {
680 $this->datec = $now;
681 }
682 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
683 if (empty($this->login)) {
684 $this->error = $langs->trans("ErrorWrongValueForParameterX", "Login");
685 return -1;
686 }
687 }
688
689 // setEntity will set entity with the right value if empty or change it for the right value if multicompany module is active
690 $this->entity = setEntity($this);
691
692 $this->db->begin();
693
694 // Insert member
695 $sql = "INSERT INTO ".MAIN_DB_PREFIX."adherent";
696 $sql .= " (ref, datec, login, fk_user_author, fk_user_mod, fk_user_valid, morphy, fk_adherent_type, entity, import_key, ip)";
697 $sql .= " VALUES (";
698 $sql .= " '(PROV)'";
699 $sql .= ", '".$this->db->idate($this->datec)."'";
700 $sql .= ", ".($this->login ? "'".$this->db->escape($this->login)."'" : "null");
701 $sql .= ", ".($user->id > 0 ? $user->id : "null"); // Can be null because member can be created by a guest or a script
702 $sql .= ", null, null, '".$this->db->escape($this->morphy)."'";
703 $sql .= ", ".((int) $this->typeid);
704 $sql .= ", ".((int) $this->entity);
705 $sql .= ", ".(!empty($this->import_key) ? "'".$this->db->escape($this->import_key)."'" : "null");
706 $sql .= ", ".(!empty($this->ip) ? "'".$this->db->escape($this->ip)."'" : "null");
707 $sql .= ")";
708
709 dol_syslog(get_class($this)."::create", LOG_DEBUG);
710 $result = $this->db->query($sql);
711 if ($result) {
712 $id = $this->db->last_insert_id(MAIN_DB_PREFIX."adherent");
713 if ($id > 0) {
714 $this->id = $id;
715 if (getDolGlobalString('MEMBER_CODEMEMBER_ADDON') == '') {
716 // keep old numbering
717 $this->ref = (string) $id;
718 } else {
719 // auto code
720 $modfile = dol_buildpath('core/modules/member/'.getDolGlobalString('MEMBER_CODEMEMBER_ADDON').'.php', 0);
721 try {
722 require_once $modfile;
723 $modname = getDolGlobalString('MEMBER_CODEMEMBER_ADDON');
724 $modCodeMember = new $modname();
725 '@phan-var-force ModeleNumRefMembers $modCodeMember';
727 $this->ref = $modCodeMember->getNextValue($mysoc, $this);
728 } catch (Exception $e) {
729 dol_syslog($e->getMessage(), LOG_ERR);
730 $error++;
731 }
732 }
733
734 // Update minor fields
735 $result = $this->update($user, 1, 1, 0, 0, 'add'); // nosync is 1 to avoid update data of user
736 if ($result < 0) {
737 $this->db->rollback();
738 return -1;
739 }
740
741 // Add link to user
742 if ($this->user_id) {
743 // Add link to user
744 $sql = "UPDATE ".MAIN_DB_PREFIX."user SET";
745 $sql .= " fk_member = ".((int) $this->id);
746 $sql .= " WHERE rowid = ".((int) $this->user_id);
747 dol_syslog(get_class($this)."::create", LOG_DEBUG);
748 $resql = $this->db->query($sql);
749 if (!$resql) {
750 $this->error = 'Failed to update user to make link with member';
751 $this->db->rollback();
752 return -4;
753 }
754 }
755
756 if (!$notrigger) {
757 // Call trigger
758 $result = $this->call_trigger('MEMBER_CREATE', $user);
759 if ($result < 0) {
760 $error++;
761 }
762 // End call triggers
763 }
764
765 if (count($this->errors)) {
766 dol_syslog(get_class($this)."::create ".implode(',', $this->errors), LOG_ERR);
767 $this->db->rollback();
768 return -3;
769 } else {
770 $this->db->commit();
771 return $this->id;
772 }
773 } else {
774 $this->error = 'Failed to get last insert id';
775 dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
776 $this->db->rollback();
777 return -2;
778 }
779 } else {
780 $this->error = $this->db->error();
781 $this->db->rollback();
782 return -1;
783 }
784 }
785
786
798 public function update($user, $notrigger = 0, $nosyncuser = 0, $nosyncuserpass = 0, $nosyncthirdparty = 0, $action = 'update')
799 {
800 global $langs, $hookmanager;
801
802 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
803
804 if (empty($this->country_id) && !empty($this->country_code)) {
805 $country_id = getCountry($this->country_code, '3');
806 $this->country_id = is_int($country_id) ? $country_id : 0;
807 }
808
809 $nbrowsaffected = 0;
810 $error = 0;
811
812 dol_syslog(get_class($this)."::update notrigger=".$notrigger.", nosyncuser=".$nosyncuser.", nosyncuserpass=".$nosyncuserpass." nosyncthirdparty=".$nosyncthirdparty.", email=".$this->email);
813
814 // Clean parameters
815 $this->lastname = trim($this->lastname) ? trim($this->lastname) : trim($this->lastname);
816 $this->firstname = trim($this->firstname) ? trim($this->firstname) : trim($this->firstname);
817 $this->gender = trim($this->gender);
818 // $this->address = ($this->address ? $this->address : $this->address);
819 // $this->zip = ($this->zip ? $this->zip : $this->zip);
820 // $this->town = ($this->town ? $this->town : $this->town);
821 // $this->country_id = ($this->country_id > 0 ? $this->country_id : $this->country_id);
822 // $this->state_id = ($this->state_id > 0 ? $this->state_id : $this->state_id);
823 // $this->note_public = ($this->note_public ? $this->note_public : $this->note_public);
824 // $this->note_private = ($this->note_private ? $this->note_private : $this->note_private);
825 $this->url = $this->url ? clean_url($this->url, 0) : '';
826 $this->setUpperOrLowerCase();
827 // Check parameters
828 if (getDolGlobalString('ADHERENT_MAIL_REQUIRED') && !isValidEmail((string) $this->email)) {
829 $langs->load("errors");
830 $this->error = $langs->trans("ErrorBadEMail", (string) $this->email);
831 return -1;
832 }
833
834 $this->db->begin();
835
836 $sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET";
837 $sql .= " ref = '".$this->db->escape($this->ref)."'";
838 $sql .= ", civility = ".($this->civility_id ? "'".$this->db->escape($this->civility_id)."'" : "null");
839 $sql .= ", firstname = ".($this->firstname ? "'".$this->db->escape($this->firstname)."'" : "null");
840 $sql .= ", lastname = ".($this->lastname ? "'".$this->db->escape($this->lastname)."'" : "null");
841 $sql .= ", gender = ".($this->gender != -1 ? "'".$this->db->escape($this->gender)."'" : "null"); // 'man' or 'woman'
842 $sql .= ", login = ".($this->login ? "'".$this->db->escape($this->login)."'" : "null");
843 $sql .= ", societe = ".($this->company ? "'".$this->db->escape($this->company)."'" : ($this->societe ? "'".$this->db->escape($this->societe)."'" : "null"));
844 if ($this->socid) {
845 $sql .= ", fk_soc = ".($this->socid > 0 ? (int) $this->socid : "null"); // Must be modified only when creating from a third-party
846 }
847 $sql .= ", address = ".($this->address ? "'".$this->db->escape($this->address)."'" : "null");
848 $sql .= ", zip = ".($this->zip ? "'".$this->db->escape($this->zip)."'" : "null");
849 $sql .= ", town = ".($this->town ? "'".$this->db->escape($this->town)."'" : "null");
850 $sql .= ", country = ".($this->country_id > 0 ? (int) $this->country_id : "null");
851 $sql .= ", state_id = ".($this->state_id > 0 ? (int) $this->state_id : "null");
852 $sql .= ", email = '".$this->db->escape((string) $this->email)."'";
853 $sql .= ", url = ".(!empty($this->url) ? "'".$this->db->escape($this->url)."'" : "null");
854 $sql .= ", socialnetworks = ".($this->socialnetworks ? "'".$this->db->escape(json_encode($this->socialnetworks))."'" : "null");
855 $sql .= ", phone = ".($this->phone ? "'".$this->db->escape($this->phone)."'" : "null");
856 $sql .= ", phone_perso = ".($this->phone_perso ? "'".$this->db->escape($this->phone_perso)."'" : "null");
857 $sql .= ", phone_mobile = ".($this->phone_mobile ? "'".$this->db->escape($this->phone_mobile)."'" : "null");
858 $sql .= ", note_private = ".($this->note_private ? "'".$this->db->escape($this->note_private)."'" : "null");
859 $sql .= ", note_public = ".($this->note_public ? "'".$this->db->escape($this->note_public)."'" : "null");
860 $sql .= ", photo = ".($this->photo ? "'".$this->db->escape($this->photo)."'" : "null");
861 $sql .= ", public = ".(int) $this->public;
862 $sql .= ", statut = ".(int) $this->statut;
863 $sql .= ", default_lang = ".(!empty($this->default_lang) ? "'".$this->db->escape($this->default_lang)."'" : "null");
864 $sql .= ", fk_adherent_type = ".(int) $this->typeid;
865 $sql .= ", morphy = '".$this->db->escape($this->morphy)."'";
866 $sql .= ", birth = ".($this->birth ? "'".$this->db->idate($this->birth)."'" : "null");
867
868 if ($this->datefin) {
869 $sql .= ", datefin = '".$this->db->idate($this->datefin)."'"; // Must be modified only when deleting a subscription
870 }
871 if ($this->datevalid) {
872 $sql .= ", datevalid = '".$this->db->idate($this->datevalid)."'"; // Must be modified only when validating a member
873 }
874 $sql .= ", fk_user_mod = ".($user->id > 0 ? $user->id : 'null'); // Can be null because member can be create by a guest
875 $sql .= " WHERE rowid = ".((int) $this->id);
876
877 // If we change the type of membership, we set also label of new type..
878 '@phan-var-force Adherent $oldcopy';
879 if (!empty($this->oldcopy) && $this->typeid != $this->oldcopy->typeid) {
880 $sql2 = "SELECT libelle as label";
881 $sql2 .= " FROM ".MAIN_DB_PREFIX."adherent_type";
882 $sql2 .= " WHERE rowid = ".((int) $this->typeid);
883 $resql2 = $this->db->query($sql2);
884 if ($resql2) {
885 while ($obj = $this->db->fetch_object($resql2)) {
886 $this->type = $obj->label;
887 }
888 }
889 }
890
891 dol_syslog(get_class($this)."::update update member", LOG_DEBUG);
892 $resql = $this->db->query($sql);
893 if ($resql) {
894 unset($this->country_code);
895 unset($this->country);
896 unset($this->state_code);
897 unset($this->state);
898
899 $nbrowsaffected += $this->db->affected_rows($resql);
900
901 $action = 'update';
902
903 // Actions on extra fields
904 if (!$error) {
905 $result = $this->insertExtraFields();
906 if ($result < 0) {
907 $error++;
908 }
909 }
910
911 // Update password
912 if (!$error && $this->pass) {
913 dol_syslog(get_class($this)."::update update password");
914 if ($this->pass != $this->pass_indatabase && $this->pass != $this->pass_indatabase_crypted) {
915 $isencrypted = getDolGlobalString('DATABASE_PWD_ENCRYPTED') ? 1 : 0;
916
917 // If password to set differs from the one found into database
918 $result = $this->setPassword($user, $this->pass, $isencrypted, $notrigger, $nosyncuserpass);
919 if (!$nbrowsaffected) {
920 $nbrowsaffected++;
921 }
922 }
923 }
924
925 // Remove links to user and replace with new one
926 if (!$error) {
927 dol_syslog(get_class($this)."::update update link to user");
928 $sql = "UPDATE ".MAIN_DB_PREFIX."user SET fk_member = NULL WHERE fk_member = ".((int) $this->id);
929 dol_syslog(get_class($this)."::update", LOG_DEBUG);
930 $resql = $this->db->query($sql);
931 if (!$resql) {
932 $this->error = $this->db->error();
933 $this->db->rollback();
934 return -5;
935 }
936 // If there is a user linked to this member
937 if ($this->user_id > 0) {
938 $sql = "UPDATE ".MAIN_DB_PREFIX."user SET fk_member = ".((int) $this->id)." WHERE rowid = ".((int) $this->user_id);
939 dol_syslog(get_class($this)."::update", LOG_DEBUG);
940 $resql = $this->db->query($sql);
941 if (!$resql) {
942 $this->error = $this->db->error();
943 $this->db->rollback();
944 return -5;
945 }
946 }
947 }
948
949 if (!$error && $nbrowsaffected) { // If something has change in main data
950 // Update information on linked user if it is an update
951 if (!$error && $this->user_id > 0 && !$nosyncuser) {
952 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
953
954 dol_syslog(get_class($this)."::update update linked user");
955
956 $luser = new User($this->db);
957 $result = $luser->fetch($this->user_id);
958
959 if ($result >= 0) {
960 // If option ADHERENT_LOGIN_NOT_REQUIRED is on, there is no login of member, so we do not overwrite user login to keep existing one.
961 if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
962 $luser->login = $this->login;
963 }
964
965 $luser->ref = $this->ref;
966 $luser->civility_id = $this->civility_id;
967 $luser->firstname = $this->firstname;
968 $luser->lastname = $this->lastname;
969 $luser->gender = $this->gender;
970 $luser->pass = isset($this->pass) ? $this->pass : '';
971 //$luser->socid=$this->fk_soc; // We do not enable this. This may transform a user into an external user.
972
973 $luser->birth = $this->birth;
974
975 $luser->address = $this->address;
976 $luser->zip = $this->zip;
977 $luser->town = $this->town;
978 $luser->country_id = $this->country_id;
979 $luser->state_id = $this->state_id;
980
981 $luser->email = $this->email;
982 $luser->socialnetworks = $this->socialnetworks;
983 $luser->office_phone = $this->phone;
984 $luser->user_mobile = $this->phone_mobile;
985
986 $luser->lang = $this->default_lang;
987
988 $luser->fk_member = $this->id;
989
990 $result = $luser->update($user, 0, 1, 1); // Use nosync to 1 to avoid cyclic updates
991 if ($result < 0) {
992 $this->error = $luser->error;
993 dol_syslog(get_class($this)."::update ".$this->error, LOG_ERR);
994 $error++;
995 }
996 } else {
997 $this->error = $luser->error;
998 $error++;
999 }
1000 }
1001
1002 // Update information on linked thirdparty if it is an update
1003 if (!$error && $this->fk_soc > 0 && !$nosyncthirdparty) {
1004 require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
1005
1006 dol_syslog(get_class($this)."::update update linked thirdparty");
1007
1008 // This member is linked with a thirdparty, so we also update thirdparty information
1009 // if this is an update.
1010 $lthirdparty = new Societe($this->db);
1011 $result = $lthirdparty->fetch($this->fk_soc);
1012
1013 if ($result > 0) {
1014 $lthirdparty->address = $this->address;
1015 $lthirdparty->zip = $this->zip;
1016 $lthirdparty->town = $this->town;
1017 $lthirdparty->email = $this->email;
1018 $lthirdparty->socialnetworks = $this->socialnetworks;
1019 $lthirdparty->phone = $this->phone;
1020 $lthirdparty->state_id = $this->state_id;
1021 $lthirdparty->country_id = $this->country_id;
1022 //$lthirdparty->phone_mobile=$this->phone_mobile;
1023 $lthirdparty->default_lang = $this->default_lang;
1024
1025 $result = $lthirdparty->update($this->fk_soc, $user, 0, 1, 1, 'update'); // Use sync to 0 to avoid cyclic updates
1026
1027 if ($result < 0) {
1028 $this->error = $lthirdparty->error;
1029 $this->errors = $lthirdparty->errors;
1030 dol_syslog(get_class($this)."::update ".$this->error, LOG_ERR);
1031 $error++;
1032 }
1033 } elseif ($result < 0) {
1034 $this->error = $lthirdparty->error;
1035 $error++;
1036 }
1037 }
1038 }
1039
1040 if (!$error && !$notrigger) {
1041 // Call trigger
1042 $result = $this->call_trigger('MEMBER_MODIFY', $user);
1043 if ($result < 0) {
1044 $error++;
1045 }
1046 // End call triggers
1047 }
1048
1049 if (!$error) {
1050 $this->db->commit();
1051 return $nbrowsaffected;
1052 } else {
1053 $this->db->rollback();
1054 return -1;
1055 }
1056 } else {
1057 $this->db->rollback();
1058 $this->error = $this->db->lasterror();
1059 return -2;
1060 }
1061 }
1062
1063
1064 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1072 public function update_end_date($user)
1073 {
1074 // phpcs:enable
1075 $this->db->begin();
1076
1077 // Search for last subscription id and end date
1078 $sql = "SELECT rowid, datec as dateop, dateadh as datedeb, datef as datefin";
1079 $sql .= " FROM ".MAIN_DB_PREFIX."subscription";
1080 $sql .= " WHERE fk_adherent = ".((int) $this->id);
1081 $sql .= " ORDER by dateadh DESC"; // Sort by start subscription date
1082
1083 dol_syslog(get_class($this)."::update_end_date", LOG_DEBUG);
1084 $resql = $this->db->query($sql);
1085 if ($resql) {
1086 $obj = $this->db->fetch_object($resql);
1087 $dateop = $this->db->jdate($obj->dateop);
1088 $datedeb = $this->db->jdate($obj->datedeb);
1089 $datefin = $this->db->jdate($obj->datefin);
1090
1091 $sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET";
1092 $sql .= " datefin=".($datefin != '' ? "'".$this->db->idate($datefin)."'" : "null");
1093 $sql .= " WHERE rowid = ".((int) $this->id);
1094
1095 dol_syslog(get_class($this)."::update_end_date", LOG_DEBUG);
1096 $resql = $this->db->query($sql);
1097 if ($resql) {
1098 $this->last_subscription_date = $dateop;
1099 $this->last_subscription_date_start = $datedeb;
1100 $this->last_subscription_date_end = $datefin;
1101 $this->datefin = $datefin;
1102 $this->db->commit();
1103 return 1;
1104 } else {
1105 $this->db->rollback();
1106 return -1;
1107 }
1108 } else {
1109 $this->error = $this->db->lasterror();
1110 $this->db->rollback();
1111 return -1;
1112 }
1113 }
1114
1122 public function delete($user, $notrigger = 0)
1123 {
1124 $result = 0;
1125 $error = 0;
1126 $errorflag = 0;
1127
1128 // Check parameters
1129 $rowid = $this->id;
1130
1131 $this->db->begin();
1132
1133 if (!$error && !$notrigger) {
1134 // Call trigger
1135 $result = $this->call_trigger('MEMBER_DELETE', $user);
1136 if ($result < 0) {
1137 $error++;
1138 }
1139 // End call triggers
1140 }
1141
1142 // Remove category
1143 $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_member WHERE fk_member = ".((int) $rowid);
1144 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
1145 $resql = $this->db->query($sql);
1146 if (!$resql) {
1147 $error++;
1148 $this->error .= $this->db->lasterror();
1149 $errorflag = -1;
1150 }
1151
1152 // Remove subscription
1153 if (!$error) {
1154 $sql = "DELETE FROM ".MAIN_DB_PREFIX."subscription WHERE fk_adherent = ".((int) $rowid);
1155 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
1156 $resql = $this->db->query($sql);
1157 if (!$resql) {
1158 $error++;
1159 $this->error .= $this->db->lasterror();
1160 $errorflag = -2;
1161 }
1162 }
1163
1164 // Remove linked user
1165 if (!$error) {
1166 $ret = $this->setUserId(0);
1167 if ($ret < 0) {
1168 $error++;
1169 $this->error .= $this->db->lasterror();
1170 $errorflag = -3;
1171 }
1172 }
1173
1174 // Removed extrafields
1175 if (!$error) {
1176 $result = $this->deleteExtraFields();
1177 if ($result < 0) {
1178 $error++;
1179 $errorflag = -4;
1180 dol_syslog(get_class($this)."::delete erreur ".$errorflag." ".$this->error, LOG_ERR);
1181 }
1182 }
1183
1184 // Remove adherent
1185 if (!$error) {
1186 $sql = "DELETE FROM ".MAIN_DB_PREFIX."adherent WHERE rowid = ".((int) $rowid);
1187 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
1188 $resql = $this->db->query($sql);
1189 if (!$resql) {
1190 $error++;
1191 $this->error .= $this->db->lasterror();
1192 $errorflag = -5;
1193 }
1194 }
1195
1196 if (!$error) {
1197 $this->db->commit();
1198 return 1;
1199 } else {
1200 $this->db->rollback();
1201 return $errorflag;
1202 }
1203 }
1204
1205
1216 public function setPassword($user, $password = '', $isencrypted = 0, $notrigger = 0, $nosyncuser = 0)
1217 {
1218 global $conf, $langs;
1219
1220 $error = 0;
1221
1222 dol_syslog(get_class($this)."::setPassword user=".$user->id." password=".preg_replace('/./i', '*', $password)." isencrypted=".$isencrypted);
1223
1224 // If new password not provided, we generate one
1225 if (!$password) {
1226 require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
1227 $password = getRandomPassword(false);
1228 }
1229
1230 // Crypt password
1231 $password_crypted = dol_hash($password);
1232
1233 $password_indatabase = '';
1234 if (!$isencrypted) {
1235 $password_indatabase = $password;
1236 }
1237
1238 $this->db->begin();
1239
1240 // Mise a jour
1241 $sql = "UPDATE ".MAIN_DB_PREFIX."adherent";
1242 $sql .= " SET pass_crypted = '".$this->db->escape($password_crypted)."'";
1243 if ($isencrypted) {
1244 $sql .= ", pass = null";
1245 } else {
1246 $sql .= ", pass = '".$this->db->escape($password_indatabase)."'";
1247 }
1248 $sql .= " WHERE rowid = ".((int) $this->id);
1249
1250 //dol_syslog("Adherent::Password sql=hidden");
1251 dol_syslog(get_class($this)."::setPassword", LOG_DEBUG);
1252 $result = $this->db->query($sql);
1253 if ($result) {
1254 $nbaffectedrows = $this->db->affected_rows($result);
1255
1256 if ($nbaffectedrows) {
1257 $this->pass = $password;
1258 $this->pass_indatabase = $password_indatabase;
1259 $this->pass_indatabase_crypted = $password_crypted;
1260
1261 if ($this->user_id && !$nosyncuser) {
1262 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
1263
1264 // This member is linked with a user, so we also update users information
1265 // if this is an update.
1266 $luser = new User($this->db);
1267 $result = $luser->fetch($this->user_id);
1268
1269 if ($result >= 0) {
1270 $result = $luser->setPassword($user, $this->pass, 0, 0, 1);
1271 if (is_int($result) && $result < 0) {
1272 $this->error = $luser->error;
1273 dol_syslog(get_class($this)."::setPassword ".$this->error, LOG_ERR);
1274 $error++;
1275 }
1276 } else {
1277 $this->error = $luser->error;
1278 $error++;
1279 }
1280 }
1281
1282 if (!$error && !$notrigger) {
1283 // Call trigger
1284 $result = $this->call_trigger('MEMBER_NEW_PASSWORD', $user);
1285 if ($result < 0) {
1286 $error++;
1287 $this->db->rollback();
1288 return -1;
1289 }
1290 // End call triggers
1291 }
1292
1293 $this->db->commit();
1294 return $this->pass;
1295 } else {
1296 $this->db->rollback();
1297 return 0;
1298 }
1299 } else {
1300 $this->db->rollback();
1301 dol_print_error($this->db);
1302 return -1;
1303 }
1304 }
1305
1306
1313 public function setUserId($userid)
1314 {
1315 global $conf, $langs;
1316
1317 $this->db->begin();
1318
1319 // If user is linked to this member, remove old link to this member
1320 $sql = "UPDATE ".MAIN_DB_PREFIX."user SET fk_member = NULL WHERE fk_member = ".((int) $this->id);
1321 dol_syslog(get_class($this)."::setUserId", LOG_DEBUG);
1322 $resql = $this->db->query($sql);
1323 if (!$resql) {
1324 $this->error = $this->db->error();
1325 $this->db->rollback();
1326 return -1;
1327 }
1328
1329 // Set link to user
1330 if ($userid > 0) {
1331 $sql = "UPDATE ".MAIN_DB_PREFIX."user SET fk_member = ".((int) $this->id);
1332 $sql .= " WHERE rowid = ".((int) $userid);
1333 dol_syslog(get_class($this)."::setUserId", LOG_DEBUG);
1334 $resql = $this->db->query($sql);
1335 if (!$resql) {
1336 $this->error = $this->db->error();
1337 $this->db->rollback();
1338 return -2;
1339 }
1340 }
1341
1342 $this->db->commit();
1343
1344 return 1;
1345 }
1346
1347
1354 public function setThirdPartyId($thirdpartyid)
1355 {
1356 global $conf, $langs;
1357
1358 $this->db->begin();
1359
1360 // Remove link to third party onto any other members
1361 if ($thirdpartyid > 0) {
1362 $sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET fk_soc = null";
1363 $sql .= " WHERE fk_soc = ".((int) $thirdpartyid);
1364 $sql .= " AND entity = ".$conf->entity;
1365 dol_syslog(get_class($this)."::setThirdPartyId", LOG_DEBUG);
1366 $resql = $this->db->query($sql);
1367 }
1368
1369 // Add link to third party for current member
1370 $sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET fk_soc = ".($thirdpartyid > 0 ? (int) $thirdpartyid : 'null');
1371 $sql .= " WHERE rowid = ".((int) $this->id);
1372
1373 dol_syslog(get_class($this)."::setThirdPartyId", LOG_DEBUG);
1374 $resql = $this->db->query($sql);
1375 if ($resql) {
1376 $this->db->commit();
1377 return 1;
1378 } else {
1379 $this->error = $this->db->error();
1380 $this->db->rollback();
1381 return -1;
1382 }
1383 }
1384
1385
1386 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1393 public function fetch_login($login)
1394 {
1395 // phpcs:enable
1396 global $conf;
1397
1398 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."adherent";
1399 $sql .= " WHERE login='".$this->db->escape($login)."'";
1400 $sql .= " AND entity = ".$conf->entity;
1401
1402 $resql = $this->db->query($sql);
1403 if ($resql) {
1404 if ($this->db->num_rows($resql)) {
1405 $obj = $this->db->fetch_object($resql);
1406 $this->fetch($obj->rowid);
1407 }
1408 } else {
1409 dol_print_error($this->db);
1410 }
1411 }
1412
1413 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1421 public function fetch_name($firstname, $lastname)
1422 {
1423 // phpcs:enable
1424 global $conf;
1425
1426 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."adherent";
1427 $sql .= " WHERE firstname='".$this->db->escape($firstname)."'";
1428 $sql .= " AND lastname='".$this->db->escape($lastname)."'";
1429 $sql .= " AND entity = ".$conf->entity;
1430
1431 $resql = $this->db->query($sql);
1432 if ($resql) {
1433 if ($this->db->num_rows($resql)) {
1434 $obj = $this->db->fetch_object($resql);
1435 $this->fetch($obj->rowid);
1436 }
1437 } else {
1438 dol_print_error($this->db);
1439 }
1440 }
1441
1453 public function fetch($rowid, $ref = '', $fk_soc = 0, $ref_ext = '', $fetch_optionals = true, $fetch_subscriptions = true)
1454 {
1455 global $langs;
1456
1457 $sql = "SELECT d.rowid, d.ref, d.ref_ext, d.civility as civility_code, d.gender, d.firstname, d.lastname,";
1458 $sql .= " d.societe as company, d.fk_soc, d.statut, d.public, d.address, d.zip, d.town, d.note_private,";
1459 $sql .= " d.note_public,";
1460 $sql .= " d.email, d.url, d.socialnetworks, d.phone, d.phone_perso, d.phone_mobile, d.login, d.pass, d.pass_crypted,";
1461 $sql .= " d.photo, d.fk_adherent_type, d.morphy, d.entity,";
1462 $sql .= " d.datec as datec,";
1463 $sql .= " d.tms as datem,";
1464 $sql .= " d.datefin as datefin, d.default_lang,";
1465 $sql .= " d.birth as birthday,";
1466 $sql .= " d.datevalid as datev,";
1467 $sql .= " d.country,";
1468 $sql .= " d.state_id,";
1469 $sql .= " d.model_pdf,";
1470 $sql .= " c.rowid as country_id, c.code as country_code, c.label as country,";
1471 $sql .= " dep.nom as state, dep.code_departement as state_code,";
1472 $sql .= " t.libelle as type, t.subscription as subscription,";
1473 $sql .= " u.rowid as user_id, u.login as user_login";
1474 $sql .= " FROM ".MAIN_DB_PREFIX."adherent_type as t, ".MAIN_DB_PREFIX."adherent as d";
1475 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON d.country = c.rowid";
1476 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as dep ON d.state_id = dep.rowid";
1477 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON d.rowid = u.fk_member";
1478 $sql .= " WHERE d.fk_adherent_type = t.rowid";
1479 if ($rowid) {
1480 $sql .= " AND d.rowid=".((int) $rowid);
1481 } elseif ($ref || $fk_soc) {
1482 $sql .= " AND d.entity IN (".getEntity('adherent').")";
1483 if ($ref) {
1484 $sql .= " AND d.ref='".$this->db->escape($ref)."'";
1485 } elseif ($fk_soc > 0) {
1486 $sql .= " AND d.fk_soc=".((int) $fk_soc);
1487 }
1488 } elseif ($ref_ext) {
1489 $sql .= " AND d.ref_ext='".$this->db->escape($ref_ext)."'";
1490 }
1491
1492 dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
1493 $resql = $this->db->query($sql);
1494 if ($resql) {
1495 if ($this->db->num_rows($resql)) {
1496 $obj = $this->db->fetch_object($resql);
1497
1498 $this->entity = $obj->entity;
1499 $this->id = $obj->rowid;
1500 $this->ref = $obj->ref;
1501 $this->ref_ext = $obj->ref_ext;
1502
1503 $this->civility_id = $obj->civility_code; // Bad. Kept for backward compatibility
1504 $this->civility_code = $obj->civility_code;
1505 $this->civility = $obj->civility_code ? ($langs->trans("Civility".$obj->civility_code) != "Civility".$obj->civility_code ? $langs->trans("Civility".$obj->civility_code) : $obj->civility_code) : '';
1506
1507 $this->firstname = $obj->firstname;
1508 $this->lastname = $obj->lastname;
1509 $this->gender = $obj->gender;
1510 $this->login = $obj->login;
1511 $this->societe = $obj->company;
1512 $this->company = $obj->company;
1513 $this->socid = $obj->fk_soc;
1514 $this->fk_soc = $obj->fk_soc; // For backward compatibility
1515 $this->address = $obj->address;
1516 $this->zip = $obj->zip;
1517 $this->town = $obj->town;
1518
1519 $this->pass = $obj->pass;
1520 $this->pass_indatabase = $obj->pass;
1521 $this->pass_indatabase_crypted = $obj->pass_crypted;
1522
1523 $this->state_id = $obj->state_id;
1524 $this->state_code = $obj->state_id ? $obj->state_code : '';
1525 $this->state = $obj->state_id ? $obj->state : '';
1526
1527 $this->country_id = $obj->country_id;
1528 $this->country_code = $obj->country_code;
1529 if ($langs->trans("Country".$obj->country_code) != "Country".$obj->country_code) {
1530 $this->country = $langs->transnoentitiesnoconv("Country".$obj->country_code);
1531 } else {
1532 $this->country = $obj->country;
1533 }
1534
1535 $this->phone = $obj->phone;
1536 $this->phone_perso = $obj->phone_perso;
1537 $this->phone_mobile = $obj->phone_mobile;
1538 $this->email = $obj->email;
1539 $this->url = $obj->url;
1540
1541 $this->socialnetworks = ($obj->socialnetworks ? (array) json_decode($obj->socialnetworks, true) : array());
1542
1543 $this->photo = $obj->photo;
1544 $this->statut = $obj->statut;
1545 $this->status = $obj->statut;
1546 $this->public = $obj->public;
1547
1548 $this->datec = $this->db->jdate($obj->datec);
1549 $this->date_creation = $this->db->jdate($obj->datec);
1550 $this->datem = $this->db->jdate($obj->datem);
1551 $this->date_modification = $this->db->jdate($obj->datem);
1552 $this->datefin = $this->db->jdate($obj->datefin);
1553 $this->datevalid = $this->db->jdate($obj->datev);
1554 $this->date_validation = $this->db->jdate($obj->datev);
1555 $this->birth = $this->db->jdate($obj->birthday);
1556
1557 $this->default_lang = $obj->default_lang;
1558
1559 $this->note_private = $obj->note_private;
1560 $this->note_public = $obj->note_public;
1561 $this->morphy = $obj->morphy;
1562
1563 $this->typeid = $obj->fk_adherent_type;
1564 $this->type = $obj->type;
1565 $this->need_subscription = $obj->subscription;
1566
1567 $this->user_id = $obj->user_id;
1568 $this->user_login = $obj->user_login;
1569
1570 $this->model_pdf = $obj->model_pdf;
1571
1572 // Retrieve all extrafield
1573 // fetch optionals attributes and labels
1574 if ($fetch_optionals) {
1575 $this->fetch_optionals();
1576 }
1577
1578 // Load other properties
1579 if ($fetch_subscriptions) {
1580 $result = $this->fetch_subscriptions();
1581 }
1582
1583 return $this->id;
1584 } else {
1585 return 0;
1586 }
1587 } else {
1588 $this->error = $this->db->lasterror();
1589 return -1;
1590 }
1591 }
1592
1593
1594 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1603 public function fetch_subscriptions()
1604 {
1605 // phpcs:enable
1606 global $langs;
1607
1608 require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php';
1609
1610 $sql = "SELECT c.rowid, c.fk_adherent, c.fk_type, c.subscription, c.note as note_public, c.fk_bank,";
1611 $sql .= " c.tms as datem,";
1612 $sql .= " c.datec as datec,";
1613 $sql .= " c.dateadh as dateh,";
1614 $sql .= " c.datef as datef";
1615 $sql .= " FROM ".MAIN_DB_PREFIX."subscription as c";
1616 $sql .= " WHERE c.fk_adherent = ".((int) $this->id);
1617 $sql .= " ORDER BY c.dateadh";
1618 dol_syslog(get_class($this)."::fetch_subscriptions", LOG_DEBUG);
1619
1620 $resql = $this->db->query($sql);
1621 if ($resql) {
1622 $this->subscriptions = array();
1623
1624 $i = 0;
1625 while ($obj = $this->db->fetch_object($resql)) {
1626 if ($i == 0) {
1627 $this->first_subscription_date = $this->db->jdate($obj->datec);
1628 $this->first_subscription_date_start = $this->db->jdate($obj->dateh);
1629 $this->first_subscription_date_end = $this->db->jdate($obj->datef);
1630 $this->first_subscription_amount = $obj->subscription;
1631 }
1632 $this->last_subscription_date = $this->db->jdate($obj->datec);
1633 $this->last_subscription_date_start = $this->db->jdate($obj->dateh);
1634 $this->last_subscription_date_end = $this->db->jdate($obj->datef);
1635 $this->last_subscription_amount = $obj->subscription;
1636
1637 $subscription = new Subscription($this->db);
1638 $subscription->id = $obj->rowid;
1639 $subscription->fk_adherent = $obj->fk_adherent;
1640 $subscription->fk_type = $obj->fk_type;
1641 $subscription->amount = $obj->subscription;
1642 $subscription->note = $obj->note_public;
1643 $subscription->note_public = $obj->note_public;
1644 $subscription->fk_bank = $obj->fk_bank;
1645 $subscription->datem = $this->db->jdate($obj->datem);
1646 $subscription->datec = $this->db->jdate($obj->datec);
1647 $subscription->dateh = $this->db->jdate($obj->dateh);
1648 $subscription->datef = $this->db->jdate($obj->datef);
1649
1650 $this->subscriptions[] = $subscription;
1651
1652 $i++;
1653 }
1654 return 1;
1655 } else {
1656 $this->error = $this->db->error().' sql='.$sql;
1657 return -1;
1658 }
1659 }
1660
1661
1668 public function fetchPartnerships($mode)
1669 {
1670 global $langs;
1671
1672 require_once DOL_DOCUMENT_ROOT.'/partnership/class/partnership.class.php';
1673
1674
1675 $this->partnerships[] = array();
1676
1677 return 1;
1678 }
1679
1680
1696 public function subscription($date, $amount, $accountid = 0, $operation = '', $label = '', $num_chq = '', $emetteur_nom = '', $emetteur_banque = '', $datesubend = 0, $fk_type = null)
1697 {
1698 global $user;
1699
1700 require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php';
1701
1702 $error = 0;
1703
1704 // Clean parameters
1705 if (!$amount) {
1706 $amount = 0;
1707 }
1708
1709 $this->db->begin();
1710
1711 if ($datesubend) {
1712 $datefin = $datesubend;
1713 } else {
1714 // If no end date, end date = date + 1 year - 1 day
1715 $datefin = dol_time_plus_duree($date, 1, 'y');
1716 $datefin = dol_time_plus_duree($datefin, -1, 'd');
1717 }
1718
1719 // Create subscription
1720 $subscription = new Subscription($this->db);
1721 $subscription->fk_adherent = $this->id;
1722 $subscription->dateh = $date; // Date of new subscription
1723 $subscription->datef = $datefin; // End data of new subscription
1724 $subscription->amount = $amount;
1725 $subscription->note = $label; // deprecated
1726 $subscription->note_public = $label;
1727 $subscription->fk_type = $fk_type;
1728
1729 if (empty($subscription->user_creation_id)) {
1730 $subscription->user_creation_id = $user->id;
1731 }
1732
1733 $rowid = $subscription->create($user);
1734 if ($rowid > 0) {
1735 // Update denormalized subscription end date (read database subscription to find values)
1736 // This will also update this->datefin
1737 $result = $this->update_end_date($user);
1738 if ($result > 0) {
1739 // Change properties of object (used by triggers)
1740 $this->last_subscription_date = dol_now();
1741 $this->last_subscription_date_start = $date;
1742 $this->last_subscription_date_end = $datefin;
1743 $this->last_subscription_amount = $amount;
1744 }
1745
1746 if (!$error) {
1747 $this->db->commit();
1748 return $rowid;
1749 } else {
1750 $this->db->rollback();
1751 return -2;
1752 }
1753 } else {
1754 $this->setErrorsFromObject($subscription);
1755 $this->db->rollback();
1756 return -1;
1757 }
1758 }
1759
1760
1780 public function subscriptionComplementaryActions($subscriptionid, $option, $accountid, $datesubscription, $paymentdate, $operation, $label, $amount, $num_chq, $emetteur_nom = '', $emetteur_banque = '', $autocreatethirdparty = 0, $ext_payment_id = '', $ext_payment_site = '')
1781 {
1782 global $conf, $langs, $user, $mysoc;
1783
1784 $error = 0;
1785
1786 $this->invoice = null; // This will contains invoice if an invoice is created
1787
1788 dol_syslog("subscriptionComplementaryActions subscriptionid=".$subscriptionid." option=".$option." accountid=".$accountid." datesubscription=".$datesubscription." paymentdate=".
1789 $paymentdate." label=".$label." amount=".$amount." num_chq=".$num_chq." autocreatethirdparty=".$autocreatethirdparty);
1790
1791 // Insert into bank account directlty (if option chosen for) + link to llx_subscription if option is 'bankdirect'
1792 if ($option == 'bankdirect' && $accountid) {
1793 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1794
1795 $acct = new Account($this->db);
1796 $result = $acct->fetch($accountid);
1797
1798 $dateop = $paymentdate;
1799
1800 $insertid = $acct->addline($dateop, $operation, $label, $amount, $num_chq, 0, $user, $emetteur_nom, $emetteur_banque);
1801 if ($insertid > 0) {
1802 $inserturlid = $acct->add_url_line($insertid, $this->id, DOL_URL_ROOT.'/adherents/card.php?rowid=', $this->getFullName($langs), 'member');
1803 if ($inserturlid > 0) {
1804 // Update table subscription
1805 $sql = "UPDATE ".MAIN_DB_PREFIX."subscription SET fk_bank=".((int) $insertid);
1806 $sql .= " WHERE rowid=".((int) $subscriptionid);
1807
1808 dol_syslog("subscription::subscription", LOG_DEBUG);
1809 $resql = $this->db->query($sql);
1810 if (!$resql) {
1811 $error++;
1812 $this->error = $this->db->lasterror();
1813 $this->errors[] = $this->error;
1814 }
1815 } else {
1816 $error++;
1817 $this->setErrorsFromObject($acct);
1818 }
1819 } else {
1820 $error++;
1821 $this->setErrorsFromObject($acct);
1822 }
1823 }
1824
1825 // If option chosen, we create invoice
1826 if (($option == 'bankviainvoice' && $accountid) || $option == 'invoiceonly') {
1827 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1828 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/paymentterm.class.php';
1829
1830 $invoice = new Facture($this->db);
1831 $customer = new Societe($this->db);
1832
1833 if (!$error) {
1834 if (!($this->fk_soc > 0)) { // If not yet linked to a company
1835 if ($autocreatethirdparty) {
1836 // Create a linked thirdparty to member
1837 $companyalias = '';
1838 $fullname = $this->getFullName($langs);
1839
1840 if ($this->morphy == 'mor') {
1841 $companyname = $this->company;
1842 if (!empty($fullname)) {
1843 $companyalias = $fullname;
1844 }
1845 } else {
1846 $companyname = $fullname;
1847 if (!empty($this->company)) {
1848 $companyalias = $this->company;
1849 }
1850 }
1851
1852 $result = $customer->create_from_member($this, (string) $companyname, $companyalias);
1853 if ($result < 0) {
1854 $this->error = $customer->error;
1855 $this->errors = $customer->errors;
1856 $error++;
1857 } else {
1858 $this->fk_soc = $result;
1859 }
1860 } else {
1861 $langs->load("errors");
1862 $this->error = $langs->trans("ErrorMemberNotLinkedToAThirpartyLinkOrCreateFirst");
1863 $this->errors[] = $this->error;
1864 $error++;
1865 }
1866 }
1867 }
1868 if (!$error) {
1869 $result = $customer->fetch($this->fk_soc);
1870 if ($result <= 0) {
1871 $this->error = $customer->error;
1872 $this->errors = $customer->errors;
1873 $error++;
1874 }
1875 }
1876
1877 if (!$error) {
1878 // Create draft invoice
1879 $invoice->type = Facture::TYPE_STANDARD;
1880 $invoice->cond_reglement_id = $customer->cond_reglement_id;
1881 if (empty($invoice->cond_reglement_id)) {
1882 $paymenttermstatic = new PaymentTerm($this->db);
1883 $invoice->cond_reglement_id = $paymenttermstatic->getDefaultId();
1884 if (empty($invoice->cond_reglement_id)) {
1885 $error++;
1886 $this->error = 'ErrorNoPaymentTermRECEPFound';
1887 $this->errors[] = $this->error;
1888 }
1889 }
1890 $invoice->socid = $this->fk_soc;
1891 // set customer's payment bank account on the invoice
1892 if (!empty($customer->fk_account)) {
1893 $invoice->fk_account = $customer->fk_account;
1894 } elseif (getDolGlobalString('FACTURE_RIB_NUMBER')) {
1895 // set default bank account from invoice module settings
1896 $invoice->fk_account = (int) getDolGlobalString('FACTURE_RIB_NUMBER');
1897 }
1898 //set customer's payment method on the invoice
1899 if (!empty($customer->mode_reglement_id)) {
1900 $invoice->mode_reglement_id = $customer->mode_reglement_id;
1901 }
1902 //$invoice->date = $datesubscription;
1903 $invoice->date = dol_now();
1904
1905 // Possibility to add external linked objects with hooks
1906 $invoice->linked_objects['subscription'] = $subscriptionid;
1907 if (GETPOSTISARRAY('other_linked_objects')) {
1908 $invoice->linked_objects = array_merge($invoice->linked_objects, GETPOST('other_linked_objects', 'array:int'));
1909 }
1910
1911 $result = $invoice->create($user);
1912 if ($result <= 0) {
1913 $this->error = $invoice->error;
1914 $this->errors = $invoice->errors;
1915 $error++;
1916 } else {
1917 $this->invoice = $invoice;
1918 }
1919 }
1920
1921 if (!$error) {
1922 // Add line to draft invoice
1923 $idprodsubscription = 0;
1924 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled("product") || isModEnabled("service"))) {
1925 $idprodsubscription = getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS');
1926 }
1927
1928 $vattouse = 0;
1929 if (getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') == 'defaultforfoundationcountry') {
1930 $vattouse = get_default_tva($mysoc, $mysoc, $idprodsubscription);
1931 }
1932 //print xx".$vattouse." - ".$mysoc." - ".$customer;exit;
1933 // @phan-suppress-next-line PhanPluginSuspiciousParamPosition
1934 $result = $invoice->addline($label, 0, 1, $vattouse, 0, 0, $idprodsubscription, 0, $datesubscription, '', 0, 0, 0, 'TTC', $amount, 1);
1935 if ($result <= 0) {
1936 $this->error = $invoice->error;
1937 $this->errors = $invoice->errors;
1938 $error++;
1939 }
1940 }
1941
1942 if (!$error) {
1943 // Validate invoice
1944 $result = $invoice->validate($user);
1945 if ($result <= 0) {
1946 $this->error = $invoice->error;
1947 $this->errors = $invoice->errors;
1948 $error++;
1949 }
1950 }
1951
1952 if (!$error) {
1953 // TODO Link invoice with subscription ?
1954 }
1955
1956 // Add payment onto invoice
1957 if (!$error && $option == 'bankviainvoice' && $accountid) {
1958 require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
1959 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1960 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
1961
1962 $amounts = array();
1963 $amounts[$invoice->id] = (float) price2num($amount);
1964
1965 $paiement = new Paiement($this->db);
1966 $paiement->datepaye = $paymentdate;
1967 $paiement->amounts = $amounts;
1968 $paiement->paiementcode = $operation;
1969 $paiement->paiementid = dol_getIdFromCode($this->db, $operation, 'c_paiement', 'code', 'id', 1);
1970 $paiement->num_payment = $num_chq;
1971 $paiement->note_public = $label;
1972 $paiement->ext_payment_id = $ext_payment_id;
1973 $paiement->ext_payment_site = $ext_payment_site;
1974
1975 if (!$error) {
1976 // Create payment line for invoice
1977 $paiement_id = $paiement->create($user);
1978 if (!($paiement_id > 0)) {
1979 $this->error = $paiement->error;
1980 $this->errors = $paiement->errors;
1981 $error++;
1982 }
1983 }
1984
1985 if (!$error) {
1986 // Add transaction into bank account
1987 $bank_line_id = $paiement->addPaymentToBank($user, 'payment', '(SubscriptionPayment)', $accountid, $emetteur_nom, $emetteur_banque);
1988 if (!($bank_line_id > 0)) {
1989 $this->error = $paiement->error;
1990 $this->errors = $paiement->errors;
1991 $error++;
1992 }
1993 }
1994
1995 if (!$error && !empty($bank_line_id)) {
1996 // Update fk_bank into subscription table
1997 $sql = 'UPDATE '.MAIN_DB_PREFIX.'subscription SET fk_bank='.((int) $bank_line_id);
1998 $sql .= ' WHERE rowid='.((int) $subscriptionid);
1999
2000 $result = $this->db->query($sql);
2001 if (!$result) {
2002 $error++;
2003 }
2004 }
2005
2006 if (!$error) {
2007 // Set invoice as paid
2008 $invoice->setPaid($user);
2009 }
2010 }
2011
2012 if (!$error) {
2013 // Define output language
2014 $outputlangs = $langs;
2015 $newlang = '';
2016 $lang_id = GETPOST('lang_id');
2017 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && !empty($lang_id)) {
2018 $newlang = $lang_id;
2019 }
2020 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
2021 $newlang = $customer->default_lang;
2022 }
2023 if (!empty($newlang)) {
2024 $outputlangs = new Translate("", $conf);
2025 $outputlangs->setDefaultLang($newlang);
2026 }
2027 // Generate PDF (whatever is option MAIN_DISABLE_PDF_AUTOUPDATE) so we can include it into email
2028 //if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE'))
2029
2030 $invoice->fetch($invoice->id); // Reload invoice object data
2031 $invoice->generateDocument($invoice->model_pdf, $outputlangs);
2032 }
2033 }
2034
2035 if ($error) {
2036 return -1;
2037 } else {
2038 return 1;
2039 }
2040 }
2041
2042
2049 public function validate($user)
2050 {
2051 global $langs, $conf;
2052
2053 $error = 0;
2054 $now = dol_now();
2055
2056 // Check parameters
2057 if ($this->statut == self::STATUS_VALIDATED) {
2058 dol_syslog(get_class($this)."::validate statut of member does not allow this", LOG_WARNING);
2059 return 0;
2060 }
2061
2062 $this->db->begin();
2063
2064 $sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET";
2065 $sql .= " statut = ".self::STATUS_VALIDATED;
2066 $sql .= ", datevalid = '".$this->db->idate($now)."'";
2067 $sql .= ", fk_user_valid = ".((int) $user->id);
2068 $sql .= " WHERE rowid = ".((int) $this->id);
2069
2070 dol_syslog(get_class($this)."::validate", LOG_DEBUG);
2071 $result = $this->db->query($sql);
2072 if ($result) {
2073 $this->statut = self::STATUS_VALIDATED;
2074
2075 // Call trigger
2076 $result = $this->call_trigger('MEMBER_VALIDATE', $user);
2077 if ($result < 0) {
2078 $error++;
2079 $this->db->rollback();
2080 return -1;
2081 }
2082 // End call triggers
2083
2084 $this->datevalid = $now;
2085
2086 $this->db->commit();
2087 return 1;
2088 } else {
2089 $this->error = $this->db->error();
2090 $this->db->rollback();
2091 return -1;
2092 }
2093 }
2094
2095
2102 public function resiliate($user)
2103 {
2104 global $langs, $conf;
2105
2106 $error = 0;
2107
2108 // Check parameters
2109 if ($this->statut == self::STATUS_RESILIATED) {
2110 dol_syslog(get_class($this)."::resiliate statut of member does not allow this", LOG_WARNING);
2111 return 0;
2112 }
2113
2114 $this->db->begin();
2115
2116 $sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET";
2117 $sql .= " statut = ".((int) self::STATUS_RESILIATED);
2118 $sql .= ", fk_user_valid = ".((int) $user->id);
2119 $sql .= " WHERE rowid = ".((int) $this->id);
2120
2121 $result = $this->db->query($sql);
2122 if ($result) {
2123 $this->statut = self::STATUS_RESILIATED;
2124
2125 // Call trigger
2126 $result = $this->call_trigger('MEMBER_RESILIATE', $user);
2127 if ($result < 0) {
2128 $error++;
2129 $this->db->rollback();
2130 return -1;
2131 }
2132 // End call triggers
2133
2134 $this->db->commit();
2135 return 1;
2136 } else {
2137 $this->error = $this->db->error();
2138 $this->db->rollback();
2139 return -1;
2140 }
2141 }
2142
2152 public function exclude($user)
2153 {
2154 $error = 0;
2155
2156 // Check parameters
2157 if ($this->statut == self::STATUS_EXCLUDED) {
2158 dol_syslog(get_class($this)."::resiliate statut of member does not allow this", LOG_WARNING);
2159 return 0;
2160 }
2161
2162 $this->db->begin();
2163
2164 $sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET";
2165 $sql .= " statut = ".((int) self::STATUS_EXCLUDED);
2166 $sql .= ", fk_user_valid = ".((int) $user->id);
2167 $sql .= " WHERE rowid = ".((int) $this->id);
2168
2169 $result = $this->db->query($sql);
2170 if ($result) {
2171 $this->statut = self::STATUS_EXCLUDED;
2172
2173 // Call trigger
2174 $result = $this->call_trigger('MEMBER_EXCLUDE', $user);
2175 if ($result < 0) {
2176 $error++;
2177 $this->db->rollback();
2178 return -1;
2179 }
2180 // End call triggers
2181
2182 $this->db->commit();
2183 return 1;
2184 } else {
2185 $this->error = $this->db->error();
2186 $this->db->rollback();
2187 return -1;
2188 }
2189 }
2190
2191 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2197 public function add_to_abo()
2198 {
2199 // phpcs:enable
2200 global $langs;
2201
2202 include_once DOL_DOCUMENT_ROOT.'/mailmanspip/class/mailmanspip.class.php';
2203 $mailmanspip = new MailmanSpip($this->db);
2204
2205 $err = 0;
2206
2207 // mailman
2208 if (getDolGlobalString('ADHERENT_USE_MAILMAN') && isModEnabled('mailmanspip')) {
2209 $result = $mailmanspip->add_to_mailman($this);
2210
2211 if ($result < 0) {
2212 if (!empty($mailmanspip->error)) {
2213 $this->errors[] = $mailmanspip->error;
2214 }
2215 $err += 1;
2216 }
2217 foreach ($mailmanspip->mladded_ko as $tmplist => $tmpemail) {
2218 $langs->load("errors");
2219 $this->errors[] = $langs->trans("ErrorFailedToAddToMailmanList", $tmpemail, $tmplist);
2220 }
2221 foreach ($mailmanspip->mladded_ok as $tmplist => $tmpemail) {
2222 $langs->load("mailmanspip");
2223 $this->mesgs[] = $langs->trans("SuccessToAddToMailmanList", $tmpemail, $tmplist);
2224 }
2225 }
2226
2227 // spip
2228 if (getDolGlobalString('ADHERENT_USE_SPIP') && isModEnabled('mailmanspip')) {
2229 $result = $mailmanspip->add_to_spip($this);
2230 if ($result < 0) {
2231 $this->errors[] = $mailmanspip->error;
2232 $err += 1;
2233 }
2234 }
2235 if ($err) {
2236 return -$err;
2237 } else {
2238 return 1;
2239 }
2240 }
2241
2242
2243 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2249 public function del_to_abo()
2250 {
2251 // phpcs:enable
2252 global $conf, $langs;
2253
2254 include_once DOL_DOCUMENT_ROOT.'/mailmanspip/class/mailmanspip.class.php';
2255 $mailmanspip = new MailmanSpip($this->db);
2256
2257 $err = 0;
2258
2259 // mailman
2260 if (getDolGlobalString('ADHERENT_USE_MAILMAN')) {
2261 $result = $mailmanspip->del_to_mailman($this);
2262 if ($result < 0) {
2263 if (!empty($mailmanspip->error)) {
2264 $this->errors[] = $mailmanspip->error;
2265 }
2266 $err += 1;
2267 }
2268
2269 foreach ($mailmanspip->mlremoved_ko as $tmplist => $tmpemail) {
2270 $langs->load("errors");
2271 $this->errors[] = $langs->trans("ErrorFailedToRemoveToMailmanList", $tmpemail, $tmplist);
2272 }
2273 foreach ($mailmanspip->mlremoved_ok as $tmplist => $tmpemail) {
2274 $langs->load("mailmanspip");
2275 $this->mesgs[] = $langs->trans("SuccessToRemoveToMailmanList", $tmpemail, $tmplist);
2276 }
2277 }
2278
2279 if (getDolGlobalString('ADHERENT_USE_SPIP') && isModEnabled('mailmanspip')) {
2280 $result = $mailmanspip->del_to_spip($this);
2281 if ($result < 0) {
2282 $this->errors[] = $mailmanspip->error;
2283 $err += 1;
2284 }
2285 }
2286 if ($err) {
2287 // error
2288 return -$err;
2289 } else {
2290 return 1;
2291 }
2292 }
2293
2294
2300 public function getCivilityLabel()
2301 {
2302 global $langs;
2303 $langs->load("dict");
2304
2305 $code = (empty($this->civility_id) ? '' : $this->civility_id);
2306 if (empty($code)) {
2307 return '';
2308 }
2309 return $langs->getLabelFromKey($this->db, "Civility".$code, "c_civility", "code", "label", $code);
2310 }
2311
2318 public function getTooltipContentArray($params)
2319 {
2320 global $langs;
2321
2322 $langs->loadLangs(['members', 'companies']);
2323 $nofetch = !empty($params['nofetch']);
2324
2325 $datas = array();
2326
2327 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
2328 $langs->load("users");
2329 return ['optimize' => $langs->trans("ShowUser")];
2330 }
2331 if (!empty($this->photo)) {
2332 $photo = '<div class="photointooltip floatright">';
2333 $photo .= Form::showphoto('memberphoto', $this, 80, 0, 0, 'photoref photowithmargin photologintooltip', 'small', 0, 1);
2334 $photo .= '</div>';
2335 $datas['photo'] = $photo;
2336 }
2337
2338 $datas['divopen'] = '<div class="centpercent">';
2339 $datas['picto'] = img_picto('', $this->picto).' <u class="paddingrightonly">'.$langs->trans("Member").'</u> '.$this->getLibStatut(4);
2340 if (!empty($this->morphy)) {
2341 $datas['picto'] .= '&nbsp;' . $this->getmorphylib('', 1);
2342 }
2343 if (!empty($this->ref)) {
2344 $datas['ref'] = '<br><b>'.$langs->trans('Ref').':</b> '.$this->ref;
2345 }
2346 if (!empty($this->login)) {
2347 $datas['login'] = '<br><b>'.$langs->trans('Login').':</b> '.$this->login;
2348 }
2349 if (!empty($this->firstname) || !empty($this->lastname)) {
2350 $datas['name'] = '<br><b>'.$langs->trans('Name').':</b> '.$this->getFullName($langs);
2351 }
2352 if (!empty($this->company)) {
2353 $datas['company'] = '<br><b>'.$langs->trans('Company').':</b> '.$this->company;
2354 }
2355 if (!empty($this->email)) {
2356 $datas['email'] = '<br><b>'.$langs->trans("EMail").':</b> '.$this->email;
2357 }
2358 $datas['address'] = '<br><b>'.$langs->trans("Address").':</b> '.dol_format_address($this, 1, ' ', $langs);
2359 // show categories for this record only in ajax to not overload lists
2360 if (isModEnabled('category') && !$nofetch) {
2361 require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
2362 $form = new Form($this->db);
2363 $datas['categories'] = '<br>' . $form->showCategories($this->id, Categorie::TYPE_MEMBER, 1);
2364 }
2365 $datas['divclose'] = '</div>';
2366
2367 return $datas;
2368 }
2369
2383 public function getNomUrl($withpictoimg = 0, $maxlen = 0, $option = 'card', $mode = '', $morecss = '', $save_lastsearch_value = -1, $notooltip = 0, $addlinktonotes = 0)
2384 {
2385 global $conf, $langs, $hookmanager;
2386
2387 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER') && $withpictoimg) {
2388 $withpictoimg = 0;
2389 }
2390
2391 $result = '';
2392 $linkstart = '';
2393 $linkend = '';
2394 $classfortooltip = 'classfortooltip';
2395 $dataparams = '';
2396 $params = [
2397 'id' => $this->id,
2398 'objecttype' => $this->element,
2399 'option' => $option,
2400 'nofetch' => 1,
2401 ];
2402 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
2403 $classfortooltip = 'classforajaxtooltip';
2404 $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
2405 $label = '';
2406 } else {
2407 $label = implode($this->getTooltipContentArray($params));
2408 }
2409
2410 $url = DOL_URL_ROOT.'/adherents/card.php?rowid='.((int) $this->id);
2411 if ($option == 'subscription') {
2412 $url = DOL_URL_ROOT.'/adherents/subscription.php?rowid='.((int) $this->id);
2413 }
2414
2415 if ($option != 'nolink') {
2416 // Add param to save lastsearch_values or not
2417 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2418 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
2419 $add_save_lastsearch_values = 1;
2420 }
2421 if ($add_save_lastsearch_values) {
2422 $url .= '&save_lastsearch_values=1';
2423 }
2424 }
2425
2426 $linkstart .= '<a href="'.$url.'"';
2427 $linkclose = "";
2428 if (empty($notooltip)) {
2429 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
2430 $langs->load("users");
2431 $label = $langs->trans("ShowUser");
2432 $linkclose .= ' alt="'.dolPrintHTMLForAttribute($label).'"';
2433 }
2434 $linkclose .= ($label ? ' title="'.dolPrintHTMLForAttribute($label).'"' : ' title="tocomplete"');
2435 $linkclose .= $dataparams.' class="'.$classfortooltip.($morecss ? ' '.$morecss : '').'"';
2436 }
2437
2438 $linkstart .= $linkclose.'>';
2439 $linkend = '</a>';
2440
2441 $result .= $linkstart;
2442
2443 if ($withpictoimg) {
2444 $paddafterimage = '';
2445 if (abs($withpictoimg) == 1 || abs($withpictoimg) == 4) {
2446 $morecss .= ' paddingrightonly';
2447 }
2448 // Only picto
2449 if ($withpictoimg > 0) {
2450 $picto = '<span class="nopadding'.($morecss ? ' userimg'.$morecss : '').'">'.img_object('', 'user', $paddafterimage.' '.($notooltip ? '' : $dataparams), 0, 0, $notooltip ? 0 : 1).'</span>';
2451 } else {
2452 // Picto must be a photo
2453 $picto = '<span class="nopadding'.($morecss ? ' userimg'.$morecss : '').'"'.($paddafterimage ? ' '.$paddafterimage : '').'>';
2454 $picto .= Form::showphoto('memberphoto', $this, 0, 0, 0, 'userphoto'.(($withpictoimg == -3 || $withpictoimg == -4) ? 'small' : ''), 'mini', 0, 1);
2455 $picto .= '</span>';
2456 }
2457 $result .= $picto;
2458 }
2459 if (($withpictoimg > -2 && $withpictoimg != 2) || $withpictoimg == -4) {
2460 if (!getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
2461 $result .= '<span class="nopadding valignmiddle'.((!isset($this->statut) || $this->statut) ? '' : ' strikefordisabled').
2462 ($morecss ? ' usertext'.$morecss : '').'">';
2463 }
2464 if ($mode == 'login') {
2465 $result .= dol_trunc(isset($this->login) ? $this->login : '', $maxlen);
2466 } elseif ($mode == 'ref') {
2467 $result .= $this->ref;
2468 } else {
2469 $result .= $this->getFullName($langs, 0, ($mode == 'firstname' ? 2 : ($mode == 'lastname' ? 4 : -1)), $maxlen);
2470 }
2471 if (!getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
2472 $result .= '</span>';
2473 }
2474 }
2475
2476 $result .= $linkend;
2477
2478 if ($addlinktonotes) {
2479 if ($this->note_private) {
2480 $notetoshow = $langs->trans("ViewPrivateNote").':<br>'.dol_string_nohtmltag($this->note_private, 1);
2481 $result .= ' <span class="note inline-block">';
2482 $result .= '<a href="'.DOL_URL_ROOT.'/adherents/note.php?id='.$this->id.'" class="classfortooltip" title="'.dol_escape_htmltag($notetoshow).'">';
2483 $result .= img_picto('', 'note');
2484 $result .= '</a>';
2485 $result .= '</span>';
2486 }
2487 }
2488 global $action;
2489 $hookmanager->initHooks(array($this->element . 'dao'));
2490 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
2491 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
2492 if ($reshook > 0) {
2493 $result = $hookmanager->resPrint;
2494 } else {
2495 $result .= $hookmanager->resPrint;
2496 }
2497 return $result;
2498 }
2499
2506 public function getLibStatut($mode = 0)
2507 {
2508 return $this->LibStatut($this->status, $this->need_subscription, $this->datefin, $mode);
2509 }
2510
2511 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2521 public function LibStatut($status, $need_subscription, $date_end_subscription, $mode = 0)
2522 {
2523 // phpcs:enable
2524 global $langs;
2525 $langs->load("members");
2526
2527 $statusType = '';
2528 $labelStatus = '';
2529 $labelStatusShort = '';
2530
2531 if ($status == self::STATUS_DRAFT) {
2532 $statusType = 'status0';
2533 $labelStatus = $langs->trans("MemberStatusDraft");
2534 $labelStatusShort = $langs->trans("MemberStatusDraftShort");
2535 } elseif ($status >= self::STATUS_VALIDATED) {
2536 if ($need_subscription === 0) {
2537 $statusType = 'status4';
2538 $labelStatus = $langs->trans("Validated").' - '.$langs->trans("MemberStatusNoSubscription");
2539 $labelStatusShort = $langs->trans("MemberStatusNoSubscriptionShort");
2540 } elseif (!$date_end_subscription) {
2541 $statusType = 'status1';
2542 $labelStatus = $langs->trans("Validated").' - '.$langs->trans("WaitingSubscription");
2543 $labelStatusShort = $langs->trans("WaitingSubscriptionShort");
2544 } elseif ($date_end_subscription < dol_now()) { // expired
2545 $statusType = 'status2';
2546 $labelStatus = $langs->trans("Validated").' - '.$langs->trans("MemberStatusActiveLate");
2547 $labelStatusShort = $langs->trans("MemberStatusActiveLateShort");
2548 } else {
2549 $statusType = 'status4';
2550 $labelStatus = $langs->trans("Validated").' - '.$langs->trans("MemberStatusPaid");
2551 $labelStatusShort = $langs->trans("MemberStatusPaidShort");
2552 }
2553 } elseif ($status == self::STATUS_RESILIATED) {
2554 $statusType = 'status6';
2555 $labelStatus = $langs->transnoentitiesnoconv("MemberStatusResiliated");
2556 $labelStatusShort = $langs->transnoentitiesnoconv("MemberStatusResiliatedShort");
2557 } elseif ($status == self::STATUS_EXCLUDED) {
2558 $statusType = 'status10';
2559 $labelStatus = $langs->transnoentitiesnoconv("MemberStatusExcluded");
2560 $labelStatusShort = $langs->transnoentitiesnoconv("MemberStatusExcludedShort");
2561 }
2562
2563 return dolGetStatus($labelStatus, $labelStatusShort, '', $statusType, $mode);
2564 }
2565
2566
2572 public function loadStateBoard()
2573 {
2574 global $conf;
2575
2576 $this->nb = array();
2577
2578 $sql = "SELECT count(a.rowid) as nb";
2579 $sql .= " FROM ".MAIN_DB_PREFIX."adherent as a";
2580 $sql .= " WHERE a.statut > 0";
2581 $sql .= " AND a.entity IN (".getEntity('adherent').")";
2582
2583 $resql = $this->db->query($sql);
2584 if ($resql) {
2585 while ($obj = $this->db->fetch_object($resql)) {
2586 $this->nb["members"] = $obj->nb;
2587 }
2588 $this->db->free($resql);
2589 return 1;
2590 } else {
2591 dol_print_error($this->db);
2592 $this->error = $this->db->error();
2593 return -1;
2594 }
2595 }
2596
2597 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2605 public function load_board($user, $mode)
2606 {
2607 // phpcs:enable
2608 global $conf, $langs;
2609
2610 if ($user->socid) {
2611 return -1; // protection pour eviter appel par utilisateur externe
2612 }
2613
2614 $now = dol_now();
2615
2616 $sql = "SELECT a.rowid, a.datefin, a.statut";
2617 $sql .= " FROM ".MAIN_DB_PREFIX."adherent as a";
2618 $sql .= ", ".MAIN_DB_PREFIX."adherent_type as t";
2619 $sql .= " WHERE a.fk_adherent_type = t.rowid";
2620 if ($mode == 'expired') {
2621 $sql .= " AND a.statut = ".self::STATUS_VALIDATED;
2622 $sql .= " AND a.entity IN (".getEntity('adherent').")";
2623 $sql .= " AND ((a.datefin IS NULL or a.datefin < '".$this->db->idate($now)."') AND t.subscription = '1')";
2624 } elseif ($mode == 'shift') {
2625 $sql .= " AND a.statut = ".self::STATUS_DRAFT;
2626 $sql .= " AND a.entity IN (".getEntity('adherent').")";
2627 }
2628
2629 $resql = $this->db->query($sql);
2630 if ($resql) {
2631 $langs->load("members");
2632
2633 $warning_delay = 0;
2634 $url = '';
2635 $label = '';
2636 $labelShort = '';
2637
2638 if ($mode == 'expired') {
2639 $warning_delay = $conf->adherent->subscription->warning_delay / 60 / 60 / 24;
2640 $label = $langs->trans("MembersWithSubscriptionToReceive");
2641 $labelShort = $langs->trans("MembersWithSubscriptionToReceiveShort");
2642 $url = DOL_URL_ROOT.'/adherents/list.php?mainmenu=members&amp;statut='.self::STATUS_VALIDATED.'&amp;filter=outofdate';
2643 } elseif ($mode == 'shift') {
2644 $warning_delay = $conf->adherent->subscription->warning_delay / 60 / 60 / 24;
2645 $url = DOL_URL_ROOT.'/adherents/list.php?mainmenu=members&amp;statut='.self::STATUS_DRAFT;
2646 $label = $langs->trans("MembersListToValid");
2647 $labelShort = $langs->trans("ToValidate");
2648 }
2649
2650 $response = new WorkboardResponse();
2651 $response->warning_delay = $warning_delay;
2652 $response->label = $label;
2653 $response->labelShort = $labelShort;
2654 $response->url = $url;
2655 $response->img = img_object('', "user");
2656
2657 $adherentstatic = new Adherent($this->db);
2658
2659 while ($obj = $this->db->fetch_object($resql)) {
2660 $response->nbtodo++;
2661
2662 $adherentstatic->datefin = $this->db->jdate($obj->datefin);
2663 $adherentstatic->statut = $obj->statut;
2664 $adherentstatic->status = $obj->statut;
2665
2666 if ($adherentstatic->hasDelay()) {
2667 $response->nbtodolate++;
2668 }
2669 }
2670
2671 return $response;
2672 } else {
2673 dol_print_error($this->db);
2674 $this->error = $this->db->error();
2675 return -1;
2676 }
2677 }
2678
2679
2691 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
2692 {
2693 global $conf, $langs;
2694
2695 $langs->load("orders");
2696
2697 if (!dol_strlen($modele)) {
2698 $modele = 'standard';
2699
2700 if ($this->model_pdf) {
2701 $modele = $this->model_pdf;
2702 } elseif (getDolGlobalString('ADHERENT_ADDON_PDF')) {
2703 $modele = getDolGlobalString('ADHERENT_ADDON_PDF');
2704 }
2705 }
2706
2707 $modelpath = "core/modules/member/doc/";
2708
2709 return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2710 }
2711
2712
2720 public function initAsSpecimen()
2721 {
2722 global $user, $langs;
2723 $now = dol_now();
2724
2725 // Initialise parameters
2726 $this->id = 0;
2727 $this->ref = 'ABC001';
2728 $this->entity = 1;
2729 $this->specimen = 1;
2730 $this->civility_id = 'MR';
2731 $this->lastname = 'DOLIBARR';
2732 $this->firstname = 'SPECIMEN';
2733 $this->gender = 'man';
2734 $this->login = 'dolibspec';
2735 $this->pass = 'dolibspec';
2736 $this->company = 'Societe ABC';
2737 $this->address = '61 jump street';
2738 $this->zip = '75000';
2739 $this->town = 'Paris';
2740 $this->country_id = 1;
2741 $this->country_code = 'FR';
2742 $this->country = 'France';
2743 $this->morphy = 'mor';
2744 $this->email = 'specimen@specimen.com';
2745 $this->socialnetworks = array(
2746 'skype' => 'skypepseudo',
2747 'twitter' => 'twitterpseudo',
2748 'facebook' => 'facebookpseudo',
2749 'linkedin' => 'linkedinpseudo',
2750 );
2751 $this->phone = '0999999999';
2752 $this->phone_perso = '0999999998';
2753 $this->phone_mobile = '0999999997';
2754 $this->note_public = 'This is a public note';
2755 $this->note_private = 'This is a private note';
2756 $this->birth = $now;
2757 $this->photo = '';
2758 $this->public = 1;
2759 $this->statut = self::STATUS_DRAFT;
2760 $this->status = self::STATUS_DRAFT;
2761
2762 $this->datefin = $now;
2763 $this->datevalid = $now;
2764 $this->default_lang = '';
2765
2766 $this->typeid = 1; // Id type adherent
2767 $this->type = 'Type adherent'; // Libelle type adherent
2768 $this->need_subscription = 0;
2769
2770 $this->first_subscription_date = $now;
2771 $this->first_subscription_date_start = $this->first_subscription_date;
2772 $this->first_subscription_date_end = dol_time_plus_duree($this->first_subscription_date_start, 1, 'y');
2773 $this->first_subscription_amount = 10;
2774
2775 $this->last_subscription_date = $this->first_subscription_date;
2776 $this->last_subscription_date_start = $this->first_subscription_date;
2777 $this->last_subscription_date_end = dol_time_plus_duree($this->last_subscription_date_start, 1, 'y');
2778 $this->last_subscription_amount = 10;
2779 return 1;
2780 }
2781
2782
2783 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2784 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
2794 public function _load_ldap_dn($info, $mode = 0)
2795 {
2796 // phpcs:enable
2797 global $conf;
2798 $dn = '';
2799 if ($mode == 0) {
2800 $dn = getDolGlobalString('LDAP_KEY_MEMBERS') . "=".$info[getDolGlobalString('LDAP_KEY_MEMBERS')]."," . getDolGlobalString('LDAP_MEMBER_DN');
2801 }
2802 if ($mode == 1) {
2803 $dn = getDolGlobalString('LDAP_MEMBER_DN');
2804 }
2805 if ($mode == 2) {
2806 $dn = getDolGlobalString('LDAP_KEY_MEMBERS') . "=".$info[getDolGlobalString('LDAP_KEY_MEMBERS')];
2807 }
2808 return $dn;
2809 }
2810
2811
2812 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2813 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
2819 public function _load_ldap_info()
2820 {
2821 // phpcs:enable
2822 global $conf, $langs;
2823
2824 $info = array();
2825 $socialnetworks = getArrayOfSocialNetworks();
2826 $keymodified = false;
2827
2828 // Object classes
2829 $info["objectclass"] = explode(',', getDolGlobalString('LDAP_MEMBER_OBJECT_CLASS'));
2830
2831 $this->fullname = $this->getFullName($langs);
2832
2833 // For avoid ldap error when firstname and lastname are empty
2834 if ($this->morphy == 'mor' && (empty($this->fullname) || $this->fullname == $this->company)) {
2835 $this->fullname = $this->company;
2836 $this->lastname = $this->company;
2837 }
2838
2839 // Possible LDAP KEY (constname => varname)
2840 $ldapkey = array(
2841 'LDAP_MEMBER_FIELD_FULLNAME' => 'fullname',
2842 'LDAP_MEMBER_FIELD_NAME' => 'lastname',
2843 'LDAP_MEMBER_FIELD_LOGIN' => 'login',
2844 'LDAP_MEMBER_FIELD_LOGIN_SAMBA' => 'login',
2845 'LDAP_MEMBER_FIELD_MAIL' => 'email'
2846 );
2847
2848 // Member
2849 foreach ($ldapkey as $constname => $varname) {
2850 if (!empty($this->$varname) && getDolGlobalString($constname)) {
2851 $info[getDolGlobalString($constname)] = $this->$varname;
2852
2853 // Check if it is the LDAP key and if its value has been changed
2854 if (getDolGlobalString('LDAP_KEY_MEMBERS') && getDolGlobalString('LDAP_KEY_MEMBERS') == getDolGlobalString($constname)) {
2855 if (!empty($this->oldcopy) && $this->$varname != $this->oldcopy->$varname) {
2856 $keymodified = true; // For check if LDAP key has been modified
2857 }
2858 }
2859 }
2860 }
2861 if ($this->firstname && getDolGlobalString('LDAP_MEMBER_FIELD_FIRSTNAME')) {
2862 $info[getDolGlobalString('LDAP_MEMBER_FIELD_FIRSTNAME')] = $this->firstname;
2863 }
2864 if ($this->poste && getDolGlobalString('LDAP_MEMBER_FIELD_TITLE')) {
2865 $info[getDolGlobalString('LDAP_MEMBER_FIELD_TITLE')] = $this->poste;
2866 }
2867 if ($this->company && getDolGlobalString('LDAP_MEMBER_FIELD_COMPANY')) {
2868 $info[getDolGlobalString('LDAP_MEMBER_FIELD_COMPANY')] = $this->company;
2869 }
2870 if ($this->address && getDolGlobalString('LDAP_MEMBER_FIELD_ADDRESS')) {
2871 $info[getDolGlobalString('LDAP_MEMBER_FIELD_ADDRESS')] = $this->address;
2872 }
2873 if ($this->zip && getDolGlobalString('LDAP_MEMBER_FIELD_ZIP')) {
2874 $info[getDolGlobalString('LDAP_MEMBER_FIELD_ZIP')] = $this->zip;
2875 }
2876 if ($this->town && getDolGlobalString('LDAP_MEMBER_FIELD_TOWN')) {
2877 $info[getDolGlobalString('LDAP_MEMBER_FIELD_TOWN')] = $this->town;
2878 }
2879 if ($this->country_code && getDolGlobalString('LDAP_MEMBER_FIELD_COUNTRY')) {
2880 $info[getDolGlobalString('LDAP_MEMBER_FIELD_COUNTRY')] = $this->country_code;
2881 }
2882 foreach ($socialnetworks as $key => $value) {
2883 if ($this->socialnetworks[$value['label']] && getDolGlobalString('LDAP_MEMBER_FIELD_'.strtoupper($value['label']))) {
2884 $info[getDolGlobalString('LDAP_MEMBER_FIELD_'.strtoupper($value['label']))] = $this->socialnetworks[$value['label']];
2885 }
2886 }
2887 if ($this->phone && getDolGlobalString('LDAP_MEMBER_FIELD_PHONE')) {
2888 $info[getDolGlobalString('LDAP_MEMBER_FIELD_PHONE')] = $this->phone;
2889 }
2890 if ($this->phone_perso && getDolGlobalString('LDAP_MEMBER_FIELD_PHONE_PERSO')) {
2891 $info[getDolGlobalString('LDAP_MEMBER_FIELD_PHONE_PERSO')] = $this->phone_perso;
2892 }
2893 if ($this->phone_mobile && getDolGlobalString('LDAP_MEMBER_FIELD_MOBILE')) {
2894 $info[getDolGlobalString('LDAP_MEMBER_FIELD_MOBILE')] = $this->phone_mobile;
2895 }
2896 if ($this->fax && getDolGlobalString('LDAP_MEMBER_FIELD_FAX')) {
2897 $info[getDolGlobalString('LDAP_MEMBER_FIELD_FAX')] = $this->fax;
2898 }
2899 if ($this->note_private && getDolGlobalString('LDAP_MEMBER_FIELD_DESCRIPTION')) {
2900 $info[getDolGlobalString('LDAP_MEMBER_FIELD_DESCRIPTION')] = dol_string_nohtmltag($this->note_private, 2);
2901 }
2902 if ($this->note_public && getDolGlobalString('LDAP_MEMBER_FIELD_NOTE_PUBLIC')) {
2903 $info[getDolGlobalString('LDAP_MEMBER_FIELD_NOTE_PUBLIC')] = dol_string_nohtmltag($this->note_public, 2);
2904 }
2905 if ($this->birth && getDolGlobalString('LDAP_MEMBER_FIELD_BIRTHDATE')) {
2906 $info[getDolGlobalString('LDAP_MEMBER_FIELD_BIRTHDATE')] = dol_print_date($this->birth, 'dayhourldap');
2907 }
2908 if (isset($this->statut) && getDolGlobalString('LDAP_FIELD_MEMBER_STATUS')) {
2909 $info[getDolGlobalString('LDAP_FIELD_MEMBER_STATUS')] = $this->statut;
2910 }
2911 if ($this->datefin && getDolGlobalString('LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION')) {
2912 $info[getDolGlobalString('LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION')] = dol_print_date($this->datefin, 'dayhourldap');
2913 }
2914
2915 // When password is modified
2916 if (!empty($this->pass)) {
2917 if (getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD')) {
2918 $info[getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD')] = $this->pass; // this->pass = Unencrypted password
2919 }
2920 if (getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD_CRYPTED')) {
2921 $info[getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD_CRYPTED')] = dol_hash($this->pass, 'openldap'); // Create OpenLDAP password (see LDAP_PASSWORD_HASH_TYPE)
2922 }
2923 } elseif (getDolGlobalString('LDAP_SERVER_PROTOCOLVERSION') !== '3') {
2924 // Set LDAP password if possible
2925 // If ldap key is modified and LDAPv3 we use ldap_rename function for avoid lose encrypt password
2926 if (getDolGlobalString('DATABASE_PWD_ENCRYPTED')) { // This should be on on default installation
2927 // Just for the case we use old md5 encryption (deprecated, no more used, kept for compatibility)
2928 if (!getDolGlobalString('MAIN_SECURITY_HASH_ALGO') || getDolGlobalString('MAIN_SECURITY_HASH_ALGO') == 'md5') {
2929 if ($this->pass_indatabase_crypted && getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD_CRYPTED')) {
2930 // Create OpenLDAP MD5 password from Dolibarr MD5 password
2931 // Note: This suppose that "pass_indatabase_crypted" is a md5 (this should not happen anymore)"
2932 $info[getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD_CRYPTED')] = dolGetLdapPasswordHash($this->pass_indatabase_crypted, 'md5frommd5');
2933 }
2934 }
2935 } elseif (!empty($this->pass_indatabase)) {
2936 // Use $this->pass_indatabase value if exists
2937 if (getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD')) {
2938 $info[getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD')] = $this->pass_indatabase; // $this->pass_indatabase = Unencrypted password
2939 }
2940 if (getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD_CRYPTED')) {
2941 $info[getDolGlobalString('LDAP_MEMBER_FIELD_PASSWORD_CRYPTED')] = dol_hash($this->pass_indatabase, 'openldap'); // Create OpenLDAP password (see LDAP_PASSWORD_HASH_TYPE)
2942 }
2943 }
2944 }
2945
2946 // Subscriptions
2947 if ($this->first_subscription_date && getDolGlobalString('LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE')) {
2948 $info[getDolGlobalString('LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE')] = dol_print_date($this->first_subscription_date, 'dayhourldap');
2949 }
2950 if (isset($this->first_subscription_amount) && getDolGlobalString('LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT')) {
2951 $info[getDolGlobalString('LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT')] = $this->first_subscription_amount;
2952 }
2953 if ($this->last_subscription_date && getDolGlobalString('LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE')) {
2954 $info[getDolGlobalString('LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE')] = dol_print_date($this->last_subscription_date, 'dayhourldap');
2955 }
2956 if (isset($this->last_subscription_amount) && getDolGlobalString('LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT')) {
2957 $info[getDolGlobalString('LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT')] = $this->last_subscription_amount;
2958 }
2959
2960 return $info;
2961 }
2962
2963
2970 public function info($id)
2971 {
2972 $sql = 'SELECT a.rowid, a.datec as datec,';
2973 $sql .= ' a.datevalid as datev,';
2974 $sql .= ' a.tms as datem,';
2975 $sql .= ' a.fk_user_author, a.fk_user_valid, a.fk_user_mod';
2976 $sql .= ' FROM '.MAIN_DB_PREFIX.'adherent as a';
2977 $sql .= ' WHERE a.rowid = '.((int) $id);
2978
2979 dol_syslog(get_class($this)."::info", LOG_DEBUG);
2980 $result = $this->db->query($sql);
2981 if ($result) {
2982 if ($this->db->num_rows($result)) {
2983 $obj = $this->db->fetch_object($result);
2984
2985 $this->id = $obj->rowid;
2986
2987 $this->user_creation_id = $obj->fk_user_author;
2988 $this->user_validation_id = $obj->fk_user_valid;
2989 $this->user_modification_id = $obj->fk_user_mod;
2990 $this->date_creation = $this->db->jdate($obj->datec);
2991 $this->date_validation = $this->db->jdate($obj->datev);
2992 $this->date_modification = $this->db->jdate($obj->datem);
2993 }
2994
2995 $this->db->free($result);
2996 } else {
2997 dol_print_error($this->db);
2998 }
2999 }
3000
3006 public function getNbOfEMailings()
3007 {
3008 $sql = "SELECT count(mc.email) as nb";
3009 $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc";
3010 $sql .= " WHERE mc.email = '".$this->db->escape($this->email)."'";
3011 $sql .= " AND mc.statut NOT IN (-1,0)"; // -1 erreur, 0 non envoye, 1 envoye avec success
3012
3013 $resql = $this->db->query($sql);
3014 if ($resql) {
3015 $obj = $this->db->fetch_object($resql);
3016 $nb = $obj->nb;
3017
3018 $this->db->free($resql);
3019 return $nb;
3020 } else {
3021 $this->error = $this->db->error();
3022 return -1;
3023 }
3024 }
3025
3036 public function setCategories($categories)
3037 {
3038 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
3039 return parent::setCategoriesCommon($categories, Categorie::TYPE_MEMBER);
3040 }
3041
3050 public static function replaceThirdparty($db, $origin_id, $dest_id)
3051 {
3052 $tables = array('adherent');
3053
3054 return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables);
3055 }
3056
3062 public function hasDelay()
3063 {
3064 global $conf;
3065
3066 //Only valid members
3067 if ($this->statut != self::STATUS_VALIDATED) {
3068 return false;
3069 }
3070 if (!$this->datefin) {
3071 return false;
3072 }
3073
3074 $now = dol_now();
3075
3076 return $this->datefin < ($now - $conf->adherent->subscription->warning_delay);
3077 }
3078
3079
3088 public function sendReminderForExpiredSubscription($daysbeforeendlist = '10', $fk_adherent_type = 0)
3089 {
3090 global $conf, $langs, $mysoc, $user;
3091
3092 $error = 0;
3093 $this->output = '';
3094 $this->error = '';
3095
3096 $blockingerrormsg = '';
3097
3098 if (!isModEnabled('member')) { // Should not happen. If module disabled, cron job should not be visible.
3099 $langs->load("agenda");
3100 $this->output = $langs->trans('ModuleNotEnabled', $langs->transnoentitiesnoconv("Adherent"));
3101 return 0;
3102 }
3103 if (!getDolGlobalString('MEMBER_REMINDER_EMAIL')) {
3104 $langs->load("agenda");
3105 $this->output = $langs->trans('EventRemindersByEmailNotEnabled', $langs->transnoentitiesnoconv("Adherent"));
3106 return 0;
3107 }
3108
3109 $now = dol_now();
3110 $nbok = 0;
3111 $nbko = 0;
3112
3113 $listofmembersok = array();
3114 $listofmembersko = array();
3115
3116 $arraydaysbeforeend = explode(';', $daysbeforeendlist);
3117 foreach ($arraydaysbeforeend as $daysbeforeend) { // Loop on each delay
3118 dol_syslog(__METHOD__.' - Process delta = '.$daysbeforeend, LOG_DEBUG);
3119
3120 if (!is_numeric($daysbeforeend)) {
3121 $blockingerrormsg = "Value for delta is not a numeric value";
3122 $nbko++;
3123 break;
3124 }
3125
3126 $tmp = dol_getdate($now);
3127 $datetosearchfor = dol_time_plus_duree(dol_mktime(0, 0, 0, $tmp['mon'], $tmp['mday'], $tmp['year'], 'tzserver'), (int) $daysbeforeend, 'd');
3128 $datetosearchforend = dol_time_plus_duree(dol_mktime(23, 59, 59, $tmp['mon'], $tmp['mday'], $tmp['year'], 'tzserver'), (int) $daysbeforeend, 'd');
3129
3130 $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'adherent';
3131 $sql .= " WHERE entity = ".((int) $conf->entity); // Do not use getEntity('adherent').")" here, we want the batch to be on its entity only;
3132 $sql .= " AND statut = 1";
3133 $sql .= " AND datefin >= '".$this->db->idate($datetosearchfor)."'";
3134 $sql .= " AND datefin <= '".$this->db->idate($datetosearchforend)."'";
3135 if ((int) $fk_adherent_type > 0) {
3136 $sql .= " AND fk_adherent_type = ".((int) $fk_adherent_type);
3137 }
3138 //$sql .= " LIMIT 10000";
3139
3140 $resql = $this->db->query($sql);
3141 if ($resql) {
3142 $num_rows = $this->db->num_rows($resql);
3143
3144 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
3145 $adherent = new Adherent($this->db);
3146 $formmail = new FormMail($this->db);
3147
3148 $i = 0;
3149 while ($i < $num_rows) {
3150 $obj = $this->db->fetch_object($resql);
3151
3152 $adherent->fetch($obj->rowid, '', 0, '', true, true);
3153
3154 if (empty($adherent->email)) {
3155 $nbko++;
3156 $listofmembersko[$adherent->id] = $adherent->id;
3157 } else {
3158 $thirdpartyres = $adherent->fetch_thirdparty();
3159 if ($thirdpartyres === -1) {
3160 $languagecodeformember = $mysoc->default_lang;
3161 } else {
3162 // Language code to use ($languagecodeformember) is default language of thirdparty, if no thirdparty, the language found from country of member then country of thirdparty, and if still not found we use the language of company.
3163 $languagefromcountrycode = getLanguageCodeFromCountryCode($adherent->country_code ? $adherent->country_code : $adherent->thirdparty->country_code);
3164 $languagecodeformember = (empty($adherent->thirdparty->default_lang) ? ($languagefromcountrycode ? $languagefromcountrycode : $mysoc->default_lang) : $adherent->thirdparty->default_lang);
3165 }
3166
3167 // Send reminder email
3168 $outputlangs = new Translate('', $conf);
3169 $outputlangs->setDefaultLang($languagecodeformember);
3170 $outputlangs->loadLangs(array("main", "members"));
3171 dol_syslog("sendReminderForExpiredSubscription Language for member id ".$adherent->id." set to ".$outputlangs->defaultlang." mysoc->default_lang=".$mysoc->default_lang);
3172
3173 $arraydefaultmessage = null;
3174 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION');
3175
3176 if (!empty($labeltouse)) {
3177 $arraydefaultmessage = $formmail->getEMailTemplate($this->db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
3178 }
3179
3180 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
3181 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $adherent);
3182 //if (is_array($adherent->thirdparty)) $substitutionarraycomp = ...
3183 complete_substitutions_array($substitutionarray, $outputlangs, $adherent);
3184
3185 $subject = make_substitutions($arraydefaultmessage->topic, $substitutionarray, $outputlangs);
3186 $msg = make_substitutions($arraydefaultmessage->content, $substitutionarray, $outputlangs);
3187 $from = getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from);
3188 $to = $adherent->email;
3189 $cc = getDolGlobalString('ADHERENT_CC_MAIL_FROM');
3190
3191 $trackid = 'mem'.$adherent->id;
3192 $moreinheader = 'X-Dolibarr-Info: sendReminderForExpiredSubscription'."\r\n";
3193
3194 include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
3195 $cmail = new CMailFile($subject, $to, $from, $msg, array(), array(), array(), $cc, '', 0, 1, '', '', $trackid, $moreinheader);
3196 $result = $cmail->sendfile();
3197 if (!$result) {
3198 $error++;
3199 $this->error .= $cmail->error.' ';
3200 if (!is_null($cmail->errors)) {
3201 $this->errors += $cmail->errors;
3202 }
3203 $nbko++;
3204 $listofmembersko[$adherent->id] = $adherent->id;
3205 } else {
3206 $nbok++;
3207 $listofmembersok[$adherent->id] = $adherent->id;
3208
3209 $message = $msg;
3210 $sendto = $to;
3211 $sendtocc = '';
3212 $sendtobcc = '';
3213 $actioncode = 'EMAIL';
3214 $extraparams = array();
3215
3216 $actionmsg = '';
3217 $actionmsg2 = $langs->transnoentities('MailSentByTo', CMailFile::getValidAddress($from, 4, 0, 1), CMailFile::getValidAddress($sendto, 4, 0, 1));
3218 if ($message) {
3219 $actionmsg = $langs->transnoentities('MailFrom').': '.dol_escape_htmltag($from);
3220 $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTo').': '.dol_escape_htmltag($sendto));
3221 if ($sendtocc) {
3222 $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc').": ".dol_escape_htmltag($sendtocc));
3223 }
3224 $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic').": ".$subject);
3225 $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody').":");
3226 $actionmsg = dol_concatdesc($actionmsg, $message);
3227 }
3228
3229 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
3230
3231 // Insert record of emails sent
3232 $actioncomm = new ActionComm($this->db);
3233
3234 $actioncomm->type_code = 'AC_OTH_AUTO'; // Type of event ('AC_OTH', 'AC_OTH_AUTO', 'AC_XXX'...)
3235 $actioncomm->code = 'AC_'.$actioncode;
3236 $actioncomm->label = $actionmsg2;
3237 $actioncomm->note_private = $actionmsg;
3238 $actioncomm->fk_project = 0;
3239 $actioncomm->datep = $now;
3240 $actioncomm->datef = $now;
3241 $actioncomm->percentage = -1; // Not applicable
3242 $actioncomm->socid = $adherent->thirdparty->id;
3243 $actioncomm->contact_id = 0;
3244 $actioncomm->authorid = $user->id; // User saving action
3245 $actioncomm->userownerid = $user->id; // Owner of action
3246 // Fields when action is en email (content should be added into note)
3247 $actioncomm->email_msgid = $cmail->msgid;
3248 $actioncomm->email_from = $from;
3249 $actioncomm->email_sender = '';
3250 $actioncomm->email_to = $to;
3251 $actioncomm->email_tocc = $sendtocc;
3252 $actioncomm->email_tobcc = $sendtobcc;
3253 $actioncomm->email_subject = $subject;
3254 $actioncomm->errors_to = '';
3255
3256 $actioncomm->fk_element = $adherent->id;
3257 $actioncomm->elementid = $adherent->id;
3258 $actioncomm->elementtype = $adherent->element;
3259
3260 $actioncomm->extraparams = $extraparams;
3261
3262 $actioncomm->create($user);
3263 }
3264 } else {
3265 //$blockingerrormsg = "Can't find email template with label=".$labeltouse.", to use for the reminding email";
3266
3267 $error++;
3268 $this->error .= "Can't find email template with label=".$labeltouse.", to use for the reminding email ";
3269
3270 $nbko++;
3271 $listofmembersko[$adherent->id] = $adherent->id;
3272
3273 break;
3274 }
3275 }
3276
3277 $i++;
3278 }
3279 } else {
3280 $this->error = $this->db->lasterror();
3281 return 1;
3282 }
3283 }
3284
3285 if ($blockingerrormsg) {
3286 $this->error = $blockingerrormsg;
3287 return 1;
3288 } else {
3289 $this->output = 'Found '.($nbok + $nbko).' members to send reminder to.';
3290 $this->output .= ' Send email successfully to '.$nbok.' members';
3291 if (is_array($listofmembersok)) {
3292 $listofids = '';
3293 $i = 0;
3294 foreach ($listofmembersok as $idmember) {
3295 if ($i > 100) {
3296 $listofids .= ', ...';
3297 break;
3298 }
3299 if (empty($listofids)) {
3300 $listofids .= ' [';
3301 } else {
3302 $listofids .= ', ';
3303 }
3304 $listofids .= $idmember;
3305 $i++;
3306 }
3307 if ($listofids) {
3308 $listofids .= ']';
3309 }
3310
3311 $this->output .= ($listofids ? ' ids='.$listofids : '');
3312 }
3313 if ($nbko) {
3314 $this->output .= ' - Canceled for '.$nbko.' member (no email or email sending error)';
3315 if (is_array($listofmembersko)) {
3316 $listofids = '';
3317 $i = 0;
3318 foreach ($listofmembersko as $idmember) {
3319 if ($i > 100) {
3320 $listofids .= ', ...';
3321 break;
3322 }
3323 if (empty($listofids)) {
3324 $listofids .= ' [';
3325 } else {
3326 $listofids .= ', ';
3327 }
3328 $listofids .= $idmember;
3329 $i++;
3330 }
3331 if ($listofids) {
3332 $listofids .= ']';
3333 }
3334 $this->output .= ($listofids ? ' ids='.$listofids : '');
3335 }
3336 }
3337 }
3338
3339 return $nbko;
3340 }
3341
3349 public function getKanbanView($option = '', $arraydata = null)
3350 {
3351 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
3352
3353 $return = '<div class="box-flex-item box-flex-grow-zero">';
3354 $return .= '<div class="info-box info-box-sm">';
3355 $return .= '<span class="info-box-icon bg-infobox-action">';
3356 if (property_exists($this, 'photo') || !empty($this->photo)) {
3357 $return .= Form::showphoto('memberphoto', $this, 0, 60, 0, 'photokanban photowithmargin photologintooltip', 'small', 0, 1);
3358 } else {
3359 $return .= img_picto('', 'user');
3360 }
3361 $return .= '</span>';
3362 $return .= '<div class="info-box-content">';
3363 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
3364 if ($selected >= 0) {
3365 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
3366 }
3367 $return .= '<br><span class="info-box-label paddingright">'.$this->getmorphylib('', 2).'</span>';
3368 $return .= '<span class="info-box-label opacitymedium">'.$this->type.'</span>';
3369
3370 if (method_exists($this, 'getLibStatut')) {
3371 $return .= '<br><div class="info-box-status paddingtop">';
3372 $return .= $this->LibStatut($this->status, $this->need_subscription, $this->datefin, 5);
3373 $return .= '</div>';
3374 }
3375 $return .= '</div>';
3376 $return .= '</div>';
3377 $return .= '</div>';
3378 return $return;
3379 }
3380}
$object ref
Definition info.php:90
Class to manage bank accounts.
Class to manage agenda events (actions)
Class to manage members of a foundation.
setThirdPartyId($thirdpartyid)
Set link to a third party.
hasDelay()
Return if a member is late (subscription late) or not.
exclude($user)
Functiun to exclude (set adherent.status to -2) a member TODO A private note should be added to know ...
add_to_abo()
Function to add member into external tools mailing-list, spip, etc.
loadStateBoard()
Load indicators this->nb in state board.
_load_ldap_dn($info, $mode=0)
Retourne chaine DN complete dans l'annuaire LDAP pour l'objet.
update($user, $notrigger=0, $nosyncuser=0, $nosyncuserpass=0, $nosyncthirdparty=0, $action='update')
Update a member in database (standard information and password)
setCategories($categories)
Sets object to supplied categories.
getTooltipContentArray($params)
getTooltipContentArray
getNbOfEMailings()
Return number of mass Emailing received by this member with its email.
update_end_date($user)
Update denormalized last subscription date.
static replaceThirdparty($db, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
makeSubstitution($text)
Make substitution of tags into text with value of current object.
const STATUS_EXCLUDED
Excluded.
LibStatut($status, $need_subscription, $date_end_subscription, $mode=0)
Renvoi le libelle d'un statut donne.
fetch_name($firstname, $lastname)
Method to load member from its name.
initAsSpecimen()
Initialise an instance with random values.
fetch($rowid, $ref='', $fk_soc=0, $ref_ext='', $fetch_optionals=true, $fetch_subscriptions=true)
Load member from database.
del_to_abo()
Function to delete a member from external tools like mailing-list, spip, etc.
resiliate($user)
Fonction qui resilie un adherent.
getCivilityLabel()
Return civility label of a member.
getmorphylib($morphy='', $addbadge=0)
Return translated label by the nature of a adherent (physical or moral)
sendEmail($text, $subject, $filename_list=array(), $mimetype_list=array(), $mimefilename_list=array(), $addr_cc="", $addr_bcc="", $deliveryreceipt=0, $msgishtml=-1, $errors_to='', $moreinheader='')
Function sending an email to the current member with the text supplied in parameter.
fetchPartnerships($mode)
Function to get partnerships array.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
setPassword($user, $password='', $isencrypted=0, $notrigger=0, $nosyncuser=0)
Change password of a user.
$fields
'type' field format: 'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortf...
getKanbanView($option='', $arraydata=null)
Return clickable link of object (with eventually picto)
const STATUS_DRAFT
Draft status.
const STATUS_RESILIATED
Resiliated (membership end and was not renew)
sendReminderForExpiredSubscription($daysbeforeendlist='10', $fk_adherent_type=0)
Send reminders by emails before subscription end CAN BE A CRON TASK.
fetch_login($login)
Method to load member from its login.
_load_ldap_info()
Initialise tableau info (tableau des attributes LDAP)
getLibStatut($mode=0)
Retourne le libelle du statut d'un adherent (brouillon, valide, resilie, exclu)
info($id)
Load type info information in the member object.
__construct($db)
Constructor.
subscription($date, $amount, $accountid=0, $operation='', $label='', $num_chq='', $emetteur_nom='', $emetteur_banque='', $datesubend=0, $fk_type=null)
Insert subscription into database and eventually add links to banks, mailman, etc....
send_an_email($text, $subject, $filename_list=array(), $mimetype_list=array(), $mimefilename_list=array(), $addr_cc="", $addr_bcc="", $deliveryreceipt=0, $msgishtml=-1, $errors_to='', $moreinheader='')
Function sending an email to the current member with the text supplied in parameter.
getNomUrl($withpictoimg=0, $maxlen=0, $option='card', $mode='', $morecss='', $save_lastsearch_value=-1, $notooltip=0, $addlinktonotes=0)
Return clickable name (with picto eventually)
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
subscriptionComplementaryActions($subscriptionid, $option, $accountid, $datesubscription, $paymentdate, $operation, $label, $amount, $num_chq, $emetteur_nom='', $emetteur_banque='', $autocreatethirdparty=0, $ext_payment_id='', $ext_payment_site='')
Do complementary actions after subscription recording.
setUserId($userid)
Set link to a user.
const STATUS_VALIDATED
Validated status.
fetch_subscriptions()
Function to get member subscriptions data: subscriptions, first_subscription_date,...
validate($user)
Function that validate a member.
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
static getValidAddress($address, $format, $encode=0, $maxnumberofemail=0)
Return a formatted address string for SMTP protocol.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
setErrorsFromObject($object)
setErrorsFromObject
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage invoices.
const TYPE_STANDARD
Standard invoice.
Class to manage generation of HTML components Only common components must be here.
static showphoto($modulepart, $object, $width=100, $height=0, $caneditfield=0, $cssclass='photowithmargin', $imagesize='', $addlinktofullsize=1, $cache=0, $forcecapture='', $noexternsourceoverwrite=0)
Return HTML code to output a photo.
Class permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new Form...
Class to manage mailman and spip.
Class to manage payments of customer invoices.
Class to manage payment terms records in dictionary.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage subscriptions of foundation members.
Class to manage translations.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition index.php:171
getFullName($langs, $option=0, $nameorder=-1, $maxlen=0)
Return full name (civility+' '+name+' '+lastname)
setUpperOrLowerCase()
Set to upper or ucwords/lower if needed.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:125
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as p label as s rowid as s nom as s email
Sender: Who sends the email ("Sender" has sent emails on behalf of "From").
clean_url($url, $http=1)
Clean an url string.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
getLanguageCodeFromCountryCode($countrycode)
Return default language from country code.
setEntity($currentobject)
Set entity id to use when to create an object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
dol_format_address($object, $withcountry=0, $sep="\n", $outputlangs=null, $mode=0, $extralangcode='')
Return a formatted address (part address/zip/town/state) according to country rules.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dolGetFirstLetters($s, $nbofchar=1)
Return first letters of a strings.
dol_strtoupper($string, $encoding="UTF-8")
Convert a string to upper.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
getArrayOfSocialNetworks()
Get array of social network dictionary.
dol_textishtml($msg, $option=0)
Return if a text is a html content.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
div refaddress div address
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:158
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.
dolGetLdapPasswordHash($password, $type='md5')
Returns a specific ldap hash of a password.