Imports System.Text.RegularExpressions

Public Class cSyska_Interface
    Shared SQL As New VERAG_PROG_ALLGEMEIN.SQL
    Shared fmt = "#######0.00"

    'STAMMDATEN
    Shared Function getStammdaten(FiBuSchnittstelleNr) As DataTable
        Dim sqlStr = " Select   KundenNrZentrale As [Konto-Nr],isnull([Name 1],'') as Name,isnull([Name 2],'') as [Name2],(isnull(UstIdKz,'') + isnull(UstIdNr,'')) as [UST-Id-Nummer],isnull(UstIdGeprüft,'') as [UID-Datum],[Strasse],Adressen.landkz  ,PLZ,LTRIM([Ort]) as Ort,isnull(BLZ,'') as [BLZ],isnull(KTO,'') as [KTO], CASE WHEN CAST(Zahlungsziel as VARCHAR(3)) ='0' THEN '' ELSE CAST(Zahlungsziel as VARCHAR(3)) END   as [ZZiel],/*'' as [SPz],'' as [STg],*/isnull([E-Mail],'') as [mail],'' AS Info1,'' AS Inf2, Zahlungsziel2, Zahlungsziel3,[E-Mail],[Telefon] ,Telefax "
        sqlStr &= "  ,Ordnungsbegriff ,Kunden.Währungscode,Anrede,Ansprechpartner,Lastschrift,Kunden.[Eingegeben am] as EingegebenAm"
        sqlStr &= "  FROM Adressen INNER JOIN Kunden ON Kundennr=AdressenNr "
        sqlStr &= " LEFT JOIN tblKundenErweitert ON KundenNr=kde_KundenNr "
        sqlStr &= " LEFT JOIN [Länderverzeichnis für die Außenhandelsstatistik] as St ON St.LandKz=Adressen.LandKz "
        sqlStr &= " LEFT JOIN Währungstabelle ON St.LandNr = Währungstabelle.Währungsschlüssel "
        sqlStr &= " WHERE FiBuSchnittstelle=1 AND Auswahl='A' AND FiBuSchnittstelleNr='" & FiBuSchnittstelleNr & "' "
        sqlStr &= " Order by [Konto-Nr] "
        Return SQL.loadDgvBySql(sqlStr, "FMZOLL")
    End Function

    '    Shared Function getStammdatenTEST(FiBuSchnittstelleNr) As DataTable
    '        Dim sqlStr = " Select   KundenNrZentrale As [Konto-Nr],isnull([Name 1],'') as Name,isnull([Name 2],'') as [Name2],(isnull(UstIdKz,'') + isnull(UstIdNr,'')) as [UST-Id-Nummer],isnull(UstIdGeprüft,'') as [UID-Datum],[Strasse],Adressen.landkz  ,PLZ,LTRIM([Ort]) as Ort,isnull(BLZ,'') as [BLZ],isnull(KTO,'') as [KTO], CASE WHEN CAST(Zahlungsziel as VARCHAR(3)) ='0' THEN '' ELSE CAST(Zahlungsziel as VARCHAR(3)) END   as [ZZiel],/*'' as [SPz],'' as [STg],*/isnull([E-Mail],'') as [mail],'' AS Info1,'' AS Inf2, Zahlungsziel2, Zahlungsziel3,[E-Mail],[Telefon] ,Telefax "
    '        sqlStr &= "  ,Ordnungsbegriff ,Kunden.Währungscode,Anrede,Ansprechpartner,Lastschrift,Kunden.[Eingegeben am] as EingegebenAm"
    '        sqlStr &= "  FROM Adressen INNER JOIN Kunden ON Kundennr=AdressenNr "
    '        sqlStr &= " LEFT JOIN tblKundenErweitert ON KundenNr=kde_KundenNr "
    '        sqlStr &= " LEFT JOIN [Länderverzeichnis für die Außenhandelsstatistik] as St ON St.LandKz=Adressen.LandKz "
    '        sqlStr &= " LEFT JOIN Währungstabelle ON St.LandNr = Währungstabelle.Währungsschlüssel "
    '        'sqlStr &= " WHERE FiBuSchnittstelle=1 AND Auswahl='A' AND FiBuSchnittstelleNr='" & FiBuSchnittstelleNr & "' "
    '        sqlStr &= " WHERE KundenNrZentrale IN (750750,
    '765729,
    '765730,
    '765731,
    '765732,
    '765733,
    '765734,
    '765735,
    '765736,
    '765737,
    '765738,
    '765739,
    '765740,
    '765741,
    '765742,
    '765743,
    '765744,
    '765745,
    '765746
    ') "
    '        sqlStr &= " Order by [Konto-Nr] "
    '        Return SQL.loadDgvBySql(sqlStr, "FMZOLL")
    '    End Function

    Shared Function updateFibu(FiBuSchnittstelleNr) As DataTable
        Dim sqlStr = " UPDATE Kunden "
        sqlStr &= " SET FiBuSchnittstelle = '0' "
        sqlStr &= " FROM Adressen INNER JOIN Kunden ON Kundennr=AdressenNr "
        sqlStr &= " LEFT JOIN tblKundenErweitert ON KundenNr=kde_KundenNr "
        sqlStr &= " WHERE FiBuSchnittstelle=1 AND Auswahl='A' AND FiBuSchnittstelleNr='" & FiBuSchnittstelleNr & "' "
        Return SQL.loadDgvBySql(sqlStr, "FMZOLL")
    End Function


    Public Shared Function getPersonenKto(row As DataRow) As String

        Dim LandKz = row("LandKz")
        Dim Gegenkontonummer = ""
        Dim Gegenkontonummer2 = ""
        If LandKz Is DBNull.Value Or LandKz.trim = "" Or LandKz = "A" Then
            Gegenkontonummer = "4000" ' Erl. 20%
            Gegenkontonummer2 = "4000" ' Erl. 20%
        Else
            If CBool(SQL.DLookup("[MitgliedslandEU]", "[Währungstabelle]", "[LandKz]='" & LandKz & "'", "FMZOLL", False)) Then
                Gegenkontonummer = "4020" ' Erl. 0% EU
                Gegenkontonummer2 = "4020" ' Erl. 0% EU
            Else
                Gegenkontonummer = "4021" ' Erl. 0% 3.Land
                Gegenkontonummer2 = "4021" ' Erl. 0% 3.Land
            End If
        End If

        Dim cleanStringName As String = Regex.Replace(row("Name"), "[^A-Za-z0-9\-/]", "").Replace(" ", "").ToUpper

        Dim Lastschrift = CBool(row("Lastschrift"))
        'If FormatStringSYS(row("Name2"), 50) <> "" Then
        '    MsgBox(FormatStringSYS(row("Name2"), 50) & vbTab)
        'End If
        getPersonenKto = ""
        getPersonenKto &= row("Konto-Nr") & vbTab
        getPersonenKto &= FormatStringSYS(cleanStringName, 2) & row("Konto-Nr") & vbTab
        getPersonenKto &= FormatStringSYS(row("Name"), 50) & vbTab
        getPersonenKto &= FormatStringSYS(row("Name2"), 50) & vbTab
        getPersonenKto &= FormatStringSYS(row("Strasse"), 50) & vbTab
        getPersonenKto &= FormatStringSYS(row("PLZ"), 20) & vbTab
        getPersonenKto &= FormatStringSYS(row("Ort"), 50) & vbTab
        getPersonenKto &= cProgramFunctions.getISO2Land(FormatStringSYS(LandKz, 5)) & vbTab
        getPersonenKto &= CDate(row("EingegebenAm")).ToShortDateString & vbTab 'Eröffnungsdatum
        getPersonenKto &= Gegenkontonummer & vbTab
        getPersonenKto &= vbTab 'Bankname
        getPersonenKto &= If(Lastschrift, row("BLZ"), "") & vbTab
        getPersonenKto &= If(Lastschrift, row("KTO"), "") & vbTab
        getPersonenKto &= "00" & vbTab 'Skontotage
        getPersonenKto &= If(row("ZZiel") IsNot DBNull.Value AndAlso row("ZZiel") <> String.Empty, CDbl(row("ZZiel")).ToString("00"), "") & vbTab
        getPersonenKto &= "00,00" & vbTab 'Skonto
        getPersonenKto &= "01" & vbTab 'Mahnkennung
        getPersonenKto &= FormatStringSYS(row("UST-Id-Nummer"), 50) & vbTab
        getPersonenKto &= vbTab
        getPersonenKto &= row("Währungscode") & vbTab
        getPersonenKto &= vbTab 'Forderungsonto
        getPersonenKto &= vbTab
        getPersonenKto &= Gegenkontonummer2 & vbTab 'Platzhalter??
        getPersonenKto &= FormatStringSYS(row("Anrede") & " " & row("Ansprechpartner"), 100) & vbTab
        getPersonenKto &= vbTab
        getPersonenKto &= FormatStringSYS(row("Telefon")) & vbTab
        getPersonenKto &= FormatStringSYS(row("Telefax")) & vbTab
        getPersonenKto &= FormatStringSYS(row("E-Mail")) & vbTab
        getPersonenKto &= vbTab
        '  getPersonenKto &= vbTab

    End Function


    Public Shared Function genDatensatz_Stammdaten(FiBuSchnittstelleNr As Integer, Optional OpenFile As Boolean = False) As Boolean '  Optional OpenFile = False, Optional boolKunden = True, Optional boolBuchungen = True ) As Boolean
        Try

            Dim bool_DatenVorhanden As Boolean = False
            Dim Geschaeftsjahr = Now.Year 'If(Now.Month = 1, Now.Year - 1, Now.Year) --> Bei IMEX ist das GJ=Wirtschaftsjahr
            Dim FIRMA As New VERAG_PROG_ALLGEMEIN.cFirmen(FiBuSchnittstelleNr)

            'DATEIPFAD für Stammdaten
            '-------------------------------------------------------------------------------------------
            Dim pathArchivKD = "\\datenarchiv\Datenarchiv\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\Archiv\"
            Dim pathKD = "\\syncluster01.verag.ost.dmn\F\FIBU\Syska\" & FIRMA.Firma_ID & "\"
            'pathKD = pathArchivKD 'TEST

            If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then
                pathArchivKD = "\\datenarchiv\Datenarchiv\DATENARCHIV_TESTSYSTEM\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\Archiv\"
                pathKD = "\\datenarchiv\Datenarchiv\DATENARCHIV_TESTSYSTEM\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\"

                'path = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getRootDir
                'pathArchivKD = ""
            End If
            If Not System.IO.Directory.Exists(pathKD) Then System.IO.Directory.CreateDirectory(pathKD)
            If Not System.IO.Directory.Exists(pathArchivKD) Then System.IO.Directory.CreateDirectory(pathArchivKD)
            '-------------------------------------------------------------------------------------------


            If True Then 'boolKunden Then
                '----------------- STAMMDATEN  -----------------
                Dim dt_Stamm As DataTable = getStammdaten(FiBuSchnittstelleNr)
                If dt_Stamm IsNot Nothing AndAlso dt_Stamm.Rows.Count > 0 Then

                    Dim fileKD As System.IO.StreamWriter
                    Dim DateinameKD = "AVISO_DEBI_" & Now.ToString("ddMMyyyy_HHmm") & ".txt"
                    fileKD = My.Computer.FileSystem.OpenTextFileWriter(pathKD & DateinameKD, True, System.Text.Encoding.GetEncoding("iso-8859-15"))


                    'fileKD.WriteLine(genStammdatenBeginn())



                    initKDNr(dt_Stamm)
                    For Each r In dt_Stamm.Rows
                        fileKD.WriteLine(getPersonenKto(r))
                    Next
                    bool_DatenVorhanden = True


                    fileKD.Close()

                    'In Archiv sichern
                    If pathArchivKD <> "" Then
                        If Not System.IO.Directory.Exists(pathArchivKD) Then System.IO.Directory.CreateDirectory(pathArchivKD)
                        If pathKD <> pathArchivKD Then System.IO.File.Copy(pathKD & DateinameKD, pathArchivKD & DateinameKD)
                    End If

                    If bool_DatenVorhanden Then
                        If OpenFile Then Process.Start(pathKD & DateinameKD)
                    Else
                        System.IO.File.Delete(pathKD & DateinameKD)
                    End If

                    'NOCH NICHT!!!
                    updateFibu(FiBuSchnittstelleNr) ' UPDATE FiBuSchnittstelle --> 0

                End If
            End If



        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
        End Try
        Return False
    End Function


    'Public Shared Function genDatensatz_StammdatenTEST(FiBuSchnittstelleNr As Integer, Optional OpenFile As Boolean = False) As Boolean '  Optional OpenFile = False, Optional boolKunden = True, Optional boolBuchungen = True ) As Boolean
    '    Try

    '        Dim bool_DatenVorhanden As Boolean = False
    '        Dim Geschaeftsjahr = Now.Year 'If(Now.Month = 1, Now.Year - 1, Now.Year) --> Bei IMEX ist das GJ=Wirtschaftsjahr
    '        Dim FIRMA As New VERAG_PROG_ALLGEMEIN.cFirmen(FiBuSchnittstelleNr)

    '        'DATEIPFAD für Stammdaten
    '        '-------------------------------------------------------------------------------------------
    '        Dim pathArchivKD = "\\datenarchiv\Datenarchiv\DATENARCHIV_TESTSYSTEM\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\Archiv\"
    '        Dim pathKD = "\\datenarchiv\Datenarchiv\DATENARCHIV_TESTSYSTEM\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\"

    '        If Not System.IO.Directory.Exists(pathKD) Then System.IO.Directory.CreateDirectory(pathKD)
    '        If Not System.IO.Directory.Exists(pathArchivKD) Then System.IO.Directory.CreateDirectory(pathArchivKD)
    '        '-------------------------------------------------------------------------------------------


    '        If True Then 'boolKunden Then
    '            '----------------- STAMMDATEN  -----------------
    '            Dim dt_Stamm As DataTable = getStammdatenTEST(FiBuSchnittstelleNr)
    '            If dt_Stamm IsNot Nothing AndAlso dt_Stamm.Rows.Count > 0 Then

    '                Dim fileKD As System.IO.StreamWriter
    '                Dim DateinameKD = "AVISO_DEBI_" & Now.ToString("ddMMyyyy_HHmm") & ".txt"
    '                fileKD = My.Computer.FileSystem.OpenTextFileWriter(pathKD & DateinameKD, True, System.Text.Encoding.GetEncoding("iso-8859-15"))


    '                'fileKD.WriteLine(genStammdatenBeginn())



    '                initKDNr(dt_Stamm)
    '                For Each r In dt_Stamm.Rows
    '                    fileKD.WriteLine(getPersonenKto(r))
    '                Next
    '                bool_DatenVorhanden = True


    '                fileKD.Close()

    '                'In Archiv sichern
    '                If pathArchivKD <> "" Then
    '                    If Not System.IO.Directory.Exists(pathArchivKD) Then System.IO.Directory.CreateDirectory(pathArchivKD)
    '                    If pathKD <> pathArchivKD Then System.IO.File.Copy(pathKD & DateinameKD, pathArchivKD & DateinameKD)
    '                End If

    '                If bool_DatenVorhanden Then
    '                    If OpenFile Then Process.Start(pathKD & DateinameKD)
    '                Else
    '                    System.IO.File.Delete(pathKD & DateinameKD)
    '                End If

    '                'NOCH NICHT!!!
    '                ' updateFibu(FiBuSchnittstelleNr) ' UPDATE FiBuSchnittstelle --> 0

    '            End If
    '        End If



    '    Catch ex As Exception
    '          VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
    '    End Try
    '    Return False
    'End Function



    Public Shared Function genDatensatz_ALL(Optional OpenFile As Boolean = False, Optional boolKunden As Boolean = True, Optional boolBuchungen As Boolean = True, Optional WdhDateiname As String = "") As Boolean
        genDatensatz_ALL = True
        If boolKunden Then
            ' If Not genDatensatz_Stammdaten(OpenFile) Then genDatensatz_ALL = False
            If Not genDatensatz_Stammdaten(1, OpenFile) Then genDatensatz_ALL = False
            If Not genDatensatz_Stammdaten(7, OpenFile) Then genDatensatz_ALL = False
            If Not genDatensatz_Stammdaten(4, OpenFile) Then genDatensatz_ALL = False
            If Not genDatensatz_Stammdaten(11, OpenFile) Then genDatensatz_ALL = False
            If Not genDatensatz_Stammdaten(17, OpenFile) Then genDatensatz_ALL = False
            If Not genDatensatz_Stammdaten(19, OpenFile) Then genDatensatz_ALL = False
        End If
        If boolBuchungen Then
            If Not genDatensatz_Buchungen(1, OpenFile, WdhDateiname) Then genDatensatz_ALL = False
            If Not genDatensatz_Buchungen(4, OpenFile, WdhDateiname) Then genDatensatz_ALL = False
            If Not genDatensatz_Buchungen(7, OpenFile, WdhDateiname) Then genDatensatz_ALL = False
            If Not genDatensatz_Buchungen(11, OpenFile, WdhDateiname) Then genDatensatz_ALL = False
            If Not genDatensatz_Buchungen(17, OpenFile, WdhDateiname) Then genDatensatz_ALL = False
            If Not genDatensatz_Buchungen(19, OpenFile, WdhDateiname) Then genDatensatz_ALL = False
            '   If Not genDatensatzCSV_Buchungen(XX, OpenFile) Then genDatensatzCSV_ALL = False
            ' If Not genDatensatzCSV_Buchungen(XX, OpenFile) Then genDatensatzCSV_ALL = False
        End If
    End Function

    Public Shared Function genDatensatz_Buchungen(ByRef Firma_ID As Integer, Optional OpenFile As Boolean = False, Optional WdhDateiname As String = "", Optional ambargubuchungen As Boolean = False, Optional ambarKreditor As String = "") As Boolean '  Optional OpenFile = False, Optional boolKunden = True, Optional boolBuchungen = True ) As Boolean
        Try
            Dim FIRMA As New VERAG_PROG_ALLGEMEIN.cFirmen(Firma_ID)

            Dim bool_DatenVorhanden As Boolean = False
            Dim Geschaeftsjahr = Now.Year 'If(Now.Month = 1, Now.Year - 1, Now.Year) --> Bei IMEX ist das GJ=Wirtschaftsjahr

            'DATEIPFAD für Buchungsdaten
            '-------------------------------------------------------------------------------------------
            Dim pathArchiv = "\\datenarchiv\Datenarchiv\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\Archiv\"
            Dim path = "\\syncluster01.verag.ost.dmn\F\FIBU\Syska\" & FIRMA.Firma_ID & "\"
            'pathKD = pathArchivKD 'TEST

            If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then
                pathArchiv = "\\datenarchiv\Datenarchiv\DATENARCHIV_TESTSYSTEM\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\Archiv\"
                path = "\\datenarchiv\Datenarchiv\DATENARCHIV_TESTSYSTEM\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\"

                'path = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getRootDir
                'pathArchivKD = ""
            End If

            If Not System.IO.Directory.Exists(path) Then System.IO.Directory.CreateDirectory(path)
            If Not System.IO.Directory.Exists(pathArchiv) Then System.IO.Directory.CreateDirectory(pathArchiv)

            '-------------------------------------------------------------------------------------------

            '----------------- Buchungssätze -----------------
            If True Then 'boolBuchungen Then
                If WdhDateiname = "" AndAlso Not ambargubuchungen Then TrdInvoice_FUNCTIONS.TrdinSchreiben(FIRMA.Firma_ID) 'Lädt die Daten aus der Tabelle Rechnungsausgang in die Tabelle trdInvoice (nur für 20 = IMEX )
                Dim dt_Buchungen_ALL As DataTable = getBuchungen(FIRMA.Firma_ID, WdhDateiname, ambargubuchungen, ambarKreditor)
                '    MsgBox(WdhDateiname & " -  " & dt_Buchungen.Rows.Count)
                If dt_Buchungen_ALL IsNot Nothing AndAlso dt_Buchungen_ALL.Rows.Count > 0 Then

                    Dim ROWS_BV = dt_Buchungen_ALL.AsEnumerable().Where(Function(r) r.Field(Of Boolean)("BV") = True)
                    Dim ROWS_not_BV = dt_Buchungen_ALL.AsEnumerable().Where(Function(r) r.Field(Of Boolean)("BV") = False)

                    Dim dt_Buchungen_BV As DataTable = If(ROWS_BV.Any(), ROWS_BV.CopyToDataTable(), dt_Buchungen_ALL.Clone())
                    Dim dt_Buchungen As DataTable = If(ROWS_not_BV.Any(), ROWS_not_BV.CopyToDataTable(), dt_Buchungen_ALL.Clone())


                    Try
                        '2 Dateien Belege betreffend BV und andere Belege

                        If dt_Buchungen.Rows.Count > 0 Then
                            createBuchungszeilen(dt_Buchungen, ambargubuchungen, FIRMA, WdhDateiname, Geschaeftsjahr, path, pathArchiv, ambarKreditor, bool_DatenVorhanden, OpenFile, False)
                        End If
                        If dt_Buchungen_BV.Rows.Count > 0 Then
                            createBuchungszeilen(dt_Buchungen_BV, ambargubuchungen, FIRMA, WdhDateiname, Geschaeftsjahr, path, pathArchiv, ambarKreditor, bool_DatenVorhanden, OpenFile, True)
                        End If


                    Catch ex As Exception
                        VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
                    End Try

                End If
            End If
            '----------------------------------



        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
        End Try
        Return False
    End Function

    Private Shared Function createBuchungszeilen(dt As DataTable, ambargubuchungen As Boolean, firma As cFirmen, WdhDateiname As String, Geschaeftsjahr As Integer, path As String, pathArchiv As String, ambarKreditor As String, bool_DatenVorhanden As Boolean, OpenFile As Boolean, onlyBarverkauf As Boolean)

        Dim file As System.IO.StreamWriter
        Dim Dateiname = IIf(ambargubuchungen, "GS_AMBAR_" & ambarKreditor & "_", "AVISO_BUBE_") & IIf(onlyBarverkauf, "BV_", "") & Now.ToString("ddMMyyyy_HHmm") & ".txt"
        file = My.Computer.FileSystem.OpenTextFileWriter(path & Dateiname, True, System.Text.Encoding.GetEncoding("iso-8859-15"))

        Dim SummeBuchungen As Double = 0


        For Each r In dt.Rows

            Dim curDifferenzbetrag As Double = 0
            If r("WährungFremd") Is DBNull.Value Then
                curDifferenzbetrag = Math.Round(If(r("RechnungsbetragLokal") < 0, 0 - r("RechnungsbetragLokal"), r("RechnungsbetragLokal")), 2)
            Else
                curDifferenzbetrag = Math.Round(If(r("RechnungsbetragFremd") < 0, 0 - r("RechnungsbetragFremd"), r("RechnungsbetragFremd")), 2)
            End If

            If (r("BelegartenNr") = 70 Or ambargubuchungen And r("BelegartenNr") = 71) Then 'RECHNUNG ---> Immer am Anfang
                file.WriteLine(genBuchungsZeileSum(r, SummeBuchungen, Geschaeftsjahr, firma, ambargubuchungen))
            End If
            Dim dt_BuchungenZeilen As DataTable

            If Not ambargubuchungen Then
                dt_BuchungenZeilen = getBuchungenZeilen(firma.Firma_ID, r("Rechnungsnummer"), r("Rechnungsdatum"), r("Source"), WdhDateiname)
            Else
                dt_BuchungenZeilen = getBuchungenZeilenAMBAR(r("Rechnungsnummer"), r("Rechnungsdatum"), r("Source"), WdhDateiname)
            End If

            If dt_BuchungenZeilen IsNot Nothing AndAlso dt_BuchungenZeilen.Rows.Count > 0 Then
                For Each rz In dt_BuchungenZeilen.Rows
                    file.WriteLine(genBuchungsZeile(rz, SummeBuchungen, Geschaeftsjahr, firma, curDifferenzbetrag, ambargubuchungen, r("Buchungstext"))) ' BuchungsZeilen...
                Next
            End If
            If curDifferenzbetrag <> 0 AndAlso Not (r("BelegartenNr") = 31 Or r("BelegartenNr") = 30) Then 'Differenz --> Ausgelich auf Diff.Konto -> nicht bei EINZAHLUNGEN/AUSZAHLUNGEN
                file.WriteLine(genBuchungsZeileDiffBetrag(r, SummeBuchungen, Geschaeftsjahr, firma, curDifferenzbetrag))
            End If
            If (r("BelegartenNr") = 71 Or r("BelegartenNr") = 31 Or r("BelegartenNr") = 30) And Not ambargubuchungen Then 'GUTSCHRIFT|EINNAHNE|AUSGABE ---> Immer am Schluss
                file.WriteLine(genBuchungsZeileSum(r, SummeBuchungen, Geschaeftsjahr, firma, ambargubuchungen))
            End If
        Next

        For Each r In dt.Rows
            If r("VZ") = 1 Then
                file.WriteLine(genBuchungsZeileVZ(r, SummeBuchungen, Geschaeftsjahr, firma, ambargubuchungen))
            End If
        Next


        bool_DatenVorhanden = True

        Dim varDateiname As String = IIf(ambargubuchungen, "AmbDateiname", "TrdinDateiname")
        Dim whereAmbarBuchungen As String = ""

        If ambargubuchungen And ambarKreditor = "AG" Then
            whereAmbarBuchungen = "AND RechnungsKundenNr = 3013401 and RechnungsUstIdNr = 'U53187000' And BelegartenNr = 71"
        ElseIf ambargubuchungen And ambarKreditor = "CS" Then
            whereAmbarBuchungen = "AND RechnungsKundenNr = 3017683 and RechnungsUstIdNr = 'U68374109' And BelegartenNr = 71"

        End If

        If WdhDateiname = "" Then
            SQL.doSQL("update  [tblTrdinInvoice] Set " & varDateiname & "='" & Now.ToString("ddMMyyyyHHmm") & "' WHERE [Firma_ID] = " & firma.Firma_ID & " AND " & varDateiname & " is null and isnull(BV, 0) = " & IIf(onlyBarverkauf, "1", "0") & whereAmbarBuchungen, "FMZOLL")
        Else
            SQL.doSQL("update  [tblTrdinInvoice] Set " & varDateiname & "='" & Now.ToString("ddMMyyyyHHmm") & "' WHERE [Firma_ID] = " & firma.Firma_ID & " AND " & varDateiname & " ='" & WdhDateiname & "' and isnull(BV, 0) = " & IIf(onlyBarverkauf, "1", "0") & whereAmbarBuchungen, "FMZOLL")
        End If

        file.Close()

        If pathArchiv <> "" Then
            If Not System.IO.Directory.Exists(pathArchiv) Then System.IO.Directory.CreateDirectory(pathArchiv)
            If path <> pathArchiv Then System.IO.File.Copy(path & Dateiname, pathArchiv & Dateiname)
        End If

        If bool_DatenVorhanden Then
            If OpenFile Then Process.Start(path & Dateiname)
        Else
            System.IO.File.Delete(path & Dateiname)
        End If


    End Function

    'Public Shared Function genDatensatz_BuchungenTEST(ByRef Firma_ID As Integer, Optional OpenFile As Boolean = False) As Boolean '  Optional OpenFile = False, Optional boolKunden = True, Optional boolBuchungen = True ) As Boolean
    '    Try
    '        Dim FIRMA As New VERAG_PROG_ALLGEMEIN.cFirmen(Firma_ID)

    '        Dim bool_DatenVorhanden As Boolean = False
    '        Dim Geschaeftsjahr = Now.Year 'If(Now.Month = 1, Now.Year - 1, Now.Year) --> Bei IMEX ist das GJ=Wirtschaftsjahr

    '        'DATEIPFAD für Buchungsdaten
    '        '-------------------------------------------------------------------------------------------
    '        Dim pathArchiv = "\\datenarchiv\Datenarchiv\DATENARCHIV_TESTSYSTEM\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\Archiv\"
    '        Dim path = "\\datenarchiv\Datenarchiv\DATENARCHIV_TESTSYSTEM\SYSKA\" & FIRMA.Firma_ID & "\" & Now.Year & "\" & Now.Date.ToShortDateString & "\"


    '        If Not System.IO.Directory.Exists(path) Then System.IO.Directory.CreateDirectory(path)
    '        If Not System.IO.Directory.Exists(pathArchiv) Then System.IO.Directory.CreateDirectory(pathArchiv)
    '        '-------------------------------------------------------------------------------------------




    '        '----------------- Buchungssätze -----------------
    '        If True Then 'boolBuchungen Then
    '            '  TrdInvoice_FUNCTIONS.TrdinSchreiben(FIRMA.Firma_ID) 'Lädt die Daten aus der Tabelle Rechnungsausgang in die Tabelle trdInvoice (nur für 20 = IMEX )
    '            Dim dt_Buchungen As DataTable = getBuchungenTEST(FIRMA.Firma_ID)
    '            If dt_Buchungen IsNot Nothing AndAlso dt_Buchungen.Rows.Count > 0 Then
    '                Try
    '                    Dim file As System.IO.StreamWriter
    '                    Dim Dateiname = "AVISO_BUBE_" & Now.ToString("ddMMyyyy_HHmm") & ".txt"
    '                    file = My.Computer.FileSystem.OpenTextFileWriter(path & Dateiname, True, System.Text.Encoding.GetEncoding("iso-8859-15"))

    '                    '   initKDNr(dt_Buchungen)
    '                    Dim SummeBuchungen As Double = 0
    '                    'file.WriteLine(genBuchungenBeginn()) 'not needed
    '                    For Each r In dt_Buchungen.Rows


    '                        Dim curDifferenzbetrag As Double = 0
    '                        If r("WährungFremd") Is DBNull.Value Then
    '                            curDifferenzbetrag = Math.Round(If(r("RechnungsbetragLokal") < 0, 0 - r("RechnungsbetragLokal"), r("RechnungsbetragLokal")), 2)
    '                        Else
    '                            curDifferenzbetrag = Math.Round(If(r("RechnungsbetragFremd") < 0, 0 - r("RechnungsbetragFremd"), r("RechnungsbetragFremd")), 2)
    '                        End If

    '                        If r("BelegartenNr") = 70 Then 'RECHNUNG ---> Immer am Anfang
    '                            file.WriteLine(genBuchungsZeileSum(r, SummeBuchungen, Geschaeftsjahr, FIRMA))
    '                        End If
    '                        Dim dt_BuchungenZeilen As DataTable = getBuchungenZeilenTEST(FIRMA.Firma_ID, r("Rechnungsnummer"), r("Rechnungsdatum"))
    '                        If dt_BuchungenZeilen IsNot Nothing AndAlso dt_BuchungenZeilen.Rows.Count > 0 Then
    '                            For Each rz In dt_BuchungenZeilen.Rows
    '                                file.WriteLine(genBuchungsZeile(rz, SummeBuchungen, Geschaeftsjahr, FIRMA, curDifferenzbetrag)) ' BuchungsZeilen...
    '                            Next
    '                        End If
    '                        If curDifferenzbetrag <> 0 Then 'Differenz --> Ausgelich auf Diff.Konto
    '                            file.WriteLine(genBuchungsZeileDiffBetrag(r, SummeBuchungen, Geschaeftsjahr, FIRMA, curDifferenzbetrag))
    '                        End If
    '                        If r("BelegartenNr") = 71 Then 'GUTSCHRIFT ---> Immer am Schluss
    '                            file.WriteLine(genBuchungsZeileSum(r, SummeBuchungen, Geschaeftsjahr, FIRMA))
    '                        End If
    '                    Next
    '                    '   file.WriteLine(genBuchungenEnd(SummeBuchungen))
    '                    bool_DatenVorhanden = True

    '                    'Update Filename TrdIn 'NOCH NICHT!!!!
    '                    ' SQL.doSQL("update  [tblTrdinInvoice] Set TrdinDateiname='" & Now.ToString("ddMMyyyyHHmm") & "' WHERE [Firma_ID] = " & FIRMA.Firma_ID & " AND TrdinDateiname is null ", "FMZOLL")

    '                    file.Close()

    '                    'In Archiv sichern
    '                    If pathArchiv <> "" Then
    '                        If Not System.IO.Directory.Exists(pathArchiv) Then System.IO.Directory.CreateDirectory(pathArchiv)
    '                        If path <> pathArchiv Then System.IO.File.Copy(path & Dateiname, pathArchiv & Dateiname)
    '                    End If

    '                    If bool_DatenVorhanden Then
    '                        If OpenFile Then Process.Start(path & Dateiname)
    '                    Else
    '                        System.IO.File.Delete(path & Dateiname)
    '                    End If

    '                Catch ex As Exception
    '                      VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
    '                End Try

    '            End If
    '        End If
    '        '----------------------------------



    '    Catch ex As Exception
    '          VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
    '    End Try
    '    Return False
    'End Function
    Shared Function FormatStringSYS(s As Object, Optional length As Integer = -1, Optional defaultValue As String = "") As String
        If s Is Nothing Then Return defaultValue
        If s Is DBNull.Value Then Return defaultValue
        FormatStringSYS = s.ToString.Replace(";", ",").Trim
        'FormatStringSYS = s.ToString.Replace(",", "")
        'FormatStringSYS = s.ToString.Replace("""", "\22")
        If length > 0 Then
            If FormatStringSYS.Length > length Then FormatStringSYS = FormatStringSYS.Substring(0, length)
        End If
    End Function

    Shared Function FormatStringDbl(s As Object, Optional Nachkommastellen As String = "2", Optional defaultValue As String = "") As String
        If s Is Nothing Then Return defaultValue
        If s Is DBNull.Value Then Return defaultValue
        If IsNumeric(s) Then Return CDbl(s).ToString("N" & Nachkommastellen)
        Return s.ToString
    End Function
    Shared Function getBuchungen(Firma_ID As Integer, Optional WdhDateiname As String = "", Optional ambargubuchungen As Boolean = False, Optional ambarKreditor As String = "") As DataTable

        Dim where As String = ""

        If Not ambargubuchungen Then
            where = "WHERE Firma_ID ='" & Firma_ID & "'  AND " & If(WdhDateiname = "", " TrdinDateiname Is Null ", " TrdinDateiname ='" & WdhDateiname & "' ") & " "
        Else
            If ambarKreditor = "AG" Then
                where = "WHERE Firma_ID ='24'  and RechnungsKundenNr = 3013401 and RechnungsUstIdNr = 'U53187000' And BelegartenNr = 71  AND " & If(WdhDateiname = "", " AmbDateiname Is Null ", " AmbDateiname ='" & WdhDateiname & "' ") & " "
            ElseIf ambarKreditor = "CS" Then
                where = "WHERE Firma_ID ='24'  and RechnungsKundenNr = 3017683 and RechnungsUstIdNr = 'U68374109' And BelegartenNr = 71  AND " & If(WdhDateiname = "", " AmbDateiname Is Null ", " AmbDateiname ='" & WdhDateiname & "' ") & " "
            End If

        End If

        Dim kundennr = IIf(Not ambargubuchungen, "min(KundenNrZentrale)", "'725012'") 'fixe Debitorennr für AMBAR - VERAG Buchungen


        Dim sqlStr = " SELECT IVO.Rechnungsdatum,IVO.Rechnungsnummer,min(Speditionsbuch) as Speditionsbuch	,min(FilialenNr) as FilialenNr,min(AbfertigungsNr) as AbfertigungsNr,min(UnterNr) as UnterNr,min(Abfertigungsdatum) as Abfertigungsdatum,min(BelegartenNr) as BelegartenNr
                        ," & kundennr & " as [KundenNrZentrale],min(RechnungsKundenNr) as RechnungsKundenNr,min(RechnungsLandKz) as RechnungsLandKz,min(RechnungsUstIdKz) as RechnungsUstIdKz,min(RechnungsUstIdNr) as RechnungsUstIdNr
                        ,min(Lastschrift+0) as Lastschrift,min(Steuerschlüssel) as Steuerschlüssel,min([Steuersatz %]) as Steuersatz,min(WährungLokal) as WährungLokal,min(SteuerbetragLokal) as SteuerbetragLokal,min(RechnungsbetragLokal) as RechnungsbetragLokal
                        ,min(WährungFremd) as WährungFremd,min(SteuerbetragFremd) as SteuerbetragFremd,min(RechnungsbetragFremd) as RechnungsbetragFremd,min(TrdinDateiname) as TrdinDateiname,min(Abgleich_op_debitor+0) as Abgleich_op_debitor
                        ,min(Nettozahlungsziel) as Nettozahlungsziel,min(Firma_ID) as Firma_ID,min(UStVAn_ID)  as UStVAn_ID	  /*,Leistungsnummer,Leistungsbezeichnung,Steuerpflichtig*/,sum(PROD.SteuerpflichtigerBetragLokal) as SteuerpflichtigerBetragLokal
                        ,sum(PROD.SteuerfreierBetragLokal) as SteuerfreierBetragLokal,sum(PROD.SteuerpflichtigerBetragFremd) as SteuerpflichtigerBetragFremd,sum(PROD.SteuerfreierBetragFremd) as SteuerfreierBetragFremd,min(Belegdaten) as Belegdaten
                        ,min(Sachkonto) as Sachkonto,min(Buchungstext) as Buchungstext,Sum(PROD.[SteuerpflichtigerBetragLokal] + PROD.[SteuerfreierBetragLokal]) As BetragLokal, Sum(PROD.[SteuerpflichtigerBetragFremd]+PROD.[SteuerfreierBetragFremd]) As BetragFremd, MAX(VZ) as VZ, SUM(isnull(PROD.VZBetrag,0)) as VZBetrag, IVO.BV, IVO.Source
                        
                       FROM VERAG.dbo.tblTrdinInvoice as IVO left JOIN tblTrdinProduct as PROD on IVO.Rechnungsnummer=PROD.Rechnungsnummer and IVO.Rechnungsdatum=PROD.Rechnungsdatum and IVO.Source = PROD.Source
                       " & where & " 
                       group by Firma_id, IVO.Rechnungsnummer,IVO.rechnungsdatum, IVO.BV, IVO.Source/*,Leistungsnummer,Leistungsbezeichnung,Steuerpflichtig*/
                       ORDER BY IVO.Rechnungsdatum, IVO.Rechnungsnummer "
        ' --and IVO.Rechnungsnummer=19400002
        Return SQL.loadDgvBySql(sqlStr, "FMZOLL", 9800)

    End Function

    'Shared Function getBuchungenTEST(Firma_ID As Integer) As DataTable

    '    Dim sqlStr = " SELECT TOP (1000) IVO.Rechnungsdatum,IVO.Rechnungsnummer,min(Speditionsbuch) as Speditionsbuch	,min(FilialenNr) as FilialenNr,min(AbfertigungsNr) as AbfertigungsNr,min(UnterNr) as UnterNr,min(Abfertigungsdatum) as Abfertigungsdatum,min(BelegartenNr) as BelegartenNr
    '                    ,min(KundenNrZentrale) as [KundenNrZentrale],min(RechnungsKundenNr) as RechnungsKundenNr,min(RechnungsLandKz) as RechnungsLandKz,min(RechnungsUstIdKz) as RechnungsUstIdKz,min(RechnungsUstIdNr) as RechnungsUstIdNr
    '                    ,min(Lastschrift+0) as Lastschrift,min(Steuerschlüssel) as Steuerschlüssel,min([Steuersatz %]) as Steuersatz,min(WährungLokal) as WährungLokal,min(SteuerbetragLokal) as SteuerbetragLokal,min(RechnungsbetragLokal) as RechnungsbetragLokal
    '                    ,min(WährungFremd) as WährungFremd,min(SteuerbetragFremd) as SteuerbetragFremd,min(RechnungsbetragFremd) as RechnungsbetragFremd,min(TrdinDateiname) as TrdinDateiname,min(Abgleich_op_debitor+0) as Abgleich_op_debitor
    '                    ,min(Nettozahlungsziel) as Nettozahlungsziel,min(Firma_ID) as Firma_ID,min(UStVAn_ID)  as UStVAn_ID	  /*,Leistungsnummer,Leistungsbezeichnung*/,Steuerpflichtig,sum(PROD.SteuerpflichtigerBetragLokal) as SteuerpflichtigerBetragLokal
    '                    ,sum(PROD.SteuerfreierBetragLokal) as SteuerfreierBetragLokal,sum(PROD.SteuerpflichtigerBetragFremd) as SteuerpflichtigerBetragFremd,sum(PROD.SteuerfreierBetragFremd) as SteuerfreierBetragFremd,min(Belegdaten) as Belegdaten
    '                    ,min(Sachkonto) as Sachkonto,min(Buchungstext) as Buchungstext,Sum(PROD.[SteuerpflichtigerBetragLokal] + PROD.[SteuerfreierBetragLokal]) As BetragLokal, Sum(PROD.[SteuerpflichtigerBetragFremd]+PROD.[SteuerfreierBetragFremd]) As BetragFremd

    '                   FROM VERAG.dbo.tblTrdinInvoice as IVO left JOIN tblTrdinProduct as PROD on IVO.Rechnungsnummer=PROD.Rechnungsnummer
    '                   WHERE Firma_ID ='" & Firma_ID & "'  AND TrdinDateiname ='211005010148'	 
    '                   group by Firma_id, IVO.Rechnungsnummer,IVO.rechnungsdatum/*,Leistungsnummer,Leistungsbezeichnung*/,Steuerpflichtig
    '                   ORDER BY Rechnungsdatum, Rechnungsnummer "
    '    ' --and IVO.Rechnungsnummer=19400002
    '    Return SQL.loadDgvBySql(sqlStr, "FMZOLL")

    'End Function

    'Shared Function getBuchungenZeilen(Firma_ID As Integer, Rechnungsnummer As Integer, Rechnungsdatum As Date) As DataTable

    '    Dim sqlStr = " SELECT TOP (1000) IVO.Rechnungsdatum,IVO.Rechnungsnummer, Speditionsbuch	,FilialenNr,AbfertigungsNr,UnterNr, Abfertigungsdatum, BelegartenNr
    '                    , [KundenNrZentrale], RechnungsKundenNr,RechnungsLandKz, RechnungsUstIdKz, RechnungsUstIdNr
    '                    , Lastschrift, Steuerschlüssel,[Steuersatz %] as Steuersatz,WährungLokal, SteuerbetragLokal, RechnungsbetragLokal
    '                    ,WährungFremd,SteuerbetragFremd,RechnungsbetragFremd,TrdinDateiname,Abgleich_op_debitor
    '                    , Nettozahlungsziel, Firma_ID, UStVAn_ID,Leistungsnummer,Leistungsbezeichnung,Steuerpflichtig,PROD.SteuerpflichtigerBetragLokal as SteuerpflichtigerBetragLokal
    '                    ,PROD.SteuerfreierBetragLokal as SteuerfreierBetragLokal,PROD.SteuerpflichtigerBetragFremd as SteuerpflichtigerBetragFremd,PROD.SteuerfreierBetragFremd as SteuerfreierBetragFremd,Belegdaten
    '                    ,Sachkonto,Buchungstext, (PROD.[SteuerpflichtigerBetragLokal] + PROD.[SteuerfreierBetragLokal]) As BetragLokal,  (PROD.[SteuerpflichtigerBetragFremd]+PROD.[SteuerfreierBetragFremd]) As BetragFremd

    '                   FROM VERAG.dbo.tblTrdinInvoice as IVO left JOIN tblTrdinProduct as PROD on IVO.Rechnungsnummer=PROD.Rechnungsnummer
    '                   WHERE Firma_ID ='" & Firma_ID & "' AND IVO.Rechnungsnummer ='" & Rechnungsnummer & "' AND cast(IVO.Rechnungsdatum as date) ='" & Rechnungsdatum.ToShortDateString & "'  AND TrdinDateiname Is Null	 
    '                   ORDER BY Rechnungsdatum, Rechnungsnummer "
    '    ' --and IVO.Rechnungsnummer=19400002
    '    Return SQL.loadDgvBySql(sqlStr, "FMZOLL")

    'End Function

    Shared Function getBuchungenZeilen(Firma_ID As Integer, Rechnungsnummer As Integer, Rechnungsdatum As Date, Source As String, Optional WdhDateiname As String = "") As DataTable


        Dim sqlStr = " SELECT	Sachkonto,IVO.Rechnungsdatum Rechnungsdatum,IVO.Rechnungsnummer Rechnungsnummer,FilialenNr,AbfertigungsNr,UnterNr,steuerpflichtig,[Steuersatz %] Steuersatz,BelegartenNr,
					     WährungFremd, WährungLokal,sum(PROD.[SteuerpflichtigerBetragLokal] + PROD.[SteuerfreierBetragLokal])BetragLokal,
					     sum(PROD.[SteuerpflichtigerBetragFremd]+PROD.[SteuerfreierBetragFremd])BetragFremd ,sum(RechnungsbetragLokal) RechnungsbetragLokal,sum(RechnungsbetragFremd) RechnungsbetragFremd, IVO.Source
                       FROM VERAG.dbo.tblTrdinInvoice as IVO left JOIN tblTrdinProduct as PROD on IVO.Rechnungsnummer=PROD.Rechnungsnummer and IVO.Rechnungsdatum = PROD.Rechnungsdatum and IVO.Source = PROD.Source
                       WHERE Firma_ID ='" & Firma_ID & "' AND  IVO.Source = '" & Source & "' AND IVO.Rechnungsnummer ='" & Rechnungsnummer & "' AND cast(IVO.Rechnungsdatum as date) ='" & Rechnungsdatum.ToShortDateString & "'  AND " & If(WdhDateiname = "", " TrdinDateiname Is Null ", " TrdinDateiname ='" & WdhDateiname & "' ") & " 		 
                       GROUP BY Sachkonto,IVO.Rechnungsdatum,IVO.Rechnungsnummer,FilialenNr,AbfertigungsNr,UnterNr,steuerpflichtig,[Steuersatz %] ,BelegartenNr,WährungFremd,WährungLokal, IVO.Source
					   ORDER BY Rechnungsdatum, Rechnungsnummer, IVO.Source "
        ' --and IVO.Rechnungsnummer=19400002
        Return SQL.loadDgvBySql(sqlStr, "FMZOLL", 9800)

    End Function

    Shared Function getBuchungenZeilenAMBAR(Rechnungsnummer As Integer, Rechnungsdatum As Date, Source As String, Optional WdhDateiname As String = "") As DataTable


        Dim sqlStr = " SELECT isnull(le.SachkontoEUSteuerfrei,'0000') as Sachkonto ,IVO.Rechnungsdatum Rechnungsdatum,IVO.Rechnungsnummer Rechnungsnummer,FilialenNr,AbfertigungsNr,UnterNr,PROD.steuerpflichtig,[Steuersatz %] Steuersatz,BelegartenNr,
					   WährungFremd, WährungLokal,sum(PROD.[SteuerpflichtigerBetragLokal] + PROD.[SteuerfreierBetragLokal])BetragLokal,
					   sum(PROD.[SteuerpflichtigerBetragFremd]+PROD.[SteuerfreierBetragFremd])BetragFremd ,sum(RechnungsbetragLokal) RechnungsbetragLokal,sum(RechnungsbetragFremd) RechnungsbetragFremd
                       FROM VERAG.dbo.tblTrdinInvoice as IVO 
					   left JOIN tblTrdinProduct as PROD on IVO.Rechnungsnummer=PROD.Rechnungsnummer and IVO.Rechnungsdatum = PROD.Rechnungsdatum and IVO.Source = PROD.Source
					   left join [Leistungen] as le on le.LeistungsNr = PROD.Leistungsnummer
                       WHERE Firma_ID ='24' AND  IVO.Source = '" & Source & "' AND  IVO.Rechnungsnummer ='" & Rechnungsnummer & "' AND cast(IVO.Rechnungsdatum as date) ='" & Rechnungsdatum.ToShortDateString & "'  AND " & If(WdhDateiname = "", " AmbDateiname Is Null ", " AmbDateiname ='" & WdhDateiname & "' ") & "   		 
                       GROUP BY le.SachkontoEUSteuerfrei ,IVO.Rechnungsdatum,IVO.Rechnungsnummer,FilialenNr,AbfertigungsNr,UnterNr,PROD.steuerpflichtig,[Steuersatz %] ,BelegartenNr,WährungFremd,WährungLokal, IVO.Source
					   ORDER BY Rechnungsdatum, Rechnungsnummer "
        ' --and IVO.Rechnungsnummer=19400002
        Return SQL.loadDgvBySql(sqlStr, "FMZOLL", 9800)

    End Function


    Public Shared Function genBuchungsZeileSum(row As DataRow, ByRef SummeBuchungen As Double, ByRef Geschäftsjahr As Integer, ByRef FIRMA As VERAG_PROG_ALLGEMEIN.cFirmen, Optional ambarGUbuchung As Boolean = False) As String
        genBuchungsZeileSum = ""

        If row("BelegartenNr") = 70 Then 'RECHNUNG

            Dim FiBuSollkontonummer = row("KundenNrZentrale")
            Dim FiBuHabenkontonummer = "0"

            Dim Bruttobetrag As Double
            Dim FiBuWährung = ""

            If row("WährungFremd") Is DBNull.Value Then
                Bruttobetrag = row("RechnungsbetragLokal")  'Bruttobetrag
            Else
                Bruttobetrag = row("RechnungsbetragFremd")  'Bruttobetrag
            End If
            If row("WährungFremd") Is DBNull.Value Then
                FiBuWährung = row("WährungLokal")
            Else
                FiBuWährung = row("WährungFremd")
            End If

            Dim FiBuEigenbruttobetrag = row("RechnungsbetragLokal")

            genBuchungsZeileSum = "L" & vbTab
            genBuchungsZeileSum &= CDate(row("Rechnungsdatum")).ToString("dd.MM.yyyy") & vbTab
            genBuchungsZeileSum &= FormatStringSYS(row("Rechnungsnummer")) & vbTab

            genBuchungsZeileSum &= FiBuSollkontonummer & vbTab
            genBuchungsZeileSum &= FiBuHabenkontonummer & vbTab
            'genBuchungsZeileSum &= row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab
            genBuchungsZeileSum &= IIf(row("Buchungstext") <> "" AndAlso row("Buchungstext").ToString.Contains("Zinsen"), row("Buchungstext") & vbTab, row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab)

            genBuchungsZeileSum &= Format(CDbl(Bruttobetrag), fmt) & vbTab
            genBuchungsZeileSum &= "" & vbTab 'FiBuSteuersatz
            genBuchungsZeileSum &= "" & vbTab 'FiBuSteuerbetrag
            genBuchungsZeileSum &= FiBuWährung & vbTab
            genBuchungsZeileSum &= Format(CDbl(FiBuEigenbruttobetrag), fmt) & vbTab


        ElseIf row("BelegartenNr") = 71 Then 'GUTSCHRIFT

            Dim FiBuWährung = ""
            Dim FiBuSollkontonummer = "0"
            Dim FiBuHabenkontonummer = row("KundenNrZentrale")
            Dim FiBuBruttobetrag As Double

            If Not ambarGUbuchung Then
                ' Buchungssatz Gutschrift (immer letzte Buchungszeile)

                If row("WährungFremd") Is DBNull.Value Then
                    FiBuWährung = row("WährungLokal")
                    FiBuBruttobetrag = (0 - CDbl(row("RechnungsbetragLokal")))
                Else
                    FiBuWährung = row("WährungFremd")
                    FiBuBruttobetrag = (0 - CDbl(row("RechnungsbetragFremd")))
                End If

                Dim FiBuEigenbruttobetrag = 0 - CDbl(row("RechnungsbetragLokal"))

                genBuchungsZeileSum = "L" & vbTab
                genBuchungsZeileSum &= CDate(row("Rechnungsdatum")).ToString("dd.MM.yyyy") & vbTab
                genBuchungsZeileSum &= FormatStringSYS(row("Rechnungsnummer")) & vbTab

                genBuchungsZeileSum &= FiBuSollkontonummer & vbTab
                genBuchungsZeileSum &= FiBuHabenkontonummer & vbTab

                'genBuchungsZeileSum &= row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab
                genBuchungsZeileSum &= IIf(row("Buchungstext") <> "" AndAlso row("Buchungstext").ToString.Contains("Zinsen"), row("Buchungstext") & vbTab, row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab)

                genBuchungsZeileSum &= Format(CDbl(FiBuBruttobetrag), fmt) & vbTab
                genBuchungsZeileSum &= "" & vbTab 'FiBuSteuersatz
                genBuchungsZeileSum &= "" & vbTab 'FiBuSteuerbetrag
                genBuchungsZeileSum &= FiBuWährung & vbTab
                genBuchungsZeileSum &= Format(CDbl(FiBuEigenbruttobetrag), fmt) & vbTab
            Else

                If row("WährungFremd") Is DBNull.Value Then
                    FiBuWährung = row("WährungLokal")
                    FiBuBruttobetrag = (0 - CDbl(row("RechnungsbetragLokal")))
                Else
                    FiBuWährung = row("WährungFremd")
                    FiBuBruttobetrag = (0 - CDbl(row("RechnungsbetragFremd")))
                End If

                Dim FiBuEigenbruttobetrag = 0 - CDbl(row("RechnungsbetragLokal"))

                genBuchungsZeileSum = "L" & vbTab
                genBuchungsZeileSum &= CDate(row("Rechnungsdatum")).ToString("dd.MM.yyyy") & vbTab
                genBuchungsZeileSum &= FormatStringSYS(row("Rechnungsnummer")) & vbTab

                genBuchungsZeileSum &= FiBuHabenkontonummer & vbTab
                genBuchungsZeileSum &= FiBuSollkontonummer & vbTab

                'genBuchungsZeileSum &= row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab
                genBuchungsZeileSum &= IIf(row("Buchungstext") <> "" AndAlso row("Buchungstext").ToString.Contains("Zinsen"), row("Buchungstext") & vbTab, row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab)

                genBuchungsZeileSum &= Format(CDbl(FiBuBruttobetrag), fmt) & vbTab
                genBuchungsZeileSum &= "" & vbTab 'FiBuSteuersatz
                genBuchungsZeileSum &= "" & vbTab 'FiBuSteuerbetrag
                genBuchungsZeileSum &= FiBuWährung & vbTab
                genBuchungsZeileSum &= Format(CDbl(FiBuEigenbruttobetrag), fmt) & vbTab


            End If



        ElseIf row("BelegartenNr") = 31 Then 'Einnahme

            Dim FiBuWährung = ""
            Dim FiBuSollkontonummer = "0"
            Dim FiBuHabenkontonummer = row("KundenNrZentrale")
            Dim FiBuBruttobetrag As Double

            If row("WährungFremd") Is DBNull.Value Then
                    FiBuWährung = row("WährungLokal")
                FiBuBruttobetrag = (CDbl(row("RechnungsbetragLokal")))
            Else
                    FiBuWährung = row("WährungFremd")
                FiBuBruttobetrag = (CDbl(row("RechnungsbetragFremd")))
            End If

            Dim FiBuEigenbruttobetrag = CDbl(row("RechnungsbetragLokal"))

            genBuchungsZeileSum = "L" & vbTab
                genBuchungsZeileSum &= CDate(row("Rechnungsdatum")).ToString("dd.MM.yyyy") & vbTab
                genBuchungsZeileSum &= FormatStringSYS(row("Rechnungsnummer")) & vbTab

                genBuchungsZeileSum &= FiBuSollkontonummer & vbTab
                genBuchungsZeileSum &= FiBuHabenkontonummer & vbTab

            genBuchungsZeileSum &= IIf(row("Buchungstext") <> "", row("Buchungstext") & vbTab, row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab)

            genBuchungsZeileSum &= Format(CDbl(FiBuBruttobetrag), fmt) & vbTab
                genBuchungsZeileSum &= "" & vbTab 'FiBuSteuersatz
                genBuchungsZeileSum &= "" & vbTab 'FiBuSteuerbetrag
                genBuchungsZeileSum &= FiBuWährung & vbTab
                genBuchungsZeileSum &= Format(CDbl(FiBuEigenbruttobetrag), fmt) & vbTab


            ElseIf row("BelegartenNr") = 30 Then 'Ausgabe

            Dim FiBuSollkontonummer = "0"
            Dim FiBuHabenkontonummer = row("KundenNrZentrale") '2700

            Dim Bruttobetrag As Double
            Dim FiBuWährung = ""

            If row("WährungFremd") Is DBNull.Value Then
                Bruttobetrag = row("RechnungsbetragLokal")  'Bruttobetrag
            Else
                Bruttobetrag = row("RechnungsbetragFremd")  'Bruttobetrag
            End If
            If row("WährungFremd") Is DBNull.Value Then
                FiBuWährung = row("WährungLokal")
            Else
                FiBuWährung = row("WährungFremd")
            End If

            Dim FiBuEigenbruttobetrag = row("RechnungsbetragLokal")

            genBuchungsZeileSum = "L" & vbTab
            genBuchungsZeileSum &= CDate(row("Rechnungsdatum")).ToString("dd.MM.yyyy") & vbTab
            genBuchungsZeileSum &= FormatStringSYS(row("Rechnungsnummer")) & vbTab

            genBuchungsZeileSum &= FiBuSollkontonummer & vbTab
            genBuchungsZeileSum &= FiBuHabenkontonummer & vbTab
            'genBuchungsZeileSum &= row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab
            genBuchungsZeileSum &= IIf(row("Buchungstext") <> "", row("Buchungstext") & vbTab, row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab)

            genBuchungsZeileSum &= Format(CDbl(Bruttobetrag), fmt) & vbTab
            genBuchungsZeileSum &= "" & vbTab 'FiBuSteuersatz
            genBuchungsZeileSum &= "" & vbTab 'FiBuSteuerbetrag
            genBuchungsZeileSum &= FiBuWährung & vbTab
            genBuchungsZeileSum &= Format(CDbl(FiBuEigenbruttobetrag), fmt) & vbTab


        End If


        Return genBuchungsZeileSum
    End Function

    Public Shared Function genBuchungsZeile(row As DataRow, ByRef SummeBuchungen As Double, ByRef Geschäftsjahr As Integer, ByRef FIRMA As VERAG_PROG_ALLGEMEIN.cFirmen, ByRef curDifferenzbetrag As Double, Optional ambargubuchungen As Boolean = False, Optional Buchungstext As String = "") As String

        Dim curSteuerbetrag As Double
        Dim curNettobetrag As Double
        Dim curBruttobetrag As Double
        Dim FiBuBruttobetrag As String
        Dim FiBuEigenbruttobetrag As Double
        Dim FiBuSteuersatz As Double
        Dim FiBuSteuerbetrag As String
        Dim FiBuSollkontonummer As Integer
        Dim FiBuHabenkontonummer As Integer
        Dim FiBuWährung = "EUR"

        Select Case row("BelegartenNr")

                Case 70 'Rechnung
                FiBuSollkontonummer = "0"
                FiBuHabenkontonummer = If(row("Sachkonto") IsNot DBNull.Value AndAlso IsNumeric(row("Sachkonto")), row("Sachkonto"), 0)
                If row("WährungFremd") Is DBNull.Value Then
                    curNettobetrag = row("BetragLokal")
                Else
                    curNettobetrag = row("BetragFremd")
                End If
            Case 71 'Gutschrift
                If Not ambargubuchungen Then
                    FiBuSollkontonummer = If(row("Sachkonto") IsNot DBNull.Value AndAlso IsNumeric(row("Sachkonto")), row("Sachkonto"), 0)
                    FiBuHabenkontonummer = "0"
                    If row("WährungFremd") Is DBNull.Value Then
                        curNettobetrag = 0 - row("BetragLokal")
                    Else
                        curNettobetrag = 0 - row("BetragFremd")
                    End If
                Else
                    FiBuSollkontonummer = "0"
                    FiBuHabenkontonummer = If(row("Sachkonto") IsNot DBNull.Value AndAlso IsNumeric(row("Sachkonto")), row("Sachkonto"), 0)
                    If row("WährungFremd") Is DBNull.Value Then
                        curNettobetrag = 0 - row("BetragLokal")
                    Else
                        curNettobetrag = 0 - row("BetragFremd")
                    End If

                End If

            Case 31 'Einnahme

                FiBuSollkontonummer = 2700 'If(row("Sachkonto") IsNot DBNull.Value AndAlso IsNumeric(row("Sachkonto")), row("Sachkonto"), 0)
                FiBuHabenkontonummer = "0"
                If row("WährungFremd") Is DBNull.Value Then
                    curNettobetrag = row("BetragLokal")
                Else
                    curNettobetrag = row("BetragFremd")
                End If

            Case 30 'Ausgabe

                FiBuSollkontonummer = If(row("Sachkonto") IsNot DBNull.Value AndAlso IsNumeric(row("Sachkonto")), row("Sachkonto"), 0)
                FiBuHabenkontonummer = "0"
                If row("WährungFremd") Is DBNull.Value Then
                    curNettobetrag = row("BetragLokal")
                Else
                    curNettobetrag = row("BetragFremd")
                End If



        End Select

        If CBool(row("steuerpflichtig")) Then
            curSteuerbetrag = CLng(curNettobetrag * CDbl(row("Steuersatz")) * 100) / 100
            curBruttobetrag = curNettobetrag + curSteuerbetrag
            FiBuBruttobetrag = curBruttobetrag.ToString("N2")
            curDifferenzbetrag = Math.Round(curDifferenzbetrag, 2) - Math.Round(CDbl(FiBuBruttobetrag), 2)
            FiBuSteuersatz = Format(CDbl(row("Steuersatz")) * 100, "00.00")
            ' Die folgende Zeile führt zu Buchungsfehler bei Fremdwährung,
            '   Buchungssatz.FiBuSteuerbetrag = Format(curSteuerbetrag, "########0.00")
            ' deshalb nur Steuerprozent und keinen Steuerbetrag übergeben.
            FiBuSteuerbetrag = ""
        Else
            curBruttobetrag = curNettobetrag
            FiBuBruttobetrag = curBruttobetrag.ToString("N2")
            curDifferenzbetrag = Math.Round(curDifferenzbetrag, 2) - Math.Round(CDbl(FiBuBruttobetrag), 2)
            FiBuSteuersatz = "00,00"
            FiBuSteuerbetrag = ""
        End If

        If row("WährungFremd") Is DBNull.Value Then
            FiBuEigenbruttobetrag = CDbl(row("RechnungsbetragLokal"))  'Bruttobetrag
            FiBuWährung = row("WährungLokal")
        Else
            FiBuWährung = row("WährungFremd")
            FiBuEigenbruttobetrag = CDbl(row("RechnungsbetragFremd"))   'Bruttobetrag
        End If

        genBuchungsZeile = "L" & vbTab
        genBuchungsZeile &= CDate(row("Rechnungsdatum")).ToString("dd.MM.yyyy") & vbTab
        genBuchungsZeile &= FormatStringSYS(row("Rechnungsnummer")) & vbTab

        genBuchungsZeile &= FiBuSollkontonummer & vbTab
        genBuchungsZeile &= FiBuHabenkontonummer & vbTab
        'genBuchungsZeile &= row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab
        Select Case row("BelegartenNr")
            Case 30, 31
                genBuchungsZeile &= IIf(Buchungstext <> "", Buchungstext & vbTab, row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab)
            Case Else
                genBuchungsZeile &= IIf(Buchungstext <> "" AndAlso Buchungstext.Contains("Zinsen"), Buchungstext & vbTab, row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & vbTab)
        End Select



        genBuchungsZeile &= Format(CDbl(FiBuBruttobetrag), fmt) & vbTab
        genBuchungsZeile &= Format(CDbl(FiBuSteuersatz), fmt) & vbTab 'FiBuSteuersatz
        genBuchungsZeile &= FormatStringDbl(FiBuSteuerbetrag) & vbTab 'FiBuSteuerbetrag
        genBuchungsZeile &= FiBuWährung & vbTab
        genBuchungsZeile &= Format(CDbl(FiBuEigenbruttobetrag), fmt) & vbTab



    End Function

    Public Shared Function genBuchungsZeileVZ(row As DataRow, ByRef SummeBuchungen As Double, ByRef Geschäftsjahr As Integer, ByRef FIRMA As VERAG_PROG_ALLGEMEIN.cFirmen, Optional ambargubuchungen As Boolean = False) As String

        Dim curSteuerbetrag As Double
        Dim curNettobetrag As Double
        Dim curBruttobetrag As Double
        Dim FiBuBruttobetrag As String
        Dim FiBuEigenbruttobetrag As Double
        Dim FiBuSteuersatz As Double
        Dim FiBuSteuerbetrag As String
        Dim FiBuSollkontonummer As Integer
        Dim FiBuHabenkontonummer As Integer

        Dim FiBuWährung = "EUR"

        Dim ANTRAG As New cUSTVAntrag(row("UStVAn_ID"))
        Dim KUNDE_ERW As New cKundenErweitert(ANTRAG.UStVAn_KuNr)

        Dim MonthStart As String = IIf(CDate(ANTRAG.UStVAn_ReDatVon).Month < 10, "0", "") & CDate(ANTRAG.UStVAn_ReDatVon).Month
        Dim MonthEnd As String = IIf(CDate(ANTRAG.UStVAn_ReDatBis).Month < 10, "0", "") & CDate(ANTRAG.UStVAn_ReDatBis).Month


        Select Case row("BelegartenNr")
            Case 71 'nur bei Gutschrift!
                If Not ambargubuchungen Then

                    Select Case row("KundenNrZentrale")
                        Case "150000", "180000" : FiBuSollkontonummer = 2865
                        Case "140000" : FiBuSollkontonummer = 2868
                        Case Else
                            FiBuSollkontonummer = 2866
                    End Select

                    FiBuHabenkontonummer = If(row("Sachkonto") IsNot DBNull.Value, row("Sachkonto"), "    ")

                    If row("WährungFremd") Is DBNull.Value Then
                        curNettobetrag = 0 - row("VZBetrag")
                    Else
                        curNettobetrag = 0 - row("VZBetrag")
                    End If
                End If

        End Select

        curBruttobetrag = curNettobetrag
        FiBuBruttobetrag = curBruttobetrag.ToString("N2")

        FiBuSteuersatz = "00,00"
        FiBuSteuerbetrag = ""


        If row("WährungFremd") Is DBNull.Value Then
            FiBuEigenbruttobetrag = CDbl(row("RechnungsbetragLokal"))  'Bruttobetrag
            FiBuWährung = row("WährungLokal")
        Else
            FiBuWährung = row("WährungFremd")
            FiBuEigenbruttobetrag = CDbl(row("RechnungsbetragFremd"))   'Bruttobetrag
        End If

        genBuchungsZeileVZ = "L" & vbTab
        genBuchungsZeileVZ &= CDate(row("Rechnungsdatum")).ToString("dd.MM.yyyy") & vbTab
        genBuchungsZeileVZ &= "VZ " & CDate(row("Rechnungsdatum")).ToString("ddMMyy") & vbTab

        genBuchungsZeileVZ &= FiBuSollkontonummer & vbTab
        genBuchungsZeileVZ &= FiBuHabenkontonummer & vbTab
        Dim Antrag_LandKz = SQL.DLookup("LandKz", "[Länderverzeichnis für die Außenhandelsstatistik]", "Landnr='" & ANTRAG.UStVAn_LandNr & "'", "FMZOLL")
        genBuchungsZeileVZ &= ANTRAG.UStVAn_KuNr & " " & IIf(Not IsDBNull(KUNDE_ERW.kde_BezFIBU), KUNDE_ERW.kde_BezFIBU, "") & " / " & Antrag_LandKz & " " & MonthStart & "-" & MonthEnd & "/" & CDate(ANTRAG.UStVAn_ReDatBis).Year.ToString.Substring(2) & " VZ" & vbTab

        genBuchungsZeileVZ &= Format(CDbl(FiBuBruttobetrag), fmt) & vbTab
        genBuchungsZeileVZ &= Format(CDbl(FiBuSteuersatz), fmt) & vbTab 'FiBuSteuersatz
        genBuchungsZeileVZ &= FormatStringDbl(FiBuSteuerbetrag) & vbTab 'FiBuSteuerbetrag
        genBuchungsZeileVZ &= FiBuWährung & vbTab
        genBuchungsZeileVZ &= Format(CDbl(FiBuEigenbruttobetrag), fmt) & vbTab



    End Function


    Public Shared Function genBuchungsZeileDiffBetrag(row As DataRow, ByRef SummeBuchungen As Double, ByRef Geschäftsjahr As Integer, ByRef FIRMA As VERAG_PROG_ALLGEMEIN.cFirmen, ByRef curDifferenzbetrag As Double) As String

        '  Buchungssatz Steuerdifferenz
        If curDifferenzbetrag <> 0 Then
            Dim FiBuWährung As String
            Dim FiBuEigenbruttobetrag As Double
            Dim FiBuSollkontonummer As Integer
            Dim FiBuHabenkontonummer As Integer
            Dim Buchungstext = row("FilialenNr") & "/" & row("AbfertigungsNr") & "/" & CDbl(row("UnterNr")).ToString("00") & "/Steuerdiff." & vbTab
            If row("WährungFremd") Is DBNull.Value Then
                FiBuEigenbruttobetrag = curDifferenzbetrag 'Bruttobetrag
                FiBuWährung = row("WährungLokal")
            Else
                FiBuWährung = row("WährungFremd")
                FiBuEigenbruttobetrag = cProgramFunctions.fktEuro(curDifferenzbetrag, row("WährungFremd"), "EUR")
            End If


            Select Case row("BelegartenNr")
                Case 70 'Rechnung
                    FiBuSollkontonummer = "0"
                    FiBuHabenkontonummer = "8490"
                Case 71 'Gutschrift
                    FiBuSollkontonummer = "8490"
                    FiBuHabenkontonummer = "0"

                Case 31 'Einnahme
                    FiBuSollkontonummer = "8490"
                    FiBuHabenkontonummer = "0"
                Case 30 'Ausgabe
                    FiBuSollkontonummer = "8490"
                    FiBuHabenkontonummer = "0"

            End Select


            genBuchungsZeileDiffBetrag = "L" & vbTab
            genBuchungsZeileDiffBetrag &= CDate(row("Rechnungsdatum")).ToString("dd.MM.yyyy") & vbTab
            genBuchungsZeileDiffBetrag &= FormatStringSYS(row("Rechnungsnummer")) & vbTab

            genBuchungsZeileDiffBetrag &= FiBuSollkontonummer & vbTab
            genBuchungsZeileDiffBetrag &= FiBuHabenkontonummer & vbTab
            genBuchungsZeileDiffBetrag &= Buchungstext

            genBuchungsZeileDiffBetrag &= Format(curDifferenzbetrag, fmt) & vbTab
            genBuchungsZeileDiffBetrag &= "00,00" & vbTab 'FiBuSteuersatz
            genBuchungsZeileDiffBetrag &= "" & vbTab 'FiBuSteuerbetrag
            genBuchungsZeileDiffBetrag &= FiBuWährung & vbTab
            genBuchungsZeileDiffBetrag &= Format(FiBuEigenbruttobetrag, fmt) & vbTab


            'curDifferenzbetrag += FiBuEigenbruttobetrag
        End If


    End Function

    Shared Sub initKDNr(ByRef dt As DataTable)
        For Each r In dt.Rows
            If IsNumeric(r("Konto-Nr")) AndAlso CInt(r("Konto-Nr")) > 2000000 Then r("Konto-Nr") = (CInt(r("Konto-Nr")) - 2000000)
            '     MsgBox((CInt(r("Konto-Nr")) - 1000000) + 200000)
        Next
    End Sub


    Shared Function initKDNr2(ktoNr As String) As String
        If IsNumeric(ktoNr) AndAlso CInt(ktoNr) > 2000000 Then ktoNr = (CInt(ktoNr) - 2000000) '+ 200000
        Return ktoNr
    End Function
    ' Trdin=false

    Shared Function getSteuercode(r As DataRow, FIRMA As VERAG_PROG_ALLGEMEIN.cFirmen) As String
        Select Case r("Sachkonto")
            'Case "3550", "3553", "3558"
            '    Return "999"
            Case Else

                If Not CBool(r("Steuerpflichtig")) Then
                    'Vorher immer return "" - galube es soll bei eu aber 77 sein...
                    If SQL.DLookup("[MitgliedslandEU]", "[Währungstabelle]", "[LandKz]='" & r("RechnungsLandKz") & "'", "FMZOLL", False) Then
                        Return "77" ' EU-LAND
                    Else
                        Return "" ' Drittland
                    End If
                Else
                    If (r("RechnungsLandKz")).ToString.Replace("AT", "A").Replace("DE", "D") = FIRMA.Firma_LandKz Then 'Abhängig von FIRMA --> INLAND!!!!!!
                        Return "1" 'Steuerpflichtig und AT
                    Else
                        If SQL.DLookup("[MitgliedslandEU]", "[Währungstabelle]", "[LandKz]='" & r("RechnungsLandKz") & "'", "FMZOLL", False) Then
                            Return "77" ' EU-LAND
                        Else
                            Return "" ' Drittland
                        End If
                    End If
                End If

        End Select
        Return ""
    End Function



    Shared Function fill0Stellen(i As Object, l As Integer) As String
        If i Is DBNull.Value Then i = ""
        If i Is Nothing Then i = ""
        While i.ToString.Length < l
            i &= "0"
        End While
        Return i
    End Function



    '    Public Function fktFiBuDebitoren(ByVal intFirma_ID As Integer) As Boolean

    '        Dim dq As DAO.QueryDef
    '        Dim rstACC As DAO.Recordset

    '        Dim cnnFIBU2 As ADODB.Connection
    '        Dim rstSQL As ADODB.Recordset

    '        Dim DateiName As String
    '        Dim DateiNr As Integer
    '        Dim fDateiOpen As Boolean

    '        Dim strSQL As String
    '        Dim lngFortschritt As Long

    '2060 On Error GoTo PROC_Error

    '2070     fktFiBuDebitoren = False
    '2080     Call Logbucheintrag(0, 0, "basFiBuSyska.fktFiBuDebitoren(" & intFirma_ID & ")", 0, "gestartet")
    '2090     DoCmd.Hourglass True

    '         ' Access-Datenbank lesen.
    '2100     Set dq = dbs.QueryDefs("qryFiBuDebitoren")
    '2110     dq.Parameters("[parFirma_ID]") = intFirma_ID
    '2120     Set rstACC = dq.OpenRecordset(dbOpenSnapshot)
    '2130     If Not rstACC.EOF Then

    '             ' Verbindung zur SQL-Server-Datenbank herstellen.
    '2140         Set cnnFIBU2 = New ADODB.Connection
    '2150         cnnFIBU2.ConnectionTimeout = 120
    '2160         cnnFIBU2.Open "File Name=F:\FMZoll\FIBU2.UDL"
    '2170         Set rstSQL = New ADODB.Recordset

    '             ' Information über den Beginn der Verarbeitung anzeigen.
    '2180         lngFortschritt = 0
    '2190         rstACC.MoveLast
    '2200         Call SysCmd(acSysCmdInitMeter, "FIBU2 Debitoren ", rstACC.RecordCount)
    '2210         rstACC.MoveFirst

    '2220         Do Until rstACC.EOF

    '                 ' Information über den Fortschritt der Verarbeitung anzeigen.
    '2230             lngFortschritt = lngFortschritt + 1
    '2240             Call SysCmd(acSysCmdUpdateMeter, lngFortschritt)
    '2250             If lngFortschritt Mod 10 = 0 Then DoEvents

    '                 ' SQL-Server-Datenbank lesen.
    '2260             strSQL = "SELECT [i_konto]" & _
    '                             " FROM [FIBU2].[dbo].[fibu_konto]" & _
    '                             " WHERE [i_firm_refid] = " & intFirma_ID & _
    '                             " AND [c_kontoart] = 'DE'" & _
    '                             " AND [i_konto] = " & rstACC!KundenNrZentrale
    '2270             rstSQL.Open strSQL, cnnFIBU2, adOpenStatic, adLockReadOnly, adCmdText
    '2280             If rstSQL.EOF Then

    '                     ' Datei zur Aufnahme der Schnittstellendaten anlegen.
    '2290                 If Not fDateiOpen Then
    '2300                     DateiName = "F:\FMZoll\FiBu\Syska\" & intFirma_ID & "\DEBI_" & Format(Now(), "yymmddhhmmss") & ".txt"
    '2310                     DateiNr = FreeFile
    '2320                     Forms![Daten-Transfer]!strInformation = DateiName
    '2330                     Open DateiName For Output As DateiNr
    '2340                     Forms![Daten-Transfer]!strInformation = ""
    '2350                     fDateiOpen = True
    '2360                 End If

    '                     ' Schnittstellendaten bereitstellen.
    '2370                 Debitorensatz.FiBuKontonummer = rstACC!KundenNrZentrale
    '2380                 Debitorensatz.FiBuKürzel = IIf(IsNull(rstACC!Ordnungsbegriff), rstACC!KundenNrZentrale, Left(Left(rstACC!Ordnungsbegriff, 2) & rstACC!KundenNrZentrale, 8))
    '2390                 Debitorensatz.FiBuName = IIf(IsNull(rstACC![Name 1]), Left(rstACC!Ordnungsbegriff, 40), Left(rstACC![Name 1], 40))
    '2400                 Debitorensatz.FiBuZusatz = IIf(IsNull(rstACC![Name 2]), " ", Left(rstACC![Name 2], 40))
    '2410                 Debitorensatz.FiBuStraße = IIf(IsNull(rstACC!Straße), " ", Left(rstACC!Straße, 30))
    '2420                 Debitorensatz.FiBuPLZ = IIf(IsNull(rstACC!PLZ), " ", Right(rstACC!PLZ, 6))
    '2430                 Debitorensatz.FiBuOrt = IIf(IsNull(rstACC!Ort), " ", Left(rstACC!Ort, 30))
    '                     'Für das neue Buchhaltungsprogramm muss das LandKz in ISO2 angegeben werden.
    '                     'Debitorensatz.FiBuLand = IIf(IsNull(rstACC!LandKz), " ", Left(rstACC!LandKz, 3))   'bis 30.11.2010
    '2440                 Debitorensatz.FiBuLand = IIf(IsNull(rstACC!LandKz), " ", Nz(DLookup("[LandKzISO2]", "qryStaaten", "[LandKz] = '" & rstACC!LandKz & "'"), rstACC!LandKz))  'ab 01.12.2010
    '2450                 Debitorensatz.FiBuEröffnungsdatum = IIf(IsNull(rstACC![Eingegeben am]), " ", DateValue(rstACC![Eingegeben am]))
    '2460                 If rstACC!Lastschrift = True Then
    '2470                     Debitorensatz.FiBuBLZ = IIf(IsNull(rstACC!BLZ), " ", Left(rstACC!BLZ, 8))
    '2480                     Debitorensatz.FiBuBankkonto = IIf(IsNull(rstACC!KTO), " ", Left(rstACC!KTO, 10))
    '2490                 Else
    '2500                     Debitorensatz.FiBuBLZ = " "
    '2510                     Debitorensatz.FiBuBankkonto = " "
    '2520                 End If
    '2530                 Debitorensatz.FiBuSkontotage = "00"
    '2540                 Debitorensatz.FiBuZahlungstage = "10"
    '2550                 Debitorensatz.FiBuSkontoprozent = "00,00"
    '2560                 Debitorensatz.FiBuMahnkennzahl = "01"
    '2570                 Debitorensatz.FiBuIDNummer = IIf(IsNull(rstACC!UstIdNr), " ", IIf(IsNull(rstACC!UstIdKz), Left(rstACC!UstIdNr, 15), Left(rstACC!UstIdKz & rstACC!UstIdNr, 15)))
    '2580                 Debitorensatz.FiBuWährung = IIf(IsNull(rstACC!Währungscode), " ", Left(rstACC!Währungscode, 4))
    '2590                 Debitorensatz.FiBuAnsprechpartner = IIf(IsNull(rstACC!Ansprechpartner), " ", IIf(IsNull(rstACC!Anrede), Left(rstACC!Ansprechpartner, 40), Left(Trim(rstACC!Anrede & " " & rstACC!Ansprechpartner), 40)))
    '2600                 Debitorensatz.FiBuTelefon = IIf(IsNull(rstACC!Telefon), " ", Left(rstACC!Telefon, 20))
    '2610                 Debitorensatz.FiBuFax = IIf(IsNull(rstACC!Telefax), " ", Left(rstACC!Telefax, 20))
    '2620                 Debitorensatz.FiBuEMailAdresse = IIf(IsNull(rstACC![E-Mail]), " ", Left(rstACC![E-Mail], 40))
    '2630                 Debitorensatz.FiBuBemerkung = IIf(rstACC!KundenNr = rstACC!KundenNrZentrale, " ", rstACC!KundenNr)
    '2640                 If IsNull(rstACC!LandKz) Or rstACC!LandKz = " " Or rstACC!LandKz = "A" Then
    '2650                     Debitorensatz.FiBuGegenkontonummer = "4000" ' Erl. 20%
    '2660                     Debitorensatz.FiBuGegenkontonummer2 = "4000" ' Erl. 20%
    '2670                 Else
    '2680                     If DLookup(Nz("[MitgliedslandEU]", False), "[Währungstabelle]", "[LandKz]='" & rstACC!LandKz & "'") Then
    '2690                         Debitorensatz.FiBuGegenkontonummer = "4020" ' Erl. 0% EU
    '2700                         Debitorensatz.FiBuGegenkontonummer2 = "4020" ' Erl. 0% EU
    '2710                     Else
    '2720                         Debitorensatz.FiBuGegenkontonummer = "4021" ' Erl. 0% 3.Land
    '2730                         Debitorensatz.FiBuGegenkontonummer2 = "4021" ' Erl. 0% 3.Land
    '2740                     End If
    '2750                 End If
    '2760                 Debitorensatz.FiBuBankname = " "
    '2770                 Debitorensatz.FiBuLohnveredeler = " "
    '2780                 Debitorensatz.FiBuDurchbuchungskontonummer = " "
    '2790                 Debitorensatz.FiBuGeschäftsführer = " "

    '                     ' Schnittstellendaten in Datei schreiben.
    '2800                 Print #DateiNr, Trim(Debitorensatz.FiBuKontonummer); Chr(9);
    '2810                 Print #DateiNr, Trim(Debitorensatz.FiBuKürzel); Chr(9);
    '2820                 Print #DateiNr, Trim(Debitorensatz.FiBuName); Chr(9);
    '2830                 Print #DateiNr, Trim(Debitorensatz.FiBuZusatz); Chr(9);
    '2840                 Print #DateiNr, Trim(Debitorensatz.FiBuStraße); Chr(9);
    '2850                 Print #DateiNr, Trim(Debitorensatz.FiBuPLZ); Chr(9);
    '2860                 Print #DateiNr, Trim(Debitorensatz.FiBuOrt); Chr(9);
    '2870                 Print #DateiNr, Trim(Debitorensatz.FiBuLand); Chr(9);
    '2880                 Print #DateiNr, Trim(Debitorensatz.FiBuEröffnungsdatum); Chr(9);
    '2890                 Print #DateiNr, Trim(Debitorensatz.FiBuGegenkontonummer); Chr(9);
    '2900                 Print #DateiNr, Trim(Debitorensatz.FiBuBankname); Chr(9);
    '2910                 Print #DateiNr, Trim(Debitorensatz.FiBuBLZ); Chr(9);
    '2920                 Print #DateiNr, Trim(Debitorensatz.FiBuBankkonto); Chr(9);
    '2930                 Print #DateiNr, Trim(Debitorensatz.FiBuSkontotage); Chr(9);
    '2940                 Print #DateiNr, Trim(Debitorensatz.FiBuZahlungstage); Chr(9);
    '2950                 Print #DateiNr, Trim(Debitorensatz.FiBuSkontoprozent); Chr(9);
    '2960                 Print #DateiNr, Trim(Debitorensatz.FiBuMahnkennzahl); Chr(9);
    '2970                 Print #DateiNr, Trim(Debitorensatz.FiBuIDNummer); Chr(9);
    '2980                 Print #DateiNr, Trim(Debitorensatz.FiBuWährung); Chr(9);
    '2990                 Print #DateiNr, Trim(Debitorensatz.FiBuLohnveredeler); Chr(9);
    '3000                 Print #DateiNr, Trim(Debitorensatz.FiBuDurchbuchungskontonummer); Chr(9);
    '3010                 Print #DateiNr, Trim(Debitorensatz.FiBuGegenkontonummer2); Chr(9);
    '3020                 Print #DateiNr, Trim(Debitorensatz.FiBuAnsprechpartner); Chr(9);
    '3030                 Print #DateiNr, Trim(Debitorensatz.FiBuGeschäftsführer); Chr(9);
    '3040                 Print #DateiNr, Trim(Debitorensatz.FiBuTelefon); Chr(9);
    '3050                 Print #DateiNr, Trim(Debitorensatz.FiBuFax); Chr(9);
    '3060                 Print #DateiNr, Trim(Debitorensatz.FiBuEMailAdresse); Chr(9);
    '3070                 Print #DateiNr, Trim(Debitorensatz.FiBuBemerkung); Chr(9)

    '3080             End If
    '3090             rstSQL.Close

    '                 ' Feld FiBuSchnittstelle in Tabelle Kunden ausschalten, nachdem die Schnittstellendaten bereitgestellt wurden.
    '3100             dbs.Execute ("UPDATE Kunden SET Kunden.FiBuSchnittstelle = No WHERE (((Kunden.FiBuSchnittstelle)=Yes) AND ((Kunden.KundenNr)=" & rstACC!KundenNr & "));")

    '3110             rstACC.MoveNext
    '3120         Loop

    '3130         Call SysCmd(acSysCmdRemoveMeter)
    '3140     End If
    '3150     rstACC.Close
    '3160     Set rstACC = Nothing

    '3170     fktFiBuDebitoren = True

    'PROC_Exit:
    '3180 On Error Resume Next
    '         ' Verbindung zur Schnittstellendatei trennen.
    '3190     If fDateiOpen Then
    '3200         Close DateiNr
    '3210         fDateiOpen = False
    '3220     End If
    '         ' Verbindung zur SQL-Server-Datenbank trennen.
    '3230     If Not rstSQL Is Nothing Then
    '3240         If rstSQL.State = adStateOpen Then rstSQL.Close
    '3250         Set rstSQL = Nothing
    '3260     End If
    '3270     If Not cnnFIBU2 Is Nothing Then
    '3280         If cnnFIBU2.State = adStateOpen Then cnnFIBU2.Close
    '3290         Set cnnFIBU2 = Nothing
    '3300     End If
    '         ' Verbindung zur Access-Datenbank trennen.
    '3310     If Not rstACC Is Nothing Then
    '3320         rstACC.Close
    '3330         Set rstACC = Nothing
    '3340     End If
    '3350     DoCmd.Hourglass False
    '3360     Exit Function

    'PROC_Error:
    '3370     DoCmd.Hourglass False
    '3380     ErrNotify Err, "basFiBuSyska", "fktFiBuDebitoren", eNormalError
    '3390     Resume PROC_Exit

    '     End Function





    '    Public Function fktFiBuBuchungen(ByVal intFirma_ID As Integer)
    '100  On Error GoTo PROC_Error

    '         Dim wrk As DAO.Workspace
    '        Dim db As DAO.Database
    '        Dim rstInvoice As DAO.Recordset
    '        Dim rstProduct As DAO.Recordset
    '        Dim DateiName As String
    '        Dim DateiNr As Integer
    '        Dim fDateiOpen As Boolean
    '        Dim lngFortschritt As Long
    '        Dim fInTransaktion As Boolean
    '        Dim curDifferenzbetrag As Currency
    '        Dim curNettobetrag As Currency
    '        Dim curSteuerbetrag As Currency
    '        Dim curBruttobetrag As Currency

    '110      DoCmd.Hourglass True
    '120      fInTransaktion = False
    '130      fktFiBuBuchungen = False

    '140      Call Logbucheintrag(0, 0, "basFiBuSyska.fktFiBuBuchungen(" & intFirma_ID & ")", 0, "gestartet")

    '150      Set wrk = DBEngine.Workspaces(0)
    '160      Set db = CurrentDb

    '         ' Transaktion starten
    '170      wrk.BeginTrans
    '180      fInTransaktion = True

    '         ' Invoice-Sätze lesen.
    '190      Set rstInvoice = SPRecordsetMitParameter("dbo.spTrdinFiBuSelectInvoice", AktuelleVerbindungszeichenfolge(0), intFirma_ID)
    '200      If Not rstInvoice.EOF Then
    '210          DateiName = "F:\FMZoll\FiBu\Syska\" & intFirma_ID & "\BUBE_" & Format(Now(), "yymmddhhmmss") & ".txt"
    '220          DateiNr = FreeFile                     ' Freie DateiNr
    '230          Forms![Daten-Transfer]!strInformation = DateiName
    '240          Open DateiName For Output As DateiNr   ' Datei öffnen.
    '250          Forms![Daten-Transfer]!strInformation = ""
    '260          fDateiOpen = True

    '             ' Invoice-Sätze verarbeiten.
    '270          rstInvoice.MoveLast
    '280          RC = SysCmd(acSysCmdInitMeter, DateiName & " schreiben", rstInvoice.RecordCount)
    '290          rstInvoice.MoveFirst
    '300          lngFortschritt = 0
    '310          Do
    '320              lngFortschritt = lngFortschritt + 1
    '330              RC = SysCmd(acSysCmdUpdateMeter, lngFortschritt)

    '                 ' Buchungssatz Vorbelegung
    '340              Buchungssatz.FiBuBuchungsart = "L"
    '350              Buchungssatz.FiBuBelegdatum = Format(rstInvoice![RechnungsDatum], "dd.mm.yyyy")
    '360              Buchungssatz.FiBuBelegnummer = Format(Right(rstInvoice![Rechnungsnummer], 8), "00000000")
    '370              Buchungssatz.FiBuBuchungstext = Format(rstInvoice![FilialenNr], "0000") & "/" & Format(Right(rstInvoice![AbfertigungsNr], 8), "00000000") & "/" & Format(rstInvoice![UnterNr], "00")
    '380              If IsNull(rstInvoice![WährungFremd]) Then
    '390                  Buchungssatz.FiBuWährung = rstInvoice![WährungLokal]
    '400                  curDifferenzbetrag = IIf(rstInvoice![RechnungsbetragLokal] < 0, 0 - rstInvoice![RechnungsbetragLokal], rstInvoice![RechnungsbetragLokal])
    '410              Else
    '420                  Buchungssatz.FiBuWährung = rstInvoice![WährungFremd]
    '430                  curDifferenzbetrag = IIf(rstInvoice![RechnungsbetragFremd] < 0, 0 - rstInvoice![RechnungsbetragFremd], rstInvoice![RechnungsbetragFremd])
    '440              End If

    '                 ' Buchungssatz Rechnung (immer erste Buchungszeile)
    '450              If rstInvoice![BelegartenNr] = RECHNUNG Then
    '460                  Buchungssatz.FiBuSollkontonummer = rstInvoice![KundenNrZentrale]
    '470                  Buchungssatz.FiBuHabenkontonummer = "0"
    '480                  If IsNull(rstInvoice![WährungFremd]) Then
    '490                      Buchungssatz.FiBuBruttobetrag = Format(rstInvoice![RechnungsbetragLokal], "########0.00")
    '500                  Else
    '510                      Buchungssatz.FiBuBruttobetrag = Format(rstInvoice![RechnungsbetragFremd], "########0.00")
    '520                  End If
    '530                  Buchungssatz.FiBuSteuersatz = " "
    '540                  Buchungssatz.FiBuSteuerbetrag = " "
    '550                  Buchungssatz.FiBuEigenbruttobetrag = Format(rstInvoice![RechnungsbetragLokal], "########0.00")
    '560                  Print #DateiNr, Trim(Buchungssatz.FiBuBuchungsart); Chr(9);
    '570                  Print #DateiNr, Trim(Buchungssatz.FiBuBelegdatum); Chr(9);
    '580                  Print #DateiNr, Trim(Buchungssatz.FiBuBelegnummer); Chr(9);
    '590                  Print #DateiNr, Trim(Buchungssatz.FiBuSollkontonummer); Chr(9);
    '600                  Print #DateiNr, Trim(Buchungssatz.FiBuHabenkontonummer); Chr(9);
    '610                  Print #DateiNr, Trim(Buchungssatz.FiBuBuchungstext); Chr(9);
    '620                  Print #DateiNr, Trim(Buchungssatz.FiBuBruttobetrag); Chr(9);
    '630                  Print #DateiNr, Trim(Buchungssatz.FiBuSteuersatz); Chr(9);
    '640                  Print #DateiNr, Trim(Buchungssatz.FiBuSteuerbetrag); Chr(9);
    '650                  Print #DateiNr, Trim(Buchungssatz.FiBuWährung); Chr(9);
    '660                  Print #DateiNr, Trim(Buchungssatz.FiBuEigenbruttobetrag)
    '670              End If

    '                 ' Product-Sätze lesen.
    '680              Set rstProduct = SPRecordsetMitParameter("dbo.spTrdinFiBuSelectProduct", AktuelleVerbindungszeichenfolge(0), rstInvoice![RechnungsDatum], rstInvoice![Rechnungsnummer])
    '690              Do Until rstProduct.EOF
    '                     ' Buchungssatz Splittbuchungen
    '700                  Select Case rstInvoice![BelegartenNr]
    '                         Case RECHNUNG
    '710                          Buchungssatz.FiBuSollkontonummer = "0"
    '720                          Buchungssatz.FiBuHabenkontonummer = Nz(rstProduct![Sachkonto], "    ")
    '730                          If IsNull(rstInvoice![WährungFremd]) Then
    '740                              curNettobetrag = rstProduct![BetragLokal]
    '750                          Else
    '760                              curNettobetrag = rstProduct![BetragFremd]
    '770                          End If
    '780                      Case GUTSCHRIFT
    '790                          Buchungssatz.FiBuSollkontonummer = Nz(rstProduct![Sachkonto], "    ")
    '800                          Buchungssatz.FiBuHabenkontonummer = "0"
    '810                          If IsNull(rstInvoice![WährungFremd]) Then
    '820                              curNettobetrag = 0 - rstProduct![BetragLokal]
    '830                          Else
    '840                              curNettobetrag = 0 - rstProduct![BetragFremd]
    '850                          End If
    '860                  End Select
    '870                  Buchungssatz.FiBuBuchungstext = Nz(rstProduct![Buchungstext], "")
    '880                  If rstProduct![steuerpflichtig] Then
    '890                      curSteuerbetrag = CLng(curNettobetrag * rstInvoice![Steuersatz %] * 100) / 100
    '900                      curBruttobetrag = curNettobetrag + curSteuerbetrag
    '910                      curDifferenzbetrag = curDifferenzbetrag - curBruttobetrag
    '920                      Buchungssatz.FiBuBruttobetrag = Format(curBruttobetrag, "########0.00")
    '930                      Buchungssatz.FiBuSteuersatz = Format(rstInvoice![Steuersatz %] * 100, "00.00")
    '                         ' Die folgende Zeile führt zu Buchungsfehler bei Fremdwährung,
    '                         '   Buchungssatz.FiBuSteuerbetrag = Format(curSteuerbetrag, "########0.00")
    '                         ' deshalb nur Steuerprozent und keinen Steuerbetrag übergeben.
    '940                      Buchungssatz.FiBuSteuerbetrag = " "
    '950                  Else
    '960                      curBruttobetrag = curNettobetrag
    '970                      curDifferenzbetrag = curDifferenzbetrag - curBruttobetrag
    '980                      Buchungssatz.FiBuBruttobetrag = Format(curBruttobetrag, "########0.00")
    '990                      Buchungssatz.FiBuSteuersatz = "00,00"
    '1000                     Buchungssatz.FiBuSteuerbetrag = " "
    '1010                 End If
    '1020                 If IsNull(rstInvoice![WährungFremd]) Then
    '1030                     Buchungssatz.FiBuEigenbruttobetrag = Format(curBruttobetrag, "########0.00")
    '1040                 Else
    '1050                     Buchungssatz.FiBuEigenbruttobetrag = Format(fktEuro(curBruttobetrag, rstInvoice![WährungFremd], "EUR"), "########0.00")
    '1060                 End If
    '1070                 Print #DateiNr, Trim(Buchungssatz.FiBuBuchungsart); Chr(9);
    '1080                 Print #DateiNr, Trim(Buchungssatz.FiBuBelegdatum); Chr(9);
    '1090                 Print #DateiNr, Trim(Buchungssatz.FiBuBelegnummer); Chr(9);
    '1100                 Print #DateiNr, Trim(Buchungssatz.FiBuSollkontonummer); Chr(9);
    '1110                 Print #DateiNr, Trim(Buchungssatz.FiBuHabenkontonummer); Chr(9);
    '1120                 Print #DateiNr, Trim(Buchungssatz.FiBuBuchungstext); Chr(9);
    '1130                 Print #DateiNr, Trim(Buchungssatz.FiBuBruttobetrag); Chr(9);
    '1140                 Print #DateiNr, Trim(Buchungssatz.FiBuSteuersatz); Chr(9);
    '1150                 Print #DateiNr, Trim(Buchungssatz.FiBuSteuerbetrag); Chr(9);
    '1160                 Print #DateiNr, Trim(Buchungssatz.FiBuWährung); Chr(9);
    '1170                 Print #DateiNr, Trim(Buchungssatz.FiBuEigenbruttobetrag)
    '1180                 rstProduct.MoveNext
    '1190             Loop
    '1200             rstProduct.Close

    '                 ' Buchungssatz Steuerdifferenz
    '1210             If curDifferenzbetrag <> 0 Then
    '1220                 Select Case rstInvoice![BelegartenNr]
    '                         Case RECHNUNG
    '1230                         Buchungssatz.FiBuSollkontonummer = "0"
    '1240                         Buchungssatz.FiBuHabenkontonummer = "8490"
    '1250                     Case GUTSCHRIFT
    '1260                         Buchungssatz.FiBuSollkontonummer = "8490"
    '1270                         Buchungssatz.FiBuHabenkontonummer = "0"
    '1280                 End Select
    '1290                 Buchungssatz.FiBuBuchungstext = Format(rstInvoice![FilialenNr], "0000") & "/" & Format(Right(rstInvoice![AbfertigungsNr], 8), "00000000") & "/" & Format(rstInvoice![UnterNr], "00") & "/Steuerdiff."
    '1300                 Buchungssatz.FiBuBruttobetrag = Format(curDifferenzbetrag, "########0.00")
    '1310                 Buchungssatz.FiBuSteuersatz = "00,00"
    '1320                 Buchungssatz.FiBuSteuerbetrag = " "
    '1330                 If IsNull(rstInvoice![WährungFremd]) Then
    '1340                     Buchungssatz.FiBuEigenbruttobetrag = Format(curDifferenzbetrag, "########0.00")
    '1350                 Else
    '1360                     Buchungssatz.FiBuEigenbruttobetrag = Format(fktEuro(curDifferenzbetrag, rstInvoice![WährungFremd], "EUR"), "########0.00")
    '1370                 End If
    '1380                 Print #DateiNr, Trim(Buchungssatz.FiBuBuchungsart); Chr(9);
    '1390                 Print #DateiNr, Trim(Buchungssatz.FiBuBelegdatum); Chr(9);
    '1400                 Print #DateiNr, Trim(Buchungssatz.FiBuBelegnummer); Chr(9);
    '1410                 Print #DateiNr, Trim(Buchungssatz.FiBuSollkontonummer); Chr(9);
    '1420                 Print #DateiNr, Trim(Buchungssatz.FiBuHabenkontonummer); Chr(9);
    '1430                 Print #DateiNr, Trim(Buchungssatz.FiBuBuchungstext); Chr(9);
    '1440                 Print #DateiNr, Trim(Buchungssatz.FiBuBruttobetrag); Chr(9);
    '1450                 Print #DateiNr, Trim(Buchungssatz.FiBuSteuersatz); Chr(9);
    '1460                 Print #DateiNr, Trim(Buchungssatz.FiBuSteuerbetrag); Chr(9);
    '1470                 Print #DateiNr, Trim(Buchungssatz.FiBuWährung); Chr(9);
    '1480                 Print #DateiNr, Trim(Buchungssatz.FiBuEigenbruttobetrag)
    '1490             End If

    '                 ' Buchungssatz Gutschrift (immer letzte Buchungszeile)
    '1500             If rstInvoice![BelegartenNr] = GUTSCHRIFT Then
    '1510                 Buchungssatz.FiBuSollkontonummer = "0"
    '1520                 Buchungssatz.FiBuHabenkontonummer = rstInvoice![KundenNrZentrale]
    '1530                 Buchungssatz.FiBuBuchungstext = Format(rstInvoice![FilialenNr], "0000") & "/" & Format(Right(rstInvoice![AbfertigungsNr], 8), "00000000") & "/" & Format(rstInvoice![UnterNr], "00")
    '1540                 If IsNull(rstInvoice![WährungFremd]) Then
    '1550                     Buchungssatz.FiBuBruttobetrag = Format(0 - rstInvoice![RechnungsbetragLokal], "########0.00")
    '1560                 Else
    '1570                     Buchungssatz.FiBuBruttobetrag = Format(0 - rstInvoice![RechnungsbetragFremd], "########0.00")
    '1580                 End If
    '1590                 Buchungssatz.FiBuSteuersatz = " "
    '1600                 Buchungssatz.FiBuSteuerbetrag = " "
    '1610                 Buchungssatz.FiBuEigenbruttobetrag = Format(0 - rstInvoice![RechnungsbetragLokal], "########0.00")
    '1620                 Print #DateiNr, Trim(Buchungssatz.FiBuBuchungsart); Chr(9);
    '1630                 Print #DateiNr, Trim(Buchungssatz.FiBuBelegdatum); Chr(9);
    '1640                 Print #DateiNr, Trim(Buchungssatz.FiBuBelegnummer); Chr(9);
    '1650                 Print #DateiNr, Trim(Buchungssatz.FiBuSollkontonummer); Chr(9);
    '1660                 Print #DateiNr, Trim(Buchungssatz.FiBuHabenkontonummer); Chr(9);
    '1670                 Print #DateiNr, Trim(Buchungssatz.FiBuBuchungstext); Chr(9);
    '1680                 Print #DateiNr, Trim(Buchungssatz.FiBuBruttobetrag); Chr(9);
    '1690                 Print #DateiNr, Trim(Buchungssatz.FiBuSteuersatz); Chr(9);
    '1700                 Print #DateiNr, Trim(Buchungssatz.FiBuSteuerbetrag); Chr(9);
    '1710                 Print #DateiNr, Trim(Buchungssatz.FiBuWährung); Chr(9);
    '1720                 Print #DateiNr, Trim(Buchungssatz.FiBuEigenbruttobetrag)
    '1730             End If

    '                 ' Datenbereitstellung an FiBu - TrdinDateiname im Buchungskopfsatz eintragen.
    '1740             Call SPAktionsabfrageOhneErgebnis("dbo.spTrdinFiBuUpdateInvoice", AktuelleVerbindungszeichenfolge(0), rstInvoice![RechnungsDatum], rstInvoice![Rechnungsnummer], Mid(DateiName, Len(DateiName) - 15, 12))

    '1750             rstInvoice.MoveNext
    '1760         Loop Until rstInvoice.EOF
    '1770         RC = SysCmd(acSysCmdRemoveMeter)

    '1780     End If
    '1790     rstInvoice.Close

    '         ' Transaktion beenden
    '1800     If fInTransaktion Then
    '1810         wrk.CommitTrans
    '1820         fInTransaktion = False
    '1830     End If

    '1840     fktFiBuBuchungen = True

    'PROC_Exit:
    '1850 On Error Resume Next

    '         ' Schnittstellendatei schließen.
    '1860     If fDateiOpen Then Close DateiNr

    '1870     If Not rstProduct Is Nothing Then
    '1880         rstProduct.Close
    '1890         Set rstProduct = Nothing
    '1900     End If
    '1910     If Not rstInvoice Is Nothing Then
    '1920         rstInvoice.Close
    '1930         Set rstInvoice = Nothing
    '1940     End If
    '1950     If Not db Is Nothing Then Set db = Nothing
    '1960     If Not wrk Is Nothing Then Set wrk = Nothing

    '1970     DoCmd.Hourglass False
    '1980     Exit Function

    'PROC_Error:
    '        ' Änderungen am Datenbestand zurücknehmen.
    '1990     If fInTransaktion Then
    '2000         wrk.Rollback
    '2010         fInTransaktion = False
    '2020     End If
    '         ' Fehlerinformation anzeigen.
    '2030     ErrNotify Err, "basFiBuSyska", "fktFiBuBuchungen", eNormalError
    '2040     Call Logbucheintrag(0, 0, "basFiBuSyska.fktFiBuBuchungen", 0, "Wegen Fehler beendet")
    '2050     Resume PROC_Exit

    '     End Function


    Public Shared Function OP_Einlesen_ALL(Optional KdNr As Integer = -1) As Boolean
        Dim dt As DataTable = SQL.loadDgvBySql("SELECT Firma_ID FROM tblFirma ORDER BY tblFirma.Firma_ID", "FMZOLL")

        Dim _bool = True
        If dt IsNot Nothing Then
            For Each r_firma In dt.Rows
                If Not OP_Einlesen(r_firma("Firma_ID"), KdNr) Then _bool = False
            Next
        End If
        Return _bool
    End Function

    Public Shared Function OP_Einlesen(Firma_ID As Integer, Optional KdNr As Integer = -1) As Boolean
        Try
            Dim OP_ID_CNT = 0
            If OP_ID_CNT < 1000000 Then OP_ID_CNT = 1000000 * Firma_ID

            Dim dt_OP As DataTable = SQL.loadDgvBySql("SELECT * FROM op_debitor WHERE (i_firm_refid = '" & Firma_ID & "') AND (dt_geloescht IS NULL) " & If(KdNr > 0, " AND i_personenkonto='" & KdNr & "'", "") & " ORDER BY i_personenkonto, d_rechnung, c_urbelegid", "FIBU")

            If dt_OP IsNot Nothing Then
                Dim KumSaldoEUR As Double = 0
                Dim tmpFirma_Id As Integer = -1
                Dim tmpKonotnr As Integer = -1

                ' If OP_DELETE(Firma_ID, KdNr) Then
                If OP_DELETE(Firma_ID, KdNr) Then

                    For Each r_OP In dt_OP.Rows

                        Try
                            If KdNr > 1 Then OP_ID_CNT = SQL.getValueTxtBySql("SELECT isnull(MAX(OP_ID),0)+1 FROM [Offene Posten] WHERE Firma_ID = '" & Firma_ID & "'", "FMZOLL") 'Wenn ein Kunde geändert wird, wird die höchste ID ermittelt --> höchste ID des OPS der FIRMA!!!!

                            Dim OP As New VERAG_PROG_ALLGEMEIN.cOffene_Posten()

                            OP.OP_ID = OP_ID_CNT
                            OP.Kontonummer = r_OP("i_personenkonto")
                            OP.Belegnummer = r_OP("c_urbelegid")
                            OP.Belegdatum = r_OP("d_rechnung")
                            OP.Fälligkeitsdatum = r_OP("d_netto")
                            OP.Bruttobetrag = r_OP("eur_bruttobetrag")
                            OP.Waehrung = "EUR"
                            OP.Gesamtausstand = r_OP("eur_bruttobetrag") + r_OP("eur_zahlung")
                            OP.Buchungstext = r_OP("c_bemerkung")
                            OP.Mahnstufe = r_OP("si_mahnstufe")
                            OP.Mahndatum = r_OP("d_mahnung")
                            OP.Firma_ID = r_OP("i_firm_refid")


                            'Erstmals setzen:
                            If tmpFirma_Id < 0 Then tmpFirma_Id = OP.Firma_ID
                            If tmpKonotnr < 0 Then tmpKonotnr = OP.Kontonummer

                            If tmpKonotnr <> OP.Kontonummer Or tmpFirma_Id <> OP.Firma_ID Then
                                KumSaldoEUR = 0 'Zurücksetzen, wenn anderer Kunde, oder andere Firma
                            End If
                            KumSaldoEUR += OP.Gesamtausstand 'um Betrag erhöhen
                            OP.KumSaldoEUR = KumSaldoEUR 'Kumsalde in DB

                            '   MsgBox(OP.Belegnummer)

                            OP.INSERT()

                            OP_ID_CNT += 1
                            tmpFirma_Id = OP.Firma_ID
                            tmpKonotnr = OP.Kontonummer

                        Catch ex As Exception
                            MsgBox(ex.Message & ex.StackTrace)
                        End Try
                    Next

                Else
                    MsgBox("FEHLER beim Löschen der vorhandenen OP-Liste.")
                    Return False
                End If
            End If
            OP_LFD_SALDO_AKTUALISIERN(Firma_ID, KdNr)

            Return True
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
            Return False
        End Try
    End Function
    Public Shared Function OP_LFD_SALDO_AKTUALISIERN(Firma_ID As Integer) As Boolean
        Try

            Dim sqlStr = " 
                      UPDATE KUNDEN
                    SET LfdSaldo=(SELECT TOP 1 [KumSaldoEUR] FROM [Offene Posten] where  Kontonummer=KundenNrZentrale order by [OP_ID] desc )

                      FROM
                       Kunden   
	                    WHERE (SELECT COUNT(*) FROM [Offene Posten] WHERE  KundenNrZentrale=Kontonummer " & If(Firma_ID > 0, " AND Firma_ID='" & Firma_ID & "' ", "") & ")>=0  "



            SQL.doSQL(sqlStr, "FMZOLL",,,, 1800)

            Return True
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
            Return False
        End Try
    End Function


    Public Shared Function OP_LFD_SALDO_AKTUALISIERN(Firma_ID As Integer, KdNr As Integer) As Boolean
        If KdNr <= 0 Then
            Return OP_LFD_SALDO_AKTUALISIERN(Firma_ID)
        End If

        Try

            Dim sqlStr = " 
                      UPDATE KUNDEN
                        SET LfdSaldo=(SELECT TOP 1 [KumSaldoEUR] FROM [Offene Posten] where  Kontonummer=KundenNrZentrale  order by [OP_ID] desc )

                          FROM
                           Kunden   
	                        WHERE (SELECT COUNT(*) FROM [Offene Posten] WHERE  KundenNrZentrale=Kontonummer " & If(Firma_ID > 0, " AND Firma_ID='" & Firma_ID & "' ", "") & ")>=0  
                        AND KundenNrZentrale='" & KdNr & "' 
                    "


            SQL.doSQL(sqlStr, "FMZOLL",,,, 600)

            Return True
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
            Return False
        End Try
    End Function



    '    strSQL = "SELECT [Offene Posten].Kontonummer, [Offene Posten].Firma_ID, [Offene Posten].Belegdatum, [Offene Posten].Belegnummer, [Offene Posten].Gesamtausstand, [Offene Posten].KumSaldoEUR" & _
    '             " FROM [Offene Posten]" & _
    '             " ORDER BY [Offene Posten].Kontonummer, [Offene Posten].Firma_ID, [Offene Posten].Belegdatum, [Offene Posten].Belegnummer;"
    '5180     Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
    '5190     With rst
    '5200         If Not .EOF Then
    '5210             lngKontonummer = !Kontonummer
    '5220             intFirma_ID = !Firma_ID
    '5230             curKumSaldoFirma = 0
    '5240             curKumSaldo = 0
    '5250             Do Until .EOF
    '5260                 .Edit
    '                     ' Saldo je Kontonummer und Firma kumulieren.
    '5270                 If lngKontonummer <> !Kontonummer Then
    '5280                     strKumSaldo = CStr(curKumSaldo)
    '5290                     I = InStr(strKumSaldo, ",")
    '5300                     If I > 0 Then Mid(strKumSaldo, I, 1) = "."
    '5310                     strSQL = "UPDATE Kunden SET Kunden.LfdSaldo = " & strKumSaldo & " WHERE (((Kunden.KundenNrZentrale)=" & lngKontonummer & "));"
    '5320                     dbs.Execute strSQL, dbFailOnError
    '5330                     lngKontonummer = !Kontonummer
    '5340                     intFirma_ID = !Firma_ID
    '5350                     curKumSaldoFirma = !Gesamtausstand
    '5360                     curKumSaldo = !Gesamtausstand
    '5370                 Else
    '5380                     curKumSaldo = curKumSaldo + !Gesamtausstand
    '5390                     If intFirma_ID <> !Firma_ID Then
    '5400                         intFirma_ID = !Firma_ID
    '5410                         curKumSaldoFirma = !Gesamtausstand
    '5420                     Else
    '5430                         curKumSaldoFirma = curKumSaldoFirma + !Gesamtausstand
    '5440                     End If
    '5450                 End If
    '5460                 !KumSaldoEUR = curKumSaldoFirma
    '5470                 .Update
    '5480                 .MoveNext
    '5490             Loop
    '5500             strKumSaldo = CStr(curKumSaldo)
    '5510             I = InStr(strKumSaldo, ",")
    '5520             If I > 0 Then Mid(strKumSaldo, I, 1) = "."
    '5530             strSQL = "UPDATE Kunden SET Kunden.LfdSaldo = " & strKumSaldo & " WHERE (((Kunden.KundenNrZentrale)=" & lngKontonummer & "));"
    '5540             dbs.Execute strSQL, dbFailOnError
    '5550         End If
    '5560         .Close
    '5570     End With



    Public Shared Function OP_DELETE(Firma_ID As Integer, Optional KdNr As Integer = -1) As Boolean
        Dim SQL As New SQL
        Return SQL.doSQL("DELETE FROM [Offene Posten] where Firma_ID='" & Firma_ID & "'" & If(KdNr > 0, " AND Kontonummer='" & KdNr & "'", ""), "FMZOLL")
    End Function



    Public Shared Function UPDATE_FIBU_RISIKO(Optional KdNr = -1) As Boolean
        Try

            Dim dt = SQL.loadDgvBySql(getFIBU_RISIKOSQL, "FMZOLL")
            If dt IsNot Nothing Then
                For Each r In dt.Rows

                    If KdNr = -1 OrElse r("KundenNrZentrale") = KdNr Then 'TEST!! 
                        Dim strRisiko As String = "0"
                        If r("Risiko") IsNot DBNull.Value Then strRisiko = CDbl(r("Risiko")).ToString.Replace(",", ".")

                        'If r("Risiko") IsNot DBNull.Value Then

                        '    MsgBox(Format(CDbl(r("Risiko")), fmt).Replace(",", "."))
                        'MsgBox(Format(CDbl(r("Risiko")), fmt))
                        '    MsgBox((CDbl(r("Risiko"))))
                        'End If

                        SQL.doSQL("UPDATE [FIBU2].[dbo].[fibu_konto]
                                                  SET [dec_wert3] = '" & strRisiko & "'
                                                  WHERE ([i_firm_refid]=1 Or [i_firm_refid]=19)
                                                  AND [c_kontoart]='DE' 
                                                        And [i_konto]=" & r("KundenNrZentrale") & " ", "FIBU")
                    End If
                Next
            End If
            Return True

        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name, VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL)
            Return False
        End Try

    End Function

    Shared Function getFIBU_RISIKOSQL() As String
        Return "SELECT KundenNrZentrale, Risiko, LfdSaldo, Sum([UStV-Saldo]) AS [SummevonUStV-Saldo], Sum(UStV_Summe3470BetragEUR) AS SummevonUStV_Summe3470BetragEUR, Sum(UStV_SummeVZBetragEUR) AS SummevonUStV_SummeVZBetragEUR, Sum(UStV_SummeVorschaubetragEUR) AS SummevonUStV_SummeVorschaubetragEUR, BankgarantieBetrag, BankgarantieGültigBis
                FROM (
	                SELECT Adressen.Ordnungsbegriff AS [Index], Adressen.LandKz, Adressen.AdressenNr, Kunden.KundenNrZentrale, Kunden.Abfertigungsverbot, 
	                Kunden.LfdSaldo,
	                [LfdSaldo]-((case when [UStV_SummeUmsatzsteuerbetragEUR]>[UStV_SummeErstattungsbetragEUR] THEN [UStV_SummeUmsatzsteuerbetragEUR]-[UStV_SummeErstattungsbetragEUR] ELSE 0 END)+[UStV_Summe3470BetragEUR]-[UStV_SummeVZBetragEUR]+[UStV_SummeVorschaubetragEUR])
	                -(CASE WHEN isnull([BankgarantieGültigBis],GETDATE())<GETDATE() THEN 0 ELSE isnull([BankgarantieBetrag],0) END) AS Risiko, 
	                 Kunden.UStV_SummeUmsatzsteuerbetragEUR, Kunden.UStV_SummeErstattungsbetragEUR, 
	                 case when [UStV_SummeUmsatzsteuerbetragEUR]>[UStV_SummeErstattungsbetragEUR] THEN [UStV_SummeUmsatzsteuerbetragEUR]-[UStV_SummeErstattungsbetragEUR] ELSE 0 END AS [UStV-Saldo], 
	                 Kunden.UStV_Summe3470BetragEUR, Kunden.UStV_SummeVZBetragEUR, Kunden.UStV_SummeVorschaubetragEUR, Kunden.BankgarantieBetrag, Kunden.BankgarantieGültigBis
 
	                FROM (Adressen INNER JOIN Kunden ON Adressen.AdressenNr = Kunden.KundenNr) INNER JOIN tblSteuernummern ON Adressen.AdressenNr = tblSteuernummern.AdressenNr
	                GROUP BY Adressen.Ordnungsbegriff, Adressen.LandKz, Adressen.AdressenNr, Kunden.KundenNrZentrale, Kunden.Abfertigungsverbot, Kunden.LfdSaldo, Kunden.UStV_SummeUmsatzsteuerbetragEUR, 
	                Kunden.UStV_SummeErstattungsbetragEUR, Kunden.UStV_Summe3470BetragEUR, Kunden.UStV_SummeVZBetragEUR, Kunden.UStV_SummeVorschaubetragEUR, Kunden.BankgarantieBetrag, Kunden.BankgarantieGültigBis
                ) as T1
                GROUP BY KundenNrZentrale, Risiko,LfdSaldo, BankgarantieBetrag, BankgarantieGültigBis "
    End Function

End Class
