]> git.agnieray.net Git - galette.git/blob - galette/lib/Galette/Events/MemberListener.php
Fix admin notification on member creation
[galette.git] / galette / lib / Galette / Events / MemberListener.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Event listener for members
7 *
8 * PHP version 5
9 *
10 * Copyright © 2020 The Galette Team
11 *
12 * This file is part of Galette (http://galette.tuxfamily.org).
13 *
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
26 *
27 * @category Events
28 * @package Galette
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2020 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @link http://galette.tuxfamily.org
34 * @since Available since 2020-07-14
35 */
36
37 namespace Galette\Events;
38
39 use Galette\Core\Db;
40 use Galette\Core\GaletteMail;
41 use Galette\Core\History;
42 use Galette\Core\Login;
43 use Galette\Core\Password;
44 use Galette\Core\Preferences;
45 use Galette\Entity\Adherent;
46 use Galette\Entity\Texts;
47 use Analog\Analog;
48 use League\Event\Event;
49 use League\Event\ListenerAcceptorInterface;
50 use League\Event\ListenerProviderInterface;
51 use Slim\Flash\Messages;
52 use Slim\Router;
53
54 /**
55 * Event listener for members
56 *
57 * @category Events
58 * @name MemberListener
59 * @package Galette
60 * @author Johan Cwiklinski <johan@x-tnd.be>
61 * @copyright 2020 The Galette Team
62 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
63 * @link https://galette.eu
64 * @since Available since 2020-07-14
65 */
66 class MemberListener implements ListenerProviderInterface
67 {
68 /** @var Preferences */
69 private $preferences;
70 /** @var Router */
71 private $router;
72 /** @var History */
73 private $history;
74 /** @var Messages */
75 private $flash;
76 /** @var Login */
77 private $login;
78 /** @var Db */
79 private $zdb;
80
81 /**
82 * Constructor
83 *
84 * @param Preferences $preferences Preferences instance
85 * @param Router $router Router instance
86 * @param History $history History instance
87 * @param Messages $flash Messages instance
88 * @param Login $login Login instance
89 * @param Db $zdb Db instance
90 */
91 public function __construct(
92 Preferences $preferences,
93 Router $router,
94 History $history,
95 Messages $flash,
96 Login $login,
97 Db $zdb
98 ) {
99 $this->preferences = $preferences;
100 $this->router = $router;
101 $this->history = $history;
102 $this->flash = $flash;
103 $this->login = $login;
104 $this->zdb = $zdb;
105 }
106
107 /**
108 * Set up member listeners
109 *
110 * @param ListenerAcceptorInterface $acceptor Listener
111 *
112 * @return void
113 */
114 public function provideListeners(ListenerAcceptorInterface $acceptor)
115 {
116 $acceptor->addListener(
117 'member.add',
118 function ($event, $member) {
119 $this->memberAdded($event, $member);
120 }
121 );
122
123 $acceptor->addListener(
124 'member.edit',
125 function ($event, $member) {
126 $this->memberEdited($event, $member);
127 }
128 );
129 }
130
131 /**
132 * Memebr added listener
133 *
134 * @param Event $event Raised event
135 * @param Adherent $member Added member
136 *
137 * @return void
138 */
139 public function memberAdded(Event $event, Adherent $member)
140 {
141 Analog::log(
142 '[' . get_class($this) . '] Event member.add emitted for ' . $member->sfullname,
143 Analog::DEBUG
144 );
145
146 if ($member->sendEMail()) {
147 $this->sendMemberEmail($member, true);
148 }
149
150 $this->sendAdminEmail($member, true);
151 }
152
153 /**
154 * Memebr edited listener
155 *
156 * @param Event $event Raised event
157 * @param Adherent $member Added member
158 *
159 * @return void
160 */
161 public function memberEdited(Event $event, Adherent $member)
162 {
163 Analog::log(
164 '[' . get_class($this) . '] Event member.edit emitted for ' . $member->sfullname,
165 Analog::DEBUG
166 );
167
168 if ($member->sendEMail()) {
169 $this->sendMemberEmail($member, false);
170 }
171
172 $this->sendAdminEmail($member, false);
173 }
174
175 /**
176 * Send account email to member
177 *
178 * @param Adherent $member Member
179 * @param boolean $new New member or editing existing one
180 *
181 * @return void
182 */
183 private function sendMemberEmail(Adherent $member, $new)
184 {
185 if ($this->preferences->pref_mail_method == GaletteMail::METHOD_DISABLED) {
186 //if email has been disabled in the preferences, we should not be here ;
187 //we do not throw an error, just a simple warning that will be show later
188 $msg = _T("You asked Galette to send a confirmation email to the member, but email has been disabled in the preferences.");
189 $this->flash->addMessage(
190 'warning_detected',
191 $msg
192 );
193 return;
194 }
195
196 if ($member->getEmail() == '' && !$member->self_adh) {
197 $this->flash->addMessage(
198 'error_detected',
199 _T("- You can't send a confirmation by email if the member hasn't got an address!")
200 );
201 return;
202 }
203
204 // Get email text in database
205 $texts = new Texts(
206 $this->preferences,
207 $this->router
208 );
209
210 $texts->setMember($member)->setNoContribution();
211
212 if ($new) {
213 $password = new Password($this->zdb);
214 $res = $password->generateNewPassword($member->id);
215 if ($res == true) {
216 $texts
217 ->setLinkValidity()
218 ->setChangePasswordURI($password);
219 } else {
220 $str = str_replace(
221 '%s',
222 $member->sfullname,
223 _T("An error occurred storing temporary password for %s. Please inform an admin.")
224 );
225 $this->history->add($str);
226 $this->flash->addMessage(
227 'error_detected',
228 $str
229 );
230 }
231 }
232
233 $mlang = $member->language;
234 $texts->getTexts(
235 (($new) ? 'sub' : 'accountedited'),
236 $mlang
237 );
238
239 $mail = new GaletteMail($this->preferences);
240 $mail->setSubject($texts->getSubject());
241 $mail->setRecipients(
242 array(
243 $member->getEmail() => $member->sname
244 )
245 );
246 $mail->setMessage($texts->getBody());
247 $sent = $mail->send();
248
249 if ($sent == GaletteMail::MAIL_SENT) {
250 $msg = str_replace(
251 '%s',
252 $member->sname . ' (' . $member->getEmail() . ')',
253 ($new) ?
254 _T("New account email sent to '%s'.") : _T("Account modification email sent to '%s'.")
255 );
256 $this->history->add($msg);
257 $success_detected[] = $msg;
258 } else {
259 $str = str_replace(
260 '%s',
261 $member->sname . ' (' . $member->getEmail() . ')',
262 _T("A problem happened while sending account email to '%s'")
263 );
264 $this->history->add($str);
265 $error_detected[] = $str;
266 }
267 }
268
269 /**
270 * Send account email to admin
271 *
272 * @param Adherent $member Member
273 * @param boolean $new New member or editing existing one
274 *
275 * @return void
276 */
277 private function sendAdminEmail(Adherent $member, $new)
278 {
279 if (
280 $this->preferences->pref_mail_method == GaletteMail::METHOD_DISABLED
281 || !$this->preferences->pref_bool_mailadh
282 || (!$new && $member->id != $this->login->id)
283 ) {
284 return;
285 }
286
287
288 $texts = new Texts(
289 $this->preferences,
290 $this->router
291 );
292 $texts->setMember($member)->setNoContribution();
293
294 $txt_id = null;
295 if ($new) {
296 $txt_id = ($member->self_adh ? 'newselfadh' : 'newadh');
297 } else {
298 $txt_id = 'admaccountedited';
299 }
300
301 $mlang = $this->preferences->pref_lang;
302 $mtxt = $texts->getTexts(
303 $txt_id,
304 $mlang
305 );
306
307 $mail = new GaletteMail($this->preferences);
308 $mail->setSubject($texts->getSubject());
309 $recipients = [];
310 foreach ($this->preferences->vpref_email_newadh as $pref_email) {
311 $recipients[$pref_email] = $pref_email;
312 }
313 $mail->setRecipients($recipients);
314 $mail->setMessage($texts->getBody());
315 $sent = $mail->send();
316
317 if ($sent == GaletteMail::MAIL_SENT) {
318 $msg = $new ?
319 str_replace(
320 '%s',
321 $member->sname . ' (' . $member->email . ')',
322 _T("New account email sent to admin for '%s'.")
323 ) : _T("Account modification email sent to admin.");
324
325 $this->history->add($msg);
326 $this->flash->addMessage(
327 'success_detected',
328 $msg
329 );
330 } else {
331 $msg = $new ?
332 str_replace(
333 '%s',
334 $member->sname . ' (' . $member->email . ')',
335 _T("A problem happened while sending email to admin for account '%s'.")
336 ) : _T("A problem happened while sending account email to admin");
337
338 $this->history->add($msg);
339 $this->flash->addMessage(
340 'warning_detected',
341 $msg
342 );
343 }
344 }
345 }