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