'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) {
/**
* 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
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).
*
* @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));
* 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
}
$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.
}
// 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,
);
// 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(
}
// 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'])) {
);
}
// 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');
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');
+ }
+ }
+
}
'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;
}
// 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];
// 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)) {
list($valid, $invalid, $duplicate,
$saved, $relationshipIds
- ) = CRM_Contact_BAO_Relationship::createMultiple($relationshipParams, $cid);
+ ) = CRM_Contact_BAO_Relationship::legacyCreateMultiple($relationshipParams, $cid);
}
/**
);
$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__);
);
$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__);
);
$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__);
'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__);
'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__);
'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__);