Merge pull request #15729 from civicrm/5.19
[civicrm-core.git] / CRM / Utils / DeprecatedUtils.php
index 5d8e0e1bec20e1108a278f0c5a8a2c94ed9556c0..ed07a6b2aa61e717ac5062ac9045f5db1e34366f 100644 (file)
 
 require_once 'api/v3/utils.php';
 
-/**
- * take the input parameter list as specified in the data model and
- * convert it into the same format that we use in QF and BAO object
- *
- * @param array $params
- *   Associative array of property name/value.
- *                             pairs to insert in new contact.
- * @param array $values
- *   The reformatted properties that we can use internally.
- *                            '
- *
- * @param bool $create
- * @param null $onDuplicate
- *
- * @return array|CRM_Error
- */
-function _civicrm_api3_deprecated_formatted_param($params, &$values, $create = FALSE, $onDuplicate = NULL) {
-  // copy all the contribution fields as is
-
-  $fields = CRM_Contribute_DAO_Contribution::fields();
-
-  _civicrm_api3_store_values($fields, $params, $values);
-
-  require_once 'CRM/Core/OptionGroup.php';
-  $customFields = CRM_Core_BAO_CustomField::getFields('Contribution', FALSE, FALSE, NULL, NULL, FALSE, FALSE, FALSE);
-
-  foreach ($params as $key => $value) {
-    // ignore empty values or empty arrays etc
-    if (CRM_Utils_System::isNull($value)) {
-      continue;
-    }
-
-    // Handling Custom Data
-    if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($key)) {
-      $values[$key] = $value;
-      $type = $customFields[$customFieldID]['html_type'];
-      if ($type == 'CheckBox' || $type == 'Multi-Select') {
-        $mulValues = explode(',', $value);
-        $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, TRUE);
-        $values[$key] = [];
-        foreach ($mulValues as $v1) {
-          foreach ($customOption as $customValueID => $customLabel) {
-            $customValue = $customLabel['value'];
-            if ((strtolower($customLabel['label']) == strtolower(trim($v1))) ||
-              (strtolower($customValue) == strtolower(trim($v1)))
-            ) {
-              if ($type == 'CheckBox') {
-                $values[$key][$customValue] = 1;
-              }
-              else {
-                $values[$key][] = $customValue;
-              }
-            }
-          }
-        }
-      }
-      elseif ($type == 'Select' || $type == 'Radio' ||
-        ($type == 'Autocomplete-Select' &&
-          $customFields[$customFieldID]['data_type'] == 'String'
-        )
-      ) {
-        $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, TRUE);
-        foreach ($customOption as $customFldID => $customValue) {
-          $val = CRM_Utils_Array::value('value', $customValue);
-          $label = CRM_Utils_Array::value('label', $customValue);
-          $label = strtolower($label);
-          $value = strtolower(trim($value));
-          if (($value == $label) || ($value == strtolower($val))) {
-            $values[$key] = $val;
-          }
-        }
-      }
-    }
-
-    switch ($key) {
-      case 'contribution_contact_id':
-        if (!CRM_Utils_Rule::integer($value)) {
-          return civicrm_api3_create_error("contact_id not valid: $value");
-        }
-        $dao = new CRM_Core_DAO();
-        $qParams = [];
-        $svq = $dao->singleValueQuery("SELECT is_deleted FROM civicrm_contact WHERE id = $value",
-          $qParams
-        );
-        if (!isset($svq)) {
-          return civicrm_api3_create_error("Invalid Contact ID: There is no contact record with contact_id = $value.");
-        }
-        elseif ($svq == 1) {
-          return civicrm_api3_create_error("Invalid Contact ID: contact_id $value is a soft-deleted contact.");
-        }
-
-        $values['contact_id'] = $values['contribution_contact_id'];
-        unset($values['contribution_contact_id']);
-        break;
-
-      case 'contact_type':
-        // import contribution record according to select contact type
-        require_once 'CRM/Contact/DAO/Contact.php';
-        $contactType = new CRM_Contact_DAO_Contact();
-        $contactId = CRM_Utils_Array::value('contribution_contact_id', $params);
-        $externalId = CRM_Utils_Array::value('external_identifier', $params);
-        $email = CRM_Utils_Array::value('email', $params);
-        //when insert mode check contact id or external identifier
-        if ($contactId || $externalId) {
-          $contactType->id = $contactId;
-          $contactType->external_identifier = $externalId;
-          if ($contactType->find(TRUE)) {
-            if ($params['contact_type'] != $contactType->contact_type) {
-              return civicrm_api3_create_error("Contact Type is wrong: $contactType->contact_type");
-            }
-          }
-        }
-        elseif ($email) {
-          if (!CRM_Utils_Rule::email($email)) {
-            return civicrm_api3_create_error("Invalid email address $email provided. Row was skipped");
-          }
-
-          // get the contact id from duplicate contact rule, if more than one contact is returned
-          // we should return error, since current interface allows only one-one mapping
-          $emailParams = ['email' => $email, 'contact_type' => $params['contact_type']];
-          $checkDedupe = _civicrm_api3_deprecated_duplicate_formatted_contact($emailParams);
-          if (!$checkDedupe['is_error']) {
-            return civicrm_api3_create_error("Invalid email address(doesn't exist) $email. Row was skipped");
-          }
-          else {
-            $matchingContactIds = explode(',', $checkDedupe['error_message']['params'][0]);
-            if (count($matchingContactIds) > 1) {
-              return civicrm_api3_create_error("Invalid email address(duplicate) $email. Row was skipped");
-            }
-            elseif (count($matchingContactIds) == 1) {
-              $params['contribution_contact_id'] = $matchingContactIds[0];
-            }
-          }
-        }
-        elseif (!empty($params['contribution_id']) || !empty($params['trxn_id']) || !empty($params['invoice_id'])) {
-          // when update mode check contribution id or trxn id or
-          // invoice id
-          $contactId = new CRM_Contribute_DAO_Contribution();
-          if (!empty($params['contribution_id'])) {
-            $contactId->id = $params['contribution_id'];
-          }
-          elseif (!empty($params['trxn_id'])) {
-            $contactId->trxn_id = $params['trxn_id'];
-          }
-          elseif (!empty($params['invoice_id'])) {
-            $contactId->invoice_id = $params['invoice_id'];
-          }
-          if ($contactId->find(TRUE)) {
-            $contactType->id = $contactId->contact_id;
-            if ($contactType->find(TRUE)) {
-              if ($params['contact_type'] != $contactType->contact_type) {
-                return civicrm_api3_create_error("Contact Type is wrong: $contactType->contact_type");
-              }
-            }
-          }
-        }
-        else {
-          if ($onDuplicate == CRM_Import_Parser::DUPLICATE_UPDATE) {
-            return civicrm_api3_create_error("Empty Contribution and Invoice and Transaction ID. Row was skipped.");
-          }
-        }
-        break;
-
-      case 'receive_date':
-      case 'cancel_date':
-      case 'receipt_date':
-      case 'thankyou_date':
-        if (!CRM_Utils_Rule::dateTime($value)) {
-          return civicrm_api3_create_error("$key not a valid date: $value");
-        }
-        break;
-
-      case 'non_deductible_amount':
-      case 'total_amount':
-      case 'fee_amount':
-      case 'net_amount':
-        if (!CRM_Utils_Rule::money($value)) {
-          return civicrm_api3_create_error("$key not a valid amount: $value");
-        }
-        break;
-
-      case 'currency':
-        if (!CRM_Utils_Rule::currencyCode($value)) {
-          return civicrm_api3_create_error("currency not a valid code: $value");
-        }
-        break;
-
-      case 'financial_type':
-        require_once 'CRM/Contribute/PseudoConstant.php';
-        $contriTypes = CRM_Contribute_PseudoConstant::financialType();
-        foreach ($contriTypes as $val => $type) {
-          if (strtolower($value) == strtolower($type)) {
-            $values['financial_type_id'] = $val;
-            break;
-          }
-        }
-        if (empty($values['financial_type_id'])) {
-          return civicrm_api3_create_error("Financial Type is not valid: $value");
-        }
-        break;
-
-      case 'payment_instrument':
-        require_once 'CRM/Core/PseudoConstant.php';
-        $values['payment_instrument_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'payment_instrument_id', $value);
-        if (empty($values['payment_instrument_id'])) {
-          return civicrm_api3_create_error("Payment Instrument is not valid: $value");
-        }
-        break;
-
-      case 'contribution_status_id':
-        require_once 'CRM/Core/PseudoConstant.php';
-        if (!$values['contribution_status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $value)) {
-          return civicrm_api3_create_error("Contribution Status is not valid: $value");
-        }
-        break;
-
-      case 'soft_credit':
-        // import contribution record according to select contact type
-        // validate contact id and external identifier.
-        $value[$key] = $mismatchContactType = $softCreditContactIds = '';
-        if (isset($params[$key]) && is_array($params[$key])) {
-          foreach ($params[$key] as $softKey => $softParam) {
-            $contactId = CRM_Utils_Array::value('contact_id', $softParam);
-            $externalId = CRM_Utils_Array::value('external_identifier', $softParam);
-            $email = CRM_Utils_Array::value('email', $softParam);
-            if ($contactId || $externalId) {
-              require_once 'CRM/Contact/DAO/Contact.php';
-              $contact = new CRM_Contact_DAO_Contact();
-              $contact->id = $contactId;
-              $contact->external_identifier = $externalId;
-              $errorMsg = NULL;
-              if (!$contact->find(TRUE)) {
-                $field = $contactId ? ts('Contact ID') : ts('External ID');
-                $errorMsg = ts("Soft Credit %1 - %2 doesn't exist. Row was skipped.",
-                  [1 => $field, 2 => $contactId ? $contactId : $externalId]);
-              }
-
-              if ($errorMsg) {
-                return civicrm_api3_create_error($errorMsg);
-              }
-
-              // finally get soft credit contact id.
-              $values[$key][$softKey] = $softParam;
-              $values[$key][$softKey]['contact_id'] = $contact->id;
-            }
-            elseif ($email) {
-              if (!CRM_Utils_Rule::email($email)) {
-                return civicrm_api3_create_error("Invalid email address $email provided for Soft Credit. Row was skipped");
-              }
-
-              // get the contact id from duplicate contact rule, if more than one contact is returned
-              // we should return error, since current interface allows only one-one mapping
-              $emailParams = ['email' => $email, 'contact_type' => $params['contact_type']];
-              $checkDedupe = _civicrm_api3_deprecated_duplicate_formatted_contact($emailParams);
-              if (!$checkDedupe['is_error']) {
-                return civicrm_api3_create_error("Invalid email address(doesn't exist) $email for Soft Credit. Row was skipped");
-              }
-              else {
-                $matchingContactIds = explode(',', $checkDedupe['error_message']['params'][0]);
-                if (count($matchingContactIds) > 1) {
-                  return civicrm_api3_create_error("Invalid email address(duplicate) $email for Soft Credit. Row was skipped");
-                }
-                elseif (count($matchingContactIds) == 1) {
-                  $contactId = $matchingContactIds[0];
-                  unset($softParam['email']);
-                  $values[$key][$softKey] = $softParam + ['contact_id' => $contactId];
-                }
-              }
-            }
-          }
-        }
-        break;
-
-      case 'pledge_payment':
-      case 'pledge_id':
-
-        // giving respect to pledge_payment flag.
-        if (empty($params['pledge_payment'])) {
-          continue;
-        }
-
-        // get total amount of from import fields
-        $totalAmount = CRM_Utils_Array::value('total_amount', $params);
-
-        $onDuplicate = CRM_Utils_Array::value('onDuplicate', $params);
-
-        // we need to get contact id $contributionContactID to
-        // retrieve pledge details as well as to validate pledge ID
-
-        // first need to check for update mode
-        if ($onDuplicate == CRM_Import_Parser::DUPLICATE_UPDATE &&
-          ($params['contribution_id'] || $params['trxn_id'] || $params['invoice_id'])
-        ) {
-          $contribution = new CRM_Contribute_DAO_Contribution();
-          if ($params['contribution_id']) {
-            $contribution->id = $params['contribution_id'];
-          }
-          elseif ($params['trxn_id']) {
-            $contribution->trxn_id = $params['trxn_id'];
-          }
-          elseif ($params['invoice_id']) {
-            $contribution->invoice_id = $params['invoice_id'];
-          }
-
-          if ($contribution->find(TRUE)) {
-            $contributionContactID = $contribution->contact_id;
-            if (!$totalAmount) {
-              $totalAmount = $contribution->total_amount;
-            }
-          }
-          else {
-            return civicrm_api3_create_error('No match found for specified contact in pledge payment data. Row was skipped.');
-          }
-        }
-        else {
-          // first get the contact id for given contribution record.
-          if (!empty($params['contribution_contact_id'])) {
-            $contributionContactID = $params['contribution_contact_id'];
-          }
-          elseif (!empty($params['external_identifier'])) {
-            require_once 'CRM/Contact/DAO/Contact.php';
-            $contact = new CRM_Contact_DAO_Contact();
-            $contact->external_identifier = $params['external_identifier'];
-            if ($contact->find(TRUE)) {
-              $contributionContactID = $params['contribution_contact_id'] = $values['contribution_contact_id'] = $contact->id;
-            }
-            else {
-              return civicrm_api3_create_error('No match found for specified contact in pledge payment data. Row was skipped.');
-            }
-          }
-          else {
-            // we need to get contribution contact using de dupe
-            $error = _civicrm_api3_deprecated_check_contact_dedupe($params);
-
-            if (isset($error['error_message']['params'][0])) {
-              $matchedIDs = explode(',', $error['error_message']['params'][0]);
-
-              // check if only one contact is found
-              if (count($matchedIDs) > 1) {
-                return civicrm_api3_create_error($error['error_message']['message']);
-              }
-              else {
-                $contributionContactID = $params['contribution_contact_id'] = $values['contribution_contact_id'] = $matchedIDs[0];
-              }
-            }
-            else {
-              return civicrm_api3_create_error('No match found for specified contact in contribution data. Row was skipped.');
-            }
-          }
-        }
-
-        if (!empty($params['pledge_id'])) {
-          if (CRM_Core_DAO::getFieldValue('CRM_Pledge_DAO_Pledge', $params['pledge_id'], 'contact_id') != $contributionContactID) {
-            return civicrm_api3_create_error('Invalid Pledge ID provided. Contribution row was skipped.');
-          }
-          $values['pledge_id'] = $params['pledge_id'];
-        }
-        else {
-          // check if there are any pledge related to this contact, with payments pending or in progress
-          require_once 'CRM/Pledge/BAO/Pledge.php';
-          $pledgeDetails = CRM_Pledge_BAO_Pledge::getContactPledges($contributionContactID);
-
-          if (empty($pledgeDetails)) {
-            return civicrm_api3_create_error('No open pledges found for this contact. Contribution row was skipped.');
-          }
-          elseif (count($pledgeDetails) > 1) {
-            return civicrm_api3_create_error('This contact has more than one open pledge. Unable to determine which pledge to apply the contribution to. Contribution row was skipped.');
-          }
-
-          // this mean we have only one pending / in progress pledge
-          $values['pledge_id'] = $pledgeDetails[0];
-        }
-
-        // we need to check if oldest payment amount equal to contribution amount
-        require_once 'CRM/Pledge/BAO/PledgePayment.php';
-        $pledgePaymentDetails = CRM_Pledge_BAO_PledgePayment::getOldestPledgePayment($values['pledge_id']);
-
-        if ($pledgePaymentDetails['amount'] == $totalAmount) {
-          $values['pledge_payment_id'] = $pledgePaymentDetails['id'];
-        }
-        else {
-          return civicrm_api3_create_error('Contribution and Pledge Payment amount mismatch for this record. Contribution row was skipped.');
-        }
-        break;
-
-      default:
-        break;
-    }
-  }
-
-  if (array_key_exists('note', $params)) {
-    $values['note'] = $params['note'];
-  }
-
-  if ($create) {
-    // CRM_Contribute_BAO_Contribution::add() handles contribution_source
-    // So, if $values contains contribution_source, convert it to source
-    $changes = ['contribution_source' => 'source'];
-
-    foreach ($changes as $orgVal => $changeVal) {
-      if (isset($values[$orgVal])) {
-        $values[$changeVal] = $values[$orgVal];
-        unset($values[$orgVal]);
-      }
-    }
-  }
-
-  return NULL;
-}
-
 /**
  * Check duplicate contacts based on de-dupe parameters.
  *
@@ -1289,10 +879,15 @@ function _civicrm_api3_deprecated_activity_buildmailparams($result, $activityTyp
   $params['activity_date_time'] = $result['date'];
   $params['details'] = $result['body'];
 
-  for ($i = 1; $i <= 5; $i++) {
+  $numAttachments = Civi::settings()->get('max_attachments_backend') ?? CRM_Core_BAO_File::DEFAULT_MAX_ATTACHMENTS_BACKEND;
+  for ($i = 1; $i <= $numAttachments; $i++) {
     if (isset($result["attachFile_$i"])) {
       $params["attachFile_$i"] = $result["attachFile_$i"];
     }
+    else {
+      // No point looping 100 times if there's only one attachment
+      break;
+    }
   }
 
   return $params;