CRM-19133 Unassigning contact subtype for a custom group causes data loss
authorfrancescbassas <francesc@babu.cat>
Tue, 26 Jul 2016 22:28:43 +0000 (00:28 +0200)
committerGitHub <noreply@github.com>
Tue, 26 Jul 2016 22:28:43 +0000 (00:28 +0200)
CRM/Contact/BAO/ContactType.php

index efc0ca1f2c241ec4530b12d5cce65fbabd3c9613..7b0dece4bab76ad272717fe952427505134ea6c2 100644 (file)
@@ -893,7 +893,7 @@ WHERE extends = %1 AND " . implode(" OR ", $subTypeClause);
    *
    * @return bool
    */
-  public static function deleteCustomRowsOfSubtype($gID, $subtypes = array()) {
+  public static function deleteCustomRowsOfSubtype($gID, $subtypes = array(), $subtypesToPreserve = array() ) {
     if (!$gID or empty($subtypes)) {
       return FALSE;
     }
@@ -902,11 +902,19 @@ WHERE extends = %1 AND " . implode(" OR ", $subTypeClause);
 
     // drop triggers CRM-13587
     CRM_Core_DAO::dropTriggers($tableName);
+    
+    foreach ($subtypesToPreserve as $subtypeToPreserve) {
+       $subtypeToPreserve = CRM_Utils_Type::escape($subtypeToPreserve, 'String');
+       $subtypesToPreserveClause[] = "( civicrm_contact.contact_sub_type NOT LIKE '%" . CRM_Core_DAO::VALUE_SEPARATOR . $subtypeToPreserve . CRM_Core_DAO::VALUE_SEPARATOR . "%')";
+    }
+    $subtypesToPreserveClause = implode(' AND ', $subtypesToPreserveClause);
+    
 
     $subtypeClause = array();
     foreach ($subtypes as $subtype) {
       $subtype = CRM_Utils_Type::escape($subtype, 'String');
-      $subtypeClause[] = "civicrm_contact.contact_sub_type LIKE '%" . CRM_Core_DAO::VALUE_SEPARATOR . $subtype . CRM_Core_DAO::VALUE_SEPARATOR . "%'";
+      $subtypeClause[] = "( civicrm_contact.contact_sub_type LIKE '%" . CRM_Core_DAO::VALUE_SEPARATOR . $subtype . CRM_Core_DAO::VALUE_SEPARATOR . "%'"
+                                           . " AND " . $subtypesToPreserveClause . ")";
     }
     $subtypeClause = implode(' OR ', $subtypeClause);