From c6ba3619548e8d62264358c15bcdce549b6d9c46 Mon Sep 17 00:00:00 2001 From: Edsel Date: Tue, 11 Apr 2017 14:17:42 +0530 Subject: [PATCH] CRM-20391 Added card number to search ---------------------------------------- * CRM-20391: Add card number field on search form https://issues.civicrm.org/jira/browse/CRM-20391 --- CRM/Contribute/BAO/Query.php | 14 +++ .../CRM/Contribute/Form/Search/Common.tpl | 4 + tests/phpunit/CRM/Contribute/Form/Search.php | 100 ++++++++++++++++++ 3 files changed, 118 insertions(+) diff --git a/CRM/Contribute/BAO/Query.php b/CRM/Contribute/BAO/Query.php index e7153b4eca..416cf0a9c1 100644 --- a/CRM/Contribute/BAO/Query.php +++ b/CRM/Contribute/BAO/Query.php @@ -451,6 +451,14 @@ class CRM_Contribute_BAO_Query extends CRM_Core_BAO_Query { $query->_qill[$grouping][] = ts('Card Type %1 %2', array(1 => $op, 2 => $value)); return; + case 'financial_trxn_pan_truncation': + $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause('civicrm_financial_trxn.pan_truncation', $op, $value); + $query->_tables['civicrm_financial_trxn'] = $query->_whereTables['civicrm_financial_trxn'] = 1; + $query->_tables['civicrm_contribution'] = $query->_whereTables['civicrm_contribution'] = 1; + list($op, $value) = CRM_Contact_BAO_Query::buildQillForFieldValue('CRM_Financial_DAO_FinancialTrxn', 'pan_truncation', $value, $op); + $query->_qill[$grouping][] = ts('Card Number %1 %2', array(1 => $op, 2 => $value)); + return; + default: //all other elements are handle in this case $fldName = substr($name, 13); @@ -961,6 +969,12 @@ class CRM_Contribute_BAO_Query extends CRM_Core_BAO_Query { $form->addField('financial_trxn_card_type', array('entity' => 'FinancialTrxn', 'name' => 'card_type', 'action' => 'get')); + $form->add('text', 'financial_trxn_pan_truncation', ts('Card Number'), array( + 'size' => 5, + 'maxlength' => 4, + 'autocomplete' => 'off', + )); + // CRM-16713 - contribution search by premiums on 'Find Contribution' form. $form->add('select', 'contribution_product_id', ts('Premium'), diff --git a/templates/CRM/Contribute/Form/Search/Common.tpl b/templates/CRM/Contribute/Form/Search/Common.tpl index d90cc57bfd..f1bd95f629 100644 --- a/templates/CRM/Contribute/Form/Search/Common.tpl +++ b/templates/CRM/Contribute/Form/Search/Common.tpl @@ -51,6 +51,10 @@ {$form.financial_trxn_card_type.label}
{$form.financial_trxn_card_type.html} +
+ {$form.financial_trxn_pan_truncation.label}
+ {$form.financial_trxn_pan_truncation.html} +
{$form.contribution_trxn_id.label}
diff --git a/tests/phpunit/CRM/Contribute/Form/Search.php b/tests/phpunit/CRM/Contribute/Form/Search.php index 612184e715..d8bebcc5d6 100644 --- a/tests/phpunit/CRM/Contribute/Form/Search.php +++ b/tests/phpunit/CRM/Contribute/Form/Search.php @@ -272,4 +272,104 @@ class CRM_Contribute_Form_Search extends CiviUnitTestCase { } } + /** + * CRM-20391: Test CRM_Contribute_Form_Search Card Number filters + */ + public function testCardNumberFilter() { + $this->quickCleanup($this->_tablesToTruncate); + $contactID1 = $this->individualCreate(array(), 1); + $contactID2 = $this->individualCreate(array(), 2); + $Contribution1 = $this->callAPISuccess('Contribution', 'create', array( + 'financial_type_id' => 1, + 'total_amount' => 100, + 'receive_date' => date('Ymd'), + 'receive_date_time' => NULL, + 'payment_instrument' => 1, + 'contribution_status_id' => 1, + 'contact_id' => $contactID1, + )); + $params = array( + 'to_financial_account_id' => 1, + 'status_id' => 1, + 'contribution_id' => $Contribution1['id'], + 'payment_instrument_id' => 1, + 'card_type' => 1, + 'total_amount' => 100, + 'pan_truncation' => 1234, + ); + CRM_Core_BAO_FinancialTrxn::create($params); + $Contribution2 = $this->callAPISuccess('Contribution', 'create', array( + 'financial_type_id' => 1, + 'total_amount' => 150, + 'receive_date' => date('Ymd'), + 'receive_date_time' => NULL, + 'payment_instrument' => 1, + 'contribution_status_id' => 1, + 'contact_id' => $contactID1, + )); + $Contribution3 = civicrm_api3('Contribution', 'create', array( + 'financial_type_id' => 1, + 'total_amount' => 200, + 'receive_date' => date('Ymd'), + 'receive_date_time' => NULL, + 'payment_instrument' => 1, + 'contribution_status_id' => 1, + 'contact_id' => $contactID2, + )); + $params = array( + 'to_financial_account_id' => 1, + 'status_id' => 1, + 'contribution_id' => $Contribution3['id'], + 'payment_instrument_id' => 1, + 'card_type' => 2, + 'total_amount' => 200, + 'pan_truncation' => 5678, + ); + CRM_Core_BAO_FinancialTrxn::create($params); + + $useCases = array( + // Case 1: Search for ONLY those contributions which have card number + array( + 'form_value' => array('financial_trxn_pan_truncation' => 'IS NOT NULL'), + 'expected_count' => 2, + 'expected_contribution' => array($Contribution1['id'], $Contribution3['id']), + 'expected_qill' => 'Card Number Not Null', + ), + // Case 2: Search for ONLY those contributions which have Card Number as 1234 + array( + 'form_value' => array('financial_trxn_pan_truncation' => 1234), + 'expected_count' => 1, + 'expected_contribution' => array($Contribution1['id']), + 'expected_qill' => 'Card Number Like %1234%', + ), + // Case 3: Search for ONLY those contributions which have Card Number as 8888 + array( + 'form_value' => array('financial_trxn_pan_truncation' => 8888), + 'expected_count' => 0, + 'expected_contribution' => array(), + 'expected_qill' => 'Card Number Like %8888%', + ), + ); + + foreach ($useCases as $case) { + $fv = $case['form_value']; + CRM_Contact_BAO_Query::processSpecialFormValue($fv, array('financial_trxn_pan_truncation')); + $query = new CRM_Contact_BAO_Query(CRM_Contact_BAO_Query::convertFormValues($fv)); + list($select, $from, $where, $having) = $query->query(); + + // get and assert contribution count + $contributions = CRM_Core_DAO::executeQuery(sprintf('SELECT DISTINCT civicrm_contribution.id %s %s AND civicrm_contribution.id IS NOT NULL', $from, $where))->fetchAll(); + foreach ($contributions as $key => $value) { + $contributions[$key] = $value['id']; + } + // assert the contribution count + $this->assertEquals($case['expected_count'], count($contributions)); + // assert the contribution IDs + $this->checkArrayEquals($case['expected_contribution'], $contributions); + // get and assert qill string + $qill = trim(implode($query->getOperator(), CRM_Utils_Array::value(0, $query->qill()))); + $this->assertEquals($case['expected_qill'], $qill); + } + } + } -- 2.25.1