From 6a1c88d389270258766b20bfcbbfe27899fb1797 Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Thu, 11 Mar 2021 20:05:02 +0100
Subject: [PATCH] Fix for #85 DB Error: no such field when using Tab on contact
 summary with contributions

---
 CHANGELOG.md                                  |  1 +
 .../DataProcessorContactSummaryTab.php        | 23 +++++++++++++++++--
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2cfb0acb..4ebe4e29 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
 # Version 1.34 (not yet released)
 
 * Fixed issue with filtering on state/province custom fields.
+* Fix for #85 DB Error: no such field when using "Tab on contact summary" with contributions
 
 # Version 1.33
 
diff --git a/CRM/Contact/DataProcessorContactSummaryTab.php b/CRM/Contact/DataProcessorContactSummaryTab.php
index ce7ffcd9..06ef872e 100644
--- a/CRM/Contact/DataProcessorContactSummaryTab.php
+++ b/CRM/Contact/DataProcessorContactSummaryTab.php
@@ -4,6 +4,8 @@
  * @license AGPL-3.0
  */
 
+use Civi\DataProcessor\DataFlow\CombinedDataFlow\CombinedSqlDataFlow;
+use Civi\DataProcessor\DataFlow\SqlTableDataFlow;
 use CRM_Dataprocessor_ExtensionUtil as E;
 use Civi\DataProcessor\Output\UIFormOutputInterface;
 use Civi\DataProcessor\ProcessorType\AbstractProcessorType;
@@ -320,7 +322,7 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac
    * @throws \Civi\DataProcessor\Exception\FieldNotFoundException
    */
   public static function alterDataProcessor($contact_id, $output, AbstractProcessorType $dataProcessorClass) {
-    list($datasource_name, $field_name) = explode('::', $output['configuration']['contact_id_field'], 2);
+    [$datasource_name, $field_name] = explode('::', $output['configuration']['contact_id_field'], 2);
     $dataSource = $dataProcessorClass->getDataSourceByName($datasource_name);
     if (!$dataSource) {
       throw new \Civi\DataProcessor\Exception\DataSourceNotFoundException(E::ts("Requires data source '%1' which could not be found. Did you rename or deleted the data source?", array(1=>$datasource_name)));
@@ -340,7 +342,8 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac
     $fieldSpecification->alias = 'contact_summary_tab_contact_id';
     $dataFlow = $dataSource->ensureField($fieldSpecification);
     if ($dataFlow && $dataFlow instanceof SqlDataFlow) {
-      $whereClause = new SimpleWhereClause($dataFlow->getName(), $fieldSpecification->name, '=', $contact_id, $fieldSpecification->type);
+      $tableAlias = self::getTableAlias($dataFlow);
+      $whereClause = new SimpleWhereClause($tableAlias, $fieldSpecification->name, '=', $contact_id, $fieldSpecification->type);
       $dataFlow->addWhereClause($whereClause);
     } elseif ($dataFlow && $dataFlow instanceof InMemoryDataFlow) {
       $filterClass = new SimpleFilter($fieldSpecification->name, '=', $contact_id);
@@ -349,4 +352,20 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac
     return $dataProcessorClass;
   }
 
+  /**
+   * Returns the table alias of a sql data flow.
+   *
+   * @param \Civi\DataProcessor\DataFlow\SqlDataFlow $dataFlow
+   * @return string|null
+   */
+  protected static function getTableAlias(SqlDataFlow $dataFlow) {
+    $tableAlias = $dataFlow->getName();
+    if ($dataFlow instanceof SqlTableDataFlow) {
+      $tableAlias = $dataFlow->getTableAlias();
+    } elseif ($dataFlow instanceof CombinedSqlDataFlow) {
+      $tableAlias = $dataFlow->getPrimaryTableAlias();
+    }
+    return $tableAlias;
+  }
+
 }
-- 
GitLab