Imports System.Data.SqlClient
Imports System.Reflection

Public Class cTrdInvoice

    Property Rechnungsdatum As Date
    Property Rechnungsnummer As Integer
    Property Speditionsbuch As Object = Nothing
    Property FilialenNr As Object = Nothing
    Property AbfertigungsNr As Object = Nothing
    Property UnterNr As Object = Nothing
    Property Abfertigungsdatum As Object = Nothing
    Property BelegartenNr As Object = Nothing
    Property KundenNrZentrale As Object = Nothing
    Property RechnungsKundenNr As Object = Nothing
    Property RechnungsLandKz As Object = Nothing
    Property RechnungsUstIdKz As Object = Nothing
    Property RechnungsUstIdNr As Object = Nothing
    Property Lastschrift As Object = Nothing
    Property Steuerschlüssel As Object = Nothing
    Property Steuersatz As Object = Nothing '[Steuersatz %]
    Property WährungLokal As Object = Nothing
    Property SteuerpflichtigerBetragLokal As Object = Nothing
    Property SteuerfreierBetragLokal As Object = Nothing
    Property SteuerbetragLokal As Object = Nothing
    Property RechnungsbetragLokal As Object = Nothing
    Property WährungFremd As Object = Nothing
    Property SteuerpflichtigerBetragFremd As Object = Nothing
    Property SteuerfreierBetragFremd As Object = Nothing
    Property SteuerbetragFremd As Object = Nothing
    Property RechnungsbetragFremd As Object = Nothing
    Property TrdinDateiname As Object = Nothing
    Property Abgleich_op_debitor As Object = Nothing
    Property Nettozahlungsziel As Object = Nothing
    Property Firma_ID As Object = Nothing
    Property UStVAn_ID As Object = Nothing

    Property hasEntry As Boolean = False


    Dim SQL As New SQL

    Sub New()

    End Sub

    Sub New(Rechnungsdatum, Rechnungsnummer)
        Me.Rechnungsnummer = Rechnungsnummer
        Me.Rechnungsdatum = Rechnungsdatum
        LOAD()
    End Sub

    Sub New(Rechnungsdatum, Rechnungsnummer, Buchungsjahr)
        Me.Rechnungsnummer = Buchungsjahr.ToString.Substring(2, 2) & Rechnungsnummer
        Me.Rechnungsdatum = Rechnungsdatum
        LOAD()
    End Sub
    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("Rechnungsdatum", Rechnungsdatum))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Rechnungsnummer", Rechnungsnummer))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Speditionsbuch", Speditionsbuch))
        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("BelegartenNr", BelegartenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KundenNrZentrale", KundenNrZentrale))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsKundenNr", RechnungsKundenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsLandKz", RechnungsLandKz))
        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("Lastschrift", Lastschrift))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Steuerschlüssel", Steuerschlüssel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Steuersatz %", Steuersatz, "Steuersatz")) '[Steuersatz %]
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("WährungLokal", WährungLokal))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerpflichtigerBetragLokal", SteuerpflichtigerBetragLokal))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerfreierBetragLokal", SteuerfreierBetragLokal))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerbetragLokal", SteuerbetragLokal))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsbetragLokal", RechnungsbetragLokal))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("WährungFremd", WährungFremd))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerpflichtigerBetragFremd", SteuerpflichtigerBetragFremd))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerfreierBetragFremd", SteuerfreierBetragFremd))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerbetragFremd", SteuerbetragFremd))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("RechnungsbetragFremd", RechnungsbetragFremd))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("TrdinDateiname", TrdinDateiname))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Abgleich_op_debitor", Abgleich_op_debitor))
        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("UStVAn_ID", UStVAn_ID))


        Return list
    End Function




    Public Function SAVE() As Boolean
        Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()


        Dim sqlstr = " BEGIN TRAN IF EXISTS(SELECT * FROM tblTrdinInvoice WITH(updlock,serializable) WHERE Rechnungsnummer=@Rechnungsnummer and Rechnungsdatum=@Rechnungsdatum) " &
                       " BEGIN " & getUpdateCmd() & " END " &
                       " Else " &
                       " BEGIN " & getInsertCmd() & " END " &
                       " commit tran "

        Return SQL.doSQLVarList(sqlstr, "FMZOLL", , list)
    End Function


    Public Sub LOAD()
        Try
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("SELECT * FROM tblTrdinInvoice WHERE Rechnungsnummer=@Rechnungsnummer and Rechnungsdatum=@Rechnungsdatum  ", conn)
                    cmd.Parameters.AddWithValue("@Rechnungsnummer", Rechnungsnummer)
                    cmd.Parameters.AddWithValue("@Rechnungsdatum", Rechnungsdatum)
                    Dim dr = cmd.ExecuteReader()
                    If dr.Read Then
                        hasEntry = True
                        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

                    End If
                    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


    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 [tblTrdinInvoice] SET " & str & " WHERE Rechnungsnummer=@Rechnungsnummer and Rechnungsdatum=@Rechnungsdatum ")

        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 tblTrdinInvoice  (" & 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 DELETE() As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        Dim sqlstr = " DELETE FROM [tblTrdinInvoice] WITH(updlock,serializable) WHERE Rechnungsnummer=" & Me.Rechnungsnummer & " and Rechnungsdatum='" & Me.Rechnungsdatum.ToShortDateString & "'"
        Return SQL.doSQL(sqlstr, "FMZOLL")
    End Function

End Class



Public Class cTrdProduct

    Property Rechnungsdatum As Date
    Property Rechnungsnummer As Integer

    Property Leistungsnummer As Integer
    Property Leistungsbezeichnung As String
    Property Steuerpflichtig As Boolean
    Property SteuerpflichtigerBetragLokal As Object = Nothing
    Property SteuerfreierBetragLokal As Object = Nothing
    Property SteuerpflichtigerBetragFremd As Object = Nothing
    Property SteuerfreierBetragFremd As Object = Nothing
    Property Belegdaten As Object = Nothing
    Property Sachkonto As Object = Nothing
    Property Buchungstext As Object = Nothing


    Dim SQL As New SQL

    Sub New()

    End Sub


    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("Rechnungsdatum", Rechnungsdatum))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Rechnungsnummer", Rechnungsnummer))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Leistungsnummer", Leistungsnummer))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Leistungsbezeichnung", Leistungsbezeichnung))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Steuerpflichtig", Steuerpflichtig))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerpflichtigerBetragLokal", SteuerpflichtigerBetragLokal))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerfreierBetragLokal", SteuerfreierBetragLokal))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerpflichtigerBetragFremd", SteuerpflichtigerBetragFremd))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SteuerfreierBetragFremd", SteuerfreierBetragFremd))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Belegdaten", Belegdaten))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Sachkonto", Sachkonto))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Buchungstext", Buchungstext))

        Return list
    End Function




    Public Function SAVE() As Boolean
        Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()


        Dim sqlstr = " BEGIN TRAN IF EXISTS(SELECT * FROM tblTrdinProduct WITH(updlock,serializable) WHERE Rechnungsnummer=@Rechnungsnummer and Rechnungsdatum=@Rechnungsdatum and Leistungsnummer=@Leistungsnummer and Leistungsbezeichnung=@Leistungsbezeichnung and Steuerpflichtig=@Steuerpflichtig) " &
                       " BEGIN " & getUpdateCmd() & " END " &
                       " Else " &
                       " BEGIN " & getInsertCmd() & " END " &
                       " commit tran "

        Return SQL.doSQLVarList(sqlstr, "FMZOLL", , list)
    End Function


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

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

    '                    Next

    '                End If
    '                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


    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 [tblTrdinProduct] SET " & str & " WHERE Rechnungsnummer=@Rechnungsnummer and Rechnungsdatum=@Rechnungsdatum and Leistungsnummer=@Leistungsnummer and Leistungsbezeichnung=@Leistungsbezeichnung and Steuerpflichtig=@Steuerpflichtig ")

        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 tblTrdinProduct  (" & 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



Class TrdInvoice_FUNCTIONS

    Shared SQL As New VERAG_PROG_ALLGEMEIN.SQL

    Shared Function TrdinSchreiben(Optional Firma As Integer = -1, Optional Buchungsjahr As Integer = -1) As Boolean 'Lädt die Daten aus der Tabelle Rechnungsausgang/RechnungsausgangPositionen in die Tabelle trdInvoice/trdProduct 
        Try

            Dim LOKALWÄHRUNG = "EUR"
            Dim lngSatzzähler As Integer
            Dim WährungsdifferenzSteuerpflichtigerBetrag As Double
            Dim WährungsdifferenzSteuerfreierBetrag As Integer

            Dim dt As DataTable = SQL.loadDgvBySql(getSQLString_SELECTForTrdInvoice(Firma, Buchungsjahr), "FMZOLL", 9800)
            If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
                For Each ROW In dt.Rows
                    Dim TRD_INVOICE As VERAG_PROG_ALLGEMEIN.cTrdInvoice
                    If Buchungsjahr > 2000 Then
                        TRD_INVOICE = New VERAG_PROG_ALLGEMEIN.cTrdInvoice(ROW("RK_RechnungsDatum"), ROW("RK_RechnungsNr"), Buchungsjahr) 'nur UNISPED!!!!
                    Else
                        TRD_INVOICE = New VERAG_PROG_ALLGEMEIN.cTrdInvoice(ROW("RK_RechnungsDatum"), ROW("RK_RechnungsNr"))
                    End If


                    If TRD_INVOICE.hasEntry Then
                        '  MsgBox("RG-Nr. bereits vorhanden!")
                    Else
                        Dim RK_Währungscode = ROW("RK_Währungscode")
                        If ROW("RK_Währungscode") Is DBNull.Value Then RK_Währungscode = LOKALWÄHRUNG

                        If RK_Währungscode = LOKALWÄHRUNG Then
                            TRD_INVOICE.SteuerpflichtigerBetragLokal = ROW("RK_SteuerpflichtigerBetrag")
                            TRD_INVOICE.SteuerfreierBetragLokal = ROW("RK_SteuerfreierBetrag")
                            TRD_INVOICE.SteuerbetragLokal = ROW("RK_Steuerbetrag")
                            TRD_INVOICE.RechnungsbetragLokal = ROW("RK_Rechnungsbetrag")

                            TRD_INVOICE.SteuerpflichtigerBetragFremd = 0
                            TRD_INVOICE.SteuerfreierBetragFremd = 0
                            TRD_INVOICE.SteuerbetragFremd = 0
                            TRD_INVOICE.RechnungsbetragFremd = 0

                            TRD_INVOICE.WährungFremd = Nothing
                        Else
                            TRD_INVOICE.SteuerpflichtigerBetragFremd = ROW("RK_SteuerpflichtigerBetrag")
                            TRD_INVOICE.SteuerfreierBetragFremd = ROW("RK_SteuerfreierBetrag")
                            TRD_INVOICE.SteuerbetragFremd = ROW("RK_Steuerbetrag")
                            TRD_INVOICE.RechnungsbetragFremd = ROW("RK_Rechnungsbetrag")

                            TRD_INVOICE.SteuerpflichtigerBetragLokal = VERAG_PROG_ALLGEMEIN.cProgramFunctions.fktEuro(ROW("RK_SteuerpflichtigerBetrag"), ROW("RK_Währungscode"), LOKALWÄHRUNG)
                            TRD_INVOICE.SteuerfreierBetragLokal = VERAG_PROG_ALLGEMEIN.cProgramFunctions.fktEuro(ROW("RK_SteuerfreierBetrag"), ROW("RK_Währungscode"), LOKALWÄHRUNG)
                            TRD_INVOICE.SteuerbetragLokal = CDbl(TRD_INVOICE.SteuerpflichtigerBetragLokal * ROW("RK_SteuersatzProzent") * 100) / 100
                            TRD_INVOICE.RechnungsbetragLokal = TRD_INVOICE.SteuerpflichtigerBetragLokal + TRD_INVOICE.SteuerfreierBetragLokal + TRD_INVOICE.SteuerbetragLokal
                            ' Basis zur Feststellung von Rundungsdifferenzen schaffen. 

                            TRD_INVOICE.SteuerpflichtigerBetragLokal = 0
                            TRD_INVOICE.SteuerfreierBetragLokal = 0
                            TRD_INVOICE.SteuerbetragLokal = 0
                            TRD_INVOICE.RechnungsbetragLokal = 0

                            WährungsdifferenzSteuerpflichtigerBetrag = TRD_INVOICE.SteuerpflichtigerBetragLokal
                            WährungsdifferenzSteuerfreierBetrag = TRD_INVOICE.SteuerfreierBetragLokal
                            lngSatzzähler = ROW("RK_Satzzähler")

                            TRD_INVOICE.WährungFremd = RK_Währungscode
                        End If


                        TRD_INVOICE.FilialenNr = ROW("RK_FilialenNr")
                        TRD_INVOICE.Speditionsbuch = SQL.DLookup("Speditionsbuch", "Filialen", "FilialenNr=" & ROW("RK_FilialenNr"), "FMZOLL", Nothing) ' ROW("Speditionsbuch")
                        TRD_INVOICE.AbfertigungsNr = ROW("RK_AbfertigungsNr")
                        TRD_INVOICE.UnterNr = ROW("RK_UnterNr")
                        TRD_INVOICE.Abfertigungsdatum = ROW("RK_Abfertigungsdatum")
                        TRD_INVOICE.BelegartenNr = ROW("RK_BelegartenNr")
                        TRD_INVOICE.KundenNrZentrale = ROW("RK_KundenNrZentrale")
                        TRD_INVOICE.RechnungsKundenNr = ROW("RK_RechnungsKundenNr")
                        TRD_INVOICE.RechnungsLandKz = ROW("RK_RechnungsLandKz")
                        TRD_INVOICE.RechnungsUstIdKz = ROW("RK_RechnungsUstIdKz")
                        TRD_INVOICE.RechnungsUstIdNr = ROW("RK_RechnungsUstIdNr")
                        TRD_INVOICE.Lastschrift = ROW("RK_Lastschrift")
                        TRD_INVOICE.Steuerschlüssel = ROW("RK_Steuerschlüssel")
                        TRD_INVOICE.Steuersatz = ROW("RK_SteuersatzProzent")
                        TRD_INVOICE.WährungLokal = LOKALWÄHRUNG
                        TRD_INVOICE.TrdinDateiname = Nothing
                        TRD_INVOICE.Abgleich_op_debitor = 0
                        TRD_INVOICE.Nettozahlungsziel = ROW("RK_Nettozahlungsziel")
                        TRD_INVOICE.Firma_ID = ROW("RK_Firma_ID")
                        TRD_INVOICE.UStVAn_ID = Nothing

                        If TRD_INVOICE.SAVE Then
                            If TrdinSchreibenProduct(TRD_INVOICE.Rechnungsdatum, ROW("RK_RechnungsNr"), TRD_INVOICE.Rechnungsnummer, RK_Währungscode, ROW("RK_RechnungsLandKz"), ROW("RK_Buchungstext"), TRD_INVOICE.Firma_ID, lngSatzzähler, WährungsdifferenzSteuerpflichtigerBetrag, WährungsdifferenzSteuerfreierBetrag, Buchungsjahr) Then
                                'UPDATE  rechnugnsausgang
                                Dim firmaTmpsql = If(Firma > 0, " AND Firma_ID= '" & Firma & "' ", "")
                                Dim buchungsjahrTmpsql = If(Buchungsjahr > 0, " AND Buchungsjahr= '" & Buchungsjahr & "' ", "")
                                SQL.doSQL("UPDATE [Rechnungsausgang]  SET [Trdin] = 1  WHERE convert(date,[RechnungsDatum] ,104) = '" & TRD_INVOICE.Rechnungsdatum.ToShortDateString & "' AND RechnungsNr = " & ROW("RK_RechnungsNr") & firmaTmpsql & buchungsjahrTmpsql, "FMZOLL")
                            End If
                        End If
                    End If
                Next
                Return True

            Else
                Return False
            End If

            ' Buchung im Rechnungskopfsatz eintragen.
            '   Call SPAktionsabfrageOhneErgebnis("dbo.spTrdinSchreibenUpdateRK", AktuelleVerbindungszeichenfolge(0), rstRK![RK_RechnungsDatum], rstRK![RK_RechnungsNr], 1)
        Catch ex As Exception
            MsgBox(ex.StackTrace & "" & ex.Message)
            Return False
        End Try

    End Function



    Shared Function TrdinSchreibenProduct(RechnungsDatum, RK_RechnungsNr, TRD_RechnungsNr, RK_Währungscode, RK_RechnungsLandKz, RK_Buchungstext, RK_Firma_ID, ByRef lngSatzzähler, ByRef WährungsdifferenzSteuerpflichtigerBetrag, ByRef WährungsdifferenzSteuerfreierBetrag, Buchungsjahr) As Boolean
        Try

            Dim LOKALWÄHRUNG = "EUR"

            Dim dt As DataTable = SQL.loadDgvBySql(getSQLString_SELECTForTrdProduct(RechnungsDatum, RK_RechnungsNr, RK_Firma_ID, Buchungsjahr), "FMZOLL")
            If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
                For Each ROW In dt.Rows
                    Dim TRD_PRODUCT As New VERAG_PROG_ALLGEMEIN.cTrdProduct()

                    TRD_PRODUCT.Rechnungsdatum = RechnungsDatum
                    TRD_PRODUCT.Rechnungsnummer = TRD_RechnungsNr


                    If RK_Währungscode = LOKALWÄHRUNG Then
                        TRD_PRODUCT.SteuerpflichtigerBetragLokal = ROW("RP_SteuerpflichtigerBetrag")
                        TRD_PRODUCT.SteuerfreierBetragLokal = ROW("RP_SteuerfreierBetrag")

                        TRD_PRODUCT.SteuerpflichtigerBetragFremd = 0
                        TRD_PRODUCT.SteuerfreierBetragFremd = 0
                    Else
                        TRD_PRODUCT.SteuerpflichtigerBetragFremd = ROW("RP_SteuerpflichtigerBetrag")
                        TRD_PRODUCT.SteuerfreierBetragFremd = ROW("RP_SteuerfreierBetrag")


                        TRD_PRODUCT.SteuerpflichtigerBetragLokal = VERAG_PROG_ALLGEMEIN.cProgramFunctions.fktEuro(ROW("RP_SteuerpflichtigerBetrag"), RK_Währungscode, LOKALWÄHRUNG)
                        TRD_PRODUCT.SteuerfreierBetragLokal = VERAG_PROG_ALLGEMEIN.cProgramFunctions.fktEuro(ROW("RP_SteuerfreierBetrag"), RK_Währungscode, LOKALWÄHRUNG)


                        WährungsdifferenzSteuerpflichtigerBetrag -= TRD_PRODUCT.SteuerpflichtigerBetragLokal
                        WährungsdifferenzSteuerfreierBetrag -= TRD_PRODUCT.SteuerfreierBetragLokal

                        lngSatzzähler = lngSatzzähler - ROW("RP_Satzzähler")
                        If lngSatzzähler = 0 Then
                            If WährungsdifferenzSteuerpflichtigerBetrag <> 0 Then
                                TRD_PRODUCT.SteuerpflichtigerBetragLokal += WährungsdifferenzSteuerpflichtigerBetrag
                            End If
                            If WährungsdifferenzSteuerfreierBetrag <> 0 Then
                                TRD_PRODUCT.SteuerfreierBetragLokal += WährungsdifferenzSteuerfreierBetrag
                            End If
                        End If
                    End If


                    TRD_PRODUCT.Leistungsnummer = ROW("RP_LeistungsNr")
                    TRD_PRODUCT.Leistungsbezeichnung = ROW("RP_LeistungsBez")
                    TRD_PRODUCT.Steuerpflichtig = ROW("RP_Steuerpflichtig")
                    TRD_PRODUCT.Belegdaten = ROW("RP_Belegdaten")
                    TRD_PRODUCT.Sachkonto = getSachkonto(RK_Firma_ID, ROW("RP_LeistungsNr"), RK_RechnungsLandKz, ROW("RP_Steuerpflichtig"), ROW("AufschubkontoNr"))
                    TRD_PRODUCT.Buchungstext = RK_Buchungstext



                    TRD_PRODUCT.SAVE()
                Next

                Return True
            Else
                Return False
            End If


        Catch ex As Exception
            MsgBox(ex.StackTrace & "" & ex.Message)
            Return False
        End Try
    End Function

    Shared Function getSachkonto(Firma_Id, RP_LeistungsNr, [RK_RechnungsLandKz], RP_Steuerpflichtig, RP_AufschubkontoNr)
        ' Sachkonto ermitteln.
        Dim FIRMA = New VERAG_PROG_ALLGEMEIN.cFirmen(Firma_Id)

        Select Case Firma_Id
            Case 20 'IMEX --> Andere Sachkonten in Tbl Leistungen!
                If [RK_RechnungsLandKz] Is Nothing OrElse [RK_RechnungsLandKz] Is DBNull.Value OrElse [RK_RechnungsLandKz].trim = "" _
                          OrElse [RK_RechnungsLandKz] = "A" _
                          OrElse [RK_RechnungsLandKz] = "AT" Then
                    If CBool([RP_Steuerpflichtig]) Then
                        getSachkonto = If(SQL.DLookup("[IMEX_SachkontoInlandSteuerpflichtig]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")

                    Else
                        getSachkonto = If(SQL.DLookup("[IMEX_SachkontoInlandSteuerfrei]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")
                    End If
                Else
                    If SQL.DLookup("[MitgliedslandEU]", "[Währungstabelle]", "[LandKz]='" & [RK_RechnungsLandKz] & "'", "FMZOLL", False) Then
                        If [RP_Steuerpflichtig] Then
                            getSachkonto = If(SQL.DLookup("[IMEX_SachkontoEUSteuerpflichtig]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")
                        Else
                            getSachkonto = If(SQL.DLookup("[IMEX_SachkontoEUSteuerfrei]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")
                        End If
                    Else
                        getSachkonto = If(SQL.DLookup("[IMEX_Sachkonto3Land]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")
                    End If
                End If
                If getSachkonto = "" Then getSachkonto = "9999" 'DEFAULT!

            Case 21, 22, 23, 24 '--> cLeistungenBUKonten!
                Dim BU_KTO As New VERAG_PROG_ALLGEMEIN.cLeistungenBUKonten(RP_LeistungsNr, Firma_Id)
                If [RK_RechnungsLandKz] Is Nothing OrElse [RK_RechnungsLandKz] Is DBNull.Value OrElse [RK_RechnungsLandKz].trim = "" OrElse
                    [RK_RechnungsLandKz] = FIRMA.Firma_LandKz.ToString.Replace("AT", "A").Replace("DE", "D") Then

                    If CBool([RP_Steuerpflichtig]) Then
                        getSachkonto = BU_KTO.SachkontoInlandSteuerpflichtig

                    Else
                        getSachkonto = BU_KTO.SachkontoInlandSteuerfrei
                    End If
                Else
                    If SQL.DLookup("[MitgliedslandEU]", "[Währungstabelle]", "[LandKz]='" & [RK_RechnungsLandKz] & "'", "FMZOLL", False) Then
                        If [RP_Steuerpflichtig] Then
                            getSachkonto = BU_KTO.SachkontoEUSteuerpflichtig
                        Else
                            getSachkonto = BU_KTO.SachkontoEUSteuerfrei
                        End If
                    Else
                        getSachkonto = BU_KTO.Sachkonto3Land
                    End If
                End If
                If getSachkonto = "" Then getSachkonto = "9999" 'DEFAULT!

            Case Else
                If [RK_RechnungsLandKz] Is Nothing OrElse [RK_RechnungsLandKz] Is DBNull.Value OrElse [RK_RechnungsLandKz].trim = "" _
                          OrElse [RK_RechnungsLandKz] = "A" _
                          OrElse [RK_RechnungsLandKz] = "AT" Then
                    If CBool([RP_Steuerpflichtig]) Then
                        getSachkonto = If(SQL.DLookup("[SachkontoInlandSteuerpflichtig]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")

                    Else
                        getSachkonto = If(SQL.DLookup("[SachkontoInlandSteuerfrei]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")
                    End If
                Else
                    If SQL.DLookup("[MitgliedslandEU]", "[Währungstabelle]", "[LandKz]='" & [RK_RechnungsLandKz] & "'", "FMZOLL", False) Then
                        If [RP_Steuerpflichtig] Then
                            getSachkonto = If(SQL.DLookup("[SachkontoEUSteuerpflichtig]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")
                        Else
                            getSachkonto = If(SQL.DLookup("[SachkontoEUSteuerfrei]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")
                        End If
                    Else
                        getSachkonto = If(SQL.DLookup("[Sachkonto3Land]", "Leistungen", "[LeistungsNr]=" & [RP_LeistungsNr], "FMZOLL"), "")
                    End If
                End If
                If getSachkonto = "" Then getSachkonto = "4000" 'DEFAULT!
        End Select
        Try

            If Firma_Id = 20 Then
                If getSachkonto = "3553" Then 'IMEX EUST
                    If RP_AufschubkontoNr Is DBNull.Value Then RP_AufschubkontoNr = ""
                    If RP_AufschubkontoNr.ToString.Contains("2719") Then
                        getSachkonto = "3550" '--> KTO M-2719
                    Else
                        getSachkonto = "3553" '--> KTO M-2718
                    End If
                End If
            End If
        Catch ex As Exception

        End Try
        getSachkonto = CInt(getSachkonto)
    End Function

    Shared Function getSQLString_SELECTForTrdInvoice(Optional Firma As Integer = -1, Optional Buchungsjahr As Integer = -1)
        getSQLString_SELECTForTrdInvoice = "SELECT Rechnungsausgang.RechnungsDatum AS RK_RechnungsDatum, Rechnungsausgang.RechnungsNr AS RK_RechnungsNr, min(Rechnungsausgang.Abfertigungsdatum) AS RK_Abfertigungsdatum, min(Rechnungsausgang.FilialenNr) AS RK_FilialenNr, 
                min(Rechnungsausgang.AbfertigungsNr) AS RK_AbfertigungsNr, min(Rechnungsausgang.UnterNr) AS RK_UnterNr, min(Rechnungsausgang.BelegartenNr) AS RK_BelegartenNr,
                 (min(cast([FilialenNr] as varchar(4))) + '/' + min(cast([AbfertigungsNr] as varchar(8))) + '/' + min(cast([UnterNr] as varchar(2)))) AS RK_Buchungstext, 
                 min(Rechnungsausgang.KundenNrZentrale) AS RK_KundenNrZentrale, min(Rechnungsausgang.RechnungsKundenNr) AS RK_RechnungsKundenNr, min(Rechnungsausgang.RechnungsLandKz) AS RK_RechnungsLandKz, 
                 min(Rechnungsausgang.RechnungsUstIdKz) AS RK_RechnungsUstIdKz, min(Rechnungsausgang.RechnungsUstIdNr) AS RK_RechnungsUstIdNr, min(Rechnungsausgang.Lastschrift+0) AS RK_Lastschrift, 
                 min(Rechnungsausgang.Steuerschlüssel) AS RK_Steuerschlüssel, min(Rechnungsausgang.[Steuersatz %]) AS RK_SteuersatzProzent, min(Rechnungsausgang.Währungscode) AS RK_Währungscode,
                  min(Rechnungsausgang.Nettozahlungsziel) AS RK_Nettozahlungsziel, min(Rechnungsausgang.Firma_ID) AS RK_Firma_ID, Sum(RechnungsausgangPositionen.SteuerpflichtigerBetrag) AS RK_SteuerpflichtigerBetrag, 
                  Sum(RechnungsausgangPositionen.SteuerfreierBetrag) AS RK_SteuerfreierBetrag
                 , (Sum(RechnungsausgangPositionen.SteuerpflichtigerBetrag)*min(Rechnungsausgang.[Steuersatz %])*100)/100 AS RK_Steuerbetrag, 
                 Sum(RechnungsausgangPositionen.SteuerpflichtigerBetrag)+Sum(RechnungsausgangPositionen.SteuerfreierBetrag)+((Sum(RechnungsausgangPositionen.SteuerpflichtigerBetrag)*min(Rechnungsausgang.[Steuersatz %])*100)/100) AS RK_Rechnungsbetrag, 
                 Count(1) AS RK_Satzzähler
                FROM Rechnungsausgang INNER JOIN RechnungsausgangPositionen ON Rechnungsausgang.RK_ID = RechnungsausgangPositionen.RK_ID
                WHERE (((Rechnungsausgang.RechnungsDatum) Is Not Null) AND ((Rechnungsausgang.RechnungsNr) Is Not Null) AND ((Rechnungsausgang.Trdin)=0)) " & If(Firma > 0, " and Firma_ID=" & Firma, "") & If(Buchungsjahr > 0, " and Buchungsjahr=" & Buchungsjahr, "") & "
                GROUP BY Rechnungsausgang.RechnungsDatum, Rechnungsausgang.RechnungsNr
                ORDER BY Rechnungsausgang.RechnungsDatum, Rechnungsausgang.RechnungsNr, min(Rechnungsausgang.Abfertigungsdatum), min(Rechnungsausgang.FilialenNr), min(Rechnungsausgang.AbfertigungsNr), min(Rechnungsausgang.UnterNr);"
    End Function


    Shared Function getSQLString_SELECTForTrdProduct(RechnungsDatum As Date, RechnungsNr As Integer, Optional Firma As Integer = -1, Optional Buchungsjahr As Integer = -1)
        getSQLString_SELECTForTrdProduct = "SELECT Rechnungsausgang.RechnungsDatum AS RP_RechnungsDatum, Rechnungsausgang.RechnungsNr AS RP_RechnungsNr, RechnungsausgangPositionen.LeistungsNr AS RP_LeistungsNr, RechnungsausgangPositionen.LeistungsBez AS RP_LeistungsBez, 
                RechnungsausgangPositionen.Steuerpflichtig AS RP_Steuerpflichtig, Sum(RechnungsausgangPositionen.SteuerpflichtigerBetrag) AS RP_SteuerpflichtigerBetrag, Sum(RechnungsausgangPositionen.SteuerfreierBetrag) AS RP_SteuerfreierBetrag, 
                min(RechnungsausgangPositionen.Belegdaten) AS RP_Belegdaten, Count(1) AS RP_Satzzähler, min(AufschubkontoNr) as AufschubkontoNr
                FROM RechnungsausgangPositionen INNER JOIN Rechnungsausgang ON RechnungsausgangPositionen.RK_ID = Rechnungsausgang.RK_ID
                GROUP BY Rechnungsausgang.RechnungsDatum, Rechnungsausgang.RechnungsNr, RechnungsausgangPositionen.LeistungsNr, RechnungsausgangPositionen.LeistungsBez, RechnungsausgangPositionen.Steuerpflichtig " & If(Firma > 0, " ,Rechnungsausgang.Firma_ID ", "") & If(Buchungsjahr > 0, " ,Rechnungsausgang.Buchungsjahr ", "") & "
                HAVING (((Rechnungsausgang.RechnungsDatum)='" & RechnungsDatum.ToShortDateString & "') AND ((Rechnungsausgang.RechnungsNr)=" & RechnungsNr & ")) " & If(Firma > 0, " and Rechnungsausgang.Firma_ID=" & Firma, "") & If(Buchungsjahr > 0, " and Rechnungsausgang.Buchungsjahr=" & Buchungsjahr, "") & "
                ORDER BY Rechnungsausgang.RechnungsDatum, Rechnungsausgang.RechnungsNr, RechnungsausgangPositionen.LeistungsNr, RechnungsausgangPositionen.LeistungsBez, RechnungsausgangPositionen.Steuerpflichtig;"
    End Function
End Class