Public/Utilities/CSV_Import/New-JCMSPImportTemplate.ps1

Function New-JCMSPImportTemplate() {
    [CmdletBinding()]

    param
    (
        [Parameter(
            ParameterSetName = 'force',
            HelpMessage = 'Parameter to force populate CSV with all headers when creating an update template. When selected this option will forcefully replace existing files in the current working directory.',
            Mandatory = $false)]
        [Switch]
        $Force,
        [Parameter(ParameterSetName = 'force',
            HelpMessage = 'Type of CSV to Create. Update or Import are valid options.',
            Mandatory = $false)]
        [ValidateSet('Import', 'Update')]
        $Type
    )

    begin {
        Write-Verbose 'Verifying JCAPI Key'
        if ($JCAPIKEY.length -ne 40) {
            Connect-JCOnline
        }

        $date = Get-Date -Format MM-dd-yyyy

        if ($PSCmdlet.ParameterSetName -eq 'force') {
            $ExportLocation = $PWD
        } else {

            $Banner = @"
       __ ______ __ __
      / /__ __ ____ ___ ____ / ____// /____ __ __ ____/ /
 __ / // / / // __ __ \ / __ \ / / / // __ \ / / / // __ /
/ /_/ // /_/ // / / / / // /_/ // /___ / // /_/ // /_/ // /_/ /
\____/ \____//_/ /_/ /_// ____/ \____//_/ \____/ \____/ \____/
                       /_/
                                    CSV MSP Import Template
"@


            Write-Host $Banner -ForegroundColor Green
            Write-Host ""

            # PromptForChoice Args
            $Title = "The CSV template will be created in the current working directory: $PWD"
            $Prompt = "Would you like to specify a new path?"

            $Choices = @(
                [System.Management.Automation.Host.ChoiceDescription]::new("&Current directory: $PWD", "A CSV import template will be created in the current working directory")
                [System.Management.Automation.Host.ChoiceDescription]::new("&Specify a new directory", "Specify a directory in which to save the CSV import template.")
                [System.Management.Automation.Host.ChoiceDescription]::new("&Cancel", "Exit this prompt")
            )
            $Default = 0

            # Prompt for the choice
            $Choice = $host.UI.PromptForChoice($Title, $Prompt, $Choices, $Default)

            # Action based on the choice
            switch ($Choice) {
                0 {
                    $ExportLocation = $PWD
                }
                1 {
                    $ExportLocation = Read-Host "Enter the full path to the folder you wish to create the import file in"

                    while (-not(Test-Path -Path $ExportLocation -PathType Container)) {
                        Write-Host "The location $ExportLocation does not exist. Try another"
                        $ExportLocation = Read-Host "Enter the full path to the folder you wish to create the import file in"

                    }
                    Write-Host ""
                    Write-Host "The CSV file will be created within the $ExportLocation directory"
                }
                2 {
                    break
                }
            }
        }
    }

    process {
        if ($type -eq 'Import') {
            $ConfirmUpdateVsNew = 'N'
        } elseif ($type -eq 'Update') {
            $ConfirmUpdateVsNew = 'U'
        } Else {

            # PromptForChoice Args
            $Title = "Do you want to create an import CSV template for creating new MSP orgs or updating existing MSP orgs?"
            $Prompt = "Enter your choice"

            $Choices = @(
                [System.Management.Automation.Host.ChoiceDescription]::new("&New MSP Orgs", "Create template for importing new MSP Orgs")
                [System.Management.Automation.Host.ChoiceDescription]::new("&Update Existing MSP Orgs", "Get list of existing MSP Orgs and create template")
                [System.Management.Automation.Host.ChoiceDescription]::new("&Cancel", "Exit this prompt")
            )
            $Default = 1

            # Prompt for the choice
            $Choice = $host.UI.PromptForChoice($Title, $Prompt, $Choices, $Default)

            # Action based on the choice
            switch ($Choice) {
                0 {
                    $ConfirmUpdateVsNew = 'N'
                }
                1 {
                    $ConfirmUpdateVsNew = 'U'
                }
                2 {
                    break
                }
            }
        }

        if ($ConfirmUpdateVsNew -eq 'U') {
            $CSV = New-Object System.Collections.ArrayList

            $fileName = 'JCMSPUpdateImport_' + $date + '.csv'
            Write-Debug $fileName

            if ($ConfirmUpdateVsNew -eq 'U') {
                ### Existing Orgs
                $orgHeaders = @{
                    "x-api-key" = $ENV:JCApiKey
                }
                $ExistingOrgs = New-Object System.Collections.ArrayList

                # paginate variables
                $skip = 0
                $limit = 10

                Do {
                    # get results
                    $response = Invoke-RestMethod -Uri "https://console.jumpcloud.com/api/organizations?limit=$($limit)&skip=$($skip)&sortIgnoreCase=settings.name&fields%5B0%5D=id&fields%5B1%5D=displayName&fields%5B2%5D=systemsCount&fields%5B3%5D=systemUsersCount&fields%5B4%5D=highWaterMarkLastMonth&fields%5B5%5D=entitlement&fields%5B6%5D=maxSystemUsers" -Method GET -Headers $orgHeaders

                    # add results to the ExistingOrgs
                    foreach ($item in $response.results) {
                        $ExistingOrgs.add($item) | Out-Null
                    }
                    $skip += $limit
                } until (($response.results.count -lt $limit))
                ###
                foreach ($Org in $ExistingOrgs.GetEnumerator()) {
                    $CSV.Add([pscustomobject]@{
                            Name           = $Org.displayName
                            maxSystemUsers = $org.maxSystemUsers
                            id             = $org.id
                        }) | Out-Null
                }
            }
            $fileName = 'JCMSPUpdateImport_' + $date + '.csv'
            Write-Debug $fileName
        } elseif ($ConfirmUpdateVsNew -eq 'N') {
            $CSV = New-Object System.Collections.ArrayList
            $CSV.Add( [PSCustomObject]@{
                    Name           = $null
                    maxSystemUsers = $null
                }) | Out-Null

            $fileName = 'JCMSPImport_' + $date + '.csv'
            Write-Debug $fileName
        }


    }
    end {
        $ExportPath = Test-Path ("$ExportLocation/$FileName")
        if ($PSCmdlet.ParameterSetName -eq 'force') {
            if (!$ExportPath ) {
                Write-Host ""
                $CSV | Export-Csv -path "$ExportLocation/$FileName" -NoTypeInformation
                Write-Host 'Creating file '  -NoNewline
                Write-Host $FileName -ForegroundColor Yellow -NoNewline
                Write-Host ' in the location' -NoNewline
                Write-Host " $ExportLocation" -ForegroundColor Yellow
            } else {
                Write-Warning "The file $fileName already exists, overwriting..."
                $CSV | Export-Csv -path "$ExportLocation/$FileName" -NoTypeInformation
                Write-Host 'Creating file '  -NoNewline
                Write-Host $FileName -ForegroundColor Yellow -NoNewline
                Write-Host ' in the location' -NoNewline
                Write-Host " $ExportLocation" -ForegroundColor Yellow
            }
        } Else {
            if (!$ExportPath ) {
                Write-Host ""
                $CSV | Export-Csv -path "$ExportLocation/$FileName" -NoTypeInformation
                Write-Host 'Creating file'  -NoNewline
                Write-Host " $fileName" -ForegroundColor Yellow -NoNewline
                Write-Host ' in the location' -NoNewline
                Write-Host " $ExportLocation" -ForegroundColor Yellow
            } else {
                Write-Host ""
                Write-Warning "The file $fileName already exists do you want to overwrite it?" -WarningAction Inquire
                Write-Host ""
                $CSV | Export-Csv -path "$ExportLocation/$FileName" -NoTypeInformation
                Write-Host 'Creating file '  -NoNewline
                Write-Host $FileName -ForegroundColor Yellow -NoNewline
                Write-Host ' in the location' -NoNewline
                Write-Host " $ExportLocation" -ForegroundColor Yellow
            }

            # PromptForChoice Args
            $Title = "Do you want to open the files?"
            $Prompt = "Enter Y to open the CSV, N to continue and exit"

            $Choices = @(
                [System.Management.Automation.Host.ChoiceDescription]::new("&Yes Open", "Opens the file in the defualt CSV editor")
                [System.Management.Automation.Host.ChoiceDescription]::new("&No", "Continue and exit prompt")
            )
            $Default = 1

            # Prompt for the choice
            $Choice = $host.UI.PromptForChoice($Title, $Prompt, $Choices, $Default)

            # Action based on the choice
            switch ($Choice) {
                0 {
                    Invoke-Item -path "$ExportLocation/$FileName"
                }
                1 {
                    $ConfirmUpdateVsNew = 'U'
                    continue
                }
            }
        }
    }
}