Skip to content

Commit

Permalink
[REF] Cleanup on import rows error
Browse files Browse the repository at this point in the history
Trying (and not yet succeeding) to replicat https://lab.civicrm.org/dev/core/-/issues/2566
I was able to step through & eliminate one more place where we call dao->query() instead
of CRM_Core_DAO::executeQuery
  • Loading branch information
eileenmcnaughton committed Apr 30, 2021
1 parent 03e4bc8 commit 223eda0
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 61 deletions.
48 changes: 28 additions & 20 deletions CRM/Contact/Import/Parser.php
Original file line number Diff line number Diff line change
Expand Up @@ -691,30 +691,38 @@ public static function exportCSV($fileName, $header, $data) {
/**
* Update the record with PK $id in the import database table.
*
* @deprecated - call setImportStatus directly as the parameters are simpler,
*
* @param int $id
* @param array $params
*/
public function updateImportRecord($id, &$params) {
$statusFieldName = $this->_statusFieldName;
$primaryKeyName = $this->_primaryKeyName;

if ($statusFieldName && $primaryKeyName) {
$dao = new CRM_Core_DAO();
$db = $dao->getDatabaseConnection();

$query = "UPDATE $this->_tableName
SET $statusFieldName = ?,
${statusFieldName}Msg = ?
WHERE $primaryKeyName = ?";
$args = [
$params[$statusFieldName],
CRM_Utils_Array::value("${statusFieldName}Msg", $params),
$id,
];

//print "Running query: $query<br/>With arguments: ".$params[$statusFieldName].", ".$params["${statusFieldName}Msg"].", $id<br/>";
public function updateImportRecord($id, $params): void {
$this->setImportStatus((int) $id, $params[$this->_statusFieldName] ?? '', $params["{$this->_statusFieldName}Msg"] ?? '');
}

$db->query($query, $args);
/**
* Set the import status for the given record.
*
* If this is a sql import then the sql table will be used and the update
* will not happen as the relevant fields don't exist in the table - hence
* the checks that statusField & primary key are set.
*
* @param int $id
* @param string $status
* @param string $message
*/
public function setImportStatus(int $id, string $status, string $message): void {
if ($this->_statusFieldName && $this->_primaryKeyName) {
CRM_Core_DAO::executeQuery("
UPDATE $this->_tableName
SET $this->_statusFieldName = %1,
{$this->_statusFieldName}Msg = %2
WHERE $this->_primaryKeyName = %3
", [
1 => [$status, 'String'],
2 => [$message, 'String'],
3 => [$id, 'Integer'],
]);
}
}

Expand Down
51 changes: 10 additions & 41 deletions CRM/Contact/Import/Parser/Contact.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,10 +242,10 @@ public function preview(&$values) {
* @return bool
* the result of this processing
*/
public function summary(&$values) {
public function summary(&$values): int {
$erroneousField = NULL;
$response = $this->setActiveFieldValues($values, $erroneousField);

$this->setActiveFieldValues($values, $erroneousField);
$rowNumber = (int) ($values[count($values) - 1]);
$errorMessage = NULL;
$errorRequired = FALSE;
switch ($this->_contactType) {
Expand Down Expand Up @@ -280,12 +280,10 @@ public function summary(&$values) {
break;
}

$statusFieldName = $this->_statusFieldName;

if ($this->_emailIndex >= 0) {
/* If we don't have the required fields, bail */

if ($this->_contactType == 'Individual' && !$this->_updateWithId) {
if ($this->_contactType === 'Individual' && !$this->_updateWithId) {
if ($errorRequired && empty($values[$this->_emailIndex])) {
if ($errorMessage) {
$errorMessage .= ' ' . ts('OR') . ' ' . ts('Email Address');
Expand All @@ -294,11 +292,7 @@ public function summary(&$values) {
$errorMessage = ts('Missing required field:') . ' ' . ts('Email Address');
}
array_unshift($values, $errorMessage);
$importRecordParams = [
$statusFieldName => 'ERROR',
"${statusFieldName}Msg" => $errorMessage,
];
$this->updateImportRecord($values[count($values) - 1], $importRecordParams);
$this->setImportStatus($rowNumber, 'ERROR', $errorMessage);

return CRM_Import_Parser::ERROR;
}
Expand All @@ -311,11 +305,7 @@ public function summary(&$values) {
if (!CRM_Utils_Rule::email($email)) {
$errorMessage = ts('Invalid Email address');
array_unshift($values, $errorMessage);
$importRecordParams = [
$statusFieldName => 'ERROR',
"${statusFieldName}Msg" => $errorMessage,
];
$this->updateImportRecord($values[count($values) - 1], $importRecordParams);
$this->setImportStatus($rowNumber, 'ERROR', $errorMessage);

return CRM_Import_Parser::ERROR;
}
Expand All @@ -332,11 +322,7 @@ public function summary(&$values) {
$errorMessage = ts('Missing required field:') . ' ' . ts('Email Address');
}
array_unshift($values, $errorMessage);
$importRecordParams = [
$statusFieldName => 'ERROR',
"${statusFieldName}Msg" => $errorMessage,
];
$this->updateImportRecord($values[count($values) - 1], $importRecordParams);
$this->setImportStatus($rowNumber, 'ERROR', $errorMessage);

return CRM_Import_Parser::ERROR;
}
Expand All @@ -349,11 +335,7 @@ public function summary(&$values) {
if ($externalDupe = CRM_Utils_Array::value($externalID, $this->_allExternalIdentifiers)) {
$errorMessage = ts('External ID conflicts with record %1', [1 => $externalDupe]);
array_unshift($values, $errorMessage);
$importRecordParams = [
$statusFieldName => 'ERROR',
"${statusFieldName}Msg" => $errorMessage,
];
$this->updateImportRecord($values[count($values) - 1], $importRecordParams);
$this->setImportStatus($rowNumber, 'ERROR', $errorMessage);
return CRM_Import_Parser::ERROR;
}
//otherwise, count it and move on
Expand Down Expand Up @@ -381,24 +363,12 @@ public function summary(&$values) {
$this->isErrorInCoreData($params, $errorMessage);
if ($errorMessage) {
$tempMsg = "Invalid value for field(s) : $errorMessage";
// put the error message in the import record in the DB
$importRecordParams = [
$statusFieldName => 'ERROR',
"${statusFieldName}Msg" => $tempMsg,
];
$this->updateImportRecord($values[count($values) - 1], $importRecordParams);
$this->setImportStatus($rowNumber, 'ERROR', $tempMsg);
array_unshift($values, $tempMsg);
$errorMessage = NULL;
return CRM_Import_Parser::ERROR;
}

//if user correcting errors by walking back
//need to reset status ERROR msg to null
//now currently we are having valid data.
$importRecordParams = [
$statusFieldName => 'NEW',
];
$this->updateImportRecord($values[count($values) - 1], $importRecordParams);
$this->setImportStatus($rowNumber, 'NEW', '');

return CRM_Import_Parser::VALID;
}
Expand Down Expand Up @@ -431,7 +401,6 @@ public function getAllFields() {
* @throws \API_Exception
*/
public function import($onDuplicate, &$values, $doGeocodeAddress = FALSE) {
$config = CRM_Core_Config::singleton();
$this->_unparsedStreetAddressContacts = [];
if (!$doGeocodeAddress) {
// CRM-5854, reset the geocode method to null to prevent geocoding
Expand Down

0 comments on commit 223eda0

Please sign in to comment.