Kalender Update

* Feature Implementation Excel Export
This commit is contained in:
Daniel Spitzer
2025-03-03 09:21:24 +01:00
parent 007a04f332
commit cb67e821ec
5 changed files with 391 additions and 171 deletions

View File

@@ -1,5 +1,12 @@
<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Helper\Html;
class CalendarController extends mfBaseController
{
@@ -45,6 +52,11 @@ class CalendarController extends mfBaseController
$calendarEvents = CalendarModel::searchCalendarEvents($r);
return $calendarEvents;
die();
case "generateCalendarEventsXlsx" :
$r = $this->request;
$this->generateXlsx($r);
return $calendarEvents;
die();
case "getCalendarEventAttachment" :
$r = $this->request;
$id = ($r->id);
@@ -110,9 +122,9 @@ class CalendarController extends mfBaseController
case "insertCalendarEvent":
$r = $this->request;
if ($r->rruleData) {
$rrules=json_encode($this->generateGraphRecurrence($r->rruleData, $r->start));
$rrules = json_encode($this->generateGraphRecurrence($r->rruleData, $r->start));
}
$calendarEvents = CalendarModel::insertCalendarEvent($r, $this->me,$rrules);
$calendarEvents = CalendarModel::insertCalendarEvent($r, $this->me, $rrules);
if ($r->customer_info_check) {
if ($r->customer_info_type == 1) {
$body = $r->customer_info_text;
@@ -392,10 +404,11 @@ class CalendarController extends mfBaseController
die();
}
private function generateGraphRecurrence($data, $startDate) {
private function generateGraphRecurrence($data, $startDate)
{
$graph = [
'pattern' => [],
'range' => []
'range' => []
];
$freq = strtoupper($data['rrule_frequency']);
switch ($freq) {
@@ -414,10 +427,10 @@ class CalendarController extends mfBaseController
// Mapping: 1 => first, 2 => second, 3 => third, 4 => fourth, -1 => last
$setpos = intval($data['rrule_setpos']);
$indexMapping = [
1 => 'first',
2 => 'second',
3 => 'third',
4 => 'fourth',
1 => 'first',
2 => 'second',
3 => 'third',
4 => 'fourth',
-1 => 'last'
];
$graph['pattern']['index'] = isset($indexMapping[$setpos]) ? $indexMapping[$setpos] : 'first';
@@ -438,7 +451,7 @@ class CalendarController extends mfBaseController
if ($freq === 'WEEKLY' && !empty($data['rrule-byweekday'])) {
$days = is_array($data['rrule-byweekday']) ? $data['rrule-byweekday'] : [$data['rrule-byweekday']];
$graphDays = [];
foreach($days as $day) {
foreach ($days as $day) {
$graphDays[] = $this->convertDayToGraph(strtoupper($day));
}
$graph['pattern']['daysOfWeek'] = $graphDays;
@@ -459,7 +472,8 @@ class CalendarController extends mfBaseController
}
private function convertDayToGraph($dayAbbrev) {
private function convertDayToGraph($dayAbbrev)
{
$mapping = [
'MO' => 'monday',
'TU' => 'tuesday',
@@ -472,6 +486,104 @@ class CalendarController extends mfBaseController
return isset($mapping[$dayAbbrev]) ? $mapping[$dayAbbrev] : $dayAbbrev;
}
private function generateXlsx($r)
{
$calendarEvents = json_decode(CalendarModel::getCalendarEvents($this->me->id, 0, $r, true), true);
$eventTypes = CalendarModel::$eventTypes;
$xls = new Spreadsheet();
$sheet = $xls->getActiveSheet();
$writer = new Xlsx($xls);
$sheet->getStyle('A1:AN1')->getFont()->setBold(true);
$sheet->getStyle('A:E')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
$sheet->getStyle('I:L')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
$sheet->getColumnDimension('A')->setWidth(25);
$sheet->getColumnDimension('B')->setWidth(15);
$sheet->getColumnDimension('C')->setWidth(10);
$sheet->getColumnDimension('D')->setWidth(15);
$sheet->getColumnDimension('E')->setWidth(10);
$sheet->getColumnDimension('F')->setWidth(40);
$sheet->getColumnDimension('G')->setWidth(40);
$sheet->getColumnDimension('H')->setWidth(20);
$sheet->getColumnDimension('I')->setWidth(10);
$sheet->getColumnDimension('J')->setWidth(10);
$sheet->getColumnDimension('K')->setWidth(15);
$sheet->getColumnDimension('L')->setWidth(15);
$sheet->setCellValue([1, 1], 'Kalender')
->setCellValue([2, 1], 'Startdatum')
->setCellValue([3, 1], 'Startzeit')
->setCellValue([4, 1], 'Enddatum')
->setCellValue([5, 1], 'Endzeit')
->setCellValue([6, 1], 'Betreff')
->setCellValue([7, 1], 'Ort')
->setCellValue([8, 1], 'Beschreibung')
->setCellValue([9, 1], 'Termintyp')
->setCellValue([10, 1], 'Privat')
->setCellValue([11, 1], 'Sichtbarkeit')
->setCellValue([12, 1], 'Organisator')
;
$counter = 2;
foreach ($calendarEvents['data'] as $event) {
if ($event['privateflag']['privateflag']) {
$event['privateflag']['privateflag'] = "Ja";
} else {
$event['privateflag']['privateflag'] = "Nein";
}
if ($event['isorganizer']['isorganizer']) {
$event['isorganizer']['isorganizer'] = "Ja";
} else {
$event['isorganizer']['isorganizer'] = "Nein";
}
if ($event['busy']['busy'] == 1) {
$event['busy']['busy'] = "gebucht";
} else if ($event['busy']['busy'] == 2) {
$event['busy']['busy'] = "mit Vorbehalt";
} else {
$event['busy']['busy'] = "frei";
}
if ($event['allDay']['allDay'] == 0) {
$starttime = date("H:i", strtotime($event['cstart']['cstart']));
$endtime = date("H:i", strtotime($event['cend']['cend']));
$startdate = date("d.m.Y", strtotime($event['cstart']['cstart']));
$enddate = date("d.m.Y", strtotime($event['cend']['cend']));
} else {
$starttime = "";
$startdate = date("d.m.Y", strtotime($event['cstart']['cstart']));
$endtime = "";
$enddate = date("d.m.Y", strtotime($event['cend']['cend']) - 7500);
}
if ($event['event_type']['event_type'] != "") {
$helper = new Html();
$richText = $helper->toRichTextObject($event['description']['description']);
$calendarType = $eventTypes[$event['event_type']['event_type']];
$sheet->setCellValue([1, $counter], $event['calendar_name']['calendar_name'])
->setCellValue([2, $counter], $startdate)
->setCellValue([3, $counter], $starttime)
->setCellValue([4, $counter], $enddate)
->setCellValue([5, $counter], $endtime)
->setCellValue([6, $counter], $event['ccategory']['ccategory'])
->setCellValue([7, $counter], $event['location']['location'])
->setCellValue([8, $counter], $richText)
->setCellValue([9, $counter], $calendarType)
->setCellValue([10, $counter], $event['privateflag']['privateflag'])
->setCellValue([11, $counter], $event['busy']['busy'])
->setCellValue([12, $counter], $event['isorganizer']['isorganizer'])
;
$counter++;
}
}
header("Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-disposition: attachment; filename="Kalender-' . date('Y-m-d_H-i-s') . '-' . uniqid() . '.xlsx"');
$writer->save('php://output');
exit;
}
protected function indexAction()
{
$this->layout()->setTemplate("Calendar/Index");

View File

@@ -32,6 +32,15 @@ class CalendarModel
'690', // Spusu
'699' // 3 (Drei)
);
public static $eventTypes = array(
1 => 'Termin',
2 => 'IBN Xinon',
3 => 'IBN ESTMK',
4 => 'IBN Snopp',
5 => 'Störung',
6 => 'Support Gespräch'
);
public static $standardCalendarColors = [
'#b3d5f3', '#d0e2c0', '#bac2d4', '#c6d4c0', '#e3e3e3',
'#acdce5', '#cdb6c0', '#aae0e1', '#d9d9d9', '#d9e5d5',
@@ -149,7 +158,7 @@ class CalendarModel
die();
}
public static function getCalendarEvents($me, $id = 0, $r = 0)
public static function getCalendarEvents($me, $id = 0, $r = 0, $returnvalues = false)
{
$rrulefreq = array('daily' => 'DAILY', 'weekly' => 'WEEKLY', 'relativeMonthly' => 'MONTHLY', 'yearly' => 'YEARLY', 'absoluteMonthly' => 'absoluteMonthly');
$calendar = self::search(array("user_id" => $me));
@@ -196,7 +205,7 @@ class CalendarModel
}
$sql = "SELECT `cal_events`.id,`cal_events`.categories, uuid, calendar_id, `cal_events`.user_id, start_time, end_time, timezone, all_day_event, `cal_events`.name,`cal_calendars`.name calendar_name, description, location, repeat_end_time, reminder, ctime,cname, mtime,mname, muser_id, busy, status, resource_event_id, private, rrule, `cal_events`.background, `cal_events`.files_folder_id, read_only, category_id, exception_for_event_id, recurrence_id, is_organizer,event_type,busy,recurrence,rrule_events FROM cal_events INNER JOIN `cal_calendars` ON (`cal_calendars`.`id`=`cal_events`.`calendar_id`) WHERE 1=1 $where ";
$sql = "SELECT `cal_events`.id,`cal_events`.categories, uuid, calendar_id, `cal_events`.user_id, start_time, end_time, timezone, all_day_event, `cal_events`.name,`cal_calendars`.name calendar_name, description, location, repeat_end_time, reminder, ctime,cname, mtime,mname, muser_id, busy, status, resource_event_id, private, rrule, `cal_events`.background, `cal_events`.files_folder_id, read_only, category_id, exception_for_event_id, recurrence_id, is_organizer,event_type,busy,recurrence,rrule_events FROM cal_events INNER JOIN `cal_calendars` ON (`cal_calendars`.`id`=`cal_events`.`calendar_id`) WHERE 1=1 $where ORDER BY start_time DESC";
$res = $dbcal->query($sql);
if ($dbcal->num_rows($res)) {
@@ -384,7 +393,7 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
$json = json_encode($json);
if ($id == 0) {
if ($id == 0 && $returnvalues == false) {
echo trim($json);
die();
} else {