Weedu.psm1

Add-Type -AssemblyName System.Web 
$script:hostUrl= $null
$script:sessionVar = $null
$script:loginMsg = "Weedu Anmeldung ist erforderlich: Connect-Weedu"

function Connect-Weedu {
    param(
        [Parameter(Mandatory=$true)]
        [string]$Benutzername,
        [Parameter(Mandatory=$true)]
        [Security.SecureString]$Kennwort,
        [Parameter(Mandatory = $true, HelpMessage = "Url zu welcher die Verbindung hergestellt werden soll. Bsp.: https://akad-de.test-weedu.ch")]
        [string]$HostUrl
    )
    process{
        try{        
            $password = ConvertTo-PlainText $Kennwort            
            $pair = "$($Benutzername):$($password)"
            $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
            $basicAuthValue = "Basic $encodedCreds"
            
            $Headers = @{
                Accept = "application/json, text/javascript, */*"
                Authorization = $basicAuthValue                
            }

            $result = Invoke-WebRequest -Uri "$($HostUrl)/sts/authentication" -Method Post -Headers $Headers -SessionVariable session            

            if($result.StatusCode -eq 200)
            {
                $script:sessionVar = $session
                $script:hostUrl = $HostUrl
            }
            else
            {
                Write-Error "Login Fehlgeschlagen. Erneut versuchen"
            }
        }
        catch [System.Net.WebException]{
           [System.Net.HttpWebResponse]$result = [System.Net.HttpWebResponse] $_.Exception.Response
           $httperrorcode  = $result.StatusCode.Value__
           $error.clear()
           Write-Error "Login Fehlgeschlagen. Erneut versuchen"
        }
    }
}

function Invoke-WqlQuery{
    param(
        [Parameter(Mandatory=$true, HelpMessage = "WQL Abfrage. Bsp: Personen [ohne Aktionen]")]
        [string]$WQLAbfrage,
        [Parameter(Mandatory=$false, HelpMessage = "Default 1")]
        [int]$Page = 1,
        [Parameter(Mandatory=$false, HelpMessage = "Default 100")]
        [int]$PageSize = 100
    )
    process{
        if($Page -le 0)
        {
            Write-Error "$($Page) ist kein gueltiger Wert fuer Page! Bitte ein Wert groesser 0 eingeben"
            break
        }
        if($PageSize -le 0)
        {
            Write-Error "$($PageSize) ist kein gueltiger Wert fuer PageSize! Bitte ein Wert groesser 0 eingeben"
            break
        }
        try{            
            if(!$script:sessionVar)
            {
                Write-Error $script:loginMsg 
                break
            }
            
            $Headers = @{
                Accept = "application/json, text/javascript, */*"
                "Content-Type" = "application/json; charset=UTF-8"
            }    
                    
            $Body = [PSCustomObject]@{ page=$Page; pageSize=$PageSize; } | ConvertTo-Json

            $query = "{0}/{1}?auswahlSpalte={2}&wql={3}" -f "$($script:hostUrl)", "index/Abfragen/IndexData", "false",  [uri]::EscapeDataString("$($WQLAbfrage)");
            $result = Invoke-WebRequest  -Uri "$($query)" -Method Post  -Headers $Headers -WebSession $script:sessionVar -Body $Body
            
            $httperrorcode = $result.Statuscode
            if($result.StatusCode -eq 200)
            {
                $resultConverted = $result | ConvertFrom-Json
                if($resultConverted.total -eq 0 -or $resultConverted.result.data.count -eq 0)
                {
                    Write-Warning "Die Abfrage lieferte keine Ergebnisse"
                }
                else
                {
                    $elementVon = 1;
                    $elementBis = $Page * $PageSize
                    if($Page -gt 1)
                    {
                        $elementvon = ($Page -1)* $PageSize + 1
                    }
                    Write-Host "$($elementvon) - $($elementBis) von $($resultConverted.result.Total) Elementen " -foregroundcolor "green"
                    $resultConvertedData = $resultConverted.result.data
                    Return $resultConvertedData
                }                
            }
            else
            {
                Write-Error "Bei der Abfrage ist was schief gelaufen. Bitte WQL-Abfrage ueberpruefen oder erneut anmelden" 
            }
        }
        catch [System.Net.WebException]{
           [System.Net.HttpWebResponse]$result = [System.Net.HttpWebResponse] $_.Exception.Response
           $httperrorcode  = $result.StatusCode.Value__
           $error.clear()
           Write-Error "Bei der Abfrage ist was schief gelaufen. Bitte WQL-Abfrage ueberpruefen oder erneut anmelden" 
        }
    }    
}

Function ConvertTo-PlainText( [security.securestring]$secure ) {
    $marshal = [Runtime.InteropServices.Marshal]
    $marshal::PtrToStringAuto( $marshal::SecureStringToBSTR($secure) )
}


Function Set-PersonenMapping {
    param(
        [Parameter(Mandatory=$true, HelpMessage = "WeeduUid der Person")]
        [Guid]$PersonUid,
        [Parameter(Mandatory=$true, HelpMessage = "Nummer des AbacusMandanten")]
        [int]$MandantenNummer,
        [Parameter(Mandatory=$false)]
        [string]$KundenNummer,
        [Parameter(Mandatory=$false)]
        [string]$AdressNummer,
        [Parameter(Mandatory=$false)]
        [string]$ADLoginName
    )
    process{
        try{    
            if(!$script:sessionVar)
            {
                Write-Error $script:loginMsg
                break
            }
            if([string]::IsnullOrEmpty($KundenNummer) -And [string]::IsnullOrEmpty($AdressNummer) -And [string]::IsnullOrEmpty($ADLoginName))
            {
                Write-Error "KundenNummer/AdressNummer/AdLoginName, mindestens ein Parameter ist erforderlich."
                break
            }            

            $Headers = @{
                Accept = "application/json, text/javascript, */*"
                "Content-Type" = "application/json; charset=UTF-8"
            }
            
            $Body = New-Object PSObject
            if(-Not [string]::IsnullOrEmpty($ADLoginName))
            {
                ($Body | Add-Member NoteProperty ADUserLogonName $($ADLoginName))
            }
            if(-Not [string]::IsnullOrEmpty($AdressNummer))
            {
                ($Body | Add-Member NoteProperty AbacusAdressnummer $($AdressNummer))
            }            
            if(-Not [string]::IsnullOrEmpty($KundenNummer))
            {
                ($Body | Add-Member NoteProperty AbacusKundennummer $($KundenNummer))
            }            
            $Body = $Body | ConvertTo-JSON

            $query = "{0}/rest/Personen/{1}/AbacusMandanten/{2}" -f "$($script:hostUrl)", [uri]::EscapeDataString($PersonUid), [uri]::EscapeDataString($MandantenNummer) 
            $result = Invoke-WebRequest  -Uri "$($query)" -Method Put -Headers $Headers -WebSession $script:sessionVar -Body $Body

            if($result.StatusCode -eq 200)
            {
                Write-Host "ok"
            }
            else
            {
                Write-Error "Fehler beim Update des PersonenMapping {0}.", $result.Statuscode
            }
        }
        catch [System.Net.WebException]{        
            Write-Error "$($script:hostUrl): $($_.Exception.Message)"
            [System.Net.HttpWebResponse]$result = [System.Net.HttpWebResponse] $_.Exception.Response
            $httperrorcode  = $result.StatusCode.Value__
            $error.clear()
        }
    }    
}


Export-ModuleMember -function Connect-Weedu
Export-ModuleMember -function Invoke-WqlQuery
Export-ModuleMember -function Set-PersonenMapping