From 2e6d0f0965f2f1b6207847cdb9b871799e8aa9d3 Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Thu, 18 Apr 2024 17:28:54 +0200
Subject: [PATCH] Added contact types to contact tab output.

---
 CHANGELOG.md                                  |  6 ++-
 .../DataProcessorContactSummaryTab.php        | 46 +++++++++++++++++++
 info.xml                                      |  4 +-
 .../DataProcessorContactSummaryTab.tpl        |  5 ++
 4 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2e5f2308..71d090a7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,8 @@
-# Version 1.103 (not yet released)
+# Version 1.103
 
-# Version 1.102 
+* Added contact types to contact tab output.
+
+# Version 1.102
 
 * Fixed issue with export output and php 8.
 * Fix for deprecated function calls. See #142
diff --git a/CRM/Contact/DataProcessorContactSummaryTab.php b/CRM/Contact/DataProcessorContactSummaryTab.php
index 52454424..6a57b9f8 100644
--- a/CRM/Contact/DataProcessorContactSummaryTab.php
+++ b/CRM/Contact/DataProcessorContactSummaryTab.php
@@ -64,6 +64,34 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac
       if (!$outputClass->checkUIPermission($output, $dataprocessor)) {
         continue;
       }
+      $contactTypeIsValid = true;
+      $contactTypes = [];
+      if (isset($output['configuration']['contact_types']) && is_array($output['configuration']['contact_types'])) {
+        $contactTypes = $output['configuration']['contact_types'];
+      }
+      if (count($contactTypes)) {
+        try {
+          $contact = \Civi\Api4\Contact::get(FALSE)
+            ->addWhere('id', '=', $contactId)
+            ->execute()
+            ->single();
+        }
+        catch (CRM_Core_Exception $e) {
+          $contactTypeIsValid = FALSE;
+        }
+        if (!in_array($contact['contact_type'], $contactTypes)) {
+          $contactTypeIsValid = false;
+          foreach($contact['contact_sub_type'] as $contactSubType) {
+            if (in_array($contactSubType, $contactTypes)) {
+              $contactTypeIsValid = true;
+              break;
+            }
+          }
+        }
+      }
+      if (!$contactTypeIsValid) {
+        continue;
+      }
 
       $count = 0;
       if ($contactId) {
@@ -146,6 +174,20 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac
     $form->add('text', 'weight', E::ts('Weight'));
     $form->add('text', 'default_limit', E::ts('Default Limit'));
 
+    $contactTypes = [];
+    $contactTypesApi = \Civi\Api4\ContactType::get(FALSE)
+      ->setLimit(0)
+      ->execute();
+    foreach($contactTypesApi as $contactType) {
+      $contactTypes[$contactType['name']] = $contactType['label'];
+    }
+    $form->add('select', 'contact_types', E::ts('Contact Types'), $contactTypes, false, array(
+      'style' => 'min-width:250px',
+      'class' => 'crm-select2 huge',
+      'multiple' => true,
+      'placeholder' => E::ts('- select -'),
+    ));
+
 
     $defaults = array();
     if ($output) {
@@ -165,6 +207,9 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac
         if (isset($output['configuration']['hidden_fields'])) {
           $defaults['hidden_fields'] = $output['configuration']['hidden_fields'];
         }
+        if (isset($output['configuration']['contact_types'])) {
+          $defaults['contact_types'] = $output['configuration']['contact_types'];
+        }
         if (isset($output['configuration']['default_limit'])) {
           $defaults['default_limit'] = $output['configuration']['default_limit'];
         }
@@ -208,6 +253,7 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac
     $output['permission'] = $submittedValues['permission'];
     $configuration['contact_id_field'] = $submittedValues['contact_id_field'];
     $configuration['hidden_fields'] = $submittedValues['hidden_fields'];
+    $configuration['contact_types'] = $submittedValues['contact_types'];
     $configuration['help_text'] = $submittedValues['help_text'];
     $configuration['no_result_text'] = $submittedValues['no_result_text'];
     $configuration['weight'] = $submittedValues['weight'];
diff --git a/info.xml b/info.xml
index 8b5d01f6..c44f0d10 100644
--- a/info.xml
+++ b/info.xml
@@ -14,8 +14,8 @@
     <url desc="Documentation">https://lab.civicrm.org/extensions/dataprocessor/blob/master/README.md</url>
     <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
   </urls>
-  <releaseDate>2024-04-15</releaseDate>
-  <version>1.103-dev</version>
+  <releaseDate>2024-04-18</releaseDate>
+  <version>1.103</version>
   <develStage>stable</develStage>
   <compatibility>
     <ver>5.37</ver>
diff --git a/templates/CRM/Contact/Form/OutputConfiguration/DataProcessorContactSummaryTab.tpl b/templates/CRM/Contact/Form/OutputConfiguration/DataProcessorContactSummaryTab.tpl
index 5efc01a1..541beab7 100644
--- a/templates/CRM/Contact/Form/OutputConfiguration/DataProcessorContactSummaryTab.tpl
+++ b/templates/CRM/Contact/Form/OutputConfiguration/DataProcessorContactSummaryTab.tpl
@@ -21,6 +21,11 @@
     <div class="content">{$form.hidden_fields.html}</div>
     <div class="clear"></div>
   </div>
+  <div class="crm-section">
+    <div class="label">{$form.contact_types.label}</div>
+    <div class="content">{$form.contact_types.html}</div>
+    <div class="clear"></div>
+  </div>
   <div class="crm-section">
     <div class="label">{$form.no_result_text.label}</div>
     <div class="content">{$form.no_result_text.html}</div>
-- 
GitLab