PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.1
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.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
← All changes | back/Classes/QueueClass.php +0 -660 10.2.2 → 11.1.1 View file →
@@ -1,660 +1,0 @@
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 -}