clean up(CRM-12274)
[civicrm-core.git] / CRM / Activity / BAO / Activity.php
index 996379dbbe79ea38d45d93b2e0aa2d7b395b9825..52b8ec88cb02353d229c1edcd25ef31902a07390 100644 (file)
@@ -91,18 +91,21 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
     $activity->copyValues($params);
 
     if ($activity->find(TRUE)) {
+      $activityContacts = CRM_Core_PseudoConstant::activityContacts('name');
+      $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
+      $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+      $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts);
+
       // TODO: at some stage we'll have to deal
       // TODO: with multiple values for assignees and targets, but
       // TODO: for now, let's just fetch first row
-      $defaults['assignee_contact'] = CRM_Activity_BAO_ActivityAssignment::retrieveAssigneeIdsByActivityId($activity->id);
-      $assignee_contact_names = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activity->id);
-
+      $defaults['assignee_contact'] = CRM_Activity_BAO_ActivityContact::retrieveContactIdsByActivityId($activity->id, $assigneeID);
+      $assignee_contact_names = CRM_Activity_BAO_ActivityContact::getNames($activity->id, $assigneeID);
       $defaults['assignee_contact_value'] = implode('; ', $assignee_contact_names);
 
       if ($activity->activity_type_id != CRM_Core_OptionGroup::getValue('activity_type', 'Bulk Email', 'name')) {
-        $defaults['target_contact'] = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activity->id);
-        $target_contact_names = CRM_Activity_BAO_ActivityTarget::getTargetNames($activity->id);
-
+        $defaults['target_contact'] = CRM_Activity_BAO_ActivityContact::retrieveContactIdsByActivityId($activity->id, $targetID);
+        $target_contact_names = CRM_Activity_BAO_ActivityContact::getNames($activity->id, $targetID);
         $defaults['target_contact_value'] = implode('; ', $target_contact_names);
       }
       elseif (CRM_Core_Permission::check('access CiviMail') ||
@@ -117,15 +120,17 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
       else {
         $defaults['target_contact_value'] = ts('(recipients)');
       }
+      
+      $sourceContactId = self::getActivityContact($activity->id, $sourceID);
 
-      if ($activity->source_contact_id &&
+      if ($sourceContactId &&
         !CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
-          $activity->source_contact_id,
+          $sourceContactId,
           'is_deleted'
         )
       ) {
         $defaults['source_contact'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
-          $activity->source_contact_id,
+          $sourceContactId,
           'sort_name'
         );
       }
@@ -198,19 +203,23 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
       //log activty delete.CRM-4525.
       $logMsg          = 'Case Activity deleted for';
       $msgs            = array();
-      $sourceContactId = CRM_Core_DAO::getfieldValue('CRM_Activity_DAO_Activity',
-        $activity->id, 'source_contact_id'
-      );
+
+      $activityContacts = CRM_Core_PseudoConstant::activityContacts('name');
+      $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+      $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts);
+      $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
+      $sourceContactId = self::getActivityContact($activity->id, $sourceID);
       if ($sourceContactId) {
         $msgs[] = " source={$sourceContactId}";
       }
+
       //get target contacts.
-      $targetContactIds = CRM_Activity_BAO_ActivityTarget::getTargetNames($activity->id);
+      $targetContactIds = CRM_Activity_BAO_ActivityContact::getNames($activity->id, $targetID);
       if (!empty($targetContactIds)) {
         $msgs[] = " target =" . implode(',', array_keys($targetContactIds));
       }
       //get assignee contacts.
-      $assigneeContactIds = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($activity->id);
+      $assigneeContactIds = CRM_Activity_BAO_ActivityContact::getNames($activity->id, $assigneeID);
       if (!empty($assigneeContactIds)) {
         $msgs[] = " assignee =" . implode(',', array_keys($assigneeContactIds));
       }
@@ -247,65 +256,13 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
    * @return null
    * @access public
    */
-  public static function deleteActivityAssignment($activityId) {
-    $assignment = new CRM_Activity_BAO_ActivityAssignment();
-    $assignment->activity_id = $activityId;
-    $assignment->delete();
-  }
-
-  /**
-   * Delete activity target record
-   *
-   * @param int    $id  activity id
-   *
-   * @return null
-   * @access public
-   */
-  public static function deleteActivityTarget($activityId) {
-    $target = new CRM_Activity_BAO_ActivityTarget();
-    $target->activity_id = $activityId;
-    $target->delete();
-  }
-
-  /**
-   * Create activity target record
-   *
-   * @param array    activity_id, target_contact_id
-   *
-   * @return null
-   * @access public
-   */
-  static function createActivityTarget($params) {
-    if (!$params['target_contact_id']) {
-      return;
-    }
-
-    $target = new CRM_Activity_BAO_ActivityTarget();
-    $target->activity_id = $params['activity_id'];
-    $target->target_contact_id = $params['target_contact_id'];
-    // avoid duplicate entries, CRM-7484
-    // happens if sending email to the same contact with different email addresses
-    if (!$target->find(TRUE)) {
-      $target->save();
-    }
-  }
-
-  /**
-   * Create activity assignment record
-   *
-   * @param array    activity_id, assignee_contact_id
-   *
-   * @return null
-   * @access public
-   */
-  static function createActivityAssignment($params) {
-    if (!$params['assignee_contact_id']) {
-      return;
+  public static function deleteActivityContact($activityId, $recordTypeID = NULL) {
+    $activityContact = new CRM_Activity_BAO_ActivityContact();
+    $activityContact->activity_id = $activityId;
+    if ($recordTypeID) {
+      $activityContact->record_type_id = $recordTypeID;
     }
-    $assignee = new CRM_Activity_BAO_ActivityAssignment();
-    $assignee->activity_id = $params['activity_id'];
-    $assignee->assignee_contact_id = $params['assignee_contact_id'];
-    $assignee->save();
+    $activityContact->delete();
   }
 
   /**
@@ -391,6 +348,19 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
     }
 
     $activityId = $activity->id;
+    $activityContacts = CRM_Core_PseudoConstant::activityContacts('name');
+    $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+    $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts);
+    $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
+
+    if (isset($params['source_contact_id'])) {
+      $acParams = array(
+        'activity_id' => $activityId,
+        'contact_id'  => $params['source_contact_id'],
+        'record_type_id' => $sourceID
+      );
+      CRM_Activity_BAO_ActivityContact::create($acParams);
+    }
 
     // check and attach and files as needed
     CRM_Core_BAO_File::processAttachment($params, 'civicrm_activity', $activityId);
@@ -404,43 +374,44 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
       if (is_array($params['assignee_contact_id'])) {
         if (CRM_Utils_Array::value('deleteActivityAssignment', $params, TRUE)) {
           // first delete existing assignments if any
-          self::deleteActivityAssignment($activityId);
+          self::deleteActivityContact($activityId, $assigneeID);
         }
 
         $values = array();
         foreach ($params['assignee_contact_id'] as $acID) {
           if ($acID) {
-            $values[] = "( $activityId, $acID )";
+            $values[] = "( $activityId, $acID, $assigneeID )";
           }
         }
         while (!empty($values)) {
           $input = array_splice($values, 0, CRM_Core_DAO::BULK_INSERT_COUNT);
           $str   = implode(',', $input);
-          $sql   = "INSERT IGNORE INTO civicrm_activity_assignment ( activity_id, assignee_contact_id ) VALUES $str;";
+          $sql   = "INSERT IGNORE INTO civicrm_activity_contact ( activity_id, contact_id, record_type_id ) VALUES $str;";
           CRM_Core_DAO::executeQuery($sql);
         }
       }
       else {
         $assignmentParams['assignee_contact_id'] = $params['assignee_contact_id'];
-
+        $assignmentParams['record_type_id'] = $assigneeID;
         if (CRM_Utils_Array::value('id', $params)) {
           $assignment = new CRM_Activity_BAO_ActivityAssignment();
           $assignment->activity_id = $activityId;
+          $assignment->record_type_id = $assigneeID;
           $assignment->find(TRUE);
 
           if ($assignment->assignee_contact_id != $params['assignee_contact_id']) {
             $assignmentParams['id'] = $assignment->id;
-            $resultAssignment = CRM_Activity_BAO_ActivityAssignment::create($assignmentParams);
+            $resultAssignment = CRM_Activity_BAO_ActivityContact::create($assignmentParams);
           }
         }
         else {
-          $resultAssignment = CRM_Activity_BAO_ActivityAssignment::create($assignmentParams);
+          $resultAssignment = CRM_Activity_BAO_ActivityContact::create($assignmentParams);
         }
       }
     }
     else {
       if (CRM_Utils_Array::value('deleteActivityAssignment', $params, TRUE)) {
-        self::deleteActivityAssignment($activityId);
+        self::deleteActivityContact($activityId, $assigneeID);
       }
     }
 
@@ -458,44 +429,45 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
       if (is_array($params['target_contact_id'])) {
         if (CRM_Utils_Array::value('deleteActivityTarget', $params, TRUE)) {
           // first delete existing targets if any
-          self::deleteActivityTarget($activityId);
+          self::deleteActivityContact($activityId, $targetID );
         }
 
         $values = array();
         foreach ($params['target_contact_id'] as $tid) {
           if ($tid) {
-            $values[] = "( $activityId, $tid )";
+            $values[] = "( $activityId, $tid,  $targetID )";
           }
         }
 
         while (!empty($values)) {
           $input = array_splice($values, 0, CRM_Core_DAO::BULK_INSERT_COUNT);
           $str   = implode(',', $input);
-          $sql   = "INSERT IGNORE INTO civicrm_activity_target ( activity_id, target_contact_id ) VALUES $str;";
+          $sql   = "INSERT IGNORE INTO civicrm_activity_contact ( activity_id, contact_id, record_type_id ) VALUES $str;";
           CRM_Core_DAO::executeQuery($sql);
         }
       }
       else {
         $targetParams['target_contact_id'] = $params['target_contact_id'];
-
+        $targetParams['record_type_id'] = $targetID;
         if (CRM_Utils_Array::value('id', $params)) {
-          $target = new CRM_Activity_BAO_ActivityTarget();
+          $target = new CRM_Activity_BAO_ActivityContact();
           $target->activity_id = $activityId;
+          $target->record_type_id = $targetID;
           $target->find(TRUE);
 
           if ($target->target_contact_id != $params['target_contact_id']) {
             $targetParams['id'] = $target->id;
-            $resultTarget = CRM_Activity_BAO_ActivityTarget::create($targetParams);
+            $resultTarget = CRM_Activity_BAO_ActivityContact::create($targetParams);
           }
         }
         else {
-          $resultTarget = CRM_Activity_BAO_ActivityTarget::create($targetParams);
+          $resultTarget = CRM_Activity_BAO_ActivityContact::create($targetParams);
         }
       }
     }
     else {
       if (CRM_Utils_Array::value('deleteActivityTarget', $params, TRUE)) {
-        self::deleteActivityTarget($activityId);
+        self::deleteActivityContact($activityId, $targetID );
       }
     }
 
@@ -701,9 +673,7 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
       'activity_date_time' => 'datetime',
       'status_id' => 'int unsigned',
       'subject' => 'varchar(255)',
-      'source_contact_id' => 'int unsigned',
       'source_record_id' => 'int unsigned',
-      'source_contact_name' => 'varchar(255)',
       'activity_type_id' => 'int unsigned',
       'activity_type' => 'varchar(128)',
       'case_id' => 'int unsigned',
@@ -728,7 +698,6 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
     $insertSQL = "INSERT INTO {$activityTempTable} (" . implode(',', $insertValueSQL) . " ) ";
 
     $order = $limit = $groupBy = '';
-    //$groupBy = " GROUP BY tbl.activity_id";
 
     if (!empty($input['sort'])) {
       if (is_a($input['sort'], 'CRM_Utils_Sort')) {
@@ -778,55 +747,38 @@ LEFT JOIN  civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.ac
 
     // step 2: Get target and assignee contacts for above activities
     // create temp table for target contacts
-    $activityTargetContactTempTable = "civicrm_temp_target_contact_{$randomNum}";
-    $query = "CREATE TEMPORARY TABLE {$activityTargetContactTempTable} (
-                activity_id int unsigned, target_contact_id int unsigned, target_contact_name varchar(255) )
+    $activityContactTempTable = "civicrm_temp_activity_contact_{$randomNum}";
+    $query = "CREATE TEMPORARY TABLE {$activityContactTempTable} (
+                activity_id int unsigned, contact_id int unsigned, record_type_id varchar(16), contact_name varchar(255) )
                 ENGINE=MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci";
 
     CRM_Core_DAO::executeQuery($query);
 
     // note that we ignore bulk email for targets, since we don't show it in selector
-    $query = "INSERT INTO {$activityTargetContactTempTable} ( activity_id, target_contact_id, target_contact_name )
-                  SELECT at.activity_id,
-                  at.target_contact_id ,
-                  c.sort_name
-                  FROM civicrm_activity_target at
-                  INNER JOIN {$activityTempTable} ON ( at.activity_id = {$activityTempTable}.activity_id
-                             {$notbulkActivityClause} )
-                  INNER JOIN civicrm_contact c ON c.id = at.target_contact_id
-                  WHERE c.is_deleted = 0";
-
-    CRM_Core_DAO::executeQuery($query);
-
-    // create temp table for assignee contacts
-    $activityAssigneetContactTempTable = "civicrm_temp_assignee_contact_{$randomNum}";
-    $query = "CREATE TEMPORARY TABLE {$activityAssigneetContactTempTable} (
-                activity_id int unsigned, assignee_contact_id int unsigned, assignee_contact_name varchar(255) )
-                ENGINE=MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci";
-
+    $query = "
+INSERT INTO {$activityContactTempTable} ( activity_id, contact_id, record_type_id, contact_name )
+SELECT     ac.activity_id,
+           ac.contact_id,
+           ac.record_type_id
+           c.sort_name
+FROM       civicrm_activity_contact ac
+INNER JOIN {$activityTempTable} ON ( ac.activity_id = {$activityTempTable}.activity_id
+INNER JOIN civicrm_contact c ON c.id = at.contact_id
+WHERE      c.is_deleted = 0
+           {$notbulkActivityClause} )
+";
     CRM_Core_DAO::executeQuery($query);
 
-    // note that we ignore bulk email for assignee, since we don't show it in selector
-    $query = "INSERT INTO {$activityAssigneetContactTempTable} ( activity_id, assignee_contact_id, assignee_contact_name )
-                  SELECT DISTINCT ( aa.activity_id ) ,
-                  aa.assignee_contact_id,
-                  c.sort_name
-                  FROM civicrm_activity_assignment aa
-                  INNER JOIN {$activityTempTable} ON ( aa.activity_id = {$activityTempTable}.activity_id
-                             {$notbulkActivityClause} )
-                  INNER JOIN civicrm_contact c ON c.id = aa.assignee_contact_id
-                  WHERE c.is_deleted = 0";
-
     CRM_Core_DAO::executeQuery($query);
 
     // step 3: Combine all temp tables to get final query for activity selector
     $query = "
-        SELECT {$activityTempTable}.*,
-               {$activityTargetContactTempTable}.target_contact_id,{$activityTargetContactTempTable}.target_contact_name,
-               {$activityAssigneetContactTempTable}.assignee_contact_id, {$activityAssigneetContactTempTable}.assignee_contact_name
-        FROM  {$activityTempTable}
-            LEFT JOIN {$activityTargetContactTempTable} on {$activityTempTable}.activity_id = {$activityTargetContactTempTable}.activity_id
-            LEFT JOIN {$activityAssigneetContactTempTable} on {$activityTempTable}.activity_id = {$activityAssigneetContactTempTable}.activity_id
+SELECT     {$activityTempTable}.*,
+           {$activityContactTempTable}.contact_id,
+           {$activityContactTempTable}.record_type_id,
+           {$activityContactTempTable}.contact_name,
+FROM       {$activityTempTable}
+INNER JOIN {$activityContactTempTable} on {$activityTempTable}.activity_id = {$activityContactTempTable}.activity_id
         ";
 
 
@@ -844,6 +796,12 @@ LEFT JOIN  civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.ac
     $allCampaigns = CRM_Campaign_BAO_Campaign::getCampaigns(NULL, NULL, FALSE, FALSE, FALSE, TRUE);
 
     $values = array();
+    $activityContacts = CRM_Core_PseudoConstant::activityContacts('name');
+    $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+    $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts);
+    $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
+
     while ($dao->fetch()) {
       $activityID = $dao->activity_id;
       $values[$activityID]['activity_id'] = $dao->activity_id;
@@ -853,8 +811,6 @@ LEFT JOIN  civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.ac
       $values[$activityID]['activity_date_time'] = $dao->activity_date_time;
       $values[$activityID]['status_id'] = $dao->status_id;
       $values[$activityID]['subject'] = $dao->subject;
-      $values[$activityID]['source_contact_name'] = $dao->source_contact_name;
-      $values[$activityID]['source_contact_id'] = $dao->source_contact_id;
       $values[$activityID]['campaign_id'] = $dao->campaign_id;
 
       if ($dao->campaign_id) {
@@ -869,13 +825,18 @@ LEFT JOIN  civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.ac
         $values[$activityID]['target_contact_name'] = array();
       }
 
+      if ($dao->record_type_id == $sourceID  && $dao->contact_id) {
+        $values[$activityID]['source_contact_id'] = $dao->contact_id;
+        $values[$activityID]['source_contact_name'] = $dao->contact_name;
+      }
+
       if (!$bulkActivityTypeID || ($bulkActivityTypeID != $dao->activity_type_id)) {
         // build array of target / assignee names
-        if ($dao->target_contact_id) {
-          $values[$activityID]['target_contact_name'][$dao->target_contact_id] = $dao->target_contact_name;
+        if ($dao->record_type_id == $targetID && $dao->contact_id) {
+          $values[$activityID]['target_contact_name'][$dao->contact_id] = $dao->contact_name;
         }
-        if ($dao->assignee_contact_id) {
-          $values[$activityID]['assignee_contact_name'][$dao->assignee_contact_id] = $dao->assignee_contact_name;
+        if ($dao->record_type_id == $assigneeID && $dao->contact_id) {
+          $values[$activityID]['assignee_contact_name'][$dao->contact_id] = $dao->contact_name;
         }
 
         // case related fields
@@ -1018,9 +979,7 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
 
     $config = CRM_Core_Config::singleton();
     if (!CRM_Utils_Array::value('admin', $input, FALSE)) {
-      $sourceWhere   = ' source_contact_id = %1 ';
-      $targetWhere   = ' at.target_contact_id = %1 ';
-      $assigneeWhere = ' aa.assignee_contact_id = %1 ';
+      $sourceWhere   = ' ac.contact_id = %1 ';
       $caseWhere     = ' civicrm_case_contact.contact_id = %1 ';
 
       $params = array(1 => array($input['contact_id'], 'Integer'));
@@ -1085,25 +1044,27 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
 
     // build main activity table select clause
     $sourceSelect = '';
-    $sourceJoin = '';
+    $sourceJoin = "
+INNER JOIN civicrm_activity_contact ac ON ac.activity_id = civicrm_activity.id
+INNER JOIN civicrm_contact contact ON ac.contact_id = contact.id
+";
 
     if (!$input['count']) {
       $sourceSelect = ',
                 civicrm_activity.activity_date_time,
                 civicrm_activity.status_id,
                 civicrm_activity.subject,
-                civicrm_activity.source_contact_id,
                 civicrm_activity.source_record_id,
                 sourceContact.sort_name as source_contact_name,
                 civicrm_option_value.value as activity_type_id,
                 civicrm_option_value.label as activity_type,
                 null as case_id, null as case_subject,
-                civicrm_activity.campaign_id as campaign_id
+                civicrm_activity.campaign_id as campaign_id,
+                activityContact.contact_id as contact_id,
+                activityContact.record_type_id as record_type_id,
+                contact.sort_name as sort_name
             ';
 
-      $sourceJoin = '
-                left join civicrm_contact sourceContact on
-                      source_contact_id = sourceContact.id ';
     }
 
     $sourceClause = "
@@ -1120,58 +1081,6 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
                 AND $commonClause
         ";
 
-    // build target activity table select clause
-    $targetAssigneeSelect = '';
-
-    if (!$input['count']) {
-      $targetAssigneeSelect = ',
-                civicrm_activity.activity_date_time,
-                civicrm_activity.status_id,
-                civicrm_activity.subject,
-                civicrm_activity.source_contact_id,
-                civicrm_activity.source_record_id,
-                sourceContact.sort_name as source_contact_name,
-                civicrm_option_value.value as activity_type_id,
-                civicrm_option_value.label as activity_type,
-                null as case_id, null as case_subject,
-                civicrm_activity.campaign_id as campaign_id
-            ';
-    }
-
-    $targetClause = "
-            SELECT civicrm_activity.id as activity_id
-            {$targetAssigneeSelect}
-            from civicrm_activity
-            inner join civicrm_activity_target at on
-                civicrm_activity.id = at.activity_id and {$targetWhere}
-            left join civicrm_option_value on
-                civicrm_activity.activity_type_id = civicrm_option_value.value
-            left join civicrm_option_group on
-                civicrm_option_group.id = civicrm_option_value.option_group_id
-            {$sourceJoin}
-            where
-                    {$targetWhere}
-                AND $commonClause
-        ";
-
-    // build assignee activity table select clause
-    $assigneeClause = "
-            SELECT civicrm_activity.id as activity_id
-            {$targetAssigneeSelect}
-            from civicrm_activity
-            inner join civicrm_activity_assignment aa on
-                civicrm_activity.id = aa.activity_id and {$assigneeWhere}
-            left join civicrm_option_value on
-                civicrm_activity.activity_type_id = civicrm_option_value.value
-            left join civicrm_option_group on
-                civicrm_option_group.id = civicrm_option_value.option_group_id
-            {$sourceJoin}
-            where
-                    {$assigneeWhere}
-                AND $commonClause
-
-        ";
-
     // Build case clause
     // or else exclude Inbound Emails that have been filed on a case.
     $caseClause = '';
@@ -1220,7 +1129,7 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
             ";
     }
 
-    $returnClause = " {$sourceClause}  union all {$targetClause} union all {$assigneeClause} {$caseClause} ";
+    $returnClause = " {$sourceClause} {$caseClause} ";
 
     return array($returnClause, $params);
   }
@@ -1590,12 +1499,17 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
       return FALSE;
     }
 
+    $activityContacts = CRM_Core_PseudoConstant::activityContacts('name');
+    $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
+
     // add activity target record for every sms that is send
     $activityTargetParams = array(
       'activity_id' => $activityID,
-      'target_contact_id' => $toID,
+      'contact_id'  => $toID,
+      'record_type_id' => $targetID
     );
-    self::createActivityTarget($activityTargetParams);
+    CRM_Activity_BAO_ActivityContact::create($activityTargetParams);
 
     return TRUE;
   }
@@ -1640,6 +1554,11 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
       $toDisplayName = $toEmail;
     }
 
+    $activityContacts = CRM_Core_PseudoConstant::activityContacts('name');
+    //$sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+    //$assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts);
+    $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
+
     // create the params array
     $mailParams = array(
       'groupName' => 'Activity Email Sender',
@@ -1661,9 +1580,10 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
     // add activity target record for every mail that is send
     $activityTargetParams = array(
       'activity_id' => $activityID,
-      'target_contact_id' => $toID,
+      'contact_id' => $toID,
+      'record_type_id' => $targetID 
     );
-    self::createActivityTarget($activityTargetParams);
+    CRM_Activity_BAO_ActivityContact::create($activityTargetParams);
     return TRUE;
   }
 
@@ -1736,47 +1656,46 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
    */
   static function getContactActivity($contactId) {
     $activities = array();
+    $activityContacts = CRM_Core_PseudoConstant::activityContacts('name');
+    $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+    $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts);
+    $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
 
     // First look for activities where contactId is one of the targets
-    $query = "SELECT activity_id FROM civicrm_activity_target
-                  WHERE  target_contact_id = $contactId";
-    $dao = CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray);
-    while ($dao->fetch()) {
-      $activities[$dao->activity_id]['targets'][$contactId] = $contactId;
-    }
-
-    // Then get activities where contactId is an asignee
-    $query = "SELECT activity_id FROM civicrm_activity_assignment
-                  WHERE  assignee_contact_id = $contactId";
-    $dao = CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray);
+    $query = "
+SELECT activity_id, record_type_id
+FROM   civicrm_activity_contact
+WHERE  contact_id = $contactId
+";
+    $dao = CRM_Core_DAO::executeQuery($query);
     while ($dao->fetch()) {
-      $activities[$dao->activity_id]['asignees'][$contactId] = $contactId;
+      if ($dao->record_type_id == $targetID ) {
+        $activities[$dao->activity_id]['targets'][$contactId] = $contactId;
+      }
+      else if ($dao->record_type_id == $assigneeID) {
+        $activities[$dao->activity_id]['asignees'][$contactId] = $contactId;
+      }
+      else {
+        // do source stuff here
+        $activities[$dao->activity_id]['source_contact_id'][] = $contactId;
+      }
     }
 
-    // Then get activities that contactId created
-    $query = "SELECT id AS activity_id FROM civicrm_activity
-                  WHERE  source_contact_id = $contactId";
-    $dao = CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray);
-    while ($dao->fetch()) {
-      $activities[$dao->activity_id]['source_contact_id'][] = $contactId;
-    }
-    $activityIds = array();
-    // Then look up the activity details for each activity_id we saw above
-    foreach ($activities as $activityId => $dummy) {
-      $activityIds[] = $activityId;
-    }
+    $activityIds = array_keys($activities);
     if (count($activityIds) < 1) {
       return array();
     }
+
     $activityIds = implode(',', $activityIds);
-    $query = "SELECT     activity.id as activity_id, source_contact_id, target_contact_id, assignee_contact_id, activity_type_id,
-                             subject, location, activity_date_time, details, status_id
-                  FROM       civicrm_activity activity
-                  LEFT JOIN  civicrm_activity_target target ON activity.id = target.activity_id
-                  LEFT JOIN  civicrm_activity_assignment assignment ON activity.id = assignment.activity_id
-                  WHERE      activity.id IN ($activityIds)";
+    $query = "
+SELECT     activity.id as activity_id,
+           activity_type_id,
+           subject, location, activity_date_time, details, status_id
+FROM       civicrm_activity activity
+WHERE      activity.id IN ($activityIds)";
 
-    $dao = CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray);
+    $dao = CRM_Core_DAO::executeQuery($query);
 
     $activityTypes = CRM_Core_OptionGroup::values('activity_type');
     $activityStatuses = CRM_Core_OptionGroup::values('activity_status');
@@ -1784,12 +1703,6 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
     while ($dao->fetch()) {
       $activities[$dao->activity_id]['source_contact_id'] = $dao->source_contact_id;
       $activities[$dao->activity_id]['id'] = $dao->activity_id;
-      if ($dao->target_contact_id) {
-        $activities[$dao->activity_id]['targets'][$dao->target_contact_id] = $dao->target_contact_id;
-      }
-      if (isset($dao->assignee_contact_id)) {
-        $activities[$dao->activity_id]['asignees'][$dao->assignee_contact_id] = $dao->assignee_contact_id;
-      }
       $activities[$dao->activity_id]['activity_type_id'] = $dao->activity_type_id;
       $activities[$dao->activity_id]['subject'] = $dao->subject;
       $activities[$dao->activity_id]['location'] = $dao->location;
@@ -2255,44 +2168,29 @@ AND cl.modified_id  = c.id
 
     $transaction = new CRM_Core_Transaction();
 
-    // delete activity if there are no record in
-    // civicrm_activity_assignment or civicrm_activity_target
+    // delete activity if there is no record in
+    // civicrm_activity_contact
     // pointing to any other contact record.
-
-
     $activity = new CRM_Activity_DAO_Activity();
     $activity->source_contact_id = $contactId;
     $activity->find();
 
     while ($activity->fetch()) {
-      $noTarget = $noAssignee = TRUE;
-
-      // check for target activity record.
-      $target = new CRM_Activity_DAO_ActivityTarget();
-      $target->activity_id = $activity->id;
-      $target->find();
-      while ($target->fetch()) {
-        if ($target->target_contact_id != $contactId) {
-          $noTarget = FALSE;
-          break;
-        }
-      }
-      $target->free();
+      $noOther = TRUE;
 
-      // check for assignee activity record.
-      $assignee = new CRM_Activity_DAO_ActivityAssignment();
-      $assignee->activity_id = $activity->id;
-      $assignee->find();
-      while ($assignee->fetch()) {
-        if ($assignee->assignee_contact_id != $contactId) {
-          $noAssignee = FALSE;
-          break;
-        }
-      }
-      $assignee->free();
+      $sql = "
+SELECT count(*)
+FROM   civicrm_activity_contact
+WHERE  activity_id = %1
+AND    contact_id <> %2
+";
+      $params = array(
+        1 => array($activity->id, 'Integer'),
+        2 => array($contactId, 'Integer')
+      );
 
       // finally delete activity.
-      if ($noTarget && $noAssignee) {
+      if (CRM_Core_DAO::singleValueQuery($sql)) {
         $activityParams = array('id' => $activity->id);
         $result = self::deleteActivity($activityParams);
       }
@@ -2370,7 +2268,6 @@ AND cl.modified_id  = c.id
       return $allow;
     }
 
-
     //first check the component permission.
     $sql = "
     SELECT  component_id
@@ -2403,9 +2300,15 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
       $permission = CRM_Core_Permission::EDIT;
     }
 
+    $activityContacts = CRM_Core_PseudoConstant::activityContacts('name');
+    $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+    $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts);
+    $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
+
     //check for source contact.
     if (!$componentId || $allow) {
-      $allow = CRM_Contact_BAO_Contact_Permission::allow($activity->source_contact_id, $permission);
+      $sourceContactId = self::getActivityContact($activity->id, $sourceID);
+      $allow = CRM_Contact_BAO_Contact_Permission::allow($sourceContactId, $permission);
     }
 
     //check for target and assignee contacts.
@@ -2421,7 +2324,7 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
       if (!$allow) {
         $allow = TRUE;
         //get the target contacts.
-        $targetContacts = CRM_Activity_BAO_ActivityTarget::retrieveTargetIdsByActivityId($activity->id);
+        $targetContacts = CRM_Activity_BAO_ActivityContact::retrieveContactIdsByActivityId($activity->id, $targetID);
         foreach ($targetContacts as $cnt => $contactId) {
           if (!CRM_Contact_BAO_Contact_Permission::allow($contactId, $permission)) {
             $allow = FALSE;
@@ -2431,7 +2334,7 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
 
         //get the assignee contacts.
         if ($allow) {
-          $assigneeContacts = CRM_Activity_BAO_ActivityAssignment::retrieveAssigneeIdsByActivityId($activity->id);
+          $assigneeContacts = CRM_Activity_BAO_Contact::retrieveContactIdsByActivityId($activity->id, $assigneeID);
           foreach ($assigneeContacts as $cnt => $contactId) {
             if (!CRM_Contact_BAO_Contact_Permission::allow($contactId, $permission)) {
               $allow = FALSE;
@@ -2643,5 +2546,16 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
     // copy activity attachments ( if any )
     CRM_Core_BAO_File::copyEntityFile('civicrm_activity', $params['activityID'], 'civicrm_activity', $params['mainActivityId']);
   }
+
+  public static function getActivityContact($activityId, $recordTypeID = NULL, $column = 'contact_id') {
+    $activityContact = new CRM_Activity_BAO_ActivityContact();
+    $activityContact->activity_id = $activityId;
+    if ($recordTypeID) {
+      $activityContact->record_type_id = $recordTypeID;
+    }
+    if ($activityContact->find(TRUE)) {
+      return $activityContact->$column;  
+    }
+  }
 }