Skip to content
Snippets Groups Projects
Commit 4fc2ce46 authored by eileen's avatar eileen
Browse files

Remove input format function from deprecated utils to the only place that calls it

parent 7c295e89
No related branches found
No related tags found
No related merge requests found
......@@ -258,8 +258,7 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
if (!empty($paramValues['pledge_payment'])) {
$paramValues['onDuplicate'] = $onDuplicate;
}
require_once 'CRM/Utils/DeprecatedUtils.php';
$formatError = _civicrm_api3_deprecated_formatted_param($paramValues, $formatted, TRUE, $onDuplicate);
$formatError = $this->deprecatedFormatParams($paramValues, $formatted, TRUE, $onDuplicate);
if ($formatError) {
array_unshift($values, $formatError['error_message']);
......@@ -588,7 +587,7 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
/**
* Format input params to suit api handling.
*
* Over time all the parts of _civicrm_api3_deprecated_formatted_param
* Over time all the parts of deprecatedFormatParams
* and all the parts of the import function on this class that relate to
* reformatting input should be moved here and tests should be added in
* CRM_Contribute_Import_Parser_ContributionTest.
......@@ -600,7 +599,7 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
$customDataType = !empty($params['contact_type']) ? $params['contact_type'] : 'Contribution';
$customFields = CRM_Core_BAO_CustomField::getFields($customDataType);
// @todo call formatDateFields & move custom data handling there.
// Also note error handling for dates is currently in _civicrm_api3_deprecated_formatted_param
// Also note error handling for dates is currently in deprecatedFormatParams
// we should use the error handling in formatDateFields.
foreach ($params as $key => $val) {
// @todo - call formatDateFields instead.
......@@ -631,4 +630,415 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
}
}
/**
* 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
*/
private function deprecatedFormatParams($params, &$values, $create = FALSE, $onDuplicate = NULL) {
require_once 'CRM/Utils/DeprecatedUtils.php';
// copy all the contribution fields as is
require_once 'api/v3/utils.php';
$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;
}
}
......@@ -40,416 +40,6 @@
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.
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment