From bcd85f131b105b3439c5be73ae7de0d215ba67e9 Mon Sep 17 00:00:00 2001 From: Niek Rabelink Date: Sat, 12 Sep 2026 10:45:31 +0200 Subject: [PATCH] Workdays --- admin.php | 60 ++++++++++++++++++++++++++++++++- api/planner.php | 10 ++++-- includes/settings.php | 7 ++++ planner.php | 78 ++++++++++++++++++++++++++++++++++--------- 4 files changed, 135 insertions(+), 20 deletions(-) diff --git a/admin.php b/admin.php index c5bf984..9194cfa 100644 --- a/admin.php +++ b/admin.php @@ -174,6 +174,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 3. Organisatie Werkdag Standaarden opslaan (Release v1.4) elseif ($action === 'save_workday_settings') { + $rawWorkdays = isset($_POST['workdays']) && is_array($_POST['workdays']) + ? array_values(array_filter(array_map('intval', $_POST['workdays']), fn($d) => $d >= 1 && $d <= 7)) + : [1, 2, 3, 4, 5]; + if (empty($rawWorkdays)) { + $rawWorkdays = [1, 2, 3, 4, 5]; + } + sort($rawWorkdays); + $workdaysStr = implode(',', $rawWorkdays); + $workdayStart = trim($_POST['workday_start'] ?? '08:30'); $workdayEnd = trim($_POST['workday_end'] ?? '17:00'); $lunchStart = trim($_POST['lunch_start'] ?? '12:30'); @@ -183,6 +192,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $pomoBreak = max(2, min(30, (int)($_POST['pomodoro_break'] ?? 5))); $taskDuration = in_array((int)($_POST['default_task_duration'] ?? 30), [15, 30, 45, 60, 90, 120]) ? (int)$_POST['default_task_duration'] : 30; + set_system_setting('workdays', $workdaysStr); set_system_setting('workday_start', $workdayStart); set_system_setting('workday_end', $workdayEnd); set_system_setting('lunch_start', $lunchStart); @@ -192,7 +202,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { set_system_setting('pomodoro_break', $pomoBreak); set_system_setting('default_task_duration', $taskDuration); - fociz_log_audit($userId, 'SETTINGS_UPDATED', 'workday_settings', null, ['workday_start' => $workdayStart, 'workday_end' => $workdayEnd], 'SUCCESS', $adminUser['email']); + fociz_log_audit($userId, 'SETTINGS_UPDATED', 'workday_settings', null, ['workdays' => $workdaysStr, 'workday_start' => $workdayStart, 'workday_end' => $workdayEnd], 'SUCCESS', $adminUser['email']); $message = "Organisatie werkdagstandaarden zijn succesvol bijgewerkt."; $messageType = 'success'; @@ -929,6 +939,54 @@ require_once __DIR__ . '/includes/header.php'; + +
+
+
+ + Actieve Werkdagen vs. Weekend +
+ + Ma t/m Vr zijn standaard werkdagen; Za & Zo gelden als weekend + +
+

+ Vink de dagen aan die voor uw organisatie als reguliere werkdagen gelden. Niet-aangevinkte dagen worden in Fociz visueel duidelijk gemarkeerd als Weekend / Vrije dag in de dagplanning, weekoverzichten en tijdlijnen. +

+ + ['short' => 'Ma', 'full' => 'Maandag', 'type' => 'Werkdag'], + 2 => ['short' => 'Di', 'full' => 'Dinsdag', 'type' => 'Werkdag'], + 3 => ['short' => 'Wo', 'full' => 'Woensdag', 'type' => 'Werkdag'], + 4 => ['short' => 'Do', 'full' => 'Donderdag', 'type' => 'Werkdag'], + 5 => ['short' => 'Vr', 'full' => 'Vrijdag', 'type' => 'Werkdag'], + 6 => ['short' => 'Za', 'full' => 'Zaterdag', 'type' => 'Weekend'], + 7 => ['short' => 'Zo', 'full' => 'Zondag', 'type' => 'Weekend'], + ]; + ?> +
+ $dInfo): + $isChecked = in_array($dNum, $workdaySettings['workdays'], true); + ?> + + +
+
+
diff --git a/api/planner.php b/api/planner.php index c07a6dd..320a023 100644 --- a/api/planner.php +++ b/api/planner.php @@ -658,6 +658,10 @@ try { $workdayEndStr = $workdaySettings['workday_end'] ?? '17:00'; $lunchStartStr = $workdaySettings['lunch_start'] ?? '12:30'; $lunchEndStr = $workdaySettings['lunch_end'] ?? '13:00'; + $activeWorkdays = $workdaySettings['workdays'] ?? [1, 2, 3, 4, 5]; + if (!is_array($activeWorkdays) || empty($activeWorkdays)) { + $activeWorkdays = [1, 2, 3, 4, 5]; + } $toMins = function(string $timeStr): int { $parts = explode(':', trim($timeStr)); @@ -696,7 +700,7 @@ try { $checkDate = clone $now; if ($startFromNextWorkday) { $checkDate->modify('+1 day'); - while ((int)$checkDate->format('N') >= 6) { + while (!in_array((int)$checkDate->format('N'), $activeWorkdays, true)) { $checkDate->modify('+1 day'); } } @@ -746,8 +750,8 @@ try { while ($checkedDays < $maxDays) { $dayOfWeek = (int)$checkDate->format('N'); // 1 = Ma, 7 = Zo - // Weekend overslaan - if ($dayOfWeek === 6 || $dayOfWeek === 7) { + // Niet-werkdag / weekend overslaan op basis van organisatie-instellingen + if (!in_array($dayOfWeek, $activeWorkdays, true)) { $checkDate->modify('+1 day'); continue; } diff --git a/includes/settings.php b/includes/settings.php index 33c84ee..7c6fc23 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -93,6 +93,11 @@ function set_system_setting(string $key, $value): bool { * Haalt alle organisatie werkdag standaarden op (Release v1.4) */ function get_workday_settings(): array { + $rawDays = get_system_setting('workdays', '1,2,3,4,5'); + $workdays = array_values(array_filter(array_map('intval', explode(',', $rawDays)), fn($d) => $d >= 1 && $d <= 7)); + if (empty($workdays)) { + $workdays = [1, 2, 3, 4, 5]; + } return [ 'workday_start' => get_system_setting('workday_start', '08:30'), 'workday_end' => get_system_setting('workday_end', '17:00'), @@ -102,6 +107,8 @@ function get_workday_settings(): array { 'pomodoro_deep' => (int)get_system_setting('pomodoro_deep', 50), 'pomodoro_break' => (int)get_system_setting('pomodoro_break', 5), 'default_task_duration' => (int)get_system_setting('default_task_duration', 30), + 'workdays' => $workdays, + 'workdays_str' => implode(',', $workdays), ]; } diff --git a/planner.php b/planner.php index 3727904..7d84583 100644 --- a/planner.php +++ b/planner.php @@ -36,6 +36,13 @@ $selectedTs = strtotime($selectedDate); // Haal organisatie werkdag- en AI-standaarden op (Release v1.4 & v1.5) $workdaySettings = get_workday_settings(); $aiSettings = get_ai_settings(); +$activeWorkdays = $workdaySettings['workdays'] ?? [1, 2, 3, 4, 5]; +if (!is_array($activeWorkdays) || empty($activeWorkdays)) { + $activeWorkdays = [1, 2, 3, 4, 5]; +} +$selectedDayN = (int)date('N', $selectedTs); +$isSelectedDateWorkday = in_array($selectedDayN, $activeWorkdays, true); +$isSelectedDateWeekend = !$isSelectedDateWorkday; // Bereken weekgrenzen (Maandag t/m Zondag) rondom de geselecteerde datum $dayOfWeek = (int)date('N', $selectedTs); // 1 = Maandag, 7 = Zondag @@ -215,6 +222,7 @@ for ($i = 0; $i < 7; $i++) { $dayM = (int)date('n', $dayTs); $tStat = $weekTaskStats[$dayDate] ?? ['total' => 0, 'completed' => 0]; $mCount = count($outlookEventsByDate[$dayDate] ?? []); + $isWorkday = in_array($dayN, $activeWorkdays, true); $weekDays[] = [ 'date' => $dayDate, @@ -224,6 +232,8 @@ for ($i = 0; $i < 7; $i++) { 'month_short' => $dutchShortMonths[$dayM], 'is_today' => ($dayDate === $today), 'is_selected' => ($dayDate === $selectedDate), + 'is_workday' => $isWorkday, + 'is_weekend' => !$isWorkday, 'task_count' => $tStat['total'], 'completed_count' => $tStat['completed'], 'meeting_count' => $mCount, @@ -425,14 +435,27 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
- - +
+
+ + +
VANDAAG GEKOZEN DAG + + + + Werkdag + + + + + Weekend / Vrij + +

Fociz @@ -961,17 +984,26 @@ for ($h = $startHour; $h <= $endHour; $h++) { onclick="switchPlannerDate('', event); return false;" class="fociz-card-interactive group relative flex flex-col p-3 rounded-xl border transition-all text-left " + : ($wd['is_workday'] + ? 'bg-slate-50/70 dark:bg-[#0c0f17]/50 border-slate-200/80 dark:border-slate-800/80 hover:border-indigo-300 dark:hover:border-indigo-600/50 hover:bg-white dark:hover:bg-[#111624] shadow-2xs' + : 'bg-slate-100/60 dark:bg-[#080b11]/60 border-dashed border-amber-300/60 dark:border-amber-900/40 hover:border-amber-400 dark:hover:border-amber-700 hover:bg-white dark:hover:bg-[#0f141f] shadow-2xs') ?>" >
- + - - - Nu - - +
+ + + Weekend + + + + + Nu + + +
@@ -1012,14 +1044,25 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
- +
+
-

- Tijdlijn & Time-blocking voor -

-

Urenindeling & synchronisatie met Outlook

+
+

+ Tijdlijn & Time-blocking voor +

+ + + Weekend / Vrije Dag + + +
+

+ +

@@ -1059,6 +1102,9 @@ for ($h = $startHour; $h <= $endHour; $h++) {
Dagcapaciteit + + Weekend + % ยท
-- 2.52.0