Cmdlets/Get-SPOSiteFeatureMigrationValidation/Get-SPOSiteFeatureMigrationValidation.psm1

function Get-SPOSiteFeatureMigrationValidation
{
    [cmdletbinding()]
    param(
    [parameter(Mandatory=$True, ValueFromPipeline=$False, position=0)]
    [System.Collections.ArrayList]$SiteFeatureEntries,
    [parameter(Mandatory=$True, position=1)]
    [System.Management.Automation.PSCredential]$Credential
    )

    $SPOSiteURL = ($SiteFeatureEntries | Select-Object 'Destination Site URL' -Unique) | Select-Object -ExpandProperty 'Destination Site URL'
    $OnPremSiteURL = ($SiteFeatureEntries | Select-Object 'Source Site URL' -Unique) | select-object -ExpandProperty 'Source Site URL'
    try
    {
        try
        {
            Get-PnPConnection | Out-Null
            if(-not ((Get-PnPConnection).url.trimend("/") -eq $SPOSiteURL.trimend("/")))
            {
                Disconnect-PnPOnline
                Connect-PnPOnline -Url $SPOSiteURL.trimend("/") -Credentials $Credential | Out-Null
            }
        }
        catch
        {
            Connect-PnPOnline -Url $SPOSiteURL.trimend("/") -Credentials $Credential | Out-Null
        }
    }
    catch
    {
        write-host "Could not connect to web $($SPOSiteURL.trimend("/"))" -ForegroundColor Red
    }

    $SiteFeatureSummary = New-Object System.Collections.Arraylist
    
    $PNPSiteFeatures = Get-PnPFeature -Scope Site
    foreach($Feature in $SiteFeatureEntries)
    {
        $FeatureSummary = New-Object System.Object
        $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Type of Entry' -Value $Feature.'Type of Entry'
        $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Feature Name' -Value $Feature.'Feature Name'
        $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Feature ID' -Value $Feature.'Feature ID'
        $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Source Site URL' -Value $OnPremSiteURL
        $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Destination Site URL' -Value $SPOSiteURL
        if(($PNPSiteFeatures | Select-Object 'DefinitionID') -match $Feature.'Feature ID')
        {
            $FeatureSummary | add-member -MemberType NoteProperty -name 'SPOState' -Value "Activated"
        }
        else
        {
           $FeatureSummary | add-member -MemberType NoteProperty -name 'SPOState' -Value "Not Activated"
        }
        $SiteFeatureSummary.Add($FeatureSummary) | Out-Null
        Remove-Variable -Name FeatureSummary
    }
    foreach($Feature in $PNPSiteFeatures)
    {
        if(-not (($SiteFeatureEntries | select-object 'Feature ID') -match $Feature.DefinitionId))
        {
            $FeatureSummary = New-Object System.Object
            $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Type of Entry' -Value "Unexpected Site Feature"
            $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Feature Name' -Value $Feature.'DisplayName'
            $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Feature ID' -Value $Feature.'DefinitionID'
            $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Source Site URL' -Value $OnPremSiteURL
            $FeatureSummary | Add-Member -MemberType NoteProperty -Name 'Destination Site URL' -Value $SPOSiteURL
            $SiteFeatureSummary.Add($FeatureSummary) | Out-Null
            Remove-variable -name FeatureSummary
        }
    }
    Return $SiteFeatureSummary
}