CRM-20789 Fix unsubscribing when link comes from an AB Test
authorSeamus Lee <seamuslee001@gmail.com>
Thu, 29 Jun 2017 05:20:38 +0000 (05:20 +0000)
committerSeamus Lee <seamuslee001@gmail.com>
Thu, 29 Jun 2017 07:05:55 +0000 (07:05 +0000)
CRM-20789 Fix retrieving entity when in AB test context

CRM/Mailing/Event/BAO/Unsubscribe.php

index a549fcdafacd7373f6b4af1389f9fb71dd9843b4..ee7b45137cf82d4f93ed7f58109b6c533fc6671e 100644 (file)
@@ -149,6 +149,8 @@ WHERE  email = %2
     $group = $groupObject->getTableName();
     $gcObject = new CRM_Contact_BAO_GroupContact();
     $gc = $gcObject->getTableName();
+    $abObject = new CRM_Mailing_DAO_MailingAB();
+    $ab = $abObject->getTableName();
 
     //We Need the mailing Id for the hook...
     $do->query("SELECT $job.mailing_id as mailing_id
@@ -157,6 +159,23 @@ WHERE  email = %2
     $do->fetch();
     $mailing_id = $do->mailing_id;
     $entity = CRM_Core_DAO::getFieldValue('CRM_Mailing_DAO_MailingGroup', $mailing_id, 'entity_table', 'mailing_id');
+
+    // If $entity is null then most likely we are dealing with an AB test
+    if (empty($entity)) {
+      $mailing_id_a = CRM_Core_DAO::getFieldValue('CRM_Mailing_DAO_MailingAB', $mailing_id, 'mailing_id_a', 'mailing_id_b');
+      $field = 'mailing_id_b';
+      if (empty($mailing_id_a)) {
+        $mailing_id_a = CRM_Core_DAO::getFieldValue('CRM_Mailing_DAO_MailingAB', $mailing_id, 'mailing_id_a', 'mailing_id_c');
+        $field = 'mailing_id_c';
+      }
+      $jobJoin = "INNER JOIN $ab ON $ab.mailing_id_a = $mg.mailing_id
+        INNER JOIN $job ON $job.mailing_id = $ab.$field";
+      $entity = CRM_Core_DAO::getFieldValue('CRM_Mailing_DAO_MailingGroup', $maiing_id_a, 'entity_table', 'mailing_id');
+    }
+    else {
+      $jobJoin = "INNER JOIN  $job ON      $job.mailing_id = $mg.mailing_id";
+    }
+
     $groupClause = '';
     if ($entity == $group) {
       $groupClause = "AND $group.is_hidden = 0";
@@ -167,8 +186,7 @@ WHERE  email = %2
                         $mg.entity_id as entity_id,
                         $mg.group_type as group_type
             FROM        $mg
-            INNER JOIN  $job
-                ON      $job.mailing_id = $mg.mailing_id
+            $jobJoin
             INNER JOIN  $entity
                 ON      $mg.entity_id = $entity.id
             WHERE       $job.id = " . CRM_Utils_Type::escape($job_id, 'Integer') . "