PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.0.1
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.0.1
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
acymailing / back / Classes / QueueClass.php

QueueClass.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 10.0.1, at back/Classes/QueueClass.php

660 lines 27.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace AcyMailing\Classes;
4
5 use AcyMailing\Controllers\SegmentsController;
6 use AcyMailing\Helpers\AutomationHelper;
7 use AcyMailing\Core\AcymClass;
8
9 class QueueClass extends AcymClass
10 {
11 public $emailtypes;
12
13 public function getMatchingCampaigns($settings)
14 {
15 $campaignClass = new CampaignClass();
16 $mailStatClass = new MailStatClass();
17 $mailClass = new MailClass();
18 $query = 'FROM #__acym_mail AS mail
19 JOIN #__acym_queue AS queue ON mail.id = queue.mail_id
20 LEFT JOIN #__acym_campaign AS campaign ON mail.id = campaign.mail_id OR mail.parent_id = campaign.mail_id';
21
22 $queryStatus = 'SELECT COUNT(DISTINCT mail.id) AS number, campaign.active
23 FROM #__acym_mail AS mail
24 JOIN #__acym_queue AS queue ON queue.mail_id = mail.id
25 LEFT JOIN #__acym_campaign AS campaign ON mail.id = campaign.mail_id';
26
27 if (!empty($settings['tag'])) {
28 $query .= ' JOIN #__acym_tag AS tag ON (mail.id = tag.id_element OR mail.parent_id = tag.id_element) AND tag.type = "mail" AND tag.name = '.acym_escapeDB(
29 $settings['tag']
30 );
31 $queryStatus .= ' JOIN #__acym_tag AS tag ON mail.id = tag.id_element AND tag.type = "mail" AND tag.name = '.acym_escapeDB($settings['tag']);
32 }
33
34 $filters = [];
35 $filters[] = 'campaign.id IS NULL OR campaign.draft = 0';
36
37 if (!empty($settings['search'])) {
38 $filters[] = 'mail.subject LIKE '.acym_escapeDB('%'.$settings['search'].'%').' OR mail.name LIKE '.acym_escapeDB('%'.$settings['search'].'%');
39 }
40
41 if (!empty($filters)) {
42 $queryStatus .= ' WHERE ('.implode(') AND (', $filters).')';
43 }
44
45 if (!empty($settings['status'])) {
46 $allowedStatus = [
47 'sending' => 'campaign.active = 1',
48 'paused' => 'campaign.active = 0',
49 'automation' => 'mail.type = '.acym_escapeDB(MailClass::TYPE_AUTOMATION),
50 'followup' => 'mail.type = '.acym_escapeDB(MailClass::TYPE_FOLLOWUP),
51 ];
52
53 if (empty($allowedStatus[$settings['status']])) {
54 die('Unauthorized filter: '.acym_escape($settings['status']));
55 }
56
57 $filters[] = $allowedStatus[$settings['status']];
58 }
59
60 if (!empty($filters)) {
61 $query .= ' WHERE ('.implode(') AND (', $filters).')';
62 }
63
64 $queryCount = 'SELECT COUNT(DISTINCT mail.id) '.$query;
65 $query .= ' GROUP BY mail.id';
66
67 $query = 'SELECT mail.name, mail.subject, mail.type, mail.id, campaign.id AS campaign, IF(campaign.sending_date IS NULL, queue.sending_date, campaign.sending_date) AS sending_date, campaign.sending_type, campaign.active, campaign.sending_params AS sending_params, COUNT(queue.mail_id) AS nbqueued, mail.language, mail.parent_id '.$query.' ORDER BY queue.sending_date ASC';
68
69 acym_query('SET SQL_BIG_SELECTS=1;');
70 $results['elements'] = $mailClass->decode(acym_loadObjectList($query, '', $settings['offset'], $settings['campaignsPerPage']));
71 $results['total'] = acym_loadResult($queryCount);
72
73 $isMultilingual = acym_isMultilingual();
74 $campaignRecipientsMultilingual = [];
75 $automationHelper = new AutomationHelper();
76
77 $specialTypes = [];
78 acym_trigger('getCampaignTypes', [&$specialTypes]);
79
80 foreach ($results['elements'] as $i => $oneMail) {
81 $results['elements'][$i]->sending_params = empty($oneMail->sending_params) ? [] : json_decode($oneMail->sending_params, true);
82 if (in_array($oneMail->sending_type, $specialTypes)) {
83 $results['elements'][$i]->iscampaign = false;
84 $results['elements'][$i]->lists = acym_translation('ACYM_SPECIAL_MAIL_SENT_TO');
85 $results['elements'][$i]->recipients = acym_loadResult('SELECT COUNT(*) FROM #__acym_queue WHERE mail_id = '.intval($oneMail->id));
86 } elseif (empty($oneMail->campaign)) {
87 $results['elements'][$i]->iscampaign = false;
88 if ($oneMail->type === MailClass::TYPE_FOLLOWUP) {
89 $results['elements'][$i]->lists = acym_translation('ACYM_MAIL_FROM_FOLLOWUP_SENT_TO');
90 } else {
91 $results['elements'][$i]->lists = acym_translation('ACYM_MAIL_FROM_AUTOMATION_SENT_TO');
92 }
93 $results['elements'][$i]->recipients = acym_loadResult('SELECT COUNT(*) FROM #__acym_queue WHERE mail_id = '.intval($oneMail->id));
94 } else {
95 $mailId = empty($oneMail->parent_id) ? $oneMail->id : $oneMail->parent_id;
96 $results['elements'][$i]->iscampaign = true;
97 $results['elements'][$i]->lists = acym_loadObjectList(
98 'SELECT l.color, l.name , l.id
99 FROM #__acym_list AS l
100 JOIN #__acym_mail_has_list AS ml ON ml.list_id = l.id
101 WHERE ml.mail_id = '.intval($mailId),
102 'id'
103 );
104
105 if (isset($results['elements'][$i]->sending_params['abtest'])) {
106 $isVersionB = $results['elements'][$i]->sending_params['abtest']['B'] == $results['elements'][$i]->id;
107
108 if (empty($results['elements'][$i]->parent_id) || $isVersionB) {
109 $results['elements'][$i]->recipients = intval($mailStatClass->getTotalSubscribersByMailId($results['elements'][$i]->id));
110 } else {
111 $results['elements'][$i]->recipients = intval($mailStatClass->getTotalSubscribersByMailIdWithChild($mailId));
112 }
113 } elseif ($isMultilingual) {
114 if (empty($campaignRecipientsMultilingual[$oneMail->campaign])) {
115 $listIds = array_keys($results['elements'][$i]->lists);
116 acym_arrayToInteger($listIds);
117
118 $automationHelper->join['user_list'] = ' #__acym_user_has_list AS user_list ON user_list.user_id = user.id AND user_list.list_id IN ('.implode(
119 ',',
120 $listIds
121 ).') and user_list.status = 1 ';
122 $automationHelper->leftjoin['mail'] = '`#__acym_mail` AS mail ON `mail`.`language` = `user`.language AND `mail`.`parent_id` = '.intval($mailId);
123 $automationHelper->where[] = '`user_list`.`list_id` IN ('.implode(',', $listIds).') AND `user_list`.`status` = 1';
124
125 $filters = $campaignClass->getFilterCampaign($oneMail->sending_params);
126 if (!empty($filters)) {
127 foreach ($filters as $orValues) {
128 if (empty($orValues)) continue;
129
130 $automationHelperSegment = new AutomationHelper();
131 foreach ($orValues as $and => $andValues) {
132 $and = intval($and);
133 foreach ($andValues as $filterName => $options) {
134 acym_trigger('onAcymProcessFilter_'.$filterName, [&$automationHelperSegment, &$options, &$and]);
135 }
136 }
137 $automationHelperSegment->addFlag(SegmentsController::FLAG_COUNT);
138 }
139
140 $segmentMatchingCondition = 'LIKE';
141 if (!empty($oneMail->sending_params['segment']['invert']) && $oneMail->sending_params['segment']['invert'] === 'exclude') {
142 $segmentMatchingCondition = 'NOT LIKE';
143 }
144 $automationHelper->where[] = 'user.automation '.$segmentMatchingCondition.' "%a'.intval(SegmentsController::FLAG_COUNT).'a%"';
145 }
146
147 $automationHelper->groupBy = 'mail_id';
148 $campaignRecipientsMultilingual[$oneMail->campaign] = acym_loadObjectList(
149 $automationHelper->getQuery(['COUNT(DISTINCT user_list.`user_id`) AS elements', 'IF(mail.id IS NULL, '.intval($mailId).', `mail`.`id`) AS mail_id']),
150 'mail_id'
151 );
152 $automationHelper->removeFlag(SegmentsController::FLAG_COUNT);
153 }
154 $results['elements'][$i]->recipients = intval($campaignRecipientsMultilingual[$oneMail->campaign][$oneMail->id]->elements);
155 } else {
156 $results['elements'][$i]->recipients = intval($mailStatClass->getTotalSubscribersByMailId($mailId));
157 }
158 }
159 }
160
161 $automationNumber = acym_loadResult(
162 'SELECT COUNT(DISTINCT mail.id) FROM #__acym_mail AS mail
163 JOIN #__acym_queue AS queue
164 ON mail.id = queue.mail_id
165 WHERE mail.type = '.acym_escapeDB(MailClass::TYPE_AUTOMATION)
166 );
167 $followupNumber = acym_loadResult(
168 'SELECT COUNT(DISTINCT mail.id)
169 FROM #__acym_mail AS mail
170 JOIN #__acym_queue AS queue
171 ON mail.id = queue.mail_id
172 WHERE mail.type = '.acym_escapeDB(MailClass::TYPE_FOLLOWUP)
173 );
174
175 $elementsPerStatus = acym_loadObjectList($queryStatus.' GROUP BY active', 'active');
176 foreach ($elementsPerStatus as $i => $element) {
177 $elementsPerStatus[$i] = empty($element->number) ? 0 : $element->number;
178 }
179
180 $results['status'] = [
181 'all' => array_sum($elementsPerStatus) + $automationNumber + $followupNumber,
182 'sending' => $elementsPerStatus[1] ?? 0,
183 'paused' => $elementsPerStatus[0] ?? 0,
184 'automation' => $automationNumber,
185 'followup' => $followupNumber,
186 ];
187
188 return $results;
189 }
190
191 public function getMatchingScheduledCampaigns($settings)
192 {
193 $campaignClass = new CampaignClass();
194 $mailClass = new MailClass();
195 $query = 'FROM #__acym_mail AS mail
196 JOIN #__acym_campaign AS campaign ON mail.id = campaign.mail_id OR mail.parent_id = campaign.mail_id ';
197
198 if (!empty($settings['tag'])) {
199 $query .= ' JOIN #__acym_tag AS tag ON mail.id = tag.id_element AND tag.type = "mail" AND tag.name = '.acym_escapeDB($settings['tag']);
200 }
201
202 $filters = [
203 'campaign.draft = 0',
204 'campaign.sent = 0',
205 'campaign.sending_type = '.acym_escapeDB($campaignClass->getConstScheduled()),
206 ];
207
208 if (!empty($settings['search'])) {
209 $filters[] = 'mail.subject LIKE '.acym_escapeDB('%'.$settings['search'].'%').' OR mail.name LIKE '.acym_escapeDB('%'.$settings['search'].'%');
210 }
211
212 if (!empty($filters)) {
213 $query .= ' WHERE ('.implode(') AND (', $filters).')';
214 }
215
216 $queryCount = 'SELECT COUNT(DISTINCT mail.id) '.$query;
217 $query = 'SELECT mail.name, mail.subject, mail.id, campaign.sending_date, campaign.sending_params, mail.language, mail.parent_id '.$query.' GROUP BY mail.id ORDER BY campaign.sending_date ASC';
218
219 acym_query('SET SQL_BIG_SELECTS=1;');
220 $results['elements'] = $mailClass->decode(acym_loadObjectList($query, '', $settings['offset'], $settings['campaignsPerPage']));
221 $results['total'] = acym_loadResult($queryCount);
222
223 foreach ($results['elements'] as $i => $oneMail) {
224 $results['elements'][$i]->sending_params = empty($oneMail->sending_params) ? [] : json_decode($oneMail->sending_params, true);
225 $mailId = empty($oneMail->parent_id) ? $oneMail->id : $oneMail->parent_id;
226 $results['elements'][$i]->lists = acym_loadObjectList(
227 'SELECT l.color, l.name, l.id
228 FROM #__acym_list AS l
229 JOIN #__acym_mail_has_list AS ml ON ml.list_id = l.id
230 WHERE ml.mail_id = '.intval($mailId),
231 'id'
232 );
233 }
234
235 return $results;
236 }
237
238 public function getMatchingResults($settings)
239 {
240 $query = 'FROM #__acym_queue AS queue
241 JOIN #__acym_mail AS mail ON mail.id = queue.mail_id
242 JOIN #__acym_user AS user ON queue.user_id = user.id ';
243
244 $filters = [];
245
246 if (!empty($settings['tag'])) {
247 $query .= ' JOIN #__acym_tag AS tag ON queue.mail_id = tag.id_element AND tag.type = "mail" AND tag.name = '.acym_escapeDB($settings['tag']);
248 }
249
250 if (!empty($settings['search'])) {
251 $searchColumns = [
252 'user.email',
253 'user.name',
254 'mail.subject',
255 'mail.name',
256 ];
257
258 $filters[] = implode(' LIKE '.acym_escapeDB('%'.$settings['search'].'%').' OR ', $searchColumns).' LIKE '.acym_escapeDB('%'.$settings['search'].'%');
259 }
260
261 if (!empty($filters)) {
262 $query .= ' WHERE ('.implode(') AND (', $filters).')';
263 }
264
265 if (!empty($settings['tag'])) {
266 $query .= ' GROUP BY queue.mail_id, queue.user_id';
267 }
268
269 $queryCount = 'SELECT COUNT(queue.mail_id) '.$query;
270 $query = 'SELECT mail.id, queue.sending_date, mail.name, mail.subject, user.email, user.name AS user_name, queue.user_id, queue.try '.$query.' ORDER BY queue.sending_date ASC';
271
272 $mailClass = new MailClass();
273 $results['elements'] = $mailClass->decode(acym_loadObjectList($query, '', $settings['offset'], $settings['elementsPerPage']));
274 $results['total'] = acym_loadResult($queryCount);
275
276 return $results;
277 }
278
279 public function scheduleReady()
280 {
281 $this->messages = [];
282
283 $campaignClass = new CampaignClass();
284 $mailClass = new MailClass();
285
286 $multilingualQuery = acym_isMultilingual() ? ' OR mail.parent_id = campaign.mail_id ' : '';
287
288 $mailReady = $mailClass->decode(
289 acym_loadObjectList(
290 'SELECT mail.id, campaign.sending_date, mail.name, campaign.mail_id AS parent_id, mail.language, campaign.sending_params
291 FROM #__acym_campaign AS campaign
292 JOIN #__acym_mail AS mail
293 ON campaign.mail_id = mail.id '.$multilingualQuery.'
294 WHERE campaign.sending_type = '.acym_escapeDB($campaignClass->getConstScheduled()).'
295 AND campaign.draft = 0
296 AND campaign.sending_date <= '.acym_escapeDB(acym_date('now', 'Y-m-d H:i:s', false)).'
297 AND campaign.sent = 0',
298 'id'
299 )
300 );
301
302 if (empty($mailReady)) {
303 return false;
304 }
305
306 $nbQueue = [];
307
308 foreach ($mailReady as $mailId => $mail) {
309 $nbQueue[$mailId] = $this->queue($mail);
310 $this->messages[] = acym_translationSprintf('ACYM_ADDED_QUEUE_SCHEDULE', $nbQueue[$mailId], '<b>'.$mail->name.'</b>');
311 }
312
313 $mailIds = array_keys($mailReady);
314 acym_arrayToInteger($mailIds);
315 $campaigns = acym_loadObjectList('SELECT id, mail_id FROM #__acym_campaign WHERE mail_id IN ('.implode(',', $mailIds).')');
316 $campaignClass = new CampaignClass();
317 foreach ($campaigns as $campaign) {
318 $result = $campaignClass->send($campaign->id, $nbQueue[$campaign->mail_id]);
319 if (empty($result) && acym_isMultilingual()) {
320 $translatedMails = acym_loadResultArray('SELECT id FROM #__acym_mail WHERE id != '.intval($campaign->mail_id).' AND parent_id = '.intval($campaign->mail_id));
321 if (!empty($translatedMails)) {
322 foreach ($translatedMails as $translatedMailId) {
323 if (!empty($nbQueue[$translatedMailId])) $campaignClass->send($campaign->id, $nbQueue[$translatedMailId]);
324 }
325 }
326 }
327 }
328
329 return count($mailReady);
330 }
331
332 public function delete($elements)
333 {
334 if (empty($elements)) return 0;
335 if (!is_array($elements)) $elements = [$elements];
336 acym_arrayToInteger($elements);
337
338 $query = 'DELETE FROM #__acym_queue WHERE mail_id IN ('.implode(',', $elements).')';
339 $result = acym_query($query);
340
341 acym_query('UPDATE #__acym_campaign SET draft = 1, active = 1 WHERE mail_id IN ('.implode(',', $elements).')');
342
343 if (!$result) {
344 return false;
345 }
346
347 return $result;
348 }
349
350 public function deleteOne($elements, $mailId = null)
351 {
352 if (!is_array($elements)) {
353 $elements = [$elements];
354 }
355
356 if (empty($elements)) {
357 return 0;
358 }
359
360 $nbDeleted = 0;
361 foreach ($elements as $one) {
362 if (strpos($one, '_')) {
363 [$mailId, $userId] = explode('_', $one);
364 } else {
365 $userId = $one;
366 }
367
368 $query = 'DELETE FROM #__acym_queue WHERE user_id = '.intval($userId);
369 if (!empty($mailId)) {
370 $query .= ' AND mail_id = '.intval($mailId);
371 }
372
373 try {
374 $res = acym_query($query);
375 } catch (\Exception $e) {
376 $res = false;
377 }
378 if ($res === false) {
379 if (isset($e)) {
380 $this->errors[] = $e->getMessage();
381 unset($e);
382 } else {
383 $this->errors[] = acym_getDBError();
384 }
385 } else {
386 $nbDeleted += $res;
387 }
388 }
389
390 return $res;
391 }
392
393 public function getReady($limit, $mailId = 0): array
394 {
395 if (empty($limit)) return [];
396
397 $query = 'SELECT queue.*, campaign.sending_params AS sending_params FROM #__acym_queue AS queue';
398 $query .= ' JOIN #__acym_user AS user ON queue.`user_id` = user.`id` ';
399 $query .= ' JOIN #__acym_mail AS mail ON queue.`mail_id` = mail.`id` ';
400 $query .= ' LEFT JOIN #__acym_campaign AS campaign ON campaign.`mail_id` = mail.`id` ';
401 $query .= ' WHERE user.active = 1
402 AND queue.`sending_date` <= '.acym_escapeDB(acym_date('now', 'Y-m-d H:i:s', false)).'
403 AND (campaign.mail_id IS NULL
404 OR (campaign.`active` = 1
405 AND campaign.`draft` = 0
406 )
407 )';
408
409 if ($this->config->get('require_confirmation', 1) == 1) {
410 $query .= ' AND (user.confirmed = 1 OR mail.type = '.acym_escapeDB(MailClass::TYPE_NOTIFICATION).' OR mail.name LIKE "%confirm%")';
411 }
412
413 if (!empty($this->emailtypes)) {
414 foreach ($this->emailtypes as &$oneType) {
415 $oneType = acym_escapeDB($oneType);
416 }
417 $query .= ' AND mail.type IN ('.implode(', ', $this->emailtypes).')';
418 }
419
420 if (!empty($mailId)) {
421 $query .= ' AND queue.`mail_id` = '.intval($mailId);
422 }
423
424 $sendOrder = $this->config->get('sendorder');
425 if (empty($sendOrder)) {
426 $order = 'queue.`user_id` ASC';
427 } elseif ($sendOrder === 'rand') {
428 $order = 'RAND()';
429 } else {
430 $sendOrder = str_replace('subid', 'user_id', $sendOrder);
431 $ordering = explode(',', $sendOrder);
432 $order = 'queue.`'.acym_secureDBColumn(trim($ordering[0])).'` '.acym_secureDBColumn(trim($ordering[1]));
433 }
434
435 $query .= ' ORDER BY queue.`priority` ASC, queue.`sending_date` ASC, '.$order;
436 $startqueue = acym_getVar('int', 'startqueue', 0);
437 $query .= ' LIMIT '.intval($startqueue).','.intval($limit);
438
439 try {
440 $results = acym_loadObjectList($query);
441 } catch (\Exception $e) {
442 $results = null;
443 }
444
445 if ($results === null) {
446 acym_query('REPAIR TABLE #__acym_queue, #__acym_user, #__acym_mail, #__acym_campaign');
447 }
448
449 if (empty($results)) {
450 return [];
451 }
452
453 $firstElementQueued = reset($results);
454 acym_query(
455 'UPDATE #__acym_queue
456 SET sending_date = DATE_ADD(sending_date, INTERVAL 1 SECOND)
457 WHERE mail_id = '.intval($firstElementQueued->mail_id).' AND user_id = '.intval($firstElementQueued->user_id).'
458 LIMIT 1'
459 );
460
461 return $results;
462 }
463
464 public function delayFailed($mailId, $userIds)
465 {
466 acym_arrayToInteger($userIds);
467 if (empty($mailId) || empty($userIds)) {
468 return false;
469 }
470
471 return acym_query(
472 'UPDATE #__acym_queue
473 SET sending_date = DATE_ADD(sending_date, INTERVAL 1 HOUR), try = try +1
474 WHERE mail_id = '.intval($mailId).'
475 AND user_id IN ('.implode(',', $userIds).')'
476 );
477 }
478
479 public function delayAll(int $hours)
480 {
481 if ($hours < 1) {
482 return false;
483 }
484
485 return acym_query(
486 'UPDATE #__acym_queue
487 SET sending_date = DATE_ADD(sending_date, INTERVAL '.$hours.' HOUR)
488 WHERE sending_date < DATE_ADD(NOW(), INTERVAL '.intval($hours).' HOUR)'
489 );
490 }
491
492 public function getMailReceivers($mail, $onlyNew = false)
493 {
494 if (empty($mail->sending_params)) {
495 $sendingParams = [];
496 $mail->filters = [];
497 } else {
498 $sendingParams = is_array($mail->sending_params) ? $mail->sending_params : json_decode($mail->sending_params, true);
499
500 $campaignClass = new CampaignClass();
501 $mail->filters = $campaignClass->getFilterCampaign($sendingParams);
502
503 if (!empty($sendingParams['resendTarget']) && 'new' === $sendingParams['resendTarget']) {
504 $onlyNew = true;
505 }
506 }
507
508 $automationHelper = new AutomationHelper();
509 $automationHelper->join['userlist'] = ' #__acym_user_has_list AS userlist ON user.id = userlist.user_id';
510 $automationHelper->join['maillist'] = ' #__acym_mail_has_list AS maillist ON userlist.list_id = maillist.list_id';
511 $automationHelper->where = [
512 'userlist.status = 1',
513 'maillist.mail_id = '.intval(empty($mail->parent_id) ? $mail->id : $mail->parent_id),
514 ];
515
516 if (!$onlyNew && acym_isMultilingual()) {
517 $where = 'user.language = '.acym_escapeDB($mail->language);
518 if ($mail->id == $mail->parent_id) {
519 $where .= ' OR user.language = "" OR user.language NOT IN (SELECT language FROM #__acym_mail WHERE parent_id = '.intval($mail->id).')';
520 }
521 $automationHelper->where[] = $where;
522 }
523
524 if ($this->config->get('require_confirmation', 1) == 1) {
525 $automationHelper->where[] = '`user`.`confirmed` = 1';
526 }
527
528 if ($onlyNew) {
529 $automationHelper->leftjoin['us'] = '`#__acym_user_stat` AS `us` ON `us`.`user_id` = `user`.`id` AND `us`.`mail_id` IN (SELECT id FROM #__acym_mail WHERE parent_id = '.intval(
530 $mail->id
531 ).' OR id = '.intval($mail->id).')';
532 $automationHelper->where[] = '`us`.`user_id` IS NULL';
533
534 $automationHelper->where[] = '`user`.`active` = 1';
535 }
536
537 $automationHelper->removeFlag(SegmentsController::FLAG_USERS);
538 $automationHelper->removeFlag(SegmentsController::FLAG_COUNT);
539
540 if (empty($mail->filters)) {
541 return $automationHelper;
542 }
543
544 foreach ($mail->filters as $orValues) {
545 if (empty($orValues)) continue;
546
547 $automationHelperSegment = new AutomationHelper();
548 foreach ($orValues as $and => $andValues) {
549 $and = intval($and);
550 foreach ($andValues as $filterName => $options) {
551 acym_trigger('onAcymProcessFilter_'.$filterName, [&$automationHelperSegment, &$options, &$and]);
552 }
553 }
554 $automationHelperSegment->addFlag(SegmentsController::FLAG_COUNT);
555 }
556
557 $segmentMatchingCondition = 'LIKE';
558 if (!empty($sendingParams['segment']['invert']) && $sendingParams['segment']['invert'] === 'exclude') {
559 $segmentMatchingCondition = 'NOT LIKE';
560 }
561 $automationHelper->where[] = 'user.automation '.$segmentMatchingCondition.' "%a'.intval(SegmentsController::FLAG_COUNT).'a%"';
562
563 return $automationHelper;
564 }
565
566 public function queue($mail)
567 {
568 $automationHelper = $this->getMailReceivers($mail);
569 $automationHelper->where[] = '`user`.`active` = 1';
570
571 $priority = $this->config->get('priority_newsletter', 3);
572 $select = [intval($mail->id), 'userlist.user_id', acym_escapeDB($mail->sending_date), intval($priority), '0'];
573 $inserted = acym_query('INSERT IGNORE INTO #__acym_queue (`mail_id`, `user_id`, `sending_date`, `priority`, `try`) ('.$automationHelper->getQuery($select).')');
574
575 $automationHelper->removeFlag(SegmentsController::FLAG_COUNT);
576
577 return $inserted;
578 }
579
580 public function addQueue($userId, $mailId, $sendingDate)
581 {
582 $priority = $this->config->get('priority_newsletter', 3);
583
584 return acym_query('INSERT IGNORE INTO #__acym_queue (`mail_id`, `user_id`, `sending_date`, `priority`, `try`) VALUES ('.intval($mailId).', '.intval($userId).', '.acym_escapeDB($sendingDate).', '.intval($priority).', 0)');
585 }
586
587 public function unpauseCampaign($campaignId, $active)
588 {
589 if (acym_query('UPDATE #__acym_campaign SET active = '.intval($active).' WHERE id = '.intval($campaignId))) {
590 acym_enqueueMessage(acym_translation($active ? 'ACYM_UNPAUSE_CAMPAIGN_SUCCESSFUL' : 'ACYM_PAUSE_CAMPAIGN_SUCCESSFUL'), "success");
591 } else {
592 acym_enqueueMessage(acym_translation($active ? 'ACYM_UNPAUSE_CAMPAIGN_FAIL' : 'ACYM_PAUSE_CAMPAIGN_FAIL'), "error");
593 }
594 }
595
596 public function emptyQueue()
597 {
598 return acym_query('DELETE FROM `#__acym_queue`');
599 }
600
601 public function cleanQueue()
602 {
603 $twoDaysEarlier = acym_date(time() - 172800, 'Y-m-d H:i:s', false);
604
605 $conditionUser = '`user`.`active` = 0';
606 if ($this->config->get('require_confirmation', 1) == 1) $conditionUser .= ' OR `user`.`confirmed` = 0';
607
608 $numberOfDaysToWait = $this->config->get('queue_delete_days', 0);
609 $conditionDateDelete = '';
610 if (!empty($numberOfDaysToWait)) {
611 $dateTimeConditionDelete = acym_date(time() - ($numberOfDaysToWait * 86400), 'Y-m-d H:i:s', false);
612 $conditionDateDelete = ' OR (`queue`.`sending_date` < '.acym_escapeDB($dateTimeConditionDelete).')';
613 }
614
615 return acym_query(
616 'DELETE `queue`.*
617 FROM `#__acym_queue` AS `queue`
618 JOIN `#__acym_user` AS `user` ON `queue`.`user_id` = `user`.`id`
619 WHERE (('.$conditionUser.') AND `queue`.`sending_date` < '.acym_escapeDB($twoDaysEarlier).') '.$conditionDateDelete
620 );
621 }
622
623 public function isSendingFinished($mailId): bool
624 {
625 $mailClass = new MailClass();
626 $mail = $mailClass->getOneById($mailId);
627
628 if (empty($mail) || $mailClass->isTransactionalMail($mail)) return false;
629
630 $filters = [
631 '`queue`.`mail_id` = '.intval($mailId),
632 '`user`.`active` = 1',
633 ];
634 if ($this->config->get('require_confirmation')) {
635 $filters[] = '`user`.`confirmed` = 1';
636 }
637
638 $res = intval(
639 acym_loadResult(
640 'SELECT COUNT(`queue`.`mail_id`)
641 FROM #__acym_queue AS `queue`
642 JOIN #__acym_user AS `user`
643 ON `queue`.`user_id` = `user`.`id`
644 WHERE '.implode(' AND ', $filters)
645 )
646 );
647
648 return empty($res);
649 }
650
651 public function getQueueParams(int $mailId, int $userId): array
652 {
653 $query = acym_loadObject(
654 'SELECT `params` FROM #__acym_queue WHERE `user_id` = '.intval($userId).' AND `mail_id` = '.$mailId
655 );
656
657 return empty($query) ? [] : json_decode((string)$query->params, true);
658 }
659 }
660