Skip to content
Snippets Groups Projects
Commit a40baa3f authored by jaapjansma's avatar jaapjansma
Browse files

Added an action to set date fields on a case

parent e63f344c
No related branches found
No related tags found
No related merge requests found
<?php
/**
* @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org>
* @license http://www.gnu.org/licenses/agpl-3.0.html
*/
class CRM_CivirulesActions_Case_Form_SetDateField extends CRM_CivirulesActions_Form_Form {
protected function getFields() {
$return = array();
$fields = civicrm_api3('Case', 'getfields', array('limit' => 99999));
foreach ($fields['values'] as $field) {
if (!isset($field['type'])) {
continue;
}
if (!($field['type'] & CRM_Utils_Type::T_DATE)) {
continue; //Field is not a Date field.
}
$fieldKey = $field['name'];
if (isset($field['title'])) {
$label = trim($field['title']);
} elseif (isset($field['label'])) {
$label = trim($field['label']);
} else {
$label = "";
}
if (empty($label)) {
$label = $field['name'];
}
if (!empty($field['groupTitle'])) {
$label = $field['groupTitle'].': '.$label;
}
$return[$fieldKey] = $label;
}
return $return;
}
public function buildQuickForm() {
$this->add('hidden', 'rule_action_id');
$this->add('select', 'field', ts('Field'), $this->getFields(), true, array('class' => 'crm-select2'));
$delayList = array('' => ts(' - Set date to time of processing of action - ')) + CRM_Civirules_Delay_Factory::getOptionList();
$this->add('select', 'date', ts('Set date'), $delayList);
foreach(CRM_Civirules_Delay_Factory::getAllDelayClasses() as $delay_class) {
$delay_class->addElements($this, 'date', $this->rule);
}
$this->assign('delayClasses', CRM_Civirules_Delay_Factory::getAllDelayClasses());
$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();
if (!empty($data['field'])) {
$defaultValues['field'] = $data['field'];
}
$data = unserialize($this->ruleAction->action_params);
foreach(CRM_Civirules_Delay_Factory::getAllDelayClasses() as $delay_class) {
$delay_class->setDefaultValues($defaultValues, 'date', $this->rule);
}
$activityDateClass = unserialize($data['date']);
if ($activityDateClass) {
$defaultValues['date'] = get_class($activityDateClass);
foreach($activityDateClass->getValues('date', $this->rule) as $key => $val) {
$defaultValues[$key] = $val;
}
}
return $defaultValues;
}
/**
* Function to add validation action rules (overrides parent function)
*
* @access public
*/
public function addRules() {
parent::addRules();
$this->addFormRule(array(
'CRM_CivirulesActions_Case_Form_SetDateField',
'validateDate'
));
}
/**
* Function to validate value of the delay
*
* @param array $fields
* @return array|bool
* @access public
* @static
*/
static function validateDate($fields) {
$errors = array();
if (!empty($fields['date'])) {
$ruleActionId = CRM_Utils_Request::retrieve('rule_action_id', 'Integer');
$ruleAction = new CRM_Civirules_BAO_RuleAction();
$ruleAction->id = $ruleActionId;
$ruleAction->find(true);
$rule = new CRM_Civirules_BAO_Rule();
$rule->id = $ruleAction->rule_id;
$rule->find(true);
$activityDateClass = CRM_Civirules_Delay_Factory::getDelayClassByName($fields['date']);
$activityDateClass->validate($fields, $errors, 'date', $rule);
}
if (count($errors)) {
return $errors;
}
return TRUE;
}
/**
* Overridden parent method to process form data after submitting
*
* @access public
*/
public function postProcess() {
$data['date'] = 'null';
if (!empty($this->_submitValues['date'])) {
$scheduledDateClass = CRM_Civirules_Delay_Factory::getDelayClassByName($this->_submitValues['date']);
$scheduledDateClass->setValues($this->_submitValues, 'date', $this->rule);
$data['date'] = serialize($scheduledDateClass);
}
$data['field'] = $this->_submitValues['field'];
$this->ruleAction->action_params = serialize($data);
$this->ruleAction->save();
parent::postProcess();
}
}
\ No newline at end of file
<?php
return array (
0 =>
array (
'name' => 'Civirules:Action.Case.SetDateFieldOnCase',
'entity' => 'CiviRuleAction',
'params' =>
array (
'version' => 3,
'name' => 'SetDateFieldOnCase',
'label' => 'Set a date field on a case',
'class_name' => 'CRM_CivirulesActions_Case_SetDateFieldOnCase',
'is_active' => 1
),
),
);
<?php
/**
* @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org>
* @license http://www.gnu.org/licenses/agpl-3.0.html
*/
class CRM_CivirulesActions_Case_SetDateFieldOnCase extends CRM_Civirules_Action {
public function getExtraDataInputUrl($ruleActionId) {
return CRM_Utils_System::url('civicrm/civirule/form/action/case/setdatefield', 'rule_action_id='.$ruleActionId);
}
public function processAction(CRM_Civirules_TriggerData_TriggerData $triggerData) {
$case = $triggerData->getEntityData('Case');
$actionParameters = $this->getActionParameters();
$isCustomField = true;
$field = 'custom_505';
$date = new DateTime();
$params = array();
if (!empty($actionParameters['date'])) {
$delayClass = unserialize(($actionParameters['date']));
if ($delayClass instanceof CRM_Civirules_Delay_Delay) {
$date = $delayClass->delayTo($date, $triggerData);
}
}
if ($isCustomField) {
if ($date instanceof DateTime) {
$params[$field] = $date->format('Ymd His');
$params['entity_id'] = $case['id'];
civicrm_api('CustomValue', 'create', $params);
}
} else {
if ($date instanceof DateTime) {
$params[$field] = $date->format('Ymd His');
$params['id'] = $case['id'];
civicrm_api('Case', 'create', $params);
}
}
}
/**
* This function validates whether this action works with the selected trigger.
*
* This function could be overriden in child classes to provide additional validation
* whether an action is possible in the current setup.
*
* @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) {
$providedEntities = $trigger->getProvidedEntities();
if (isset($providedEntities['Case'])) {
return true;
}
return false;
}
}
\ No newline at end of file
<h3>{$ruleActionHeader}</h3>
<div class="crm-block crm-form-block crm-civirule-rule_action-block-setdateoncase">
<div class="crm-section">
<div class="label">{$form.field.label}</div>
<div class="content">{$form.field.html}</div>
<div class="clear"></div>
</div>
<div class="crm-section">
<div class="label">{$form.date.label}</div>
<div class="content">{$form.date.html}</div>
<div class="clear"></div>
</div>
{foreach from=$delayClasses item=delayClass}
<div class="crm-section crm-date-class" id="{$delayClass->getName()}">
<div class="label"></div>
<div class="content"><strong>{$delayClass->getDescription()}</strong></div>
<div class="clear"></div>
{include file=$delayClass->getTemplateFilename() delayPrefix='date'}
</div>
{/foreach}
</div>
<div class="crm-submit-buttons">
{include file="CRM/common/formButtons.tpl" location="bottom"}
</div>
{literal}
<script type="text/javascript">
cj(function() {
cj('select#date').change(triggerDelayChange);
triggerDelayChange();
});
function triggerDelayChange() {
cj('.crm-date-class').css('display', 'none');
var val = cj('#date').val();
if (val) {
cj('#'+val).css('display', 'block');
}
}
</script>
{/literal}
\ No newline at end of file
......@@ -266,4 +266,11 @@
<access_arguments>access CiviCRM</access_arguments>
<access_arguments>administer CiviCRM</access_arguments>
</item>
<item>
<path>civicrm/civirule/form/action/case/setdatefield</path>
<page_callback>CRM_CivirulesActions_Case_Form_SetDateField</page_callback>
<title>Case - Set date field</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