Skip to content

Commit

Permalink
Merge pull request civicrm#11080 from waddyvic/advanced-search-recur-…
Browse files Browse the repository at this point in the history
…status

CRM-21354 : Allow "Advanced Search" to search for recurring contribution status.
  • Loading branch information
monishdeb authored and sluc23 committed Jan 10, 2018
2 parents b991957 + 5af1389 commit 0800d51
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 0 deletions.
6 changes: 6 additions & 0 deletions CRM/Contribute/BAO/ContributionRecur.php
Original file line number Diff line number Diff line change
Expand Up @@ -777,6 +777,12 @@ public static function recurringContribution(&$form) {
CRM_Core_Form_Date::buildDateRange($form, 'contribution_recur_next_sched_contribution_date', 1, '_low', '_high', ts('From'), FALSE, FALSE, 'birth');
CRM_Core_Form_Date::buildDateRange($form, 'contribution_recur_failure_retry_date', 1, '_low', '_high', ts('From'), FALSE, FALSE, 'birth');
CRM_Core_Form_Date::buildDateRange($form, 'contribution_recur_cancel_date', 1, '_low', '_high', ts('From'), FALSE, FALSE, 'birth');

// Add field for contribution status
$form->addSelect('contribution_recur_contribution_status_id',
array('entity' => 'contribution', 'multiple' => 'multiple', 'context' => 'search', 'options' => CRM_Contribute_PseudoConstant::contributionStatus())
);

$form->addElement('text', 'contribution_recur_processor_id', ts('Processor ID'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionRecur', 'processor_id'));
$form->addElement('text', 'contribution_recur_trxn_id', ts('Transaction ID'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionRecur', 'trxn_id'));

Expand Down
7 changes: 7 additions & 0 deletions CRM/Contribute/BAO/Query.php
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,13 @@ public static function whereClauseSingle(&$values, &$query) {
$query->_tables['civicrm_contribution_recur'] = $query->_whereTables['civicrm_contribution_recur'] = 1;
return;

case 'contribution_recur_contribution_status_id':
$query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause("civicrm_contribution_recur.contribution_status_id", $op, $value, 'String');
list($op, $value) = CRM_Contact_BAO_Query::buildQillForFieldValue('CRM_Contribute_DAO_ContributionRecur', 'contribution_status_id', $value, $op, $pseudoExtraParam);
$query->_qill[$grouping][] = ts("Recurring Contribution Status %1 '%2'", array(1 => $op, 2 => $value));
$query->_tables['civicrm_contribution_recur'] = $query->_whereTables['civicrm_contribution_recur'] = 1;
return;

case 'contribution_note':
$value = $strtolower(CRM_Core_DAO::escapeString($value));
if ($wildcard) {
Expand Down
7 changes: 7 additions & 0 deletions templates/CRM/Contribute/Form/Search/ContributionRecur.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,13 @@
{include file="CRM/Core/DateRange.tpl" fieldName="contribution_recur_cancel_date" from='_low' to='_high'}
</td>
</tr>
<tr>
<td>{ts}Recurring Contribution Status{/ts}</td>
<td></td>
<td col='span2'>
{$form.contribution_recur_contribution_status_id.html|crmAddClass:twenty}
</td>
</tr>
{if $contributionRecurGroupTree}
<tr>
<td colspan="4">
Expand Down
116 changes: 116 additions & 0 deletions tests/phpunit/CRM/Contribute/Form/SearchTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -372,4 +372,120 @@ public function testCardNumberFilter() {
}
}

/**
* Test CRM_Contribute_Form_Search Recurring Contribution Status Id filters
*/
public function testContributionRecurStatusFilter() {
$this->quickCleanup($this->_tablesToTruncate);
$contactID1 = $this->individualCreate(array(), 1);
$contactID2 = $this->individualCreate(array(), 2);
// "In Progress" recurring contribution for contactID1
$ContributionRecur1 = $this->callAPISuccess('ContributionRecur', 'create', array(
'sequential' => 1,
'contact_id' => $contactID1,
'frequency_interval' => 1,
'frequency_unit' => "month",
'amount' => 11,
'currency' => "CAD",
'payment_instrument_id' => 1,
'contribution_status_id' => 5,
'financial_type_id' => "Donation",
));
$Contribution1 = $this->callAPISuccess('Contribution', 'create', array(
'financial_type_id' => 1,
'total_amount' => 11,
'receive_date' => date('Ymd'),
'receive_date_time' => NULL,
'payment_instrument_id' => 1,
'contribution_status_id' => 1,
'contact_id' => $contactID1,
'contribution_recur_id' => $ContributionRecur1['id'],
'financial_type_id' => "Donation",
));
$params = array(
'to_financial_account_id' => 1,
'status_id' => 1,
'contribution_id' => $Contribution1['id'],
'payment_instrument_id' => 1,
'card_type_id' => 1,
'total_amount' => 11,
);
CRM_Core_BAO_FinancialTrxn::create($params);
// "Completed" recurring contribution for contactID2
$ContributionRecur2 = $this->callAPISuccess('ContributionRecur', 'create', array(
'sequential' => 1,
'contact_id' => $contactID2,
'frequency_interval' => 1,
'frequency_unit' => "month",
'amount' => 22,
'currency' => "CAD",
'payment_instrument_id' => 1,
'contribution_status_id' => 1,
'financial_type_id' => "Donation",
));
$Contribution2 = $this->callAPISuccess('Contribution', 'create', array(
'financial_type_id' => 1,
'total_amount' => 22,
'receive_date' => date('Ymd'),
'receive_date_time' => NULL,
'payment_instrument' => 1,
'contribution_status_id' => 1,
'contact_id' => $contactID2,
'contribution_recur_id' => $ContributionRecur2['id'],
'financial_type_id' => "Donation",
));
$params = array(
'to_financial_account_id' => 1,
'status_id' => 1,
'contribution_id' => $Contribution2['id'],
'payment_instrument_id' => 1,
'card_type_id' => 1,
'total_amount' => 22,
);
CRM_Core_BAO_FinancialTrxn::create($params);

$useCases = array(
// Case 1: Search for ONLY those recurring contributions with status "In Progress"
array(
'form_value' => array('contribution_recur_contribution_status_id' => 5),
'expected_count' => 1,
'expected_contact' => array($contactID1),
'expected_qill' => "Recurring Contribution Status = 'In Progress'",
),
// Case 2: Search for ONLY those recurring contributions with status "Completed"
array(
'form_value' => array('contribution_recur_contribution_status_id' => 1),
'expected_count' => 1,
'expected_contact' => array($contactID2),
'expected_qill' => "Recurring Contribution Status = 'Completed'",
),
// Case 3: Search for ONLY those recurring contributions with status "Cancelled"
array(
'form_value' => array('contribution_recur_contribution_status_id' => 3),
'expected_count' => 0,
'expected_contact' => array(),
'expected_qill' => "Recurring Contribution Status = 'Cancelled'",
),
);

foreach ($useCases as $case) {
$fv = $case['form_value'];
$query = new CRM_Contact_BAO_Query(CRM_Contact_BAO_Query::convertFormValues($fv));
list($select, $from, $where, $having) = $query->query();

// get and assert contribution count
$contacts = CRM_Core_DAO::executeQuery(sprintf('SELECT DISTINCT contact_a.id %s %s AND contact_a.id IS NOT NULL', $from, $where))->fetchAll();
foreach ($contacts as $key => $value) {
$contacts[$key] = $value['id'];
}
// assert the contribution count
$this->assertEquals($case['expected_count'], count($contacts));
// assert the contribution IDs
$this->checkArrayEquals($case['expected_contact'], $contacts);
// get and assert qill string
$qill = trim(implode($query->getOperator(), CRM_Utils_Array::value(0, $query->qill())));
$this->assertEquals($case['expected_qill'], $qill);
}
}

}

0 comments on commit 0800d51

Please sign in to comment.