commit 2b8a553590c7cb7ad3303606c35e7b51d6a3779d Author: kotlanj Date: Tue Oct 14 12:12:26 2025 +0200 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..005c551 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +log.txt +log_*.log diff --git a/config.json b/config.json new file mode 100644 index 0000000..85ec05f --- /dev/null +++ b/config.json @@ -0,0 +1,32 @@ +{ + "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": [] + } +} \ No newline at end of file diff --git a/shifts.ps1 b/shifts.ps1 new file mode 100644 index 0000000..5c14bf0 --- /dev/null +++ b/shifts.ps1 @@ -0,0 +1,470 @@ +param( + [switch]$debug, + [switch]$clear +) + +if ($debug) { + $script:debug = $debug +} + +$teamsName = "IT Support & Delivery" +$scheduleGroupName = "IT SUPPORT" + +# App Registration details & Tenant ID +$ClientId = "6cb76bbf-f253-4551-87a8-5e1f49d8ace3" +$ClientSecret = "IQg8Q~JTBTDbrHyjKMc.KMSETtQoKWvUhnCr1aY1" +$tenantid = "e81b4a31-e8ad-4df6-aa30-3bdcc1da2cdd" +$userIdAdmin = "747bd624-5cd7-4ae0-952f-5dc374e07a5e" +$logPath = (".\log_{0}.log" -f (Get-Date).toString("yyyy_MM_dd")) + +function Write-Debug { + param( + [string]$message + ) + if ($script:debug) { + Write-Host $message + } + else { + $message | Add-Content ./log.txt + } +} + +#Naplánování konkrétní směny +function Set-Shift { + param( + [string]$userId, + [string]$groupID, + [string]$shiftName, + [System.DateTime]$StartDate, + [System.DateTime]$EndDate, + [string]$color, + [string]$teamID + ) + + $params = @{ + UserId = $userId + schedulingGroupId = $groupID + sharedShift = @{ + notes = ($shiftName) + startDateTime = [System.DateTime]::Parse($StartDate.ToString("yyyy-MM-dd'T'HH:mm:ssZ")) + endDateTime = [System.DateTime]::Parse($EndDate.ToString("yyyy-MM-dd'T'HH:mm:ssZ")) + theme = $color + } + } + + #$headers = @{ + # "MS-APP-ACTS-AS" = $userIdAdmin + # "Prefer" = "no-notification" + #} + + $newShift = New-MgTeamScheduleShift -TeamId $teamID -DraftShift -BodyParameter $params -Headers @{ "MS-APP-ACTS-AS" = $userIdAdmin } + Write-Debug ("SCHEDULING: {0} {1} - {2}" -f $newShift.SharedShift.StartDateTime.ToString("yyyy-MM-dd HH:mm"), $newShift.SharedShift.EndDateTime.ToString("yyyy-MM-dd HH:mm"), $newShift.SharedShift.Notes) + #("SCHEDULING: {0} {1} - {2}" -f $newShift.SharedShift.StartDateTime.ToString("yyyy-MM-dd HH:mm"), $newShift.SharedShift.EndDateTime.ToString("yyyy-MM-dd HH:mm"), $newShift.SharedShift.Notes) | Add-Content -Path $logPath + return $newShift +} + +#Kontrola, zda má uvedené ID nějakou ze směn v množině +function Invoke-HasShift { + param( + [string]$userID, + [PSCUstomObject]$TestedShifts + ) + + foreach ($shift in $TestedShifts) { + if ($shift.UserId -eq $userID) { + return $true + break + } + } + return $false +} + +function Invoke-HasTimeOff { + param( + [string]$userID, + [PSCustomObject]$TestedTimeOff + ) + + foreach ($time_off in $TestedTimeOff) { + if ($time_off.UserId -eq $userID) { + return $true + break + } + } + return $false +} + +function Invoke-CanHaveOnSite { + +} + + +function Invoke-CanHaveDayShift { + +} + +function Invoke-CanHaveNoShift { + +} + +function Invoke-CanHaveHomeOffice { + +} + +function Invoke-CanHaveOffice { + +} + +#Microsoft auth + +$body = @{ + grant_type = "client_credentials" + resource = "https://graph.microsoft.com" + client_id = $ClientId + client_secret = $ClientSecret +} +$authUri = "https://login.microsoftonline.com/$tenantid/oauth2/token" +$response = Invoke-RestMethod $authUri -Method 'POST' -Body $body + +$token = $response.access_token + +Import-Module Microsoft.Graph.Teams +Connect-MgGraph -AccessToken $($token | ConvertTo-SecureString -AsPlainText -Force) >> $null + +# Dnešní datum a plán směn + +#$today = (Get-Date).Date +#$today = $today_old.AddYears(2) +$today = Get-Date -Day 18 -Month 1 -Year 2027 -Hour 9 -Minute 00 -Second 00 -Millisecond 00 + +$schedule = Get-Content -Path "./config.json" -Raw | ConvertFrom-Json + +$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 { + $_ + } + } + } + } +} | Select-Object -Unique + +#Časové rozmezí plánování + +$Monday = $today.AddDays(1 - $today.DayOfWeek.value__) +$Friday = $Monday.AddDays(4) +$daysahead = 5 + +$startSpanDate = Get-Date -Day $today.Day -Month $today.Month -Year $today.Year -Hour 9 -Minute 00 -Second 00 -Millisecond 00 +$endSpanDate = Get-Date -Day $startSpanDate.AddDays($daysahead).Day -Month $startSpanDate.AddDays($daysahead).Month -Year $startSpanDate.AddDays($daysahead).Year -Hour 17 -Minute 00 -Second 00 -Millisecond 00 + +#RLCZ maintenance +$rlcz_mtnc_email = "jiri.kotlan@itego.cz" +$rlcz_mtnc_userId = $(Get-MgUser -Filter "UserPrincipalName eq '$rlcz_mtnc_email' or proxyAddresses/any(c:c eq 'smtp:$rlcz_mtnc_email')").Id +$rlcz_shift_reduction = -3 + +Write-Host $startSpanDate +Write-Host $endSpanDate + +# SKRIPT +try { + $team = Get-MgTeam -Property "id,displayName" | Where-Object -property displayName -value $teamsName -eq + $group = Get-MgTeamScheduleSchedulingGroup -TeamId $team.id -Headers @{ "MS-APP-ACTS-AS" = $userIdAdmin } | Where-Object -property displayName -value $scheduleGroupName -eq + + $allshifts = [object[]] (Get-MgTeamScheduleShift -TeamId $team.id -Filter "SharedShift/StartDateTime ge $($startSpanDate.toString('yyyy-MM-ddT00:00:00Z'))" -All -Headers @{ "MS-APP-ACTS-AS" = $userIdAdmin }) + $timeoff = [object[]] (Get-MgTeamScheduleTimeOff -TeamId $team.id -Filter "SharedTimeOff/StartDateTime ge $($startSpanDate.toString('yyyy-MM-ddT00:00:00Z'))" -All -Headers @{ "MS-APP-ACTS-AS" = $userIdAdmin } | Select-Object -Property *,@{name="Date";expression={$_.SharedTimeOff.StartDateTime.AddHours(1).Date}}) + + $timeoff_now = $timeoff | Where-Object -Property Date -eq -Value $(Get-Date -Day 20 -Month 1 -Year 2027).Date + + return $timeoff_now + + #if ($clear) { + # foreach ($shift in $allshifts) { + # Remove-MgTeamSchedu#leShift -TeamId $team.id -ShiftId $shift.id + # } +# +# return +# } + + + #Procházíme dny v časovém rozmezí + $timeSpan = New-TimeSpan -Start $startSpanDate -End $endSpanDate + Write-Debug ("Setting schedule from {0} to {1}" -f $startSpanDate, $endSpanDate) + for ($dayNumber = 0; $dayNumber -lt $timespan.Days; $dayNumber++) { + $dayDate = $today.AddDays($dayNumber); + + #Pokud jde o pracovní den, jinak se jde ihned na další den + if ($dayDate.DayOfWeek -notin @("Saturday", "Sunday")) { + #Inicializace dne + $ds_shift_inplace = $false + $ds_skipped = $false + + #Množina emailů pro tento den v týdnu co mají mít home office + $ho_emails = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'ho' + + #Email a ID toho kdo má mít tento den denní směnu + $ds_email = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'ds' + $ds_userId = $(Get-MgUser -Filter "UserPrincipalName eq '$ds_email' or proxyAddresses/any(c:c eq 'smtp:$ds_email')").Id + + #Emaily těch co jsou on-site u zákazníka + $os_emails = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'os' + + #Emaily těch co nemají mít dnes žádnou směnu + $ns_emails = $schedule.($dayDate.DayOfWeek.ToString().ToLower()).'ns' + + #Upravení času + if (($dayDate.IsDaylightSavingTime()) -eq $false) { + $dateStart = $(get-date -Day $dayDate.Day -Month $dayDate.Month -Year $dayDate.Year -Hour 9 -Minute 00 -Second 00).AddHours(-1) + $dateEnd = $(get-date -Day $dayDate.Day -Month $dayDate.Month -Year $dayDate.Year -Hour 17 -Minute 00 -Second 00).AddHours(-1) + } + else { + $dateStart = $(get-date -Day $dayDate.Day -Month $dayDate.Month -Year $dayDate.Year -Hour 9 -Minute 00 -Second 00).AddHours(-2) + $dateEnd = $(get-date -Day $dayDate.Day -Month $dayDate.Month -Year $dayDate.Year -Hour 17 -Minute 00 -Second 00).AddHours(-2) + } + + foreach($email in $allemails) { + $userId = $(Get-MgUser -Filter "UserPrincipalName eq '$email' or proxyAddresses/any(c:c eq 'smtp:$email')").Id + + if($email -eq $ds_email) { + if(((Invoke-HasShift -userID $userId -TestedShifts $shifts_today) -eq $false) -and ((Invoke-HasTimeOff -userID $userId -TestedTimeOff $timeoff_today) -eq $false)) { + if ($email -in $ho_emails) { + $newshift = Set-Shift -userId $userId -groupID $group.id -shiftName "Home Office - Denní směna" -StartDate $dateStart -EndDate $dateEnd -color "purple" -teamID $team.id + $allshifts += [Object[]] $newshift + continue + } + else { + $newshift = Set-Shift -userId $userId -groupID $group.id -shiftName "Office - Denní směna" -StartDate $dateStart -EndDate $dateEnd -color "purple" -teamID $team.id + $allshifts += [Object[]] $newShift + continue + } + } + } + + if($email -in $os_emails) { + if(((Invoke-HasShift -userID $userId -TestedShifts $shifts_today) -eq $false) -and ((Invoke-HasTimeOff -userID $userId -TestedTimeOff $timeoff_today) -eq $false)) { + $newshift = Set-Shift -userId $userId -groupID $group.id -shiftName "On-site" -StartDate $dateStart -EndDate $dateEnd -color "gray" -teamID $team.id + $allshifts += [Object[]] $newshift + continue + } + } + + } + + #Všechny směny které jsou v rozmezí 9:00-17:00 hodin tento den + $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") } + $timeoff_today = [Object[]] $timeoff | Where-Object -Filter { $_.schedulingGroupId -eq $group.Id -and $_.SharedTimeOff.StartDateTime.ToString("yyyy-MM-dd HH:mm") -ge $dateStart.ToString("yyyy-MM-dd HH:mm") -and $_.SharedTimeOff.EndDateTime.ToString("yyyy-MM-dd HH:mm") -le $dateEnd.ToString("yyyy-MM-dd HH:mm") } + + #Pokus o naplnění množiny manuálně daných denních směn pro tento den + $manual_dayshifts = [Object[]] $shifts_today | Where-Object -Filter { { $_.SharedShift.Notes -eq "Home Office - Denní směna" -or $_.SharedShift.Notes -eq "Office - Denní směna" } } + + #Pokud je tato množina prázdná, tak dnes nebyla manuálně nastavena denní směna + if ($null -eq $manual_dayshifts) { + $ds_shift_inplace = $false + Write-Debug ("{0}: Day-shift not yet set" -f $dayDate) + } + else { + $ds_shift_inplace = $true + Write-Debug ("{0}: Day-shift is already set" -f $dayDate) + } + + #Pokud nebyla nikomu manuálně nastavena denní směna + if ($ds_shift_inplace -eq $false) { + + #Má ten kdo má mít denní směnu ve stejný den už nějakou směnu? + if (((Invoke-HasShift -userID $ds_userId -TestedShifts $shifts_today) -eq $true) -or ((Invoke-HasTimeOff -userID $ds_userId -TestedTimeOff $timeoff_today) -eq $true)) { + + #Pokud ano, je to směna co má mít? Teoreticky by nemělo nastat, mělo by již být odchyceno v kontrole manuálních směn + if (Invoke-HasShift -userID $ds_userId -TestedShifts ($shifts_today | Where-Object -Filter { $_.SharedShift.Notes -eq "Home Office - Denní směna" -or $_.SharedShift.Notes -eq "Office - Denní směna" }) -eq $true) { + $ds_shift_inplace = $true + Write-Debug("{0}: {1} already has the day-shift" -f $dayDate, $ds_email) + } + #Není to denní směna, je manuálně daná jiného typu (může být i volno), bude potřeba najít náhradníka + else { + $ds_skipped = $true + $ds_shift_inplace = $false + Write-Debug("{0}: {1} can't have the day-shift" -f $dayDate, $ds_email) + } + } + #Ten co má mít denní směnu nemá ve stejný čas ještě žádnou směnu + else { + Write-Debug("{0}: {1} can have the day-shift" -f $dayDate, $ds_email) + $ds_shift_inplace = $false + $ds_skipped = $false + } + } + + + #Pokud bylo zjištěno, že má denní směna naplánovanou jinou směnu (ne-denní, nebo volno...) a je potřeba najít náhradníka + if ($ds_skipped -eq $true) { + #Budeme hledat ve zbývajících dnech zvoleného rozsahu + $remainingdays = $timespan.Days - $dayNumber + Write-Debug("{0}: looking for the next in line to have the day-shift" -f $dayDate) + for ($daysahead = 1; $daysahead -lt $remainingdays; $daysahead++) { + $futureday = $dayDate.AddDays($daysahead) + Write-Debug("Checking {0} - {1}" -f $futureday, $futureday.DayOfWeek) + #Pokud jsme narazili na pracovní den... + if ($futureday.DayOfWeek -notin @("Saturday", "Sunday")) { + #...jdeme se podívat kdo má mít denní směnu + $futureds_email = $schedule.($futureday.DayOfWeek.ToString().ToLower()).'ds' + $futureds_id = $(Get-MgUser -Filter "UserPrincipalName eq '$futureds_email' or proxyAddresses/any(c:c eq 'smtp:$futureds_email')").Id + Write-Debug("{0} is next in line for the day-shift" -f $futureds_email) + + #Má další na řadě nastavenou na dnešek směnu? Pokud ne tak má denní a hledání ukončujeme, jinak se jde na další den + if (((Invoke-HasShift -userID $futureds_id -TestedShifts $shifts_today) -eq $false) -and ((Invoke-HasTimeOff -userID $futureds_id -TestedTimeOff $timeoff_today) -eq $false)) { + Write-Debug("{0} can have the day-shift" -f $futureds_email) + $ds_email = $futureds_email + $ds_userId = $futureds_id + break + } + else { + Write-Debug("{0} can't have the day-shift" -f $futureds_email) + } + } + } + } + + #Pokud nebyla manuálně nastavena denní směna + if ($ds_shift_inplace -eq $false) { + #Pokud je emailová adresa toho kdo má denní směnu zároveň i v množině emailů co má home office tak je to home office denní směna + if ($ds_email -in $ho_emails) { + Write-Debug("{0}: {1} has the day-shift and home-office" -f $dayDate, $ds_email) + $newshift = Set-Shift -userId $ds_userId -groupID $group.id -shiftName "Home Office - Denní směna" -StartDate $dateStart -EndDate $dateEnd -color "purple" -teamID $team.id + $allshifts += [Object[]] $newshift + } + #Jinak je to denní směna v kanceláři + else { + Write-Debug("{0}: {1} has the day-shift" -f $dayDate, $ds_email) + $newshift = Set-Shift -userId $ds_userId -groupID $group.id -shiftName "Office - Denní směna" -StartDate $dateStart -EndDate $dateEnd -color "purple" -teamID $team.id + $allshifts += [Object[]] $newShift + } + } + + $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") } + + #Pokud je čtvrtek, zjištujeme zda zkrátit směnu kvůli včerejší RLCZ maintenanci + if ($dayDate.DayOfWeek -eq "Thursday") { + Write-Debug("{0}: It's thursday, checking if there was a RLCZ maintenance yesterday" -f $dayDate) + #Včerejší datum + $yesterday = $dayDate.AddDays(-1) + + #Úprava času + if (($yesterday.IsDaylightSavingTime()) -eq $false) { + $rlcz_shift_start = $(get-date -Day $yesterday.Day -Month $yesterday.Month -Year $yesterday.Year -Hour 18 -Minute 00 -Second 00).AddHours(-1) + $rlcz_shift_end = $(get-date -Day $yesterday.Day -Month $yesterday.Month -Year $yesterday.Year -Hour 23 -Minute 00 -Second 00).AddHours(-1) + } + else { + $rlcz_shift_start = $(get-date -Day $yesterday.Day -Month $yesterday.Month -Year $yesterday.Year -Hour 18 -Minute 00 -Second 00).AddHours(-2) + $rlcz_shift_end = $(get-date -Day $yesterday.Day -Month $yesterday.Month -Year $yesterday.Year -Hour 23 -Minute 00 -Second 00).AddHours(-2) + } + + #Včerejší RLCZ maintenance šichty + $rlcz_shifts = [Object[]] $allshifts | Where-Object -Filter { $_.schedulingGroupId -eq $group.Id -and $_.SharedShift.Notes -eq "RLCZ" -and $_.SharedShift.StartDateTime.ToString("yyyy-MM-dd HH:mm") -ge $rlcz_shift_start.ToString("yyyy-MM-dd HH:mm") -and $_.SharedShift.EndDateTime.ToString("yyyy-MM-dd HH:mm") -le $rlcz_shift_end.ToString("yyyy-MM-dd HH:mm") } + + #Pokud byla včera RLCZ maintenance + if ((Invoke-HasShift -userID $rlcz_mtnc_userId -TestedShifts $rlcz_shifts) -eq $true) { + Write-Debug("{0}: RLCZ maintenance was yesterday, checking if {1} has any shifts set today" -f $dayDate, $rlcz_mtnc_email) + #Pokud nemá na dnes ještě naplánovanou směnu + if (((Invoke-HasShift -userID $rlcz_mtnc_userId -TestedShifts $shifts_today) -eq $false) -and (Invoke-HasTimeOff -userID $rlcz_mtnc_userId -TestedTimeOff $timeoff_today) -eq $false) { + Write-Debug("{0}: {1} doesn't have any shifts planned today" -f $dayDate, $rlcz_mtnc_email) + #Pokud má mít dnes home office + if ($rlcz_mtnc_email -in $ho_emails) { + Write-Debug("{0}: {1} is supposed to have home-office today" -f $dayDate, $rlcz_mtnc_email) + #Dostane zkrácenou home office směnu + $newshift = Set-Shift -userId $rlcz_mtnc_userId -groupID $group.id -shiftName "Home office" -StartDate $dateStart -EndDate $dateEnd.AddHours($rlcz_shift_reduction) -color "pink" -teamID $team.id + $allshifts += [Object[]] $newshift + } + #Pokud nemá mít home office + else { + Write-Debug("{0}: {1} isn't supposed to have home-office today" -f $dayDate, $rlcz_mtnc_email) + #Dostane zkrácenou office směnu + $newshift = Set-Shift -userId $rlcz_mtnc_userId -groupID $group.id -shiftName "Office" -StartDate $dateStart -EndDate $dateEnd.AddHours($rlcz_shift_reduction) -color "blue" -teamID $team.id + $allshifts += [Object[]] $newshift + } + } + } + } + + $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") } + + #Pro každý email v množině emailů co mají home office + Write-Debug("{0}: checking who is supposed to have home-office" -f $dayDate) + foreach ($ho_email in $ho_emails) { + #Najdeme ID + $ho_userId = $(Get-MgUser -Filter "UserPrincipalName eq '$ho_email' or proxyAddresses/any(c:c eq 'smtp:$ho_email')").Id + Write-Debug("{0}: checking if {1} has a shift planned already" -f $dayDate, $ho_email) + + #Pokud nemá již naplánovanou směnu, naplánujeme home office + if (((Invoke-HasShift -userID $ho_userId -TestedShifts $shifts_today) -eq $false) -and ((Invoke-HasTimeOff -userID $ho_userId -TestedTimeOff $timeoff_today) -eq $false)) { + Write-Debug("{0}: {1} doesn't have a shift planned already" -f $dayDate, $ho_email) + $newshift = Set-Shift -userId $ho_userId -groupID $group.id -shiftName "Home office" -StartDate $dateStart -EndDate $dateEnd -color "pink" -teamID $team.id + $allshifts += [Object[]] $newshift + } + else { + Write-Debug("{0}: {1} has a shift planned already" -f $dayDate, $ho_email) + } + } + + $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") } + + Write-Debug("{0}: checking who is supposed to have on-site" -f $dayDate) + foreach ($os_email in $os_emails) { + $os_userId = $(Get-MgUser -Filter "UserPrincipalName eq '$os_email' or proxyAddresses/any(c:c eq 'smtp:$os_email')").Id + Write-Debug("{0}: checking if {1} has a shift planned already" -f $dayDate, $os_email) + + #Pokud nemá již naplánovanou směnu, naplánujeme on-site + if (((Invoke-HasShift -userID $os_userId -TestedShifts $shifts_today) -eq $false) -and ((Invoke-HasTimeOff -userID $os_userId -TestedTimeOff $timeoff_today) -eq $false)) { + Write-Debug("{0}: {1} doesn't have a shift planned already, setting on-site shift" -f $dayDate, $os_email) + $newshift = Set-Shift -userId $os_userId -groupID $group.id -shiftName "On-site" -StartDate $dateStart -EndDate $dateEnd -color "gray" -teamID $team.id + $allshifts += [Object[]] $newshift + } + else { + Write-Debug("{0}: {1} has a shift planned already, can't set on-site shift" -f $dayDate, $os_email) + } + } + + $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") } + + Write-Debug("{0}: searching for whomever still doesn't have a shift, to give them an office shift" -f $dayDate) + foreach ($email in $allemails) { + $email_userId = $(Get-MgUser -Filter "UserPrincipalName eq '$email' or proxyAddresses/any(c:c eq 'smtp:$email')").Id + Write-Debug("{0}: checking if {1} has a shift planned already" -f $dayDate, $email) + + #Pokud ještě nemá směnu... + if (((Invoke-HasShift -userID $email_userId -TestedShifts $shifts_today) -eq $false) -and ((Invoke-HasTimeOff -userID $email_userId -TestedTimeOff $timeoff_today) -eq $false)) { + Write-Debug("{0}: {1} doesn't have a shift planned yet" -f $dayDate, $email) + #A pokud není v seznamu těch, co směnu mít dnes nemají... + if ($email -notin $ns_emails) { + Write-Debug("{0}: {1} is not on a list of no-shift emails for today, setting office shift" -f $dayDate, $email) + + #Nastavíme office směnu + $newshift = Set-Shift -userId $email_userId -groupID $group.id -shiftName "Office" -StartDate $dateStart -EndDate $dateEnd -color "blue" -teamID $team.id + $allshifts += [Object[]] $newshift + } + else { + Write-Debug("{0}: {1} isn't supposed to have a shift today, not setting a shift" -f $dayDate, $email) + } + } + else { + Write-Debug("{0}: {1} has a shift planned already, can't set office shift" -f $dayDate, $email) + } + } + } + } + + $params = @{ + notifyTeam = $false + startDateTime = [System.DateTime]::Parse($startSpanDate.ToString("yyyy-MM-dd'T'HH:mm:ssZ")) + endDateTime = [System.DateTime]::Parse($endSpanDate.ToString("yyyy-MM-dd'T'HH:mm:ssZ")) + } + + Invoke-MgShareTeamSchedule -TeamId $team.Id -BodyParameter $params -Headers @{ "MS-APP-ACTS-AS" = $userIdAdmin } + Write-Debug ("SHARING: {0}" -f $scheduleGroupName) + ("SHARING: {0}" -f $scheduleGroupName) | Add-Content -Path $logPath + +} +catch { + $_ + break; +} \ No newline at end of file