From 765bcdf1debcf0dc850aafd727a143da35f757ae Mon Sep 17 00:00:00 2001 From: kotlanj Date: Thu, 6 Nov 2025 16:27:16 +0100 Subject: [PATCH] On-site shift name now includes the customer --- config.json | 75 ++++++++++++++++++++++++++++++++--------------------- shifts.ps1 | 21 ++++++++++----- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/config.json b/config.json index 85ec05f..eff9e86 100644 --- a/config.json +++ b/config.json @@ -1,32 +1,47 @@ { - "monday": { - "ds": "jiri.kotlan@itego.cz", - "ho": ["milan.husak@itego.cz"], - "os": ["vaclav.spaninger@itego.cz","roman.lesyk@itego.cz","jan.zazvonil@itego.cz"], - "ns": [] - }, - "tuesday": { - "ds": "milan.husak@itego.cz", - "ho": ["jiri.kotlan@itego.cz"], - "os": ["vaclav.spaninger@itego.cz","roman.lesyk@itego.cz"], - "ns": ["jan.zazvonil@itego.cz"] - }, - "wednesday": { - "ds": "jiri.kotlan@itego.cz", - "ho": ["jiri.kotlan@itego.cz"], - "os": ["vaclav.spaninger@itego.cz","roman.lesyk@itego.cz"], - "ns": ["jan.zazvonil@itego.cz"] - }, - "thursday": { - "ds": "milan.husak@itego.cz", - "ho": ["milan.husak@itego.cz"], - "os": ["vaclav.spaninger@itego.cz","roman.lesyk@itego.cz"], - "ns": ["jan.zazvonil@itego.cz"] - }, - "friday": { - "ds": "roman.lesyk@itego.cz", - "ho": [], - "os": ["jan.zazvonil@itego.cz"], - "ns": [] - } + "monday": { + "ds": "jiri.kotlan@itego.cz", + "ho": ["milan.husak@itego.cz"], + "os": [ + { "email": "vaclav.spaninger@itego.cz", "customer": "KB" }, + { "email": "roman.lesyk@itego.cz", "customer": "KB" }, + { "email": "jan.zazvonil@itego.cz", "customer": "Pragolab" } + ], + "ns": [] + }, + "tuesday": { + "ds": "milan.husak@itego.cz", + "ho": ["jiri.kotlan@itego.cz"], + "os": [ + { "email": "vaclav.spaninger@itego.cz", "customer": "KB" }, + { "email": "roman.lesyk@itego.cz", "customer": "KB" } + ], + "ns": ["jan.zazvonil@itego.cz"] + }, + "wednesday": { + "ds": "jiri.kotlan@itego.cz", + "ho": ["jiri.kotlan@itego.cz"], + "os": [ + { "email": "vaclav.spaninger@itego.cz", "customer": "KB" }, + { "email": "roman.lesyk@itego.cz", "customer": "KB" } + ], + "ns": ["jan.zazvonil@itego.cz"] + }, + "thursday": { + "ds": "milan.husak@itego.cz", + "ho": ["milan.husak@itego.cz"], + "os": [ + { "email": "vaclav.spaninger@itego.cz", "customer": "KB" }, + { "email": "roman.lesyk@itego.cz", "customer": "KB" } + ], + "ns": ["jan.zazvonil@itego.cz"] + }, + "friday": { + "ds": "roman.lesyk@itego.cz", + "ho": [], + "os": [ + { "email": "jan.zazvonil@itego.cz", "customer": "Pragolab" } + ], + "ns": [] + } } \ No newline at end of file diff --git a/shifts.ps1 b/shifts.ps1 index 84d2328..0e70606 100644 --- a/shifts.ps1 +++ b/shifts.ps1 @@ -168,8 +168,12 @@ $allemails = $schedule.PSObject.Properties | ForEach-Object { if ($_.Name -in @("monday", "tuesday", "wednesday", "thursday", "friday")) { $_.Value.PSObject.Properties | ForEach-Object { if ($_.Name -in @("ds", "ho", "os", "ns")) { - $_.Value | ForEach-Object { - $_ + if ($_.Name -eq "os") { + # Collect the email field from objects + $_.Value | ForEach-Object { $_.email } + } + else { + $_.Value | ForEach-Object { $_ } } } } @@ -182,7 +186,7 @@ $allemails = $schedule.PSObject.Properties | ForEach-Object { $today = (Get-Date).Date # ---| Specific date |--- -#$today = Get-Date -Day 2 -Month 12 -Year 2025 -Hour 9 -Minute 00 -Second 00 -Millisecond 00 +#$today = Get-Date -Day 1 -Month 1 -Year 2026 -Hour 9 -Minute 00 -Second 00 -Millisecond 00 $daysahead = 14 #How many days ahead to plan $timeoff_past_look = -7 #How many days to look into the past for the start of a multi-day time off @@ -242,7 +246,8 @@ try { $ds_shift_inplace = $false $ho_emails = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'ho' $ds_email = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'ds' - $os_emails = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'os' + $os_entries = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'os' + $os_emails = $os_entries | ForEach-Object { $_.email } $ns_emails = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'ns' # ---| TIME SYNC |--- @@ -308,7 +313,6 @@ try { # ---| DAY SHIFT REPLACEMENT CHECK |--- else { Write-Debug("{0} {1}: looking ahead for a day shift replacement" -f $dayDate, $dayDate.DayOfWeek) - #$remainingdays = $timespan.Days - $dayNumber # ---| FUTURE DAYS LOOP |--- for ($daysahead = 1; $daysahead -lt $ds_replace_daysahead; $daysahead++) { @@ -328,6 +332,7 @@ try { # ---| THE NEXT IN LINE FOR THE DAY-SHIFT DOESN'T HAVE TIME OFF, NO-SHIFT OR ON-SITE |--- if((Invoke-HasTimeOff -UID $futureds_id -timeoff $timeoff_today -mail $futureds_email) -eq $false -and ($futureds_email -notin $os_emails) -and ($futureds_email -notin $ns_emails)) { + # ---| UPDATE COLLECTION OF SHIFTS TODAY |--- $shifts_today = [Object[]] $allshifts | Where-Object -Filter { $_.schedulingGroupId -eq $group.Id -and $_.SharedShift.StartDateTime.ToString("yyyy-MM-dd HH:mm") -ge $dateStart.ToString("yyyy-MM-dd HH:mm") -and $_.SharedShift.EndDateTime.ToString("yyyy-MM-dd HH:mm") -le $dateEnd.ToString("yyyy-MM-dd HH:mm") } @@ -397,8 +402,12 @@ try { # ---| ON-SITE SHIFT CHECK |--- if($email -in $os_emails) { + $entry = $os_entries | Where-Object { $_.email -eq $email } + $customer = $entry.customer + $os_shift_name = ("On-Site - {0}" -f $customer) + if((Invoke-HasShiftorTimeOff -UID $userId -shifts $shifts_today -timeoff $timeoff_today -mail $email) -eq $false) { - $newshift = Set-Shift -userId $userId -groupID $group.id -shiftName "On-site" -StartDate $dateStart -EndDate $dateEnd -color "white" -teamID $team.id -mail $email + $newshift = Set-Shift -userId $userId -groupID $group.id -shiftName $os_shift_name -StartDate $dateStart -EndDate $dateEnd -color "white" -teamID $team.id -mail $email $allshifts += [Object[]] $newshift continue }