diff --git a/CRM/Contribute/BAO/Query.php b/CRM/Contribute/BAO/Query.php index 3c51f78c2357ca658d922e1ddc88fcfc8d30c176..b70e3392b0da2aea2891ab1be6d2675a2de0df4c 100644 --- a/CRM/Contribute/BAO/Query.php +++ b/CRM/Contribute/BAO/Query.php @@ -47,8 +47,12 @@ class CRM_Contribute_BAO_Query extends CRM_Core_BAO_Query { * Associative array of contribution fields */ public static function getFields($checkPermission = TRUE) { - if (!isset(\Civi::$statics[__CLASS__]) || !isset(\Civi::$statics[__CLASS__]['fields']) || !isset(\Civi::$statics[__CLASS__]['contribution'])) { - $fields = CRM_Contribute_BAO_Contribution::exportableFields($checkPermission); + if (!isset(\Civi::$statics[__CLASS__]) || !isset(\Civi::$statics[__CLASS__]['fields']) || !isset(\Civi::$statics[__CLASS__]['fields']['contribution'])) { + // Adding fields with some care as those without unique names could clobber others. + // Refer to CRM_Contribute_Form_SearchTest for existing tests ... and to add more! + $testedRecurFields = array_fill_keys(['contribution_recur_trxn_id', 'contribution_recur_processor_id', 'contribution_recur_payment_processor_id'], 1); + $recurFields = array_intersect_key(CRM_Contribute_DAO_ContributionRecur::fields(), $testedRecurFields); + $fields = array_merge($recurFields, CRM_Contribute_BAO_Contribution::exportableFields($checkPermission)); CRM_Contribute_BAO_Contribution::appendPseudoConstantsToFields($fields); unset($fields['contribution_contact_id']); \Civi::$statics[__CLASS__]['fields']['contribution'] = $fields; @@ -382,13 +386,12 @@ class CRM_Contribute_BAO_Query extends CRM_Core_BAO_Query { case 'contribution_recur_processor_id': case 'contribution_recur_trxn_id': - $fieldName = str_replace('contribution_recur_', '', $name); - $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause("civicrm_contribution_recur.{$fieldName}", + $spec = $fields[$name]; + $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause($spec['where'], $op, $value, "String" ); - $recurFields = CRM_Contribute_DAO_ContributionRecur::fields(); - $query->_qill[$grouping][] = ts("Recurring Contribution %1 %2 '%3'", [1 => $recurFields[$fieldName]['title'], 2 => $op, 3 => $value]); - $query->_tables['civicrm_contribution_recur'] = $query->_whereTables['civicrm_contribution_recur'] = 1; + $query->_qill[$grouping][] = ts("Recurring Contribution %1 %2 '%3'", [1 => $fields[$name]['title'], 2 => $op, 3 => $value]); + $query->_tables[$spec['table_name']] = $query->_whereTables[$spec['table_name']] = 1; return; case 'contribution_recur_payment_made': diff --git a/CRM/Contribute/DAO/ContributionRecur.php b/CRM/Contribute/DAO/ContributionRecur.php index 9eedb5c3079750467909577d6861f2e20d0b5d38..525f08b968f5e2a4d53ef7f7424b84d78ca8f19e 100644 --- a/CRM/Contribute/DAO/ContributionRecur.php +++ b/CRM/Contribute/DAO/ContributionRecur.php @@ -6,7 +6,7 @@ * * Generated from xml/schema/CRM/Contribute/ContributionRecur.xml * DO NOT EDIT. Generated by CRM_Core_CodeGen - * (GenCodeChecksum:2ccc42487b9e4e5774fcfcde7db9c5ae) + * (GenCodeChecksum:9859d3b98d51f0f1df207253199186ab) */ /** @@ -262,7 +262,7 @@ class CRM_Contribute_DAO_ContributionRecur extends CRM_Core_DAO { public static function &fields() { if (!isset(Civi::$statics[__CLASS__]['fields'])) { Civi::$statics[__CLASS__]['fields'] = [ - 'id' => [ + 'contribution_recur_id' => [ 'name' => 'id', 'type' => CRM_Utils_Type::T_INT, 'title' => ts('Recurring Contribution ID'), @@ -474,7 +474,7 @@ class CRM_Contribute_DAO_ContributionRecur extends CRM_Core_DAO { 'formatType' => 'activityDate', ], ], - 'processor_id' => [ + 'contribution_recur_processor_id' => [ 'name' => 'processor_id', 'type' => CRM_Utils_Type::T_STRING, 'title' => ts('Processor ID'), @@ -502,7 +502,7 @@ class CRM_Contribute_DAO_ContributionRecur extends CRM_Core_DAO { 'localizable' => 0, 'FKClassName' => 'CRM_Financial_DAO_PaymentToken', ], - 'trxn_id' => [ + 'contribution_recur_trxn_id' => [ 'name' => 'trxn_id', 'type' => CRM_Utils_Type::T_STRING, 'title' => ts('Transaction ID'), @@ -534,7 +534,7 @@ class CRM_Contribute_DAO_ContributionRecur extends CRM_Core_DAO { 'type' => 'Text', ], ], - 'contribution_status_id' => [ + 'contribution_recur_contribution_status_id' => [ 'name' => 'contribution_status_id', 'type' => CRM_Utils_Type::T_INT, 'title' => ts('Status'), @@ -647,7 +647,7 @@ class CRM_Contribute_DAO_ContributionRecur extends CRM_Core_DAO { 'type' => 'CheckBox', ], ], - 'payment_processor_id' => [ + 'contribution_recur_payment_processor_id' => [ 'name' => 'payment_processor_id', 'type' => CRM_Utils_Type::T_INT, 'title' => ts('Payment Processor'), diff --git a/tests/phpunit/CRM/Contribute/Form/SearchTest.php b/tests/phpunit/CRM/Contribute/Form/SearchTest.php index 89d65f22eb96b61901abf7545454796e0b637174..f773d1dd5ba16c73779a8ee7e18aab0c4c599ef5 100644 --- a/tests/phpunit/CRM/Contribute/Form/SearchTest.php +++ b/tests/phpunit/CRM/Contribute/Form/SearchTest.php @@ -409,7 +409,7 @@ class CRM_Contribute_Form_SearchTest extends CiviUnitTestCase { * * @dataProvider getSearchData */ - public function testContributionRecurStatusFilter($formValues, $expectedCount, $expectedContact, $expectedQill) { + public function testContributionRecurSearchFilters($formValues, $expectedCount, $expectedContact, $expectedQill) { $this->setUpRecurringContributions(); $query = new CRM_Contact_BAO_Query(CRM_Contact_BAO_Query::convertFormValues($formValues)); @@ -553,12 +553,14 @@ class CRM_Contribute_Form_SearchTest extends CiviUnitTestCase { 'sequential' => 1, 'contact_id' => $this->ids['Contact']['contactID2'], 'frequency_interval' => 1, - 'frequency_unit' => "month", + 'frequency_unit' => 'month', 'amount' => 22, 'currency' => "CAD", 'payment_instrument_id' => 1, 'contribution_status_id' => 1, - 'financial_type_id' => "Donation", + 'financial_type_id' => 'Donation', + 'trxn_id' => 'a transaction', + 'processor_id' => 'a processor', ]); $Contribution2 = $this->callAPISuccess('Contribution', 'create', [ 'financial_type_id' => 'Donation', @@ -607,6 +609,18 @@ class CRM_Contribute_Form_SearchTest extends CiviUnitTestCase { 'expected_contact' => [], 'expected_qill' => "Recurring Contribution Status = 'Cancelled'", ], + 'trxn_id_search' => [ + 'form_value' => ['contribution_recur_trxn_id' => 'a transaction'], + 'expected_count' => 1, + 'expected_contact' => ['Mr. Terrence Smith II'], + 'expected_qill' => "Recurring Contribution Transaction ID = 'a transaction'", + ], + 'processor_id_search' => [ + 'form_value' => ['contribution_recur_processor_id' => 'a processor'], + 'expected_count' => 1, + 'expected_contact' => ['Mr. Terrence Smith II'], + 'expected_qill' => "Recurring Contribution Processor ID = 'a processor'", + ], ]; return $useCases; } diff --git a/xml/schema/Contribute/ContributionRecur.xml b/xml/schema/Contribute/ContributionRecur.xml index b492bd9453056aa70554dcb93d4278178ddee8cd..1e3a211e07b0ad1d408c971a08e112432a784c45 100644 --- a/xml/schema/Contribute/ContributionRecur.xml +++ b/xml/schema/Contribute/ContributionRecur.xml @@ -7,6 +7,7 @@ <log>true</log> <field> <name>id</name> + <uniqueName>contribution_recur_id</uniqueName> <title>Recurring Contribution ID</title> <type>int unsigned</type> <required>true</required> @@ -172,6 +173,7 @@ </field> <field> <name>processor_id</name> + <uniqueName>contribution_recur_processor_id</uniqueName> <title>Processor ID</title> <type>varchar</type> <length>255</length> @@ -197,6 +199,7 @@ </foreignKey> <field> <name>trxn_id</name> + <uniqueName>contribution_recur_trxn_id</uniqueName> <title>Transaction ID</title> <type>varchar</type> <length>255</length> @@ -231,6 +234,7 @@ </index> <field> <name>contribution_status_id</name> + <uniqueName>contribution_recur_contribution_status_id</uniqueName> <title>Status</title> <type>int unsigned</type> <default>1</default> @@ -325,6 +329,7 @@ <field> <name>payment_processor_id</name> <title>Payment Processor</title> + <uniqueName>contribution_recur_payment_processor_id</uniqueName> <type>int unsigned</type> <comment>Foreign key to civicrm_payment_processor.id</comment> <add>3.3</add>