/**
  * Add relationships from form.
  */
 public function addRelationships()
 {
     if (!is_array($this->_contactIds)) {
         // Could this really happen?
         return;
     }
     $relationshipTypeParts = explode('_', $this->params['relationship_type_id']);
     $params = array('relationship_type_id' => $relationshipTypeParts[0], 'is_active' => 1);
     $secondaryRelationshipSide = $relationshipTypeParts[1];
     $primaryRelationshipSide = $relationshipTypeParts[2];
     $primaryFieldName = 'contact_id_' . $primaryRelationshipSide;
     $secondaryFieldName = 'contact_id_' . $secondaryRelationshipSide;
     $relationshipLabel = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_RelationshipType', $params['relationship_type_id'], "label_{$secondaryRelationshipSide}_{$primaryRelationshipSide}");
     $params[$secondaryFieldName] = $this->_contactIds;
     $params[$primaryFieldName] = $this->params['contact_check'];
     $outcome = CRM_Contact_BAO_Relationship::createMultiple($params, $primaryRelationshipSide);
     $relatedContactName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $params[$primaryFieldName], 'display_name');
     $status = array(ts('%count %2 %3 relationship created', array('count' => $outcome['valid'], 'plural' => '%count %2 %3 relationships created', 2 => $relationshipLabel, 3 => $relatedContactName)));
     if ($outcome['duplicate']) {
         $status[] = ts('%count was skipped because the contact is already %2 %3', array('count' => $outcome['duplicate'], 'plural' => '%count were skipped because the contacts are already %2 %3', 2 => $relationshipLabel, 3 => $relatedContactName));
     }
     if ($outcome['invalid']) {
         $status[] = ts('%count relationship was not created because the contact is not of the right type for this relationship', array('count' => $outcome['invalid'], 'plural' => '%count relationships were not created because the contact is not of the right type for this relationship'));
     }
     $status = '<ul><li>' . implode('</li><li>', $status) . '</li></ul>';
     CRM_Core_Session::setStatus($status, ts('Relationship created.', array('count' => $outcome['valid'], 'plural' => 'Relationships created.')), 'success', array('expires' => 0));
 }
 /**
  * This function is called when the form is submitted.
  */
 public function postProcess()
 {
     // Store the submitted values in an array.
     $params = $this->controller->exportValues($this->_name);
     // 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);
     // action is taken depending upon the mode
     if ($this->_action & CRM_Core_Action::DELETE) {
         CRM_Contact_BAO_Relationship::del($this->_relationshipId);
         // CRM-15881 UPDATES
         // Since the line above nullifies the organization_name and employer_id fiels in the contact record, we need to reload all blocks to reflect this chage on the user interface.
         $this->ajaxResponse['reloadBlocks'] = array('#crm-contactinfo-content');
         return;
     }
     $relationshipTypeParts = explode('_', $params['relationship_type_id']);
     $params['relationship_type_id'] = $relationshipTypeParts[0];
     if (!$this->_rtype) {
         // Do we need to wrap this in an if - when is rtype used & is relationship_type_id always set then?
         $this->_rtype = $params['relationship_type_id'];
     }
     $params['contact_id_' . $relationshipTypeParts[1]] = $this->_contactId;
     // Update mode (always single)
     if ($this->_action & CRM_Core_Action::UPDATE) {
         $update = TRUE;
         $params['id'] = $this->_relationshipId;
         $ids['relationship'] = $this->_relationshipId;
         $relation = CRM_Contact_BAO_Relationship::getRelationshipByID($this->_relationshipId);
         if ($relation->contact_id_a == $this->_contactId) {
             // I couldn't replicate this path in testing. See below.
             $params['contact_id_a'] = $this->_contactId;
             $params['contact_id_b'] = array($params['related_contact_id']);
             $outcome = CRM_Contact_BAO_Relationship::createMultiple($params, $relationshipTypeParts[1]);
             $relationshipIds = $outcome['relationship_ids'];
         } else {
             // The only reason we have changed this to use the api & not the above is that this was broken.
             // Recommend extracting all of update into a function that uses the api
             // and ensuring api / bao take care of 'other stuff' in this form
             // the contact_id_a & b can't be changed on this form so don't really need setting.
             $params['contact_id_b'] = $this->_contactId;
             $params['contact_id_a'] = $params['related_contact_id'];
             $result = civicrm_api3('relationship', 'create', $params);
             $relationshipIds = array($result['id']);
         }
         $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.
             $relChanged = $params['relationship_type_id'] != $this->_values['relationship_type_id'];
             if (!$params['is_active'] || !$params['is_current_employer'] || $relChanged) {
                 // CRM-15881 UPDATES
                 // If not is_active then is_current_employer needs to be set false as well! Logically a contact cannot be a current employee of a disabled employer relationship.
                 // If this is not done, then the below process will go ahead and disable the organization_name and employer_id fields in the contact record (which is what is wanted) but then further down will be re-enabled becuase is_current_employer is not false, therefore undoing what was done correctly.
                 if (!$params['is_active']) {
                     $params['is_current_employer'] = FALSE;
                 }
                 CRM_Contact_BAO_Contact_Utils::clearCurrentEmployer($this->_values['contact_id_a']);
                 // Refresh contact summary if in ajax mode
                 $this->ajaxResponse['reloadBlocks'] = array('#crm-contactinfo-content');
             }
         }
         if (empty($outcome['saved']) && !empty($update)) {
             $outcome['saved'] = $update;
         }
         $this->setMessage($outcome);
     } else {
         $params['contact_id_' . $relationshipTypeParts[2]] = explode(',', $params['related_contact_id']);
         $outcome = CRM_Contact_BAO_Relationship::createMultiple($params, $relationshipTypeParts[1]);
         $relationshipIds = $outcome['relationship_ids'];
         if (empty($outcome['saved']) && !empty($update)) {
             $outcome['saved'] = $update;
         }
         $this->setMessage($outcome);
     }
     // 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);
     }
     // Save notes
     // @todo this belongs in the BAO.
     if ($this->_action & CRM_Core_Action::UPDATE || $params['note']) {
         foreach ($relationshipIds as $id) {
             $noteParams = array('entity_id' => $id, 'entity_table' => 'civicrm_relationship');
             $existing = civicrm_api3('note', 'get', $noteParams);
             if (!empty($existing['id'])) {
                 $noteParams['id'] = $existing['id'];
             }
             $noteParams['note'] = $params['note'];
             $noteParams['contact_id'] = $this->_contactId;
             if (!empty($existing['id']) || $params['note']) {
                 $action = $params['note'] ? 'create' : 'delete';
                 civicrm_api3('note', $action, $noteParams);
             }
         }
     }
     $params['relationship_ids'] = $relationshipIds;
     // Refresh contact tabs which might have been affected
     $this->ajaxResponse['updateTabs'] = array('#tab_member' => CRM_Contact_BAO_Contact::getCountComponent('membership', $this->_contactId), '#tab_contribute' => CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId));
     // Set current employee/employer relationship, CRM-3532
     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');
     }
 }