Merge pull request #14577 from mattwire/type_consolidation
[civicrm-core.git] / CRM / Export / BAO / Export.php
index 4aa7ae94d2fecd87699b85dfb6a95a2b39109999..a95df716d8f73142bfe454d3668ead18e346a5e0 100644 (file)
@@ -70,9 +70,6 @@ class CRM_Export_BAO_Export {
    * @param array $exportParams
    * @param string $queryOperator
    *
-   * @return array|null
-   *   An array can be requested from within a unit test.
-   *
    * @throws \CRM_Core_Exception
    */
   public static function exportComponents(
@@ -118,6 +115,7 @@ INSERT INTO {$componentTable} SELECT distinct gc.contact_id FROM civicrm_group_c
     }
     $processor->setComponentTable($componentTable);
     $processor->setComponentClause($componentClause);
+    $processor->setIds($ids);
 
     list($query, $queryString) = $processor->runQuery($params, $order);
 
@@ -160,7 +158,6 @@ INSERT INTO {$componentTable} SELECT distinct gc.contact_id FROM civicrm_group_c
 
     $count = -1;
 
-    $headerRows = $processor->getHeaderRows();
     $sqlColumns = $processor->getSQLColumns();
     $processor->createTempTable();
     $limitReached = FALSE;
@@ -206,23 +203,7 @@ INSERT INTO {$componentTable} SELECT distinct gc.contact_id FROM civicrm_group_c
         $processor->mergeSameAddress();
       }
 
-      // call export hook
-      $table = $processor->getTemporaryTable();
-      CRM_Utils_Hook::export($table, $headerRows, $sqlColumns, $exportMode, $componentTable, $ids);
-      if ($table !== $processor->getTemporaryTable()) {
-        CRM_Core_Error::deprecatedFunctionWarning('altering the export table in the hook is deprecated (in some flows the table itself will be)');
-        $processor->setTemporaryTable($table);
-      }
-
-      // In order to be able to write a unit test against this function we need to suppress
-      // the csv writing. In future hopefully the csv writing & the main processing will be in separate functions.
-      if (empty($exportParams['suppress_csv_for_testing'])) {
-        self::writeCSVFromTable($headerRows, $sqlColumns, $processor);
-      }
-      else {
-        // return tableName sqlColumns headerRows in test context
-        return [$processor->getTemporaryTable(), $sqlColumns, $headerRows, $processor];
-      }
+      $processor->writeCSVFromTable();
 
       // delete the export temp table and component table
       $sql = "DROP TABLE IF EXISTS " . $processor->getTemporaryTable();
@@ -373,190 +354,6 @@ VALUES $sqlValueString
     CRM_Core_DAO::executeQuery($sql);
   }
 
-  /**
-   * @param $headerRows
-   * @param $sqlColumns
-   * @param \CRM_Export_BAO_ExportProcessor $processor
-   */
-  public static function writeCSVFromTable($headerRows, $sqlColumns, $processor) {
-    $exportTempTable = $processor->getTemporaryTable();
-    $writeHeader = TRUE;
-    $offset = 0;
-    $limit = self::EXPORT_ROW_COUNT;
-
-    $query = "SELECT * FROM $exportTempTable";
-
-    while (1) {
-      $limitQuery = $query . "
-LIMIT $offset, $limit
-";
-      $dao = CRM_Core_DAO::executeQuery($limitQuery);
-
-      if ($dao->N <= 0) {
-        break;
-      }
-
-      $componentDetails = [];
-      while ($dao->fetch()) {
-        $row = [];
-
-        foreach (array_keys($processor->getSQLColumns()) as $column) {
-          $row[$column] = $dao->$column;
-        }
-        $componentDetails[] = $row;
-      }
-      CRM_Core_Report_Excel::writeCSVFile($processor->getExportFileName(),
-        $headerRows,
-        $componentDetails,
-        NULL,
-        $writeHeader
-      );
-
-      $writeHeader = FALSE;
-      $offset += $limit;
-    }
-  }
-
-  /**
-   * Build componentPayment fields.
-   *
-   * This is no longer used by export but BAO_Mapping still calls it & we
-   * should find a generic way to handle this or move this to that class.
-   *
-   * @deprecated
-   */
-  public static function componentPaymentFields() {
-    static $componentPaymentFields;
-    if (!isset($componentPaymentFields)) {
-      $componentPaymentFields = [
-        'componentPaymentField_total_amount' => ts('Total Amount'),
-        'componentPaymentField_contribution_status' => ts('Contribution Status'),
-        'componentPaymentField_received_date' => ts('Date Received'),
-        'componentPaymentField_payment_instrument' => ts('Payment Method'),
-        'componentPaymentField_transaction_id' => ts('Transaction ID'),
-      ];
-    }
-    return $componentPaymentFields;
-  }
-
-  /**
-   * Get the values of linked household contact.
-   *
-   * @param CRM_Core_DAO $relDAO
-   * @param array $value
-   * @param string $field
-   * @param array $row
-   */
-  private static function fetchRelationshipDetails($relDAO, $value, $field, &$row) {
-    $phoneTypes = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Phone', 'phone_type_id');
-    $imProviders = CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id');
-    $i18n = CRM_Core_I18n::singleton();
-    $field = $field . '_';
-
-    foreach ($value as $relationField => $relationValue) {
-      if (is_object($relDAO) && property_exists($relDAO, $relationField)) {
-        $fieldValue = $relDAO->$relationField;
-        if ($relationField == 'phone_type_id') {
-          $fieldValue = $phoneTypes[$relationValue];
-        }
-        elseif ($relationField == 'provider_id') {
-          $fieldValue = CRM_Utils_Array::value($relationValue, $imProviders);
-        }
-        // CRM-13995
-        elseif (is_object($relDAO) && in_array($relationField, [
-          'email_greeting',
-          'postal_greeting',
-          'addressee',
-        ])) {
-          //special case for greeting replacement
-          $fldValue = "{$relationField}_display";
-          $fieldValue = $relDAO->$fldValue;
-        }
-      }
-      elseif (is_object($relDAO) && $relationField == 'state_province') {
-        $fieldValue = CRM_Core_PseudoConstant::stateProvince($relDAO->state_province_id);
-      }
-      elseif (is_object($relDAO) && $relationField == 'country') {
-        $fieldValue = CRM_Core_PseudoConstant::country($relDAO->country_id);
-      }
-      else {
-        $fieldValue = '';
-      }
-      $relPrefix = $field . $relationField;
-
-      if (is_object($relDAO) && $relationField == 'id') {
-        $row[$relPrefix] = $relDAO->contact_id;
-      }
-      elseif (is_array($relationValue) && $relationField == 'location') {
-        foreach ($relationValue as $ltype => $val) {
-          // If the location name has a space in it the we need to handle that. This
-          // is kinda hacky but specifically covered in the ExportTest so later efforts to
-          // improve it should be secure in the knowled it will be caught.
-          $ltype = str_replace(' ', '_', $ltype);
-          foreach (array_keys($val) as $fld) {
-            $type = explode('-', $fld);
-            $fldValue = "{$ltype}-" . $type[0];
-            if (!empty($type[1])) {
-              $fldValue .= "-" . $type[1];
-            }
-            // CRM-3157: localise country, region (both have ‘country’ context)
-            // and state_province (‘province’ context)
-            switch (TRUE) {
-              case (!is_object($relDAO)):
-                $row[$field . '_' . $fldValue] = '';
-                break;
-
-              case in_array('country', $type):
-              case in_array('world_region', $type):
-                $row[$field . '_' . $fldValue] = $i18n->crm_translate($relDAO->$fldValue,
-                  ['context' => 'country']
-                );
-                break;
-
-              case in_array('state_province', $type):
-                $row[$field . '_' . $fldValue] = $i18n->crm_translate($relDAO->$fldValue,
-                  ['context' => 'province']
-                );
-                break;
-
-              default:
-                $row[$field . '_' . $fldValue] = $relDAO->$fldValue;
-                break;
-            }
-          }
-        }
-      }
-      elseif (isset($fieldValue) && $fieldValue != '') {
-        //check for custom data
-        if ($cfID = CRM_Core_BAO_CustomField::getKeyID($relationField)) {
-          $row[$relPrefix] = CRM_Core_BAO_CustomField::displayValue($fieldValue, $cfID);
-        }
-        else {
-          //normal relationship fields
-          // CRM-3157: localise country, region (both have ‘country’ context) and state_province (‘province’ context)
-          switch ($relationField) {
-            case 'country':
-            case 'world_region':
-              $row[$relPrefix] = $i18n->crm_translate($fieldValue, ['context' => 'country']);
-              break;
-
-            case 'state_province':
-              $row[$relPrefix] = $i18n->crm_translate($fieldValue, ['context' => 'province']);
-              break;
-
-            default:
-              $row[$relPrefix] = $fieldValue;
-              break;
-          }
-        }
-      }
-      else {
-        // if relation field is empty or null
-        $row[$relPrefix] = '';
-      }
-    }
-  }
-
   /**
    * Get the ids that we want to get related contact details for.
    *
@@ -656,10 +453,10 @@ LIMIT $offset, $limit
         $relationQuery->convertToPseudoNames($allRelContactDAO);
         $row = [];
         // @todo pass processor to fetchRelationshipDetails and set fields directly within it.
-        self::fetchRelationshipDetails($allRelContactDAO, $relationReturnProperties, $relationshipKey, $row);
+        $processor->fetchRelationshipDetails($allRelContactDAO, $relationReturnProperties, $relationshipKey, $row);
         foreach (array_keys($relationReturnProperties) as $property) {
           if ($property === 'location') {
-            // @todo - simplify location in self::fetchRelationshipDetails - remove handling here. Or just call
+            // @todo - simplify location in fetchRelationshipDetails - remove handling here. Or just call
             // $processor->setRelationshipValue from fetchRelationshipDetails
             foreach ($relationReturnProperties['location'] as $locationName => $locationValues) {
               foreach (array_keys($locationValues) as $locationValue) {