]> git.agnieray.net Git - galette.git/blob - galette/lib/Galette/Events/MemberListener.php
Improve coding standards
[galette.git] / galette / lib / Galette / Events / MemberListener.php
1 <?php
2
3 /**
4 * Copyright © 2003-2024 The Galette Team
5 *
6 * This file is part of Galette (https://galette.eu).
7 *
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.
12 *
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.
17 *
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/>.
20 */
21
22 namespace Galette\Events;
23
24 use Galette\Core\Db;
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;
32 use Analog\Analog;
33 use League\Event\ListenerRegistry;
34 use League\Event\ListenerSubscriber;
35 use Slim\Flash\Messages;
36 use Slim\Routing\RouteParser;
37
38 /**
39 * Event listener for members
40 *
41 * @author Johan Cwiklinski <johan@x-tnd.be>
42 */
43 class MemberListener implements ListenerSubscriber
44 {
45 private Preferences $preferences;
46 private RouteParser $routeparser;
47 private History $history;
48 private Messages $flash;
49 private Login $login;
50 private Db $zdb;
51
52 /**
53 * Constructor
54 *
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
61 */
62 public function __construct(
63 Preferences $preferences,
64 RouteParser $routeparser,
65 History $history,
66 Messages $flash,
67 Login $login,
68 Db $zdb
69 ) {
70 $this->preferences = $preferences;
71 $this->routeparser = $routeparser;
72 $this->history = $history;
73 $this->flash = $flash;
74 $this->login = $login;
75 $this->zdb = $zdb;
76 }
77
78 /**
79 * Set up member listeners
80 *
81 * @param ListenerRegistry $acceptor Listener
82 *
83 * @return void
84 */
85 public function subscribeListeners(ListenerRegistry $acceptor): void
86 {
87 $acceptor->subscribeTo(
88 'member.add',
89 function (GaletteEvent $event): void {
90 $this->memberAdded($event->getObject());
91 }
92 );
93
94 $acceptor->subscribeTo(
95 'member.edit',
96 function (GaletteEvent $event): void {
97 $this->memberEdited($event->getObject());
98 }
99 );
100 }
101
102 /**
103 * Member added listener
104 *
105 * @param Adherent $member Added member
106 *
107 * @return void
108 */
109 public function memberAdded(Adherent $member): void
110 {
111 Analog::log(
112 '[' . get_class($this) . '] Event member.add emitted for ' . $member->sfullname,
113 Analog::DEBUG
114 );
115
116 if ($member->sendEMail()) {
117 $this->sendMemberEmail($member, true);
118 }
119
120 $this->sendAdminEmail($member, true);
121 }
122
123 /**
124 * Member edited listener
125 *
126 * @param Adherent $member Added member
127 *
128 * @return void
129 */
130 public function memberEdited(Adherent $member): void
131 {
132 Analog::log(
133 '[' . get_class($this) . '] Event member.edit emitted for ' . $member->sfullname,
134 Analog::DEBUG
135 );
136
137 if ($member->sendEMail()) {
138 $this->sendMemberEmail($member, false);
139 }
140
141 $this->sendAdminEmail($member, false);
142 }
143
144 /**
145 * Send account email to member
146 *
147 * @param Adherent $member Member
148 * @param boolean $new New member or editing existing one
149 *
150 * @return void
151 */
152 private function sendMemberEmail(Adherent $member, bool $new): void
153 {
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(
159 'warning_detected',
160 $msg
161 );
162 return;
163 }
164
165 if ($member->getEmail() == '' && !$member->self_adh) {
166 $this->flash->addMessage(
167 'error_detected',
168 _T("- You can't send a confirmation by email if the member hasn't got an address!")
169 );
170 return;
171 }
172
173 // Get email text in database
174 $texts = new Texts(
175 $this->preferences,
176 $this->routeparser
177 );
178
179 $texts->setMember($member)->setNoContribution();
180
181 if ($new) {
182 $password = new Password($this->zdb);
183 $res = $password->generateNewPassword($member->id);
184 if ($res === true) {
185 $texts
186 ->setLinkValidity()
187 ->setChangePasswordURI($password);
188 } else {
189 $str = str_replace(
190 '%s',
191 $member->sfullname,
192 _T("An error occurred storing temporary password for %s. Please inform an admin.")
193 );
194 $this->history->add($str);
195 $this->flash->addMessage(
196 'error_detected',
197 $str
198 );
199 }
200 }
201
202 $mlang = $member->language;
203 $texts->getTexts(
204 (($new) ? 'sub' : 'accountedited'),
205 $mlang
206 );
207
208 $mail = new GaletteMail($this->preferences);
209 $mail->setSubject($texts->getSubject());
210 $mail->setRecipients(
211 array(
212 $member->getEmail() => $member->sname
213 )
214 );
215 $mail->setMessage($texts->getBody());
216 $sent = $mail->send();
217
218 if ($sent == GaletteMail::MAIL_SENT) {
219 $msg = str_replace(
220 '%s',
221 $member->sname . ' (' . $member->getEmail() . ')',
222 ($new) ?
223 _T("New account email sent to '%s'.") : _T("Account modification email sent to '%s'.")
224 );
225 $this->history->add($msg);
226 $success_detected[] = $msg;
227 } else {
228 $str = str_replace(
229 '%s',
230 $member->sname . ' (' . $member->getEmail() . ')',
231 _T("A problem happened while sending account email to '%s'")
232 );
233 $this->history->add($str);
234 $error_detected[] = $str;
235 }
236 }
237
238 /**
239 * Send account email to admin
240 *
241 * @param Adherent $member Member
242 * @param boolean $new New member or editing existing one
243 *
244 * @return void
245 */
246 private function sendAdminEmail(Adherent $member, bool $new): void
247 {
248 if (
249 $this->preferences->pref_mail_method == GaletteMail::METHOD_DISABLED
250 || !$this->preferences->pref_bool_mailadh
251 || (!$new && $member->id != $this->login->id)
252 ) {
253 return;
254 }
255
256
257 $texts = new Texts(
258 $this->preferences,
259 $this->routeparser
260 );
261 $texts->setMember($member)->setNoContribution();
262
263 $txt_id = null;
264 if ($new) {
265 $txt_id = ($member->self_adh ? 'newselfadh' : 'newadh');
266 } else {
267 $txt_id = 'admaccountedited';
268 }
269
270 $mlang = $this->preferences->pref_lang;
271 $texts->getTexts(
272 $txt_id,
273 $mlang
274 );
275
276 $mail = new GaletteMail($this->preferences);
277 $mail->setSubject($texts->getSubject());
278 $recipients = [];
279 foreach ($this->preferences->vpref_email_newadh as $pref_email) {
280 $recipients[$pref_email] = $pref_email;
281 }
282 $mail->setRecipients($recipients);
283 $mail->setMessage($texts->getBody());
284 $sent = $mail->send();
285
286 if ($sent == GaletteMail::MAIL_SENT) {
287 $msg = $new ?
288 str_replace(
289 '%s',
290 $member->sname . ' (' . $member->email . ')',
291 _T("New account email sent to admin for '%s'.")
292 ) : _T("Account modification email sent to admin.");
293
294 $this->history->add($msg);
295 $this->flash->addMessage(
296 'success_detected',
297 $msg
298 );
299 } else {
300 $msg = $new ?
301 str_replace(
302 '%s',
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");
306
307 $this->history->add($msg);
308 $this->flash->addMessage(
309 'warning_detected',
310 $msg
311 );
312 }
313 }
314 }