CRM-19722: Fatal Error: Unknown column 'contribution_source' in 'order clause'
authorjitendrapurohit <jitendra.purohit@webaccessglobal.com>
Wed, 7 Dec 2016 13:02:17 +0000 (18:32 +0530)
committerjitendrapurohit <jitendra.purohit@webaccessglobal.com>
Thu, 8 Dec 2016 09:55:18 +0000 (15:25 +0530)
CRM/Contribute/Form/Task.php
tests/phpunit/CRM/Contribute/Form/TaskTest.php [new file with mode: 0644]

index 9e943e35a5e3959093ce91c637bfba37cc5a87cc..df277b28545da16b3e858c3004b6cfe9a9568bee 100644 (file)
@@ -101,12 +101,12 @@ class CRM_Contribute_Form_Task extends CRM_Core_Form {
 
     $values = $form->controller->exportValues($form->get('searchFormName'));
 
-    $form->_task = $values['task'];
+    $form->_task = CRM_Utils_Array::value('task', $values);
     $contributeTasks = CRM_Contribute_Task::tasks();
-    $form->assign('taskName', $contributeTasks[$form->_task]);
+    $form->assign('taskName', CRM_Utils_Array::value($form->_task, $contributeTasks));
 
     $ids = array();
-    if ($values['radio_ts'] == 'ts_sel') {
+    if (isset($values['radio_ts']) && $values['radio_ts'] == 'ts_sel') {
       foreach ($values as $name => $value) {
         if (substr($name, 0, CRM_Core_Form::CB_PREFIX_LEN) == CRM_Core_Form::CB_PREFIX) {
           $ids[] = substr($name, CRM_Core_Form::CB_PREFIX_LEN);
@@ -115,13 +115,17 @@ class CRM_Contribute_Form_Task extends CRM_Core_Form {
     }
     else {
       $queryParams = $form->get('queryParams');
-      $sortOrder = NULL;
+      $returnProperties = array('contribution_id' => 1);
+      $sortOrder = $sortCol = NULL;
       if ($form->get(CRM_Utils_Sort::SORT_ORDER)) {
         $sortOrder = $form->get(CRM_Utils_Sort::SORT_ORDER);
+        //Include sort column in select clause.
+        $sortCol = trim(str_replace(array('`', 'asc', 'desc'), '', $sortOrder));
+        $returnProperties[$sortCol] = 1;
       }
 
       $form->_includesSoftCredits = CRM_Contribute_BAO_Query::isSoftCreditOptionEnabled($queryParams);
-      $query = new CRM_Contact_BAO_Query($queryParams, array('contribution_id'), NULL, FALSE, FALSE,
+      $query = new CRM_Contact_BAO_Query($queryParams, $returnProperties, NULL, FALSE, FALSE,
         CRM_Contact_BAO_Query::MODE_CONTRIBUTE
       );
       // @todo the function CRM_Contribute_BAO_Query::isSoftCreditOptionEnabled should handle this
@@ -158,6 +162,7 @@ class CRM_Contribute_Form_Task extends CRM_Core_Form {
     }
 
     $form->_contributionIds = $form->_componentIds = $ids;
+    $form->set('contributionIds', $form->_contributionIds);
 
     //set the context for redirection for any task actions
     $session = CRM_Core_Session::singleton();
diff --git a/tests/phpunit/CRM/Contribute/Form/TaskTest.php b/tests/phpunit/CRM/Contribute/Form/TaskTest.php
new file mode 100644 (file)
index 0000000..e58121b
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 4.7                                                |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2016                                |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Class CRM_Contribute_Form_Tasktest
+ */
+class CRM_Contribute_Form_Tasktest extends CiviUnitTestCase {
+  /**
+   * Assume empty database with just civicrm_data.
+   */
+  protected $_individualId;
+
+  /**
+   * Clean up after each test.
+   */
+  public function tearDown() {
+    $this->quickCleanUpFinancialEntities();
+    CRM_Utils_Hook::singleton()->reset();
+  }
+
+  /**
+   * CRM-19722 - Check CRM_Contribute_Form_Task::preProcessCommon()
+   * executes without any error after sorting the search result.
+   */
+  public function testPreProcessCommonAfterSorting() {
+    $fields = array(
+      'source' => 'contribution_source',
+      'status' => 'contribution_status',
+      'financialTypes' => 'financial_type',
+    );
+    $financialTypes = array('Member Dues', 'Event Fee', 'Donation');
+    $status = array('Completed', 'Partially paid', 'Pending');
+    $source = array('test source text', 'check source text', 'source text');
+    $this->_individualId = $this->individualCreate();
+
+    for ($i = 0; $i < 3; $i++) {
+      $contributionParams = array(
+        'contact_id' => $this->_individualId,
+        'total_amount' => 100,
+        'source' => $source[$i],
+        'financial_type_id' => $financialTypes[$i],
+        'contribution_status_id' => $status[$i],
+      );
+      $contribution = $this->callAPISuccess('Contribution', 'create', $contributionParams);
+      $contributionIds[] = $contribution['id'];
+    }
+
+    // Generate expected sorted array.
+    $expectedValues = array();
+    foreach ($fields as $key => $fld) {
+      $sortedFields = array_combine($$key, $contributionIds);
+      ksort($sortedFields);
+      $expectedValues[$fld] = $sortedFields;
+    }
+
+    // Assert contribIds are returned in a sorted order.
+    $form = new CRM_Contribute_Form_Task();
+    $form->controller = new CRM_Core_Controller();
+    foreach ($fields as $val) {
+      $form->set(CRM_Utils_Sort::SORT_ORDER, "`{$val}` asc");
+      CRM_Contribute_Form_Task::preProcessCommon($form);
+
+      $contribIds = array_filter(array_map('intval', $form->get('contributionIds')));
+      $expectedValues = array_map('array_values', $expectedValues);
+
+      $this->assertEquals(array_values($contribIds), $expectedValues[$val], "Failed asserting values for {$val}");
+    }
+  }
+
+}