Apps/Create-NAVAppFiles.ps1

function Create-NAVAppFiles
{    <#
    .Synopsis
       Create delta's, specifically meant to do NAVApps, which means: including permissionsets and Web Services
    .DESCRIPTION
        
    .NOTES
       <TODO: Some tips>
    .PREREQUISITES
       <TODO: like positioning the prompt and such>
    #>


    [CmdLetBinding()]
    param(
        [string] $OriginalServerInstance,
        [string] $ModifiedServerInstance,
        [string] $BuildPath,
        [String] $PermissionSetId='',
        [String] $WebServicePrefix='',
        [String[]] $IncludeFilesInNavApp)

    $BuildPath = Join-Path -Path $BuildPath -ChildPath 'CreateNAVAppFiles'

    $orginalObjects = Join-Path -Path $BuildPath -ChildPath 'original.txt'
    $modifiedObjects = Join-Path -Path $BuildPath -ChildPath 'modified.txt'
    $modifiedObjectsPartial = Join-Path -Path $BuildPath -ChildPath 'modified_partial.txt'

    $OriginalServerInstanceObject = Get-NAVServerInstanceDetails -ServerInstance $OriginalServerInstance
    $ModifiedServerInstanceObject = Get-NAVServerInstanceDetails -ServerInstance $ModifiedServerInstance

    $AppFilesFolder = Join-Path -Path $BuildPath -ChildPath 'AppFiles'
    $AppFilesFolder = New-Item -ItemType Directory -Force -Path $AppFilesFolder 

    $originalFolder = Join-Path -Path $BuildPath -ChildPath 'Original'
    $originalFolder = New-Item -ItemType Directory -Force -Path $originalFolder 

    $modifiedFolder = Join-Path -Path $BuildPath -ChildPath 'Modified'
    $modifiedFolder = New-Item -ItemType Directory -Force -Path $modifiedFolder
    
    $ExportJobs = @()
         
    if (!(Test-Path -Path $orginalObjects))
    {
        Write-Host -Foregroundcolor Green 'Exporting ORIGINAL objects ...'
        Export-NAVApplicationObject -DatabaseServer $OriginalServerInstanceObject.DatabaseServer -DatabaseName $OriginalServerInstanceObject.Databasename -Path $orginalObjects -ExportTxtSkipUnlicensed | Out-Null
        Split-NAVApplicationObjectFile -Source $orginalObjects -Destination $originalFolder -PreserveFormatting -Force 
        Write-Host -Foregroundcolor Green "ORIGINAL objects exported to $originalObjects"        
    } else {
        write-warning "$orginalObjects already exists. ORIGINAL objects are NOT exported again!"
    }
    
    Write-Host -Foregroundcolor Green 'Exporting MODIFIED objects ...'
       
    if (!(Test-Path -Path $modifiedObjects))
    {
        Export-NAVApplicationObject -DatabaseServer $ModifiedServerInstanceObject.DatabaseServer -DatabaseName $ModifiedServerInstanceObject.DatabaseName -Path $modifiedObjects -ExportTxtSkipUnlicensed | Out-Null   
        Split-NAVApplicationObjectFile -Source $modifiedObjects -Destination $modifiedFolder -PreserveFormatting -Force
        Write-Host -Foregroundcolor Green "All objects from $ModifiedServerInstance exported to $modifiedObjects"
    } else {
        Export-NAVApplicationObject -DatabaseServer $ModifiedServerInstanceObject.DatabaseServer -DatabaseName $ModifiedServerInstanceObject.DatabaseName -Path $modifiedObjectsPartial -Filter 'Modified=1' -ExportTxtSkipUnlicensed -Force | Out-Null   
        
        if (!(Test-Path $modifiedObjectsPartial) -or ((get-item $modifiedObjectsPartial).Length -eq 0)){
            write-error 'No modified objects found! Nothing exported'
        } else {
            Split-NAVApplicationObjectFile -Source $modifiedObjectsPartial -Destination $modifiedFolder -PreserveFormatting -Force
            write-warning "$modifiedObjects already existed. Only objects with MODIFIED=TRUE were exported!"
            Write-Host -Foregroundcolor Green "Modified objects from $ModifiedServerInstance exported to $modifiedObjects"
        }                
        
    }
        
    Write-Host -Foregroundcolor Green 'Comparing and creating Deltas...'
    Get-ChildItem -Path $AppFilesFolder -Include *.* -File -Recurse | Remove-Item
    $result = Compare-NAVApplicationObject -OriginalPath ($originalFolder.FullName + '\*.txt') -ModifiedPath ($modifiedFolder.FullName + '\*.txt') -DeltaPath $AppFilesFolder -NoCodeCompression -Force 
    Write-Host -Foregroundcolor Green "Deltas extracted to $AppFilesFolder"


    #Create Permission Sets
    if(!([String]::Isnullorempty($PermissionSetId))){
        Write-Host -Foregroundcolor Green "Exporting PermissionSet $PermissionSetId from $ModifiedServerInstance ..."
        #try {
            $PermissionSetExists = Get-NAVServerPermissionSet -ServerInstance $ModifiedServerInstance | where PermissionSetID -eq $PermissionSetId
            if ($PermissionSetExists){
                Export-NAVAppPermissionSet `
                    -ServerInstance $ModifiedServerInstance `
                    -PermissionSetId $PermissionSetID `
                    -Path (join-path $AppFilesFolder "$PermissionSetID.xml") `
                    -ErrorAction SilentlyContinue
            } else {
                Get-NAVServerPermissionSet -ServerInstance $ModifiedServerInstance | 
                Where PermissionSetID -iLike "$PermissionSetID*" |
                    foreach {
                        Export-NAVAppPermissionSet `
                            -ServerInstance $ModifiedServerInstance `
                            -PermissionSetId $_.PermissionSetID `
                            -Path (join-path $AppFilesFolder "$($_.PermissionSetID).xml") 
                    }
                    
            }
            
        #}
        #Catch {
        # Write-Warning -Message 'Something went wrong with exporting Permission sets!'}
     }   

    #Create WebServiceXML
    if(!([String]::Isnullorempty($WebServicePrefix))){
        Write-Host -Foregroundcolor Green "Exporting Tenant Web Services with prefix '$WebServicePrefix' from $ModifiedServerInstance ..."

        Invoke-NAVSQL -ServerInstance $ModifiedServerInstance -SQLCommand "Select * From [Tenant Web Service] where [Service Name] like '%$WebServicePrefix%'" | 
            select 'Object Type', 'Service Name', 'Object ID' |
                foreach {
                    switch ($_.'Object Type')
                    {
                        '8' {$ObjectType = 'Page'}
                        '5' {$ObjectType = 'CodeUnit'}
                        Default {$ObjectType = $null}        
                    }
                    if (!([String]::IsNullOrEmpty($ObjectType))){
                        Export-NAVAppTenantWebService `
                            -ServiceName $_.'Service Name' `
                            -ObjectType $ObjectType `
                            -ObjectId $_.'Object ID' `
                            -Path (join-path $AppFilesFolder "$($_.'Service Name').xml") `
                            -ServerInstance $ModifiedServerInstance
                    }
                }
    }

    #IncludeFiles
    if(!([String]::Isnullorempty($IncludeFilesInNavApp))){
        foreach ($IncludeFileInNavApp in $IncludeFilesInNavApp){
            Write-Host -ForegroundColor Gray "Copying $([io.path]::GetFileName($IncludeFileInNavApp)) to $AppFilesFolder"
            Copy-Item -Path $IncludeFileInNavApp -Destination (join-path $AppFilesFolder ([io.path]::GetFileName($IncludeFileInNavApp)))
        }
    }   


    return $AppFilesFolder
}