self = $hooks->wrap($this);
$this->ui = $ui;
$this->uri = $uri;
$this->t = $t;
$this->request = $request;
$this->settings = $hooks->wrap( $settings );
$this->newAcl = $hooks->wrap( $newAcl );
$this->viewWeek = $hooks->wrap( $viewWeek );
$this->shiftsDuration = $hooks->wrap( $shiftsDuration );
$this->calendarsQuery = $hooks->wrap( $calendarsQuery );
$this->calendarsPresenter = $hooks->wrap( $calendarsPresenter );
$this->employeesPresenter = $hooks->wrap( $employeesPresenter );
$this->widget = $hooks->wrap( $widget );
$this->common = $hooks->wrap( $common );
$this->shiftsCommon = $hooks->wrap( $shiftsCommon );
$this->allCombos = $this->newAcl->findAllCombos();
$this->allCombosShift = $this->newAcl->findAllCombosShift();
$this->allCombosTimeoff = $this->newAcl->findAllCombosTimeoff();
}
public function renderDateLabel( $date )
{
$slug = $this->request->getSlug();
$today = $this->t->setNow()->formatDateDb();
$this->t->setDateDb( $date );
$weekdayView = $this->t->getWeekdayName();
$weekdayView = $this->ui->makeBlock( $weekdayView )->tag('muted')->tag('font-size', 1);
$ret = $this->t->getDay() . ' ' . $this->t->getMonthName();
$ret = $this->ui->makeListInline( array($weekdayView, $ret) )
->tag('align', 'center')
;
$toDateParams = array();
$toDateParams['type'] = 'day';
$toDateParams['start'] = $date;
$toDate = array( $slug, $toDateParams );
$weekLabel = $this->t->getWeekNo();
$weekLabel = ' [' . '__Week__' . ' #' . $weekLabel . ']';
$ret = $this->ui->makeAhref( $toDate, $ret )
->tag('print')
->addAttr( 'title', $weekLabel )
;
if( $date == $today ){
$ret = $this->ui->makeBlock( $ret )
->tag('border')
->tag('border-color', 'gray')
;
}
return $ret;
}
public function render()
{
$slug = $this->request->getSlug();
$today = $this->t->setNow()->formatDateDb();
$disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE );
$shifts = $this->common->getShifts();
$params = $this->request->getParams();
$startDate = $params['start'];
$startDate = $this->t->setDateDb( $startDate )->setStartWeek()->formatDateDb();
$endDate = $this->t->modify('+2 weeks')->modify('-1 day')->formatDateDb();
$this->t->setDateDb( $startDate );
$dates = array();
$rexDate = $startDate;
while( $rexDate <= $endDate ){
if( $disabledWeekdays ){
$wkd = $this->t->getWeekday();
if( in_array($wkd, $disabledWeekdays) ){
$rexDate = $this->t->modify('+1 day')->formatDateDb();
continue;
}
}
$dates[] = $rexDate;
$rexDate = $this->t->modify('+1 day')->formatDateDb();
}
$viewShifts = array();
$iknow = array('date');
$allCalendars = $this->common->findAllCalendars();
if( count($allCalendars) <= 1 ) $iknow[] = 'calendar';
$this->shiftsDuration->reset();
foreach( $shifts as $shift ){
$this->shiftsDuration->add( $shift );
$start = $shift->getStart();
$end = $shift->getEnd();
$startDayTime = substr($start, 8, 4);
$endDayTime = substr($end, 8, 4);
$shiftAllDay = ( (0 == $startDayTime) && (0 == $endDayTime) ) ? TRUE : FALSE;
$this->t->setDateTimeDb( $end )->modify('-1 second');
$shiftEndDate = $this->t->formatDateDb();
$this->t->setDateTimeDb( $start );
$shiftStartDate = $this->t->formatDateDb();
$rexDate = $shiftStartDate;
while( $rexDate <= $shiftEndDate ){
if( in_array($rexDate, $dates) ){
if( ! array_key_exists($rexDate, $viewShifts) ){
$viewShifts[$rexDate] = array();
}
$viewShifts[$rexDate][] = $shift;
}
if( ! $shiftAllDay ){
break;
}
$this->t->modify( '+1 day' );
$rexDate = $this->t->formatDateDb();
}
}
$this->t->setDateDb( $startDate );
// $monthMatrix = $this->t->getMonthMatrix( $disabledWeekdays );
$monthMatrix = $this->t->getWeeksMatrix( 2, $disabledWeekdays );
$rows = array();
foreach( $monthMatrix as $week => $days ){
$row = array();
foreach( $days as $date ){
if( ! $date ){
$row[] = NULL;
continue;
}
$cell = array();
$this->t->setDateDb( $date );
$dateView = $this->self->renderDateLabel( $date );
$cell[] = $dateView;
if( isset($viewShifts[$date]) ){
$shiftsView = $this->viewWeek->renderDay( $viewShifts[$date], $iknow );
$cell[] = $shiftsView;
}
$to = 'new';
$toParams = array(
'date' => $date
);
if( array_key_exists('employee', $params) && (count($params['employee']) == 1) ){
if( ! in_array(-1, $params['employee']) ){
$toParams['employee'] = $params['employee'][0];
}
}
$links = array();
if( $this->allCombosShift ){
$label = '+' . ' ' . '__Shift__';
$thisTo = 'new/shift';
$thisTo = array( $thisTo, $toParams );
$link = $this->ui->makeAhref( $thisTo, $label )
->tag('tab-link')
->tag('align', 'center')
// ->addAttr('title', '__Add New__')
;
if( $today > $date ){
$link->tag('muted', 3);
}
$links[] = $link;
}
if( $this->allCombosTimeoff ){
$label = '+' . ' ' . '__Time Off__';
$thisTo = 'new/timeoff';
$thisTo = array( $thisTo, $toParams );
$link = $this->ui->makeAhref( $thisTo, $label )
->tag('tab-link')
->tag('align', 'center')
// ->addAttr('title', '__Add New__')
;
if( $today > $date ){
$link->tag('muted', 3);
}
$links[] = $link;
}
$links = $this->ui->makeList( $links )->gutter(0);
$cell[] = $links;
$cell = $this->ui->makeList( $cell )
->gutter(1)
->tag('margin', 1)
;
$row[] = $cell;
}
$rows[] = $row;
}
$out = $this->ui->makeTable( NULL, $rows, FALSE )
->gutter(0)
->setBordered( $this->borderColor )
// ->setSegments( $weekSegments )
;
return $out;
}
public function renderByCalendar()
{
$slug = $this->request->getSlug();
$today = $this->t->setNow()->formatDateDb();
$disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE );
$calendars = $this->common->getCalendars();
$employees = $this->common->getEmployees();
$shifts = $this->common->getShifts();
// finalize calendars to include those that employee was removed from but still have shifts in
$listCalendarId = array_keys( $calendars );
$dictCalendarId = array_combine( $listCalendarId, $listCalendarId );
foreach( $shifts as $shift ){
$calendar = $shift->getCalendar();
if( ! $calendar ) continue;
$calendarId = $calendar->getId();
$dictCalendarId[ $calendarId ] = $calendarId;
}
if( count($dictCalendarId) > count($calendars) ){
$allCalendars = $this->common->findAllCalendars();
$calendars = array_intersect_key( $allCalendars, $dictCalendarId );
}
// we can probably have archived calendars so if such calendars have no shifts then skip them
$removeArchivedCalendars = array();
foreach( $calendars as $calendar ){
if( $calendar->isArchived() ){
$removeArchivedCalendars[ $calendar->getId() ] = $calendar->getId();
}
}
if( $removeArchivedCalendars ){
foreach( $shifts as $shift ){
$calendar = $shift->getCalendar();
$id = $calendar ? $calendar->getId() : 0;
if( isset($removeArchivedCalendars[$id]) ){
unset( $removeArchivedCalendars[$id] );
}
if( ! $removeArchivedCalendars ){
break;
}
}
foreach( $removeArchivedCalendars as $id ){
unset( $calendars[$id] );
}
reset( $shifts );
}
$params = $this->request->getParams();
$startDate = $params['start'];
$startDate = $this->t->setDateDb( $startDate )->setStartWeek()->formatDateDb();
$endDate = $this->t->modify('+2 weeks')->modify('-1 day')->formatDateDb();
$this->t->setDateDb( $startDate );
$dates = array();
$rexDate = $startDate;
while( $rexDate <= $endDate ){
if( $disabledWeekdays ){
$wkd = $this->t->getWeekday();
if( in_array($wkd, $disabledWeekdays) ){
$rexDate = $this->t->modify('+1 day')->formatDateDb();
continue;
}
}
$dates[] = $rexDate;
$rexDate = $this->t->modify('+1 day')->formatDateDb();
}
$viewCalendars = array();
foreach( $calendars as $calendar ){
$label = $this->calendarsPresenter->presentTitle( $calendar );
$title = htmlspecialchars( $calendar->getTitle() );
$description = $calendar->getDescription();
if( strlen($description) ){
$description = htmlspecialchars( $description );
$title .= "\n" . $description;
}
$label = $this->ui->makeSpan( $label )
->addAttr( 'title', $title )
;
$viewCalendars[ $calendar->getId() ] = $label;
}
$viewShifts = array();
$iknow = array('calendar', 'date');
foreach( $shifts as $shift ){
$calendar = $shift->getCalendar();
$id = $calendar ? $calendar->getId() : 0;
if( ! array_key_exists($id, $viewShifts) ){
$viewShifts[$id] = array();
}
$start = $shift->getStart();
$end = $shift->getEnd();
$startDayTime = substr($start, 8, 4);
$endDayTime = substr($end, 8, 4);
$shiftAllDay = ( (0 == $startDayTime) && (0 == $endDayTime) ) ? TRUE : FALSE;
$this->t->setDateTimeDb( $end )->modify('-1 second');
$shiftEndDate = $this->t->formatDateDb();
$this->t->setDateTimeDb( $start );
$shiftStartDate = $this->t->formatDateDb();
$rexDate = $shiftStartDate;
while( $rexDate <= $shiftEndDate ){
if( in_array($rexDate, $dates) ){
if( ! array_key_exists($rexDate, $viewShifts[$id]) ){
$viewShifts[$id][$rexDate] = array();
}
$viewShifts[$id][$rexDate][] = $shift;
}
if( ! $shiftAllDay ){
break;
}
$this->t->modify( '+1 day' );
$rexDate = $this->t->formatDateDb();
}
}
$header = array();
$header[] = NULL;
$weekStartsOn = $this->t->getWeekStartsOn();
$weekSegments = array();
$this->t->setDateDb( $startDate );
// $monthMatrix = $this->t->getMonthMatrix( $disabledWeekdays );
$monthMatrix = $this->t->getWeeksMatrix( 2, $disabledWeekdays );
foreach( $monthMatrix as $week => $days ){
$wdi = 0;
foreach( $days as $date ){
if( ! $date ){
continue;
}
$this->t->setDateDb( $date );
$dateView = array();
$weekdayView = $this->t->getWeekdayName();
$weekdayView = $this->ui->makeBlock( $weekdayView )->tag('muted')->tag('font-size', 1);
$dateView[] = $weekdayView;
$dayView = $this->t->getDay();
$dateView[] = $dayView;
$dateView[] = $this->t->getMonthName();
$dateView = $this->ui->makeList($dateView)
->gutter(0)
->tag('align', 'center')
;
$toDateParams = array();
$toDateParams['type'] = 'day';
$toDateParams['start'] = $date;
$toDate = array( $slug, $toDateParams );
$weekLabel = $this->t->getWeekNo();
$weekLabel = ' [' . '__Week__' . ' #' . $weekLabel . ']';
$dateView = $this->ui->makeAhref( $toDate, $dateView )
->tag('print')
->addAttr( 'title', $weekLabel )
;
if( $date == $today ){
$dateView = $this->ui->makeBlock( $dateView )
->tag('border')
->tag('border-color', 'gray')
;
}
$header[] = $dateView;
if( ! $wdi ){
$weekSegments[] = count($header);
}
$wdi++;
}
}
// while( count($header) < 32 ){
// $header[] = NULL;
// }
$rows = array();
// link templates to speed things up
$toParams = array(
'calendar' => '{CID}',
'date' => '{DATE}'
);
$thisTo = 'new/calendar';
$thisTo = array( $thisTo, $toParams );
$thisHref = $this->uri->makeUrl( $thisTo );
$linkTemplateShift = '+';
$linkTemplateShiftMuted = '+';
$isPrintView = $this->request->isPrintView();
foreach( $viewCalendars as $id => $calendarView ){
$row = array();
$this->shiftsDuration->reset();
if( isset($viewShifts[$id]) ){
foreach( $viewShifts[$id] as $date => $dateShifts ){
foreach( $dateShifts as $shift ){
$this->shiftsDuration->add( $shift );
}
}
$outReport = $this->common->renderReport( $this->shiftsDuration, FALSE );
$outReport = $this->ui->makeSpan( $outReport )
->tag('font-size', 2)
;
$calendarView = $this->ui->makeList( array($calendarView, $outReport) )
->gutter(1)
;
}
$calendarView = $this->ui->makeBlock( $calendarView )
->tag('padding', array('x1', 'y2'))
->tag('nowrap')
;
$row[] = $calendarView;
$countDates = count( $dates );
foreach( $dates as $date ){
$cell = array();
if( isset($viewShifts[$id][$date]) ){
// if( $countDates <= 15 ){
$shiftsView = $this->viewWeek->renderDay( $viewShifts[$id][$date], $iknow );
// }
// else {
// $shiftsView = $this->viewMonth->renderDay( $viewShifts[$id][$date], $iknow );
// }
$cell[] = $shiftsView;
}
$label = '+';
$to = 'new';
$toParams = array(
'date' => $date,
'calendar' => $id,
);
if( array_key_exists('employee', $params) && (count($params['employee']) == 1) ){
if( ! in_array(-1, $params['employee']) ){
$toParams['employee'] = $params['employee'][0];
}
}
$to = array( $to, $toParams );
$addOk = FALSE;
if( isset($toParams['employee']) ){
$testComboId = $id . '-' . $toParams['employee'];
if( isset($this->allCombos[$testComboId]) ){
$addOk = TRUE;
}
}
else {
$testComboId = $id . '-';
reset( $this->allCombos );
foreach( $this->allCombos as $comboId ){
if( $testComboId == substr($comboId, 0, strlen($testComboId)) ){
$addOk = TRUE;
break;
}
}
}
if( $isPrintView ) $addOk = false;
if( $addOk ){
/*
$link = $this->ui->makeAhref( $to, $label )
->tag('tab-link')
->tag('align', 'center')
->addAttr('title', '__Add New__')
;
if( $today > $date ){
$link->tag('muted', 3);
}
*/
if( $today > $date ){
$link = str_replace( array('{CID}', '{DATE}'), array($id, $date), $linkTemplateShiftMuted );
}
else {
$link = str_replace( array('{CID}', '{DATE}'), array($id, $date), $linkTemplateShift );
}
$cell[] = $link;
}
$cell = $this->ui->makeList( $cell )
->gutter(1)
->tag('margin', '05')
;
$row[] = $cell;
}
// while( count($row) < 32 ){
// $row[] = NULL;
// }
$rows[] = $row;
}
$out = $this->ui->makeTable( $header, $rows, FALSE )
->gutter(0)
->setBordered( $this->borderColor )
->setSegments( $weekSegments )
->setLabelled( TRUE )
;
return $out;
}
public function renderByEmployee()
{
$slug = $this->request->getSlug();
$today = $this->t->setNow()->formatDateDb();
$disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE );
$calendars = $this->common->getCalendars();
$employees = $this->common->getEmployees();
$shifts = $this->common->getShifts();
// finalize employees to include those that employee was removed from but still have shifts in
$listEmployeeId = array_keys( $employees );
$dictEmployeeId = array_combine( $listEmployeeId, $listEmployeeId );
foreach( $shifts as $shift ){
$employee = $shift->getEmployee();
if( ! $employee ) continue;
$employeeId = $employee->getId();
$dictEmployeeId[ $employeeId ] = $employeeId;
}
if( count($dictEmployeeId) > count($employees) ){
$allEmployees = $this->common->findAllEmployees();
$employees = array_intersect_key( $allEmployees, $dictEmployeeId );
}
// we can probably have archived employees so if such employees have no shifts then skip them
$removeArchivedEmployees = array();
foreach( $employees as $employee ){
if( $employee->isArchived() ){
$removeArchivedEmployees[ $employee->getId() ] = $employee->getId();
}
}
if( $removeArchivedEmployees ){
foreach( $shifts as $shift ){
$employee = $shift->getEmployee();
$id = $employee ? $employee->getId() : 0;
if( isset($removeArchivedEmployees[$id]) ){
unset( $removeArchivedEmployees[$id] );
}
if( ! $removeArchivedEmployees ){
break;
}
}
foreach( $removeArchivedEmployees as $id ){
unset( $employees[$id] );
}
reset( $shifts );
}
$params = $this->request->getParams();
$startDate = $params['start'];
$startDate = $this->t->setDateDb( $startDate )->setStartWeek()->formatDateDb();
$endDate = $this->t->modify('+2 weeks')->modify('-1 day')->formatDateDb();
$this->t->setDateDb( $startDate );
$dates = array();
$rexDate = $startDate;
while( $rexDate <= $endDate ){
if( $disabledWeekdays ){
$wkd = $this->t->getWeekday();
if( in_array($wkd, $disabledWeekdays) ){
$rexDate = $this->t->modify('+1 day')->formatDateDb();
continue;
}
}
$dates[] = $rexDate;
$rexDate = $this->t->modify('+1 day')->formatDateDb();
}
$viewEmployees = array();
foreach( $employees as $employee ){
$label = $this->employeesPresenter->presentTitle( $employee );
$title = htmlspecialchars( $label );
$description = $employee->getDescription();
if( strlen($description) ){
$imgpos = strpos( $description, '
ui->makeList( array($label, $description) );
}
else {
$title .= "\n" . htmlspecialchars( $description );
}
}
$label = $this->ui->makeSpan( $label )
->tag( 'font-size', 4 )
->addAttr( 'title', $title )
;
$viewEmployees[ $employee->getId() ] = $label;
}
$viewShifts = array();
$iknow = array('employee', 'date');
$allCalendars = $this->common->findAllCalendars();
if( count($allCalendars) <= 1 ) $iknow[] = 'calendar';
foreach( $shifts as $shift ){
$employee = $shift->getEmployee();
$id = $employee ? $employee->getId() : 0;
if( ! array_key_exists($id, $viewShifts) ){
$viewShifts[$id] = array();
}
$start = $shift->getStart();
$end = $shift->getEnd();
$startDayTime = substr($start, 8, 4);
$endDayTime = substr($end, 8, 4);
$shiftAllDay = ( (0 == $startDayTime) && (0 == $endDayTime) ) ? TRUE : FALSE;
$this->t->setDateTimeDb( $end )->modify('-1 second');
$shiftEndDate = $this->t->formatDateDb();
$this->t->setDateTimeDb( $start );
$shiftStartDate = $this->t->formatDateDb();
$rexDate = $shiftStartDate;
while( $rexDate <= $shiftEndDate ){
if( in_array($rexDate, $dates) ){
if( ! array_key_exists($rexDate, $viewShifts[$id]) ){
$viewShifts[$id][$rexDate] = array();
}
$viewShifts[$id][$rexDate][] = $shift;
}
if( ! $shiftAllDay ){
break;
}
$this->t->modify( '+1 day' );
$rexDate = $this->t->formatDateDb();
}
}
$header = array();
$header[] = NULL;
$weekStartsOn = $this->t->getWeekStartsOn();
$weekSegments = array();
$this->t->setDateDb( $startDate );
// $monthMatrix = $this->t->getMonthMatrix( $disabledWeekdays );
$monthMatrix = $this->t->getWeeksMatrix( 2, $disabledWeekdays );
foreach( $monthMatrix as $week => $days ){
$wdi = 0;
foreach( $days as $date ){
if( ! $date ){
continue;
}
$this->t->setDateDb( $date );
$dateView = array();
$weekdayView = $this->t->getWeekdayName();
$weekdayView = $this->ui->makeBlock( $weekdayView )->tag('muted')->tag('font-size', 1);
$dateView[] = $weekdayView;
$dayView = $this->t->getDay();
$dateView[] = $dayView;
$dateView[] = $this->t->getMonthName();
$dateView = $this->ui->makeList($dateView)
->gutter(0)
->tag('align', 'center')
;
$toDateParams = array();
$toDateParams['type'] = 'day';
$toDateParams['start'] = $date;
$toDate = array( $slug, $toDateParams );
$weekLabel = $this->t->getWeekNo();
$weekLabel = ' [' . '__Week__' . ' #' . $weekLabel . ']';
$dateView = $this->ui->makeAhref( $toDate, $dateView )
->tag('print')
->addAttr( 'title', $weekLabel )
;
if( $date == $today ){
$dateView = $this->ui->makeBlock( $dateView )
->tag('border')
->tag('border-color', 'gray')
;
}
$header[] = $dateView;
if( ! $wdi ){
$weekSegments[] = count($header);
}
$wdi++;
}
}
// while( count($header) < 32 ){
// $header[] = NULL;
// }
$rows = array();
// link templates to speed things up
$toParams = array(
'employee' => '{EID}',
'date' => '{DATE}'
);
$thisTo = 'new';
$thisTo = array( $thisTo, $toParams );
$thisHref = $this->uri->makeUrl( $thisTo );
$linkTemplateShift = '+';
$linkTemplateShiftMuted = '+';
$isPrintView = $this->request->isPrintView();
foreach( $viewEmployees as $id => $employeeView ){
$row = array();
$this->shiftsDuration->reset();
if( isset($viewShifts[$id]) ){
$counted = 0;
foreach( $viewShifts[$id] as $date => $dateShifts ){
foreach( $dateShifts as $shift ){
$shiftCalendar = $shift->getCalendar();
// if( $shiftCalendar->isTimeoff() ){
// continue;
// }
$this->shiftsDuration->add( $shift );
$counted++;
}
}
if( $counted ){
$outReport = $this->common->renderReport( $this->shiftsDuration, FALSE );
$outReport = $this->ui->makeSpan( $outReport )
->tag('font-size', 2)
;
$employeeView = $this->ui->makeList( array($employeeView, $outReport) )
->gutter(1)
;
}
}
$thisShifts = isset($viewShifts[$id]) ? $viewShifts[$id] : array();
$employeeView = $this->common->employeeRowLabel( $employeeView, $id, '4weeks', $dates, $thisShifts );
$employeeView = $this->ui->makeBlock( $employeeView )
->tag('padding', array('x1', 'y2'))
->tag('nowrap')
;
$row[] = $employeeView;
$countDates = count( $dates );
foreach( $dates as $date ){
$cell = array();
if( isset($viewShifts[$id][$date]) ){
// if( $countDates <= 10 ){
$shiftsView = $this->viewWeek->renderDay( $viewShifts[$id][$date], $iknow );
// }
// else {
// $shiftsView = $this->viewMonth->renderDay( $viewShifts[$id][$date], $iknow );
// }
$cell[] = $shiftsView;
}
$comboId = 0 . '-' . $id;
if( isset($this->allCombos[$comboId]) ){
/*
$label = '+';
$to = 'new';
$toParams = array(
'date' => $date,
'employee' => $id,
);
$to = array( $to, $toParams );
$link = $this->ui->makeAhref( $to, $label )
->tag('tab-link')
->tag('align', 'center')
->addAttr('title', '__Add New__')
;
if( $today > $date ){
$link->tag('muted', 3);
}
*/
if( $today > $date ){
$link = str_replace( array('{EID}', '{DATE}'), array($id, $date), $linkTemplateShiftMuted );
}
else {
$link = str_replace( array('{EID}', '{DATE}'), array($id, $date), $linkTemplateShift );
}
if( ! $isPrintView ){
$cell[] = $link;
}
}
$cell = $this->ui->makeList( $cell )
->gutter(1)
->tag('margin', '05')
;
$row[] = $cell;
}
// while( count($row) < 32 ){
// $row[] = NULL;
// }
$rows[] = $row;
}
/* append calendars summary */
$appendCalendars = $this->settings->get('datetime_summary_by_calendar');
if( $appendCalendars && $shifts ){
$calendarIds = array();
foreach( $shifts as $shift ){
$calendar = $shift->getCalendar();
$calendarId = $calendar ? $calendar->getId() : 0;
if( ! $calendarId ) continue;
$calendarIds[ $calendarId ] = $calendarId;
}
$calendars = $this->calendarsQuery->findManyById( $calendarIds );
$shiftsByCalendar = $shiftsByDate = array();
foreach( $shifts as $shift ){
$thisCalendar = $shift->getCalendar();
if( ! $thisCalendar ) continue;
$shiftId = $shift->getId();
$thisCalendarId = $thisCalendar->getId();
$shiftsByCalendar[ $thisCalendarId ][ $shiftId ] = $shift;
$start = $shift->getStart();
$end = $shift->getEnd();
$startDayTime = substr($start, 8, 4);
$endDayTime = substr($end, 8, 4);
$shiftAllDay = ( (0 == $startDayTime) && (0 == $endDayTime) ) ? TRUE : FALSE;
$this->t->setDateTimeDb( $end )->modify('-1 second');
$shiftEndDate = $this->t->formatDateDb();
$this->t->setDateTimeDb( $start );
$shiftStartDate = $this->t->formatDateDb();
$rexDate = $shiftStartDate;
while( $rexDate <= $shiftEndDate ){
if( in_array($rexDate, $dates) ){
$shiftsByDate[ $rexDate ][ $shiftId ] = $shift;
}
if( ! $shiftAllDay ){
break;
}
$this->t->modify( '+1 day' );
$rexDate = $this->t->formatDateDb();
}
}
foreach( $calendars as $calendarId => $calendar ){
$row = array();
$calendarView = $this->calendarsPresenter->presentTitle( $calendar );
$title = htmlspecialchars( $calendar->getTitle() );
$calendarView = $this->ui->makeSpan( $calendarView )
->addAttr( 'title', $title )
;
$this->shiftsDuration->reset();
foreach( $shiftsByCalendar[$calendarId] as $shift ){
$this->shiftsDuration->add( $shift );
}
$outReport = $this->common->renderReport( $this->shiftsDuration, FALSE );
$outReport = $this->ui->makeSpan( $outReport )
->tag('font-size', 2)
;
$calendarView = $this->ui->makeList( array($calendarView, $outReport) )
->gutter(1)
;
$calendarView = $this->ui->makeBlock( $calendarView )
->tag('padding', 2)
->tag('nowrap')
;
$row[] = $calendarView;
foreach( $dates as $date ){
$cell = '';
if( isset($shiftsByDate[$date]) ){
$thisShifts = array_intersect_key( $shiftsByDate[$date], $shiftsByCalendar[$calendarId] );
if( $thisShifts ){
$this->shiftsDuration->reset();
foreach( $thisShifts as $shift ){
$this->shiftsDuration->add( $shift );
}
$outReport = $this->common->renderReport( $this->shiftsDuration, false, true );
$outReport = $this->ui->makeSpan( $outReport )
->tag('font-size', 2)
;
$outReport = $this->ui->makeBlock( $outReport )
->tag('align', 'center')
;
$cell = $outReport;
}
}
$row[] = $cell;
}
$rows[] = $row;
}
}
$out = $this->ui->makeTable( $header, $rows, FALSE )
->gutter(0)
->setBordered( $this->borderColor )
->setSegments( $weekSegments )
->setLabelled( TRUE )
;
return $out;
}
}