Functions/New-IASoftwareUpdateWidgets.ps1

Function New-IASoftwareUpdateWidgets{
    Param(
        [Parameter(Mandatory=$true, ParameterSetName='PSObject')]
        [PSObject]$IAView,
        [Parameter(Mandatory=$true, ParameterSetName='PSObject')]
        [PSObject]$IAGroup,
        [Parameter(Mandatory=$true, ParameterSetName='Interactive')]
        [Switch]$Interactive
    )

    # Get the group and view where we are creating the widgets.
    if($Interactive) { 
        $IAView = Get-IAView -All | Out-GridView -PassThru
        $IAGroup = Get-IAGroup -All | Where-Object -Property ViewId -EQ $IAView.Id | Out-GridView -PassThru
    }

    # Get the ColumnIndexStarter of the last widget in the IAGroup to make sure our new widgets are placed next to eachother in the right order.
    Try{

        $ColumnIndexStarter = Get-IAWidget -All | 
            Where-Object -Property GroupId -eq $IAGroup.Id |
            Select-Object -ExpandProperty ColumnIndex |
            Sort-Object -Descending |
            Select-Object -First 1
    }
    Catch{}
       
    # Here we select Software Update as the Widget Template that we want to use for our widgets.
    $IAWidgetTemplate = Get-IAWidgetTemplate -Name 'Software Update'

    # Getting the Software Update Widget Data Model. This is the configuration (data model in other words) for the widget and will let us set it up properly.
    $IASoftwareUpdateConfiguration = Get-IAConfigurationDataModel -Name CTSoftwareUpdateConfiguration

    # Getting current date
    $CurrentDate = Get-Date
    
    # The date can be changed to accomodate your needs.
    #$CurrentDate = ($CurrentDate).AddMonths(-7)
    #$CurrentDate = ($CurrentDate).AddYears(-1)

    # Getting all Software Update Groups that we have in SCCM
    $SoftwareUpdateGroups = Get-IAFilter -Name 'SoftwareUpdateGroups'

    #region DonutWidget

    # Lets make the donut widget here.
    # The Donut widget will be the widget that will show us the compliance of the Software Update Group that was created two months back.
    # We can use this to get a good overview of the Software Update progress. A donut type of widget will be a great widget type for this idea.
    
    # Copying over the data model template for our first widget. We will use this to configure the widget.
    $DonutWidget = $IASoftwareUpdateConfiguration

    # Calculate the date of two months back in time.
    $DonutWidgetDate = $CurrentDate.AddMonths(-2)

    # Here we are trying to find the correct Software Update group that fits our criteria (That was added 2 months back).
    $SoftwareUpdateGroup = $SoftwareUpdateGroups | 
        Where-Object -Property Name -like "*$($DonutWidgetDate.Year)*$($DonutWidgetDate.Month)*" | Select-Object -First 1

    # If such a Software Update Group exists, we will continue on and create the widget.
    if($SoftwareUpdateGroup){
        
        # Here we choose the widget type to be donut.
        $DonutWidgetType = Get-IAWidgetType -Name Donut

        # Here we configure the widget as we would in the GUI. We input our selections into the data model.
        $DonutWidget.DataModel.SoftwareUpdateGroupId = $SoftwareUpdateGroup.Id
        $DonutWidget.DataModel.DeploymentSelectionType = 'ALL'
        $DonutWidget.DataModel.Type = 'UpdateGroup'

        # Now we create the configuration with the Data Model that we just populated with our selections
        # Please use -CleanUpEmptyProperties, if you dont plan on cleaning them up yourself. Otherwise creating the configuration might fail.
        $DonutWidgetConfiguration = New-IAConfiguration -Name $IASoftwareUpdateConfiguration.Name -IAConfigurationDataModel $DonutWidget.DataModel -Passthru -CleanUpEmptyProperties

        $ColumnIndexStarter += 1
        
        # Here we create use the New-IAWidgetObject command to create all the prerequisites for a widget and get back a Widget Object that is ready to be created.
        $DonutWidgetObject = New-IAWidgetObject -ColumnIndex $ColumnIndexStarter -Subtitle "$($DonutWidgetDate.Year) $($DonutWidgetDate.Month)" -IAGroup $IAGroup -IAWidgetTemplate $IAWidgetTemplate -IAWidgetType $DonutWidgetType -WidgetConfiguration $DonutWidgetConfiguration
        
        # Here we create the widget by sending in the $DonutWidgetObject. Using -PassThru returns us the newly created widget back from the command.
        # Always use -CreateDataValueFieldMaps, when using this command, incase you dont plan on making the DataValueFieldMaps manually by yourself.
        $DonutWidgetResult = New-IAWidget -IAWidgetObject $DonutWidgetObject -PassThru -CreateDataValueFieldMaps
    }
    else{
        # We couldnt find the correct Software Update Group
        Write-Warning -Message "The '$($DonutWidgetDate.Year)' '$($DonutWidgetDate.Month)' software update group was not found!"
    }

    #endregion DonutWidget

    # We do the same as above for the other widgets, we just change the date.
    #region HistoryMonthWidget
    ## Create history months widget
    $HistoryMonthsWidget = $IASoftwareUpdateConfiguration

    $HistoryMonthDate = $CurrentDate.AddMonths(-1)

    # Try to get last months update group
    $SoftwareUpdateGroup = $SoftwareUpdateGroups | 
        Where-Object -Property Name -like "*$($HistoryMonthDate.Year)*$($HistoryMonthDate.Month)*" | 
        Select-Object -First 1

    if($SoftwareUpdateGroup){
        
        $HistoryMonthsWidgetType = Get-IAWidgetType -Name History

        $HistoryMonthsWidget.DataModel.SoftwareUpdateGroupId = $SoftwareUpdateGroup.Id
        $HistoryMonthsWidget.DataModel.DeploymentSelectionType = 'ALL'
        $HistoryMonthsWidget.DataModel.Type = 'UpdateGroup'

        $HistoryMonthsWidgetConfiguration = New-IAConfiguration -Name $IASoftwareUpdateConfiguration.Name -IAConfigurationDataModel $HistoryMonthsWidget.DataModel -Passthru -CleanUpEmptyProperties

        $ColumnIndexStarter += 1
        $HistoryMonthsWidgetTemplate = New-IAWidgetObject -ColumnIndex $ColumnIndexStarter -Subtitle "$($HistoryMonthDate.Year) $($HistoryMonthDate.Month)" -IAGroup $IAGroup -IAWidgetTemplate $IAWidgetTemplate -IAWidgetType $HistoryMonthsWidgetType -WidgetConfiguration $HistoryMonthsWidgetConfiguration
        $HistoryMonthsWidgetResult = New-IAWidget -IAWidgetObject $HistoryMonthsWidgetTemplate -PassThru -CreateDataValueFieldMaps
    }
    else{
        # We couldnt find the correct Software Update Group
        Write-Warning -Message "The '$($DonutWidgetDate.Year)' '$($DonutWidgetDate.Month)' software update group was not found!"
    }

    #endregion HistoryMonthWidget

    #region CurrentWidget
    ## Create current widget
    $ThisMonthsWidget = $IASoftwareUpdateConfiguration

    # Try to get this months update group
    $SoftwareUpdateGroup = $SoftwareUpdateGroups | 
        Where-Object -Property Name -like "*$($CurrentDate.Year)*$($CurrentDate.Month)*" | 
        Select-Object -First 1

    if($SoftwareUpdateGroup){
        
        $ThisMonthsWidgetType = Get-IAWidgetType -Name Bar

        $ThisMonthsWidget.DataModel.SoftwareUpdateGroupId = $SoftwareUpdateGroup.Id
        $ThisMonthsWidget.DataModel.DeploymentSelectionType = 'ALL'
        $ThisMonthsWidget.DataModel.Type = 'UpdateGroup'

        $ThisMonthsWidgetConfiguration = New-IAConfiguration -Name $IASoftwareUpdateConfiguration.Name -IAConfigurationDataModel $ThisMonthsWidget.DataModel -Passthru -CleanUpEmptyProperties

        $ColumnIndexStarter += 1
        $ThisMonthsWidgetTemplate = New-IAWidgetObject -ColumnIndex $ColumnIndexStarter -Subtitle "$($CurrentDate.Year) $($CurrentDate.Month)" -IAGroup $IAGroup -IAWidgetTemplate $IAWidgetTemplate -IAWidgetType $ThisMonthsWidgetType -WidgetConfiguration $ThisMonthsWidgetConfiguration
        $ThisMonthsWidgetResult = New-IAWidget -IAWidgetObject $ThisMonthsWidgetTemplate -PassThru -CreateDataValueFieldMaps
    }
    else{
        # We couldnt find the correct Software Update Group
        Write-Warning -Message "The '$($DonutWidgetDate.Year)' '$($DonutWidgetDate.Month)' software update group was not found!"
    }

    #endregion CurrentWidget
}