/** * Wrapper for ajax activity selector. * * @param array $params * Associated array for params record id. * * @return array * Associated array of contact activities */ public static function getContactActivitySelector(&$params) { // Format the params. $params['offset'] = ($params['page'] - 1) * $params['rp']; $params['rowCount'] = $params['rp']; $params['sort'] = CRM_Utils_Array::value('sortBy', $params); $params['caseId'] = NULL; $context = CRM_Utils_Array::value('context', $params); // Get contact activities. $activities = CRM_Activity_BAO_Activity::getActivities($params); // Add total. $params['total'] = CRM_Activity_BAO_Activity::getActivitiesCount($params); // Format params and add links. $contactActivities = array(); if (!empty($activities)) { $activityStatus = CRM_Core_PseudoConstant::activityStatus(); // Check logged in user for permission. $page = new CRM_Core_Page(); CRM_Contact_Page_View::checkUserPermission($page, $params['contact_id']); $permissions = array($page->_permission); if (CRM_Core_Permission::check('delete activities')) { $permissions[] = CRM_Core_Permission::DELETE; } $mask = CRM_Core_Action::mask($permissions); foreach ($activities as $activityId => $values) { $activity = array(); $activity['DT_RowId'] = $activityId; // Add class to this row if overdue. $activity['DT_RowClass'] = 'crm-entity'; if (CRM_Utils_Date::overdue(CRM_Utils_Array::value('activity_date_time', $values)) && CRM_Utils_Array::value('status_id', $values) == 1) { $activity['DT_RowClass'] .= ' status-overdue'; } else { $activity['DT_RowClass'] .= ' status-ontime'; } $activity['DT_RowAttr'] = array(); $activity['DT_RowAttr']['data-entity'] = 'activity'; $activity['DT_RowAttr']['data-id'] = $activityId; $activity['activity_type'] = $values['activity_type']; $activity['subject'] = $values['subject']; $activity['source_contact_name'] = ''; if ($params['contact_id'] == $values['source_contact_id']) { $activity['source_contact_name'] = $values['source_contact_name']; } elseif ($values['source_contact_id']) { $activity['source_contact_name'] = CRM_Utils_System::href($values['source_contact_name'], 'civicrm/contact/view', "reset=1&cid={$values['source_contact_id']}"); } else { $activity['source_contact_name'] = '<em>n/a</em>'; } $activity['target_contact_name'] = ''; if (isset($values['mailingId']) && !empty($values['mailingId'])) { $activity['target_contact'] = CRM_Utils_System::href($values['recipients'], 'civicrm/mailing/report/event', "mid={$values['source_record_id']}&reset=1&event=queue&cid={$params['contact_id']}&context=activitySelector"); } elseif (!empty($values['recipients'])) { $activity['target_contact_name'] = $values['recipients']; } elseif (isset($values['target_contact_counter']) && $values['target_contact_counter']) { $activity['target_contact_name'] = ''; foreach ($values['target_contact_name'] as $tcID => $tcName) { $activity['target_contact_name'] .= CRM_Utils_System::href($tcName, 'civicrm/contact/view', "reset=1&cid={$tcID}"); } if ($extraCount = $values['target_contact_counter'] - 1) { $activity['target_contact_name'] .= ";<br />" . "(" . ts('%1 more', array(1 => $extraCount)) . ")"; } } elseif (!$values['target_contact_name']) { $activity['target_contact_name'] = '<em>n/a</em>'; } $activity['assignee_contact_name'] = ''; if (empty($values['assignee_contact_name'])) { $activity['assignee_contact_name'] = '<em>n/a</em>'; } elseif (!empty($values['assignee_contact_name'])) { $count = 0; $activity['assignee_contact_name'] = ''; foreach ($values['assignee_contact_name'] as $acID => $acName) { if ($acID && $count < 5) { $activity['assignee_contact_name'] .= CRM_Utils_System::href($acName, 'civicrm/contact/view', "reset=1&cid={$acID}"); $count++; if ($count) { $activity['assignee_contact_name'] .= "; "; } if ($count == 4) { $activity['assignee_contact_name'] .= "(" . ts('more') . ")"; break; } } } } $activity['activity_date_time'] = CRM_Utils_Date::customFormat($values['activity_date_time']); $activity['status_id'] = $activityStatus[$values['status_id']]; // build links $activity['links'] = ''; $accessMailingReport = FALSE; if (!empty($values['mailingId'])) { $accessMailingReport = TRUE; } $actionLinks = CRM_Activity_Selector_Activity::actionLinks(CRM_Utils_Array::value('activity_type_id', $values), CRM_Utils_Array::value('source_record_id', $values), $accessMailingReport, CRM_Utils_Array::value('activity_id', $values)); $actionMask = array_sum(array_keys($actionLinks)) & $mask; $activity['links'] = CRM_Core_Action::formLink($actionLinks, $actionMask, array('id' => $values['activity_id'], 'cid' => $params['contact_id'], 'cxt' => $context, 'caseid' => CRM_Utils_Array::value('case_id', $values)), ts('more'), FALSE, 'activity.tab.row', 'Activity', $values['activity_id']); if ($values['is_recurring_activity']) { $activity['is_recurring_activity'] = CRM_Core_BAO_RecurringEntity::getPositionAndCount($values['activity_id'], 'civicrm_activity'); } array_push($contactActivities, $activity); } } $activitiesDT = array(); $activitiesDT['data'] = $contactActivities; $activitiesDT['recordsTotal'] = $params['total']; $activitiesDT['recordsFiltered'] = $params['total']; return $activitiesDT; }
/** * Function to get Case Activities * * @param int $caseID case id * @param array $params posted params * @param int $contactID contact id * * @param null $context * @param null $userID * @param null $type * * @return returns case activities * * @static */ static function getCaseActivity($caseID, &$params, $contactID, $context = NULL, $userID = NULL, $type = NULL) { $values = array(); $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts); $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts); $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts); // 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,\n GROUP_CONCAT(ef.file_id) as attachment_ids "; $from = "\n FROM civicrm_case_activity cca\n INNER JOIN civicrm_activity ca ON ca.id = cca.activity_id\n INNER JOIN civicrm_activity_contact cac ON cac.activity_id = ca.id AND cac.record_type_id = {$sourceID}\n INNER JOIN civicrm_contact cc ON cc.id = cac.contact_id\n INNER JOIN civicrm_option_group cog ON cog.name = 'activity_type'\n INNER JOIN civicrm_option_value cov ON cov.option_group_id = cog.id\n AND cov.value = ca.activity_type_id AND cov.is_active = 1\n LEFT JOIN civicrm_entity_file ef on ef.entity_table = 'civicrm_activity' AND ef.entity_id = ca.id\n LEFT OUTER JOIN civicrm_option_group og ON og.name = 'activity_status'\n LEFT OUTER JOIN civicrm_option_value ov ON ov.option_group_id=og.id AND ov.name = 'Scheduled'\n LEFT JOIN civicrm_activity_contact caa\n ON caa.activity_id = ca.id AND caa.record_type_id = {$assigneeID}\n LEFT JOIN civicrm_contact acc ON acc.id = caa.contact_id "; $where = 'WHERE cca.case_id= %1 AND ca.is_current_revision = 1'; if (!empty($params['reporter_id'])) { $where .= " AND cac.contact_id = " . CRM_Utils_Type::escape($params['reporter_id'], 'Integer'); } if (!empty($params['status_id'])) { $where .= " AND ca.status_id = " . CRM_Utils_Type::escape($params['status_id'], 'Integer'); } if (!empty($params['activity_deleted'])) { $where .= " AND ca.is_deleted = 1"; } else { $where .= " AND ca.is_deleted = 0"; } if (!empty($params['activity_type_id'])) { $where .= " AND ca.activity_type_id = " . CRM_Utils_Type::escape($params['activity_type_id'], 'Integer'); } if (!empty($params['activity_date_low'])) { $fromActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_low']), 'Date'); } if (!empty($params['activity_date_high'])) { $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 { $sort = "{$sortname} {$sortorder}"; $sort = CRM_Utils_Type::escape($sort, 'String'); $orderBy = " ORDER BY {$sort} "; 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; //EXIT; $dao = CRM_Core_DAO::executeQuery($query, $params); $activityTypes = CRM_Case_PseudoConstant::caseActivityType(FALSE, TRUE); $activityStatus = CRM_Core_PseudoConstant::activityStatus(); $activityPriority = CRM_Core_PseudoConstant::get('CRM_Activity_DAO_Activity', 'priority_id'); $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_ActivityContact::getNames($dao->id, $targetID); $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) { $url = CRM_Utils_System::url('civicrm/case/activity/view', array('cid' => $contactID, 'aid' => $dao->id)); $subject = '<a class="crm-popup medium-popup" href="' . $url . '" 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)'); } } // FIXME: Why are we not using CRM_Core_Action for these links? This is too much manual work and likely to get out-of-sync with core markup. $url = ""; $css = 'class="action-item crm-hover-button"'; $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 ' . $css . ' href="' . $editUrl . $additionalUrl . '">' . ts('Edit') . '</a> '; } } if ($allowDelete) { $url .= ' <a ' . str_replace('action-item', 'action-item small-popup', $css) . ' href="' . $deleteUrl . $additionalUrl . '">' . ts('Delete') . '</a>'; } } elseif (!$caseDeleted) { $url = ' <a ' . $css . ' 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 ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'move\',' . $dao->id . ', ' . $caseID . ', this ); return false;">' . ts('Move To Case') . '</a> '; } if (self::checkPermission($dao->id, 'Copy To Case', $dao->activity_type_id)) { $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'copy\',' . $dao->id . ',' . $caseID . ', this ); return false;">' . ts('Copy To Case') . '</a> '; } // if there are file attachments we will return how many and, if only one, add a link to it if (!empty($dao->attachment_ids)) { $attachmentIDs = explode(',', $dao->attachment_ids); $values[$dao->id]['no_attachments'] = count($attachmentIDs); if ($values[$dao->id]['no_attachments'] == 1) { // if there is only one it's easy to do a link - otherwise just flag it $attachmentViewUrl = CRM_Utils_System::url("civicrm/file", "reset=1&eid=" . $dao->id . "&id=" . $dao->attachment_ids, FALSE, NULL, FALSE); $url .= " <a href='{$attachmentViewUrl}' ><span class='icon paper-icon'></span></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'] . ' crm-activity-change-status crm-editable-enabled" activity_id=' . $dao->id . ' current_status=' . $dao->status . ' case_id=' . $caseID . ' href="#" title=\'' . $statusTitle . '\'>' . $values[$dao->id]['status'] . '</a>'; } } $dao->free(); return $values; }
/** * This function is a wrapper for ajax activity selector * * @param array $params associated array for params record id. * * @return array $contactActivities associated array of contact activities * @access public */ public static function getContactActivitySelector(&$params) { // format the params $params['offset'] = ($params['page'] - 1) * $params['rp']; $params['rowCount'] = $params['rp']; $params['sort'] = CRM_Utils_Array::value('sortBy', $params); $params['caseId'] = NULL; $context = CRM_Utils_Array::value('context', $params); // get contact activities $activities = CRM_Activity_BAO_Activity::getActivities($params); // add total $params['total'] = CRM_Activity_BAO_Activity::getActivitiesCount($params); // format params and add links $contactActivities = array(); if (!empty($activities)) { $activityStatus = CRM_Core_PseudoConstant::activityStatus(); // check logged in user for permission $page = new CRM_Core_Page(); CRM_Contact_Page_View::checkUserPermission($page, $params['contact_id']); $permissions = array($page->_permission); if (CRM_Core_Permission::check('delete activities')) { $permissions[] = CRM_Core_Permission::DELETE; } $mask = CRM_Core_Action::mask($permissions); foreach ($activities as $activityId => $values) { $contactActivities[$activityId]['activity_type'] = $values['activity_type']; $contactActivities[$activityId]['subject'] = $values['subject']; if ($params['contact_id'] == $values['source_contact_id']) { $contactActivities[$activityId]['source_contact'] = $values['source_contact_name']; } elseif ($values['source_contact_id']) { $contactActivities[$activityId]['source_contact'] = CRM_Utils_System::href($values['source_contact_name'], 'civicrm/contact/view', "reset=1&cid={$values['source_contact_id']}"); } else { $contactActivities[$activityId]['source_contact'] = '<em>n/a</em>'; } if (isset($values['mailingId']) && !empty($values['mailingId'])) { $contactActivities[$activityId]['target_contact'] = CRM_Utils_System::href($values['recipients'], 'civicrm/mailing/report/event', "mid={$values['source_record_id']}&reset=1&event=queue&cid={$params['contact_id']}&context=activitySelector"); } elseif (CRM_Utils_Array::value('recipients', $values)) { $contactActivities[$activityId]['target_contact'] = $values['recipients']; } elseif (!$values['target_contact_name']) { $contactActivities[$activityId]['target_contact'] = '<em>n/a</em>'; } elseif (!empty($values['target_contact_name'])) { $count = 0; $contactActivities[$activityId]['target_contact'] = ''; foreach ($values['target_contact_name'] as $tcID => $tcName) { if ($tcID && $count < 5) { $contactActivities[$activityId]['target_contact'] .= CRM_Utils_System::href($tcName, 'civicrm/contact/view', "reset=1&cid={$tcID}"); $count++; if ($count) { $contactActivities[$activityId]['target_contact'] .= "; "; } if ($count == 4) { $contactActivities[$activityId]['target_contact'] .= "(" . ts('more') . ")"; break; } } } } if (empty($values['assignee_contact_name'])) { $contactActivities[$activityId]['assignee_contact'] = '<em>n/a</em>'; } elseif (!empty($values['assignee_contact_name'])) { $count = 0; $contactActivities[$activityId]['assignee_contact'] = ''; foreach ($values['assignee_contact_name'] as $acID => $acName) { if ($acID && $count < 5) { $contactActivities[$activityId]['assignee_contact'] .= CRM_Utils_System::href($acName, 'civicrm/contact/view', "reset=1&cid={$acID}"); $count++; if ($count) { $contactActivities[$activityId]['assignee_contact'] .= "; "; } if ($count == 4) { $contactActivities[$activityId]['assignee_contact'] .= "(" . ts('more') . ")"; break; } } } } $contactActivities[$activityId]['activity_date'] = CRM_Utils_Date::customFormat($values['activity_date_time']); $contactActivities[$activityId]['status'] = $activityStatus[$values['status_id']]; // add class to this row if overdue $contactActivities[$activityId]['class'] = ''; if (CRM_Utils_Date::overdue(CRM_Utils_Array::value('activity_date_time', $values)) && CRM_Utils_Array::value('status_id', $values) == 1) { $contactActivities[$activityId]['class'] = 'status-overdue'; } else { $contactActivities[$activityId]['class'] = 'status-ontime'; } // build links $contactActivities[$activityId]['links'] = ''; $accessMailingReport = FALSE; if (CRM_Utils_Array::value('mailingId', $values)) { $accessMailingReport = TRUE; } $actionLinks = CRM_Activity_Selector_Activity::actionLinks(CRM_Utils_Array::value('activity_type_id', $values), CRM_Utils_Array::value('source_record_id', $values), $accessMailingReport, CRM_Utils_Array::value('activity_id', $values)); $actionMask = array_sum(array_keys($actionLinks)) & $mask; $contactActivities[$activityId]['links'] = CRM_Core_Action::formLink($actionLinks, $actionMask, array('id' => $values['activity_id'], 'cid' => $params['contact_id'], 'cxt' => $context, 'caseid' => CRM_Utils_Array::value('case_id', $values))); } } return $contactActivities; }
public static function updatePledgeStatus($params) { $returnMessages = array(); $sendReminders = CRM_Utils_Array::value('send_reminders', $params, FALSE); $allStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'); //unset statues that we never use for pledges foreach (array('Completed', 'Cancelled', 'Failed') as $statusKey) { if ($key = CRM_Utils_Array::key($statusKey, $allStatus)) { unset($allStatus[$key]); } } $statusIds = implode(',', array_keys($allStatus)); $updateCnt = 0; $query = "\nSELECT pledge.contact_id as contact_id,\n pledge.id as pledge_id,\n pledge.amount as amount,\n payment.scheduled_date as scheduled_date,\n pledge.create_date as create_date,\n payment.id as payment_id,\n pledge.currency as currency,\n pledge.contribution_page_id as contribution_page_id,\n payment.reminder_count as reminder_count,\n pledge.max_reminders as max_reminders,\n payment.reminder_date as reminder_date,\n pledge.initial_reminder_day as initial_reminder_day,\n pledge.additional_reminder_day as additional_reminder_day,\n pledge.status_id as pledge_status,\n payment.status_id as payment_status,\n pledge.is_test as is_test,\n pledge.campaign_id as campaign_id,\n SUM(payment.scheduled_amount) as amount_due,\n ( SELECT sum(civicrm_pledge_payment.actual_amount)\n FROM civicrm_pledge_payment\n WHERE civicrm_pledge_payment.status_id = 1\n AND civicrm_pledge_payment.pledge_id = pledge.id\n ) as amount_paid\n FROM civicrm_pledge pledge, civicrm_pledge_payment payment\n WHERE pledge.id = payment.pledge_id\n AND payment.status_id IN ( {$statusIds} ) AND pledge.status_id IN ( {$statusIds} )\n GROUP By payment.id\n "; $dao = CRM_Core_DAO::executeQuery($query); $now = date('Ymd'); $pledgeDetails = $contactIds = $pledgePayments = $pledgeStatus = array(); while ($dao->fetch()) { $checksumValue = CRM_Contact_BAO_Contact_Utils::generateChecksum($dao->contact_id); $pledgeDetails[$dao->payment_id] = array('scheduled_date' => $dao->scheduled_date, 'amount_due' => $dao->amount_due, 'amount' => $dao->amount, 'amount_paid' => $dao->amount_paid, 'create_date' => $dao->create_date, 'contact_id' => $dao->contact_id, 'pledge_id' => $dao->pledge_id, 'checksumValue' => $checksumValue, 'contribution_page_id' => $dao->contribution_page_id, 'reminder_count' => $dao->reminder_count, 'max_reminders' => $dao->max_reminders, 'reminder_date' => $dao->reminder_date, 'initial_reminder_day' => $dao->initial_reminder_day, 'additional_reminder_day' => $dao->additional_reminder_day, 'pledge_status' => $dao->pledge_status, 'payment_status' => $dao->payment_status, 'is_test' => $dao->is_test, 'currency' => $dao->currency, 'campaign_id' => $dao->campaign_id); $contactIds[$dao->contact_id] = $dao->contact_id; $pledgeStatus[$dao->pledge_id] = $dao->pledge_status; if (CRM_Utils_Date::overdue(CRM_Utils_Date::customFormat($dao->scheduled_date, '%Y%m%d'), $now) && $dao->payment_status != array_search('Overdue', $allStatus)) { $pledgePayments[$dao->pledge_id][$dao->payment_id] = $dao->payment_id; } } // process the updating script... foreach ($pledgePayments as $pledgeId => $paymentIds) { // 1. update the pledge /pledge payment status. returns new status when an update happens $returnMessages[] = "Checking if status update is needed for Pledge Id: {$pledgeId} (current status is {$allStatus[$pledgeStatus[$pledgeId]]})"; $newStatus = CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeId, $paymentIds, array_search('Overdue', $allStatus), NULL, 0, FALSE, TRUE); if ($newStatus != $pledgeStatus[$pledgeId]) { $returnMessages[] = "- status updated to: {$allStatus[$newStatus]}"; $updateCnt += 1; } } if ($sendReminders) { // retrieve domain tokens $domain = CRM_Core_BAO_Domain::getDomain(); $tokens = array('domain' => array('name', 'phone', 'address', 'email'), 'contact' => CRM_Core_SelectValues::contactTokens()); $domainValues = array(); foreach ($tokens['domain'] as $token) { $domainValues[$token] = CRM_Utils_Token::getDomainTokenReplacement($token, $domain); } //get the domain email address, since we don't carry w/ object. $domainValue = CRM_Core_BAO_Domain::getNameAndEmail(); $domainValues['email'] = $domainValue[1]; // retrieve contact tokens // this function does NOT return Deceased contacts since we don't want to send them email list($contactDetails) = CRM_Utils_Token::getTokenDetails($contactIds, NULL, FALSE, FALSE, NULL, $tokens, 'CRM_UpdatePledgeRecord'); // assign domain values to template $template = CRM_Core_Smarty::singleton(); $template->assign('domain', $domainValues); //set receipt from $receiptFrom = '"' . $domainValues['name'] . '" <' . $domainValues['email'] . '>'; foreach ($pledgeDetails as $paymentId => $details) { if (array_key_exists($details['contact_id'], $contactDetails)) { $contactId = $details['contact_id']; $pledgerName = $contactDetails[$contactId]['display_name']; } else { continue; } if (empty($details['reminder_date'])) { $nextReminderDate = new DateTime($details['scheduled_date']); $nextReminderDate->modify("-" . $details['initial_reminder_day'] . "day"); $nextReminderDate = $nextReminderDate->format("Ymd"); } else { $nextReminderDate = new DateTime($details['reminder_date']); $nextReminderDate->modify("+" . $details['additional_reminder_day'] . "day"); $nextReminderDate = $nextReminderDate->format("Ymd"); } if ($details['reminder_count'] < $details['max_reminders'] && $nextReminderDate <= $now) { $toEmail = $doNotEmail = $onHold = NULL; if (!empty($contactDetails[$contactId]['email'])) { $toEmail = $contactDetails[$contactId]['email']; } if (!empty($contactDetails[$contactId]['do_not_email'])) { $doNotEmail = $contactDetails[$contactId]['do_not_email']; } if (!empty($contactDetails[$contactId]['on_hold'])) { $onHold = $contactDetails[$contactId]['on_hold']; } // 2. send acknowledgement mail if ($toEmail && !($doNotEmail || $onHold)) { //assign value to template $template->assign('amount_paid', $details['amount_paid'] ? $details['amount_paid'] : 0); $template->assign('contact', $contactDetails[$contactId]); $template->assign('next_payment', $details['scheduled_date']); $template->assign('amount_due', $details['amount_due']); $template->assign('checksumValue', $details['checksumValue']); $template->assign('contribution_page_id', $details['contribution_page_id']); $template->assign('pledge_id', $details['pledge_id']); $template->assign('scheduled_payment_date', $details['scheduled_date']); $template->assign('amount', $details['amount']); $template->assign('create_date', $details['create_date']); $template->assign('currency', $details['currency']); list($mailSent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate(array('groupName' => 'msg_tpl_workflow_pledge', 'valueName' => 'pledge_reminder', 'contactId' => $contactId, 'from' => $receiptFrom, 'toName' => $pledgerName, 'toEmail' => $toEmail)); // 3. update pledge payment details if ($mailSent) { CRM_Pledge_BAO_PledgePayment::updateReminderDetails($paymentId); $activityType = 'Pledge Reminder'; $activityParams = array('subject' => $subject, 'source_contact_id' => $contactId, 'source_record_id' => $paymentId, 'assignee_contact_id' => $contactId, 'activity_type_id' => CRM_Core_OptionGroup::getValue('activity_type', $activityType, 'name'), 'activity_date_time' => CRM_Utils_Date::isoToMysql($now), 'due_date_time' => CRM_Utils_Date::isoToMysql($details['scheduled_date']), 'is_test' => $details['is_test'], 'status_id' => 2, 'campaign_id' => $details['campaign_id']); if (is_a(civicrm_api('activity', 'create', $activityParams), 'CRM_Core_Error')) { $returnMessages[] = "Failed creating Activity for acknowledgment"; return array('is_error' => 1, 'message' => $returnMessages); } $returnMessages[] = "Payment reminder sent to: {$pledgerName} - {$toEmail}"; } } } } // end foreach on $pledgeDetails } // end if ( $sendReminders ) $returnMessages[] = "{$updateCnt} records updated."; return array('is_error' => 0, 'messages' => implode("\n\r", $returnMessages)); }
/** * Process the form submission. * * * @return void */ public function postProcess() { //get the submitted form values. $formValues = $this->controller->exportValues($this->_name); $params = array(); $formValues['scheduled_date'] = CRM_Utils_Date::processDate($formValues['scheduled_date']); $params['scheduled_date'] = CRM_Utils_Date::format($formValues['scheduled_date']); $params['currency'] = CRM_Utils_Array::value('currency', $formValues); $now = date('Ymd'); $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'); if (CRM_Utils_Date::overdue(CRM_Utils_Date::customFormat($params['scheduled_date'], '%Y%m%d'), $now)) { $params['status_id'] = array_search('Overdue', $contributionStatus); } else { $params['status_id'] = array_search('Pending', $contributionStatus); } $params['id'] = $this->_id; $pledgeId = CRM_Core_DAO::getFieldValue('CRM_Pledge_DAO_PledgePayment', $params['id'], 'pledge_id'); CRM_Pledge_BAO_PledgePayment::add($params); $adjustTotalAmount = FALSE; if (CRM_Utils_Array::value('option_type', $formValues) == 2) { $adjustTotalAmount = TRUE; } $pledgeScheduledAmount = CRM_Core_DAO::getFieldValue('CRM_Pledge_DAO_PledgePayment', $params['id'], 'scheduled_amount', 'id'); $oldestPaymentAmount = CRM_Pledge_BAO_PledgePayment::getOldestPledgePayment($pledgeId, 2); if ($oldestPaymentAmount['count'] != 1 && $oldestPaymentAmount['id'] == $params['id']) { $oldestPaymentAmount = CRM_Pledge_BAO_PledgePayment::getOldestPledgePayment($pledgeId); } if ($formValues['scheduled_amount'] - $pledgeScheduledAmount >= $oldestPaymentAmount['amount']) { $adjustTotalAmount = TRUE; } //update pledge status CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeId, array($params['id']), $params['status_id'], NULL, $formValues['scheduled_amount'], $adjustTotalAmount); $statusMsg = ts('Pledge Payment Schedule has been updated.'); CRM_Core_Session::setStatus($statusMsg, ts('Saved'), 'success'); }
/** * @param array $params * * @return pledge */ public static function create($params) { $transaction = new CRM_Core_Transaction(); $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'); //calculate the scheduled date for every installment $now = date('Ymd') . '000000'; $statues = $prevScheduledDate = array(); $prevScheduledDate[1] = CRM_Utils_Date::processDate($params['scheduled_date']); if (CRM_Utils_Date::overdue($prevScheduledDate[1], $now)) { $statues[1] = array_search('Overdue', $contributionStatus); } else { $statues[1] = array_search('Pending', $contributionStatus); } for ($i = 1; $i < $params['installments']; $i++) { $prevScheduledDate[$i + 1] = self::calculateNextScheduledDate($params, $i); if (CRM_Utils_Date::overdue($prevScheduledDate[$i + 1], $now)) { $statues[$i + 1] = array_search('Overdue', $contributionStatus); } else { $statues[$i + 1] = array_search('Pending', $contributionStatus); } } if ($params['installment_amount']) { $params['scheduled_amount'] = $params['installment_amount']; } else { $params['scheduled_amount'] = round($params['amount'] / $params['installments'], 2); } for ($i = 1; $i <= $params['installments']; $i++) { // calculate the scheduled amount for every installment. if ($i == $params['installments']) { $params['scheduled_amount'] = $params['amount'] - ($i - 1) * $params['scheduled_amount']; } if (!isset($params['contribution_id']) && $params['installments'] > 1) { $params['status_id'] = $statues[$i]; } $params['scheduled_date'] = $prevScheduledDate[$i]; $payment = self::add($params); if (is_a($payment, 'CRM_Core_Error')) { $transaction->rollback(); return $payment; } // we should add contribution id to only first payment record if (isset($params['contribution_id'])) { unset($params['contribution_id']); unset($params['actual_amount']); } } // update pledge status self::updatePledgePaymentStatus($params['pledge_id']); $transaction->commit(); return $payment; }
/** * Alter display of rows. * * Iterate through the rows retrieved via SQL and make changes for display purposes, * such as rendering contacts as links. * * @param array $rows * Rows generated by SQL, with an array for each row. */ public function alterDisplay(&$rows) { $entryFound = FALSE; $activityType = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'label', TRUE); $activityStatus = CRM_Core_PseudoConstant::activityStatus(); $viewLinks = FALSE; $context = CRM_Utils_Request::retrieve('context', 'String', $this, FALSE, 'report'); $actUrl = ''; if (CRM_Core_Permission::check('access CiviCRM')) { $viewLinks = TRUE; $onHover = ts('View Contact Summary for this Contact'); $onHoverAct = ts('View Activity Record'); } foreach ($rows as $rowNum => $row) { // if we have an activity type, format the View Activity link for use in various columns if ($viewLinks && array_key_exists('civicrm_activity_activity_type_id', $row)) { // Check for target contact id(s) and use the first contact id in that list for view activity link if found, // else use source contact id if (!empty($rows[$rowNum]['civicrm_contact_contact_target_id'])) { $targets = explode(';', $rows[$rowNum]['civicrm_contact_contact_target_id']); $cid = $targets[0]; } else { $cid = $rows[$rowNum]['civicrm_contact_contact_source_id']; } $actActionLinks = CRM_Activity_Selector_Activity::actionLinks($row['civicrm_activity_activity_type_id'], CRM_Utils_Array::value('civicrm_activity_source_record_id', $rows[$rowNum]), FALSE, $rows[$rowNum]['civicrm_activity_id']); $actLinkValues = array('id' => $rows[$rowNum]['civicrm_activity_id'], 'cid' => $cid, 'cxt' => $context); $actUrl = CRM_Utils_System::url($actActionLinks[CRM_Core_Action::VIEW]['url'], CRM_Core_Action::replace($actActionLinks[CRM_Core_Action::VIEW]['qs'], $actLinkValues), TRUE); } if (array_key_exists('civicrm_contact_contact_source', $row)) { if ($value = $row['civicrm_contact_contact_source_id']) { if ($viewLinks) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $rows[$rowNum]['civicrm_contact_contact_source_link'] = $url; $rows[$rowNum]['civicrm_contact_contact_source_hover'] = $onHover; } $entryFound = TRUE; } } if (array_key_exists('civicrm_contact_contact_assignee', $row)) { $assigneeNames = explode(';', $row['civicrm_contact_contact_assignee']); if ($value = $row['civicrm_contact_contact_assignee_id']) { $assigneeContactIds = explode(';', $value); $link = array(); if ($viewLinks) { foreach ($assigneeContactIds as $id => $value) { if (isset($value) && isset($assigneeNames[$id])) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $link[] = "<a title='" . $onHover . "' href='" . $url . "'>{$assigneeNames[$id]}</a>"; } } $rows[$rowNum]['civicrm_contact_contact_assignee'] = implode('; ', $link); } $entryFound = TRUE; } } if (array_key_exists('civicrm_contact_contact_target', $row)) { $targetNames = explode(';', $row['civicrm_contact_contact_target']); if ($value = $row['civicrm_contact_contact_target_id']) { $targetContactIds = explode(';', $value); $link = array(); if ($viewLinks) { foreach ($targetContactIds as $id => $value) { if (isset($value) && isset($targetNames[$id])) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $link[] = "<a title='" . $onHover . "' href='" . $url . "'>{$targetNames[$id]}</a>"; } } $rows[$rowNum]['civicrm_contact_contact_target'] = implode('; ', $link); } $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_activity_type_id', $row)) { if ($value = $row['civicrm_activity_activity_type_id']) { $rows[$rowNum]['civicrm_activity_activity_type_id'] = $activityType[$value]; if ($viewLinks) { $rows[$rowNum]['civicrm_activity_activity_type_id_link'] = $actUrl; $rows[$rowNum]['civicrm_activity_activity_type_id_hover'] = $onHoverAct; } $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_status_id', $row)) { if ($value = $row['civicrm_activity_status_id']) { $rows[$rowNum]['civicrm_activity_status_id'] = $activityStatus[$value]; $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_details', $row) && $this->_outputMode == 'html') { if ($value = $row['civicrm_activity_details']) { $fullDetails = $rows[$rowNum]['civicrm_activity_details']; $rows[$rowNum]['civicrm_activity_details'] = substr($fullDetails, 0, strrpos(substr($fullDetails, 0, 80), ' ')); if ($actUrl) { $rows[$rowNum]['civicrm_activity_details'] .= " <a href='{$actUrl}' title='{$onHoverAct}'>(more)</a>"; } $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_campaign_id', $row)) { if ($value = $row['civicrm_activity_campaign_id']) { $rows[$rowNum]['civicrm_activity_campaign_id'] = $this->activeCampaigns[$value]; $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_engagement_level', $row)) { if ($value = $row['civicrm_activity_engagement_level']) { $rows[$rowNum]['civicrm_activity_engagement_level'] = $this->engagementLevels[$value]; $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_activity_date_time', $row) && array_key_exists('civicrm_activity_status_id', $row)) { if (CRM_Utils_Date::overdue($rows[$rowNum]['civicrm_activity_activity_date_time']) && $activityStatus[$row['civicrm_activity_status_id']] != 'Completed') { $rows[$rowNum]['class'] = "status-overdue"; $entryFound = TRUE; } } $entryFound = $this->alterDisplayAddressFields($row, $rows, $rowNum, 'activity', 'List all activities for this ') ? TRUE : $entryFound; if (!$entryFound) { break; } } }
/** * Get Case Activities. * * @param int $caseID * Case id. * @param array $params * Posted params. * @param int $contactID * Contact id. * * @param null $context * @param int $userID * @param null $type * * @return array * Array of case activities * */ public static function getCaseActivity($caseID, &$params, $contactID, $context = NULL, $userID = NULL, $type = NULL) { $values = array(); $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name'); $assigneeID = CRM_Utils_Array::key('Activity Assignees', $activityContacts); $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts); $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts); // 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 = "\n SELECT COUNT(ca.id) AS ismultiple,\n ca.id AS id,\n ca.activity_type_id AS type,\n ca.activity_type_id AS activity_type_id,\n tcc.sort_name AS target_contact_name,\n tcc.id AS target_contact_id,\n scc.sort_name AS source_contact_name,\n scc.id AS source_contact_id,\n acc.sort_name AS assignee_contact_name,\n acc.id AS assignee_contact_id,\n DATE_FORMAT(\n 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,\n GROUP_CONCAT(ef.file_id) AS attachment_ids "; $from = "\n FROM civicrm_case_activity cca\n INNER JOIN civicrm_activity ca\n ON ca.id = cca.activity_id\n INNER JOIN civicrm_activity_contact cas\n ON cas.activity_id = ca.id\n AND cas.record_type_id = {$sourceID}\n INNER JOIN civicrm_contact scc\n ON scc.id = cas.contact_id\n LEFT JOIN civicrm_activity_contact caa\n ON caa.activity_id = ca.id\n AND caa.record_type_id = {$assigneeID}\n LEFT JOIN civicrm_contact acc\n ON acc.id = caa.contact_id\n LEFT JOIN civicrm_activity_contact cat\n ON cat.activity_id = ca.id\n AND cat.record_type_id = {$targetID}\n LEFT JOIN civicrm_contact tcc\n ON tcc.id = cat.contact_id\n INNER JOIN civicrm_option_group cog\n ON cog.name = 'activity_type'\n INNER JOIN civicrm_option_value cov\n ON cov.option_group_id = cog.id\n AND cov.value = ca.activity_type_id\n AND cov.is_active = 1\n LEFT JOIN civicrm_entity_file ef\n ON ef.entity_table = 'civicrm_activity'\n AND ef.entity_id = ca.id\n LEFT OUTER JOIN civicrm_option_group og\n ON og.name = 'activity_status'\n LEFT OUTER JOIN civicrm_option_value ov\n ON ov.option_group_id=og.id\n AND ov.name = 'Scheduled'"; $where = ' WHERE cca.case_id= %1 AND ca.is_current_revision = 1'; if (!empty($params['source_contact_id'])) { $where .= "\n AND cas.contact_id = " . CRM_Utils_Type::escape($params['source_contact_id'], 'Integer'); } if (!empty($params['status_id'])) { $where .= "\n AND ca.status_id = " . CRM_Utils_Type::escape($params['status_id'], 'Integer'); } if (!empty($params['activity_deleted'])) { $where .= "\n AND ca.is_deleted = 1"; } else { $where .= "\n AND ca.is_deleted = 0"; } if (!empty($params['activity_type_id'])) { $where .= "\n AND ca.activity_type_id = " . CRM_Utils_Type::escape($params['activity_type_id'], 'Integer'); } if (!empty($params['activity_date_low'])) { $fromActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_low']), 'Date'); } if (!empty($fromActivityDate)) { $where .= "\n AND ca.activity_date_time >= '{$fromActivityDate}'"; } if (!empty($params['activity_date_high'])) { $toActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_high']), 'Date'); $toActivityDate = $toActivityDate ? $toActivityDate + 235959 : NULL; } if (!empty($toActivityDate)) { $where .= "\n AND ca.activity_date_time <= '{$toActivityDate}'"; } $groupBy = "\n GROUP BY ca.id "; $sortBy = CRM_Utils_Array::value('sortBy', $params); if (!$sortBy) { // CRM-5081 - added id to act like creation date $orderBy = "\n ORDER BY overdue_date ASC, display_date DESC, weight DESC"; } else { $sortBy = CRM_Utils_Type::escape($sortBy, 'String'); $orderBy = " ORDER BY {$sortBy} "; } $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; $limit = " LIMIT {$start}, {$rp}"; $query = $select . $from . $where . $groupBy . $orderBy . $limit; $queryParams = array(1 => array($caseID, 'Integer')); $dao = CRM_Core_DAO::executeQuery($query, $queryParams); $activityTypes = CRM_Case_PseudoConstant::caseActivityType(FALSE, TRUE); $activityStatuses = CRM_Core_PseudoConstant::activityStatus(); $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 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'); } $caseActivities = array(); $caseCount = 0; while ($dao->fetch()) { $caseCount++; $caseActivity = array(); $caseActivityId = $dao->id; $allowView = self::checkPermission($caseActivityId, 'view', $dao->activity_type_id, $userID); $allowEdit = self::checkPermission($caseActivityId, 'edit', $dao->activity_type_id, $userID); $allowDelete = self::checkPermission($caseActivityId, 'delete', $dao->activity_type_id, $userID); //do not have sufficient permission //to access given case activity record. if (!$allowView && !$allowEdit && !$allowDelete) { continue; } //Add classes to the row, via DataTables syntax $caseActivity['DT_RowClass'] = "crm-entity"; if (CRM_Utils_Array::crmInArray($dao->status, $compStatusValues)) { $caseActivity['DT_RowClass'] .= " status-completed"; } else { if (CRM_Utils_Date::overdue($dao->display_date)) { $caseActivity['DT_RowClass'] .= " status-overdue"; } else { $caseActivity['DT_RowClass'] .= " status-scheduled"; } } if (!empty($dao->priority)) { if ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Urgent', 'name')) { $caseActivity['DT_RowClass'] .= " priority-urgent "; } elseif ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Low', 'name')) { $caseActivity['DT_RowClass'] .= " priority-low "; } } //Add data to the row for inline editing, via DataTable syntax $caseActivity['DT_RowData'] = array(); $caseActivity['DT_RowData']['entity'] = 'activity'; $caseActivity['DT_RowData']['id'] = $caseActivityId; //Activity Date and Time $caseActivity['activity_date_time'] = CRM_Utils_Date::customFormat($dao->display_date); //Activity Subject $caseActivity['subject'] = $dao->subject; //Activity Type $caseActivity['type'] = $activityTypes[$dao->type]['label']; //Activity Target (With) $targetContact = ''; if (isset($dao->target_contact_id)) { $targetContact = $dao->target_contact_name; if ($hasViewContact) { $targetContact = '<a href="' . $contactViewUrl . $dao->target_contact_id . '">' . $dao->target_contact_name . '</a>'; } } $caseActivity['target_contact_name'] = $targetContact; //Activity Source Contact (Reporter) $sourceContact = $dao->source_contact_name; if ($hasViewContact) { $sourceContact = '<a href="' . $contactViewUrl . $dao->source_contact_id . '">' . $dao->source_contact_name . '</a>'; } $caseActivity['source_contact_name'] = $sourceContact; //Activity Assignee. CRM-4485. $assigneeContact = ''; if (isset($dao->assignee_contact_id)) { $assigneeContact = $dao->assignee_contact_name; if ($hasViewContact) { $assigneeContact = '<a href="' . $contactViewUrl . $dao->assignee_contact_id . '">' . $dao->assignee_contact_name . '</a>'; } } $caseActivity['assignee_contact_name'] = $assigneeContact; //Activity Status $caseActivity['status_id'] = $activityStatuses[$dao->status]; // FIXME: Why are we not using CRM_Core_Action for these links? This is too much manual work and likely to get out-of-sync with core markup. $url = ""; $css = 'class="action-item crm-hover-button"'; if ($allowView) { $viewUrl = CRM_Utils_System::url('civicrm/case/activity/view', array('cid' => $contactID, 'aid' => $caseActivityId)); $url = '<a ' . str_replace('action-item', 'action-item medium-pop-up', $css) . 'href="' . $viewUrl . '" title="' . $viewTitle . '">' . ts('View') . '</a>'; } $additionalUrl = "&id={$caseActivityId}"; 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 ' . $css . ' href="' . $editUrl . $additionalUrl . '">' . ts('Edit') . '</a> '; } } if ($allowDelete) { $url .= ' <a ' . str_replace('action-item', 'action-item small-popup', $css) . ' href="' . $deleteUrl . $additionalUrl . '">' . ts('Delete') . '</a>'; } } elseif (!$caseDeleted) { $url = ' <a ' . $css . ' href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>'; $caseActivity['status_id'] = $caseActivity['status_id'] . '<br /> (deleted)'; } //check for operations. if (self::checkPermission($caseActivityId, 'Move To Case', $dao->activity_type_id)) { $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'move\',' . $caseActivityId . ', ' . $caseID . ', this ); return false;">' . ts('Move To Case') . '</a> '; } if (self::checkPermission($caseActivityId, 'Copy To Case', $dao->activity_type_id)) { $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'copy\',' . $caseActivityId . ',' . $caseID . ', this ); return false;">' . ts('Copy To Case') . '</a> '; } // if there are file attachments we will return how many and, if only one, add a link to it if (!empty($dao->attachment_ids)) { $attachmentIDs = explode(',', $dao->attachment_ids); $caseActivity['no_attachments'] = count($attachmentIDs); if ($caseActivity['no_attachments'] == 1) { // if there is only one it's easy to do a link - otherwise just flag it $attachmentViewUrl = CRM_Utils_System::url("civicrm/file", "reset=1&eid=" . $caseActivityId . "&id=" . $dao->attachment_ids, FALSE, NULL, FALSE); $url .= " <a href='{$attachmentViewUrl}' ><span class='icon paper-icon'></span></a>"; } } $caseActivity['links'] = $url; array_push($caseActivities, $caseActivity); } $dao->free(); $caseActivitiesDT = array(); $caseActivitiesDT['data'] = $caseActivities; $caseActivitiesDT['recordsTotal'] = $caseCount; $caseActivitiesDT['recordsFiltered'] = $caseCount; return $caseActivitiesDT; }
function alterDisplay(&$rows) { // custom code to alter rows $entryFound = FALSE; $activityType = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'label', TRUE); $activityStatus = CRM_Core_PseudoConstant::activityStatus(); $volunteerRoles = CRM_Volunteer_BAO_Need::buildOptions('role_id', 'create'); $viewLinks = FALSE; $seperator = CRM_CORE_DAO::VALUE_SEPARATOR; $context = CRM_Utils_Request::retrieve('context', 'String', $this, FALSE, 'report'); if (CRM_Core_Permission::check('access CiviCRM')) { $viewLinks = TRUE; $onHover = ts('View Contact Summary for this Contact', array('domain' => 'org.civicrm.volunteer')); $onHoverAct = ts('View Activity Record', array('domain' => 'org.civicrm.volunteer')); } foreach ($rows as $rowNum => $row) { if (array_key_exists('civicrm_contact_contact_source', $row)) { if ($value = $row['civicrm_activity_assignment_contact_id']) { if ($viewLinks) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $rows[$rowNum]['civicrm_contact_contact_source_link'] = $url; $rows[$rowNum]['civicrm_contact_contact_source_hover'] = $onHover; } $entryFound = TRUE; } } if (array_key_exists('civicrm_contact_contact_assignee', $row)) { $assigneeNames = explode($seperator, $row['civicrm_contact_contact_assignee']); if ($value = $row['civicrm_activity_assignment_contact_id']) { $assigneeContactIds = explode($seperator, $value); $link = array(); if ($viewLinks) { foreach ($assigneeContactIds as $id => $value) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $link[] = "<a title='" . $onHover . "' href='" . $url . "'>{$assigneeNames[$id]}</a>"; } $rows[$rowNum]['civicrm_contact_contact_assignee'] = implode('; ', $link); } $entryFound = TRUE; } } if (array_key_exists('civicrm_contact_contact_target', $row)) { $targetNames = explode($seperator, $row['civicrm_contact_contact_target']); if ($value = $row['civicrm_activity_target_contact_id']) { $targetContactIds = explode($seperator, $value); $link = array(); if ($viewLinks) { foreach ($targetContactIds as $id => $value) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $link[] = "<a title='" . $onHover . "' href='" . $url . "'>{$targetNames[$id]}</a>"; } $rows[$rowNum]['civicrm_contact_contact_target'] = implode('; ', $link); } $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_activity_type_id', $row)) { if ($value = $row['civicrm_activity_activity_type_id']) { $rows[$rowNum]['civicrm_activity_activity_type_id'] = $activityType[$value]; if ($viewLinks) { // Check for assignee contact id(s) (since they are the volunteer and use the first contact id in that list for view activity link if found, // else use source contact id if (!empty($rows[$rowNum]['civicrm_activity_assignment_contact_id'])) { $targets = explode($seperator, $rows[$rowNum]['civicrm_activity_assignment_contact_id']); $cid = $targets[0]; } else { $cid = $rows[$rowNum]['civicrm_activity_source_contact_id']; } $actionLinks = CRM_Activity_Selector_Activity::actionLinks($row['civicrm_activity_activity_type_id'], CRM_Utils_Array::value('civicrm_activity_source_record_id', $rows[$rowNum]), FALSE, $rows[$rowNum]['civicrm_activity_id']); $linkValues = array('id' => $rows[$rowNum]['civicrm_activity_id'], 'cid' => $cid, 'cxt' => $context); $url = CRM_Utils_System::url($actionLinks[CRM_Core_Action::VIEW]['url'], CRM_Core_Action::replace($actionLinks[CRM_Core_Action::VIEW]['qs'], $linkValues), TRUE); $rows[$rowNum]['civicrm_activity_activity_type_id_link'] = $url; $rows[$rowNum]['civicrm_activity_activity_type_id_hover'] = $onHoverAct; } $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_status_id', $row)) { if ($value = $row['civicrm_activity_status_id']) { $rows[$rowNum]['civicrm_activity_status_id'] = $activityStatus[$value]; $entryFound = TRUE; } } if (array_key_exists('role_role', $row)) { if ($value = $row['role_role']) { $rows[$rowNum]['role_role'] = $volunteerRoles[$value]; $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_activity_date_time', $row)) { $rows[$rowNum]['civicrm_activity_activity_date_time'] = CRM_Utils_Date::customFormat($row['civicrm_activity_activity_date_time']); // Display overdue marker if (array_key_exists('civicrm_activity_status_id', $row) && CRM_Utils_Date::overdue($rows[$rowNum]['civicrm_activity_activity_date_time']) && $activityStatus[$row['civicrm_activity_status_id']] != 'Completed') { $rows[$rowNum]['class'] = "status-overdue"; $entryFound = TRUE; } } $entryFound = $this->alterDisplayAddressFields($row, $rows, $rowNum, 'activity', 'List all activities for this ') ? TRUE : $entryFound; if (!$entryFound) { break; } } }
/** * 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 process the form * * @access public * @return None */ public function postProcess() { //get the submitted form values. $formValues = $this->controller->exportValues($this->_name); $params = array(); $formValues['scheduled_date'] = CRM_Utils_Date::processDate($formValues['scheduled_date']); $params['scheduled_date'] = CRM_Utils_Date::format($formValues['scheduled_date']); $now = date('Ymd'); if (CRM_Utils_Date::overdue(CRM_Utils_Date::customFormat($params['scheduled_date'], '%Y%m%d'), $now)) { $params['status_id'] = array_search('Overdue', CRM_Contribute_PseudoConstant::contributionStatus()); } else { $params['status_id'] = array_search('Pending', CRM_Contribute_PseudoConstant::contributionStatus()); } $params['id'] = $this->_id; $pledgeId = CRM_Core_DAO::getFieldValue('CRM_Pledge_DAO_Payment', $params['id'], 'pledge_id'); require_once 'CRM/Pledge/BAO/Payment.php'; CRM_Pledge_BAO_Payment::add($params); //update pledge status CRM_Pledge_BAO_Payment::updatePledgePaymentStatus($pledgeId); $statusMsg = ts('Pledge Payment Schedule has been updated.<br />'); CRM_Core_Session::setStatus($statusMsg); }
static function create($params) { require_once 'CRM/Contribute/PseudoConstant.php'; require_once 'CRM/Core/Transaction.php'; $transaction = new CRM_Core_Transaction(); $date = array(); $scheduled_date = CRM_Utils_Date::processDate($params['scheduled_date']); $date['year'] = (int) substr($scheduled_date, 0, 4); $date['month'] = (int) substr($scheduled_date, 4, 2); $date['day'] = (int) substr($scheduled_date, 6, 2); $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(); //calculation of schedule date according to frequency day of period //frequency day is not applicable for daily installments if ($params['frequency_unit'] != 'day') { if ($params['frequency_unit'] != 'week') { //for month use day of next month & for year use day of month Jan of next year as next payment date $date['day'] = $params['frequency_day']; if ($params['frequency_unit'] == 'year') { $date['month'] = '1'; } } else { if ($params['frequency_unit'] == 'week') { //for week calculate day of week ie. Sunday,Monday etc. as next payment date $dayOfWeek = date('w', mktime(0, 0, 0, $date['month'], $date['day'], $date['year'])); $frequencyDay = $params['frequency_day'] - $dayOfWeek; $scheduleDate = explode("-", date('n-j-Y', mktime(0, 0, 0, $date['month'], $date['day'] + $frequencyDay, $date['year']))); $date['month'] = $scheduleDate[0]; $date['day'] = $scheduleDate[1]; $date['year'] = $scheduleDate[2]; } } } //calculate the scheduled date for every installment $now = date('Ymd') . '000000'; $statues = $prevScheduledDate = array(); $prevScheduledDate[1] = $scheduled_date; if (CRM_Utils_Date::overdue($prevScheduledDate[1], $now)) { $statues[1] = array_search('Overdue', $contributionStatus); } else { $statues[1] = array_search('Pending', $contributionStatus); } $newDate = date('YmdHis', mktime(0, 0, 0, $date['month'], $date['day'], $date['year'])); for ($i = 1; $i < $params['installments']; $i++) { $prevScheduledDate[$i + 1] = CRM_Utils_Date::format(CRM_Utils_Date::intervalAdd($params['frequency_unit'], $i * $params['frequency_interval'], $newDate)); if (CRM_Utils_Date::overdue($prevScheduledDate[$i + 1], $now)) { $statues[$i + 1] = array_search('Overdue', $contributionStatus); } else { $statues[$i + 1] = array_search('Pending', $contributionStatus); } } if ($params['installment_amount']) { $params['scheduled_amount'] = $params['installment_amount']; } else { $params['scheduled_amount'] = round($params['amount'] / $params['installments'], 2); } for ($i = 1; $i <= $params['installments']; $i++) { //calculate the scheduled amount for every installment. if ($i == $params['installments']) { $params['scheduled_amount'] = $params['amount'] - ($i - 1) * $params['scheduled_amount']; } if (!isset($params['contribution_id']) && $params['installments'] > 1) { $params['status_id'] = $statues[$i]; } $params['scheduled_date'] = $prevScheduledDate[$i]; $payment = self::add($params); if (is_a($payment, 'CRM_Core_Error')) { $transaction->rollback(); return $payment; } // we should add contribution id to only first payment record if (isset($params['contribution_id'])) { unset($params['contribution_id']); } } //update pledge status self::updatePledgePaymentStatus($params['pledge_id']); $transaction->commit(); return $payment; }
function alterDisplay(&$rows) { // custom code to alter rows $entryFound = $viewLinks = FALSE; $seperator = CRM_Core_DAO::VALUE_SEPARATOR; $context = CRM_Utils_Request::retrieve('context', 'String', $this, FALSE, 'report'); if (CRM_Core_Permission::check('access CiviCRM')) { $viewLinks = TRUE; $onHover = ts('View Contact Summary for this Contact'); $onHoverAct = ts('View Absence Record'); } if (!isset($this->_params['absence_date_from']) && !isset($this->_params['absence_date_to'])) { $this->_params['absence_date_from'] = date('m/d/Y'); $this->_params['absence_date_to'] = date("m/d/Y", strtotime("+2 months")); } if (!empty($rows)) { $activityTypeID = CRM_Core_OptionGroup::getValue('activity_type', 'Absence', 'name'); list($durationFromDate, $durationToDate) = $this->getFromTo(CRM_Utils_Array::value("absence_date_relative", $this->_params), CRM_Utils_Array::value("absence_date_from", $this->_params), CRM_Utils_Array::value("absence_date_to", $this->_params)); $activityStatus = CRM_HRAbsence_BAO_HRAbsenceType::getActivityStatus('name'); $activityStatusId = CRM_Utils_Array::key('Rejected', $activityStatus); $completedActivityId = CRM_Utils_Array::key('Completed', $activityStatus); $result = civicrm_api3('OptionValue', 'get', array('label' => "absence")); $activityId = $result['values'][$result['id']]['value']; $clause = NULL; if ($status = CRM_Utils_Array::value("status_id_value", $this->_params)) { $clause = " AND status_id IN (" . implode(',', $status) . ")"; } $sql = "SELECT SUM(duration) / ( 8 *60 ) as qty,\n source_record_id ,\n Min(activity_date_time) AS start_date,\n Max(activity_date_time) AS end_date\n FROM civicrm_activity\n WHERE source_record_id IN (select id from civicrm_activity where source_record_id IS NULL AND status_id NOT IN ({$completedActivityId}) {$clause}) AND activity_type_id = {$activityId}\n GROUP BY source_record_id\n\n UNION\n\n SELECT SUM(CASE WHEN (activity_type_id = {$activityId} AND status_id NOT IN ({$activityStatusId})) THEN duration else NULL end) / ( 8 *60 ) as qty,\n source_record_id ,\n Min(activity_date_time) AS start_date,\n Max(activity_date_time) AS end_date\n FROM civicrm_activity\n WHERE source_record_id IN (select id from civicrm_activity where source_record_id IS NULL AND status_id IN ({$completedActivityId}) {$clause}) AND activity_type_id = {$activityId}\n GROUP BY source_record_id"; if ($durationFromDate && $durationToDate) { $sql .= "\n HAVING ((to_days({$durationFromDate}) <= to_days(Min(activity_date_time))) AND\n (to_days(Max(activity_date_time)) <= to_days({$durationToDate})))\n "; } $data = array(); $dao = CRM_Core_DAO::executeQuery($sql); while ($dao->fetch()) { $data[$dao->source_record_id]['start_date'] = $dao->start_date; $data[$dao->source_record_id]['end_date'] = $dao->end_date; $data[$dao->source_record_id]['qty'] = round($dao->qty, 1); } } foreach ($rows as $rowNum => $row) { if (!array_key_exists($rows[$rowNum]['civicrm_activity_id'], $data)) { unset($rows[$rowNum]); continue; } if (array_key_exists($row['civicrm_activity_id'], $data)) { $rows[$rowNum]['start_date'] = $data[$row['civicrm_activity_id']]['start_date']; $rows[$rowNum]['end_date'] = $data[$row['civicrm_activity_id']]['end_date']; $rows[$rowNum]['qty'] = $data[$row['civicrm_activity_id']]['qty']; } if (array_key_exists('civicrm_contact_contact_source', $row)) { if ($value = $row['civicrm_contact_contact_source_id']) { if ($viewLinks) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $rows[$rowNum]['civicrm_contact_contact_source_link'] = $url; $rows[$rowNum]['civicrm_contact_contact_source_hover'] = $onHover; } $entryFound = TRUE; } } if (array_key_exists('civicrm_contact_contact_assignee', $row)) { $assigneeNames = explode(';', $row['civicrm_contact_contact_assignee']); if ($value = $row['civicrm_contact_contact_assignee_id']) { $assigneeContactIds = explode(';', $value); $link = array(); if ($viewLinks) { foreach ($assigneeContactIds as $id => $value) { if (isset($value) && isset($assigneeNames[$id])) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $link[] = "<a title='" . $onHover . "' href='" . $url . "'>{$assigneeNames[$id]}</a>"; } } $rows[$rowNum]['civicrm_contact_contact_assignee'] = implode('; ', $link); } $entryFound = TRUE; } } if (array_key_exists('civicrm_contact_contact_target', $row)) { $targetNames = explode(';', $row['civicrm_contact_contact_target']); if ($value = $row['civicrm_contact_contact_target_id']) { $targetContactIds = explode(';', $value); $link = array(); if ($viewLinks) { foreach ($targetContactIds as $id => $value) { if (isset($value) && isset($targetNames[$id])) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $value, $this->_absoluteUrl); $link[] = "<a title='" . $onHover . "' href='" . $url . "'>{$targetNames[$id]}</a>"; } } $rows[$rowNum]['civicrm_contact_contact_target'] = implode('; ', $link); } $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_activity_type_id', $row)) { if ($value = $row['civicrm_activity_activity_type_id']) { $rows[$rowNum]['civicrm_activity_activity_type_id'] = $this->activityTypes[$value]; if ($viewLinks) { // Check for target contact id(s) and use the first contact id in that list for view activity link if found, // else use source contact id if (!empty($rows[$rowNum]['civicrm_contact_contact_target_id'])) { $targets = explode(';', $rows[$rowNum]['civicrm_contact_contact_target_id']); $cid = $targets[0]; } else { $cid = $rows[$rowNum]['civicrm_contact_contact_source_id']; } $url = CRM_Utils_System::url('civicrm/absence/set', 'reset=1&action=view&aid=' . $rows[$rowNum]['civicrm_activity_id'], $this->_absoluteUrl); $rows[$rowNum]['civicrm_activity_activity_type_id_link'] = $url; $rows[$rowNum]['civicrm_activity_activity_type_id_hover'] = $onHoverAct; } $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_status_id', $row)) { if ($value = $row['civicrm_activity_status_id']) { $rows[$rowNum]['civicrm_activity_status_id'] = $this->activityStatus[$value]; $entryFound = TRUE; } } if (array_key_exists('civicrm_activity_activity_date_time', $row) && array_key_exists('civicrm_activity_status_id', $row)) { if (CRM_Utils_Date::overdue($rows[$rowNum]['civicrm_activity_activity_date_time']) && $this->activityStatus[$row['civicrm_activity_status_id']] != 'Approved') { $rows[$rowNum]['class'] = "status-overdue"; $entryFound = TRUE; } } if (!$entryFound) { break; } } }
/** * returns all the rows in the given offset and rowCount * * @param enum $action the action being performed * @param int $offset the row number to start from * @param int $rowCount the number of rows to return * @param string $sort the sql string that describes the sort order * @param enum $output what should the result set include (web/email/csv) * * @return int the total number of rows for this action */ function &getRows($action, $offset, $rowCount, $sort, $output = null, $case = null) { $params['contact_id'] = $this->_contactId; $config = CRM_Core_Config::singleton(); $rows =& CRM_Activity_BAO_Activity::getActivities($params, $offset, $rowCount, $sort, $this->_admin, $case, $this->_context); if (empty($rows)) { return $rows; } $activityStatus = CRM_Core_PseudoConstant::activityStatus(); //CRM-4418 $permissions = array($this->_permission); if (CRM_Core_Permission::check('delete activities')) { $permissions[] = CRM_Core_Permission::DELETE; } $mask = CRM_Core_Action::mask($permissions); foreach ($rows as $k => $row) { $row =& $rows[$k]; // DRAFTING: provide a facility for db-stored strings // localize the built-in activity names for display // (these are not enums, so we can't use any automagic here) switch ($row['activity_type']) { case 'Meeting': $row['activity_type'] = ts('Meeting'); break; case 'Phone Call': $row['activity_type'] = ts('Phone Call'); break; case 'Email': $row['activity_type'] = ts('Email'); break; case 'SMS': $row['activity_type'] = ts('SMS'); break; case 'Event': $row['activity_type'] = ts('Event'); break; } // add class to this row if overdue if (CRM_Utils_Date::overdue(CRM_Utils_Array::value('activity_date_time', $row)) && CRM_Utils_Array::value('status_id', $row) == 1) { $row['overdue'] = 1; $row['class'] = 'status-overdue'; } else { $row['overdue'] = 0; $row['class'] = 'status-ontime'; } $row['status'] = $row['status_id'] ? $activityStatus[$row['status_id']] : null; //CRM-3553 $accessMailingReport = false; if (CRM_Utils_Array::value('mailingId', $row)) { $accessMailingReport = true; } $actionLinks = $this->actionLinks(CRM_Utils_Array::value('activity_type_id', $row), CRM_Utils_Array::value('source_record_id', $row), $accessMailingReport, CRM_Utils_Array::value('activity_id', $row), $this->_key); $actionMask = array_sum(array_keys($actionLinks)) & $mask; if ($output != CRM_Core_Selector_Controller::EXPORT && $output != CRM_Core_Selector_Controller::SCREEN) { $row['action'] = CRM_Core_Action::formLink($actionLinks, $actionMask, array('id' => $row['activity_id'], 'cid' => $this->_contactId, 'cxt' => $this->_context, 'caseid' => CRM_Utils_Array::value('case_id', $row))); } unset($row); } return $rows; }
/** * 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 "; $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, ca.id 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); require_once "CRM/Utils/Date.php"; require_once "CRM/Core/PseudoConstant.php"; require_once 'CRM/Case/PseudoConstant.php'; $activityTypes = CRM_Case_PseudoConstant::activityType(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.'); 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/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'); // 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); require_once 'CRM/Activity/BAO/ActivityTarget.php'; $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>'; } } else { if (!$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"; } } } $dao->free(); return $values; }