Imports System.Data.SqlClient
Imports System.Reflection
Imports System.Windows.Forms
Imports com.sun.org.apache.xpath.internal.operations
Imports com.sun.source.tree
'Imports DocumentFormat.OpenXml.Drawing.Charts
'Imports DocumentFormat.OpenXml.Spreadsheet

Public Class cRechnungsausgangLIST



End Class
Public Class cRechnungsausgang

    Property RK_ID As Integer
    Property FilialenNr As Integer
    Property AbfertigungsNr As Integer
    Property UnterNr As Integer = -1
    Property Abfertigungsdatum As Date
    Property RechnungsNr As Object = Nothing
    Property RechnungsDatum As Object = Nothing
    Property Sammelrechnung As Integer
    Property BelegartenNr As Integer = 70 'Nothing
    Property BelegartenKz As String = ""
    Property BelegartenBez As String = ""
    Property Vorzeichen As String = ""
    Property BelegNr As Object = Nothing
    Property AbsenderLandKz As Object = Nothing
    Property AbsenderKundenNr As Object = Nothing
    Property AbsenderName_1 As Object = Nothing '!!!!
    Property AbsenderName_2 As Object = Nothing '!!!!
    Property AbsenderStraße As Object = Nothing
    Property AbsenderOrt As Object = Nothing
    Property AbsenderOffertenNr As Object = Nothing
    Property EmpfängerLandKz As Object = Nothing
    Property EmpfängerKundenNr As Object = Nothing
    Property EmpfängerName_1 As Object = Nothing '!!!!
    Property EmpfängerName_2 As Object = Nothing '!!!!
    Property EmpfängerStraße As Object = Nothing
    Property EmpfängerOrt As Object = Nothing
    Property EmpfängerOffertenNr As Object = Nothing
    Property VermittlerLandKz As Object = Nothing
    Property VermittlerKundenNr As Object = Nothing
    Property VermittlerName_1 As Object = Nothing '!!!!
    Property VermittlerName_2 As Object = Nothing '!!!!
    Property VermittlerStraße As Object = Nothing
    Property VermittlerOrt As Object = Nothing
    Property VermittlerOffertenNr As Object = Nothing
    Property Rechnung_an As Integer
    Property KundenNrZentrale As Object = Nothing
    Property RechnungsLandKz As Object = Nothing
    Property RechnungsKundenNr As Integer
    Property RechnungsName_1 As Object = Nothing '!!!!
    Property RechnungsName_2 As Object = Nothing '!!!!
    Property RechnungsName_AdressZusatz As String = ""
    Property RechnungsStraße As Object = Nothing
    Property RechnungsOrt As Object = Nothing
    Property RechnungsUstIdKz As Object = Nothing
    Property RechnungsUstIdNr As Object = Nothing
    Property RechnungsUstIdGeprüft As Object = Nothing 'Date = CDate("01.01.2000")
    Property Lastschrift As Boolean = False
    Property Kunden_SVS As Boolean = False
    Property Steuerschlüssel As Integer
    Property Steuersatz_Proz As Double
    Property LKW_Kennzeichen As Object = Nothing '!!!!
    Property WährungsNr As Object = Nothing
    Property Wert As Object = Nothing
    Property Umrechnungskurs As Object = Nothing
    Property Packstücke_und_Warenbezeichnung As Object = Nothing '!!!!
    Property Vermerk As Object = Nothing
    Property Anlage_1 As Object = Nothing '!!!!
    Property Anlage_2 As Object = Nothing '!!!!
    Property Anlage_3 As Object = Nothing '!!!!
    Property Anlage_4 As Object = Nothing '!!!!
    Property Anlage_5 As Object = Nothing '!!!!
    Property Anlage_6 As Object = Nothing '!!!!
    Property OffertenNr As Object = Nothing
    Property Vorlageprovision_Proz As Object = Nothing '!!!!%
    Property Kreditaufwendungen_Proz As Object = Nothing '!!!!%
    Property Besonderheiten As Object = Nothing
    Property Vorkasse As Boolean = False
    Property Text As Object = Nothing
    Property SteuerpflichtigerGesamtbetrag As Decimal = 0
    Property SteuerfreierGesamtbetrag As Decimal = 0
    Property Status As Integer = 0
    Property DruckDatumZeit As Object = Nothing
    Property Abfertigungskosten As Object = Nothing
    Property Vorkosten As Object = Nothing
    Property Erlös As Object = Nothing
    Property Buchungsjahr As Object = Nothing
    Property Währungscode As Object = "EUR"
    Property Sachbearbeiter As Object = Nothing
    Property Trdin As Boolean = False
    Property KartenNr As Object = Nothing
    Property RefFilialenNr As Object = Nothing
    Property RefAbfertigungsNr As Object = Nothing
    Property RefUnterNr As Object = Nothing
    Property Notiz As Object = Nothing
    Property Zucker_MRN_Nr As Object = Nothing
    Property Zucker_MRN_Datum As Object = Nothing
    Property Zucker_Aufschub As Object = Nothing
    Property ReErfZeitstempel As Object = Nothing
    Property Nettozahlungsziel As Object = Nothing
    Property Firma_ID As Integer = 0
    Property SpeditionsbuchUnterNr As Object = Nothing
    Property ErfassungsNr As Object = Nothing
    'Property upsize_ts As Object = Nothing
    Property AvisiererKundenNr As Object = Nothing
    Property Avisierer As Object = Nothing
    Property EMailRechnungstext As Object = Nothing
    Property AvisoID As Object = Nothing
    Property KdAuftragsNr As Object = Nothing
    Property Handling As Object = Nothing
    Property VorschauID As Object = Nothing
    Property Grenze As Object = Nothing
    Property RechnungSprache As Object = Nothing
    Property FakturierungsGruppe As String = ""
    Property TextZZ As Object = Nothing
    Property ForceSteuerschlüssel As Object = Nothing
    Property Automailversand As Boolean = False
    Property Rechnungsart As String = "RG" ' RG=Rechnung; RU=Rechnung Unvollständig; RK=RechnungKopf -> bei unvollständiger Rechnung ein Kopf benötigt (zB Staffelabrechnung)
    Property Vorlageprovision_Mindestbetrag As Object = Nothing
    Property Automailversand_sent As Object = Nothing

    Property dsId As Object = Nothing


    ' FROM [VERAG as object=nothing.[dbo as object=nothing.[Rechnungsausgang as object=nothing

    Public POSITIONEN As New List(Of cRechnungsausgangPositionen)
    Public ANHAENGE As New List(Of cRechnungsausgangAnhaenge)

    Shared SQL As New SQL

    Sub New()
    End Sub

    Sub New(RK_ID)
        Me.RK_ID = RK_ID
        LOAD() : LOAD_POSITIONEN() : LOAD_ANHAENGE()
    End Sub

    Sub New(FilialenNr, AbfertigungsNr)
        Me.FilialenNr = FilialenNr
        Me.AbfertigungsNr = AbfertigungsNr
        LOAD(FilialenNr, AbfertigungsNr)
    End Sub



    Public Function getMaxRGUnterNr() As Integer
        Return getMaxRGUnterNr(FilialenNr, AbfertigungsNr, SpeditionsbuchUnterNr)
    End Function

    Public Function checkAlreadyPrinted() As Integer
        'Rechnung wurde bereits gedruck - evtl. bei überschneidenden Rechnungslauf --> Druck abbrechen!
        If Me.RK_ID <= 0 Then Return False
        Dim cnt = SQL.getValueTxtBySql("SELECT COUNT(*)  FROM [Rechnungsausgang] WHERE RK_ID='" & Me.RK_ID & "' and DruckDatumZeit is not null", "FMZOLL")
        Return cnt > 0
    End Function

    Public Function checkRechnungsNrIsSet() As Boolean
        'Prüfugn ob Eintrag mit dieser Rechnungsnr in DB existiert
        If Me.RechnungsNr <= 0 Then Return False
        Dim cnt = SQL.getValueTxtBySql("SELECT COUNT(*) FROM [Rechnungsausgang] WHERE RechnungsNr='" & Me.RechnungsNr & "' and DruckDatumZeit is not null and Buchungsjahr = " & Me.Buchungsjahr & " and Firma_ID = '" & Me.Firma_ID & "'", "FMZOLL")
        Return cnt > 0
    End Function

    Public Shared Function getMaxRGUnterNr(FilialenNr As Integer, AbfertigungsNr As Integer, SpeditionsbuchUnterNr As Integer) As Integer
        ' Dim Nr = SQL.getValueTxtBySql("Select isnull([UnterNr], -1) + 1  FROM [Rechnungsausgang]  where [FilialenNr]='" & FilialenNr & "' And AbfertigungsNr='" & AbfertigungsNr & "' And SpeditionsbuchUnterNr='" & SpeditionsbuchUnterNr & "'  ORDER BY [UnterNr] desc", "FMZOLL")
        Dim Nr = SQL.getValueTxtBySql("Select TOP 1 isnull([UnterNr], -1) + 1  FROM [Rechnungsausgang]  where [FilialenNr]='" & FilialenNr & "' And AbfertigungsNr='" & AbfertigungsNr & "'   ORDER BY [UnterNr] desc", "FMZOLL")
        Return If(IsNumeric(Nr), Nr, 0)
    End Function


    Public Shared Function GET_LIST_WEB(KundenNr As Integer, von As Date, bis As Date, Optional RechnungsNr As Integer = -1, Optional Absender As String = "", Optional Empfänger As String = "", Optional LKW_Kennzeichen As String = "", Optional KdAuftragsNr As String = "") As List(Of cRechnungsausgang)
        Dim LIST As New List(Of cRechnungsausgang)
        Try
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()

                Dim sqlWHERE = ""
                If RechnungsNr > 0 Then sqlWHERE &= " AND RechnungsNr LIKE @RechnungsNr"
                If Absender <> "" Then sqlWHERE &= " AND Absender LIKE @Absender"
                If Empfänger <> "" Then sqlWHERE &= " AND Empfänger LIKE @Empfänger"
                If LKW_Kennzeichen <> "" Then sqlWHERE &= " AND [LKW Kennzeichen] LIKE @LKW_Kennzeichen"
                If KdAuftragsNr <> "" Then sqlWHERE &= " AND KdAuftragsNr LIKE @KdAuftragsNr"


                Using cmd As New SqlCommand("SELECT *  FROM [Rechnungsausgang] WHERE RechnungsKundenNr=@RechnungsKundenNr and RechnungsDatum BETWEEN @RechnungsDatumVON and @RechnungsDatumBIS ORDER BY RechnungsNr ", conn)
                    cmd.Parameters.AddWithValue("@RechnungsKundenNr", KundenNr)
                    cmd.Parameters.AddWithValue("@RechnungsDatumVON", von)
                    cmd.Parameters.AddWithValue("@RechnungsDatumBIS", bis)
                    cmd.Parameters.AddWithValue("@Absender", Absender & "%")
                    cmd.Parameters.AddWithValue("@Empfänger", Empfänger & "%")
                    cmd.Parameters.AddWithValue("@LKW_Kennzeichen", "%" & LKW_Kennzeichen & "%")
                    cmd.Parameters.AddWithValue("@KdAuftragsNr", "%" & KdAuftragsNr & "%")

                    Dim dr = cmd.ExecuteReader()
                    While dr.Read
                        Dim RG As New cRechnungsausgang
                        For Each li In RG.getParameterList()
                            Dim propInfo As PropertyInfo = RG.GetType.GetProperty(li.Scalarvariable)

                            If dr.Item(li.Text) Is DBNull.Value Then
                                propInfo.SetValue(RG, Nothing)
                            Else
                                propInfo.SetValue(RG, dr.Item(li.Text))
                            End If

                        Next
                        RG.doVorzeichen()
                        LIST.Add(RG)
                        '  If loadPos Then LOAD_POSITIONEN()
                    End While
                    dr.Close()
                End Using
            End Using
        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return LIST
    End Function

    Public Shared Function GET_LIST_WEB_SR(RK_ID As Integer) As List(Of cRechnungsausgang)
        Dim LIST As New List(Of cRechnungsausgang)
        Try
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()


                Using cmd As New SqlCommand("SELECT *  FROM [Rechnungsausgang] WHERE RK_ID=@RK_ID   ", conn)
                    cmd.Parameters.AddWithValue("@RK_ID", RK_ID)

                    Dim dr = cmd.ExecuteReader()
                    While dr.Read
                        Dim RG As New cRechnungsausgang
                        For Each li In RG.getParameterList()
                            Dim propInfo As PropertyInfo = RG.GetType.GetProperty(li.Scalarvariable)

                            If dr.Item(li.Text) Is DBNull.Value Then
                                propInfo.SetValue(RG, Nothing)
                            Else
                                propInfo.SetValue(RG, dr.Item(li.Text))
                            End If

                        Next
                        RG.doVorzeichen()
                        LIST.Add(RG)
                        '  If loadPos Then LOAD_POSITIONEN()
                    End While
                    dr.Close()
                End Using
            End Using
        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return LIST
    End Function


    Public Function getParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
        Dim list As New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RK_ID", RK_ID, , True, True))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("FilialenNr", FilialenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AbfertigungsNr", AbfertigungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("UnterNr", UnterNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Abfertigungsdatum", Abfertigungsdatum))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsNr", RechnungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsDatum", RechnungsDatum))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Sammelrechnung", Sammelrechnung))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BelegartenNr", BelegartenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BelegartenKz", BelegartenKz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BelegartenBez", BelegartenBez))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Vorzeichen", Vorzeichen))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BelegNr", BelegNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AbsenderLandKz", AbsenderLandKz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AbsenderKundenNr", AbsenderKundenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AbsenderName 1", AbsenderName_1, "AbsenderName_1")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AbsenderName 2", AbsenderName_2, "AbsenderName_2")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AbsenderStraße", AbsenderStraße))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AbsenderOrt", AbsenderOrt))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AbsenderOffertenNr", AbsenderOffertenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmpfängerLandKz", EmpfängerLandKz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmpfängerKundenNr", EmpfängerKundenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmpfängerName 1", EmpfängerName_1, "EmpfängerName_1")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmpfängerName 2", EmpfängerName_2, "EmpfängerName_2")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmpfängerStraße", EmpfängerStraße))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmpfängerOrt", EmpfängerOrt))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmpfängerOffertenNr", EmpfängerOffertenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("VermittlerLandKz", VermittlerLandKz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("VermittlerKundenNr", VermittlerKundenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("VermittlerName 1", VermittlerName_1, "VermittlerName_1")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("VermittlerName 2", VermittlerName_2, "VermittlerName_2")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("VermittlerStraße", VermittlerStraße))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("VermittlerOrt", VermittlerOrt))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("VermittlerOffertenNr", VermittlerOffertenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Rechnung an", Rechnung_an, "Rechnung_an")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KundenNrZentrale", KundenNrZentrale))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsLandKz", RechnungsLandKz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsKundenNr", RechnungsKundenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsName 1", RechnungsName_1, "RechnungsName_1")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsName 2", RechnungsName_2, "RechnungsName_2")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsName_AdressZusatz", RechnungsName_AdressZusatz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsStraße", RechnungsStraße))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsOrt", RechnungsOrt))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsUstIdKz", RechnungsUstIdKz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsUstIdNr", RechnungsUstIdNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsUstIdGeprüft", RechnungsUstIdGeprüft))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Lastschrift", Lastschrift))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Kunden-SVS", Kunden_SVS, "Kunden_SVS")) '!!!!-
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Steuerschlüssel", Steuerschlüssel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Steuersatz %", Steuersatz_Proz, "Steuersatz_Proz") With {.DbType = SqlDbType.Real}) '!!!! %
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("LKW Kennzeichen", LKW_Kennzeichen, "LKW_Kennzeichen")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("WährungsNr", WährungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Wert", Wert))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Umrechnungskurs", Umrechnungskurs))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Packstücke und Warenbezeichnung", Packstücke_und_Warenbezeichnung, "Packstücke_und_Warenbezeichnung")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Vermerk", Vermerk))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Anlage 1", Anlage_1, "Anlage_1")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Anlage 2", Anlage_2, "Anlage_2")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Anlage 3", Anlage_3, "Anlage_3")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Anlage 4", Anlage_4, "Anlage_4")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Anlage 5", Anlage_5, "Anlage_5")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Anlage 6", Anlage_6, "Anlage_6")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("OffertenNr", OffertenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Vorlageprovision %", Vorlageprovision_Proz, "Vorlageprovision_Proz") With {.DbType = SqlDbType.Real}) '!!!!%
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Kreditaufwendungen %", Kreditaufwendungen_Proz, "Kreditaufwendungen_Proz") With {.DbType = SqlDbType.Real}) '!!!!%
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Besonderheiten", Besonderheiten))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Vorkasse", Vorkasse))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Text", Text))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerpflichtigerGesamtbetrag", SteuerpflichtigerGesamtbetrag))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerfreierGesamtbetrag", SteuerfreierGesamtbetrag))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Status", Status))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("DruckDatumZeit", DruckDatumZeit))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Abfertigungskosten", Abfertigungskosten))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Vorkosten", Vorkosten))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Erlös", Erlös))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Buchungsjahr", Buchungsjahr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Währungscode", Währungscode))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Sachbearbeiter", Sachbearbeiter))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Trdin", Trdin))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KartenNr", KartenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RefFilialenNr", RefFilialenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RefAbfertigungsNr", RefAbfertigungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RefUnterNr", RefUnterNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Notiz", Notiz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Zucker_MRN_Nr", Zucker_MRN_Nr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Zucker_MRN_Datum", Zucker_MRN_Datum))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Zucker_Aufschub", Zucker_Aufschub))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("ReErfZeitstempel", ReErfZeitstempel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Nettozahlungsziel", Nettozahlungsziel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Firma_ID", Firma_ID))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SpeditionsbuchUnterNr", SpeditionsbuchUnterNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("ErfassungsNr", ErfassungsNr))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AvisiererKundenNr", AvisiererKundenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Avisierer", Avisierer))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EMailRechnungstext", EMailRechnungstext))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AvisoID", AvisoID))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KdAuftragsNr", KdAuftragsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Handling", Handling))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("VorschauID", VorschauID))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Grenze", Grenze))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungSprache", RechnungSprache))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("FakturierungsGruppe", FakturierungsGruppe))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("TextZZ", TextZZ))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("ForceSteuerschlüssel", ForceSteuerschlüssel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Automailversand", Automailversand))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Rechnungsart", Rechnungsart))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Vorlageprovision_Mindestbetrag", Vorlageprovision_Mindestbetrag))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("dsId", dsId))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Automailversand_sent", Automailversand_sent))

        Return list
    End Function



    Public Sub LOAD(FilialeNr As Integer, AbfertigungsNr As Integer, Optional loadPos As Boolean = True)
        Try
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("SELECT * FROM Rechnungsausgang WHERE FilialenNr=@FilialenNr AND AbfertigungsNr=@AbfertigungsNr  ", conn)
                    cmd.Parameters.AddWithValue("@FilialenNr", FilialeNr)
                    cmd.Parameters.AddWithValue("@AbfertigungsNr", AbfertigungsNr)
                    Dim dr = cmd.ExecuteReader()
                    If dr.Read Then
                        For Each li In getParameterList()
                            Dim propInfo As PropertyInfo = Me.GetType.GetProperty(li.Scalarvariable)

                            If dr.Item(li.Text) Is DBNull.Value Then
                                propInfo.SetValue(Me, Nothing)
                            Else
                                propInfo.SetValue(Me, dr.Item(li.Text))
                            End If

                        Next
                        If loadPos Then LOAD_POSITIONEN()
                    End If
                    dr.Close()
                End Using
                doVorzeichen()
            End Using
        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
    End Sub

    Public Shared Function LOADByFilialeAbfNrsssasdssssssssss(FilialeNr As Integer, AbfertigungsNr As Integer) As cVorauskasse
        Try
            Dim VK As New cVorauskasse
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("SELECT * FROM Rechnungsausgang WHERE vk_AbfertigungsNr=@vk_AbfertigungsNr AND  vk_FilialeNr=@vk_FilialeNr ", conn)
                    cmd.Parameters.AddWithValue("@vk_FilialeNr", FilialeNr)
                    cmd.Parameters.AddWithValue("@vk_AbfertigungsNr", AbfertigungsNr)
                    Dim dr = cmd.ExecuteReader()
                    If dr.Read Then
                        For Each li In VK.getParameterList()
                            Dim propInfo As PropertyInfo = VK.GetType.GetProperty(li.Scalarvariable)

                            If dr.Item(li.Text) Is DBNull.Value Then
                                propInfo.SetValue(VK, Nothing)
                            Else
                                propInfo.SetValue(VK, dr.Item(li.Text))
                            End If
                        Next
                        dr.Close()
                        Return VK
                    End If
                    dr.Close()
                End Using
                'VOREZEICHENCNENCNECNENCN!!!
            End Using
        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return Nothing
    End Function


    Public Function SAVE(Optional saveAll As Boolean = True) As Boolean
        doVorzeichen() ' Für GS in Minusbeträge umwandeln
        Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
        Dim sqlstr = " BEGIN TRAN IF EXISTS(SELECT * FROM Rechnungsausgang  WHERE RK_ID=@RK_ID) " &
                           " BEGIN " & getUpdateCmd() & " END " &
                     " Else " &
                     " BEGIN " & getInsertCmd() & " END " &
                     " commit tran "

        RK_ID = SQL.doSQLVarListID(RK_ID, sqlstr, "FMZOLL", , list)


        If RK_ID > 0 Then
            doVorzeichenPOS() ' Für GS in Minusbeträge umwandeln
            If saveAll Then SAVE_POSITIONEN(RK_ID) ' positionen speicehrn
            doVorzeichenPOS() ' Minusbeträge bei GS zurückumwandeln

            If saveAll Then SAVE_ANHAENGE(RK_ID) ' positionen speicehrn

        End If
        doVorzeichen() ' Minusbeträge bei GS zurückumwandeln
        Return RK_ID > 0
    End Function


    Public Function SAVE_DruckDatumZeit() As Boolean
        Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
        Dim sqlstr = " UPDATE Rechnungsausgang SET DruckDatumZeit=@DruckDatumZeit WHERE RK_ID=@RK_ID "
        Return SQL.doSQLVarList(sqlstr, "FMZOLL", , list)
    End Function

    Public Function SAVE_DsId(DsId) As Boolean
        Me.dsId = DsId
        Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
        Dim sqlstr = " UPDATE Rechnungsausgang SET DsId=@DsId WHERE RK_ID=@RK_ID "
        Return SQL.doSQLVarList(sqlstr, "FMZOLL", , list)
    End Function

    Public Shared Function SAVE_DsId(RK_ID, DsId) As Boolean
        Dim sqlstr = " UPDATE Rechnungsausgang SET DsId='" & DsId & "' WHERE RK_ID='" & RK_ID & "' "
        Return SQL.doSQL(sqlstr, "FMZOLL")
    End Function


    Public Sub doVorzeichen()
        Dim vz = If(Vorzeichen = "-", -1, 1)
        Me.SteuerfreierGesamtbetrag *= vz
        Me.SteuerpflichtigerGesamtbetrag *= vz
        Me.Abfertigungskosten *= vz
    End Sub
    Public Sub doVorzeichenPOS()
        Dim vz = If(Vorzeichen = "-", -1, 1)
        For Each p In POSITIONEN
            p.doVorzeichen(Vorzeichen)
        Next
    End Sub

    Public Function CHECK_Validation(ByRef errMsg As String, dgv As MyDatagridview) As Boolean
        If Firma_ID <= 0 Then errMsg = "ERROR: Firma auswählen!" : Return False
        If Rechnung_an = 0 OrElse CStr(Rechnung_an) = "" Then errMsg = "ERROR: Rechnungsempfänger auswählen!" : Return False
        If SpeditionsbuchUnterNr Is Nothing Then errMsg = "ERROR: Speditionsbuch-UnterNr auswählen!" : Return False
        If RechnungsKundenNr <= 0 Then errMsg = "ERROR: Kunden-Nummer fehlt!" : Return False
        '   If Steuerschlüssel Then errMsg = "ERROR: Steuerschlüssel muss angegeben werden!" : Return False
        Dim FIRMA As New VERAG_PROG_ALLGEMEIN.cFirmen(Firma_ID)

        If FIRMA.Firma_ID = 26 Then
            If RechnungsLandKz <> "GB" And RechnungsLandKz <> "UK" Then
                errMsg = "WARN: Abrechnung außerhalb GB." ' Return False
            End If
            If Währungscode <> "GBP" Then
                errMsg = "ERROR: Es darf nur mit Währung 'GBP' abgerechnet werden!" : Return False
            End If
        End If

        If RechnungsLandKz = FIRMA.Firma_LandKz Then
            If Steuersatz_Proz = 0 Then
                If vbYes <> MsgBox("Es wurde kein Steuerschlüssel angegeben." & vbNewLine & vbNewLine & "Sind Sie sicher, dass Sie ohne Steuerschlüssel fortfahren möchten.", vbYesNoCancel) Then
                    errMsg = "ERROR: Steuerschlüssel angegeben!"
                    Return False
                End If
            End If
        End If


        If dgv Is Nothing Then
            If Rechnungsart <> "RU" Then errMsg = "ERROR: Keine Positionen angegeben!" : Return False
        ElseIf dgv.Rows.Count = 0 Then
            If Rechnungsart <> "RU" Then errMsg = "ERROR: Keine Positionen angegeben!" : Return False
        Else
            If dgv.Rows.Count > 1 Then
                'Prüfung für doppelte Positionen mit PK: Bezeichnung und LeistungNr!
                Dim dt As New DataTable
                dt.Columns.Add("name", GetType(String))

                For Each row As DataGridViewRow In dgv.Rows
                    Dim R As DataRow = dt.NewRow
                    R("name") = row.Cells(0).Value
                    dt.Rows.Add(R)
                Next
                Dim dv As New DataView(dt)
                Dim distinct As DataTable = dv.ToTable(True, New String() {"name"})

                If distinct.Rows.Count <> dt.Rows.Count Then
                    errMsg = "ERROR: Doppelte Positionen vorhanden!" : Return False
                End If

            End If
        End If

        If dgv Is Nothing Then
            errMsg = "ERROR: Keine Positionen angegeben!" : Return False
        ElseIf dgv.Rows.Count = 0 Then
            errMsg = "ERROR: Keine Positionen angegeben!" : Return False
        Else
            If dgv.Rows.Count > 1 Then
                'Prüfung für doppelte Positionen mit PK: Bezeichnung und LeistungNr!
                Dim dt As New DataTable
                dt.Columns.Add("name", GetType(String))

                For Each row As DataGridViewRow In dgv.Rows
                    Dim R As DataRow = dt.NewRow
                    R("name") = row.Cells(0).Value
                    dt.Rows.Add(R)
                Next
                Dim dv As New DataView(dt)
                Dim distinct As DataTable = dv.ToTable(True, New String() {"name"})

                If distinct.Rows.Count <> dt.Rows.Count Then
                    errMsg = "ERROR: Doppelte Positionen vorhanden!" : Return False
                End If

            End If
        End If


        If FIRMA.Firma_ID = 19 Then

            Select Case Me.BelegartenKz
                Case "AR" : If (Me.SteuerfreierGesamtbetrag + Me.SteuerpflichtigerGesamtbetrag) < 0 Then errMsg = "ERROR: Vorzeichenfehler!" : Return False
                Case "AG" : If (Me.SteuerfreierGesamtbetrag + Me.SteuerpflichtigerGesamtbetrag) < 0 Then errMsg = "ERROR: Vorzeichenfehler!" : Return False
            End Select
        End If




        'checkFirmen

        Return True
            End Function

    Public Function SAVE_POSITIONEN(RK_ID) As Boolean
        If DELETE_POSITIONEN() Then ' zuerst Einträge löschen...
            ORDER_POSITIONEN() ' ... dann ordnen ...
            For Each p In POSITIONEN
                If Not p.INSERT(RK_ID) Then Return False ' ... dann insert
            Next
        Else : Return False
        End If
        Return True
    End Function
    Public Function SAVE_ANHAENGE(RK_ID As Integer, Optional delete As Boolean = True, Optional showError As Boolean = True) As Boolean

        Select Case delete

            Case 1

                If DELETE_ANHAENGE() Then
                    For Each p In ANHAENGE
                        If Not p.INSERT(RK_ID, showError) Then Return False
                    Next
                Else
                    Return False
                End If

            Case Else

                For Each p In ANHAENGE
                    If Not p.INSERT(RK_ID, showError) Then Return False
                Next

        End Select

        Return True
    End Function


    Public Sub LOAD()
        Try
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("SELECT * FROM Rechnungsausgang WHERE RK_ID=@RK_ID  ", conn)
                    cmd.Parameters.AddWithValue("@RK_ID", RK_ID)
                    Dim dr = cmd.ExecuteReader()
                    If dr.Read Then
                        For Each i In getParameterList()
                            Dim propInfo As PropertyInfo = Me.GetType.GetProperty(i.Scalarvariable)

                            If dr.Item(i.Text) Is DBNull.Value Then
                                propInfo.SetValue(Me, Nothing)
                            Else
                                propInfo.SetValue(Me, dr.Item(i.Text))
                            End If

                        Next

                    End If
                    dr.Close()
                End Using
                doVorzeichen()
            End Using
        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
    End Sub


    Public Function getUpdateCmd() As String
        Try
            Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()

            Dim str As String = ""
            For Each i In list
                If Not i.isPrimaryParam Then
                    str &= "[" & i.Text & "] = @" & i.Scalarvariable & "," '.Replace("-", "").Replace(" ", "") & ","
                End If
            Next
            str = str.Substring(0, str.Length - 1) 'wg. ','
            Return (" UPDATE [Rechnungsausgang] SET " & str & " WHERE RK_ID=@RK_ID ")

        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return ""
    End Function


    Public Function getInsertCmd() As String
        Try
            Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
            Dim str As String = ""
            Dim values As String = ""
            For Each i In list
                If Not i.isPrimaryParam Then
                    str &= "[" & i.Text & "],"
                    values &= "@" & i.Scalarvariable & "," '.Replace("-", "").Replace(" ", "") & ","
                End If
            Next
            str = str.Substring(0, str.Length - 1) 'wg. ','
            values = values.Substring(0, values.Length - 1) 'wg. ','
            Return (" INSERT INTO Rechnungsausgang  (" & str & ") VALUES(" & values & ")  ")
        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return ""
    End Function

    Public Function SET_DruckdatumUhrzeit() As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        Dim sqlstr = " UPDATE [Rechnungsausgang] SET DruckDatumZeit=GETDATE WHERE RK_ID=" & Me.RK_ID
        Return SQL.doSQL(sqlstr, "FMZOLL")
    End Function



    Public Function setSPEDBUCH_FAKTURIERT(Optional wert As Boolean = True) As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        Dim sqlstr = "  UPDATE Speditionsbuch SET Fakturiert='" & If(wert, 1, 0) & "' WHERE FilialenNr = '" & Me.FilialenNr & "' AND AbfertigungsNr = '" & Me.[AbfertigungsNr] & "' AND UnterNr = '" & Me.[SpeditionsbuchUnterNr] & "'"
        Return SQL.doSQL(sqlstr, "FMZOLL")
    End Function

    Public Function DELETE() As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        Dim sqlstr = " DELETE FROM [Rechnungsausgang]  WHERE RK_ID=" & Me.RK_ID
        Return SQL.doSQL(sqlstr, "FMZOLL")
    End Function

    Public Function DELETE_POSITIONEN() As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        Dim sqlstr = " DELETE FROM [RechnungsausgangPositionen]  WHERE RK_ID=" & Me.RK_ID
        Return SQL.doSQL(sqlstr, "FMZOLL")
    End Function

    Public Function DELETE_POSITIONEN(RK_ID As Integer, LeistungsNr As Integer, Steuerpflichtig As Boolean, LeistungsBez As String, IndexZkteingang As Integer) As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        Dim sqlstr = " DELETE FROM [RechnungsausgangPositionen]  WHERE RK_ID=" & RK_ID & " AND LeistungsNr = " & LeistungsNr & " and LeistungsBez = '" & LeistungsBez & "' And IndexZkteing = " & IndexZkteingang & " AND Steuerpflichtig =" & IIf(Steuerpflichtig, 1, 0)
        Return SQL.doSQL(sqlstr, "FMZOLL")
    End Function

    Public Function DELETE_ANHAENGE() As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        Dim sqlstr = " DELETE FROM [RechnungsausgangAnhaenge]  WHERE RK_ID=" & Me.RK_ID
        Return SQL.doSQL(sqlstr, "FMZOLL")
    End Function

    Public Sub LOAD_POSITIONEN()
        Try
            POSITIONEN.Clear()
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("Select * FROM RechnungsausgangPositionen WHERE RK_ID=@RK_ID  ", conn)
                    cmd.Parameters.AddWithValue("@RK_ID", Me.RK_ID)

                    Dim dr = cmd.ExecuteReader()
                    While dr.Read
                        Dim l As New cRechnungsausgangPositionen
                        For Each i In l.getParameterList()
                            Dim propInfo As PropertyInfo = l.GetType.GetProperty(i.Scalarvariable)
                            If dr.Item(i.Text) Is DBNull.Value Then
                                propInfo.SetValue(l, Nothing)
                            Else
                                propInfo.SetValue(l, dr.Item(i.Text))
                            End If
                        Next
                        POSITIONEN.Add(l)
                    End While
                    dr.Close()
                End Using
            End Using
            doVorzeichenPOS() ' Minus in Plus umwandeln (DB hat Minus, System hat Plus-Beträge)

        Catch ex As Exception
            MsgBox("Fehler In der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
    End Sub

    Public Sub LOAD_POSITIONEN_FROM_OFFERTE(OFFERTE As VERAG_PROG_ALLGEMEIN.cOfferte)

        For Each O In OFFERTE.POSITIONEN
            'If row("Anzahl") > 0 Then -->SQL

            Dim l As New cRechnungsausgangPositionen
            l.LeistungsNr = O.LeistungsNr
            l.LeistungsBez = O.LeistungsBez
            l.Anzahl = O.Anzahl
            l.Preis = O.Preis
            l.BerechnungsartNr = O.BerechnungsartNr
            l.BGebLeistungsNr = O.BGebLeistungsNr
            l.BGebProzent = O.BGebProzent
            l.BGebMinBetrag = O.BGebMinBetrag
            ' l.Steuerpflichtig = O.ste
            l.RK_ID = Me.RK_ID

            POSITIONEN.Add(l)
            ' End If
        Next

    End Sub
    Public Sub LOAD_OFFERT_POSITIONEN()
        Try
            '  POSITIONEN.Clear()
            Dim dt = SQL.loadDgvBySql(" Select [Offertenpositionen].[LeistungsNr],[Offertenpositionen].[LeistungsBez],[Anzahl],[Preis],[Offertenpositionen].[BerechnungsartNr],[BGebLeistungsNr],[BGebProzent],[BGebMinBetrag],Steuerpflichtig/*,[Geändert am],[Sachbearbeiter]*/,BerechnungsartPosInkludiert 
                                           From [Offertenpositionen] INNER Join [Leistungen] On Leistungen.LeistungsNr=Offertenpositionen.LeistungsNr 
                                           Where KundenNr ='" & Me.RechnungsKundenNr & "' and OffertenNr='" & OffertenNr & "'  AND Anzahl>0 AND Preis>0 ORDER BY LeistungsNr", "FMZOLL")

            For Each row In dt.Rows
                'If row("Anzahl") > 0 Then -->SQL

                Dim l As New cRechnungsausgangPositionen
                l.LeistungsNr = row("LeistungsNr")
                l.LeistungsBez = row("LeistungsBez")
                l.Anzahl = row("Anzahl")
                l.Preis = row("Preis")
                l.BerechnungsartNr = row("BerechnungsartNr")
                l.BGebLeistungsNr = row("BGebLeistungsNr")
                l.BGebProzent = row("BGebProzent")
                l.BGebMinBetrag = row("BGebMinBetrag")
                l.Steuerpflichtig = row("Steuerpflichtig")

                'l.BGebBgl = l.Preis
                If Not l.Steuerpflichtig Then
                    'l.SteuerpflichtigerBetrag = l.Preis 'alt
                    l.SteuerfreierBetrag = l.Preis 'neu
                    l.Preis = l.Preis
                Else
                    Dim steuersatz = SQL.DLookup("Steuertabelle.[Steuersatz %] ", "[Kunden]  inner join Steuertabelle on Steuertabelle.Steuerschlüssel=kunden.Steuerschlüssel", "KundenNr='" & Me.RechnungsKundenNr & "'", "FMZOLL", "0")
                    'l.SteuerfreierBetrag = l.Preis + (l.Preis * steuersatz) 'alt
                    l.SteuerpflichtigerBetrag = l.Preis + (l.Preis * steuersatz) 'neu
                    l.Preis = l.Preis + (l.Preis * steuersatz)
                End If

                l.RK_ID = Me.RK_ID

                POSITIONEN.Add(l)
                ' End If
            Next

        Catch ex As Exception
            MsgBox("Fehler In der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
    End Sub

    Public Sub LOAD_ANHAENGE()
        Try
            ANHAENGE.Clear()
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("Select * FROM RechnungsausgangAnhaenge WHERE RK_ID=@RK_ID  ", conn)
                    cmd.Parameters.AddWithValue("@RK_ID", Me.RK_ID)

                    Dim dr = cmd.ExecuteReader()
                    While dr.Read
                        Dim l As New cRechnungsausgangAnhaenge
                        For Each i In l.getParameterList()
                            Dim propInfo As PropertyInfo = l.GetType.GetProperty(i.Scalarvariable)
                            If dr.Item(i.Text) Is DBNull.Value Then
                                propInfo.SetValue(l, Nothing)
                            Else
                                propInfo.SetValue(l, dr.Item(i.Text))
                            End If
                        Next
                        ANHAENGE.Add(l)
                    End While
                    dr.Close()
                End Using
            End Using
        Catch ex As Exception
            MsgBox("Fehler In der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
    End Sub

    Shared Function LOAD_ANHAENGE_LIST(RK_ID) As List(Of cRechnungsausgangAnhaenge)
        Dim ANHAENGE As New List(Of cRechnungsausgangAnhaenge)
        Try
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("Select * FROM RechnungsausgangAnhaenge WHERE RK_ID=@RK_ID  ", conn)
                    cmd.Parameters.AddWithValue("@RK_ID", RK_ID)

                    Dim dr = cmd.ExecuteReader()
                    While dr.Read
                        Dim l As New cRechnungsausgangAnhaenge
                        For Each i In l.getParameterList()
                            Dim propInfo As PropertyInfo = l.GetType.GetProperty(i.Scalarvariable)
                            If dr.Item(i.Text) Is DBNull.Value Then
                                propInfo.SetValue(l, Nothing)
                            Else
                                propInfo.SetValue(l, dr.Item(i.Text))
                            End If
                        Next
                        ANHAENGE.Add(l)
                    End While
                    dr.Close()
                End Using
            End Using
        Catch ex As Exception
            MsgBox("Fehler In der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return ANHAENGE
    End Function
    Public Sub ORDER_POSITIONEN()
        Try
            '  Dim POSITIONEN_Tmp As New List(Of cRechnungsausgangPositionen)
            Try
                POSITIONEN = POSITIONEN.OrderByDescending(Function(x) x.Preis).ToList()
            Catch ex As Exception
                'Preis null??
            End Try
            POSITIONEN = POSITIONEN.OrderBy(Function(x) CInt(x.LeistungsNr)).ToList()

        Catch ex As Exception
            MsgBox("Fehler In der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
    End Sub


End Class



Public Class cRechnungsausgangPositionen

    Property RK_ID As Integer
    Property LeistungsNr As Integer
    Property Steuerpflichtig As Boolean
    Property LeistungsBez As String = Nothing
    Property IndexZkteing As Integer = 0
    Property BerechnungsartNr As Integer = 1
    Property Preis As Object = Nothing
    Property Anzahl As Object = Nothing
    Property SteuerpflichtigerBetrag As Decimal = 0
    Property SteuerfreierBetrag As Decimal = 0
    Property AufschubkontoNr As Object = Nothing
    Property Aufschubfälligkeit As Object = Nothing
    Property Prüfsumme_berechnen As Boolean '!!!!
    Property DateiNameAufschub As Object = Nothing
    Property Preisbindung As Boolean '!!!!
    Property Belegdaten As Object = Nothing
    Property Fremdwährung As Object = Nothing
    Property BGebLeistungsNr As Object = Nothing
    Property BGebProzent As Object = Nothing
    Property BGebBgl As Object = Nothing
    Property BGebMinBetrag As Object = Nothing
    Property RePosZeitstempel As Object = Nothing
    Property NachzahlungsID As Object = Nothing

    'FROM [VERAG].[dbo].[RechnungsausgangPositionen]


    Dim SQL As New SQL

    Sub New()
    End Sub

    Sub New(_RK_ID)
        RK_ID = _RK_ID
    End Sub



    Function getParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
        Dim list As New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RK_ID", RK_ID))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("LeistungsNr", LeistungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Steuerpflichtig", Steuerpflichtig))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("LeistungsBez", LeistungsBez))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("IndexZkteing", IndexZkteing))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BerechnungsartNr", BerechnungsartNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Preis", Preis))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Anzahl", Anzahl))


        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerpflichtigerBetrag", SteuerpflichtigerBetrag))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerfreierBetrag", SteuerfreierBetrag))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AufschubkontoNr", AufschubkontoNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Aufschubfälligkeit", Aufschubfälligkeit))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Prüfsumme berechnen", Prüfsumme_berechnen, "Prüfsumme_berechnen")) '!!!!
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("DateiNameAufschub", DateiNameAufschub))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Preisbindung", Preisbindung))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Belegdaten", Belegdaten))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Fremdwährung", Fremdwährung))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BGebLeistungsNr", BGebLeistungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BGebProzent", BGebProzent))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BGebBgl", BGebBgl))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BGebMinBetrag", BGebMinBetrag))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RePosZeitstempel", RePosZeitstempel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("NachzahlungsID", NachzahlungsID))

        'list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("upsize_ts", XXXXXXXXXXXXX))
        Return list
    End Function

    Public Function INSERT(RK_ID) As Boolean
        Me.RK_ID = RK_ID
        Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
        Return SQL.doSQLVarList(getInsertCmd, "FMZOLL", , list)
    End Function


    Public Sub doVorzeichen(Vorzeichen)
        Dim vz = If(Vorzeichen = "-", -1, 1)
        Me.Preis *= vz
        Me.SteuerfreierBetrag *= vz
        Me.SteuerpflichtigerBetrag *= vz
    End Sub

    Public Function getInsertCmd() As String
        Try
            'Me.Eingegeben_am = Now
            Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
            Dim str As String = ""
            Dim values As String = ""
            For Each i In list
                If Not i.isPrimaryParam Then
                    str &= "[" & i.Text & "],"
                    values &= "@" & i.Scalarvariable & "," '.Replace("-", "").Replace(" ", "") & ","
                End If
            Next
            str = str.Substring(0, str.Length - 1) 'wg. ','
            values = values.Substring(0, values.Length - 1) 'wg. ','
            Return (" INSERT INTO RechnungsausgangPositionen  (" & str & ") VALUES(" & values & ")  ")
        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return ""
    End Function



End Class


Public Class cRechnungsausgangAnhaenge

    Property RK_ID As Integer
    Property dsId As Integer
    Property anhId As Integer
    Property Bezeichnung As String = ""


    Dim SQL As New SQL

    Sub New()
    End Sub



    Function getParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
        Dim list As New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RK_ID", RK_ID))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("dsId", dsId))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("anhId", anhId))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Bezeichnung", Bezeichnung))

        Return list
    End Function

    Public Function INSERT(RK_ID As Integer, Optional showError As Boolean = True) As Boolean
        Me.RK_ID = RK_ID
        Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
        Return SQL.doSQLVarList(getInsertCmd, "FMZOLL", showError, list)
    End Function

    Public Function DELETE(RK_ID As Integer, DSIS As Integer) As Boolean
        Return SQL.doSQLVarList("DELETE FROM RechnungsausgangAnhaenge where RK_ID = " & RK_ID & " and dsId = " & DSIS, "FMZOLL")
    End Function



    Public Function getInsertCmd() As String
        Try
            'Me.Eingegeben_am = Now
            Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
            Dim str As String = ""
            Dim values As String = ""
            For Each i In list
                If Not i.isPrimaryParam Then
                    str &= "[" & i.Text & "],"
                    values &= "@" & i.Scalarvariable & "," '.Replace("-", "").Replace(" ", "") & ","
                End If
            Next
            str = str.Substring(0, str.Length - 1) 'wg. ','
            values = values.Substring(0, values.Length - 1) 'wg. ','
            Return (" INSERT INTO RechnungsausgangAnhaenge  (" & str & ") VALUES(" & values & ")  ")
        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return ""
    End Function



End Class