Merge pull request #17583 from civicrm/5.27
[civicrm-core.git] / CRM / Mailing / BAO / Recipients.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
bc77d7c0 4 | Copyright CiviCRM LLC. All rights reserved. |
6a488035 5 | |
bc77d7c0
TO
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
6a488035 9 +--------------------------------------------------------------------+
d25dd0ee 10 */
6a488035
TO
11
12/**
13 *
14 * @package CRM
ca5cec67 15 * @copyright CiviCRM LLC https://civicrm.org/licensing
6a488035
TO
16 */
17class CRM_Mailing_BAO_Recipients extends CRM_Mailing_DAO_Recipients {
18
19 /**
fe482240 20 * Class constructor.
6a488035 21 */
00be9182 22 public function __construct() {
6a488035
TO
23 parent::__construct();
24 }
25
e0ef6999 26 /**
100fef9d 27 * @param int $mailingID
e0ef6999
EM
28 *
29 * @return null|string
30 */
00be9182 31 public static function mailingSize($mailingID) {
6a488035
TO
32 $sql = "
33SELECT count(*) as count
34FROM civicrm_mailing_recipients
35WHERE mailing_id = %1
36";
be2fb01f 37 $params = [1 => [$mailingID, 'Integer']];
6a488035
TO
38 return CRM_Core_DAO::singleValueQuery($sql, $params);
39 }
40
e0ef6999 41 /**
100fef9d 42 * @param int $mailingID
e0ef6999
EM
43 * @param null $offset
44 * @param null $limit
45 *
46 * @return Object
47 */
d5cc0fc2 48 public static function mailingQuery(
a3d7e8ee 49 $mailingID,
6a488035
TO
50 $offset = NULL, $limit = NULL
51 ) {
52 $limitString = NULL;
53 if ($limit && $offset !== NULL) {
bf00d1b6 54 $offset = CRM_Utils_Type::escape($offset, 'Int');
dd3a4117 55 $limit = CRM_Utils_Type::escape($limit, 'Int');
bf00d1b6 56
6a488035
TO
57 $limitString = "LIMIT $offset, $limit";
58 }
59
acaec976
SL
60 $isSMSmode = CRM_Core_DAO::getFieldValue('CRM_Mailing_BAO_Mailing', $mailingID, 'sms_provider_id', 'id');
61 $additionalJoin = '';
62 if (!$isSMSmode) {
63 // mailing_recipients added when mailing is submitted in UI by user.
64 // if any email is marked on_hold =1 or contact is deceased after mailing is submitted
65 // then it should be get skipped while preparing event_queue
66 // event_queue list is prepared when mailing job gets started.
50efb875 67 $additionalJoin = " INNER JOIN civicrm_email e ON (r.email_id = e.id AND e.on_hold = 0)
acaec976
SL
68 INNER JOIN civicrm_contact c on (c.id = r.contact_id AND c.is_deceased <> 1 AND c.do_not_email = 0 AND c.is_opt_out = 0)
69";
70 }
71 else {
72 $additionalJoin = "INNER JOIN civicrm_contact c on (c.id = r.contact_id AND c.is_deceased <> 1 AND c.do_not_sms = 0 AND c.is_opt_out = 0)";
73 }
74
6a488035 75 $sql = "
acaec976
SL
76SELECT r.contact_id, r.email_id, r.phone_id
77FROM civicrm_mailing_recipients r
78{$additionalJoin}
79WHERE r.mailing_id = %1
6a488035
TO
80 $limitString
81";
be2fb01f 82 $params = [1 => [$mailingID, 'Integer']];
6a488035
TO
83
84 return CRM_Core_DAO::executeQuery($sql, $params);
85 }
ef643544 86
0ae3d02b
DK
87 /**
88 * Moves a number of randomly-chosen recipients of one Mailing to another Mailing.
89 *
768c558c 90 * @param int $sourceMailingId
0ae3d02b
DK
91 * Source mailing ID
92 * @param int $newMailingID
93 * Destination mailing ID
94 * @param int $totalLimit
95 * Number of recipients to move
96 */
00be9182 97 public static function updateRandomRecipients($sourceMailingId, $newMailingID, $totalLimit = NULL) {
ef643544 98 $limitString = NULL;
99 if ($totalLimit) {
100 $limitString = "LIMIT 0, $totalLimit";
101 }
cc06bec0 102 $temporaryTable = CRM_Utils_SQL_TempTable::build()
f5c0a346 103 ->setCategory('sr' . $sourceMailingId)
cc06bec0
SL
104 ->setMemory()
105 ->createWithColumns("mailing_recipient_id int unsigned, id int PRIMARY KEY AUTO_INCREMENT, INDEX(mailing_recipient_id)");
106 $temporaryTableName = $temporaryTable->getName();
ef643544 107 $sql = "
cc06bec0 108INSERT INTO {$temporaryTableName} (mailing_recipient_id)
ef643544 109SELECT mr.id
110FROM civicrm_mailing_recipients mr
768c558c 111WHERE mr.mailing_id = $sourceMailingId
ef643544 112ORDER BY RAND()
113$limitString
114 ";
115 CRM_Core_DAO::executeQuery($sql);
116 $sql = "
117UPDATE civicrm_mailing_recipients mr
cc06bec0 118INNER JOIN {$temporaryTableName} temp_mr ON temp_mr.mailing_recipient_id = mr.id
ef643544 119SET mr.mailing_id = $newMailingID
120 ";
121 CRM_Core_DAO::executeQuery($sql);
cc06bec0 122 $temporaryTable->drop();
ef643544 123 }
124
768c558c
TO
125 /**
126 * Redistribute recipients from $sourceMailingId to a series of other mailings.
127 *
128 * @param int $sourceMailingId
90c8230e
TO
129 * @param array $to
130 * (int $targetMailingId => int $count).
768c558c 131 */
00be9182 132 public static function reassign($sourceMailingId, $to) {
768c558c
TO
133 foreach ($to as $targetMailingId => $count) {
134 if ($count > 0) {
135 CRM_Mailing_BAO_Recipients::updateRandomRecipients($sourceMailingId, $targetMailingId, $count);
136 }
137 }
138 }
139
6a488035 140}