]> git.agnieray.net Git - galette.git/blob - galette/lib/Galette/Repository/Reminders.php
Fix reminders labels; closes #1506
[galette.git] / galette / lib / Galette / Repository / Reminders.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Reminders
7 *
8 * PHP version 5
9 *
10 * Copyright © 2013-2021 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 Entity
28 * @package Galette
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2013-2021 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 0.7.5dev - 2013-02-13
35 */
36
37 namespace Galette\Repository;
38
39 use Galette\Entity\Reminder;
40 use Galette\Filters\MembersList;
41 use Analog\Analog;
42 use Laminas\Db\Sql\Expression;
43
44 /**
45 * Reminders
46 *
47 * @category Entity
48 * @name Reminders
49 * @package Galette
50 * @author Johan Cwiklinski <johan@x-tnd.be>
51 * @copyright 2013-2021 The Galette Team
52 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
53 * @link http://galette.tuxfamily.org
54 * @since Available since 0.7.5dev - 2013-02-13
55 */
56
57 class Reminders
58 {
59 public const TABLE = 'reminders';
60 public const PK = 'reminder_id';
61
62 private $selected;
63 private $types;
64 private $reminders;
65 private $toremind;
66
67 /**
68 * Main constructor
69 *
70 * @param array $selected Selected types for sending
71 */
72 public function __construct($selected = null)
73 {
74 if (isset($selected) && is_array($selected)) {
75 $this->selected = array_map('intval', $selected);
76 } else {
77 $this->selected = array(Reminder::IMPENDING, Reminder::LATE);
78 }
79 }
80
81 /**
82 * Load reminders
83 *
84 * @param Db $zdb Database instance
85 * @param string $type Reminder type
86 * @param boolean $nomail Get reminders for members who do not have email address
87 *
88 * @return void
89 */
90 private function loadToRemind($zdb, $type, $nomail = false)
91 {
92 $this->toremind = array();
93 $select = $zdb->select(Members::TABLE, 'a');
94 $select->columns([Members::PK, 'date_echeance']);
95 $select->join(
96 array('r' => PREFIX_DB . self::TABLE),
97 'a.' . Members::PK . '=r.reminder_dest',
98 array(
99 'last_reminder' => new Expression('MAX(reminder_date)'),
100 'reminder_type' => new Expression('MAX(reminder_type)')
101 ),
102 $select::JOIN_LEFT
103 )->join(
104 array('p' => PREFIX_DB . Members::TABLE),
105 'a.parent_id=p.' . Members::PK,
106 array(),
107 $select::JOIN_LEFT
108 );
109
110 if ($nomail === false) {
111 //per default, limit to members who have an email address
112 $select->where('(a.email_adh != \'\' OR p.email_adh != \'\')');
113 } else {
114 $select->where('(a.email_adh = \'\' OR a.email_adh IS NULL) AND (p.email_adh = \'\' OR p.email_adh IS NULL)');
115 }
116
117 $select->where('a.activite_adh=true')
118 ->where('a.bool_exempt_adh=false');
119
120 if ($type === Reminder::LATE) {
121 $select->where->LessThan(
122 'a.date_echeance',
123 date('Y-m-d', time())
124 );
125 } else {
126 $now = new \DateTime();
127 $duedate = new \DateTime();
128 $duedate->modify('+1 month');
129 $select->where->greaterThanOrEqualTo(
130 'a.date_echeance',
131 $now->format('Y-m-d')
132 )->lessThan(
133 'a.date_echeance',
134 $duedate->format('Y-m-d')
135 );
136 }
137
138 $select->group('a.id_adh');
139
140 $results = $zdb->execute($select);
141
142 foreach ($results as $r) {
143 if ($r->reminder_type < $type) {
144 //sent impending, but is now late. reset last remind.
145 $r->reminder_type = $type;
146 $r->last_reminder = '';
147 }
148
149 if ($r->reminder_type === null || (int)$r->reminder_type === $type) {
150 $date_checked = false;
151
152 $due_date = new \DateTime($r->date_echeance);
153 $now = new \DateTime();
154
155 switch ($type) {
156 case Reminder::IMPENDING:
157 //reminders 30 days and 7 days before
158 $first = clone $due_date;
159 $second = clone $due_date;
160 $first->modify('-1 month');
161 $second->modify('-7 day');
162 if ($now >= $first || $now >= $second) {
163 if ($r->last_reminder == '') {
164 $date_checked = true;
165 } else {
166 $last_reminder = new \DateTime($r->last_reminder);
167 if ($now >= $second && $second > $last_reminder) {
168 $date_checked = true;
169 }
170 }
171 }
172 break;
173 case Reminder::LATE:
174 //reminders 30 days and 60 days after
175 $first = clone $due_date;
176 $second = clone $due_date;
177 $first->modify('1 month');
178 $second->modify('2 month');
179 if ($now >= $second || $now >= $first) {
180 if ($r->last_reminder === null || $r->last_reminder == '') {
181 $date_checked = true;
182 } else {
183 $last_reminder = new \DateTime($r->last_reminder);
184 if ($now >= $second && $second > $last_reminder) {
185 $date_checked = true;
186 }
187 }
188 }
189 break;
190 }
191
192 if ($date_checked) {
193 $pk = Members::PK;
194 $this->toremind[] = $r->$pk;
195 }
196 } else {
197 Analog::log(
198 'Reminder does not suits current requested type ' .
199 print_r($r, true),
200 Analog::DEBUG
201 );
202 }
203 }
204 }
205
206 /**
207 * Get the list of reminders
208 *
209 * @param Db $zdb Database instance
210 * @param boolean $nomail Get reminders for members who do not have email address
211 *
212 * @return array
213 */
214 public function getList($zdb, $nomail = false)
215 {
216 $this->types = array();
217 $this->reminders = array();
218
219 $types = array();
220 foreach ($this->selected as $s) {
221 $this->loadToRemind($zdb, $s, $nomail);
222
223 if (count($this->toremind) > 0) {
224 //and then get list
225 $m = new Members();
226 $members = $m->getArrayList(
227 $this->toremind,
228 null,
229 false,
230 true,
231 null,
232 false,
233 true
234 );
235 $this->types[$s] = $members;
236 }
237 }
238
239 if (is_array($this->types)) {
240 foreach ($this->types as $type => $members) {
241 //load message
242 if (is_array($members)) {
243 foreach ($members as $member) {
244 $reminder = new Reminder();
245 $reminder->type = $type;
246 $reminder->dest = $member;
247
248 $this->reminders[] = $reminder;
249 }
250 }
251 }
252 }
253 return $this->reminders;
254 }
255 }