4 * Copyright © 2003-2024 The Galette Team
6 * This file is part of Galette (https://galette.eu).
8 * Galette is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
13 * Galette is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
22 namespace Galette\Events
;
25 use Galette\Core\GaletteMail
;
26 use Galette\Core\History
;
27 use Galette\Core\Login
;
28 use Galette\Core\Password
;
29 use Galette\Core\Preferences
;
30 use Galette\Entity\Adherent
;
31 use Galette\Entity\Texts
;
33 use League\Event\ListenerRegistry
;
34 use League\Event\ListenerSubscriber
;
35 use Slim\Flash\Messages
;
36 use Slim\Routing\RouteParser
;
39 * Event listener for members
41 * @author Johan Cwiklinski <johan@x-tnd.be>
43 class MemberListener
implements ListenerSubscriber
45 private Preferences
$preferences;
46 private RouteParser
$routeparser;
47 private History
$history;
48 private Messages
$flash;
55 * @param Preferences $preferences Preferences instance
56 * @param RouteParser $routeparser RouteParser instance
57 * @param History $history History instance
58 * @param Messages $flash Messages instance
59 * @param Login $login Login instance
60 * @param Db $zdb Db instance
62 public function __construct(
63 Preferences
$preferences,
64 RouteParser
$routeparser,
70 $this->preferences
= $preferences;
71 $this->routeparser
= $routeparser;
72 $this->history
= $history;
73 $this->flash
= $flash;
74 $this->login
= $login;
79 * Set up member listeners
81 * @param ListenerRegistry $acceptor Listener
85 public function subscribeListeners(ListenerRegistry
$acceptor): void
87 $acceptor->subscribeTo(
89 function (GaletteEvent
$event): void
{
90 $this->memberAdded($event->getObject());
94 $acceptor->subscribeTo(
96 function (GaletteEvent
$event): void
{
97 $this->memberEdited($event->getObject());
103 * Member added listener
105 * @param Adherent $member Added member
109 public function memberAdded(Adherent
$member): void
112 '[' . get_class($this) . '] Event member.add emitted for ' . $member->sfullname
,
116 if ($member->sendEMail()) {
117 $this->sendMemberEmail($member, true);
120 $this->sendAdminEmail($member, true);
124 * Member edited listener
126 * @param Adherent $member Added member
130 public function memberEdited(Adherent
$member): void
133 '[' . get_class($this) . '] Event member.edit emitted for ' . $member->sfullname
,
137 if ($member->sendEMail()) {
138 $this->sendMemberEmail($member, false);
141 $this->sendAdminEmail($member, false);
145 * Send account email to member
147 * @param Adherent $member Member
148 * @param boolean $new New member or editing existing one
152 private function sendMemberEmail(Adherent
$member, bool $new): void
154 if ($this->preferences
->pref_mail_method
== GaletteMail
::METHOD_DISABLED
) {
155 //if email has been disabled in the preferences, we should not be here ;
156 //we do not throw an error, just a simple warning that will be show later
157 $msg = _T("You asked Galette to send a confirmation email to the member, but email has been disabled in the preferences.");
158 $this->flash
->addMessage(
165 if ($member->getEmail() == '' && !$member->self_adh
) {
166 $this->flash
->addMessage(
168 _T("- You can't send a confirmation by email if the member hasn't got an address!")
173 // Get email text in database
179 $texts->setMember($member)->setNoContribution();
182 $password = new Password($this->zdb
);
183 $res = $password->generateNewPassword($member->id
);
187 ->setChangePasswordURI($password);
192 _T("An error occurred storing temporary password for %s. Please inform an admin.")
194 $this->history
->add($str);
195 $this->flash
->addMessage(
202 $mlang = $member->language
;
204 (($new) ?
'sub' : 'accountedited'),
208 $mail = new GaletteMail($this->preferences
);
209 $mail->setSubject($texts->getSubject());
210 $mail->setRecipients(
212 $member->getEmail() => $member->sname
215 $mail->setMessage($texts->getBody());
216 $sent = $mail->send();
218 if ($sent == GaletteMail
::MAIL_SENT
) {
221 $member->sname
. ' (' . $member->getEmail() . ')',
223 _T("New account email sent to '%s'.") : _T("Account modification email sent to '%s'.")
225 $this->history
->add($msg);
226 $success_detected[] = $msg;
230 $member->sname
. ' (' . $member->getEmail() . ')',
231 _T("A problem happened while sending account email to '%s'")
233 $this->history
->add($str);
234 $error_detected[] = $str;
239 * Send account email to admin
241 * @param Adherent $member Member
242 * @param boolean $new New member or editing existing one
246 private function sendAdminEmail(Adherent
$member, bool $new): void
249 $this->preferences
->pref_mail_method
== GaletteMail
::METHOD_DISABLED
250 ||
!$this->preferences
->pref_bool_mailadh
251 ||
(!$new && $member->id
!= $this->login
->id
)
261 $texts->setMember($member)->setNoContribution();
265 $txt_id = ($member->self_adh ?
'newselfadh' : 'newadh');
267 $txt_id = 'admaccountedited';
270 $mlang = $this->preferences
->pref_lang
;
276 $mail = new GaletteMail($this->preferences
);
277 $mail->setSubject($texts->getSubject());
279 foreach ($this->preferences
->vpref_email_newadh
as $pref_email) {
280 $recipients[$pref_email] = $pref_email;
282 $mail->setRecipients($recipients);
283 $mail->setMessage($texts->getBody());
284 $sent = $mail->send();
286 if ($sent == GaletteMail
::MAIL_SENT
) {
290 $member->sname
. ' (' . $member->email
. ')',
291 _T("New account email sent to admin for '%s'.")
292 ) : _T("Account modification email sent to admin.");
294 $this->history
->add($msg);
295 $this->flash
->addMessage(
303 $member->sname
. ' (' . $member->email
. ')',
304 _T("A problem happened while sending email to admin for account '%s'.")
305 ) : _T("A problem happened while sending account email to admin");
307 $this->history
->add($msg);
308 $this->flash
->addMessage(