row
$scheduleMap = [];
foreach ($scheduleRows as $row) {
$scheduleMap[$row->weekday] = $row;
}
// Calendar math
$firstDay = mktime(0, 0, 0, $month, 1, $year);
$daysInMonth = (int)date('t', $firstDay);
// day-of-week of 1st (0=Sun, so Mon=1)
$startDow = (int)date('w', $firstDay); // 0=Sun..6=Sat
// Convert to Mon-based: Mon=0 .. Sun=6
$startOffset = ($startDow + 6) % 7;
$today = date('Y-m-d');
$monthLabel = strftime('%Y %B', $firstDay); // Hungarian month names via locale
// Fallback: PHP intl not guaranteed; build own table
$monthNames = ['január','február','március','április','május','június','július','augusztus','szeptember','október','november','december'];
$monthLabel = $year . ' ' . $monthNames[$month - 1];
$prevMonth = $month == 1 ? 12 : $month - 1;
$prevYear = $month == 1 ? $year - 1 : $year;
$nextMonth = $month == 12 ? 1 : $month + 1;
$nextYear = $month == 12 ? $year + 1 : $year;
$prevParam = $prevYear . '-' . str_pad($prevMonth, 2, '0', STR_PAD_LEFT);
$nextParam = $nextYear . '-' . str_pad($nextMonth, 2, '0', STR_PAD_LEFT);
$workerId = $selectedWorker->worker_id;
?>
Munkanap
Szabad nap
Napiszabadság
Szabadság
Betegszabadság
Egyedi munkaidő
Egyéb
Ebédszünet (auto)
| H | K | Sz | Cs | P | Sz | V |
PHP weekday=1, ... Sun=6 -> PHP=0
echo '';
// Empty cells before first day
for ($i = 0; $i < $startOffset; $i++) {
echo ' | ';
$cell++;
}
while ($day <= $daysInMonth) {
if ($cell % 7 === 0 && $cell > 0) {
echo '
';
}
$colIndex = $cell % 7; // 0=Mon .. 6=Sun
$phpWeekday = $phpDow[$colIndex]; // PHP weekday number
$dateStr = $year . '-' . str_pad($month, 2, '0', STR_PAD_LEFT) . '-' . str_pad($day, 2, '0', STR_PAD_LEFT);
$isToday = ($dateStr === $today);
// Determine status
$override = isset($overridesByDate[$dateStr]) ? $overridesByDate[$dateStr] : null;
$hasSchedule = isset($scheduleMap[$phpWeekday]);
$badgeHtml = '';
$cellTitle = '';
$overrideJson = 'null';
if ($override) {
$absType = $override->absence_type ?? null;
if ($absType === 'vacation') {
$badgeHtml = 'Szabadság';
$cellTitle = 'Szabadság';
} elseif ($absType === 'sick') {
$badgeHtml = 'Beteg';
$cellTitle = 'Betegszabadság';
} elseif ($absType === 'custom') {
$st = substr($override->start_time, 0, 5);
$et = substr($override->end_time, 0, 5);
$badgeHtml = ''.$st.'–'.$et.'';
$cellTitle = 'Egyedi: '.$st.'–'.$et;
} elseif ($absType === 'other') {
$badgeHtml = 'Egyéb';
$cellTitle = 'Egyéb';
} else {
// is_day_off=1, no absence_type = plain day off
$badgeHtml = 'Szabad';
$cellTitle = 'Napi szabadság';
}
$overrideJson = json_encode([
'is_day_off' => (int)$override->is_day_off,
'absence_type' => $override->absence_type,
'start_time' => $override->start_time ? substr($override->start_time, 0, 5) : '',
'end_time' => $override->end_time ? substr($override->end_time, 0, 5) : '',
'note' => $override->note ?? '',
]);
} elseif ($hasSchedule) {
$sch = $scheduleMap[$phpWeekday];
$st = substr($sch->start_time, 0, 5);
$et = substr($sch->end_time, 0, 5);
$badgeHtml = ''.$st.'–'.$et.'';
$cellTitle = 'Munkanap: '.$st.'–'.$et;
} else {
$badgeHtml = 'Szabad';
$cellTitle = 'Nem dolgozik';
}
$todayClass = $isToday ? ' cal-today' : '';
$encodedDate = htmlspecialchars(json_encode($dateStr), ENT_QUOTES);
$encodedWid = htmlspecialchars(json_encode($workerId), ENT_QUOTES);
$encodedOver = htmlspecialchars($overrideJson, ENT_QUOTES);
echo '| ';
echo ' '.$day.' ';
echo $badgeHtml;
if (isset($lunchByDate[$dateStr])) {
$lb = $lunchByDate[$dateStr];
echo '🍴 '.$lb['start'].'–'.$lb['end'].'';
}
echo ' | ';
$day++;
$cell++;
}
// Pad remaining cells
while ($cell % 7 !== 0) {
echo ' | ';
$cell++;
}
echo '
';
?>