3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
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 +--------------------------------------------------------------------+
15 * @copyright CiviCRM LLC https://civicrm.org/licensing
17 class CRM_Mailing_BAO_Recipients
extends CRM_Mailing_DAO_Recipients
{
22 public function __construct() {
23 parent
::__construct();
27 * @param int $mailingID
31 public static function mailingSize($mailingID) {
33 SELECT count(*) as count
34 FROM civicrm_mailing_recipients
37 $params = [1 => [$mailingID, 'Integer']];
38 return CRM_Core_DAO
::singleValueQuery($sql, $params);
42 * @param int $mailingID
48 public static function mailingQuery(
50 $offset = NULL, $limit = NULL
53 if ($limit && $offset !== NULL) {
54 $offset = CRM_Utils_Type
::escape($offset, 'Int');
55 $limit = CRM_Utils_Type
::escape($limit, 'Int');
57 $limitString = "LIMIT $offset, $limit";
60 $isSMSmode = CRM_Core_DAO
::getFieldValue('CRM_Mailing_BAO_Mailing', $mailingID, 'sms_provider_id', 'id');
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.
67 $additionalJoin = " INNER JOIN civicrm_email e ON (r.email_id = e.id AND e.on_hold = 0)
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)
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)";
76 SELECT r.contact_id, r.email_id, r.phone_id
77 FROM civicrm_mailing_recipients r
79 WHERE r.mailing_id = %1
82 $params = [1 => [$mailingID, 'Integer']];
84 return CRM_Core_DAO
::executeQuery($sql, $params);
88 * Moves a number of randomly-chosen recipients of one Mailing to another Mailing.
90 * @param int $sourceMailingId
92 * @param int $newMailingID
93 * Destination mailing ID
94 * @param int $totalLimit
95 * Number of recipients to move
97 public static function updateRandomRecipients($sourceMailingId, $newMailingID, $totalLimit = NULL) {
100 $limitString = "LIMIT 0, $totalLimit";
102 $temporaryTable = CRM_Utils_SQL_TempTable
::build()
103 ->setCategory('sr' . $sourceMailingId)
105 ->createWithColumns("mailing_recipient_id int unsigned, id int PRIMARY KEY AUTO_INCREMENT, INDEX(mailing_recipient_id)");
106 $temporaryTableName = $temporaryTable->getName();
108 INSERT INTO {$temporaryTableName} (mailing_recipient_id)
110 FROM civicrm_mailing_recipients mr
111 WHERE mr.mailing_id = $sourceMailingId
115 CRM_Core_DAO
::executeQuery($sql);
117 UPDATE civicrm_mailing_recipients mr
118 INNER JOIN {$temporaryTableName} temp_mr ON temp_mr.mailing_recipient_id = mr.id
119 SET mr.mailing_id = $newMailingID
121 CRM_Core_DAO
::executeQuery($sql);
122 $temporaryTable->drop();
126 * Redistribute recipients from $sourceMailingId to a series of other mailings.
128 * @param int $sourceMailingId
130 * (int $targetMailingId => int $count).
132 public static function reassign($sourceMailingId, $to) {
133 foreach ($to as $targetMailingId => $count) {
135 CRM_Mailing_BAO_Recipients
::updateRandomRecipients($sourceMailingId, $targetMailingId, $count);