Rechnungspositionen.psm1

function New-Rechnungsposition {
    [CmdletBinding(DefaultParameterSetName="KontierungNummern")]
    param(
        $RechnungspositionUid,
        [Parameter(Mandatory, ValueFromPipeline, Position = 0)]
        $RechnungsempfaengerUid,
        [Parameter(Mandatory, ParameterSetName = "KontierungNummern")]
        [int]$Mandantennummer,
        [Parameter(Mandatory, ParameterSetName = "KontierungUid")]
        $PlatzhalterProdukt,
        [Parameter(Mandatory, ParameterSetName = "KontierungNummern")]
        $PlatzhalterProduktNummer,
        [Parameter(Mandatory)]
        $WaehrungsCode,
        $AuftragserfasserUid,
        $LeistungsempfaengerUid,
        $RechnungsadresseUid,
        $VerrechnenAb,
        $VerrechnenAbWennBerechtigt,
        $AusloesenBis,
        $AusloesenBisWennBerechtigt,
        [Parameter(Mandatory)]
        [decimal]$Menge,
        [Parameter(Mandatory)]
        [double]$Stueckpreis,
        [double]$Stueckrabatt,
        [Parameter(Mandatory)]
        [string]$Positionstitel,
        [string]$Positionsbeschreibung,
        $PositionstextListe,
        $RechnungstextHeaderListe,
        $RechnungstextFooterListe,
        $Quellprodukt,
        $MwStCode,
        $Lieferdatum,
        $Gruppierungsmerkmal,
        $DispoDatum,
        $KostentraegerUid,
        $KostentraegerText,
        $LeistungszeitraumVon,
        $LeistungszeitraumBis,
        $HabenKonto,
        $SollKonto,
        $HabenKostenstelle,
        $SollKostenstelle,
        $FibuDatum,
        $EntstandenAus,
        $BeilagenUids,
        $SammelpositionText
    )
    process{
        $Body = New-Object PSCustomObject;
        if ($PSBoundParameters.ContainsKey("RechnungspositionUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Uid" -Value (ConvertTo-WeeduGuid $RechnungspositionUid);
        }
        $Body | Add-Member -MemberType NoteProperty -Name "RechnungsempfaengerUid" -Value (ConvertTo-WeeduGuid $RechnungsempfaengerUid);
        $Body | Add-Member -MemberType NoteProperty -Name "Mandantennummer" -Value $Mandantennummer;
        if ($PSBoundParameters.ContainsKey("PlatzhalterProdukt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "PlatzhalterProdukt" -Value $PlatzhalterProdukt;
        }      
        if ($PSBoundParameters.ContainsKey("PlatzhalterProduktNummer")) {
            $Body | Add-Member -MemberType NoteProperty -Name "PlatzhalterProduktNummer" -Value $PlatzhalterProduktNummer;
        }
        $Body | Add-Member -MemberType NoteProperty -Name "WaehrungsCode" -Value $WaehrungsCode;
        if ($PSBoundParameters.ContainsKey("AuftragserfasserUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "AuftragserfasserUid" -Value (ConvertTo-WeeduGuid $AuftragserfasserUid);
        }
        if ($PSBoundParameters.ContainsKey("LeistungsempfaengerUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "LeistungsempfaengerUid" -Value (ConvertTo-WeeduGuid $LeistungsempfaengerUid);
        }
        if ($PSBoundParameters.ContainsKey("RechnungsadresseUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "RechnungsadresseUid" -Value (ConvertTo-WeeduGuid $RechnungsadresseUid);
        }
        if ($PSBoundParameters.ContainsKey("VerrechnenAb")) {
            $Body | Add-Member -MemberType NoteProperty -Name "VerrechnenAb" -Value $VerrechnenAb;
        }
        if ($PSBoundParameters.ContainsKey("VerrechnenAbWennBerechtigt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "VerrechnenAbWennBerechtigt" -Value $VerrechnenAbWennBerechtigt;
        }
        if ($PSBoundParameters.ContainsKey("AusloesenBis")) {
            $Body | Add-Member -MemberType NoteProperty -Name "AusloesenBis" -Value $AusloesenBis;
        }
        if ($PSBoundParameters.ContainsKey("AusloesenBisWennBerechtigt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "AusloesenBisWennBerechtigt" -Value $AusloesenBisWennBerechtigt;
        }
        $Body | Add-Member -MemberType NoteProperty -Name "Menge" -Value $Menge;
        $Body | Add-Member -MemberType NoteProperty -Name "Stueckpreis" -Value $Stueckpreis;
        if ($PSBoundParameters.ContainsKey("Stueckrabatt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Stueckrabatt" -Value $Stueckrabatt;
        }
        $Body | Add-Member -MemberType NoteProperty -Name "Positionstitel" -Value $Positionstitel;
        if ($PSBoundParameters.ContainsKey("MwStCode")) {
            $Body | Add-Member -MemberType NoteProperty -Name "MwStCode" -Value $MwStCode;
        }
        if ($PSBoundParameters.ContainsKey("Positionsbeschreibung")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Positionsbeschreibung" -Value $Positionsbeschreibung;
        }
        if ($PSBoundParameters.ContainsKey("Lieferdatum")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Lieferdatum" -Value (ConvertTo-WeeduDateString $Lieferdatum);
        }
        if ($PSBoundParameters.ContainsKey("Gruppierungsmerkmal")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Gruppierungsmerkmal" -Value (ConvertTo-WeeduGuid $Gruppierungsmerkmal);
        }
        if ($PSBoundParameters.ContainsKey("DispoDatum")) {
            $Body | Add-Member -MemberType NoteProperty -Name "DispoDatum" -Value (ConvertTo-WeeduDateString $DispoDatum);
        }
        if ($PSBoundParameters.ContainsKey("FibuDatum")) {
            $Body | Add-Member -MemberType NoteProperty -Name "FibuDatum" -Value (ConvertTo-WeeduDateString $FibuDatum);
        }
        if ($PSBoundParameters.ContainsKey("KostentraegerUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "KostentraegerUid" -Value (ConvertTo-WeeduGuid $KostentraegerUid);
        }
        if ($PSBoundParameters.ContainsKey("KostentraegerText")) {
            $Body | Add-Member -MemberType NoteProperty -Name "KostentraegerText" -Value $KostentraegerText;
        }
        if ($PSBoundParameters.ContainsKey("LeistungszeitraumVon")) {
            $Body | Add-Member -MemberType NoteProperty -Name "LeistungszeitraumVon" -Value $LeistungszeitraumVon;
        }
        if ($PSBoundParameters.ContainsKey("LeistungszeitraumBis")) {
            $Body | Add-Member -MemberType NoteProperty -Name "LeistungszeitraumBis" -Value $LeistungszeitraumBis;
        }
        if ($PSBoundParameters.ContainsKey("HabenKonto")) {
            $Body | Add-Member -MemberType NoteProperty -Name "HabenKonto" -Value $HabenKonto;
        }
        if ($PSBoundParameters.ContainsKey("SollKonto")) {
            $Body | Add-Member -MemberType NoteProperty -Name "SollKonto" -Value $SollKonto;
        }
        if ($PSBoundParameters.ContainsKey("HabenKostenstelle")) {
            $Body | Add-Member -MemberType NoteProperty -Name "HabenKostenstelle" -Value $HabenKostenstelle;
        }
        if ($PSBoundParameters.ContainsKey("SollKostenstelle")) {
            $Body | Add-Member -MemberType NoteProperty -Name "SollKostenstelle" -Value $SollKostenstelle;
        }
        if ($PSBoundParameters.ContainsKey("PositionstextListe")) {
            $PositionstextListe = [array](ConvertTo-WeeduPriorityList $PositionstextListe)
            $Body | Add-Member -MemberType NoteProperty -Name "PositionstextListe" -Value $PositionstextListe;
        }
        if ($PSBoundParameters.ContainsKey("RechnungstextHeaderListe")) {
            $RechnungstextHeaderListe = [array](ConvertTo-WeeduPriorityList $RechnungstextHeaderListe)
            $Body | Add-Member -MemberType NoteProperty -Name "RechnungstextHeaderListe" -Value $RechnungstextHeaderListe;
        }
        if ($PSBoundParameters.ContainsKey("RechnungstextFooterListe")) {
            $RechnungstextFooterListe = [array](ConvertTo-WeeduPriorityList $RechnungstextFooterListe)
            $Body | Add-Member -MemberType NoteProperty -Name "RechnungstextFooterListe" -Value $RechnungstextFooterListe;
        }
        if ($PSBoundParameters.ContainsKey("Quellprodukt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Quellprodukt" -Value $Quellprodukt;
        }
        if ($PSBoundParameters.ContainsKey("EntstandenAus")) {
            $Body | Add-Member -MemberType NoteProperty -Name "EntstandenAus" -Value ($EntstandenAus | ForEach-Object { ConvertTo-WeeduGuid $_ });
        }
        if ($PSBoundParameters.ContainsKey("BeilagenUids")) {
            $BeilagenUids = [array]($BeilagenUids | ForEach-Object { ConvertTo-WeeduGuid $_ })
            $Body | Add-Member -MemberType NoteProperty -Name "BeilagenUids" -Value $BeilagenUids;
        }
        if ($PSBoundParameters.ContainsKey("SammelpositionText")) {
            $Body | Add-Member -MemberType NoteProperty -Name "SammelpositionText" -Value $SammelpositionText;
        }

        Invoke-Weedu -Uri "rest/Rechnungspositionen" -Method POST -Body $Body;
    }
}

function Set-Rechnungsposition {
    [CmdletBinding(DefaultParameterSetName = "UID")]
    param(
        [Parameter(Mandatory, ValueFromPipeline, Position = 0)]
        $RechnungspositionUid,
        [Parameter(Mandatory, ParameterSetName = "Nummer")]
        $Mandantennummer,
        [Parameter(ParameterSetName = "UID")]
        $PlatzhalterProdukt,
        [Parameter(Mandatory, ParameterSetName = "Nummer")]
        $PlatzhalterProduktNummer,
        [string]$WaehrungsCode,
        $RechnungsempfaengerUid,
        $AuftragserfasserUid,
        $LeistungsempfaengerUid,
        $RechnungsadresseUid,
        $VerrechnenAb,
        $VerrechnenAbWennBerechtigt,
        $AusloesenBis,
        $AusloesenBisWennBerechtigt,
        [decimal]$Menge,
        [double]$Stueckpreis,
        [double]$Stueckrabatt,
        [string]$Positionstitel,
        [string]$Positionsbeschreibung,
        $PositionstextListe,
        $RechnungstextHeaderListe,
        $RechnungstextFooterListe,
        $Quellprodukt,
        $MwStCode,
        $Lieferdatum,
        $Gruppierungsmerkmal,
        $DispoDatum,
        $KostentraegerUid,
        $KostentraegerText,
        $LeistungszeitraumVon,
        $LeistungszeitraumBis,
        $HabenKonto,
        $SollKonto,
        $HabenKostenstelle,
        $SollKostenstelle,
        $FibuDatum,
        $EntstandenAus,
        $BeilagenUids,
        $SammelpositionText
    )
    process{
        $RechnungspositionUid = ConvertTo-WeeduGuid $RechnungspositionUid;
        $Body = New-Object PSCustomObject;
        Write-Verbose "Rechnungspositionen: $RechnungspositionUid";

        if ($PSBoundParameters.ContainsKey("Mandantennummer")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Mandantennummer" -Value $Mandantennummer;
        }
        if ($PSBoundParameters.ContainsKey("PlatzhalterProdukt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "PlatzhalterProdukt" -Value $PlatzhalterProdukt;
        }
        if ($PSBoundParameters.ContainsKey("PlatzhalterProduktNummer")) {
            $Body | Add-Member -MemberType NoteProperty -Name "PlatzhalterProduktNummer" -Value $PlatzhalterProduktNummer;
        }
        if ($PSBoundParameters.ContainsKey("WaehrungsCode")) {
            $Body | Add-Member -MemberType NoteProperty -Name "WaehrungsCode" -Value $WaehrungsCode;
        }
        if ($PSBoundParameters.ContainsKey("RechnungsempfaengerUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "RechnungsempfaengerUid" -Value (ConvertTo-WeeduGuid $RechnungsempfaengerUid);
        }
        if ($PSBoundParameters.ContainsKey("AuftragserfasserUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "AuftragserfasserUid" -Value (ConvertTo-WeeduGuid $AuftragserfasserUid);
        }
        if ($PSBoundParameters.ContainsKey("LeistungsempfaengerUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "LeistungsempfaengerUid" -Value (ConvertTo-WeeduGuid $LeistungsempfaengerUid);
        }
        if ($PSBoundParameters.ContainsKey("RechnungsadresseUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "RechnungsadresseUid" -Value (ConvertTo-WeeduGuid $RechnungsadresseUid);
        }
        if ($PSBoundParameters.ContainsKey("VerrechnenAb")) {
            $Body | Add-Member -MemberType NoteProperty -Name "VerrechnenAb" -Value $VerrechnenAb;
        }
        if ($PSBoundParameters.ContainsKey("VerrechnenAbWennBerechtigt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "VerrechnenAbWennBerechtigt" -Value $VerrechnenAbWennBerechtigt;
        }
        if ($PSBoundParameters.ContainsKey("AusloesenBis")) {
            $Body | Add-Member -MemberType NoteProperty -Name "AusloesenBis" -Value $AusloesenBis;
        }
        if ($PSBoundParameters.ContainsKey("AusloesenBisWennBerechtigt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "AusloesenBisWennBerechtigt" -Value $AusloesenBisWennBerechtigt;
        }
        if ($PSBoundParameters.ContainsKey("Menge")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Menge" -Value $Menge;
        }
        if ($PSBoundParameters.ContainsKey("Stueckpreis")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Stueckpreis" -Value $Stueckpreis;
        }
        if ($PSBoundParameters.ContainsKey("Stueckrabatt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Stueckrabatt" -Value $Stueckrabatt;
        }
        if ($PSBoundParameters.ContainsKey("Positionstitel")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Positionstitel" -Value $Positionstitel;
        }
        if ($PSBoundParameters.ContainsKey("Positionsbeschreibung")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Positionsbeschreibung" -Value $Positionsbeschreibung;
        }
        if ($PSBoundParameters.ContainsKey("MwStCode")) {
            $Body | Add-Member -MemberType NoteProperty -Name "MwStCode" -Value $MwStCode;
        }
        if ($PSBoundParameters.ContainsKey("Lieferdatum")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Lieferdatum" -Value (ConvertTo-WeeduDateString $Lieferdatum);
        }
        if ($PSBoundParameters.ContainsKey("Gruppierungsmerkmal")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Gruppierungsmerkmal" -Value (ConvertTo-WeeduGuid $Gruppierungsmerkmal);
        }
        if ($PSBoundParameters.ContainsKey("DispoDatum")) {
            $Body | Add-Member -MemberType NoteProperty -Name "DispoDatum" -Value (ConvertTo-WeeduDateString $DispoDatum);
        }
        if ($PSBoundParameters.ContainsKey("FibuDatum")) {
            $Body | Add-Member -MemberType NoteProperty -Name "FibuDatum" -Value (ConvertTo-WeeduDateString $FibuDatum);
        }
        if ($PSBoundParameters.ContainsKey("KostentraegerUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "KostentraegerUid" -Value (ConvertTo-WeeduGuid $KostentraegerUid);
        }
        if ($PSBoundParameters.ContainsKey("KostentraegerText")) {
            $Body | Add-Member -MemberType NoteProperty -Name "KostentraegerText" -Value $KostentraegerText;
        }
        if ($PSBoundParameters.ContainsKey("LeistungszeitraumVon")) {
            $Body | Add-Member -MemberType NoteProperty -Name "LeistungszeitraumVon" -Value $LeistungszeitraumVon;
        }
        if ($PSBoundParameters.ContainsKey("LeistungszeitraumBis")) {
            $Body | Add-Member -MemberType NoteProperty -Name "LeistungszeitraumBis" -Value $LeistungszeitraumBis;
        }
        if ($PSBoundParameters.ContainsKey("HabenKonto")) {
            $Body | Add-Member -MemberType NoteProperty -Name "HabenKonto" -Value $HabenKonto;
        }
        if ($PSBoundParameters.ContainsKey("SollKonto")) {
            $Body | Add-Member -MemberType NoteProperty -Name "SollKonto" -Value $SollKonto;
        }
        if ($PSBoundParameters.ContainsKey("HabenKostenstelle")) {
            $Body | Add-Member -MemberType NoteProperty -Name "HabenKostenstelle" -Value $HabenKostenstelle;
        }
        if ($PSBoundParameters.ContainsKey("SollKostenstelle")) {
            $Body | Add-Member -MemberType NoteProperty -Name "SollKostenstelle" -Value $SollKostenstelle;
        }
        if ($PSBoundParameters.ContainsKey("PositionstextListe")) {
            $PositionstextListe = [array](ConvertTo-WeeduPriorityList $PositionstextListe)
            $Body | Add-Member -MemberType NoteProperty -Name "PositionstextListe" -Value $PositionstextListe;
        }
        if ($PSBoundParameters.ContainsKey("RechnungstextHeaderListe")) {
            $RechnungstextHeaderListe = [array](ConvertTo-WeeduPriorityList $RechnungstextHeaderListe)
            $Body | Add-Member -MemberType NoteProperty -Name "RechnungstextHeaderListe" -Value $RechnungstextHeaderListe;
        }
        if ($PSBoundParameters.ContainsKey("RechnungstextFooterListe")) {
            $RechnungstextFooterListe = [array](ConvertTo-WeeduPriorityList $RechnungstextFooterListe)
            $Body | Add-Member -MemberType NoteProperty -Name "RechnungstextFooterListe" -Value $RechnungstextFooterListe;
        }
        if ($PSBoundParameters.ContainsKey("Quellprodukt")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Quellprodukt" -Value $Quellprodukt;
        }
        if ($PSBoundParameters.ContainsKey("EntstandenAus")) {
            $Body | Add-Member -MemberType NoteProperty -Name "EntstandenAus" -Value ($EntstandenAus | ForEach-Object { ConvertTo-WeeduGuid $_ });
        }
        if ($PSBoundParameters.ContainsKey("BeilagenUids")) {
            $BeilagenUids = [array]($BeilagenUids | ForEach-Object { ConvertTo-WeeduGuid $_ })
            $Body | Add-Member -MemberType NoteProperty -Name "BeilagenUids" -Value $BeilagenUids;
        }
        if ($PSBoundParameters.ContainsKey("SammelpositionText")) {
            $Body | Add-Member -MemberType NoteProperty -Name "SammelpositionText" -Value $SammelpositionText;
        }

        Invoke-Weedu -Uri "rest/Rechnungspositionen?uids={0}" -UriParams @($RechnungspositionUid) -Method PUT -Body $Body;
    }
}

function Remove-Rechnungsposition {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline, Position = 0)]
        $RechnungspositionUid
    )
    process {
        $Body = New-Object PSCustomObject;

        Invoke-Weedu -Uri "rest/Rechnungspositionen/{0}" -UriParams @(ConvertTo-WeeduGuid $RechnungspositionUid) -Method DELETE;
    }   
}

function Copy-Rechnungsposition {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, HelpMessage = "Uid der zu kopierenden Rechnungsposition")]
        $RechnungspositionUid,
        [Parameter(HelpMessage = "GUID, welche die Rechnungsposition referenziert (synthetische oder echte)")]
        $NewRechnungspositionUid,
        [Parameter(HelpMessage = "Wenn true so wird die Menge der zu kopierenden Rechnungsposition umgekehrt, d.h. sie wird mit dem Faktor (-1) multipliziert")]
        [bool]$MengeUmkehren,    
        [Parameter(HelpMessage = "Ab diesem Datum wird die Rechnungsposition für die Verrechnung berücksichtigt. Im UTC Format, z.B. 2017-10-14T08:35:45Z")]        
        $VerrechnenAb,
        [Parameter(HelpMessage = "An diesem Datum wird die Verrechnung der Rechnungposition spätestens ausgelöst. Im UTC Format, z.B. 2017-10-15T08:35:45Z")]
        $AusloesenBis,
        [Parameter(HelpMessage = "Zusätzliche Informationen zur Position. Text wird als kleiner Abschnitt unterhalb der Bezeichnung ausgegeben.")]
        [string]$ZusaetzlicherText
    )
    process{
        $Body = New-Object PSCustomObject;
        
        if ($PSBoundParameters.ContainsKey("NewRechnungspositionUid")) {
            $Body | Add-Member -MemberType NoteProperty -Name "Uid" -Value ConvertTo-WeeduGuid $NewRechnungspositionUid;
        }
        if ($PSBoundParameters.ContainsKey("VerrechnenAb")) {
            $Body | Add-Member -MemberType NoteProperty -Name "VerrechnenAb" -Value $VerrechnenAb;
        }
        if ($PSBoundParameters.ContainsKey("AusloesenBis")) {
            $Body | Add-Member -MemberType NoteProperty -Name "AusloesenBis" -Value $AusloesenBis;
        }
        if ($PSBoundParameters.ContainsKey("MengeUmkehren")) {
            $Body | Add-Member -MemberType NoteProperty -Name "MengeUmkehren" -Value $MengeUmkehren;
        }
        if ($PSBoundParameters.ContainsKey("ZusaetzlicherText")) {
            $Body | Add-Member -MemberType NoteProperty -Name "ZusaetzlicherText" -Value $ZusaetzlicherText;
        }

        Invoke-Weedu -Uri "rest/Rechnungspositionen/{0}/kopieren" -UriParams @(ConvertTo-WeeduGuid $RechnungspositionUid) -Method POST -Body $Body;
    }
}

Export-ModuleMember -function New-Rechnungsposition
Export-ModuleMember -function Set-Rechnungsposition
Export-ModuleMember -function Copy-Rechnungsposition
Export-ModuleMember -function Remove-Rechnungsposition