CRM-15728, query improvement
authormonishdeb <monish.deb@webaccessglobal.com>
Mon, 2 Feb 2015 12:43:07 +0000 (18:13 +0530)
committermonishdeb <monish.deb@webaccessglobal.com>
Wed, 4 Feb 2015 20:24:59 +0000 (01:54 +0530)
----------------------------------------
* CRM-15728: Improve Scheduled Reminders for membership renewals
  https://issues.civicrm.org/jira/browse/CRM-15728

CRM/Core/BAO/ActionSchedule.php
tests/phpunit/CRM/Core/BAO/ActionScheduleTest.php

index 3786a5409ff3fd3476c1ab82235a3baca722ab26..458618cce649f9f48c7da0cfdbd4555eb6fed42f 100755 (executable)
@@ -1280,31 +1280,16 @@ INSERT INTO civicrm_action_log ({$selectColumns})
  LEFT JOIN {$reminderJoinClause}
 {$whereClause} {$limitWhereClause} {$notINClause} AND {$dateClause} AND
  reminder.action_date_time IS NOT NULL AND
- (reminder.reference_date IS NOT NULL AND reminder.reference_date != {$dateField})
-LIMIT 0,1
-";
-
-        // As per the usage of UNION clause above we always INSERT a new reminder if reference_date (RD)
-        // got outdated or mismatches to start_action_date criteria so we need to update RD with actual
-        // start_action_date of already sent reminder, so to prevent redeundancy in sending new reminder
-        // due to above INSERT-UNION query
-        $updateQuery = "UPDATE civicrm_action_log reminder
- INNER JOIN {$mapping->entity} e ON e.id = reminder.entity_id AND
- reminder.reference_date IS NOT NULL AND reminder.action_date_time IS NOT NULL
- INNER JOIN civicrm_action_log new_reminder ON
-   new_reminder.action_schedule_id = reminder.action_schedule_id AND
-   new_reminder.reference_date = {$dateField} AND
-   new_reminder.action_date_time IS NULL
- SET reminder.reference_date = {$dateField}
- WHERE reminder.action_schedule_id = %1 AND reminder.reference_date IS NOT NULL AND reminder.reference_date != {$dateField}
+ reminder.reference_date IS NOT NULL
+GROUP BY reminder.id, reminder.reference_date
+HAVING reminder.id = MAX(reminder.id) AND reminder.reference_date <> {$dateField}
 ";
       }
 
       CRM_Core_DAO::executeQuery($query, array(1 => array($actionSchedule->id, 'Integer')));
 
-      if (!empty($updateQuery)) {
+      if (!empty($referenceQuery)) {
         CRM_Core_DAO::executeQuery($referenceQuery, array(1 => array($actionSchedule->id, 'Integer')));
-        CRM_Core_DAO::executeQuery($updateQuery, array(1 => array($actionSchedule->id, 'Integer')));
       }
 
       $isSendToAdditionalContacts = (!is_null($limitTo) && $limitTo == 0 && (!empty($addGroup) || !empty($addWhere))) ? TRUE : FALSE;
index 3ff7705a1bf6523bfa9692419ec40f5ddb616c63..642b4b6bae5bc0e951ab9ad55ca749682c6d7c6e 100755 (executable)
@@ -951,11 +951,6 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase {
         'recipients' => array(array('member@example.com')),
       ),
     ));
-
-    //To check whether the reference date is being changed to new join_date
-    $this->assertEquals('2012-03-29',
-      CRM_Core_DAO::getFieldValue('CRM_Core_DAO_ActionLog', $membership->contact_id, 'reference_date', 'contact_id', TRUE)
-    );
   }
 
   public function testMembershipOnMultipleReminder() {