From 50b96ca1bf60f0709ac87e6cb8b203f2664ae478 Mon Sep 17 00:00:00 2001
From: Erik Hommel <hommel@ee-atwork.nl>
Date: Wed, 19 Oct 2016 09:50:37 +0200
Subject: [PATCH] fix activity type condition for case activity

---
 CRM/Civirules/Config.php                      |  1 +
 CRM/CivirulesConditions/Activity/Type.mgd.php |  2 +-
 CRM/CivirulesConditions/Activity/Type.php     | 40 ++++++++++++++-----
 .../Form/Activity/Type.php                    |  4 +-
 CRM/CivirulesConditions/Membership/Status.php |  1 -
 CRM/CivirulesPostTrigger/CaseActivity.php     |  1 +
 .../Form/Activity/Type.tpl                    | 15 +++++--
 7 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/CRM/Civirules/Config.php b/CRM/Civirules/Config.php
index a7a9a0f..e4a0cfd 100644
--- a/CRM/Civirules/Config.php
+++ b/CRM/Civirules/Config.php
@@ -72,6 +72,7 @@ class CRM_Civirules_Config
       'Activity',
       'Address',
       'Case',
+      'CaseActivity',
       'Contact',
       'Contribution',
       'ContributionRecur',
diff --git a/CRM/CivirulesConditions/Activity/Type.mgd.php b/CRM/CivirulesConditions/Activity/Type.mgd.php
index 0864888..ded5e6f 100644
--- a/CRM/CivirulesConditions/Activity/Type.mgd.php
+++ b/CRM/CivirulesConditions/Activity/Type.mgd.php
@@ -9,7 +9,7 @@ return array (
         array (
           'version' => 3,
           'name' => 'contact_has_activity_of_type',
-          'label' => 'Contact has an activity of type xxx',
+          'label' => 'Activity is of type',
           'class_name' => 'CRM_CivirulesConditions_Activity_Type',
           'is_active' => 1
         ),
diff --git a/CRM/CivirulesConditions/Activity/Type.php b/CRM/CivirulesConditions/Activity/Type.php
index a0fdb26..b92bda6 100644
--- a/CRM/CivirulesConditions/Activity/Type.php
+++ b/CRM/CivirulesConditions/Activity/Type.php
@@ -38,11 +38,20 @@ class CRM_CivirulesConditions_Activity_Type extends CRM_Civirules_Condition {
    * @access public
    */
   public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData) {
+    $isConditionValid = FALSE;
     $activity = $triggerData->getEntityData('Activity');
-    if ($activity['activity_type_id'] == $this->conditionParams['activity_type_id']) {
-      return true;
+    switch ($this->conditionParams['operator']) {
+      case 0:
+        if (in_array($activity['activity_type_id'], $this->conditionParams['activity_type_id'])) {
+          $isConditionValid = TRUE;
+        }
+        break;
+      case 1:
+        if (!in_array($activity['activity_type_id'], $this->conditionParams['activity_type_id'])) {
+          $isConditionValid = TRUE;
+        }
+        break;
     }
-    return false;
   }
   /**
    * Returns a user friendly text explaining the condition params
@@ -52,12 +61,25 @@ class CRM_CivirulesConditions_Activity_Type extends CRM_Civirules_Condition {
    * @access public
    */
   public function userFriendlyConditionParams() {
-    $activityTypeLabel = CRM_Civirules_Utils::getOptionLabelWithValue(CRM_Civirules_Utils::getOptionGroupIdWithName('activity_type'),
-      $this->conditionParams['activity_type_id']);
-    if (!empty($activityTypeLabel)) {
-      return 'Activity type is '.$activityTypeLabel;
+    $friendlyText = "";
+    if ($this->conditionParams['operator'] == 0) {
+      $friendlyText = 'Activity Type is one of: ';
     }
-    return '';
+    if ($this->conditionParams['operator'] == 1) {
+      $friendlyText = 'Activity Type is NOT one of: ';
+    }
+    $actText = array();
+    foreach ($this->conditionParams['activity_type_id'] as $actTypeId) {
+      $actText[] = civicrm_api3('OptionValue', 'getvalue', array(
+        'option_group_id' => 'activity_type',
+        'value' => $actTypeId,
+        'return' => 'label'
+      ));
+    }
+    if (!empty($actText)) {
+      $friendlyText .= implode(", ", $actText);
+    }
+    return $friendlyText;
   }
 
   /**
@@ -68,7 +90,7 @@ class CRM_CivirulesConditions_Activity_Type extends CRM_Civirules_Condition {
    */
   public function requiredEntities() {
     return array(
-      'Activity'
+      'Activity', 'CaseActivity'
     );
   }
 }
\ No newline at end of file
diff --git a/CRM/CivirulesConditions/Form/Activity/Type.php b/CRM/CivirulesConditions/Form/Activity/Type.php
index 6d7285d..f1eee2f 100644
--- a/CRM/CivirulesConditions/Form/Activity/Type.php
+++ b/CRM/CivirulesConditions/Form/Activity/Type.php
@@ -19,7 +19,9 @@ class CRM_CivirulesConditions_Form_Activity_Type extends CRM_CivirulesConditions
 
     $activityTypeList = array('- select -') + CRM_Civirules_Utils::getActivityTypeList();
     asort($activityTypeList);
-    $this->add('select', 'activity_type_id', 'Activity Type', $activityTypeList, true);
+    $this->add('select', 'activity_type_id', ts('Activity Type(s)'), $activityTypeList, true,
+      array('id' => 'activity_type_ids', 'multiple' => 'multiple','class' => 'crm-select2'));
+    $this->add('select', 'operator', ts('Operator'), array('is one of', 'is NOT one of'), true);
 
     $this->addButtons(array(
       array('type' => 'next', 'name' => ts('Save'), 'isDefault' => TRUE,),
diff --git a/CRM/CivirulesConditions/Membership/Status.php b/CRM/CivirulesConditions/Membership/Status.php
index 31c882b..f33023c 100644
--- a/CRM/CivirulesConditions/Membership/Status.php
+++ b/CRM/CivirulesConditions/Membership/Status.php
@@ -27,7 +27,6 @@ class CRM_CivirulesConditions_Membership_Status extends CRM_Civirules_Condition
   public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData) {
     $isConditionValid = FALSE;
     $membership = $triggerData->getEntityData('Membership');
-    CRM_Core_Error::debug('membership', $membership);
     switch ($this->conditionParams['operator']) {
       case 0:
         if ($membership['status_id'] == $this->conditionParams['membership_status_id']) {
diff --git a/CRM/CivirulesPostTrigger/CaseActivity.php b/CRM/CivirulesPostTrigger/CaseActivity.php
index e1ebd54..e7e6ad6 100644
--- a/CRM/CivirulesPostTrigger/CaseActivity.php
+++ b/CRM/CivirulesPostTrigger/CaseActivity.php
@@ -77,6 +77,7 @@ class CRM_CivirulesPostTrigger_CaseActivity extends CRM_CivirulesPostTrigger_Act
   protected function getAdditionalEntities() {
     $entities = parent::getAdditionalEntities();
     $entities[] = new CRM_Civirules_TriggerData_EntityDefinition('Case', 'Case', 'CRM_Case_DAO_Case' , 'Case');
+    $entities[] = new CRM_Civirules_TriggerData_EntityDefinition('CaseActivity', 'CaseActivity', 'CRM_Case_DAO_CaseActivity' , 'CaseActivity');
     return $entities;
   }
 }
diff --git a/templates/CRM/CivirulesConditions/Form/Activity/Type.tpl b/templates/CRM/CivirulesConditions/Form/Activity/Type.tpl
index 4deb563..98eabe4 100644
--- a/templates/CRM/CivirulesConditions/Form/Activity/Type.tpl
+++ b/templates/CRM/CivirulesConditions/Form/Activity/Type.tpl
@@ -1,8 +1,17 @@
 <h3>{$ruleConditionHeader}</h3>
-<div class="crm-block crm-form-block crm-civirule-rule_condition-block-activity-type">
+<div class="crm-block crm-form-block crm-civirule-rule_condition-block-contribution_activitytype">
   <div class="crm-section">
-    <div class="label">{$form.activity_type_id.label}</div>
-    <div class="content">{$form.activity_type_id.html}</div>
+    <div class="label">{$form.operator.label}</div>
+    <div class="content">{$form.operator.html}</div>
+    <div class="clear"></div>
+  </div>
+  <div class="crm-section sector-section">
+    <div class="label">
+      <label for="financial_type-select">{ts}Activity Type(s){/ts}</label>
+    </div>
+    <div class="content crm-select-container" id="activity_type_block">
+      {$form.activity_type_id.html}
+    </div>
     <div class="clear"></div>
   </div>
 </div>
-- 
GitLab