Fix Exception api to save lower id number as contact 1
authoreileen <emcnaughton@wikimedia.org>
Thu, 6 Jun 2019 05:16:28 +0000 (17:16 +1200)
committereileen <emcnaughton@wikimedia.org>
Fri, 7 Jun 2019 08:30:40 +0000 (20:30 +1200)
This is already actioned (& tested) via ajax fn markNonDuplicates - this moves the functionality from
the ajax layer to the BAO layer & stdises it under unit tests

CRM/Contact/Page/AJAX.php
CRM/Dedupe/BAO/Exception.php
tests/phpunit/api/v3/ExceptionTest.php

index 299099a246a6fa2153e80a021d81744aae74628a..7dcedcc8cd5f3439b2dafe1fb7c63d9268de56d7 100644 (file)
@@ -908,6 +908,16 @@ LIMIT {$offset}, {$rowCount}
    * @return \CRM_Core_DAO|mixed|null
    */
   public static function markNonDuplicates($cid, $oid, $oper) {
+    if ($oper == 'dupe-nondupe') {
+      try {
+        civicrm_api3('Exception', 'create', ['contact_id1' => $cid, 'contact_id2' => $oid]);
+        return TRUE;
+      }
+      catch (CiviCRM_API3_Exception $e) {
+        return FALSE;
+      }
+    }
+
     $exception = new CRM_Dedupe_DAO_Exception();
     $exception->contact_id1 = $cid;
     $exception->contact_id2 = $oid;
@@ -918,9 +928,7 @@ LIMIT {$offset}, {$rowCount}
     }
     $exception->find(TRUE);
     $status = NULL;
-    if ($oper == 'dupe-nondupe') {
-      $status = $exception->save();
-    }
+
     if ($oper == 'nondupe-dupe') {
       $status = $exception->delete();
     }
index 7286f80e5f1162c68e71fe33347419d44816665a..05d09be645f29c891b348dcdb2c46b218b924f77 100644 (file)
@@ -46,18 +46,24 @@ class CRM_Dedupe_BAO_Exception extends CRM_Dedupe_DAO_Exception {
   public static function create($params) {
     $hook = empty($params['id']) ? 'create' : 'edit';
     CRM_Utils_Hook::pre($hook, 'Exception', CRM_Utils_Array::value('id', $params), $params);
-
+    $contact1 = CRM_Utils_Array::value('contact_id1', $params);
+    $contact2 = CRM_Utils_Array::value('contact_id2', $params);
     $dao = new CRM_Dedupe_BAO_Exception();
     $dao->copyValues($params);
-    $dao->save();
-    if ($dao->contact_id1 && $dao->contact_id2) {
+    if ($contact1 && $contact2) {
       CRM_Core_DAO::singleValueQuery("
         DELETE FROM civicrm_prevnext_cache 
         WHERE (entity_id1 = %1 AND entity_id2 = %2)
         OR (entity_id1 = %2 AND entity_id2 = %2)",
-        [1 => [$dao->contact_id1, 'Integer'], 2 => [$dao->contact_id2, 'Integer']]
+        [1 => [$contact1, 'Integer'], 2 => [$contact2, 'Integer']]
       );
+      if ($contact2 < $contact1) {
+        // These are expected to be saved lowest first.
+        $dao->contact_id1 = $contact2;
+        $dao->contact_id2 = $contact1;
+      }
     }
+    $dao->save();
 
     CRM_Utils_Hook::post($hook, 'Exception', $dao->id, $dao);
     return $dao;
index 1bd986b62c108104066923878fa1078341276a3d..977d2bdc7067e82eeae119a8a7b07da3257e7c7c 100644 (file)
@@ -67,4 +67,16 @@ class api_v3_ExceptionTest extends CiviUnitTestCase {
     $this->assertEquals(0, $dupes['count']);
   }
 
+  /**
+   * Per the ajax code there is an expectation the lower id will be contact 1 - ensure api handles this.
+   *
+   * @throws \Exception
+   */
+  public function testExceptionSavesLowerIDFirst() {
+    $contact1 = $this->individualCreate();
+    $contact2 = $this->individualCreate();
+    $this->callAPISuccess('Exception', 'create', ['contact_id1' => $contact2, 'contact_id2' => $contact1]);
+    $this->callAPISuccessGetSingle('Exception', ['contact_id1' => $contact1, 'contact_id2' => $contact2]);
+  }
+
 }