From 0e0c330b6ef32984e9ad5347801438dbf17970ab Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Thu, 6 Jun 2019 16:36:52 +0200
Subject: [PATCH] Case role filter

---
 .../FilterHandler/CaseRoleFilter.php          | 46 ++++++++++++++++---
 .../Filter/Configuration/CaseRoleFilter.tpl   |  5 ++
 2 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/Civi/DataProcessor/FilterHandler/CaseRoleFilter.php b/Civi/DataProcessor/FilterHandler/CaseRoleFilter.php
index baed2a7d..a0877d7b 100644
--- a/Civi/DataProcessor/FilterHandler/CaseRoleFilter.php
+++ b/Civi/DataProcessor/FilterHandler/CaseRoleFilter.php
@@ -25,6 +25,11 @@ class CaseRoleFilter extends AbstractFilterHandler {
    */
   protected $dataSource;
 
+  /**
+   * @var array
+   */
+  protected $relationship_type_ids = array();
+
   public function __construct() {
     parent::__construct();
   }
@@ -53,6 +58,10 @@ class CaseRoleFilter extends AbstractFilterHandler {
       $this->fieldSpecification->alias = $alias;
       $this->fieldSpecification->title = $title;
     }
+
+    if (isset($configuration['relationship_types']) && is_array($configuration['relationship_types'])) {
+      $this->relationship_type_ids = $configuration['relationship_types'];
+    }
   }
 
   /**
@@ -74,16 +83,21 @@ class CaseRoleFilter extends AbstractFilterHandler {
       $cids = array($cids);
     }
     $relationshipTableAlias = 'civicrm_relationship_'.$this->fieldSpecification->alias;
+    $relationshipFilters = array(
+      new SqlDataFlow\SimpleWhereClause($relationshipTableAlias, 'is_active', '=', '1'),
+      new SqlDataFlow\SimpleWhereClause($relationshipTableAlias, 'case_id', 'IS NOT NULL', 0),
+      new SqlDataFlow\SimpleWhereClause($relationshipTableAlias, 'contact_id_b', 'IN', $cids),
+    );
+    if (count($this->relationship_type_ids)) {
+      $relationshipFilters[] = new SqlDataFlow\SimpleWhereClause($relationshipTableAlias, 'relationship_type_id', 'IN', $this->relationship_type_ids, 'Integer');
+    }
+
     if ($dataFlow && $dataFlow instanceof SqlDataFlow) {
       $whereClause = new SqlDataFlow\InTableWhereClause(
         'case_id',
         'civicrm_relationship',
         $relationshipTableAlias,
-        array(
-          new SqlDataFlow\SimpleWhereClause($relationshipTableAlias, 'is_active', '=', '1'),
-          new SqlDataFlow\SimpleWhereClause($relationshipTableAlias, 'case_id', 'IS NOT NULL', 0),
-          new SqlDataFlow\SimpleWhereClause($relationshipTableAlias, 'contact_id_b', 'IN', $cids),
-        ),
+        $relationshipFilters,
         $dataFlow->getName(),
         $this->fieldSpecification->name,
         $filter['op']
@@ -111,18 +125,35 @@ class CaseRoleFilter extends AbstractFilterHandler {
    */
   public function buildConfigurationForm(\CRM_Core_Form $form, $filter=array()) {
     $fieldSelect = \CRM_Dataprocessor_Utils_DataSourceFields::getAvailableFilterFieldsInDataSources($filter['data_processor_id']);
+    $relationshipTypeApi = civicrm_api3('RelationshipType', 'get', array('is_active' => 1, 'options' => array('limit' => 0)));
+    $relationshipTypes = array();
+    foreach($relationshipTypeApi['values'] as $relationship_type) {
+      $relationshipTypes[$relationship_type['id']] = $relationship_type['label_a_b'];
+    }
 
     $form->add('select', 'case_id_field', E::ts('Case ID Field'), $fieldSelect, true, array(
       'style' => 'min-width:250px',
       'class' => 'crm-select2 huge',
       'placeholder' => E::ts('- select -'),
     ));
+
+    $form->add('select', 'relationship_types', E::ts('Restrict to roles'), $relationshipTypes, false, array(
+      'style' => 'min-width:250px',
+      'class' => 'crm-select2 huge',
+      'placeholder' => E::ts('- Filter on all roles -'),
+      'multiple' => true,
+    ));
+
     if (isset($filter['configuration'])) {
       $configuration = $filter['configuration'];
+      $defaults = array();
       if (isset($configuration['field']) && isset($configuration['datasource'])) {
-        $defaults['field'] = $configuration['datasource'] . '::' . $configuration['field'];
-        $form->setDefaults($defaults);
+        $defaults['case_id_field'] = $configuration['datasource'] . '::' . $configuration['field'];
+      }
+      if (isset($configuration['relationship_types'])) {
+        $defaults['relationship_types'] = $configuration['relationship_types'];
       }
+      $form->setDefaults($defaults);
     }
   }
 
@@ -147,6 +178,7 @@ class CaseRoleFilter extends AbstractFilterHandler {
     list($datasource, $field) = explode('::', $submittedValues['case_id_field'], 2);
     $configuration['field'] = $field;
     $configuration['datasource'] = $datasource;
+    $configuration['relationship_types'] = isset($submittedValues['relationship_types']) ? $submittedValues['relationship_types'] : array();
     return $configuration;
   }
 
diff --git a/templates/CRM/Dataprocessor/Form/Filter/Configuration/CaseRoleFilter.tpl b/templates/CRM/Dataprocessor/Form/Filter/Configuration/CaseRoleFilter.tpl
index cad41670..df945ae8 100644
--- a/templates/CRM/Dataprocessor/Form/Filter/Configuration/CaseRoleFilter.tpl
+++ b/templates/CRM/Dataprocessor/Form/Filter/Configuration/CaseRoleFilter.tpl
@@ -4,4 +4,9 @@
     <div class="content">{$form.case_id_field.html}</div>
     <div class="clear"></div>
 </div>
+<div class="crm-section">
+    <div class="label">{$form.relationship_types.label}</div>
+    <div class="content">{$form.relationship_types.html}</div>
+    <div class="clear"></div>
+</div>
 {/crmScope}
\ No newline at end of file
-- 
GitLab