examples/hastables.ps1

#Import Useful Modules
Import-Module .\PSBlackboard.psm1 -Verbose -force

#Get Useful Terms
$CurrentTerms = Get-BBTerms -TargetTerm 'AllCurrent'
$LMSConnectDataSourceKey = Get-BBDataSources -ExternalID 'LMSConnect'
#Other Variables
$FileName = '.\examples\EarlyWarning.csv'
$FileName = '\\oc-share2\BBFiles\Output\EarlyWarning.csv'
[System.Collections.ArrayList]$FeedFileOutput = @()
$Counter = 0

#Get the courses
foreach($Term in $CurrentTerms){

    [System.Collections.ArrayList]$Courses = @()
    [System.Collections.ArrayList]$CourseMemberships = @()
    #$CourseMemberships = @()

    Get-BBCourses -Filter "termId=$($Term.id)" -limit $false | ForEach-Object { $Courses.add($_) | Out-Null}

    #Get all courses membershps for the semester. Expand user brings back the user information for this call.
    $Courses | foreach-Object -Begin{
        $Counter = 0
    } -Process {
        $Counter += 1
       # Write-Debug "Processing Course Enrollments Progress: $($Counter)/$($Courses.count) ($($($Counter)/$($Courses.count))) [$($_.id)] PercentComplete $(($($Counter)/$($Courses.count))*100)"
        Write-Progress -Activity "Getting Cousre Memberships from Blackboard API" -status "Progress: $($Counter)/$($Courses.count) ($($($Counter)/$($Courses.count))) [$($_.id)]" -PercentComplete (($($Counter)/$($Courses.count))*100)
        $params = @{
            CourseID =  $_.id
            ExpandUser = $true
        }
            Write-Debug "Processing memberships for $($_.id)"
            $Items = $(Get-BBCourseMemberships @params )
            $Items | ForEach-Object{
                $CourseMemberships.Add($_) | Out-Null
            }
            #$CourseMemberships += Get-BBCourseMemberships @params #-Verbose
        } -End {
        }
}

#Owned Enrollments by LMSConnect that are child enrollments, or just single shells.
$LMSConnectCourseMemeberships = $CourseMemberships | Where-Object {($_.dataSourceId -eq $LMSConnectDataSourceKey.id)}
$CoursesCourseIDHashTable = $Courses | Group-Object -AsHashTable -Property id

#Get a distinct list of parent course ID's. Then process the hashtable for only these
#Get a distinct list of child shells with no parents. Add these enrollments. If that's fast.. then we can keep going

$Counter = 0
#Get An EPN on each memebership record.
foreach($CourseMembership in $LMSConnectCourseMemeberships){
    $Counter += 1
    Write-Progress -Activity "Adding EPN to each membership record" -Status "Progress: $($Counter)/$($LMSConnectCourseMemeberships.count) ($($($Counter)/$($LMSConnectCourseMemeberships.count))) [$($Course.externalId) for $($CourseMembership.user.externalID)]" -PercentComplete (($($Counter)/$($LMSConnectCourseMemeberships.count))*100)
    if($null -ne $CourseMembership.childCourseId){
        #Find the corresponding child shell and get it's epn to put on the enrollment
        $CorrespondingChild = $CoursesCourseIDHashTable[$CourseMembership.childCourseId]
        $EPN = $($($CorrespondingChild.courseId).split("_")[0]).split("-")[2]
        Add-Member -InputObject $CourseMembership -NotePropertyName EPN -NotePropertyValue $EPN -force
    }else{
        $Course = $CoursesCourseIDHashTable[$CourseMembership.courseId]
        $EPN = $($($Course.courseId).split("_")[0]).split("-")[2]
        Add-Member -InputObject $CourseMembership -NotePropertyName EPN -NotePropertyValue $EPN -force
    }

}

$LMSConnectCourses_UsersHashtable = $LMSConnectCourseMemeberships | Group-object -Property EPN,userId -AsHashTable -AsString
$counter = 0
foreach($key in $LMSConnectCourses_UsersHashtable.Keys){
    $Counter += 1
    Write-Progress -Activity "Determining Last Access Datetime" -Status "Progress: $($Counter)/$($LMSConnectCourses_UsersHashtable.count) ($($($Counter)/$($LMSConnectCourses_UsersHashtable.count))) [$($LMSConnectCourses_UsersHashtable[$key][0].EPN) for $($LMSConnectCourses_UsersHashtable[$key][0].user.contact.email)]" -PercentComplete (($($Counter)/$($LMSConnectCourses_UsersHashtable.count))*100)
    $LastAccessed = $null
        $LMSConnectCourses_UsersHashtable[$key] | ForEach-Object{
            $CourseLastAccessed = $_.lastAccessed
            if ($null -ne $CourseLastAccessed){
                if($CourseLastAccessed -gt $LastAccessed){
                    $LastAccessed = $CourseLastAccessed
                }
            }
    }


    $FeedFileOutput.Add([PSCUstomObject]@{
        EPN = $LMSConnectCourses_UsersHashtable[$key][0].EPN
        'Student ID #' = $LMSConnectCourses_UsersHashtable[$key][0].user.studentId
        LName = $LMSConnectCourses_UsersHashtable[$key][0].user.name.family
        FName = $LMSConnectCourses_UsersHashtable[$key][0].user.name.given
        Email = $LMSConnectCourses_UsersHashtable[$key][0].user.contact.email
        studentId = $LMSConnectCourses_UsersHashtable[$key][0].user.externalID
        lastAccessed = if ($null -eq $LastAccessed){
            ""
            }else{
                $LastAccessed
            }
    }) | out-null
}

$FeedFileOutput| Sort-Object -Property 'EPN','Email' | Select-Object -Property EPN,'Student ID #',Lname,FName,Email,@{ Name = 'Last Access Date';  Expression = {$($_.lastAccessed.ToLocalTime())}},@{ Name = 'Days Since Last Accessed';  Expression = { $(New-TimeSpan -start $($_.lastAccessed.ToLocalTime()) -end $(Get-Date)).Days}} | ConvertTo-Csv  -NoTypeInformation -Delimiter '|' |ForEach-Object { $_ -replace '"', ""} |Set-Content -path $FileName