Merge pull request #1683 from pradpnayak/CRM-12970
[civicrm-core.git] / CRM / Activity / BAO / Query.php
index 6ce9ff846454658ba9fd62aabd77f9b9eff1751e..895a73cb6b12845ff3e50322c2cfb056f89ef569 100644 (file)
@@ -2,7 +2,7 @@
 
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.3                                                |
+ | CiviCRM version 4.4                                                |
  +--------------------------------------------------------------------+
  | Copyright CiviCRM LLC (c) 2004-2013                                |
  +--------------------------------------------------------------------+
@@ -153,27 +153,16 @@ class CRM_Activity_BAO_Query {
    * @access public
    */
   static function where(&$query) {
-    $grouping = $testCondition = NULL;
+    $grouping = NULL;
     foreach (array_keys($query->_params) as $id) {
       if (substr($query->_params[$id][0], 0, 9) == 'activity_') {
         if ($query->_mode == CRM_Contact_BAO_QUERY::MODE_CONTACTS) {
           $query->_useDistinct = TRUE;
         }
-        if ($query->_params[$id][0] == 'activity_test') {
-          $testCondition = $id;
-          continue;
-        }
         $grouping = $query->_params[$id][3];
         self::whereClauseSingle($query->_params[$id], $query);
       }
     }
-    // Only add test condition if other fields are selected
-    if ($grouping !== NULL && $testCondition &&
-      // we dont want to include all tests for sql OR CRM-7827
-      $query->getOperator() != 'OR'
-    ) {
-      self::whereClauseSingle($query->_params[$testCondition], $query);
-    }
   }
 
   /**
@@ -242,28 +231,25 @@ class CRM_Activity_BAO_Query {
 
       case 'activity_role':
         CRM_Contact_BAO_Query::$_activityRole = $values[2];
+        $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name');
+        $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+        $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts);
+        $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
 
-        //for activity target name
-        $activityTargetName = $query->getWhereValues('activity_contact_name', $grouping);
-        if (!$activityTargetName[2]) {
-          $name = NULL;
-        }
-        else {
-          $name = trim($activityTargetName[2]);
-          $name = strtolower(CRM_Core_DAO::escapeString($name));
-        }
-
-        $query->_where[$grouping][] = " contact_activity_source.is_deleted = 0 AND contact_activity_source.sort_name LIKE '%{$name}%'";
-        if ($values[2] == 1) {
-          $query->_where[$grouping][] = " civicrm_activity.source_contact_id = contact_activity_source.id";
-          $query->_qill[$grouping][] = ts('Activity created by') . " '$name'";
+        if ($values[2]) {
           $query->_tables['civicrm_activity_contact'] = $query->_whereTables['civicrm_activity_contact'] = 1;
-        }
-        elseif ($values[2] == 2) {
-          $query->_where[$grouping][] = " civicrm_activity_assignment.activity_id = civicrm_activity.id AND civicrm_activity_assignment.assignee_contact_id = contact_activity_source.id";
-          $query->_tables['civicrm_activity_assignment'] = $query->_whereTables['civicrm_activity_assignment'] = 1;
-          $query->_tables['civicrm_activity_contact'] = $query->_whereTables['civicrm_activity_contact'] = 1;
-          $query->_qill[$grouping][] = ts('Activity assigned to') . " '$name'";
+          if ($values[2] == 1) {
+            $query->_where[$grouping][] = " civicrm_activity_contact.record_type_id = $sourceID";
+            $query->_qill[$grouping][] = ts('Activity created by');
+          }
+          else if ($values[2] == 2) {
+            $query->_where[$grouping][] = " civicrm_activity_contact.record_type_id = $assigneeID";
+            $query->_qill[$grouping][] = ts('Activity assigned to');
+          }
+          else if ($values[2] == 3) {
+            $query->_where[$grouping][] = " civicrm_activity_contact.record_type_id = $targetID";
+            $query->_qill[$grouping][] = ts('Activity targeted to');
+          }
         }
         break;
 
@@ -306,9 +292,12 @@ class CRM_Activity_BAO_Query {
         break;
 
       case 'activity_test':
-        $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause("civicrm_activity.is_test", $op, $value, "Boolean");
-        if ($value) {
-          $query->_qill[$grouping][] = ts('Activity is a Test');
+        // We dont want to include all tests for sql OR CRM-7827
+        if (!$value || $query->getOperator() != 'OR') {
+            $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause("civicrm_activity.is_test", $op, $value, "Boolean");
+          if ($value) {
+            $query->_qill[$grouping][] = ts('Activity is a Test');
+          }
         }
         break;
 
@@ -350,9 +339,10 @@ class CRM_Activity_BAO_Query {
             }
           }
         }
+
       case 'activity_tags':
         $value = array_keys($value);
-        $activityTags = CRM_Core_PseudoConstant::tag();
+        $activityTags = CRM_Core_PseudoConstant::get('CRM_Core_DAO_EntityTag', 'tag_id', array('onlyActive' => FALSE));
 
         $names = array();
         $val = array();
@@ -382,74 +372,27 @@ class CRM_Activity_BAO_Query {
     $from = NULL;
     switch ($name) {
       case 'civicrm_activity':
-        //CRM-7480 we are going to civicrm_activitty table either
+        //CRM-7480 we are going to civicrm_activity table either
         //from civicrm_activity_target or civicrm_activity_assignment.
         //as component specific activities does not have entry in
         //activity target table so lets consider civicrm_activity_assignment.
-        if (CRM_Contact_BAO_Query::$_considerCompActivities) {
-          $from .= " $side JOIN civicrm_activity_target
-                                      ON ( civicrm_activity_target.target_contact_id = contact_a.id ) ";
-
-          $from .= " $side JOIN civicrm_activity_assignment activity_assignment
-                                      ON ( activity_assignment.assignee_contact_id = contact_a.id )";
+        $from .= " INNER JOIN civicrm_activity_contact
+                      ON ( civicrm_activity_contact.contact_id = contact_a.id ) ";
+        $from .= " INNER JOIN civicrm_activity
+                      ON ( civicrm_activity.id = civicrm_activity_contact.activity_id
+                      AND civicrm_activity.is_deleted = 0 AND civicrm_activity.is_current_revision = 1 )";
 
-          $from .= " $side JOIN civicrm_activity
-                                      ON ( civicrm_activity.id = civicrm_activity_target.activity_id
-                                      AND civicrm_activity.is_deleted = 0 AND civicrm_activity.is_current_revision = 1 )";
-        }
-        elseif (CRM_Contact_BAO_Query::$_withContactActivitiesOnly) {
-          //force the civicrm_activity_target table.
-          $from .= " $side JOIN civicrm_activity_target ON civicrm_activity_target.target_contact_id = contact_a.id ";
-          $from .= " $side JOIN civicrm_activity ON ( civicrm_activity.id = civicrm_activity_target.activity_id
-                                                            AND civicrm_activity.is_deleted = 0
-                                                            AND civicrm_activity.is_current_revision = 1 )";
-        }
-        else {
-          $activityRole = CRM_Contact_BAO_Query::$_activityRole;
-          switch ($activityRole) {
-            case 1:
-              $from .= " $side JOIN civicrm_activity ON ( civicrm_activity.source_contact_id = contact_a.id
-                        AND civicrm_activity.is_deleted = 0
-                        AND civicrm_activity.is_current_revision = 1 )";
-              break;
-
-            case 2:
-              $from .= " $side JOIN civicrm_activity_assignment activity_assignment ON ( activity_assignment.assignee_contact_id = contact_a.id )";
-              $from .= " $side JOIN civicrm_activity ON ( civicrm_activity.id = activity_assignment.activity_id
-                        AND civicrm_activity.is_deleted = 0
-                        AND civicrm_activity.is_current_revision = 1 )";
-              break;
-
-            default:
-              $from .= " $side JOIN civicrm_activity_target ON civicrm_activity_target.target_contact_id = contact_a.id ";
-              $from .= " $side JOIN civicrm_activity ON ( civicrm_activity.id = civicrm_activity_target.activity_id
-                            AND civicrm_activity.is_deleted = 0
-                            AND civicrm_activity.is_current_revision = 1 )";
-          }
-        }
-        break;
-
-      case 'civicrm_activity_contact':
         $activityRole = CRM_Contact_BAO_Query::$_activityRole;
-        if ($activityRole == 1) {
-          $from .= " $side JOIN civicrm_contact contact_activity_source ON civicrm_activity.source_contact_id = contact_activity_source.id
-                           LEFT JOIN civicrm_email email_activity_source ON (contact_activity_source.id = email_activity_source.contact_id AND email_activity_source.is_primary = 1)";
-        }
-        elseif ($activityRole == 2) {
-          $from .= " $side JOIN civicrm_activity_assignment ON civicrm_activity.id = civicrm_activity_assignment.activity_id ";
-          $from .= " $side JOIN civicrm_contact contact_activity_source ON civicrm_activity_assignment.assignee_contact_id = contact_activity_source.id
-                           LEFT JOIN civicrm_email email_activity_source ON (contact_activity_source.id = email_activity_source.contact_id AND email_activity_source.is_primary = 1)";
-        }
         break;
 
       case 'activity_status':
-        $from = " $side JOIN civicrm_option_group option_group_activity_status ON (option_group_activity_status.name = 'activity_status')";
+        $from .= " $side JOIN civicrm_option_group option_group_activity_status ON (option_group_activity_status.name = 'activity_status')";
         $from .= " $side JOIN civicrm_option_value activity_status ON (civicrm_activity.status_id = activity_status.value
                                AND option_group_activity_status.id = activity_status.option_group_id ) ";
         break;
 
       case 'activity_type':
-        $from = " $side JOIN civicrm_option_group option_group_activity_type ON (option_group_activity_type.name = 'activity_type')";
+        $from .= " $side JOIN civicrm_option_group option_group_activity_type ON (option_group_activity_type.name = 'activity_type')";
         $from .= " $side JOIN civicrm_option_value activity_type ON (civicrm_activity.activity_type_id = activity_type.value
                                AND option_group_activity_type.id = activity_type.option_group_id ) ";
         break;
@@ -459,7 +402,7 @@ class CRM_Activity_BAO_Query {
         break;
 
       case 'source_contact':
-        $from = " $side JOIN civicrm_contact source_contact ON source_contact.id = civicrm_activity.source_contact_id";
+        $from = " $side JOIN civicrm_contact source_contact ON source_contact.id = civicrm_activity_contact.contact_id";
         break;
     }
 
@@ -500,11 +443,13 @@ class CRM_Activity_BAO_Query {
 
     CRM_Core_Form_Date::buildDateRange($form, 'activity_date', 1, '_low', '_high', ts('From'), FALSE, FALSE);
 
-    $activityRoles = array(1 => ts('Created by'), 2 => ts('Assigned to'));
+    $activityRoles = array(
+      1 => ts('Created by'),
+      2 => ts('Assigned to'),
+      3 => ts('Targeted to')
+    );
     $form->addRadio('activity_role', NULL, $activityRoles);
 
-    $form->addElement('text', 'activity_contact_name', ts('Contact Name'), CRM_Core_DAO::getAttribute('CRM_Contact_DAO_Contact', 'sort_name'));
-
     $activityStatus = CRM_Core_PseudoConstant::activityStatus();
     foreach ($activityStatus as $activityStatusID => $activityStatusName) {
       $activity_status[] = $form->createElement('checkbox', $activityStatusID, NULL, $activityStatusName);