示例#1
0
/**
 * Function to check for required params
 *
 * @param array   $params  associated array of fields
 * @param boolean $addMode true for add mode
 *
 * @return array $error array with errors
 */
function _civicrm_activity_check_params(&$params, $addMode = false)
{
    // return error if we do not get any params
    if (empty($params)) {
        return civicrm_create_error(ts('Input Parameters empty'));
    }
    $contactIds = array('source' => CRM_Utils_Array::value('source_contact_id', $params), 'assignee' => CRM_Utils_Array::value('assignee_contact_id', $params), 'target' => CRM_Utils_Array::value('target_contact_id', $params));
    foreach ($contactIds as $key => $value) {
        if (empty($value)) {
            continue;
        }
        $valueIds = array($value);
        if (is_array($value)) {
            $valueIds = array();
            foreach ($value as $id) {
                if ($id) {
                    $valueIds[$id] = $id;
                }
            }
        }
        if (empty($valueIds)) {
            continue;
        }
        $sql = '
SELECT  count(*) 
  FROM  civicrm_contact 
 WHERE  id IN (' . implode(', ', $valueIds) . ' )';
        if (count($valueIds) != CRM_Core_DAO::singleValueQuery($sql)) {
            return civicrm_create_error(ts('Invalid %1 Contact Id', array(1 => ucfirst($key))));
        }
    }
    $activityIds = array('activity' => CRM_Utils_Array::value('id', $params), 'parent' => CRM_Utils_Array::value('parent_id', $params), 'original' => CRM_Utils_Array::value('original_id', $params));
    foreach ($activityIds as $id => $value) {
        if ($value && !CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $value, 'id')) {
            return civicrm_create_error(ts('Invalid %1 Id', array(1 => ucfirst($id))));
        }
    }
    // check for activity subject if add mode
    if ($addMode && !isset($params['subject'])) {
        return civicrm_create_error(ts('Missing Subject'));
    }
    if (!$addMode && !isset($params['id'])) {
        return civicrm_create_error(ts('Required parameter "id" not found'));
    }
    if (!$addMode && $params['id'] && !is_numeric($params['id'])) {
        return civicrm_create_error(ts('Invalid activity "id"'));
    }
    require_once 'CRM/Core/PseudoConstant.php';
    $activityTypes = CRM_Core_PseudoConstant::activityType(true, true, true, 'name');
    // check if activity type_id is passed in
    if ($addMode && !isset($params['activity_name']) && !isset($params['activity_type_id'])) {
        //when name AND id are both absent
        return civicrm_create_error(ts('Missing Activity Type'));
    } else {
        $activityName = CRM_Utils_Array::value('activity_name', $params);
        $activityTypeId = CRM_Utils_Array::value('activity_type_id', $params);
        if ($activityName) {
            $activityNameId = array_search(ucfirst($activityName), $activityTypes);
            if (!$activityNameId) {
                return civicrm_create_error(ts('Invalid Activity Name'));
            } else {
                if ($activityTypeId && $activityTypeId != $activityNameId) {
                    return civicrm_create_error(ts('Mismatch in Activity'));
                }
            }
            $params['activity_type_id'] = $activityNameId;
        } else {
            if ($activityTypeId && !array_key_exists($activityTypeId, $activityTypes)) {
                return civicrm_create_error(ts('Invalid Activity Type ID'));
            }
        }
    }
    // check for activity status is passed in
    if (isset($params['status_id'])) {
        require_once "CRM/Core/PseudoConstant.php";
        $activityStatus = CRM_Core_PseudoConstant::activityStatus();
        if (is_numeric($params['status_id']) && !array_key_exists($params['status_id'], $activityStatus)) {
            return civicrm_create_error(ts('Invalid Activity Status'));
        } elseif (!is_numeric($params['status_id'])) {
            $statusId = array_search($params['status_id'], $activityStatus);
            if (!is_numeric($statusId)) {
                return civicrm_create_error(ts('Invalid Activity Status'));
            }
        }
    }
    if (isset($params['priority_id']) && is_numeric($params['priority_id'])) {
        require_once "CRM/Core/PseudoConstant.php";
        $activityPriority = CRM_Core_PseudoConstant::priority();
        if (!array_key_exists($params['priority_id'], $activityStatus)) {
            return civicrm_create_error(ts('Invalid Priority'));
        }
    }
    // check for activity duration minutes
    if (isset($params['duration_minutes']) && !is_numeric($params['duration_minutes'])) {
        return civicrm_create_error(ts('Invalid Activity Duration (in minutes)'));
    }
    // check for source contact id
    if ($addMode && empty($params['source_contact_id'])) {
        return civicrm_create_error(ts('Missing Source Contact'));
    }
    if ($addMode && !CRM_Utils_Array::value('activity_date_time', $params)) {
        $params['activity_date_time'] = CRM_Utils_Date::processDate(date('Y-m-d H:i:s'));
    } else {
        if (CRM_Utils_Array::value('activity_date_time', $params)) {
            $params['activity_date_time'] = CRM_Utils_Date::processDate($params['activity_date_time']);
        }
    }
    return null;
}
示例#2
0
文件: Case.php 项目: bhirsch/voipdev
 /**
  * Function to get Case Activities
  *
  * @param int    $caseID case id
  * @param array  $params posted params 
  * @param int    $contactID contact id
  *
  * @return returns case activities
  *
  * @static
  */
 static function getCaseActivity($caseID, &$params, $contactID)
 {
     $values = array();
     $select = 'SELECT count(ca.id) as ismultiple, ca.id as id, 
                       ca.activity_type_id as type, 
                       cc.sort_name as reporter,
                       cc.id as reporter_id,
                       acc.sort_name AS assignee,
                       acc.id AS assignee_id,
                       IF(ca.activity_date_time < NOW() AND ca.status_id=ov.value,
                         ca.activity_date_time,
                         DATE_ADD(NOW(), INTERVAL 1 YEAR)
                       ) as overdue_date,
                       ca.activity_date_time as display_date,
                       ca.status_id as status, 
                       ca.subject as subject, 
                       ca.is_deleted as deleted,
                       ca.priority_id as priority ';
     $from = 'FROM civicrm_case_activity cca 
               INNER JOIN civicrm_activity ca ON ca.id = cca.activity_id
               INNER JOIN civicrm_contact cc ON cc.id = ca.source_contact_id
               LEFT OUTER JOIN civicrm_option_group og ON og.name="activity_status"
               LEFT OUTER JOIN civicrm_option_value ov ON ov.option_group_id=og.id AND ov.name="Scheduled"
               LEFT JOIN civicrm_activity_assignment caa 
                             ON caa.activity_id = ca.id 
                            LEFT JOIN civicrm_contact acc ON acc.id = caa.assignee_contact_id  ';
     $where = 'WHERE cca.case_id= %1 
                 AND ca.is_current_revision = 1';
     if (CRM_Utils_Array::value('reporter_id', $params)) {
         $where .= " AND ca.source_contact_id = " . CRM_Utils_Type::escape($params['reporter_id'], 'Integer');
     }
     if (CRM_Utils_Array::value('status_id', $params)) {
         $where .= " AND ca.status_id = " . CRM_Utils_Type::escape($params['status_id'], 'Integer');
     }
     if (CRM_Utils_Array::value('activity_deleted', $params)) {
         $where .= " AND ca.is_deleted = 1";
     } else {
         $where .= " AND ca.is_deleted = 0";
     }
     if (CRM_Utils_Array::value('activity_type_id', $params)) {
         $where .= " AND ca.activity_type_id = " . CRM_Utils_Type::escape($params['activity_type_id'], 'Integer');
     }
     if (CRM_Utils_Array::value('activity_date_low', $params)) {
         $fromActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_low']), 'Date');
     }
     if (CRM_Utils_Array::value('activity_date_high', $params)) {
         $toActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_high']), 'Date');
         $toActivityDate = $toActivityDate ? $toActivityDate + 235959 : null;
     }
     if (!empty($fromActivityDate)) {
         $where .= " AND ca.activity_date_time >= '{$fromActivityDate}'";
     }
     if (!empty($toActivityDate)) {
         $where .= " AND ca.activity_date_time <= '{$toActivityDate}'";
     }
     // hack to handle to allow initial sorting to be done by query
     if (CRM_Utils_Array::value('sortname', $params) == 'undefined') {
         $params['sortname'] = null;
     }
     if (CRM_Utils_Array::value('sortorder', $params) == 'undefined') {
         $params['sortorder'] = null;
     }
     $sortname = CRM_Utils_Array::value('sortname', $params);
     $sortorder = CRM_Utils_Array::value('sortorder', $params);
     $groupBy = " GROUP BY ca.id ";
     if (!$sortname and !$sortorder) {
         $orderBy = " ORDER BY overdue_date ASC, display_date DESC";
     } else {
         $orderBy = " ORDER BY {$sortname} {$sortorder}, display_date DESC";
     }
     $page = CRM_Utils_Array::value('page', $params);
     $rp = CRM_Utils_Array::value('rp', $params);
     if (!$page) {
         $page = 1;
     }
     if (!$rp) {
         $rp = 10;
     }
     $start = ($page - 1) * $rp;
     $query = $select . $from . $where . $groupBy . $orderBy;
     $params = array(1 => array($caseID, 'Integer'));
     $dao =& CRM_Core_DAO::executeQuery($query, $params);
     $params['total'] = $dao->N;
     //FIXME: need to optimize/cache these queries
     $limit = " LIMIT {$start}, {$rp}";
     $query .= $limit;
     $dao =& CRM_Core_DAO::executeQuery($query, $params);
     $activityTypes = CRM_Case_PseudoConstant::activityType(false, true);
     require_once "CRM/Utils/Date.php";
     require_once "CRM/Core/PseudoConstant.php";
     $activityStatus = CRM_Core_PseudoConstant::activityStatus();
     $activityPriority = CRM_Core_PseudoConstant::priority();
     $url = CRM_Utils_System::url("civicrm/case/activity", "reset=1&cid={$contactID}&caseid={$caseID}", false, null, false);
     $editUrl = "{$url}&action=update";
     $deleteUrl = "{$url}&action=delete";
     $restoreUrl = "{$url}&action=renew";
     $viewTitle = ts('View this activity.');
     require_once 'CRM/Core/OptionGroup.php';
     $emailActivityTypeIDs = array('Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Email', 'name'), 'Inbound Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Inbound Email', 'name'));
     $activityCondition = " AND v.name IN ('Open Case', 'Change Case Type', 'Change Case Status', 'Change Case Start Date')";
     $caseAttributeActivities = CRM_Core_OptionGroup::values('activity_type', false, false, false, $activityCondition);
     require_once 'CRM/Core/OptionGroup.php';
     $emailActivityTypeIDs = array('Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Email', 'name'), 'Inbound Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Inbound Email', 'name'));
     require_once 'CRM/Case/BAO/Case.php';
     $caseDeleted = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $caseID, 'is_deleted');
     //check for delete activities CRM-4418
     require_once 'CRM/Core/Permission.php';
     $allowToDeleteActivities = CRM_Core_Permission::check('delete activities');
     // define statuses which are handled like Completed status (others are assumed to be handled like Scheduled status)
     $compStatusValues = array();
     $compStatusNames = array('Completed', 'Left Message', 'Cancelled', 'Unreachable', 'Not Required');
     foreach ($compStatusNames as $name) {
         $compStatusValues[] = CRM_Core_OptionGroup::getValue('activity_status', $name, 'name');
     }
     $contactViewUrl = CRM_Utils_System::url("civicrm/contact/view", "reset=1&cid=", false, null, false);
     while ($dao->fetch()) {
         $values[$dao->id]['id'] = $dao->id;
         $values[$dao->id]['type'] = $activityTypes[$dao->type]['label'];
         $values[$dao->id]['reporter'] = "<a href='{$contactViewUrl}{$dao->reporter_id}'>{$dao->reporter}</a>";
         $values[$dao->id]['display_date'] = CRM_Utils_Date::customFormat($dao->display_date);
         $values[$dao->id]['status'] = $activityStatus[$dao->status];
         $values[$dao->id]['subject'] = "<a href='javascript:viewActivity( {$dao->id}, {$contactID} );' title='{$viewTitle}'>{$dao->subject}</a>";
         // add activity assignee to activity selector. CRM-4485.
         if (isset($dao->assignee)) {
             if ($dao->ismultiple == 1) {
                 $values[$dao->id]['reporter'] .= ' / ' . "<a href='{$contactViewUrl}{$dao->assignee_id}'>{$dao->assignee}</a>";
                 $values[$dao->id]['assignee'] = $dao->assignee;
             } else {
                 $values[$dao->id]['reporter'] .= ' / ' . ts('(multiple)');
             }
         }
         $url = "";
         $additionalUrl = "&id={$dao->id}";
         if (!$dao->deleted) {
             //hide edit link of activity type email.CRM-4530.
             if (!in_array($dao->type, $emailActivityTypeIDs)) {
                 $url = "<a href='" . $editUrl . $additionalUrl . "'>" . ts('Edit') . "</a> ";
             }
             //block deleting activities which affects
             //case attributes.CRM-4543
             if (!array_key_exists($dao->type, $caseAttributeActivities) && $allowToDeleteActivities) {
                 if (!empty($url)) {
                     $url .= " | ";
                 }
                 $url .= "<a href='" . $deleteUrl . $additionalUrl . "'>" . ts('Delete') . "</a>";
             }
         } else {
             if (!$caseDeleted) {
                 $url = "<a href='" . $restoreUrl . $additionalUrl . "'>" . ts('Restore') . "</a>";
                 $values[$dao->id]['status'] = $values[$dao->id]['status'] . '<br /> (deleted)';
             }
         }
         $values[$dao->id]['links'] = $url;
         $values[$dao->id]['class'] = "";
         if (!empty($dao->priority)) {
             if ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Urgent', 'name')) {
                 $values[$dao->id]['class'] = $values[$dao->id]['class'] . "priority-urgent ";
             } elseif ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Low', 'name')) {
                 $values[$dao->id]['class'] = $values[$dao->id]['class'] . "priority-low ";
             }
         }
         if (CRM_Utils_Array::crmInArray($dao->status, $compStatusValues)) {
             $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-completed";
         } else {
             if (CRM_Utils_Date::overdue($dao->display_date)) {
                 $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-overdue";
             } else {
                 $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-scheduled";
             }
         }
     }
     $dao->free();
     return $values;
 }
 /**
  * Function to get Case Activities
  *
  * @param int    $caseID case id
  * @param array  $params posted params
  * @param int    $contactID contact id
  *
  * @return returns case activities
  *
  * @static
  */
 static function getCaseActivity($caseID, &$params, $contactID, $context = NULL, $userID = NULL, $type = NULL)
 {
     $values = array();
     // CRM-5081 - formatting the dates to omit seconds.
     // Note the 00 in the date format string is needed otherwise later on it thinks scheduled ones are overdue.
     $select = "SELECT count(ca.id) as ismultiple, ca.id as id, \n                          ca.activity_type_id as type,\n                          ca.activity_type_id as activity_type_id,  \n                          cc.sort_name as reporter,\n                          cc.id as reporter_id,\n                          acc.sort_name AS assignee,\n                          acc.id AS assignee_id,\n                          DATE_FORMAT(IF(ca.activity_date_time < NOW() AND ca.status_id=ov.value,\n                            ca.activity_date_time,\n                            DATE_ADD(NOW(), INTERVAL 1 YEAR)\n                          ), '%Y%m%d%H%i00') as overdue_date,\n                          DATE_FORMAT(ca.activity_date_time, '%Y%m%d%H%i00') as display_date,\n                          ca.status_id as status, \n                          ca.subject as subject, \n                          ca.is_deleted as deleted,\n                          ca.priority_id as priority,\n                          ca.weight as weight ";
     $from = 'FROM civicrm_case_activity cca 
               INNER JOIN civicrm_activity ca ON ca.id = cca.activity_id
               INNER JOIN civicrm_contact cc ON cc.id = ca.source_contact_id
               INNER JOIN civicrm_option_group cog ON cog.name = "activity_type"
               INNER JOIN civicrm_option_value cov ON cov.option_group_id = cog.id 
                      AND cov.value = ca.activity_type_id AND cov.is_active = 1
               LEFT OUTER JOIN civicrm_option_group og ON og.name="activity_status"
               LEFT OUTER JOIN civicrm_option_value ov ON ov.option_group_id=og.id AND ov.name="Scheduled"
               LEFT JOIN civicrm_activity_assignment caa 
                             ON caa.activity_id = ca.id 
                            LEFT JOIN civicrm_contact acc ON acc.id = caa.assignee_contact_id  ';
     $where = 'WHERE cca.case_id= %1 
                 AND ca.is_current_revision = 1';
     if (CRM_Utils_Array::value('reporter_id', $params)) {
         $where .= " AND ca.source_contact_id = " . CRM_Utils_Type::escape($params['reporter_id'], 'Integer');
     }
     if (CRM_Utils_Array::value('status_id', $params)) {
         $where .= " AND ca.status_id = " . CRM_Utils_Type::escape($params['status_id'], 'Integer');
     }
     if (CRM_Utils_Array::value('activity_deleted', $params)) {
         $where .= " AND ca.is_deleted = 1";
     } else {
         $where .= " AND ca.is_deleted = 0";
     }
     if (CRM_Utils_Array::value('activity_type_id', $params)) {
         $where .= " AND ca.activity_type_id = " . CRM_Utils_Type::escape($params['activity_type_id'], 'Integer');
     }
     if (CRM_Utils_Array::value('activity_date_low', $params)) {
         $fromActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_low']), 'Date');
     }
     if (CRM_Utils_Array::value('activity_date_high', $params)) {
         $toActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_high']), 'Date');
         $toActivityDate = $toActivityDate ? $toActivityDate + 235959 : NULL;
     }
     if (!empty($fromActivityDate)) {
         $where .= " AND ca.activity_date_time >= '{$fromActivityDate}'";
     }
     if (!empty($toActivityDate)) {
         $where .= " AND ca.activity_date_time <= '{$toActivityDate}'";
     }
     // hack to handle to allow initial sorting to be done by query
     if (CRM_Utils_Array::value('sortname', $params) == 'undefined') {
         $params['sortname'] = NULL;
     }
     if (CRM_Utils_Array::value('sortorder', $params) == 'undefined') {
         $params['sortorder'] = NULL;
     }
     $sortname = CRM_Utils_Array::value('sortname', $params);
     $sortorder = CRM_Utils_Array::value('sortorder', $params);
     $groupBy = " GROUP BY ca.id ";
     if (!$sortname and !$sortorder) {
         // CRM-5081 - added id to act like creation date
         $orderBy = " ORDER BY overdue_date ASC, display_date DESC, weight DESC";
     } else {
         $orderBy = " ORDER BY {$sortname} {$sortorder}";
         if ($sortname != 'display_date') {
             $orderBy .= ', display_date DESC';
         }
     }
     $page = CRM_Utils_Array::value('page', $params);
     $rp = CRM_Utils_Array::value('rp', $params);
     if (!$page) {
         $page = 1;
     }
     if (!$rp) {
         $rp = 10;
     }
     $start = ($page - 1) * $rp;
     $query = $select . $from . $where . $groupBy . $orderBy;
     $params = array(1 => array($caseID, 'Integer'));
     $dao = CRM_Core_DAO::executeQuery($query, $params);
     $params['total'] = $dao->N;
     //FIXME: need to optimize/cache these queries
     $limit = " LIMIT {$start}, {$rp}";
     $query .= $limit;
     $dao = CRM_Core_DAO::executeQuery($query, $params);
     $activityTypes = CRM_Case_PseudoConstant::caseActivityType(FALSE, TRUE);
     $activityStatus = CRM_Core_PseudoConstant::activityStatus();
     $activityPriority = CRM_Core_PseudoConstant::priority();
     $url = CRM_Utils_System::url("civicrm/case/activity", "reset=1&cid={$contactID}&caseid={$caseID}", FALSE, NULL, FALSE);
     $contextUrl = '';
     if ($context == 'fulltext') {
         $contextUrl = "&context={$context}";
     }
     $editUrl = "{$url}&action=update{$contextUrl}";
     $deleteUrl = "{$url}&action=delete{$contextUrl}";
     $restoreUrl = "{$url}&action=renew{$contextUrl}";
     $viewTitle = ts('View this activity.');
     $statusTitle = ts('Edit status');
     $emailActivityTypeIDs = array('Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Email', 'name'), 'Inbound Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Inbound Email', 'name'));
     $emailActivityTypeIDs = array('Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Email', 'name'), 'Inbound Email' => CRM_Core_OptionGroup::getValue('activity_type', 'Inbound Email', 'name'));
     $caseDeleted = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $caseID, 'is_deleted');
     // define statuses which are handled like Completed status (others are assumed to be handled like Scheduled status)
     $compStatusValues = array();
     $compStatusNames = array('Completed', 'Left Message', 'Cancelled', 'Unreachable', 'Not Required');
     foreach ($compStatusNames as $name) {
         $compStatusValues[] = CRM_Core_OptionGroup::getValue('activity_status', $name, 'name');
     }
     $contactViewUrl = CRM_Utils_System::url("civicrm/contact/view", "reset=1&cid=", FALSE, NULL, FALSE);
     $hasViewContact = CRM_Core_Permission::giveMeAllACLs();
     $clientIds = self::retrieveContactIdsByCaseId($caseID);
     if (!$userID) {
         $session = CRM_Core_Session::singleton();
         $userID = $session->get('userID');
     }
     while ($dao->fetch()) {
         $allowView = self::checkPermission($dao->id, 'view', $dao->activity_type_id, $userID);
         $allowEdit = self::checkPermission($dao->id, 'edit', $dao->activity_type_id, $userID);
         $allowDelete = self::checkPermission($dao->id, 'delete', $dao->activity_type_id, $userID);
         //do not have sufficient permission
         //to access given case activity record.
         if (!$allowView && !$allowEdit && !$allowDelete) {
             continue;
         }
         $values[$dao->id]['id'] = $dao->id;
         $values[$dao->id]['type'] = $activityTypes[$dao->type]['label'];
         $reporterName = $dao->reporter;
         if ($hasViewContact) {
             $reporterName = '<a href="' . $contactViewUrl . $dao->reporter_id . '">' . $dao->reporter . '</a>';
         }
         $values[$dao->id]['reporter'] = $reporterName;
         $targetNames = CRM_Activity_BAO_ActivityTarget::getTargetNames($dao->id);
         $targetContactUrls = $withContacts = array();
         foreach ($targetNames as $targetId => $targetName) {
             if (!in_array($targetId, $clientIds)) {
                 $withContacts[$targetId] = $targetName;
             }
         }
         foreach ($withContacts as $cid => $name) {
             if ($hasViewContact) {
                 $name = '<a href="' . $contactViewUrl . $cid . '">' . $name . '</a>';
             }
             $targetContactUrls[] = $name;
         }
         $values[$dao->id]['with_contacts'] = implode('; ', $targetContactUrls);
         $values[$dao->id]['display_date'] = CRM_Utils_Date::customFormat($dao->display_date);
         $values[$dao->id]['status'] = $activityStatus[$dao->status];
         //check for view activity.
         $subject = empty($dao->subject) ? '(' . ts('no subject') . ')' : $dao->subject;
         if ($allowView) {
             $subject = '<a href="javascript:' . $type . 'viewActivity(' . $dao->id . ',' . $contactID . ',' . '\'' . $type . '\' );" title=\'' . $viewTitle . '\'>' . $subject . '</a>';
         }
         $values[$dao->id]['subject'] = $subject;
         // add activity assignee to activity selector. CRM-4485.
         if (isset($dao->assignee)) {
             if ($dao->ismultiple == 1) {
                 if ($dao->reporter_id != $dao->assignee_id) {
                     $values[$dao->id]['reporter'] .= $hasViewContact ? ' / ' . "<a href='{$contactViewUrl}{$dao->assignee_id}'>{$dao->assignee}</a>" : ' / ' . $dao->assignee;
                 }
                 $values[$dao->id]['assignee'] = $dao->assignee;
             } else {
                 $values[$dao->id]['reporter'] .= ' / ' . ts('(multiple)');
             }
         }
         $url = "";
         $additionalUrl = "&id={$dao->id}";
         if (!$dao->deleted) {
             //hide edit link of activity type email.CRM-4530.
             if (!in_array($dao->type, $emailActivityTypeIDs)) {
                 //hide Edit link if activity type is NOT editable (special case activities).CRM-5871
                 if ($allowEdit) {
                     $url = '<a href="' . $editUrl . $additionalUrl . '">' . ts('Edit') . '</a> ';
                 }
             }
             if ($allowDelete) {
                 if (!empty($url)) {
                     $url .= " | ";
                 }
                 $url .= '<a href="' . $deleteUrl . $additionalUrl . '">' . ts('Delete') . '</a>';
             }
         } elseif (!$caseDeleted) {
             $url = '<a href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>';
             $values[$dao->id]['status'] = $values[$dao->id]['status'] . '<br /> (deleted)';
         }
         //check for operations.
         if (self::checkPermission($dao->id, 'Move To Case', $dao->activity_type_id)) {
             $url .= " | " . '<a href="#" onClick="Javascript:fileOnCase( \'move\',' . $dao->id . ', ' . $caseID . ' ); return false;">' . ts('Move To Case') . '</a> ';
         }
         if (self::checkPermission($dao->id, 'Copy To Case', $dao->activity_type_id)) {
             $url .= " | " . '<a href="#" onClick="Javascript:fileOnCase( \'copy\',' . $dao->id . ',' . $caseID . ' ); return false;">' . ts('Copy To Case') . '</a> ';
         }
         $values[$dao->id]['links'] = $url;
         $values[$dao->id]['class'] = "";
         if (!empty($dao->priority)) {
             if ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Urgent', 'name')) {
                 $values[$dao->id]['class'] = $values[$dao->id]['class'] . "priority-urgent ";
             } elseif ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Low', 'name')) {
                 $values[$dao->id]['class'] = $values[$dao->id]['class'] . "priority-low ";
             }
         }
         if (CRM_Utils_Array::crmInArray($dao->status, $compStatusValues)) {
             $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-completed";
         } else {
             if (CRM_Utils_Date::overdue($dao->display_date)) {
                 $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-overdue";
             } else {
                 $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-scheduled";
             }
         }
         if ($allowEdit) {
             $values[$dao->id]['status'] = '<a class="crm-activity-status crm-activity-status-' . $dao->id . ' ' . $values[$dao->id]['class'] . '" href="javascript:changeActivityStatus(' . $dao->id . ',' . $contactID . ',' . $dao->status . ');" title=\'' . $statusTitle . '\'>' . $values[$dao->id]['status'] . '</a>';
         }
     }
     $dao->free();
     return $values;
 }
 /**
  * Get all Priorities
  *
  * The static array Priority is returned
  *
  * @access public
  * @static
  * @return array - array reference of all Priority
  */
 public static function &priority()
 {
     if (!self::$priority) {
         require_once 'CRM/Core/OptionGroup.php';
         self::$priority = CRM_Core_OptionGroup::values('priority');
     }
     return self::$priority;
 }
示例#5
0
 /**
  * This function sets the default values for the form. For edit/view mode
  * the default values are retrieved from the database
  * 
  * @access public
  * @return None
  */
 function setDefaultValues()
 {
     if ($this->_cdType) {
         return CRM_Custom_Form_CustomData::setDefaultValues($this);
     }
     $defaults = array();
     $params = array();
     $config =& CRM_Core_Config::singleton();
     // if we're editing...
     if (isset($this->_activityId)) {
         $params = array('id' => $this->_activityId);
         CRM_Activity_BAO_Activity::retrieve($params, $defaults);
         $defaults['source_contact_qid'] = $defaults['source_contact_id'];
         $defaults['source_contact_id'] = $defaults['source_contact'];
         if (!CRM_Utils_Array::crmIsEmptyArray($defaults['target_contact'])) {
             $target_contact_value = explode(';', trim($defaults['target_contact_value']));
             $this->assign('target_contact', array_combine(array_unique($defaults['target_contact']), $target_contact_value));
         }
         if (!CRM_Utils_Array::crmIsEmptyArray($defaults['assignee_contact'])) {
             $assignee_contact_value = explode(';', trim($defaults['assignee_contact_value']));
             $this->assign('assignee_contact', array_combine($defaults['assignee_contact'], $assignee_contact_value));
         }
         if (!CRM_Utils_Array::value('activity_date_time', $defaults)) {
             list($defaults['activity_date_time'], $defaults['activity_date_time_time']) = CRM_Utils_Date::setDateDefaults(null, 'activityDateTime');
         } else {
             if ($this->_action & CRM_Core_Action::UPDATE) {
                 list($defaults['activity_date_time'], $defaults['activity_date_time_time']) = CRM_Utils_Date::setDateDefaults($defaults['activity_date_time'], 'activityDateTime');
             }
         }
         //set the assigneed contact count to template
         if (!empty($defaults['assignee_contact'])) {
             $this->assign('assigneeContactCount', count($defaults['assignee_contact']));
         } else {
             $this->assign('assigneeContactCount', 1);
         }
         //set the target contact count to template
         if (!empty($defaults['target_contact'])) {
             $this->assign('targetContactCount', count($defaults['target_contact']));
         } else {
             $this->assign('targetContactCount', 1);
         }
         if ($this->_context != 'standalone') {
             $this->assign('target_contact_value', CRM_Utils_Array::value('target_contact_value', $defaults));
             $this->assign('assignee_contact_value', CRM_Utils_Array::value('assignee_contact_value', $defaults));
             $this->assign('source_contact_value', CRM_Utils_Array::value('source_contact', $defaults));
         }
     } else {
         // if it's a new activity, we need to set default values for associated contact fields
         // since those are jQuery fields, unfortunately we cannot use defaults directly
         $this->_sourceContactId = $this->_currentUserId;
         $this->_targetContactId = $this->_currentlyViewedContactId;
         $target_contact = array();
         $defaults['source_contact_id'] = self::_getDisplayNameById($this->_sourceContactId);
         $defaults['source_contact_qid'] = $this->_sourceContactId;
         if ($this->_context != 'standalone' && isset($this->_targetContactId)) {
             $target_contact[$this->_targetContactId] = self::_getDisplayNameById($this->_targetContactId);
         }
         $this->assign('target_contact', $target_contact);
         list($defaults['activity_date_time'], $defaults['activity_date_time_time']) = CRM_Utils_Date::setDateDefaults(null, 'activityDateTime');
     }
     if ($this->_activityTypeId) {
         $defaults["activity_type_id"] = $this->_activityTypeId;
     }
     if ($this->_action & (CRM_Core_Action::DELETE | CRM_Core_Action::RENEW)) {
         $this->assign('delName', $defaults['subject']);
     }
     if ($this->_activityTypeFile) {
         eval('$defaults += CRM_' . $this->_crmDir . '_Form_Activity_' . $this->_activityTypeFile . '::setDefaultValues($this);');
     }
     if (!CRM_Utils_Array::value('priority_id', $defaults)) {
         require_once 'CRM/Core/PseudoConstant.php';
         $priority = CRM_Core_PseudoConstant::priority();
         $defaults['priority_id'] = array_search('Normal', $priority);
     }
     return $defaults;
 }
示例#6
0
 /**
  * Function to process the activities
  *
  * @param object $form         form object
  * @param array  $params       associated array of the submitted values
  * @param array  $ids          array of ids
  * @param string $activityType activity Type
  * @param boolean $record   true if it is Record Activity 
  * @access public
  * @return
  */
 public function create(&$params)
 {
     // check required params
     if (!self::dataExists($params)) {
         CRM_Core_Error::fatal('Not enough data to create activity object,');
     }
     $activity =& new CRM_Activity_DAO_Activity();
     if (!CRM_Utils_Array::value('status_id', $params)) {
         if (isset($params['activity_date_time']) && strcmp($params['activity_date_time'], CRM_Utils_Date::processDate(date('Ymd')) == -1)) {
             $params['status_id'] = 2;
         } else {
             $params['status_id'] = 1;
         }
     }
     //set priority to Normal for Auto-populated activities (for Cases)
     if (!CRM_Utils_Array::value('priority_id', $params)) {
         require_once 'CRM/Core/PseudoConstant.php';
         $priority = CRM_Core_PseudoConstant::priority();
         $params['priority_id'] = array_search('Normal', $priority);
     }
     if (empty($params['id'])) {
         unset($params['id']);
     }
     if (!empty($params['target_contact_id']) && is_array($params['target_contact_id'])) {
         $params['target_contact_id'] = array_unique($params['target_contact_id']);
     }
     if (!empty($params['assignee_contact_id']) && is_array($params['assignee_contact_id'])) {
         $params['assignee_contact_id'] = array_unique($params['assignee_contact_id']);
     }
     $activity->copyValues($params);
     // start transaction
     require_once 'CRM/Core/Transaction.php';
     $transaction = new CRM_Core_Transaction();
     $result = $activity->save();
     if (is_a($result, 'CRM_Core_Error')) {
         $transaction->rollback();
         return $result;
     }
     $activityId = $activity->id;
     // check and attach and files as needed
     require_once 'CRM/Core/BAO/File.php';
     CRM_Core_BAO_File::processAttachment($params, 'civicrm_activity', $activityId);
     // attempt to save activity assignment
     $resultAssignment = null;
     if (CRM_Utils_Array::value('assignee_contact_id', $params)) {
         require_once 'CRM/Activity/BAO/ActivityAssignment.php';
         $assignmentParams = array('activity_id' => $activityId);
         if (is_array($params['assignee_contact_id'])) {
             if (CRM_Utils_Array::value('deleteActivityAssignment', $params, true)) {
                 // first delete existing assignments if any
                 self::deleteActivityAssignment($activityId);
             }
             foreach ($params['assignee_contact_id'] as $acID) {
                 if ($acID) {
                     $assignmentParams['assignee_contact_id'] = $acID;
                     $resultAssignment = CRM_Activity_BAO_ActivityAssignment::create($assignmentParams);
                     if (is_a($resultAssignment, 'CRM_Core_Error')) {
                         $transaction->rollback();
                         return $resultAssignment;
                     }
                 }
             }
         } else {
             $assignmentParams['assignee_contact_id'] = $params['assignee_contact_id'];
             if (CRM_Utils_Array::value('id', $params)) {
                 $assignment =& new CRM_Activity_BAO_ActivityAssignment();
                 $assignment->activity_id = $activityId;
                 $assignment->find(true);
                 if ($assignment->assignee_contact_id != $params['assignee_contact_id']) {
                     $assignmentParams['id'] = $assignment->id;
                     $resultAssignment = CRM_Activity_BAO_ActivityAssignment::create($assignmentParams);
                 }
             } else {
                 $resultAssignment = CRM_Activity_BAO_ActivityAssignment::create($assignmentParams);
             }
         }
     } else {
         if (CRM_Utils_Array::value('deleteActivityAssignment', $params, true)) {
             self::deleteActivityAssignment($activityId);
         }
     }
     if (is_a($resultAssignment, 'CRM_Core_Error')) {
         $transaction->rollback();
         return $resultAssignment;
     }
     // attempt to save activity targets
     $resultTarget = null;
     if (CRM_Utils_Array::value('target_contact_id', $params)) {
         $targetParams = array('activity_id' => $activityId);
         $resultTarget = array();
         if (is_array($params['target_contact_id'])) {
             if (CRM_Utils_Array::value('deleteActivityTarget', $params, true)) {
                 // first delete existing targets if any
                 self::deleteActivityTarget($activityId);
             }
             foreach ($params['target_contact_id'] as $tid) {
                 if ($tid) {
                     $targetParams['target_contact_id'] = $tid;
                     $resultTarget = CRM_Activity_BAO_ActivityTarget::create($targetParams);
                     if (is_a($resultTarget, 'CRM_Core_Error')) {
                         $transaction->rollback();
                         return $resultTarget;
                     }
                 }
             }
         } else {
             $targetParams['target_contact_id'] = $params['target_contact_id'];
             if (CRM_Utils_Array::value('id', $params)) {
                 $target =& new CRM_Activity_BAO_ActivityTarget();
                 $target->activity_id = $activityId;
                 $target->find(true);
                 if ($target->target_contact_id != $params['target_contact_id']) {
                     $targetParams['id'] = $target->id;
                     $resultTarget = CRM_Activity_BAO_ActivityTarget::create($targetParams);
                 }
             } else {
                 $resultTarget = CRM_Activity_BAO_ActivityTarget::create($targetParams);
             }
         }
     } else {
         if (CRM_Utils_Array::value('deleteActivityTarget', $params, true)) {
             self::deleteActivityTarget($activityId);
         }
     }
     // write to changelog before transation is committed/rolled
     // back (and prepare status to display)
     if (CRM_Utils_Array::value('id', $params)) {
         $logMsg = "Activity (id: {$result->id} ) updated with ";
     } else {
         $logMsg = "Activity created for ";
     }
     $msgs = array();
     if (isset($params['source_contact_id'])) {
         $msgs[] = "source={$params['source_contact_id']}";
     }
     if (CRM_Utils_Array::value('target_contact_id', $params)) {
         if (is_array($params['target_contact_id']) && !CRM_Utils_array::crmIsEmptyArray($params['target_contact_id'])) {
             $msgs[] = "target=" . implode(',', $params['target_contact_id']);
             // take only first target
             // will be used for recently viewed display
             $t = array_slice($params['target_contact_id'], 0, 1);
             $recentContactId = $t[0];
         } else {
             if (isset($params['target_contact_id'])) {
                 $msgs[] = "target={$params['target_contact_id']}";
                 // will be used for recently viewed display
                 $recentContactId = $params['target_contact_id'];
             }
         }
     } else {
         // at worst, take source for recently viewed display
         $recentContactId = $params['source_contact_id'];
     }
     if (isset($params['assignee_contact_id'])) {
         if (is_array($params['assignee_contact_id'])) {
             $msgs[] = "assignee=" . implode(',', $params['assignee_contact_id']);
         } else {
             $msgs[] = "assignee={$params['assignee_contact_id']}";
         }
     }
     $logMsg .= implode(', ', $msgs);
     self::logActivityAction($result, $logMsg);
     if (CRM_Utils_Array::value('custom', $params) && is_array($params['custom'])) {
         require_once 'CRM/Core/BAO/CustomValueTable.php';
         CRM_Core_BAO_CustomValueTable::store($params['custom'], 'civicrm_activity', $result->id);
     }
     $transaction->commit();
     if (!CRM_Utils_Array::value('skipRecentView', $params)) {
         require_once 'CRM/Utils/Recent.php';
         if (CRM_Utils_Array::value('case_id', $params)) {
             $caseContactID = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseContact', $params['case_id'], 'contact_id', 'case_id');
             $url = CRM_Utils_System::url('civicrm/case/activity/view', "reset=1&aid={$activity->id}&cid={$caseContactID}&caseID={$params['case_id']}&context=home");
         } else {
             $q = "action=view&reset=1&id={$activity->id}&atype={$activity->activity_type_id}&cid={$activity->source_contact_id}&context=home";
             if ($activity->activity_type_id != CRM_Core_OptionGroup::getValue('activity_type', 'Email', 'name')) {
                 $url = CRM_Utils_System::url('civicrm/contact/view/activity', $q);
             } else {
                 $url = CRM_Utils_System::url('civicrm/activity', $q);
             }
         }
         if (!isset($activity->parent_id)) {
             require_once 'CRM/Contact/BAO/Contact.php';
             $recentContactDisplay = CRM_Contact_BAO_Contact::displayName($recentContactId);
             // add the recently created Activity
             $activityTypes = CRM_Core_Pseudoconstant::activityType(true, true);
             $activitySubject = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activity->id, 'subject');
             $title = "";
             if (isset($activitySubject)) {
                 $title = $activitySubject . ' - ';
             }
             $title = $title . $recentContactDisplay . ' (' . $activityTypes[$activity->activity_type_id] . ')';
             CRM_Utils_Recent::add($title, $url, $activity->id, 'Activity', $recentContactId, $recentContactDisplay);
         }
     }
     if (CRM_Utils_Array::value('id', $params)) {
         CRM_Utils_Hook::post('edit', 'Activity', $activity->id, $activity);
     } else {
         CRM_Utils_Hook::post('create', 'Activity', $activity->id, $activity);
     }
     return $result;
 }
 function __construct()
 {
     $this->_columns = array('civicrm_contact' => array('dao' => 'CRM_Contact_DAO_Contact', 'fields' => array('id' => array('required' => true, 'no_display' => true), 'display_name' => array('title' => ts('Contact Name'), 'default' => true, 'no_repeat' => true)), 'filters' => array('sort_name' => array('title' => ts('Contact Name'))), 'group_bys' => array('display_name' => array('name' => 'id', 'title' => ts('Contact'), 'default' => true)), 'grouping' => 'contact-fields'), 'civicrm_email' => array('dao' => 'CRM_Core_DAO_Email', 'fields' => array('email' => array('title' => 'Email', 'default' => true)), 'grouping' => 'contact-fields'), 'civicrm_phone' => array('dao' => 'CRM_Core_DAO_Email', 'fields' => array('phone' => array('title' => 'Phone')), 'grouping' => 'contact-fields'), 'civicrm_activity' => array('dao' => 'CRM_Activity_DAO_Activity', 'fields' => array('activity_type_id' => array('title' => ts('Activity Type'), 'default' => true, 'type' => CRM_Utils_Type::T_STRING), 'id' => array('title' => 'Total Activities', 'required' => true, 'statistics' => array('count' => ts('Activity Count')))), 'filters' => array('activity_date_time' => array('operatorType' => CRM_Report_Form::OP_DATE), 'activity_type_id' => array('title' => ts('Activity Type'), 'operatorType' => CRM_Report_Form::OP_MULTISELECT, 'options' => CRM_Core_PseudoConstant::activityType()), 'status_id' => array('title' => ts('Activity Status'), 'operatorType' => CRM_Report_Form::OP_MULTISELECT, 'options' => CRM_Core_PseudoConstant::activityStatus()), 'priority_id' => array('title' => ts('Priority'), 'operatorType' => CRM_Report_Form::OP_MULTISELECT, 'options' => CRM_Core_PseudoConstant::priority())), 'group_bys' => array('activity_date_time' => array('title' => ts('Activity Date'), 'frequency' => true), 'activity_type_id' => array('title' => ts('Activity Type'), 'default' => true)), 'grouping' => 'activity-fields', 'alias' => 'activity'));
     parent::__construct();
 }
 /**
  * Get all Priorities
  *
  * The static array Priority is returned
  *
  * @access public
  * @static
  *
  * @return array - array reference of all Priority
  */
 public static function &priority()
 {
     if (!self::$priority) {
         self::$priority = CRM_Core_OptionGroup::values('priority');
     }
     return self::$priority;
 }
 /**
  * Function to process the activities
  *
  * @param object $form         form object
  * @param array  $params       associated array of the submitted values
  * @param array  $ids          array of ids
  * @param string $activityType activity Type
  * @param boolean $record   true if it is Record Activity
  * @access public
  *
  * @return
  */
 public static function create(&$params)
 {
     // check required params
     if (!self::dataExists($params)) {
         CRM_Core_Error::fatal('Not enough data to create activity object,');
     }
     $activity = new CRM_Activity_DAO_Activity();
     if (isset($params['id']) && empty($params['id'])) {
         unset($params['id']);
     }
     if (!CRM_Utils_Array::value('status_id', $params) && !CRM_Utils_Array::value('activity_status_id', $params) && !CRM_Utils_Array::value('id', $params)) {
         if (isset($params['activity_date_time']) && strcmp($params['activity_date_time'], CRM_Utils_Date::processDate(date('Ymd')) == -1)) {
             $params['status_id'] = 2;
         } else {
             $params['status_id'] = 1;
         }
     }
     //set priority to Normal for Auto-populated activities (for Cases)
     if (CRM_Utils_Array::value('priority_id', $params) === NULL && !CRM_Utils_Array::value('id', $params)) {
         $priority = CRM_Core_PseudoConstant::priority();
         $params['priority_id'] = array_search('Normal', $priority);
     }
     if (!empty($params['target_contact_id']) && is_array($params['target_contact_id'])) {
         $params['target_contact_id'] = array_unique($params['target_contact_id']);
     }
     if (!empty($params['assignee_contact_id']) && is_array($params['assignee_contact_id'])) {
         $params['assignee_contact_id'] = array_unique($params['assignee_contact_id']);
     }
     // CRM-9137
     if (CRM_Utils_Array::value('id', $params)) {
         CRM_Utils_Hook::pre('edit', 'Activity', $activity->id, $params);
     } else {
         CRM_Utils_Hook::pre('create', 'Activity', NULL, $params);
     }
     $activity->copyValues($params);
     if (isset($params['case_id'])) {
         // CRM-8708, preserve case ID even though it's not part of the SQL model
         $activity->case_id = $params['case_id'];
     } elseif (is_numeric($activity->id)) {
         // CRM-8708, preserve case ID even though it's not part of the SQL model
         $activity->case_id = CRM_Case_BAO_Case::getCaseIdByActivityId($activity->id);
     }
     // start transaction
     $transaction = new CRM_Core_Transaction();
     $result = $activity->save();
     if (is_a($result, 'CRM_Core_Error')) {
         $transaction->rollback();
         return $result;
     }
     $activityId = $activity->id;
     // check and attach and files as needed
     CRM_Core_BAO_File::processAttachment($params, 'civicrm_activity', $activityId);
     // attempt to save activity assignment
     $resultAssignment = NULL;
     if (CRM_Utils_Array::value('assignee_contact_id', $params)) {
         $assignmentParams = array('activity_id' => $activityId);
         if (is_array($params['assignee_contact_id'])) {
             if (CRM_Utils_Array::value('deleteActivityAssignment', $params, TRUE)) {
                 // first delete existing assignments if any
                 self::deleteActivityAssignment($activityId);
             }
             $values = array();
             foreach ($params['assignee_contact_id'] as $acID) {
                 if ($acID) {
                     $values[] = "( {$activityId}, {$acID} )";
                 }
             }
             while (!empty($values)) {
                 $input = array_splice($values, 0, CRM_Core_DAO::BULK_INSERT_COUNT);
                 $str = implode(',', $input);
                 $sql = "INSERT INTO civicrm_activity_assignment ( activity_id, assignee_contact_id ) VALUES {$str};";
                 CRM_Core_DAO::executeQuery($sql);
             }
         } else {
             $assignmentParams['assignee_contact_id'] = $params['assignee_contact_id'];
             if (CRM_Utils_Array::value('id', $params)) {
                 $assignment = new CRM_Activity_BAO_ActivityAssignment();
                 $assignment->activity_id = $activityId;
                 $assignment->find(TRUE);
                 if ($assignment->assignee_contact_id != $params['assignee_contact_id']) {
                     $assignmentParams['id'] = $assignment->id;
                     $resultAssignment = CRM_Activity_BAO_ActivityAssignment::create($assignmentParams);
                 }
             } else {
                 $resultAssignment = CRM_Activity_BAO_ActivityAssignment::create($assignmentParams);
             }
         }
     } else {
         if (CRM_Utils_Array::value('deleteActivityAssignment', $params, TRUE)) {
             self::deleteActivityAssignment($activityId);
         }
     }
     if (is_a($resultAssignment, 'CRM_Core_Error')) {
         $transaction->rollback();
         return $resultAssignment;
     }
     // attempt to save activity targets
     $resultTarget = NULL;
     if (CRM_Utils_Array::value('target_contact_id', $params)) {
         $targetParams = array('activity_id' => $activityId);
         $resultTarget = array();
         if (is_array($params['target_contact_id'])) {
             if (CRM_Utils_Array::value('deleteActivityTarget', $params, TRUE)) {
                 // first delete existing targets if any
                 self::deleteActivityTarget($activityId);
             }
             $values = array();
             foreach ($params['target_contact_id'] as $tid) {
                 if ($tid) {
                     $values[] = "( {$activityId}, {$tid} )";
                 }
             }
             while (!empty($values)) {
                 $input = array_splice($values, 0, CRM_Core_DAO::BULK_INSERT_COUNT);
                 $str = implode(',', $input);
                 $sql = "INSERT INTO civicrm_activity_target ( activity_id, target_contact_id ) VALUES {$str};";
                 CRM_Core_DAO::executeQuery($sql);
             }
         } else {
             $targetParams['target_contact_id'] = $params['target_contact_id'];
             if (CRM_Utils_Array::value('id', $params)) {
                 $target = new CRM_Activity_BAO_ActivityTarget();
                 $target->activity_id = $activityId;
                 $target->find(TRUE);
                 if ($target->target_contact_id != $params['target_contact_id']) {
                     $targetParams['id'] = $target->id;
                     $resultTarget = CRM_Activity_BAO_ActivityTarget::create($targetParams);
                 }
             } else {
                 $resultTarget = CRM_Activity_BAO_ActivityTarget::create($targetParams);
             }
         }
     } else {
         if (CRM_Utils_Array::value('deleteActivityTarget', $params, TRUE)) {
             self::deleteActivityTarget($activityId);
         }
     }
     // write to changelog before transation is committed/rolled
     // back (and prepare status to display)
     if (CRM_Utils_Array::value('id', $params)) {
         $logMsg = "Activity (id: {$result->id} ) updated with ";
     } else {
         $logMsg = "Activity created for ";
     }
     $msgs = array();
     if (isset($params['source_contact_id'])) {
         $msgs[] = "source={$params['source_contact_id']}";
     }
     if (CRM_Utils_Array::value('target_contact_id', $params)) {
         if (is_array($params['target_contact_id']) && !CRM_Utils_array::crmIsEmptyArray($params['target_contact_id'])) {
             $msgs[] = "target=" . implode(',', $params['target_contact_id']);
             // take only first target
             // will be used for recently viewed display
             $t = array_slice($params['target_contact_id'], 0, 1);
             $recentContactId = $t[0];
         } elseif (isset($params['target_contact_id'])) {
             $msgs[] = "target={$params['target_contact_id']}";
             // will be used for recently viewed display
             $recentContactId = $params['target_contact_id'];
         }
     } else {
         // at worst, take source for recently viewed display
         $recentContactId = CRM_Utils_Array::value('source_contact_id', $params);
     }
     if (isset($params['assignee_contact_id'])) {
         if (is_array($params['assignee_contact_id'])) {
             $msgs[] = "assignee=" . implode(',', $params['assignee_contact_id']);
         } else {
             $msgs[] = "assignee={$params['assignee_contact_id']}";
         }
     }
     $logMsg .= implode(', ', $msgs);
     self::logActivityAction($result, $logMsg);
     if (CRM_Utils_Array::value('custom', $params) && is_array($params['custom'])) {
         CRM_Core_BAO_CustomValueTable::store($params['custom'], 'civicrm_activity', $result->id);
     }
     $transaction->commit();
     if (!CRM_Utils_Array::value('skipRecentView', $params)) {
         $recentOther = array();
         if (CRM_Utils_Array::value('case_id', $params)) {
             $caseContactID = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseContact', $params['case_id'], 'contact_id', 'case_id');
             $url = CRM_Utils_System::url('civicrm/case/activity/view', "reset=1&aid={$activity->id}&cid={$caseContactID}&caseID={$params['case_id']}&context=home");
         } else {
             $q = "action=view&reset=1&id={$activity->id}&atype={$activity->activity_type_id}&cid={$activity->source_contact_id}&context=home";
             if ($activity->activity_type_id != CRM_Core_OptionGroup::getValue('activity_type', 'Email', 'name')) {
                 $url = CRM_Utils_System::url('civicrm/activity', $q);
                 if ($activity->activity_type_id == CRM_Core_OptionGroup::getValue('activity_type', 'Print PDF Letter', 'name')) {
                     $recentOther['editUrl'] = CRM_Utils_System::url('civicrm/activity/pdf/add', "action=update&reset=1&id={$activity->id}&atype={$activity->activity_type_id}&cid={$activity->source_contact_id}&context=home");
                 } else {
                     $recentOther['editUrl'] = CRM_Utils_System::url('civicrm/activity/add', "action=update&reset=1&id={$activity->id}&atype={$activity->activity_type_id}&cid={$activity->source_contact_id}&context=home");
                 }
                 if (CRM_Core_Permission::check("delete activities")) {
                     $recentOther['deleteUrl'] = CRM_Utils_System::url('civicrm/activity', "action=delete&reset=1&id={$activity->id}&atype={$activity->activity_type_id}&cid={$activity->source_contact_id}&context=home");
                 }
             } else {
                 $url = CRM_Utils_System::url('civicrm/activity/view', $q);
                 if (CRM_Core_Permission::check('delete activities')) {
                     $recentOther['deleteUrl'] = CRM_Utils_System::url('civicrm/activity', "action=delete&reset=1&id={$activity->id}&atype={$activity->activity_type_id}&cid={$activity->source_contact_id}&context=home");
                 }
             }
         }
         if (!isset($activity->parent_id)) {
             $recentContactDisplay = CRM_Contact_BAO_Contact::displayName($recentContactId);
             // add the recently created Activity
             $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, TRUE);
             $activitySubject = CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $activity->id, 'subject');
             $title = "";
             if (isset($activitySubject)) {
                 $title = $activitySubject . ' - ';
             }
             $title = $title . $recentContactDisplay;
             if (CRM_Utils_Array::value($activity->activity_type_id, $activityTypes)) {
                 $title .= ' (' . $activityTypes[$activity->activity_type_id] . ')';
             }
             CRM_Utils_Recent::add($title, $url, $activity->id, 'Activity', $recentContactId, $recentContactDisplay, $recentOther);
         }
     }
     // reset the group contact cache since smart groups might be affected due to this
     CRM_Contact_BAO_GroupContactCache::remove();
     if (CRM_Utils_Array::value('id', $params)) {
         CRM_Utils_Hook::post('edit', 'Activity', $activity->id, $activity);
     } else {
         CRM_Utils_Hook::post('create', 'Activity', $activity->id, $activity);
     }
     // if the subject contains a ‘[case #…]’ string, file that activity on the related case (CRM-5916)
     $matches = array();
     if (preg_match('/\\[case #([0-9a-h]{7})\\]/', CRM_Utils_Array::value('subject', $params), $matches)) {
         $key = CRM_Core_DAO::escapeString(CIVICRM_SITE_KEY);
         $hash = $matches[1];
         $query = "SELECT id FROM civicrm_case WHERE SUBSTR(SHA1(CONCAT('{$key}', id)), 1, 7) = '{$hash}'";
         $caseParams = array('activity_id' => $activity->id, 'case_id' => CRM_Core_DAO::singleValueQuery($query));
         if ($caseParams['case_id']) {
             CRM_Case_BAO_Case::processCaseActivity($caseParams);
         } else {
             self::logActivityAction($activity, "unknown case hash encountered: {$hash}");
         }
     }
     return $result;
 }