PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.1.4
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.1.4
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.1.4, at back/Classes/QueueClass.php

661 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(array $settings): array
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) AS total '.$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_loadObject($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(array $settings): array
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::SENDING_TYPE_SCHEDULED),
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) AS total '.$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_loadObject($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(array $settings): array
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) AS total '.$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
274 return [
275 'elements' => $mailClass->decode(acym_loadObjectList($query, '', $settings['offset'], $settings['elementsPerPage'])),
276 'total' => acym_loadObject($queryCount),
277 ];
278 }
279
280 public function scheduleReady()
281 {
282 $this->messages = [];
283
284 $campaignClass = new CampaignClass();
285 $mailClass = new MailClass();
286
287 $multilingualQuery = acym_isMultilingual() ? ' OR mail.parent_id = campaign.mail_id ' : '';
288
289 $mailReady = $mailClass->decode(
290 acym_loadObjectList(
291 'SELECT mail.id, campaign.sending_date, mail.name, campaign.mail_id AS parent_id, mail.language, campaign.sending_params
292 FROM #__acym_campaign AS campaign
293 JOIN #__acym_mail AS mail
294 ON campaign.mail_id = mail.id '.$multilingualQuery.'
295 WHERE campaign.sending_type = '.acym_escapeDB(CampaignClass::SENDING_TYPE_SCHEDULED).'
296 AND campaign.draft = 0
297 AND campaign.sending_date <= '.acym_escapeDB(acym_date('now', 'Y-m-d H:i:s', false)).'
298 AND campaign.sent = 0',
299 'id'
300 )
301 );
302
303 if (empty($mailReady)) {
304 return false;
305 }
306
307 $nbQueue = [];
308
309 foreach ($mailReady as $mailId => $mail) {
310 $nbQueue[$mailId] = $this->queue($mail);
311 $this->messages[] = acym_translationSprintf('ACYM_ADDED_QUEUE_SCHEDULE', $nbQueue[$mailId], '<b>'.$mail->name.'</b>');
312 }
313
314 $mailIds = array_keys($mailReady);
315 acym_arrayToInteger($mailIds);
316 $campaigns = acym_loadObjectList('SELECT id, mail_id FROM #__acym_campaign WHERE mail_id IN ('.implode(',', $mailIds).')');
317 $campaignClass = new CampaignClass();
318 foreach ($campaigns as $campaign) {
319 $result = $campaignClass->send($campaign->id, $nbQueue[$campaign->mail_id]);
320 if (empty($result) && acym_isMultilingual()) {
321 $translatedMails = acym_loadResultArray('SELECT id FROM #__acym_mail WHERE id != '.intval($campaign->mail_id).' AND parent_id = '.intval($campaign->mail_id));
322 if (!empty($translatedMails)) {
323 foreach ($translatedMails as $translatedMailId) {
324 if (!empty($nbQueue[$translatedMailId])) $campaignClass->send($campaign->id, $nbQueue[$translatedMailId]);
325 }
326 }
327 }
328 }
329
330 return count($mailReady);
331 }
332
333 public function delete($elements)
334 {
335 if (empty($elements)) return 0;
336 if (!is_array($elements)) $elements = [$elements];
337 acym_arrayToInteger($elements);
338
339 $query = 'DELETE FROM #__acym_queue WHERE mail_id IN ('.implode(',', $elements).')';
340 $result = acym_query($query);
341
342 acym_query('UPDATE #__acym_campaign SET draft = 1, active = 1 WHERE mail_id IN ('.implode(',', $elements).')');
343
344 if (!$result) {
345 return false;
346 }
347
348 return $result;
349 }
350
351 public function deleteOne($elements, $mailId = null)
352 {
353 if (!is_array($elements)) {
354 $elements = [$elements];
355 }
356
357 if (empty($elements)) {
358 return 0;
359 }
360
361 $nbDeleted = 0;
362 foreach ($elements as $one) {
363 if (strpos($one, '_')) {
364 [$mailId, $userId] = explode('_', $one);
365 } else {
366 $userId = $one;
367 }
368
369 $query = 'DELETE FROM #__acym_queue WHERE user_id = '.intval($userId);
370 if (!empty($mailId)) {
371 $query .= ' AND mail_id = '.intval($mailId);
372 }
373
374 try {
375 $res = acym_query($query);
376 } catch (\Exception $e) {
377 $res = false;
378 }
379 if ($res === false) {
380 if (isset($e)) {
381 $this->errors[] = $e->getMessage();
382 unset($e);
383 } else {
384 $this->errors[] = acym_getDBError();
385 }
386 } else {
387 $nbDeleted += $res;
388 }
389 }
390
391 return $res;
392 }
393
394 public function getReady($limit, $mailId = 0): array
395 {
396 if (empty($limit)) return [];
397
398 $query = 'SELECT queue.*, campaign.sending_params AS sending_params FROM #__acym_queue AS queue';
399 $query .= ' JOIN #__acym_user AS user ON queue.`user_id` = user.`id` ';
400 $query .= ' JOIN #__acym_mail AS mail ON queue.`mail_id` = mail.`id` ';
401 $query .= ' LEFT JOIN #__acym_campaign AS campaign ON campaign.`mail_id` = mail.`id` ';
402 $query .= ' WHERE user.active = 1
403 AND queue.`sending_date` <= '.acym_escapeDB(acym_date('now', 'Y-m-d H:i:s', false)).'
404 AND (campaign.mail_id IS NULL
405 OR (campaign.`active` = 1
406 AND campaign.`draft` = 0
407 )
408 )';
409
410 if ($this->config->get('require_confirmation', 1) == 1) {
411 $query .= ' AND (user.confirmed = 1 OR mail.type = '.acym_escapeDB(MailClass::TYPE_NOTIFICATION).' OR mail.name LIKE "%confirm%")';
412 }
413
414 if (!empty($this->emailtypes)) {
415 foreach ($this->emailtypes as &$oneType) {
416 $oneType = acym_escapeDB($oneType);
417 }
418 $query .= ' AND mail.type IN ('.implode(', ', $this->emailtypes).')';
419 }
420
421 if (!empty($mailId)) {
422 $query .= ' AND queue.`mail_id` = '.intval($mailId);
423 }
424
425 $sendOrder = $this->config->get('sendorder');
426 if (empty($sendOrder)) {
427 $order = 'queue.`user_id` ASC';
428 } elseif ($sendOrder === 'rand') {
429 $order = 'RAND()';
430 } else {
431 $sendOrder = str_replace('subid', 'user_id', $sendOrder);
432 $ordering = explode(',', $sendOrder);
433 $order = 'queue.`'.acym_secureDBColumn(trim($ordering[0])).'` '.acym_secureDBColumn(trim($ordering[1]));
434 }
435
436 $query .= ' ORDER BY queue.`priority` ASC, queue.`sending_date` ASC, '.$order;
437 $startqueue = acym_getVar('int', 'startqueue', 0);
438 $query .= ' LIMIT '.intval($startqueue).','.intval($limit);
439
440 try {
441 $results = acym_loadObjectList($query);
442 } catch (\Exception $e) {
443 $results = null;
444 }
445
446 if ($results === null) {
447 acym_query('REPAIR TABLE #__acym_queue, #__acym_user, #__acym_mail, #__acym_campaign');
448 }
449
450 if (empty($results)) {
451 return [];
452 }
453
454 $firstElementQueued = reset($results);
455 acym_query(
456 'UPDATE #__acym_queue
457 SET sending_date = DATE_ADD(sending_date, INTERVAL 1 SECOND)
458 WHERE mail_id = '.intval($firstElementQueued->mail_id).' AND user_id = '.intval($firstElementQueued->user_id).'
459 LIMIT 1'
460 );
461
462 return $results;
463 }
464
465 public function delayFailed($mailId, $userIds)
466 {
467 acym_arrayToInteger($userIds);
468 if (empty($mailId) || empty($userIds)) {
469 return false;
470 }
471
472 return acym_query(
473 'UPDATE #__acym_queue
474 SET sending_date = DATE_ADD(sending_date, INTERVAL 1 HOUR), try = try +1
475 WHERE mail_id = '.intval($mailId).'
476 AND user_id IN ('.implode(',', $userIds).')'
477 );
478 }
479
480 public function delayAll(int $hours)
481 {
482 if ($hours < 1) {
483 return false;
484 }
485
486 return acym_query(
487 'UPDATE #__acym_queue
488 SET sending_date = DATE_ADD(sending_date, INTERVAL '.$hours.' HOUR)
489 WHERE sending_date < DATE_ADD(NOW(), INTERVAL '.intval($hours).' HOUR)'
490 );
491 }
492
493 public function getMailReceivers($mail, $onlyNew = false)
494 {
495 if (empty($mail->sending_params)) {
496 $sendingParams = [];
497 $mail->filters = [];
498 } else {
499 $sendingParams = is_array($mail->sending_params) ? $mail->sending_params : json_decode($mail->sending_params, true);
500
501 $campaignClass = new CampaignClass();
502 $mail->filters = $campaignClass->getFilterCampaign($sendingParams);
503
504 if (!empty($sendingParams['resendTarget']) && 'new' === $sendingParams['resendTarget']) {
505 $onlyNew = true;
506 }
507 }
508
509 $automationHelper = new AutomationHelper();
510 $automationHelper->join['userlist'] = ' #__acym_user_has_list AS userlist ON user.id = userlist.user_id';
511 $automationHelper->join['maillist'] = ' #__acym_mail_has_list AS maillist ON userlist.list_id = maillist.list_id';
512 $automationHelper->where = [
513 'userlist.status = 1',
514 'maillist.mail_id = '.intval(empty($mail->parent_id) ? $mail->id : $mail->parent_id),
515 ];
516
517 if (!$onlyNew && acym_isMultilingual()) {
518 $where = 'user.language = '.acym_escapeDB($mail->language);
519 if ($mail->id == $mail->parent_id) {
520 $where .= ' OR user.language = "" OR user.language NOT IN (SELECT language FROM #__acym_mail WHERE parent_id = '.intval($mail->id).')';
521 }
522 $automationHelper->where[] = $where;
523 }
524
525 if ($this->config->get('require_confirmation', 1) == 1) {
526 $automationHelper->where[] = '`user`.`confirmed` = 1';
527 }
528
529 if ($onlyNew) {
530 $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(
531 $mail->id
532 ).' OR id = '.intval($mail->id).')';
533 $automationHelper->where[] = '`us`.`user_id` IS NULL';
534
535 $automationHelper->where[] = '`user`.`active` = 1';
536 }
537
538 $automationHelper->removeFlag(SegmentsController::FLAG_USERS);
539 $automationHelper->removeFlag(SegmentsController::FLAG_COUNT);
540
541 if (empty($mail->filters)) {
542 return $automationHelper;
543 }
544
545 foreach ($mail->filters as $orValues) {
546 if (empty($orValues)) continue;
547
548 $automationHelperSegment = new AutomationHelper();
549 foreach ($orValues as $and => $andValues) {
550 $and = intval($and);
551 foreach ($andValues as $filterName => $options) {
552 acym_trigger('onAcymProcessFilter_'.$filterName, [&$automationHelperSegment, &$options, &$and]);
553 }
554 }
555 $automationHelperSegment->addFlag(SegmentsController::FLAG_COUNT);
556 }
557
558 $segmentMatchingCondition = 'LIKE';
559 if (!empty($sendingParams['segment']['invert']) && $sendingParams['segment']['invert'] === 'exclude') {
560 $segmentMatchingCondition = 'NOT LIKE';
561 }
562 $automationHelper->where[] = 'user.automation '.$segmentMatchingCondition.' "%a'.intval(SegmentsController::FLAG_COUNT).'a%"';
563
564 return $automationHelper;
565 }
566
567 public function queue($mail)
568 {
569 $automationHelper = $this->getMailReceivers($mail);
570 $automationHelper->where[] = '`user`.`active` = 1';
571
572 $priority = $this->config->get('priority_newsletter', 3);
573 $select = [intval($mail->id), 'userlist.user_id', acym_escapeDB($mail->sending_date), intval($priority), '0'];
574 $inserted = acym_query('INSERT IGNORE INTO #__acym_queue (`mail_id`, `user_id`, `sending_date`, `priority`, `try`) ('.$automationHelper->getQuery($select).')');
575
576 $automationHelper->removeFlag(SegmentsController::FLAG_COUNT);
577
578 return $inserted;
579 }
580
581 public function addQueue($userId, $mailId, $sendingDate)
582 {
583 $priority = $this->config->get('priority_newsletter', 3);
584
585 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)');
586 }
587
588 public function unpauseCampaign($campaignId, $active)
589 {
590 if (acym_query('UPDATE #__acym_campaign SET active = '.intval($active).' WHERE id = '.intval($campaignId))) {
591 acym_enqueueMessage(acym_translation($active ? 'ACYM_UNPAUSE_CAMPAIGN_SUCCESSFUL' : 'ACYM_PAUSE_CAMPAIGN_SUCCESSFUL'), "success");
592 } else {
593 acym_enqueueMessage(acym_translation($active ? 'ACYM_UNPAUSE_CAMPAIGN_FAIL' : 'ACYM_PAUSE_CAMPAIGN_FAIL'), "error");
594 }
595 }
596
597 public function emptyQueue()
598 {
599 return acym_query('DELETE FROM `#__acym_queue`');
600 }
601
602 public function cleanQueue()
603 {
604 $twoDaysEarlier = acym_date(time() - 172800, 'Y-m-d H:i:s', false);
605
606 $conditionUser = '`user`.`active` = 0';
607 if ($this->config->get('require_confirmation', 1) == 1) $conditionUser .= ' OR `user`.`confirmed` = 0';
608
609 $numberOfDaysToWait = $this->config->get('queue_delete_days', 0);
610 $conditionDateDelete = '';
611 if (!empty($numberOfDaysToWait)) {
612 $dateTimeConditionDelete = acym_date(time() - ($numberOfDaysToWait * 86400), 'Y-m-d H:i:s', false);
613 $conditionDateDelete = ' OR (`queue`.`sending_date` < '.acym_escapeDB($dateTimeConditionDelete).')';
614 }
615
616 return acym_query(
617 'DELETE `queue`.*
618 FROM `#__acym_queue` AS `queue`
619 JOIN `#__acym_user` AS `user` ON `queue`.`user_id` = `user`.`id`
620 WHERE (('.$conditionUser.') AND `queue`.`sending_date` < '.acym_escapeDB($twoDaysEarlier).') '.$conditionDateDelete
621 );
622 }
623
624 public function isSendingFinished($mailId): bool
625 {
626 $mailClass = new MailClass();
627 $mail = $mailClass->getOneById($mailId);
628
629 if (empty($mail) || $mailClass->isTransactionalMail($mail)) return false;
630
631 $filters = [
632 '`queue`.`mail_id` = '.intval($mailId),
633 '`user`.`active` = 1',
634 ];
635 if ($this->config->get('require_confirmation')) {
636 $filters[] = '`user`.`confirmed` = 1';
637 }
638
639 $res = intval(
640 acym_loadResult(
641 'SELECT COUNT(`queue`.`mail_id`)
642 FROM #__acym_queue AS `queue`
643 JOIN #__acym_user AS `user`
644 ON `queue`.`user_id` = `user`.`id`
645 WHERE '.implode(' AND ', $filters)
646 )
647 );
648
649 return empty($res);
650 }
651
652 public function getQueueParams(int $mailId, int $userId): array
653 {
654 $query = acym_loadObject(
655 'SELECT `params` FROM #__acym_queue WHERE `user_id` = '.intval($userId).' AND `mail_id` = '.$mailId
656 );
657
658 return empty($query) ? [] : json_decode((string)$query->params, true);
659 }
660 }
661