CRM-13738 fix - Activity Report fails if filtering on any contact
authormonishdeb <monish.deb@webaccess.co.in>
Thu, 14 Nov 2013 08:24:24 +0000 (13:54 +0530)
committermonishdeb <monish.deb@webaccess.co.in>
Thu, 14 Nov 2013 08:24:24 +0000 (13:54 +0530)
http://issues.civicrm.org/jira/browse/CRM-13738

CRM/Report/Form/Activity.php

index 67d703b40d13655b5dae5730e4e44ed6fd6e81c3..5498e35dd0002563de25c3741f8956c0849658cd 100644 (file)
@@ -40,7 +40,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
   );
 
   function __construct() {
-    // There could be multiple contacts. We not clear on which contact id to display. 
+    // There could be multiple contacts. We not clear on which contact id to display.
     // Lets hide it for now.
     $this->_exposeContactID = FALSE;
 
@@ -201,7 +201,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
           ),
           'activity_type_id' =>
           array('title' => ts('Activity Type'),
-            'default' => TRUE,
+            'required' => TRUE,
             'type' => CRM_Utils_Type::T_STRING,
           ),
           'activity_subject' =>
@@ -210,7 +210,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
           ),
           'activity_date_time' =>
           array('title' => ts('Activity Date'),
-            'default' => TRUE,
+            'required' => TRUE,
           ),
           'status_id' =>
           array('title' => ts('Activity Status'),
@@ -309,7 +309,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
     $removeKeys = array();
     if ($recordType == 'target') {
       foreach ($this->_selectClauses as $key => $clause) {
-        if (strstr($clause, 'civicrm_contact_assignee.') || 
+        if (strstr($clause, 'civicrm_contact_assignee.') ||
           strstr($clause, 'civicrm_contact_source.') ||
           strstr($clause, 'civicrm_email_assignee.') ||
           strstr($clause, 'civicrm_email_source.')
@@ -320,7 +320,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
       }
     } else if ($recordType == 'assignee') {
       foreach ($this->_selectClauses as $key => $clause) {
-        if (strstr($clause, 'civicrm_contact_target.') || 
+        if (strstr($clause, 'civicrm_contact_target.') ||
           strstr($clause, 'civicrm_contact_source.') ||
           strstr($clause, 'civicrm_email_target.') ||
           strstr($clause, 'civicrm_email_source.')
@@ -331,7 +331,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
       }
     } else if ($recordType == 'source') {
       foreach ($this->_selectClauses as $key => $clause) {
-        if (strstr($clause, 'civicrm_contact_target.') || 
+        if (strstr($clause, 'civicrm_contact_target.') ||
           strstr($clause, 'civicrm_contact_assignee.') ||
           strstr($clause, 'civicrm_email_target.') ||
           strstr($clause, 'civicrm_email_assignee.')
@@ -343,7 +343,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
     } else if ($recordType == 'final') {
       $this->_selectClauses = $this->_selectAliasesTotal;
       foreach ($this->_selectClauses as $key => $clause) {
-        if (strstr($clause, 'civicrm_contact_contact_target') || 
+        if (strstr($clause, 'civicrm_contact_contact_target') ||
           strstr($clause, 'civicrm_contact_contact_assignee') ||
           strstr($clause, 'civicrm_contact_contact_source') ) {
           $this->_selectClauses[$key] = "GROUP_CONCAT($clause SEPARATOR ';') as $clause";
@@ -425,7 +425,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
     $this->addAddressFromClause();
   }
 
-  function where() {
+  function where($recordType) {
     $this->_where = " WHERE {$this->_aliases['civicrm_activity']}.is_test = 0 AND
                                 {$this->_aliases['civicrm_activity']}.is_deleted = 0 AND
                                 {$this->_aliases['civicrm_activity']}.is_current_revision = 1";
@@ -436,6 +436,26 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
 
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
+          if ($fieldName != 'contact_' . $recordType &&
+            (strstr($fieldName, '_target') ||
+              strstr($fieldName, '_assignee') ||
+              strstr($fieldName, '_source')
+            )
+          ) {
+            if ($recordType == 'final') {
+              if (CRM_Utils_Array::value("{$fieldName}_value", $this->_params)) {
+                $field['dbAlias'] = "civicrm_contact_{$fieldName}";
+                $clauses[] = $this->whereClause($field,
+                  CRM_Utils_Array::value("{$fieldName}_op", $this->_params),
+                  CRM_Utils_Array::value("{$fieldName}_value", $this->_params), NULL, NULL
+                );
+              }
+            }
+            continue;
+          }
+          if ($recordType == 'final') {
+            continue;
+          }
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
             $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
             $from     = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
@@ -478,10 +498,20 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
     }
 
     if (empty($clauses)) {
-      $this->_where .= " ";
+      if ($recordType == 'final') {
+        $this->_where = "";
+      }
+      else {
+        $this->_where .= " ";
+      }
     }
     else {
-      $this->_where .= " AND " . implode(' AND ', $clauses);
+      if ($recordType == 'final') {
+        $this->_where = "WHERE " . implode(' AND ', $clauses);
+      }
+      else {
+        $this->_where .= " AND " . implode(' AND ', $clauses);
+      }
     }
 
     if ($this->_aclWhere) {
@@ -526,9 +556,9 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
     // 1. fill temp table with target results
     $this->select('target');
     $this->from('target');
-    $this->where();
+    $this->where('target');
     $insertCols = implode(',', $this->_selectAliases);
-    $tempQuery  = "CREATE TEMPORARY TABLE civireport_activity_temp_target CHARACTER SET utf8 COLLATE utf8_unicode_ci AS 
+    $tempQuery  = "CREATE TEMPORARY TABLE civireport_activity_temp_target CHARACTER SET utf8 COLLATE utf8_unicode_ci AS
 {$this->_select} {$this->_from} {$this->_where} ";
     CRM_Core_DAO::executeQuery($tempQuery);
 
@@ -538,7 +568,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
   ALTER TABLE  civireport_activity_temp_target
   ADD COLUMN civicrm_contact_contact_assignee VARCHAR(128),
   ADD COLUMN civicrm_contact_contact_source VARCHAR(128),
-  ADD COLUMN civicrm_contact_contact_assignee_id VARCHAR(128), 
+  ADD COLUMN civicrm_contact_contact_assignee_id VARCHAR(128),
   ADD COLUMN civicrm_contact_contact_source_id VARCHAR(128),
   ADD COLUMN civicrm_email_contact_assignee_email VARCHAR(128),
   ADD COLUMN civicrm_email_contact_source_email VARCHAR(128)";
@@ -549,7 +579,7 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
       CRM_Utils_Array::value("contact_assignee_email", $this->_params['fields'])) {
       $this->select('assignee');
       $this->from('assignee');
-      $this->where();
+      $this->where('assignee');
       $insertCols = implode(',', $this->_selectAliases);
       $tempQuery  = "INSERT INTO civireport_activity_temp_target ({$insertCols})
 {$this->_select}
@@ -562,9 +592,9 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
       CRM_Utils_Array::value("contact_source_email", $this->_params['fields'])) {
       $this->select('source');
       $this->from('source');
-      $this->where();
+      $this->where('source');
       $insertCols = implode(',', $this->_selectAliases);
-      $tempQuery  = "INSERT INTO civireport_activity_temp_target ({$insertCols}) 
+      $tempQuery  = "INSERT INTO civireport_activity_temp_target ({$insertCols})
 {$this->_select}
 {$this->_from} {$this->_where}";
       CRM_Core_DAO::executeQuery($tempQuery);
@@ -573,10 +603,12 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
     // 5. show final result set from temp table
     $rows = array();
     $this->select('final');
+    $this->where('final');
     $this->orderBy();
     $this->limit();
-    $sql = "{$this->_select} 
-FROM civireport_activity_temp_target tar 
+    $sql = "{$this->_select}
+FROM civireport_activity_temp_target tar
+{$this->_where}
 GROUP BY civicrm_activity_id {$this->_orderBy} {$this->_limit}";
     $this->buildRows($sql, $rows);