PersonenImport.psm1


$script:Uid;
$script:PersonUid;


function Invoke-PersonenImport {
param (
    [Parameter(Mandatory, HelpMessage = "Liste der zu importierenden Parametern")]
    $parameterObject
)
process {
    $KomMittelTypes = @("festnetznummer", "mobilenummer", "faxnummer","emailadresse", "wwwadresse", "postadresse");

    $row = @{};
    $parameterObject.psobject.properties | Foreach { $row[$_.Name] = $_.Value };

     $Person = [PSCustomObject]@{};    
    $KomMittelListe = @{};
    $AnmeldungListe = @{};
    $TagListe = @{};

    $Id = $row["Id"];
    $Gruppe = $row["Sicherheitsgruppe"];

    if ($Id -eq $null -or $Gruppe -eq $null) {
        Write-Error "Sicherheitsgruppe und Id sind erforderlich";
        return;
    }

    $script:Uid = "!$Gruppe!$Id";
    $script:PersonUid = "!Person!$Gruppe!$Id";
    $Sicherheitseinstellung = New-Sicherheitseinstellung-Object $Gruppe;

    foreach ($key in $row.keys) {
        $elements = $key.Split('_');
        if ($elements.Count -gt 1) {
            $name = $elements[2];
            $type = $elements[0] + "_" + $elements[1];
        }

        if ($elements.Count -eq 1) {
            $Person | Add-Member -MemberType NoteProperty -Name $key -Value $row[$key];
        }
        elseif ($KomMittelTypes.Contains($elements[0].ToLower())) {
            if (-not $KomMittelListe[$type]) {
                $KomMittelListe[$type] =  [PSCustomObject]@{};
            }
            $KomMittelListe[$type] | Add-Member -MemberType NoteProperty -Name $name -Value $row[$key];
        }
        elseif ($elements[0] -eq "anmeldung") {
            if (-not $AnmeldungListe[$type]) {
                $AnmeldungListe[$type] =  [PSCustomObject]@{};
            }
            $AnmeldungListe[$type] | Add-Member -MemberType NoteProperty -Name $name -Value $row[$key];
        }
        elseif ($elements[0] -eq "tag") {
            $tagName = Get-TagTyp3Bereinigung($row[$key]);
            if ($tagName) {
                $tagName = $Gruppe +"/" +$tagName;

                if (-not $TagListe[$type]) {
                    $TagListe[$type] =  [PSCustomObject]@{};
                }
                $TagListe[$type] | Add-Member -MemberType NoteProperty -Name $name -Value $tagName;
            }
        }
        else {
            Write-Warning "Parameter '$key' ist unbekannt.";
        }
    }

    Invoke-ImportPerson -Person $Person -KomMittelListe $KomMittelListe -TagListe $TagListe -Sicherheitseinstellung $Sicherheitseinstellung;
    Invoke-ImportAnmeldungen -AnmeldungListe $AnmeldungListe;
  }
}

function Invoke-ImportPerson {
param (
    [Parameter(Mandatory)]
    $Person, 
    $TagListe, 
    [Parameter(Mandatory)]
    $KomMittelListe, 
    [Parameter(Mandatory)]
    $Sicherheitseinstellung
)
process {
    try {
        $kmListe = @();
        $AddTagsListe = @();
        Write-Information "`nImportiere Person: $($Person.Vorname) $($Person.Name)" -InformationAction Continue 
        Write-Information "====================" -InformationAction Continue

        if ($PSBoundParameters.ContainsKey("TagListe")) {
            foreach ($item in $TagListe.GetEnumerator()) {
                $params = $item.Value;
                $AddTagsListe += $params.name;
            }
        }

        foreach ($key in $KomMittelListe.keys) {
            $params = $KomMittelListe[$key];

            $KmType = $key.Split('_');
            if ($params.Notfall) {
                $Notfall = $params.Notfall;
            }
            else {
                $Notfall = $false;
            }
            if ($params.Wohnsitz) {
                $Wohnsitz = $params.Wohnsitz;
            }
            else {
                $Wohnsitz = $false;
            }
            if ($params.Kategorie) {
                $Kategorie = $params.Kategorie;
            }
            else {
                $Kategorie = "Privat";
            }

            if (($KmType[0] -eq "festnetznummer" -or $KmType[0] -eq "mobilenummer" -or $KmType[0] -eq "faxnummer") -and $params.nummer) {
                $kmListe += New-Kommunikationsmittel-Object -Type $KmType[0] -Kategorie $params.kategorie -GueltigAb $params.GueltigAb -GueltigBis $params.GueltigBis -Bemerkungen $params.Bemerkungen -Notfall $Notfall -Wohnsitz $Wohnsitz -Nummer $params.nummer;            
            }
            elseif ($KmType[0] -eq "emailadresse" -and $params.adresse) {
                $kmListe += New-Kommunikationsmittel-Object -Type "EMailAdresse" -Kategorie $params.kategorie -GueltigAb $params.GueltigAb -GueltigBis $params.GueltigBis -Bemerkungen $params.Bemerkungen -Notfall $Notfall -Wohnsitz $Wohnsitz -Adresse $params.adresse;
            }
            elseif ($KmType[0] -eq "wwwadresse" -and $params.Url) {
                $kmListe += New-Kommunikationsmittel-Object -Type "WwwAdresse" -Kategorie $params.kategorie -GueltigAb $params.GueltigAb -GueltigBis $params.GueltigBis -Bemerkungen $params.Bemerkungen -Notfall $Notfall -Wohnsitz $Wohnsitz -Url $params.UrlUrl;
            }
            elseif ($KmType[0] -eq "postadresse") {
                if ($params.Land) {
                    if ($params.Land -ne "CH" -and $params.Land -ne "LI" -and $params.Land -ne "DE") {
                        if(($params.Adresse1 -ne $null -and $params.Adresse1 -ne '') -or 
                        ($params.Adresse2 -ne $null -and $params.Adresse2 -ne '')  -or 
                        ($params.Adresse3 -ne $null -and $params.Adresse3 -ne '')){                        
                             $kmListe +=  New-PostAdresse-Object -Kategorie $Kategorie -GueltigAb $params.GueltigAb -GueltigBis $params.GueltigBis -Bemerkungen $params.Bemerkungen -Notfall $Notfall -Wohnsitz $Wohnsitz -Land $params.Land -Zusatzzeile1 $params.Zusatzzeile1 -Zusatzzeile2 $params.Zusatzzeile2 -Adresse1 $params.Adresse1 -Adresse2 $params.Adresse2 -Adresse3 $params.Adresse3;
                        }
                        else{
                             $kmListe +=  New-PostAdresse-Object -Kategorie $Kategorie -GueltigAb $params.GueltigAb -GueltigBis $params.GueltigBis -Bemerkungen $params.Bemerkungen -Notfall $Notfall -Wohnsitz $Wohnsitz -Land $params.Land -Zusatzzeile1 $params.Zusatzzeile1 -Zusatzzeile2 $params.Zusatzzeile2 -Strasse $params.Strasse -Hausnummer $params.Hausnummer -Postfach $params.Postfach -PLZ $params.PLZ -Ort $params.Ort;
                        }

                    }
                    else {
                        $kmListe +=  New-PostAdresse-Object -Kategorie $Kategorie -GueltigAb $params.GueltigAb -GueltigBis $params.GueltigBis -Bemerkungen $params.Bemerkungen -Notfall $Notfall -Wohnsitz $Wohnsitz -Land $params.Land -Zusatzzeile1 $params.Zusatzzeile1 -Zusatzzeile2 $params.Zusatzzeile2 -Strasse $params.Strasse -Hausnummer $params.Hausnummer -Postfach $params.Postfach -PLZ $params.PLZ -Ort $params.Ort;
                    }
                }
                elseif ($params.Ort -or $params.Strasse) {
                    Write-Error "Für Postadresse $key ist kein Land gesetzt und kann daher nicht importiert werden."
                }
            }
        }

        if (Test-EntityExistsInIndex $script:PersonUid) {
            if ($Person.Type -eq "einzelperson") {
                Set-Einzelperson -PersonUid $script:PersonUid -Vorname $Person.Vorname -Name $Person.Name -Korrespondenzsprache $Person.Korrespondenzsprache -Geschlecht $Person.Geschlecht -Geburtsdatum $Person.Geburtsdatum -Muttersprache $Person.Muttersprache -Sozialversicherungsnummer $Person.Sozialversicherungsnummer -Anredezusatz $Person.Anredezusatz -AkademischerTitel $Person.AkademischerTitel -TitelZusatz $Person.TitelZusatz -Titel2 $Person.Titel2 -Funktion $Person.Funktion -Beruf $Person.Beruf -Branche $Person.Branche -Staatsangehoerigkeit $Person.Staatsangehoerigkeit -Heimatort $Person.Heimatort -Auslaenderkategorie $Person.Auslaenderkategorie -BewilligungBis $Person.BewilligungBis -Geburtsort $Person.Geburtsort -KommunikationsmittelListe $kmListe -AddTagsListe $AddTagsListe;
            }
            elseif ($Person.Type -eq "organisation") {
                Set-Organisation -OrganisationUid $script:PersonUid -Organisationsname $Person.Name -Organisationsform $Person.Organisationsform -Korrespondenzsprache $Person.Korrespondenzsprache -UnternehmensId $Person.UnternehmensId -Branche $Person.Branche -Mitarbeiteranzahl $Person.Mitarbeiteranzahl -KommunikationsmittelListe $kmListe -AddTagsListe $AddTagsListe;
            }
            elseif ($Person.Type -eq "familie") {
                Set-Familie -FamilieUid $script:PersonUid -Familienname $Person.Name -Vornamen $Person.Vorname -Korrespondenzsprache $Person.Korrespondenzsprache -KommunikationsmittelListe $kmListe -AddTagsListe $AddTagsListe;
            }
        }
        else {
            if ($Person.Type -eq "einzelperson") {
                New-Einzelperson -PersonUid $script:PersonUid -Vorname $Person.Vorname -Name $Person.Name -Korrespondenzsprache $Person.Korrespondenzsprache -Geschlecht $Person.Geschlecht -Geburtsdatum $Person.Geburtsdatum -Muttersprache $Person.Muttersprache -Sozialversicherungsnummer $Person.Sozialversicherungsnummer -Anredezusatz $Person.Anredezusatz -AkademischerTitel $Person.AkademischerTitel -TitelZusatz $Person.TitelZusatz -Titel2 $Person.Titel2 -Funktion $Person.Funktion -Beruf $Person.Beruf -Branche $Person.Branche -Staatsangehoerigkeit $Person.Staatsangehoerigkeit -Heimatort $Person.Heimatort -Auslaenderkategorie $Person.Auslaenderkategorie -BewilligungBis $Person.BewilligungBis -Geburtsort $Person.Geburtsort -KommunikationsmittelListe $kmListe -AddTagsListe $AddTagsListe -SicherheitsEinstellung $Sicherheitseinstellung;
            }
            elseif ($Person.Type -eq "organisation") {
                New-Organisation -OrganisationUid $script:PersonUid -Organisationsname $Person.Name -Organisationsform $Person.Organisationsform -Korrespondenzsprache $Person.Korrespondenzsprache -UnternehmensId $Person.UnternehmensId -Branche $Person.Branche -Mitarbeiteranzahl $Person.Mitarbeiteranzahl -KommunikationsmittelListe $kmListe -AddTagsListe $AddTagsListe -SicherheitsEinstellung $Sicherheitseinstellung;
            }
            elseif ($Person.Type -eq "familie") {
                New-Familie -FamilieUid $script:PersonUid -Familienname $Person.Name -Vornamen $Person.Vorname -Korrespondenzsprache $Person.Korrespondenzsprache -KommunikationsmittelListe $kmListe -AddTagsListe $AddTagsListe -SicherheitsEinstellung $Sicherheitseinstellung;
            }
        }
    }
    catch {
        $ErrMsg = $_.Exception.Message;
        if ($_.TargetObject.errors.message) {
            $ErrMsg += ": " + $_.TargetObject.errors.message;
        }
        Write-Error "Invoke-ImportPerson: $ErrMsg";
    }
  }
}

function Invoke-ImportAnmeldungen {
param (
    [Parameter(Mandatory)]
    $AnmeldungListe
)
process {
    try {
        foreach ($item in $AnmeldungListe.GetEnumerator()) {
            $params = $item.Value;
            $AnmeldungUid = "!Anmeldung" + $script:Uid + "!" + $params.Modulversion;

            if ($params.Status) {
                $Status = $params.Status;
            }
            else {
                $Status = "Definitiv";
            }
            if ($params.Vertragspartner) {
                $Vertragspartner = $params.Vertragspartner;
            }
            else {
                $Vertragspartner = $script:PersonUid;
            }

            if ($params.Modulversion) {
                if (Test-EntityExistsInIndex $AnmeldungUid) {
                    Set-Anmeldung -AnmeldungUid $AnmeldungUid -LeistungsempfaengerUid $script:PersonUid -AnlassUid $params.Anlass -ModulversionUid $params.Modulversion -VertragspartnerUid $Vertragspartner -LieferadresseUid $params.Lieferadresse -Bemerkungen $params.Bemerkungen -Status $Status;
                }
                else {
                    Start-Sleep -Seconds 2
                    New-Anmeldung -AnmeldungUid $AnmeldungUid -LeistungsempfaengerUid $script:PersonUid -AnlassUid $params.Anlass -ModulversionUid $params.Modulversion -VertragspartnerUid $Vertragspartner -LieferadresseUid $params.Lieferadresse -Bemerkungen $params.Bemerkungen -Status $Status;
                }
            }
        }
    }
    catch {
        $ErrMsg = $_.Exception.Message;
        if ($_.TargetObject.errors.message) {
            $ErrMsg += ": " + $_.TargetObject.errors.message;
        }
        Write-Error "Invoke-ImportAnmeldungen: $ErrMsg";
    }
  }
}


function Get-TagTyp3Bereinigung ($TagName) {
    if ($TagName -ne $null) {
        $TagName = $TagName.ToLower().Trim();

        $TagName = $TagName -replace "é", "e";
        $TagName = $TagName -replace "è", "e";
        $TagName = $TagName -replace "à", "a";
        $TagName = $TagName -replace "ç", "c";
        $TagName = $TagName -replace "ä", "ae";
        $TagName = $TagName -replace "ö", "oe";
        $TagName = $TagName -replace "ü", "ue";
        $TagName = $TagName -replace "@", "-at-";
        $TagName = $TagName -replace "%", "-prozent-";
        $TagName = $TagName -replace "[\s—/|\\-]+","-";
        $TagName = $TagName -replace "^[^a-z0-9]+|[^a-z0-9-]+|[^a-z0-9]+$","";

        $regex = [regex]("^[a-z0-9][a-z0-9-]*[a-z0-9]$");
        if ($regex.Match($TagName).Success)
        {
            return $TagName;
        }
    }
    return $null;
}


Export-ModuleMember -function Invoke-PersonenImport