HaloPSA: Add Bank Holidays
Happy New Year everyone! Sorry for no blog in a long time, I’ve been distracted working on Kelvin Tegelaar’s amazing CIPP project (https://github.com/KelvinTegelaar/CIPP) and working on a big rewrite of my Hudu M365 integration, which should be finished shortly. I thought I would just do a quick blog on a problem I solved over Christmas. We had some wonderful fun realising that we had forgotten to setup all our bank holidays inside Halo PSA so we had just a couple of SLA alerts on the first bank holiday!
To avoid that happening in the future I thought I would write a quick script that will populate bank holidays in Halo from the UK Government’s json feed of them. It is set for England and Wales in the example, but would be very easy to swap to Scotland or Northern-Ireland instead. This is an interactive script which will ask you to confirm adding them to each Workday you have setup in Halo PSA.
You will need your Client ID, Client Secret and Halo URL for this to work. You will also need to make sure you have the latest version of the Halo PSA module (1.5.0).
https://github.com/lwhitelock/HaloPSA-Automation/blob/main/HaloPSA-Set-BankHolidays.ps1
# Set the Halo connection details
$VaultName = "Your Azure Keyvault Name"
$HaloClientID = Get-AzKeyVaultSecret -VaultName $VaultName -Name "HaloClientID" -AsPlainText
$HaloClientSecret = Get-AzKeyVaultSecret -VaultName $VaultName -Name "HaloClientSecret" -AsPlainText
$HaloURL = Get-AzKeyVaultSecret -VaultName $VaultName -Name "HaloURL" -AsPlainText
if (Get-Module -ListAvailable -Name HaloAPI) {
Import-Module HaloAPI
} else {
Install-Module HaloAPI -Force
Import-Module HaloAPI
}
# Connect to Halo
Connect-HaloAPI -URL $HaloURL -ClientId $HaloClientID -ClientSecret $HaloClientSecret -Scopes "all"
#Get all UK Bank holidays
$UKBankHolidays = Invoke-RestMethod -method get -uri "https://www.gov.uk/bank-holidays.json"
# Get just the england / wales bank holidays
$EnglandBankHolidays = $UKBankHolidays.'england-and-wales'.events
# Object array should have title and date properties for the bank holidays
$BankHolidays = $EnglandBankHolidays | Where-object { (get-date($_.date)) -ge (Get-Date) }
$Workdays = Get-HaloWorkday
# Loop all Halo Workdays
foreach ($Day in $Workdays) {
# Get the full object
$Workday = Get-HaloWorkday -WorkdayID $Day.id -IncludeDetails
# Confirm if the holidays should be added to the workday
Write-Host "Would you like to add bank holidays to $($Workday.name)"
$Answer = Read-Host "Enter Y or N"
if ($Answer -eq "Y") {
# Parse existing bank holidays from Hudu
$ExistingDays = $Workday.holidays | foreach-object { get-date($_.date) -format 'yyyy-MM-dd' }
# Create an array of existing holidays to add to
[System.Collections.Generic.List[PSCustomObject]]$Holidays = $Workday.holidays
# Loop through all bank holidays from gov.uk
foreach ($BankHoliday in $BankHolidays) {
# Check if it is in Hudu
if ($ExistingDays -notcontains $BankHoliday.date) {
Write-Host "Adding $($BankHoliday.title) - $($BankHoliday.date)"
# Add the holiday to the array
$Holidays.add([pscustomobject]@{
name = $BankHoliday.title
date = $BankHoliday.date
})
}
}
# Create the update object to add the holidays
$UpdateWorkday = @{
id = $Workday.id
holidays = $Holidays
}
# Perform the update
$Null = Set-HaloWorkday -Workday $UpdateWorkday
}
}