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

issue #5: total amount contributed in period

parent 02f36550
Branches
Tags
No related merge requests found
<?php
return array (
0 =>
array (
'name' => 'Civirules:Condition.ContributionTotalContributedAmount',
'entity' => 'CiviRuleCondition',
'params' =>
array (
'version' => 3,
'name' => 'contribution_totalcontributedamount',
'label' => 'Total contributed amount',
'class_name' => 'CRM_CivirulesConditions_Contribution_TotalContributedAmount',
'is_active' => 1
),
),
);
\ No newline at end of file
<?php
class CRM_CivirulesConditions_Contribution_TotalContributedAmount extends CRM_CivirulesConditions_Generic_ValueComparison {
/**
* Returns value of the field
*
* @param object CRM_Civirules_EventData_EventData $eventData
* @return mixed
* @access protected
*/
protected function getFieldValue(CRM_Civirules_EventData_EventData $eventData) {
$completed_status_id = CRM_Core_OptionGroup::getValue('contribution_status', 'completed', 'name');
$contact_id = $eventData->getContactId();
$sql = "SELECT SUM(`total_amount`)
FROM `civicrm_contribution`
WHERE `contribution_status_id` = %1 AND `contact_id` = %2";
$params[1] = array($completed_status_id, 'Integer');
$params[2] = array($contact_id, 'Integer');
$periodStartDate = CRM_CivirulesConditions_Utils_Period::convertPeriodToStartDate($this->conditionParams['period']);
$periodEndDate = CRM_CivirulesConditions_Utils_Period::convertPeriodToEndDate($this->conditionParams['period']);
if ($periodStartDate) {
$sql .= " AND DATE(`receive_date`) >= '".$periodStartDate->format('Y-m-d')."'";
}
if ($periodEndDate) {
$sql .= " AND DATE(`receive_date`) <= '".$periodEndDate->format('Y-m-d')."'";
}
$total_amount = (float) CRM_Core_DAO::singleValueQuery($sql, $params);
return $total_amount;
}
/**
* 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/contribution_totalcontributedamount/', '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() {
$userFriendlyConditionParams = parent::userFriendlyConditionParams();
$periods = CRM_CivirulesConditions_Utils_Period::Options();
if (isset($periods[$this->conditionParams['period']])) {
$period = $periods[$this->conditionParams['period']];
} else {
$period = ts('all time');
}
return ts('Total amount').' '.$period.' '.$userFriendlyConditionParams;
}
}
\ No newline at end of file
<?php
class CRM_CivirulesConditions_Form_Contribution_TotalContributedAmount extends CRM_CivirulesConditions_Form_ValueComparison {
/**
* Overridden parent method to build form
*
* @access public
*/
public function buildQuickForm() {
parent::buildQuickForm();
$this->add('select', 'period', ts('Period'), array('' => ts('No period')) + CRM_CivirulesConditions_Utils_Period::Options());
}
/**
* 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['period'])) {
$defaultValues['period'] = $data['period'];
}
return $defaultValues;
}
/**
* Overridden parent method to process form data after submission
*
* @throws Exception when rule condition not found
* @access public
*/
public function postProcess()
{
$data = unserialize($this->ruleCondition->condition_params);
$data['period'] = $this->_submitValues['period'];
$this->ruleCondition->condition_params = serialize($data);
$this->ruleCondition->save();
parent::postProcess();
}
}
\ No newline at end of file
......@@ -70,33 +70,20 @@ class CRM_CivirulesConditions_Form_ValueComparison extends CRM_CivirulesConditio
* @access public
*/
public function postProcess() {
$ruleId = 0;
$ruleCondition = new CRM_Civirules_BAO_RuleCondition();
$ruleCondition->id = $this->ruleConditionId;
$condition_label = '';
if ($ruleCondition->find(true)) {
$ruleId = $ruleCondition->rule_id;
$condition = new CRM_Civirules_BAO_Condition();
$condition->id = $ruleCondition->condition_id;
if ($condition->find(true)) {
$condition_label = $condition->label;
}
} else {
throw new Exception('Could not find rule condition');
}
$data = unserialize($this->ruleCondition->condition_params);
$data['operator'] = $this->_submitValues['operator'];
$data['value'] = $this->_submitValues['value'];
$ruleCondition->condition_params = serialize($data);
$ruleCondition->save();
$this->ruleCondition->condition_params = serialize($data);
$this->ruleCondition->save();
$session = CRM_Core_Session::singleton();
$session->setStatus('Condition '.$condition_label.' parameters updated to CiviRule '
.CRM_Civirules_BAO_Rule::getRuleLabelWithId($ruleId),
$session->setStatus('Condition '.$this->condition->label.' parameters updated to CiviRule '
.CRM_Civirules_BAO_Rule::getRuleLabelWithId($this->ruleCondition->rule_id),
'Condition parameters updated', 'success');
$redirectUrl = CRM_Utils_System::url('civicrm/civirule/form/rule', 'action=update&id='.$ruleId, TRUE);
CRM_Utils_System::redirect($redirectUrl); }
$redirectUrl = CRM_Utils_System::url('civicrm/civirule/form/rule', 'action=update&id='.$this->ruleCondition->rule_id, TRUE);
CRM_Utils_System::redirect($redirectUrl);
}
/**
* Method to set the form title
......
<?php
/**
* This class handles period conditions
* It provides a list with options for period
* and it converts it to a start and end date of the period
*
*/
class CRM_CivirulesConditions_Utils_Period {
public static function Options() {
return array(
'this month' => ts('This month'),
'previous month' => ts('Previous month'),
'last 30 days' => ts('Last 30 days'),
'this year' => ts('This year'),
'previous year' => ts('Previous year'),
);
}
public static function convertPeriodToStartDate($period) {
$date = new DateTime();
switch ($period) {
case 'this month':
$date->modify('first day of this month');
return $date;
break;
case 'previous month':
$date->modify('first day of previous month');
return $date;
break;
case 'last 30 days':
$date->modify('-30 days');
return $date;
break;
case 'this year':
$date->modify('first day of January this year');
return $date;
break;
case 'previous year':
$date->modify('first day of January previous year');
return $date;
break;
}
return false;
}
public static function convertPeriodToEndDate($period) {
$date = new DateTime();
switch ($period) {
case 'this month':
$date->modify('last day of this month');
return $date;
break;
case 'previous month':
$date->modify('last day of previous month');
return $date;
break;
case 'last 30 days':
return $date;
break;
case 'this year':
$date->modify('last day of December this year');
return $date;
break;
case 'previous year':
$date->modify('last day of December previous year');
return $date;
break;
}
return false;
}
}
<h3>{$ruleConditionHeader}</h3>
<div class="crm-block crm-form-block crm-civirule-rule_condition-block-value-comparison">
<div class="crm-section">
<div class="label">{$form.period.label}</div>
<div class="content">{$form.period.html}</div>
<div class="clear"></div>
</div>
<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.value.label}</div>
<div class="content">{$form.value.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
......@@ -48,6 +48,12 @@
<title>contribution status</title>
<access_arguments>access CiviCRM</access_arguments>
</item>
<item>
<path>civicrm/civirule/form/condition/contribution_totalcontributedamount</path>
<page_callback>CRM_CivirulesConditions_Form_Contribution_TotalContributedAmount</page_callback>
<title>Total contributed amount</title>
<access_arguments>access CiviCRM</access_arguments>
</item>
<item>
<path>civicrm/civirule/form/condition/contribution_financialtype</path>
<page_callback>CRM_CivirulesConditions_Form_Contribution_FinancialType</page_callback>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment