initial commit
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
log.txt
|
||||
log_*.log
|
32
config.json
Normal file
32
config.json
Normal file
@@ -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": []
|
||||
}
|
||||
}
|
470
shifts.ps1
Normal file
470
shifts.ps1
Normal file
@@ -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;
|
||||
}
|
Reference in New Issue
Block a user