UpgradeWizard/MergeNavObject.WithPropertiesUW.ps1

function Merge-NAVObjectsWithPropertiesUW{
    param(
        [parameter(Mandatory=$false)]
        [string]$workFolder,
        [parameter(Mandatory=$true)]
        [string]$sourceBaseFolder,
        [parameter(Mandatory=$true)]
        [string]$sourceModFolder,
        [parameter(Mandatory=$true)]
        [string]$targetBaseFolder,
        [parameter(Mandatory=$true)]
        [string]$resultFolder,
        [string]$objectName)

    if (-not $workFolder.EndsWith("\")) {$workFolder += "\"}
    if ($workFolder -eq "\") {$workFolder = ""}
    if (-not $sourceBaseFolder.EndsWith("\")) {$sourceBaseFolder += "\"}
    if (-not $sourceModFolder.EndsWith("\")) {$sourceModFolder += "\"}
    if (-not $targetBaseFolder.EndsWith("\")) {$targetBaseFolder += "\"}
    if (-not $resultFolder.EndsWith("\")) {$resultFolder += "\"}

    $collection = @()    
    #Codeunits
    $out = new-object psobject
    $out | add-member noteproperty "ObjectName" "Codeunit"
    $out | add-member noteproperty "Total" 0; 
    $collection += $out
    #XML Ports
    $out = new-object psobject
    $out | add-member noteproperty "ObjectName" "XMLPort"
    $out | add-member noteproperty "Total" 0; 
    $collection += $out
    #Queries
    $out = new-object psobject
    $out | add-member noteproperty "ObjectName" "Query"
    $out | add-member noteproperty "Total" 0; 
    $collection += $out
    #MenuSuite
    $out = new-object psobject
    $out | add-member noteproperty "ObjectName" "MenuSuite"
    $out | add-member noteproperty "Total" 0; 
    $collection += $out
    #Page
    $out = new-object psobject
    $out | add-member noteproperty "ObjectName" "Page"
    $out | add-member noteproperty "Total" 0; 
    $collection += $out
    #Report
    $out = new-object psobject
    $out | add-member noteproperty "ObjectName" "Report"
    $out | add-member noteproperty "Total" 0; 
    $collection += $out
    #Table
    $out = new-object psobject
    $out | add-member noteproperty "ObjectName" "Table"
    $out | add-member noteproperty "Total" 0; 
    $collection += $out

    if ($objectName -eq "") {
        $fileCount = (Get-ChildItem $workFolder$targetBaseFolder).Count
        $fileIndex = 0
        foreach ($f in Get-ChildItem $workFolder$targetBaseFolder) {
            $fileIndex ++
            $progress = [math]::Round(($fileIndex / $fileCount) * 100)
            #write-host "---------merge progress: $progress% ($fileIndex of $fileCount)"
            #write-host ([math]::Round($fileindex / $filecount*100))
            Write-Progress -Activity “Merge Progress” -status “%$progress Processing file $f” -percentComplete ([math]::Round($fileindex / $filecount*100))
            if (Test-Path $workFolder$sourceModFolder$f) {
                #write-host "merging $f..."
                $result = Merge-NAVObjectWithPropertiesUW -workFolder $workFolder -sourceBaseFolder $sourceBaseFolder -sourceModFolder $sourceModFolder -targetBaseFolder $targetBaseFolder -resultFolder $resultFolder -objectName $f -batchMode $true
                $result1 = $result[0].Split("`r`n")|where {$_ -like '*Conflict*changes'}
                    $result1 = $result1.Remove(1, 12)
                    $result1 = $result1.Remove($result1.IndexOf('changes'), 7)
                    [int]$conflictNo = $result1
                    $ObjectType=$result[1]|Where-Object MergeResult -eq 'Conflict'
                    foreach ($obj in $collection) {if ($Obj.ObjectName -eq $ObjectType.ObjectType) {$obj.Total += $conflictNo}}
            } else {
                #write-host "copying $f..."
                $r = copy-item -path $workFolder$targetBaseFolder$f -Destination $workFolder$resultFolder$f
            }
        }
    } else {
        $result = Merge-NAVObjectWithPropertiesUW -workFolder $workFolder -sourceBaseFolder $sourceBaseFolder -sourceModFolder $sourceModFolder -targetBaseFolder $targetBaseFolder -resultFolder $resultFolder -objectName $objectName -openInBeyondCompare $true
    }
    return $collection
}

function Merge-NAVObjectWithPropertiesUW{
    param(
        [parameter(Mandatory=$false)]
        [string]$workFolder,
        [parameter(Mandatory=$true)]
        [string]$sourceBaseFolder,
        [parameter(Mandatory=$true)]
        [string]$sourceModFolder,
        [parameter(Mandatory=$true)]
        [string]$targetBaseFolder,
        [parameter(Mandatory=$true)]
        [string]$resultFolder,
        [parameter(Mandatory=$true)]
        [string]$objectName,
        [boolean]$openInBeyondCompare,
        [boolean]$batchMode)
    $myReturnArray = @()
    # merge changes
    $progressPreference = 'silentlyContinue'    # Subsequent calls do not display UI.
    $result=Merge-NAVApplicationObject `
        -OriginalPath $workFolder$sourceBaseFolder$objectName `
        -ModifiedPath $workFolder$sourceModFolder$objectName `
        -TargetPath $workFolder$targetBaseFolder$objectName `
        -ResultPath $workFolder$resultFolder$objectName `
        -DocumentationConflict TargetFirst `
        -Force
    $progressPreference = 'Continue'            # Subsequent calls do display UI.

    # get object details
    if (-not $batchMode) {
        write-host "merging object properties..."
    }

    $sourceObjectDetails = Get-NAVApplicationObjectProperty -Source $workFolder$sourceBaseFolder$objectName
    $modObjectDetails = Get-NAVApplicationObjectProperty -Source $workFolder$sourceModFolder$objectName
    $targetObjectDetails = Get-NAVApplicationObjectProperty -Source $workFolder$targetBaseFolder$objectName

    # merge versions
    $sourceVersionList =  $sourceObjectDetails | select VersionList
    $sourceVersions = $sourceVersionList.VersionList.Split(",")

    $modVersionList = $modObjectDetails | select VersionList
    $modVersions = $modVersionList.VersionList.Split(",")

    $targetVersionList = $targetObjectDetails | select VersionList

    foreach ($v in $sourceVersions) {
        $modVersions = $modVersions -ne $v
    }

    foreach ($v in $modVersions) {
        if ($v.StartsWith("NAV")) {$modVersions = $modVersions -ne $v}
    }

    if ($modVersions.Length -gt 0) {
        $newVersionList = ""
        if ($targetVersionList -ne "") {
            $newVersionList = $targetVersionList.VersionList;
        }
        foreach ($v in $modVersions) {
            if ($newVersionList -ne "") {
                $newVersionList += "," + $v
            } else {
                $newVersionList = $v
            }
        }
        Set-NAVApplicationObjectProperty -TargetPath $workFolder$resultFolder$objectName -VersionListProperty $newVersionList
    }

    # merge modified
    $modModified = $modObjectDetails | select Modified
    if ($modModified.Modified) {
        Set-NAVApplicationObjectProperty -TargetPath $workFolder$resultFolder$objectName -ModifiedProperty "Yes"
    }

    # merge date & time
    $sourceDate = $sourceObjectDetails.Date
    $modDate = $modObjectDetails.Date
    $targetDate = $targetObjectDetails.Date

    if ($modDate -ne $sourceDate) {
        if ([datetime]::ParseExact($modDate,"dd/MM/yy", $null) -gt [datetime]::ParseExact($targetDate,"dd/MM/yy",$null)) {
            $newDateTime = $modObjectDetails.Date.ToString() + " " + $modObjectDetails.Time.ToString()
            Set-NAVApplicationObjectProperty -TargetPath $workFolder$resultFolder$objectName -DateTimeProperty $newDateTime
        }
        Set-NAVApplicationObjectProperty -TargetPath $workFolder$resultFolder$objectName -ModifiedProperty "Yes"
    }

    if (-not $batchMode) {
        write-host "object merged"
    }

    if ($openInBeyondCompare) {
        if (-not $batchMode) {
            write-host "opening in BeyondCompare..."
        }

        $bcomp = "`"C:\Program Files (x86)\Beyond Compare 4\BComp.exe`""

        Start-Process -FilePath $bcomp -ArgumentList "/fv `"$workFolder$sourceModFolder$objectName`" `"$workFolder$sourceBaseFolder$objectName`"" 
        Start-Process -FilePath $bcomp -ArgumentList "/fv `"$workFolder$resultFolder$objectName`" `"$workFolder$targetBaseFolder$objectName`"" 
        Start-Process -FilePath $bcomp -ArgumentList "/fv `"$workFolder$targetBaseFolder$objectName`" `"$workFolder$sourceBaseFolder$objectName`"" 
        Start-Process -FilePath $bcomp -ArgumentList "/fv `"$workFolder$resultFolder$objectName`" `"$workFolder$sourceBaseFolder$objectName`"" 
    }
    $myReturnArray += $result.Summary
    $myReturnArray += $result
    return $myReturnArray
    return $result
}