Public/Get-Patients.ps1

<#
    .SYNOPSIS
    Returns a selected subset of patients in a Salesforce org.

    .DESCRIPTION
    Queries for Salesforce patients and queires the associated CDR resources for those patients.

    .INPUTS
    None. You cannot pipe objects to Get-Patients.

    .OUTPUTS
    An array of hashtables. Each hashtable contains the following keys:
        - sfPatient - the salesforce patient object
        - cdrPatient - the FHIR resource from PDS or CDR

    .PARAMETER SelectCdrIds
    An array of CDR ids to retrieve.

    .PARAMETER Status
    Only return patients with this status. Defaults to "Active"
    Can pass $null for all patients regardless of status.

    .PARAMETER Prompt
    If specified will display an interactive UI to select one or more patients. Default is not not prompt.

    .EXAMPLE
    PS> $patients = Get-Patients -Prompt -Status $null

    .LINK
    Set-FileConfig

    .NOTES
    Assumes config is initialized for org access.
#>

function Get-Patients {
    param(
        [String[]]$SelectCdrIds,
        [String]
        $Status = "Active",
        [Switch]
        $Prompt = $false
    )

    $sfPatients = Get-SfPatients -Status $Status
    if ($null -eq $sfPatients) {
        Write-Error "There are no patients of status '$($Status)' the org"
    }
    $cdrIds = @($sfPatients | Select-Object phecc__CDRPID__c -ExpandProperty phecc__CDRPID__c)
    $bundle = Get-CdrPatients $cdrIds
    $cdrPatients = $bundle.entry | Select-Object resource

    $selected = &{
        if ($SelectCdrIds) {
            $cdrPatients | Where-Object { $SelectCdrIds.Contains($_.resource.Id) } | Select-Object -ExpandProperty resource | Select-Object -Expandproperty id
        } elseif ($Prompt) {
            ($cdrPatients | ForEach-Object { $_.resource } | Select-Object id,@{Name='family';expression={($_.name | Where-Object {$_.use -eq 'usual'}).family}},@{Name='given';expression={($_.name | Where-Object {$_.use -eq 'usual'}).given}},birthDate) | Out-GridView -PassThru | Select-Object Id -ExpandProperty Id
        } else {
            $cdrPatients | Select-Object -ExpandProperty resource | Select-Object -Expandproperty id
        }
    }
    @($selected | ForEach-Object {
        $cdrId = $_
        @{
            sfPatient=($sfPatients | Where-Object {$_.phecc__CDRPID__c -eq $cdrId})
            cdrPatient=($cdrPatients | Where-Object {$_.resource.id -eq $cdrId})
        }
    })
}