Skip to content
Snippets Groups Projects
Commit f7b4149d authored by ErikHommel's avatar ErikHommel :homes:
Browse files

fix #48 - add condition to check old and new participant status

parent 26b40b3e
No related branches found
No related tags found
No related merge requests found
......@@ -102,6 +102,21 @@ abstract class CRM_Civirules_TriggerData_TriggerData {
return array();
}
/**
* Method to return originalData if present
*
* @return array
*/
public function getOriginalData() {
if (isset($this->originalData)) {
return $this->originalData;
}
else {
return [];
}
}
/**
* Returns an array of custom fields in param format
*
......@@ -176,4 +191,4 @@ abstract class CRM_Civirules_TriggerData_TriggerData {
return null;
}
}
\ No newline at end of file
}
......@@ -639,5 +639,27 @@ class CRM_Civirules_Upgrader extends CRM_Civirules_Upgrader_Base {
return TRUE;
}
/**
* Upgrade 2036 add participant status changed condition
*/
public function upgrade_2036() {
$this->ctx->log->info('Applying update 2036 - add Participant Status Changed condition');
$select = "SELECT COUNT(*) FROM civirule_condition WHERE class_name = %1";
  • jaapjansma @jaapjansma ·
    Maintainer

    Just for information: To add a new condition you can also use

    CRM_Civirules_Utils_Upgrader::insertConditionsFromJson($this->extensionDir . DIRECTORY_SEPARATOR . 'sql/conditions.json');

    Same function exists for actions and triggers.

  • Please register or sign in to reply
$selectParams = [1 => ['CRM_CivirulesConditions_Participation_StatusChanged', 'String']];
$count = CRM_Core_DAO::singleValueQuery($select, $selectParams);
if ($count == 0) {
$insert = "INSERT INTO civirule_condition (name, label, class_name, is_active) VALUES(%1, %2, %3, %4)";
$insertParams = [
1 => ['participant_status_changed', 'String'],
2 => ['Compare Old Participant Status to New Participant Status', 'String'],
3 => ['CRM_CivirulesConditions_Participant_StatusChanged', 'String'],
4 => [1, 'Integer'],
];
CRM_Core_DAO::executeQuery($insert, $insertParams);
}
return TRUE;
}
}
<?php
use CRM_Civirules_ExtensionUtil as E;
/**
* Class for CiviRules Condition Compare old/new participant status form
*
* @author Erik Hommel (CiviCooP) <erik.hommel@civicoop.org>
* @date 1 Oct 2019
* @license AGPL-3.0
*/
class CRM_CivirulesConditions_Form_Participant_StatusChanged extends CRM_CivirulesConditions_Form_Form {
/**
* Overridden parent method to build form
*
* @access public
*/
public function buildQuickForm() {
$this->add('hidden', 'rule_condition_id');
$statuses = CRM_CivirulesConditions_Participant_StatusChanged::getAllParticipantStatus();
asort($statuses);
$this->add('select', 'original_status_id', E::ts('Participant Status(es)'), $statuses, TRUE,
['id' => 'original_status_ids', 'class' => 'crm-select2']);
$this->add('select', 'new_status_id', E::ts('Participant Status(es)'), $statuses, TRUE,
['id' => 'new_status_ids', 'class' => 'crm-select2']);
$this->add('select', 'original_operator', E::ts('Operator'), [E::ts('is one of'), E::ts('is NOT one of')], TRUE);
$this->add('select', 'new_operator', E::ts('Operator'), [E::ts('is one of'), E::ts('is NOT one of')], TRUE);
$this->addButtons([
['type' => 'next', 'name' => E::ts('Save'), 'isDefault' => TRUE,],
['type' => 'cancel', 'name' => E::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['new_status_id'])) {
$defaultValues['new_status_id'] = $data['new_status_id'];
}
if (!empty($data['original_status_id'])) {
$defaultValues['original_status_id'] = $data['original_status_id'];
}
if (!empty($data['original_operator'])) {
$defaultValues['original_operator'] = $data['original_operator'];
}
if (!empty($data['new_operator'])) {
$defaultValues['new_operator'] = $data['new_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['original_status_id'] = $this->_submitValues['original_status_id'];
$data['new_status_id'] = $this->_submitValues['new_status_id'];
$data['original_operator'] = $this->_submitValues['original_operator'];
$data['new_operator'] = $this->_submitValues['new_operator'];
$this->ruleCondition->condition_params = serialize($data);
$this->ruleCondition->save();
parent::postProcess();
}
}
<?php
/**
* Class for CiviRules Participant status changed
*
* @author Erik Hommel (CiviCooP) <erik.hommel@civicoop.org>
* @date 1 Oct 2019
* @license AGPL-3.0
*/
class CRM_CivirulesConditions_Participant_StatusChanged 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 = [];
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) {
$participantData = $triggerData->getEntityData('Participant');
$originalData = $triggerData->getOriginalData();
if (!isset($originalData['participant_status_id'])) {
$originalStatus = NULL;
}
else {
$originalStatus = $originalData['participant_status_id'];
}
if (!isset($participantData['status_id'])) {
$newStatus = NULL;
}
else {
$newStatus = $participantData['status_id'];
}
$originalCheck = $this->checkCondition($originalStatus, $this->_conditionParams['original_operator'], $this->_conditionParams['original_status_id']);
$newCheck = $this->checkCondition($newStatus, $this->_conditionParams['new_operator'], $this->_conditionParams['new_status_id']);
if ($originalCheck && $newCheck) {
return TRUE;
}
return FALSE;
}
/**
* Method to check status condition
*
* @param $statusId
* @param $operator
* @param $conditionStatusId
* @return bool
*/
private function checkCondition($statusId, $operator, $conditionStatusId) {
if ($operator == 1) {
// if not set, then not equal is true
if (!$statusId) {
return TRUE;
}
else {
if ($statusId != $conditionStatusId) {
return TRUE;
}
}
}
else {
if ($statusId && $statusId == $conditionStatusId) {
return TRUE;
}
}
return FALSE;
}
/**
* Method to get all the participant status types
*
* @return array
*/
public static function getAllParticipantStatus() {
$result = [];
try {
$api = civicrm_api3('ParticipantStatusType', 'get', [
'return' => ["label"],
'options' => ['limit' => 0],
]);
foreach ($api['values'] as $statusId => $status) {
$result[$statusId] = $status['label'];
}
}
catch (CiviCRM_API3_Exception $ex) {
}
return $result;
}
/**
* 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/participant/statuschanged', 'rule_condition_id=' . $ruleConditionId);
}
/**
* Returns a user friendly text explaining the condition params
* e.g. 'Older than 65'
*
* @return string
* @access public
* @throws Exception
*/
public function userFriendlyConditionParams() {
$participantStatusList = CRM_CivirulesConditions_Participant_StatusChanged::getAllParticipantStatus();
$friendlyText = "Original participant status ";
if ($this->_conditionParams['original_operator'] == 1) {
$friendlyText .= " is NOT equal " . $participantStatusList[$this->_conditionParams['original_status_id']];
}
else {
$friendlyText .= " is equal " . $participantStatusList[$this->_conditionParams['original_status_id']];
}
$friendlyText .= " and new status ";
if ($this->_conditionParams['new_operator'] == 1) {
$friendlyText .= " is NOT equal " . $participantStatusList[$this->_conditionParams['new_status_id']];
}
else {
$friendlyText .= " is equal " . $participantStatusList[$this->_conditionParams['new_status_id']];
}
return $friendlyText;
}
/**
* This function validates whether this condition works with the selected trigger.
*
* This function could be overriden in child classes to provide additional validation
* whether a condition is possible in the current setup. E.g. we could have a condition
* which works on contribution or on contributionRecur then this function could do
* this kind of validation and return false/true
*
* @param CRM_Civirules_Trigger $trigger
* @param CRM_Civirules_BAO_Rule $rule
* @return bool
*/
public function doesWorkWithTrigger(CRM_Civirules_Trigger $trigger, CRM_Civirules_BAO_Rule $rule) {
return $trigger->doesProvideEntity('Participant');
}
}
......@@ -58,5 +58,6 @@
{"name":"activity_is_past_date","label":"Activity Date in the Past","class_name":"CRM_CivirulesConditions_Activity_ActivityIsPast"},
{"name":"activity_date_comparison","label":"Activity Date is .....","class_name":"CRM_CivirulesConditions_Activity_Date"},
{"name":"xth_contribution_contact","label":"xth Contribution of Contact","class_name":"CRM_CivirulesConditions_Contribution_xthContribution"},
{"name":"contact_in_domain","label":"Contact (not) in Domain","class_name":"CRM_CivirulesConditions_Contact_InDomain"}
{"name":"contact_in_domain","label":"Contact (not) in Domain","class_name":"CRM_CivirulesConditions_Contact_InDomain"},
{"name": "participant_status_changed", "label":"Compare Old Participant Status to New Participant Status", "class_name": "CRM_CivirulesConditions_Participant_StatusChanged"}
]
<h3>{$ruleConditionHeader}</h3>
<div class="crm-block crm-form-block crm-civirule-rule_condition-block-participant_statuschanged">
<h2>Original value:</h2>
<div class="crm-section">
<div class="label">{$form.original_operator.label}</div>
<div class="content">{$form.original_operator.html}</div>
<div class="clear"></div>
</div>
<div class="crm-section section">
<div class="label">
{$form.original_status_id.label}
</div>
<div class="content crm-select-container" id="original_status_block">
{$form.original_status_id.html}
</div>
<div class="clear"></div>
</div>
<h2>New value:</h2>
<div class="crm-section">
<div class="label">{$form.new_operator.label}</div>
<div class="content">{$form.new_operator.html}</div>
<div class="clear"></div>
</div>
<div class="crm-section section">
<div class="label">
{$form.new_status_id.label}
</div>
<div class="content crm-select-container" id="new_status_block">
{$form.new_status_id.html}
</div>
<div class="clear"></div>
</div>
</div>
<div class="crm-submit-buttons">
{include file="CRM/common/formButtons.tpl" location="bottom"}
</div>
......@@ -474,4 +474,11 @@
<access_arguments>access CiviCRM</access_arguments>
<access_arguments>administer CiviCRM</access_arguments>
</item>
<item>
<path>civicrm/civirule/form/condition/participant/statuschanged</path>
<page_callback>CRM_CivirulesConditions_Form_Participant_StatusChanged</page_callback>
<title>participant status changed</title>
<access_arguments>access CiviCRM</access_arguments>
<access_arguments>administer CiviCRM</access_arguments>
</item>
</menu>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment