Public/Sync-CBModelsFromGoogleToAeries.ps1

Function Sync-CBModelsFromGoogleToAeries {
<#
.SYNOPSIS
    Import Chromebook Models from Google to Titles in Aeries
.DESCRIPTION
    The Sync-CBModelsFromGoogleToAeries function pulls adds new unique models to Aeries as Titles in Aeries District Assets
.EXAMPLE
    Sync-CBModelsFromGoogleToAeries
.PARAMETER
.INPUTS
.OUTPUTS
.NOTES
.LINK
#>

    [CmdletBinding()] #Enable all the default paramters, including -Verbose
    Param(
        [Parameter( Mandatory,
                    Position=0)]
            [string]$config
    )

    Begin {
        Write-Verbose "$($MyInvocation.line)"
        Write-Verbose "Starting $($MyInvocation.InvocationName) with $($PsCmdlet.ParameterSetName) parameterset..."
        Write-Verbose "Parameters are $($PSBoundParameters | Select-Object -Property *)"

        #include $DistrictAssetConfig
        Write-Verbose "Using Config: $config"
        . $env:LOCALAPPDATA\powershell\SPSAeriesAssetSync\$config\DistrictAssetConfig.ps1
        Set-PSGSuiteConfig $DistrictAssetConfig.PSGSuiteConfig
        Set-SPSAeriesConfiguration -Name $DistrictAssetConfig.SPSAeriesConfig
        $SchoolConfigs = $DistrictAssetConfig.SchoolConfigs
        Write-Verbose ($SchoolConfigs | Format-Table | Out-String)
    }
    Process {
        # We'll pull Active chromebooks from each 1:1 unassigned directory
        # and put into a hastable with the serial number as the key
        $cbHT = @{}
        foreach ($schoolConfig in $SchoolConfigs) {
            foreach ($GoogleOU in $schoolconfig.GoogleOUs) {
                [string]$OUPath = $GoogleOU
                Write-Verbose "Retrieving active Chromebooks from $($OUPath)"
                Get-GSChromeOSDevice -Filter status:ACTIVE -OrgUnitPath $OUPath -Projection FULL |
                ForEach-Object {
                    $cbHT[$_.serialnumber] = $_
                    $cbHT[$_.serialnumber] | Add-Member -NotePropertyName 'AeriesSiteCode' -NotePropertyValue $schoolConfig.AeriesSiteCode
                    $cbHT[$_.serialnumber] | Add-Member -NotePropertyName 'Site' -NotePropertyValue $schoolConfig.Site
                    # This if statement is to catch long model names such as the below example from Acer
                    # Model: Acer Chromebook Spin 511 (R753T) & Acer Chromebook spin 511 (R753TN) & Acer Chromebook Spin 511(R752T-R)
                    # Truncated: Acer Chromebook Spin 511 (R753T R753TN R752T-R)
                    if ($_.Model.length -gt 60) {
                        $model = $_.Model
                        Write-Verbose "Model name is over 60 characters: $model"
                        $modelNumbers = Get-TextWithin $model -WithinChar "("
                        $pos = $model.IndexOf("(")
                        $modelBeginning = $model.Substring(0, $pos)
                        $model = $modelBeginning + "($($modelNumbers))"
                        $cbHT[$_.serialnumber].Model = $model
                        Write-Verbose "Model name truncated to: $model"
                    }

                }
                Write-Verbose "Chromebooks Pulled from $($OUPath): $($cbHT.Count)"
            }
        }
        Write-Verbose "Total Chromebook count: $($cbHT.Count)"

        $Models = $cbHT.GetEnumerator() | ForEach-Object {$_.Value.Model} | Sort-Object | Get-Unique
        Write-Verbose "Found unique models: $($Models)"
        $AeriesTitles = Get-SPSAeriesDistrictAssetTitle

        ForEach ($model in $Models) {
            if ($AeriesTitles.Title -notcontains $model) {
                Write-Verbose "Model missing from Aeries District Assets, creating title in Aeries: $($model)"
                New-SPSAeriesDistrictAssetTitle -Title $model
            } else {
                Write-Verbose "Model exists in Aeries District Assets Titles: $($model)"
            }
        }
    }
    End {
        Write-Verbose -Message "Ending $($MyInvocation.InvocationName)..."
    }

}