From e20ec819d5c29a82c79f103b28ba92bb97cf8c70 Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap@edeveloper.nl>
Date: Thu, 20 Oct 2016 13:53:12 +0200
Subject: [PATCH] Added condition for case status is (not) one of.

---
 .../Case/CaseStatus.mgd.php                   |  21 ++++
 CRM/CivirulesConditions/Case/CaseStatus.php   | 111 ++++++++++++++++++
 .../Form/Case/CaseStatus.php                  |  60 ++++++++++
 .../Form/Case/CaseStatus.tpl                  |  16 +++
 xml/Menu/civirules.xml                        |   7 ++
 5 files changed, 215 insertions(+)
 create mode 100644 CRM/CivirulesConditions/Case/CaseStatus.mgd.php
 create mode 100644 CRM/CivirulesConditions/Case/CaseStatus.php
 create mode 100644 CRM/CivirulesConditions/Form/Case/CaseStatus.php
 create mode 100644 templates/CRM/CivirulesConditions/Form/Case/CaseStatus.tpl

diff --git a/CRM/CivirulesConditions/Case/CaseStatus.mgd.php b/CRM/CivirulesConditions/Case/CaseStatus.mgd.php
new file mode 100644
index 0000000..9c7de26
--- /dev/null
+++ b/CRM/CivirulesConditions/Case/CaseStatus.mgd.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org>
+ * @license http://www.gnu.org/licenses/agpl-3.0.html
+ */
+
+return array (
+  0 =>
+    array (
+      'name' => 'Civirules:Condition.Case.CaseStatus',
+      'entity' => 'CiviRuleCondition',
+      'params' =>
+        array (
+          'version' => 3,
+          'name' => 'case_case_status',
+          'label' => 'Case status is (not) one of',
+          'class_name' => 'CRM_CivirulesConditions_Case_CaseStatus',
+          'is_active' => 1
+        ),
+    ),
+);
\ No newline at end of file
diff --git a/CRM/CivirulesConditions/Case/CaseStatus.php b/CRM/CivirulesConditions/Case/CaseStatus.php
new file mode 100644
index 0000000..cb3ba0a
--- /dev/null
+++ b/CRM/CivirulesConditions/Case/CaseStatus.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org>
+ * @license http://www.gnu.org/licenses/agpl-3.0.html
+ */
+
+class CRM_CivirulesConditions_Case_CaseStatus extends CRM_Civirules_Condition {
+
+  private $conditionParams = array();
+
+  /**
+   * Method to set the Rule Condition data
+   *
+   * @param array $ruleCondition
+   * @access public
+   */
+  public function setRuleConditionData($ruleCondition) {
+    parent::setRuleConditionData($ruleCondition);
+    $this->conditionParams = array();
+    if (!empty($this->ruleCondition['condition_params'])) {
+      $this->conditionParams = unserialize($this->ruleCondition['condition_params']);
+    }
+  }
+
+  /**
+   * Method to determine if the condition is valid
+   *
+   * @param CRM_Civirules_TriggerData_TriggerData $triggerData
+   * @return bool
+   */
+  public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData) {
+    $isConditionValid = FALSE;
+    $case = $triggerData->getEntityData('Case');
+    $status_id = $case['status_id'];
+    switch ($this->conditionParams['operator']) {
+      case 0:
+        if (in_array($status_id, $this->conditionParams['status_id'])) {
+          $isConditionValid = TRUE;
+        }
+        break;
+      case 1:
+        if (!in_array($status_id, $this->conditionParams['status_id'])) {
+          $isConditionValid = TRUE;
+        }
+        break;
+    }
+    return $isConditionValid;
+  }
+
+  /**
+   * Returns a redirect url to extra data input from the user after adding a condition
+   *
+   * Return false if you do not need extra data input
+   *
+   * @param int $ruleConditionId
+   * @return bool|string
+   * @access public
+   * @abstract
+   */
+  public function getExtraDataInputUrl($ruleConditionId) {
+    return CRM_Utils_System::url('civicrm/civirule/form/condition/case/casestatus', 'rule_condition_id='
+      .$ruleConditionId);
+  }
+
+  /**
+   * Returns a user friendly text explaining the condition params
+   * e.g. 'Older than 65'
+   *
+   * @return string
+   * @access public
+   */
+  public function userFriendlyConditionParams() {
+    $caseStatuses = self::getCaseStatus();
+    $friendlyText = "";
+    if ($this->conditionParams['operator'] == 0) {
+      $friendlyText = 'Case Status is one of: ';
+    }
+    if ($this->conditionParams['operator'] == 1) {
+      $friendlyText = 'Case Status is NOT one of: ';
+    }
+    $caseText = array();
+    foreach ($this->conditionParams['status_id'] as $caseStatusId) {
+      $caseText[] = $caseStatuses[$caseStatusId];
+    }
+    if (!empty($caseText)) {
+      $friendlyText .= implode(", ", $caseText);
+    }
+    return $friendlyText;
+  }
+
+  public static function getCaseStatus() {
+    $return = array();
+    $option_group_id = civicrm_api3('OptionGroup', 'getvalue', array('return' => 'id', 'name' => 'case_status'));
+    $case_statuses = civicrm_api3('OptionValue', 'Get', array('option_group_id' => $option_group_id));
+    foreach ($case_statuses['values'] as $case_status) {
+      $return[$case_status['value']] = $case_status['label'];
+    }
+    return $return;
+  }
+
+  /**
+   * Returns an array with required entity names
+   *
+   * @return array
+   * @access public
+   */
+  public function requiredEntities() {
+    return array('Case');
+  }
+
+}
\ No newline at end of file
diff --git a/CRM/CivirulesConditions/Form/Case/CaseStatus.php b/CRM/CivirulesConditions/Form/Case/CaseStatus.php
new file mode 100644
index 0000000..d3f44c2
--- /dev/null
+++ b/CRM/CivirulesConditions/Form/Case/CaseStatus.php
@@ -0,0 +1,60 @@
+<?php
+
+
+class CRM_CivirulesConditions_Form_Case_CaseStatus extends CRM_CivirulesConditions_Form_Form {
+
+  protected function getCaseStatus() {
+    return CRM_CivirulesConditions_Case_CaseStatus::getCaseStatus();
+  }
+
+  /**
+   * Overridden parent method to build form
+   *
+   * @access public
+   */
+  public function buildQuickForm() {
+    $this->add('hidden', 'rule_condition_id');
+
+    $caseStatuses = $this->getCaseStatus();
+    asort($caseStatuses);
+    $this->add('select', 'status_id', ts('Case Status(es)'), $caseStatuses, true,
+      array('id' => 'status_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,),
+      array('type' => 'cancel', 'name' => ts('Cancel'))));
+  }
+
+  /**
+   * Overridden parent method to set default values
+   *
+   * @return array $defaultValues
+   * @access public
+   */
+  public function setDefaultValues() {
+    $defaultValues = parent::setDefaultValues();
+    $data = unserialize($this->ruleCondition->condition_params);
+    if (!empty($data['status_id'])) {
+      $defaultValues['status_id'] = $data['status_id'];
+    }
+    if (!empty($data['operator'])) {
+      $defaultValues['operator'] = $data['operator'];
+    }
+    return $defaultValues;
+  }
+
+  /**
+   * Overridden parent method to process form data after submission
+   *
+   * @throws Exception when rule condition not found
+   * @access public
+   */
+  public function postProcess() {
+    $data['status_id'] = $this->_submitValues['status_id'];
+    $data['operator'] = $this->_submitValues['operator'];
+    $this->ruleCondition->condition_params = serialize($data);
+    $this->ruleCondition->save();
+    parent::postProcess();
+  }
+}
\ No newline at end of file
diff --git a/templates/CRM/CivirulesConditions/Form/Case/CaseStatus.tpl b/templates/CRM/CivirulesConditions/Form/Case/CaseStatus.tpl
new file mode 100644
index 0000000..1c23fef
--- /dev/null
+++ b/templates/CRM/CivirulesConditions/Form/Case/CaseStatus.tpl
@@ -0,0 +1,16 @@
+<h3>{$ruleConditionHeader}</h3>
+<div class="crm-block crm-form-block crm-civirule-rule_condition-block-case_status">
+  <div class="crm-section">
+    <div class="label">{$form.operator.label}</div>
+    <div class="content">{$form.operator.html}</div>
+    <div class="clear"></div>
+  </div>
+  <div class="crm-section">
+    <div class="label">{$form.status_id.label}</div>
+    <div class="content">{$form.status_id.html}</div>
+    <div class="clear"></div>
+  </div>
+</div>
+<div class="crm-submit-buttons">
+    {include file="CRM/common/formButtons.tpl" location="bottom"}
+</div>
\ No newline at end of file
diff --git a/xml/Menu/civirules.xml b/xml/Menu/civirules.xml
index 77158c8..188737e 100755
--- a/xml/Menu/civirules.xml
+++ b/xml/Menu/civirules.xml
@@ -70,6 +70,13 @@
     <access_arguments>access CiviCRM</access_arguments>
     <access_arguments>administer CiviCRM</access_arguments>
   </item>
+  <item>
+    <path>civicrm/civirule/form/condition/case/casestatus</path>
+    <page_callback>CRM_CivirulesConditions_Form_Case_CaseStatus</page_callback>
+    <title>case status</title>
+    <access_arguments>access CiviCRM</access_arguments>
+    <access_arguments>administer CiviCRM</access_arguments>
+  </item>
   <item>
     <path>civicrm/civirule/form/condition/membershiptype</path>
     <page_callback>CRM_CivirulesConditions_Form_Membership_Type</page_callback>
-- 
GitLab