Skip to content

Commit

Permalink
Add field in "Advanced Search" to search for contacts with specific r…
Browse files Browse the repository at this point in the history
…ecurring contribution status(es).

CRM_Contribute_BAO_ContributionRecur: add multi-select dropdown field to select recurring contribution status.

CRM_Contribute_BAO_Query: add case to construct where clause for recurring contribution status.

templates/CRM/Contribute/Form/Search/ContributionRecur.tpl: add recurring contribution status field in template.

civicrm#11080

Add quotes around recurring contribution status qill.

civicrm#11080

Directly use CRM_Contribute_PseudoConstant::contributionStatus() instead
of creating variable that is not used anywhere else.

Remove space after closing ) to comply with coding standard

Remove comma after closing ) to comply with coding standard

Add unit test for recurring contribution status filter

Fix coding style error: The closing brace for the class must have an empty line before it

Do not use variable replacement in qill for static text "Recurring
Contribution Status".
  • Loading branch information
Victor Huang committed Oct 25, 2017
1 parent 9d11189 commit 5af1389
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 @@ -386,6 +386,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 5af1389

Please sign in to comment.