Merge pull request #22335 from braders/participant-static-method
[civicrm-core.git] / CRM / Mailing / BAO / Recipients.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
5 | |
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 |
9 +--------------------------------------------------------------------+
10 */
11
12 /**
13 *
14 * @package CRM
15 * @copyright CiviCRM LLC https://civicrm.org/licensing
16 */
17 class CRM_Mailing_BAO_Recipients extends CRM_Mailing_DAO_Recipients {
18
19 /**
20 * Class constructor.
21 */
22 public function __construct() {
23 parent::__construct();
24 }
25
26 /**
27 * @param int $mailingID
28 *
29 * @return null|string
30 */
31 public static function mailingSize($mailingID) {
32 $sql = "
33 SELECT count(*) as count
34 FROM civicrm_mailing_recipients
35 WHERE mailing_id = %1
36 ";
37 $params = [1 => [$mailingID, 'Integer']];
38 return CRM_Core_DAO::singleValueQuery($sql, $params);
39 }
40
41 /**
42 * @param int $mailingID
43 * @param null $offset
44 * @param null $limit
45 *
46 * @return Object
47 */
48 public static function mailingQuery(
49 $mailingID,
50 $offset = NULL, $limit = NULL
51 ) {
52 $limitString = NULL;
53 if ($limit && $offset !== NULL) {
54 $offset = CRM_Utils_Type::escape($offset, 'Int');
55 $limit = CRM_Utils_Type::escape($limit, 'Int');
56
57 $limitString = "LIMIT $offset, $limit";
58 }
59
60 $isSMSMode = CRM_Core_DAO::getFieldValue('CRM_Mailing_BAO_Mailing', $mailingID, 'sms_provider_id', 'id');
61 $additionalJoin = $isSMSMode ? '' : " INNER JOIN civicrm_email e ON (r.email_id = e.id AND e.on_hold = 0)";
62
63 $sql = "
64 SELECT r.contact_id, r.email_id, r.phone_id
65 FROM civicrm_mailing_recipients r
66 INNER JOIN civicrm_contact c on
67 (c.id = r.contact_id
68 AND c.is_deleted = 0
69 AND c.is_deceased = 0
70 AND c.do_not_" . ($isSMSMode ? 'sms' : 'email') . " = 0
71 AND c.is_opt_out = 0
72 )
73 {$additionalJoin}
74 WHERE r.mailing_id = %1
75 $limitString
76 ";
77 $params = [1 => [$mailingID, 'Integer']];
78
79 return CRM_Core_DAO::executeQuery($sql, $params);
80 }
81
82 /**
83 * Moves a number of randomly-chosen recipients of one Mailing to another Mailing.
84 *
85 * @param int $sourceMailingId
86 * Source mailing ID
87 * @param int $newMailingID
88 * Destination mailing ID
89 * @param int $totalLimit
90 * Number of recipients to move
91 */
92 public static function updateRandomRecipients($sourceMailingId, $newMailingID, $totalLimit = NULL) {
93 $limitString = NULL;
94 if ($totalLimit) {
95 $limitString = "LIMIT 0, $totalLimit";
96 }
97 $temporaryTable = CRM_Utils_SQL_TempTable::build()
98 ->setCategory('sr' . $sourceMailingId)
99 ->setMemory()
100 ->createWithColumns("mailing_recipient_id int unsigned, id int PRIMARY KEY AUTO_INCREMENT, INDEX(mailing_recipient_id)");
101 $temporaryTableName = $temporaryTable->getName();
102 $sql = "
103 INSERT INTO {$temporaryTableName} (mailing_recipient_id)
104 SELECT mr.id
105 FROM civicrm_mailing_recipients mr
106 WHERE mr.mailing_id = $sourceMailingId
107 ORDER BY RAND()
108 $limitString
109 ";
110 CRM_Core_DAO::executeQuery($sql);
111 $sql = "
112 UPDATE civicrm_mailing_recipients mr
113 INNER JOIN {$temporaryTableName} temp_mr ON temp_mr.mailing_recipient_id = mr.id
114 SET mr.mailing_id = $newMailingID
115 ";
116 CRM_Core_DAO::executeQuery($sql);
117 $temporaryTable->drop();
118 }
119
120 /**
121 * Redistribute recipients from $sourceMailingId to a series of other mailings.
122 *
123 * @param int $sourceMailingId
124 * @param array $to
125 * (int $targetMailingId => int $count).
126 */
127 public static function reassign($sourceMailingId, $to) {
128 foreach ($to as $targetMailingId => $count) {
129 if ($count > 0) {
130 CRM_Mailing_BAO_Recipients::updateRandomRecipients($sourceMailingId, $targetMailingId, $count);
131 }
132 }
133 }
134
135 }