Public Class cDatev_Interface

    Shared datevVersion As Integer = 700
    Shared Datenkategorie As Integer = 16
    Shared StapelbuchungsNr As Integer = 21
    Shared BeraterNr As Integer = 3050
    Shared MandantenNr As Integer = 12533
    Shared Kontenlänge As Integer = 6
    Shared Formatversion As Integer = 4
    Shared SQL As New VERAG_PROG_ALLGEMEIN.SQL

    'STAMMDATEN
    Shared Function getStammdaten(filialNr As Integer) As DataTable
        Dim sqlStr = "Select TOP (1000) KundenNrZentrale As [Kontonummer], isnull([Ordnungsbegriff],'') as Ordnungsbegriff, isnull([Name 1],'') as Name, isnull([Name 2],'') as Name2, LTRIM([Ort]) as Ort,KundenNr As [Kundennummer],isnull(UstIdKz,'') As [EU-Land] ,isnull(UstIdNr,'') As [EU-UstID], isnull(Anrede,'') as Anrede,isnull(KTO,'') as Bankkonto, isnull(BLZ,'') as [BLZ], '' as [Bankname], '' as [Länderkennzeichen Bank], '' as [IBAN], '' as [BIC], '' as [Anrede], '' as [Adresszusatz], ISNULL([Strasse],'') as Strasse, ISNULL(PLZ,'') as PLZ,  isnull(UstIdNr,'') as [Steuernummer], isnull(Ansprechpartner,'') as [Ansprechpartner], isnull(Telefon,'') as [Telefonnummer], isnull([E-Mail],'') as [E-Mail], isnull([Telefax],'') as [Faxnummer], '' as [Internetadresse],  isnull(Adressen.landkz,'') as [Länderkennzeichen]"
        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 Auswahl='A' AND FilialenNr='" & filialNr & "' And FiBuSchnittstelle = 1"
        sqlStr &= " Order by [Kontonummer] "
        Return SQL.loadDgvBySql(sqlStr, "FMZOLL")
    End Function

    Shared Function updateFibu(filialNr As Integer) 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 FilialenNr='" & filialNr & "' "
        Return SQL.loadDgvBySql(sqlStr, "FMZOLL")
    End Function


    Public Shared Function genStammdatenBeginn() As String
        Return "Konto;Name (Adressattyp Unternehmen);Unternehmensgegenstand;Name (Adressattyp natürl. Person);Vorname (Adressattyp natürl. Person);Name (Adressattyp keine Angabe);Adressattyp;Kurzbezeichnung;EU-Land;EU-UStID;Anrede;Titel/Akad. Grad;Adelstitel;Namensvorsatz;Adressart;Straße;Postfach;Postleitzahl;Ort;Land;Versandzusatz;Adresszusatz;Abweichende Anrede;Abw. Zustellbezeichnung 1;Abw. Zustellbezeichnung 2;Kennz. Korrespondenzadresse;Adresse Gültig von;Adresse Gültig bis;Telefon;Bemerkung (Telefon);Telefon GL;Bemerkung (Telefon GL);E-Mail;Bemerkung (E-Mail);Internet;Bemerkung (Internet);Fax;Bemerkung (Fax);Sonstige;Bemerkung (Sonstige);Bankleitzahl 1;Bankbezeichnung 1;Bank-Kontonummer 1;Länderkennzeichen 1;IBAN-Nr. 1;Leerfeld;SWIFT-Code 1;Abw. Kontoinhaber 1;Kennz. Hauptbankverb. 1;Bankverb 1 Gültig von;Bankverb 1 Gültig bis;Bankleitzahl 2;Bankbezeichnung 2;Bank-Kontonummer 2;Länderkennzeichen 2;IBAN-Nr. 2;Leerfeld;SWIFT-Code 2;Abw. Kontoinhaber 2;Kennz. Hauptbankverb. 2;Bankverb 2 Gültig von;Bankverb 2 Gültig bis;Bankleitzahl 3;Bankbezeichnung 3;Bank-Kontonummer 3;Länderkennzeichen 3;IBAN-Nr. 3;Leerfeld;SWIFT-Code 3;Abw. Kontoinhaber 3;Kennz. Hauptbankverb. 3;Bankverb 3 Gültig von;Bankverb 3 Gültig bis;Bankleitzahl 4;Bankbezeichnung 4;Bank-Kontonummer 4;Länderkennzeichen 4;IBAN-Nr. 4;Leerfeld;SWIFT-Code 4;Abw. Kontoinhaber 4;Kennz. Hauptbankverb. 4;Bankverb 4 Gültig von;Bankverb 4 Gültig bis;Bankleitzahl 5;Bankbezeichnung 5;Bank-Kontonummer 5;Länderkennzeichen 5;IBAN-Nr. 5;Leerfeld;SWIFT-Code 5;Abw. Kontoinhaber 5;Kennz. Hauptbankverb. 5;Bankverb 5 Gültig von;Bankverb 5 Gültig bis;Leerfeld;Briefanrede;Grußformel;Kunden-/Lief.-Nr.;Steuernummer;Sprache;Ansprechpartner;Vertreter;Sachbearbeiter;Diverse-Konto;Ausgabeziel;Währungssteuerung;Kreditlimit (Debitor);Zahlungsbedingung;Fälligkeit in Tagen (Debitor);Skonto in Prozent (Debitor);Kreditoren-Ziel 1 Tg.;Kreditoren-Skonto 1 %;Kreditoren-Ziel 2 Tg.;Kreditoren-Skonto 2 %;Kreditoren-Ziel 3 Brutto Tg.;Kreditoren-Ziel 4 Tg.;Kreditoren-Skonto 4 %;Kreditoren-Ziel 5 Tg.;Kreditoren-Skonto 5 %;Mahnung;Kontoauszug;Mahntext 1;Mahntext 2;Mahntext 3;Kontoauszugstext;Mahnlimit Betrag;Mahnlimit %;Zinsberechnung;Mahnzinssatz 1;Mahnzinssatz 2;Mahnzinssatz 3;Lastschrift;Leerfeld;Mandantenbank;Zahlungsträger;Indiv. Feld 1;Indiv. Feld 2;Indiv. Feld 3;Indiv. Feld 4;Indiv. Feld 5;Indiv. Feld 6;Indiv. Feld 7;Indiv. Feld 8;Indiv. Feld 9;Indiv. Feld 10;Indiv. Feld 11;Indiv. Feld 12;Indiv. Feld 13;Indiv. Feld 14;Indiv. Feld 15;Abweichende Anrede (Rechnungsadresse);Adressart (Rechnungsadresse);Straße (Rechnungsadresse);Postfach (Rechnungsadresse);Postleitzahl (Rechnungsadresse);Ort (Rechnungsadresse);Land (Rechnungsadresse);Versandzusatz (Rechnungsadresse);Adresszusatz (Rechnungsadresse);Abw. Zustellbezeichnung 1 (Rechnungsadresse);Abw. Zustellbezeichnung 2 (Rechnungsadresse);Adresse Gültig von (Rechnungsadresse);Adresse Gültig bis (Rechnungsadresse);Bankleitzahl 6;Bankbezeichnung 6;Bank-Kontonummer 6;Länderkennzeichen 6;IBAN-Nr. 6;Leerfeld;SWIFT-Code 6;Abw. Kontoinhaber 6;Kennz. Hauptbankverb. 6;Bankverb 6 Gültig von;Bankverb 6 Gültig bis;Bankleitzahl 7;Bankbezeichnung 7;Bank-Kontonummer 7;Länderkennzeichen 7;IBAN-Nr. 7;Leerfeld;SWIFT-Code 7;Abw. Kontoinhaber 7;Kennz. Hauptbankverb. 7;Bankverb 7 Gültig von;Bankverb 7 Gültig bis;Bankleitzahl 8;Bankbezeichnung 8;Bank-Kontonummer 8;Länderkennzeichen 8;IBAN-Nr. 8;Leerfeld;SWIFT-Code 8;Abw. Kontoinhaber 8;Kennz. Hauptbankverb. 8;Bankverb 8 Gültig von;Bankverb 8 Gültig bis;Bankleitzahl 9;Bankbezeichnung 9;Bank-Kontonummer 9;Länderkennzeichen 9;IBAN-Nr. 9;Leerfeld;SWIFT-Code 9;Abw. Kontoinhaber 9;Kennz. Hauptbankverb. 9;Bankverb 9 Gültig von;Bankverb 9 Gültig bis;Bankleitzahl 10;Bankbezeichnung 10;Bank-Kontonummer 10;Länderkennzeichen 10;IBAN-Nr. 10;Leerfeld;SWIFT-Code 10;Abw. Kontoinhaber 10;Kennz. Hauptbankverb. 10;Bankverb 10 Gültig von;Bankverb 10 Gültig bis;Nummer Fremdsystem;Insolvent;SEPA-Mandatsreferenz 1;SEPA-Mandatsreferenz 2;SEPA-Mandatsreferenz 3;SEPA-Mandatsreferenz 4;SEPA-Mandatsreferenz 5;SEPA-Mandatsreferenz 6;SEPA-Mandatsreferenz 7;SEPA-Mandatsreferenz 8;SEPA-Mandatsreferenz 9;SEPA-Mandatsreferenz 10;Verknüpftes OPOS-Konto;Mahnsperre bis;Lastschriftsperre bis;Zahlungssperre bis;Gebührenberechnung;Mahngebühr 1;Mahngebühr 2;Mahngebühr 3;Pauschalenberechnung;Verzugspauschale 1;Verzugspauschale 2;Verzugspauschale 3;Alternativer Suchname;Status;Anschrift manuell geändert (Korrespondenzadresse);Anschrift individuell (Korrespondenzadresse);Anschrift manuell geändert (Rechnungsadresse);Anschrift individuell (Rechnungsadresse);Fristberechnung bei Debitor;Mahnfrist 1;Mahnfrist 2;Mahnfrist 3;Letzte Frist"
    End Function


    Public Shared Function getPersonenKto(row As DataRow) As String

        Dim personenRow As String = ""

        personenRow &= row("Kontonummer") & ";" 'Mapping für KOntonummern einbauen weil bei AMBAR Kundennummer <> DebitorenNr Datev
        personenRow &= FormatStringDVO(row("Name"), 50) & ";"
        personenRow &= FormatStringDVO(row("Name2"), 50) & ";"
        personenRow &= emptyFormatedValue(4)
        'personenRow &= FormatStringDVO(2) & ";" 'Typ Unternehmen
        personenRow &= FormatStringDVO(row("Ordnungsbegriff"), 15) & ";"
        personenRow &= FormatStringDVO(row("EU-Land")) & ";"
        personenRow &= FormatStringDVO(row("EU-UstID")) & ";"
        personenRow &= FormatStringDVO(row("Anrede")) & ";"
        personenRow &= emptyFormatedValue(4)
        personenRow &= FormatStringDVO(row("Strasse"), 36) & ";"
        personenRow &= emptyFormatedValue()
        personenRow &= FormatStringDVO(row("PLZ")) & ";"
        personenRow &= FormatStringDVO(row("Ort"), 30) & ";"
        personenRow &= IIf(row("Länderkennzeichen") <> "", Chr(34) & cProgramFunctions.getISO2Land(row("Länderkennzeichen")) & Chr(34) & ";", emptyFormatedValue())
        personenRow &= emptyFormatedValue()
        personenRow &= FormatStringDVO(row("Adresszusatz")) & ";"
        personenRow &= emptyFormatedValue(6)
        personenRow &= FormatStringDVO(row("Telefonnummer")) & ";"
        personenRow &= emptyFormatedValue(3)
        personenRow &= FormatStringDVO(row("E-Mail")) & ";"
        personenRow &= emptyFormatedValue()
        personenRow &= FormatStringDVO(row("Internetadresse")) & ";"
        personenRow &= emptyFormatedValue()
        personenRow &= FormatStringDVO(row("Faxnummer")) & ";"
        personenRow &= emptyFormatedValue(3)
        personenRow &= FormatStringDVO(row("BLZ")) & ";"
        personenRow &= emptyFormatedValue()
        personenRow &= FormatStringDVO(row("Bankkonto")) & ";"
        personenRow &= emptyFormatedValue()
        personenRow &= FormatStringDVO(row("IBAN")) & ";"
        personenRow &= emptyFormatedValue(197)

        Return personenRow

    End Function


    Public Shared Function genDatensatzCSV_Stammdaten(ByRef Firma_ID As Integer, Optional OpenFile As Boolean = False, Optional Geschaeftsjahr As Integer = -1) 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 filialNr As Integer

            Select Case FIRMA.Firma_ID
                Case 24 : filialNr = 5701

                Case Else : filialNr = -1


            End Select


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

            'DATEIPFAD für Stammdaten
            '-------------------------------------------------------------------------------------------
            Dim pathArchivKD = "\\datenarchiv.verag.ost.dmn\DATENARCHIV\DATENARCHIV_TESTSYSTEM\DATEV\ARCHIV\STAMMDATEN\" & FIRMA.Firma_Bez & "\"
            Dim pathKD = "\\datenarchiv.verag.ost.dmn\DATENARCHIV\DATENARCHIV_TESTSYSTEM\DATEV\STAMMDATEN\ " & FIRMA.Firma_Bez & "\" & Geschaeftsjahr & "\"
            'pathKD = pathArchivKD 'TEST

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


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

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


                fileKD.WriteLine(genStammdatenHeader(Geschaeftsjahr))
                fileKD.WriteLine(genStammdatenBeginn())

                initKDNr(dt_Stamm, FIRMA.Firma_ID)
                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 IO.Directory.Exists(pathArchivKD) Then IO.Directory.CreateDirectory(pathArchivKD)
                    If pathKD <> pathArchivKD Then IO.File.Copy(pathKD & DateinameKD, pathArchivKD & DateinameKD)
                End If

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

                updateFibu(filialNr) ' UPDATE FiBuSchnittstelle --> 0
                Return True
            End If




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



    Public Shared Function genDatensatzCSV_ALL(firma As String, Optional OpenFile As Boolean = False, Optional boolKunden As Boolean = True, Optional boolBuchungen As Boolean = True, Optional Geschaeftsjahr As Integer = -1) As Boolean


        If firma <> "AMBAR" Then
            MsgBox("Export für Firma" & firma & " nicht aktiviert")
            Return False
        End If

        Dim CSV_ALL = True
        If boolKunden Then
            If Not genDatensatzCSV_Stammdaten(24, OpenFile, Geschaeftsjahr) Then
                CSV_ALL = False
            End If
        End If
        If boolBuchungen Then
            If Not genDatensatzCSV_Buchungen(24, OpenFile, Geschaeftsjahr) Then
                CSV_ALL = False
            End If

        End If
        Return CSV_ALL
    End Function

    Public Shared Function genDatensatzCSV_Buchungen(ByRef Firma_ID As Integer, Optional OpenFile As Boolean = False, Optional Geschaeftsjahr As Integer = -1) 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
            If Geschaeftsjahr <= 0 Then Geschaeftsjahr = Now.Year 'If(Now.Month = 1, Now.Year - 1, Now.Year) --> Bei IMEX ist das GJ=Wirtschaftsjahr
            'nur UNISPED!!

            'DATEIPFAD für Buchungsdaten
            '-------------------------------------------------------------------------------------------
            Dim pathArchiv = "\\datenarchiv.verag.ost.dmn\DATENARCHIV\DATENARCHIV\DATEV\ARCHIV\AR-DATEN\" & FIRMA.Firma_Bez & "\"
            Dim path = "\\datenarchiv.verag.ost.dmn\DATENARCHIV\DATENARCHIV\DATEV\AR-DATEN\" & FIRMA.Firma_Bez & "\" & Geschaeftsjahr & "\"
            '   path = pathArchiv 'TEST
            If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then
                pathArchiv = " \\datenarchiv.verag.ost.dmn\DATENARCHIV\DATENARCHIV_TESTSYSTEM\DATEV\ARCHIV\AR-DATEN\" & FIRMA.Firma_Bez & "\"
                path = "\\datenarchiv.verag.ost.dmn\DATENARCHIV\DATENARCHIV_TESTSYSTEM\DATEV\AR-DATEN\" & FIRMA.Firma_Bez & "\" & Geschaeftsjahr & "\"
            End If
            If Not IO.Directory.Exists(path) Then IO.Directory.CreateDirectory(path)
            If Not IO.Directory.Exists(pathArchiv) Then IO.Directory.CreateDirectory(pathArchiv)
            '-------------------------------------------------------------------------------------------

            Dim NameZusatz = ""
            Dim Buchungsjahr = -1
            Select Case FIRMA.Firma_ID
                Case 21 : NameZusatz = "UNISPED_AT_" : Buchungsjahr = Geschaeftsjahr
                Case 22 : NameZusatz = "UNISPED_DE_" : Buchungsjahr = Geschaeftsjahr
                Case 23 : NameZusatz = "UNISPED_ZS_" : Buchungsjahr = Geschaeftsjahr
                Case 24 : NameZusatz = "AMBAR_DE_" : Buchungsjahr = Geschaeftsjahr
            End Select

            '----------------- Buchungssätze -----------------
            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 = getBuchungen(FIRMA.Firma_ID)
            If dt_Buchungen IsNot Nothing AndAlso dt_Buchungen.Rows.Count > 0 Then
                Try
                    Dim file As System.IO.StreamWriter
                    Dim Dateiname = "DTVF_STB_" & NameZusatz & Now.ToString("ddMMyyyy_HHmm") & ".csv"
                    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(genStapelbuchungsHeader(Geschaeftsjahr))
                    file.WriteLine(genBuchungenBeginn())
                    For Each r In dt_Buchungen.Rows
                        file.WriteLine(genBuchungsZeile(r, SummeBuchungen, Geschaeftsjahr, FIRMA))
                    Next
                    '   file.WriteLine(genBuchungenEnd(SummeBuchungen))
                    bool_DatenVorhanden = True

                    'Update Filename TrdIn
                    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 IO.Directory.Exists(pathArchiv) Then IO.Directory.CreateDirectory(pathArchiv)
                        If path <> pathArchiv Then IO.File.Copy(path & Dateiname, pathArchiv & Dateiname)
                    End If

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

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

    Shared Function FormatStringDVO(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
        FormatStringDVO = s.ToString.Replace(";", ",")
        FormatStringDVO = s.ToString.Replace(Chr(34), " ")
        'FormatStringDVO = s.ToString.Replace(",", "")
        'FormatStringDVO = s.ToString.Replace("""", "\22")
        If length > 0 Then
            If FormatStringDVO.Length > length Then FormatStringDVO = FormatStringDVO.Substring(0, length)
        End If

        FormatStringDVO = Chr(34) & FormatStringDVO & Chr(34)

    End Function

    Shared Function getBuchungen(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
                       FROM VERAG.dbo.tblTrdinInvoice as IVO left JOIN tblTrdinProduct as PROD on IVO.Rechnungsnummer=PROD.Rechnungsnummer And IVO.Rechnungsdatum = PROD.Rechnungsdatum
                       WHERE Firma_ID ='" & Firma_ID & "'  AND TrdinDateiname Is Null
                       group by IVO.Rechnungsnummer,IVO.rechnungsdatum,Leistungsnummer,Leistungsbezeichnung,Steuerpflichtig
                       ORDER BY Rechnungsdatum, Rechnungsnummer "
        ' --and IVO.Rechnungsnummer='21400139'
        Return SQL.loadDgvBySql(sqlStr, "FMZOLL", 9800)

        'WHERE Firma_ID ='" & Firma_ID & "'  AND TrdinDateiname Is Null
    End Function

    Public Shared Function genBuchungenBeginn() As String
        Return "Umsatz (ohne Soll/Haben-Kz);Soll/Haben-Kennzeichen;WKZ Umsatz;Kurs;Basis-Umsatz;WKZ Basis-Umsatz;Konto;Gegenkonto (ohne BU-Schlüssel);BU-Schlüssel;Belegdatum;Belegfeld 1;Belegfeld 2;Skonto;Buchungstext;Postensperre;Diverse Adressnummer;Geschäftspartnerbank;Sachverhalt;Zinssperre;Beleglink;Beleginfo - Art 1;Beleginfo - Inhalt 1;Beleginfo - Art 2;Beleginfo - Inhalt 2;Beleginfo - Art 3;Beleginfo - Inhalt 3;Beleginfo - Art 4;Beleginfo - Inhalt 4;Beleginfo - Art 5;Beleginfo - Inhalt 5;Beleginfo - Art 6;Beleginfo - Inhalt 6;Beleginfo - Art 7;Beleginfo - Inhalt 7;Beleginfo - Art 8;Beleginfo - Inhalt 8;KOST1 - Kostenstelle;KOST2 - Kostenstelle;Kost-Menge;EU-Land u. UStID;EU-Steuersatz;Abw. Versteuerungsart;Sachverhalt L+L;Funktionsergänzung L+L;BU 49 Hauptfunktionstyp;BU 49 Hauptfunktionsnummer;BU 49 Funktionsergänzung;Zusatzinformation - Art 1;Zusatzinformation- Inhalt 1;Zusatzinformation - Art 2;Zusatzinformation- Inhalt 2;Zusatzinformation - Art 3;Zusatzinformation- Inhalt 3;Zusatzinformation - Art 4;Zusatzinformation- Inhalt 4;Zusatzinformation - Art 5;Zusatzinformation- Inhalt 5;Zusatzinformation - Art 6;Zusatzinformation- Inhalt 6;Zusatzinformation - Art 7;Zusatzinformation- Inhalt 7;Zusatzinformation - Art 8;Zusatzinformation- Inhalt 8;Zusatzinformation - Art 9;Zusatzinformation- Inhalt 9;Zusatzinformation - Art 10;Zusatzinformation- Inhalt 10;Zusatzinformation - Art 11;Zusatzinformation- Inhalt 11;Zusatzinformation - Art 12;Zusatzinformation- Inhalt 12;Zusatzinformation - Art 13;Zusatzinformation- Inhalt 13;Zusatzinformation - Art 14;Zusatzinformation- Inhalt 14;Zusatzinformation - Art 15;Zusatzinformation- Inhalt 15;Zusatzinformation - Art 16;Zusatzinformation- Inhalt 16;Zusatzinformation - Art 17;Zusatzinformation- Inhalt 17;Zusatzinformation - Art 18;Zusatzinformation- Inhalt 18;Zusatzinformation - Art 19;Zusatzinformation- Inhalt 19;Zusatzinformation - Art 20;Zusatzinformation- Inhalt 20;Stück;Gewicht;Zahlweise;Forderungsart;Veranlagungsjahr;Zugeordnete Fälligkeit;Skontotyp;Auftragsnummer;Buchungstyp (Anzahlungen);USt-Schlüssel (Anzahlungen);EU-Land (Anzahlungen);Sachverhalt L+L (Anzahlungen);EU-Steuersatz (Anzahlungen);Erlöskonto (Anzahlungen);Herkunft-Kz;Buchungs GUID;KOST-Datum;SEPA-Mandatsreferenz;Skontosperre;Gesellschaftername;Beteiligtennummer;Identifikationsnummer;Zeichnernummer;Postensperre bis;Bezeichnung SoBil-Sachverhalt;Kennzeichen SoBil-Buchung;Festschreibung;Leistungsdatum;Datum Zuord. Steuerperiode;Fälligkeit;Generalumkehr (GU);Steuersatz;Land;Abrechnungsreferenz;BVV-Position"
    End Function
    Public Shared Function genBuchungenEnd() As String
            Return ""
        End Function



    Public Shared Function genStammdatenHeader(Geschäftsjahr As Integer) As String
        Dim headerString = Chr(34) & "EXTF" & Chr(34) & ";" 'Export aus 3rd Party App
        headerString &= datevVersion.ToString & ";"
        headerString &= Datenkategorie.ToString & ";"
        headerString &= Chr(34) & "Debitoren/Kreditoren" & Chr(34) & ";" 'Debitoren\Kreditoren
        headerString &= Formatversion.ToString & ";"
        headerString &= emptyFormatedValueWithoutCommas(5)
        headerString &= BeraterNr.ToString & ";" 'Beraternummer
        headerString &= MandantenNr.ToString & ";" 'Mandantennummer
        headerString &= Geschäftsjahr.ToString & "0101" & ";" 'WJ-Beginn
        headerString &= Kontenlänge.ToString & ";"
        headerString &= Geschäftsjahr.ToString & "0101" & ";" 'DatumVon
        headerString &= Geschäftsjahr.ToString & "1231" & ";" 'DatumBis
        headerString &= "IMPORT AUS AVISO;" 'Bezeichnung
        headerString &= Chr(34) & Chr(34) & ";"
        headerString &= emptyFormatedValueWithoutCommas(12)
        Return headerString
    End Function

    Public Shared Function genStapelbuchungsHeader(Geschäftsjahr As Integer) As String
        Dim headerString = Chr(34) & "EXTF" & Chr(34) & ";" 'Export aus 3rd Party App
        headerString &= datevVersion.ToString & ";" 'Versionnummer Datev
        headerString &= StapelbuchungsNr.ToString & ";" 'Stapelbuchungen
        headerString &= Chr(34) & "Buchungsstapel" & Chr(34) & ";" 'Buchungsstapel
        headerString &= "11;" 'Buchungsstapel -> 12 nicht möglich, steht aber in Schnittsetllenbeschreibung, 11 laut Testdaten??? 
        headerString &= emptyFormatedValueWithoutCommas(5)
        headerString &= BeraterNr.ToString & ";"
        headerString &= MandantenNr.ToString & ";"
        headerString &= Geschäftsjahr.ToString & "0101" & ";" 'WJ-Beginn
        headerString &= Kontenlänge.ToString & ";"
        headerString &= Geschäftsjahr.ToString & "0101" & ";" 'DatumVon
        headerString &= Geschäftsjahr.ToString & "1231" & ";" 'DatumBis
        headerString &= "IMPORT AUS AVISO;" 'Bezeichnung
        headerString &= Chr(34) & Chr(34) & ";"
        headerString &= emptyFormatedValueWithoutCommas(12)
        Return headerString
    End Function

    Public Shared Function genStammdatenEnd() As String
            Return ""
        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) As String
        genBuchungsZeile = ""
        Dim steuerbetragLokal As Double = 0
        Dim steuerbetragFremd As Double = 0
        Dim GJ_short = Geschäftsjahr.ToString.Substring(2, 2)
        Dim RgNrOld = FormatStringDVO(row("Rechnungsnummer")).Substring(2)
        Dim fremdW = FormatStringDVO(row("WährungFremd"))
        Dim RgBetrWährungLokal As Double = 0
        Dim RgBetrWährungFremd As Double = 0
        Dim BelegBez As String
        Dim BelegKz As String
        Dim SollHabenKz As Char

        Select Case row("BelegartenNr")

            Case 70
                BelegBez = "Rechnung"
                BelegKz = "AR"
                SollHabenKz = Chr(72)

            Case 71
                BelegBez = "Gutschrift"
                BelegKz = "AG"
                SollHabenKz = Chr(83)

            Case Else
                BelegBez = ""
                BelegKz = ""

        End Select


        'Umsatz
        If CBool(row("Steuerpflichtig")) Then
            steuerbetragLokal += CDbl((getDbl2(row("SteuerpflichtigerBetragLokal")) * getDbl2(row("Steuersatz"))))
            steuerbetragFremd += CDbl((getDbl2(row("SteuerpflichtigerBetragFremd")) * getDbl2(row("Steuersatz"))))
        End If

        ' If steuerbetragLokal < 0 Then steuerbetragLokal = steuerbetragLokal * -1 --> SONST PROBLKEM BEI UNISPED; DA STEUER vom NETTO abgezogen wird!
        'genBuchungsZeile &= getDbltr(getDbl(row("SteuerpflichtigerBetragLokal")) + getDbl(row("SteuerfreierBetragLokal")) + getDbl(row("SteuerpflichtigerBetragFremd")) + getDbl(row("SteuerfreierBetragFremd")) + If(steuerbetragLokal <> 0, getDbltr(steuerbetragLokal), "0")) + +If(steuerbetragFremd <> 0, getDbltr(steuerbetragFremd), "0")) & ";" 'betrag + steuer (brutto)
        If fremdW <> "" Then
            RgBetrWährungFremd = getDbltr(getDbl(row("SteuerpflichtigerBetragFremd")) + getDbl(row("SteuerfreierBetragFremd")) + If(steuerbetragFremd <> 0, getDbltr(steuerbetragFremd), "0"))
            genBuchungsZeile &= IIf(RgBetrWährungFremd < 0, RgBetrWährungFremd * -1, RgBetrWährungFremd) & ";"
        Else
            RgBetrWährungLokal = getDbltr(getDbl(row("SteuerpflichtigerBetragLokal")) + getDbl(row("SteuerfreierBetragLokal")) + If(steuerbetragLokal <> 0, getDbltr(steuerbetragLokal), "0"))
            genBuchungsZeile &= IIf(RgBetrWährungLokal < 0, RgBetrWährungLokal * -1, RgBetrWährungLokal) & ";"
        End If


        'Soll oder Haben
        genBuchungsZeile &= FormatStringDVO(SollHabenKz) & ";"

        'Fremdwährungen
        If fremdW <> "" Then
            genBuchungsZeile &= fremdW & ";"
            genBuchungsZeile &= RgBetrWährungLokal / RgBetrWährungFremd + RgBetrWährungLokal Mod RgBetrWährungFremd
            genBuchungsZeile &= emptyFormatedValue()
            genBuchungsZeile &= FormatStringDVO(row("WährungLokal")) & ";"

        Else
            genBuchungsZeile &= emptyFormatedValue()
            genBuchungsZeile &= emptyFormatedValueWithoutCommas(2)
            genBuchungsZeile &= emptyFormatedValue()
        End If


        'Erlöskonto
        genBuchungsZeile &= fill0Stellen(row("Sachkonto"), 4) & ";"

        'Debitorenkonto
        genBuchungsZeile &= (initKDNr2(row("KundenNrZentrale"), FIRMA.Firma_ID)) & ";"

        'BU-Schlüssel -> nicht benötigt
        genBuchungsZeile &= emptyFormatedValue()

        'genBuchungsZeile &= getSteuercode(row, FIRMA) & ";"
        'If CBool(row("Steuerpflichtig")) Then
        '    genBuchungsZeile &= (getDbl2(row("Steuersatz")) * 100) & ";" 'buchcode === 1 oder 2??
        'Else
        '    genBuchungsZeile &= "0;" 'buchcode === 1 oder 2??
        'End If


        'Belegdatum
        genBuchungsZeile &= "" & CDate(row("Rechnungsdatum")).ToString("ddMM") & ";"

        'Belegfeld1 -> Rechnungsnummer 
        genBuchungsZeile &= FormatStringDVO(row("Rechnungsnummer")) & ";"

        'Belegfeld 2 -> nicht benötigt (abweichendes Fälligkeitsdatum!)
        genBuchungsZeile &= emptyFormatedValue()

        ' Skontoangabe -> nicht in Verwendung
        genBuchungsZeile &= emptyFormatedValue()

        'Buchungstext
        'genBuchungsZeile &= FormatStringDVO(row("Buchungstext"),, Chr(34) & Chr(34)) & ";"
        genBuchungsZeile &= FormatStringDVO(SQL.DLookup("[Ordnungsbegriff]", "Adressen", " AdressenNr= " & row("KundenNrZentrale"), "FMZOLL", "")) & ";"
        'Leerzeilen
        genBuchungsZeile &= emptyFormatedValue(25)

        'UID-Nr
        'genBuchungsZeile &= IIf(FormatStringDVO(row("RechnungsUstIdKz")) <> "", FormatStringDVO(row("RechnungsUstIdKz").Substring(0, 3)), "")
        'genBuchungsZeile &= IIf(FormatStringDVO(row("RechnungsUstIdNr")) <> "", FormatStringDVO(row("RechnungsUstIdNr").Substring(1)), "") & ";"
        genBuchungsZeile &= emptyFormatedValue(1)
        'Leerzeilen
        genBuchungsZeile &= emptyFormatedValue(7)
        'Zusatzinformation Art1
        genBuchungsZeile &= FormatStringDVO(BelegBez) & ";"
        'Zusatzinformation Inhalt1
        genBuchungsZeile &= FormatStringDVO("Datum " & CDate(row("Rechnungsdatum")).ToString("ddMMyyyy") & " Art " & BelegKz & row("Rechnungsnummer")) & ";"
        'Zusatzinformation Art2
        genBuchungsZeile &= FormatStringDVO(BelegBez & "positionen") & ";"
        'Zusatzinformation Inhalt2
        genBuchungsZeile &= FormatStringDVO(row("Leistungsbezeichnung"), 20) & ";"
        'Leerzeilen
        genBuchungsZeile &= emptyFormatedValue(45)
        'USt-Schlüssel (Anzahlungen)
        genBuchungsZeile &= FormatStringDVO("0") & ";"
        'Leerzeilen
        genBuchungsZeile &= emptyFormatedValue(8)
        'keine Skontosperre - 0
        genBuchungsZeile &= FormatStringDVO("0") & ";"
        'Leerzeilen
        genBuchungsZeile &= emptyFormatedValue(7)
        'keine Festschreibung - 0
        genBuchungsZeile &= FormatStringDVO("0") & ";"
        'Leistungsdatum
        genBuchungsZeile &= CDate(row("Abfertigungsdatum")).ToString("ddMMyyyy") & ";"
        'Leerzeilen
        genBuchungsZeile &= emptyFormatedValue(2)
        'keine Generallumkehr - 0
        genBuchungsZeile &= FormatStringDVO("0") & ";"
        'Leerzeilen
        genBuchungsZeile &= emptyFormatedValue(3)

        'genBuchungsZeile &= FormatStringDVO(SQL.DLookup("[Ordnungsbegriff]", "Adressen", " AdressenNr= " & row("KundenNrZentrale"), "FMZOLL", "")) & ";"
        'Dim KdAtrNr = SQL.DLookup("KdAuftragsNr", "Rechnungsausgang", "rechnungsnr='" & RgNrOld & "' And Buchungsjahr='" & Geschäftsjahr & "' and Firma_ID='" & FIRMA.Firma_ID & "'", "FMZOLL", "")
        'KdAtrNr = KdAtrNr.ToString.Replace(vbNewLine, "").Replace(vbCr, "").Replace(vbLf, "").Replace(vbCrLf, "").Replace(System.Environment.NewLine, " ")
        '    genBuchungsZeile &= KdAtrNr & ";".Replace(Environment.NewLine, "") 'extbelegnr

        '    genBuchungsZeile &= If(row("BelegartenNr") = "70", "AR", "AG") & ";" ' Rg/GS 70=Rechnung  'AG ????????
        '    genBuchungsZeile &= If(row("BelegartenNr") = "70", "1", "2") & ";" ' Rg/GS 70=Rechnung  'AG ????????


        'genBuchungsZeile &= getSteuercode(row, FIRMA) & ";"
        '    If CBool(row("Steuerpflichtig")) Then
        '        genBuchungsZeile &= (getDbl2(row("Steuersatz")) * 100) & ";" 'buchcode === 1 oder 2??
        '    Else
        '        genBuchungsZeile &= "0;" 'buchcode === 1 oder 2??
        '    End If


        'genBuchungsZeile &= "" & If(steuerbetragLokal <> 0, getDbltr(steuerbetragLokal), "0") & ";" 'steuer


        'genBuchungsZeile &= FormatStringDVO(row("Nettozahlungsziel")) & ";" ' Text

        ''... aus ...
        'SummeBuchungen += getDbl(getDbl(row("SteuerpflichtigerBetragLokal")) + getDbl(row("SteuerfreierBetragLokal")))


    End Function

    Shared Sub initKDNr(ByRef dt As DataTable, ByVal firmaID As Integer)

        Select Case firmaID
            Case 24

                For Each r In dt.Rows
                    If IsNumeric(r("Kontonummer")) AndAlso CInt(r("Kontonummer")) > 3000000 AndAlso r("Kontonummer").ToString.Length = 7 Then r("Kontonummer") = (CInt(r("Kontonummer")) - 3000000)
                Next


            Case Else


                For Each r In dt.Rows
                    If IsNumeric(r("Kontonummer")) AndAlso CInt(r("Kontonummer")) > 2000000 Then r("Kontonummer") = (CInt(r("Kontonummer")) - 2000000)
                    '     MsgBox((CInt(r("Konto-Nr")) - 1000000) + 200000)
                Next
        End Select


    End Sub

    Shared Function initKDNr2(ktoNr As String, ByVal firmaID As Integer) As String
        Select Case firmaID
            Case 24
                If IsNumeric(ktoNr) AndAlso CInt(ktoNr) > 3000000 AndAlso ktoNr.Length = 7 Then ktoNr = (CInt(ktoNr) - 3000000) '- 300000

            Case Else

                If IsNumeric(ktoNr) AndAlso CInt(ktoNr) > 2000000 Then ktoNr = (CInt(ktoNr) - 2000000) '+ 200000
        End Select


        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 getDbl(o As Object) As Double
            Try
                If o Is Nothing Then Return 0
                If o Is DBNull.Value Then Return 0
                Return CDbl(o)
            Catch ex As Exception
                Return 0
            End Try
        End Function
        Shared Function getDbl2(o As Object) As Double
            Try
                If o Is Nothing Then Return 0
                If o Is DBNull.Value Then Return 0
                Return CDbl(o.ToString.Replace(".", ","))
            Catch ex As Exception
                Return 0
            End Try
        End Function


        Shared Function getDbltr(o As Object) As String
            Try
                If o Is Nothing Then Return 0
                If o Is DBNull.Value Then Return 0
            Return CDbl(o).ToString("F2").Replace(".", "").Replace(" ", "") '.Replace(",", ".")
        Catch ex As Exception
                Return 0
            End Try
        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

    Shared Function emptyFormatedValue(Optional count As Integer = 1) As String

        Dim retturnText As String = ""

        For i = 1 To count

            retturnText &= Chr(34) & Chr(34) & ";"

        Next

        Return retturnText

    End Function

    Shared Function emptyFormatedValueWithoutCommas(Optional count As Integer = 1) As String

        Dim retturnText As String = ""

        For i = 1 To count

            retturnText &= ";"

        Next

        Return retturnText

    End Function



End Class
