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