CRM-16055 towards using sensible multiple create function
authorEileen McNaughton <eileen@fuzion.co.nz>
Fri, 6 Mar 2015 21:26:17 +0000 (08:26 +1100)
committerEileen McNaughton <eileen@fuzion.co.nz>
Mon, 16 Mar 2015 12:35:23 +0000 (01:35 +1300)
CRM/Contact/BAO/Contact/Utils.php
CRM/Contact/BAO/Relationship.php
CRM/Contact/Form/Relationship.php
CRM/Contact/Import/Parser/Contact.php
CRM/Contact/Page/AJAX.php
CRM/Contribute/Form/Contribution/Confirm.php
CRM/Core/BAO/Address.php
tests/phpunit/CRM/Contact/BAO/ContactType/RelationshipTest.php

index 29183ea58f8adabaed8b4455ff69fa70ca9ad72e..6ca74ba3a550ca5d8827a1cb7e957986d74cb97e 100644 (file)
@@ -330,7 +330,7 @@ UNION
         'contact_check' => array($organization => TRUE),
       );
       list($valid, $invalid, $duplicate, $saved, $relationshipIds)
-        = CRM_Contact_BAO_Relationship::createMultiple($relationshipParams, $cid);
+        = CRM_Contact_BAO_Relationship::legacyCreateMultiple($relationshipParams, $cid);
 
       // In case we change employer, clean previous employer related records.
       if (!$previousEmployerID && !$newContact) {
index 721cdcde465bdbf75ce3b46f3f44db54dfcfe54b..262be2431fe3aca3a81db3527b889594621ebd59 100644 (file)
@@ -43,9 +43,9 @@ class CRM_Contact_BAO_Relationship extends CRM_Contact_DAO_Relationship {
 
   /**
    * Create function. (Use the API instead)
-   * Note that the previous create function has been renamed 'createMultiple'
+   * Note that the previous create function has been renamed 'legacyCreateMultiple'
    * and this is new in 4.6
-   * All existing calls have been changed to createMultiple except the api call - however, it is recommended
+   * All existing calls have been changed to legacyCreateMultiple except the api call - however, it is recommended
    * that you call that as the end to end testing here is based on the api & refactoring may still be done
    * @param array $params
    * @return \CRM_Contact_BAO_Relationship
@@ -77,6 +77,47 @@ class CRM_Contact_BAO_Relationship extends CRM_Contact_DAO_Relationship {
     return $relationship;
   }
 
+  /**
+   * Create multiple relationships
+   *
+   * @param $params
+   * @param $primaryContactLetter
+   *
+   * @return array
+   * @throws \CRM_Core_Exception
+   */
+  public static function createMultiple($params, $primaryContactLetter) {
+    $secondaryContactLetter = ($primaryContactLetter == 'a') ? 'b' : 'a';
+    $secondaryContactIDs = $params['contact_id_' . $secondaryContactLetter];
+    $valid = $invalid = $duplicate = $saved = 0;
+    $relationshipIds = array();
+    foreach ($secondaryContactIDs as $secondaryContactID) {
+      try {
+        $params['contact_id_' . $secondaryContactLetter] = $secondaryContactID;
+        $relationship = civicrm_api3('relationship', 'create', $params);
+        $relationshipIds[] = $relationship['id'];
+        $valid ++;
+      }
+      catch (CiviCRM_API3_Exception $e) {
+        switch ($e->getMessage()) {
+          case 'Duplicate Relationship' :
+            $duplicate ++;
+            break;
+
+          case 'Invalid Relationship' :
+            $invalid ++;
+            break;
+
+          default:
+            throw new CRM_Core_Exception('unknown relationship create error ' . $e->getMessage());
+        }
+      }
+    }
+
+    return array($valid, $invalid, $duplicate, $saved, $relationshipIds);
+
+  }
+
   /**
    * Takes an associative array and creates a relationship object.
    * @deprecated For single creates use the api instead (it's tested).
@@ -92,7 +133,7 @@ class CRM_Contact_BAO_Relationship extends CRM_Contact_DAO_Relationship {
    *
    * @return CRM_Contact_BAO_Relationship
    */
-  public static function createMultiple(&$params, $ids = array()) {
+  public static function legacyCreateMultiple(&$params, $ids = array()) {
     $valid = $invalid = $duplicate = $saved = 0;
     $relationships = $relationshipIds = array();
     $relationshipId = CRM_Utils_Array::value('relationship', $ids, CRM_Utils_Array::value('id', $params));
@@ -780,7 +821,7 @@ WHERE  relationship_type_id = " . CRM_Utils_Type::escape($type, 'Integer');
      * supports date arrays BAO has increasingly standardised to ISO format
      * so I believe this function should support ISO rather than make API
      * format it - however, need to support array format for now to avoid breakage
-     * @ time of writing this function is called from Relationship::createMultiple (twice)
+     * @ time of writing this function is called from Relationship::legacyCreateMultiple (twice)
      * CRM_BAO_Contact_Utils::clearCurrentEmployer (seemingly without dates)
      * CRM_Contact_Form_Task_AddToOrganization::postProcess &
      * CRM_Contact_Form_Task_AddToHousehold::postProcess
index 27bb2b039b702e292811b311d611b1792ed419b4..751e5c396c31b675327c1e53a6c95ced7767513e 100644 (file)
@@ -422,21 +422,13 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
     }
     $params['contact_id_' .  $relationshipTypeParts[1]] = $this->_contactId;
 
-
-    $ids = array('contact' => $this->_contactId);
-
-    $relationshipTypeId = str_replace(array('_', 'a', 'b'), '', $params['relationship_type_id']);
-
-    // CRM-14612 - Don't use adv-checkbox as it interferes with the form js
-    $params['is_permission_a_b'] = CRM_Utils_Array::value('is_permission_a_b', $params, 0);
-    $params['is_permission_b_a'] = CRM_Utils_Array::value('is_permission_b_a', $params, 0);
-
     // Update mode (always single)
     if ($this->_action & CRM_Core_Action::UPDATE) {
       $ids['relationship'] = $this->_relationshipId;
       $relation = CRM_Contact_BAO_Relationship::getRelationshipByID($this->_relationshipId);
       $ids['contactTarget'] = ($relation->contact_id_a == $this->_contactId) ? $relation->contact_id_b : $relation->contact_id_a;
 
+      // @todo this belongs in the BAO.
       if ($this->_isCurrentEmployer) {
         // if relationship type changes, relationship is disabled, or "current employer" is unchecked,
         // clear the current employer. CRM-3235.
@@ -450,16 +442,10 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
     }
     // Create mode (could be 1 or more relationships)
     else {
-      // Fill up this weird param with contact ids like the weird relationship bao expects
-      $params['contact_check'] = array_fill_keys(explode(',', $params['related_contact_id']), 1);
-      if (!$this->_rtype) {
-        list(, $this->_rtype) = explode('_', $params['relationship_type_id'], 2);
-      }
+      $params['contact_id_' .  $relationshipTypeParts[2]] =  explode(',', $params['related_contact_id']);
     }
-    $params['start_date'] = CRM_Utils_Date::processDate($params['start_date'], NULL, TRUE);
-    $params['end_date'] = CRM_Utils_Date::processDate($params['end_date'], NULL, TRUE);
 
-    // Process custom data
+    // @todo create multiple probably does this - test!
     $customFields = CRM_Core_BAO_CustomField::getFields('Relationship', FALSE, FALSE, $params['relationship_type_id']);
     $params['custom'] = CRM_Core_BAO_CustomField::postProcess(
       $params,
@@ -469,43 +455,20 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
     );
 
     // Save relationships
-    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple($params, $ids);
+    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple
+    ($params, $relationshipTypeParts[1]);
+    $this->setMessage($valid, $invalid, $duplicate, $saved);
 
     // if this is called from case view,
     //create an activity for case role removal.CRM-4480
+    // @todo this belongs in the BAO.
     if ($this->_caseId) {
       CRM_Case_BAO_Case::createCaseRoleActivity($this->_caseId, $relationshipIds, $params['contact_check'], $this->_contactId);
     }
 
-    if ($valid) {
-      CRM_Core_Session::setStatus(ts('Relationship created.', array(
-            'count' => $valid,
-            'plural' => '%count relationships created.',
-          )), ts('Saved'), 'success');
-    }
-    if ($invalid) {
-      CRM_Core_Session::setStatus(ts('%count relationship record was not created due to an invalid contact type.', array(
-            'count' => $invalid,
-            'plural' => '%count relationship records were not created due to invalid contact types.',
-          )), ts('%count invalid relationship record', array(
-            'count' => $invalid,
-            'plural' => '%count invalid relationship records',
-          )));
-    }
-    if ($duplicate) {
-      CRM_Core_Session::setStatus(ts('One relationship was not created because it already exists.', array(
-            'count' => $duplicate,
-            'plural' => '%count relationships were not created because they already exist.',
-          )), ts('%count duplicate relationship', array(
-            'count' => $duplicate,
-            'plural' => '%count duplicate relationships',
-          )));
-    }
-    if ($saved) {
-      CRM_Core_Session::setStatus(ts('Relationship record has been updated.'), ts('Saved'), 'success');
-    }
 
     // Save notes
+    // @todo this belongs in the BAO.
     if ($this->_action & CRM_Core_Action::UPDATE || $params['note']) {
       foreach ($relationshipIds as $id) {
         $noteParams = array(
@@ -526,6 +489,8 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
     }
 
     // Membership for related contacts CRM-1657
+    // @todo this belongs in the BAO.
+    // DOES THIS REALLY MEAN MEMBERSHIPS ARE NOT CREATED IF LOGGED IN USER DOESN'T HAVE PERMISSION!!
     if (CRM_Core_Permission::access('CiviMember') && (!$duplicate)) {
       $params['relationship_ids'] = $relationshipIds;
       if ($this->_action & CRM_Core_Action::ADD && !empty($params['is_active'])) {
@@ -549,13 +514,15 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
       );
     }
     // Set current employee/employer relationship, CRM-3532
-    if ($params['is_current_employer'] && $this->_allRelationshipNames[$relationshipTypeId]["name_a_b"] == 'Employee of') {
+    if ($params['is_current_employer'] && $this->_allRelationshipNames[$params['relationship_type_id']]["name_a_b"] ==
+    'Employee of') {
       $employerParams = array();
       foreach ($relationshipIds as $id) {
         // Fixme this is dumb why do we have to look this up again?
         $rel = CRM_Contact_BAO_Relationship::getRelationshipByID($id);
         $employerParams[$rel->contact_id_a] = $rel->contact_id_b;
       }
+      // @todo this belongs in the BAO.
       CRM_Contact_BAO_Contact_Utils::setCurrentEmployer($employerParams);
       // Refresh contact summary if in ajax mode
       $this->ajaxResponse['reloadBlocks'] = array('#crm-contactinfo-content');
@@ -586,4 +553,42 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
     return empty($errors) ? TRUE : $errors;
   }
 
+  /**
+   * Set Status message to reflect outcome of the update action.
+   *
+   * @param int $valid Number of valid relationships attempted.
+   * @param int $invalid Number of invalid relationships attempted.
+   * @param int $duplicate Number of duplicate relationships attempted.
+   * @param int $saved Number of relationships saved.
+   */
+  protected function setMessage($valid, $invalid, $duplicate, $saved) {
+    if ($valid) {
+      CRM_Core_Session::setStatus(ts('Relationship created.', array(
+        'count' => $valid,
+        'plural' => '%count relationships created.',
+      )), ts('Saved'), 'success');
+    }
+    if ($invalid) {
+      CRM_Core_Session::setStatus(ts('%count relationship record was not created due to an invalid contact type.', array(
+        'count' => $invalid,
+        'plural' => '%count relationship records were not created due to invalid contact types.',
+      )), ts('%count invalid relationship record', array(
+        'count' => $invalid,
+        'plural' => '%count invalid relationship records',
+      )));
+    }
+    if ($duplicate) {
+      CRM_Core_Session::setStatus(ts('One relationship was not created because it already exists.', array(
+        'count' => $duplicate,
+        'plural' => '%count relationships were not created because they already exist.',
+      )), ts('%count duplicate relationship', array(
+        'count' => $duplicate,
+        'plural' => '%count duplicate relationships',
+      )));
+    }
+    if ($saved) {
+      CRM_Core_Session::setStatus(ts('Relationship record has been updated.'), ts('Saved'), 'success');
+    }
+  }
+
 }
index 080c19bb2742368f1abc2012895c48e2c442e929..54bfb7b6d93d13575a420291d278763aad324ed6 100644 (file)
@@ -918,7 +918,7 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser {
                 'contact' => $primaryContactId,
               );
 
-              list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple($relationParams, $relationIds);
+              list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($relationParams, $relationIds);
 
               if ($valid || $duplicate) {
                 $relationIds['contactTarget'] = $relContactId;
index 0da9dd3698176d151dc5572bf41880b3e15d1e9e..87013b43ea7a71c66c36159a03bcd492052a15b8 100644 (file)
@@ -253,7 +253,7 @@ class CRM_Contact_Page_AJAX {
       }
 
       // create new or update existing relationship
-      $return = CRM_Contact_BAO_Relationship::createMultiple($relationParams, $relationIds);
+      $return = CRM_Contact_BAO_Relationship::legacyCreateMultiple($relationParams, $relationIds);
 
       if (!empty($return[4][0])) {
         $relationshipID = $return[4][0];
index 1dc6965e15c4654125cd8933fbe44a9ed4ad902c..37126d5e14e07aed6282d8fe51f61af2fa0f4c51 100644 (file)
@@ -1685,7 +1685,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     // create relationship
     $relParams['contact_check'][$orgID] = 1;
     $cid = array('contact' => $contactID);
-    CRM_Contact_BAO_Relationship::createMultiple($relParams, $cid);
+    CRM_Contact_BAO_Relationship::legacyCreateMultiple($relParams, $cid);
 
     // if multiple match - send a duplicate alert
     if ($dupeIDs && (count($dupeIDs) > 1)) {
index cd9cc5375c4a2287ffb6b0918d27c1d5b69e2392..8494a99d42d2efd02acb5473b96c47019e7f4079 100644 (file)
@@ -1172,7 +1172,7 @@ SELECT is_primary,
 
     list($valid, $invalid, $duplicate,
       $saved, $relationshipIds
-      ) = CRM_Contact_BAO_Relationship::createMultiple($relationshipParams, $cid);
+      ) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($relationshipParams, $cid);
   }
 
   /**
index e19ed21571260b0afa9e62c80c3d5a3f376b573f..68d004a7a252dc6b226dcf8c92bfc029ce76d3a6 100644 (file)
@@ -169,7 +169,7 @@ DELETE FROM civicrm_contact_type
     );
     $ids = array('contact' => $this->individual);
 
-    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple($params, $ids);
+    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($params, $ids);
 
     $this->assertEquals($invalid, 1, 'In line ' . __LINE__);
     $this->assertEquals(empty($relationshipIds), TRUE, 'In line ' . __LINE__);
@@ -196,7 +196,7 @@ DELETE FROM civicrm_contact_type
     );
     $ids = array('contact' => $this->indivi_parent);
 
-    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple($params, $ids);
+    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($params, $ids);
 
     $this->assertEquals($invalid, 1, 'In line ' . __LINE__);
     $this->assertEquals(empty($relationshipIds), TRUE, 'In line ' . __LINE__);
@@ -221,7 +221,7 @@ DELETE FROM civicrm_contact_type
     );
     $ids = array('contact' => $this->indivi_parent);
 
-    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple($params, $ids);
+    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($params, $ids);
 
     $this->assertEquals($invalid, 1, 'In line ' . __LINE__);
     $this->assertEquals(empty($relationshipIds), TRUE, 'In line ' . __LINE__);
@@ -249,7 +249,7 @@ DELETE FROM civicrm_contact_type
       'contact_check' => array($this->indivi_parent => $this->indivi_parent),
     );
     $ids = array('contact' => $this->individual);
-    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple($params, $ids);
+    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($params, $ids);
 
     $this->assertEquals($valid, 1, 'In line ' . __LINE__);
     $this->assertEquals(empty($relationshipIds), FALSE, 'In line ' . __LINE__);
@@ -277,7 +277,7 @@ DELETE FROM civicrm_contact_type
       'contact_check' => array($this->indivi_student => 1),
     );
     $ids = array('contact' => $this->organization_sponsor);
-    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple($params, $ids);
+    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($params, $ids);
 
     $this->assertEquals($valid, 1, 'In line ' . __LINE__);
     $this->assertEquals(empty($relationshipIds), FALSE, 'In line ' . __LINE__);
@@ -302,7 +302,7 @@ DELETE FROM civicrm_contact_type
       'contact_check' => array($this->organization_sponsor => 1),
     );
     $ids = array('contact' => $this->indivi_student);
-    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::createMultiple($params, $ids);
+    list($valid, $invalid, $duplicate, $saved, $relationshipIds) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($params, $ids);
 
     $this->assertEquals($valid, 1, 'In line ' . __LINE__);
     $this->assertEquals(empty($relationshipIds), FALSE, 'In line ' . __LINE__);