Fix import to retry invalid
authorEileen McNaughton <emcnaughton@wikimedia.org>
Wed, 22 Feb 2023 00:24:52 +0000 (13:24 +1300)
committerEileen McNaughton <emcnaughton@wikimedia.org>
Wed, 22 Feb 2023 00:24:52 +0000 (13:24 +1300)
CRM/Import/Parser.php
ext/civiimport/Civi/Api4/Import/Import.php
ext/civiimport/Civi/Api4/Import/ImportProcessTrait.php

index 9b909411f064b31d216358368865bdaf1e45f85f..6ad0e41dddf9b47d3822b65ef895b327c2e4580d 100644 (file)
@@ -2548,16 +2548,20 @@ abstract class CRM_Import_Parser implements UserJobInterface {
 
   /**
    * @param array|null $row
+   *
+   * @return bool
    */
-  public function validateRow(?array $row): void {
+  public function validateRow(?array $row): bool {
     try {
       $rowNumber = $row['_id'];
       $values = array_values($row);
       $this->validateValues($values);
       $this->setImportStatus($rowNumber, 'VALID', '');
+      return TRUE;
     }
     catch (CRM_Core_Exception $e) {
       $this->setImportStatus($rowNumber, 'ERROR', $e->getMessage());
+      return FALSE;
     }
   }
 
index 60099303bd8076cb5535d307a437feb0b711cf74..4a152d255faabbec95f51a6990d4d8d27b54b12d 100644 (file)
@@ -25,10 +25,12 @@ class Import extends DAOGetAction {
   public function _run(Result $result): void {
     $userJobID = (int) str_replace('Import_', '', $this->_entityName);
     $where = $this->where;
-    $this->addWhere('_status', 'IN', ['new', 'valid']);
     $this->getImportRows($result);
     $parser = $this->getParser($userJobID);
     foreach ($result as $row) {
+      if (!in_array($row['_status'], ['new', 'valid'], TRUE) && !$parser->validateRow($row)) {
+        continue;
+      }
       $parser->import(array_values($row));
     }
     $parser->doPostImportActions();
index c60a4d5b4e2125f54f028facc919d09a7f22fd5b..71f91e7ffd167eeb5133a5650523eba2e2350527 100644 (file)
@@ -66,6 +66,7 @@ trait ImportProcessTrait {
       ->indexBy('name'));
     $importFields[] = '_id';
     $importFields[] = '_entity_id';
+    $importFields[] = '_status';
     $this->setSelect($importFields);
     parent::_run($result);
     foreach ($result as &$row) {