X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FActivity%2FBAO%2FActivity.php;h=52b8ec88cb02353d229c1edcd25ef31902a07390;hb=034500d496fb8cf6b9ece94530a4cdf2c246c3d3;hp=996379dbbe79ea38d45d93b2e0aa2d7b395b9825;hpb=b71a475bcbb04ff809a85e00ec7b74ccf9cd7b1c;p=civicrm-core.git diff --git a/CRM/Activity/BAO/Activity.php b/CRM/Activity/BAO/Activity.php index 996379dbbe..52b8ec88cb 100644 --- a/CRM/Activity/BAO/Activity.php +++ b/CRM/Activity/BAO/Activity.php @@ -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; + } + } }