Пример #1
0
 function postProcess()
 {
     $this->buildACLClause(array('cac'));
     parent::beginPostProcess();
     $activityStatus = array_flip($this->activityStatus);
     $statusCSSStyle = array($activityStatus['Scheduled'] => 'font-style:italic;', $activityStatus['Completed'] => 'font-weight:bold;', $activityStatus['Cancelled'] => 'text-decoration:line-through;', $activityStatus['Rejected'] => 'text-decoration:line-through;');
     $absenceCalendar = $monthDays = $statistics = $legend = array();
     $validSourceRecordIds = null;
     $viewLinks = FALSE;
     $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));
     $sql = "\nFROM civicrm_activity\nWHERE source_record_id IS NOT NULL AND\nactivity_type_id = {$activityTypeID}\n";
     if ($durationFromDate && $durationToDate) {
         $sql = "SELECT source_record_id " . $sql;
         $sql .= "\n        GROUP BY source_record_id\n        HAVING ((to_days({$durationFromDate}) <= to_days(Min(activity_date_time))) AND\n        (to_days(Max(activity_date_time))  <= to_days({$durationToDate})))\n        ";
     } else {
         $sql = "SELECT Min(activity_date_time) as fromDate, Max(activity_date_time) as toDate" . $sql;
     }
     $dao = CRM_Core_DAO::executeQuery($sql);
     while ($dao->fetch()) {
         if (property_exists($dao, 'fromDate')) {
             $durationFromDate = CRM_Utils_Date::processDate($dao->fromDate);
             $durationToDate = CRM_Utils_Date::processDate($dao->toDate);
             $validSourceRecordIds = 'all';
         } else {
             $validSourceRecordIds[] = $dao->source_record_id;
         }
     }
     $durationYearCount = date('Y', strtotime($durationToDate)) - date('Y', strtotime($durationFromDate));
     for ($i = 0; $i <= $durationYearCount; $i++) {
         $startCount = 1;
         $endCount = 12;
         $startDay = $endDay = null;
         //if the end date's year is same as that of start dates's year
         if ($durationYearCount == 0) {
             $startCount = (int) date('m', strtotime($durationFromDate));
             $endCount = (int) date('m', strtotime($durationToDate));
         } elseif ($i == 0) {
             $startCount = (int) date('m', strtotime($durationFromDate));
             $endCount = 12;
         } elseif ($i == $durationYearCount) {
             $startCount = 1;
             $endCount = (int) date('m', strtotime($durationToDate));
         }
         for ($j = $startCount; $j <= $endCount; $j++) {
             $absenceCalendar[date('Y', strtotime($durationFromDate)) + $i][$j] = array('start_day' => 1, 'end_day' => date("t", mktime(0, 0, 0, $j, 1, date('Y', strtotime($durationFromDate)) + $i)), 'month_name' => date("F", mktime(0, 0, 0, $j, 10)));
         }
     }
     //assigning the start_day and end_day to corrosponding month in our absenceCalender array
     $absenceCalendar[date('Y', strtotime($durationFromDate))][(int) date('m', strtotime($durationFromDate))]['actual_start_day'] = (int) date('d', strtotime($durationFromDate));
     $absenceCalendar[date('Y', strtotime($durationToDate))][(int) date('m', strtotime($durationToDate))]['actual_end_day'] = (int) date('d', strtotime($durationToDate));
     foreach ($absenceCalendar as $key => $val) {
         krsort($val);
         $absenceCalendar[$key] = $val;
     }
     krsort($absenceCalendar);
     if (count($validSourceRecordIds) == 0 || !$validSourceRecordIds) {
         CRM_Core_Session::setStatus(ts("There is no absence record for chosen Absence Date range"), ts('No Result Found'));
         return;
     }
     $select = "SELECT\nYEAR(request.activity_date_time) as year,\nMONTH(request.activity_date_time) as month,\nDAY(request.activity_date_time) as day,\nabsence.id as aid,\nabsence.activity_type_id as ati,\nrequest.status_id status,\ncac.contact_id as contact_id,\nrequest.source_record_id,\ncc.sort_name as contact_name";
     $this->from();
     $this->where($validSourceRecordIds);
     $sql = "{$select} {$this->_from} {$this->_where}\nORDER BY YEAR(request.activity_date_time), MONTH(request.activity_date_time), cc.sort_name\n";
     $dao = CRM_Core_DAO::executeQuery($sql);
     if (CRM_Core_Permission::check('access CiviCRM')) {
         $viewLinks = TRUE;
         $onHover = ts('View Contact Summary for this Contact');
         $onHoverAct = ts('View Absence Record');
     }
     while ($dao->fetch()) {
         if (array_key_exists($dao->year, $absenceCalendar) && array_key_exists($dao->month, $absenceCalendar[$dao->year]) && $dao->day >= $absenceCalendar[$dao->year][$dao->month]['start_day'] && $dao->day <= $absenceCalendar[$dao->year][$dao->month]['end_day']) {
             if (array_key_exists('contacts', $absenceCalendar[$dao->year][$dao->month]) && array_key_exists($dao->contact_id, $absenceCalendar[$dao->year][$dao->month]['contacts']) && array_key_exists($dao->day, $absenceCalendar[$dao->year][$dao->month]['contacts'][$dao->contact_id]) && $absenceCalendar[$dao->year][$dao->month]['contacts'][$dao->contact_id][$dao->day]['activity_type_id'] != $dao->ati) {
                 $absenceCalendar[$dao->year][$dao->month]['contacts'][$dao->contact_id][$dao->day]['activity_type_id'] = 'Mixed';
             } else {
                 $absenceCalendar[$dao->year][$dao->month]['contacts'][$dao->contact_id][$dao->day]['activity_type_id'] = $dao->ati;
             }
             if ($viewLinks) {
                 $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $dao->contact_id, $this->_absoluteUrl);
                 $absenceCalendar[$dao->year][$dao->month]['contacts'][$dao->contact_id]['link'] = "<a title='" . $onHover . "' href='" . $url . "' style='font-weight:bold;'>" . $dao->contact_name . "</a>";
             }
             if ($absenceCalendar[$dao->year][$dao->month]['contacts'][$dao->contact_id][$dao->day]['activity_type_id'] != 'Mixed') {
                 $dateUrl = CRM_Utils_System::url("civicrm/absence/set", 'reset=1&action=update&aid=' . $dao->aid, $this->_absoluteUrl);
                 $day_name = "<a title='" . $this->activityStatus[$dao->status] . "' href={$dateUrl} style='" . $statusCSSStyle[$dao->status] . "'>" . substr(date("D", mktime(0, 0, 0, $dao->month, $dao->day, $dao->year)), 0, -1) . "</a>";
             } else {
                 $day_name = substr(date("D", mktime(0, 0, 0, $dao->month, $dao->day, $dao->year)), 0, -1);
             }
             $absenceCalendar[$dao->year][$dao->month]['contacts'][$dao->contact_id][$dao->day]['day_name'] = $day_name;
         }
     }
     //remove those months from calendar report which don't have any absences
     foreach ($absenceCalendar as $year => $monthlyRecord) {
         foreach ($monthlyRecord as $month => $record) {
             if (!array_key_exists('contacts', $record)) {
                 unset($absenceCalendar[$year][$month]);
             }
         }
     }
     $this->modifyColumnHeaders();
     $this->doTemplateAssignment($absenceCalendar);
     $this->endPostProcess($absenceCalendar);
 }