Imports System.Data.SqlClient

Public Class EZollAufschubEinlesen
    Public Sub initEZOLL(history)
        Dim d As List(Of cEZollData)
        If history Then
            d = loadSqlZOLARIS(Now.AddMonths(-2), Now)
        Else
            d = loadSqlZOLARIS(Now.AddDays(-1), Now)
        End If

        For Each d1 In d
            setEZollData(d1)
            VERAG_PROG_ALLGEMEIN.cAllgemein.ERR_OP_GLOBAL = VERAG_PROG_ALLGEMEIN.ERROR_OP.SHOW
            Select Case d1.Abgabenkonto
                Case "3517233", "3026400", "3025365" 'Nur bei eigenen Aufschubkonto (VERAG)
                    Dim ABGABEN As New VERAG_PROG_ALLGEMEIN.cAbgaben(d1.CRN, d1.Abgabenart, d1.Betrag)
                    If Not ABGABEN.hasEntry Then
                        Dim LeistungsNr = ""
                        Dim LeistungsBez = ""

                        Dim saveAbgaben = True
                        Select Case d1.Abgabenart
                            Case "2EU", "2IG", "5EU" ' "2PE",
                                LeistungsNr = "20"
                            Case "B00" 'EUST
                                LeistungsNr = "20"
                                ABGABEN.Status = "A" 'AUSGEBUCHT
                            Case "5EV"   '"5EV"--> EV-KONTO!!
                                saveAbgaben = False
                            Case "2DU", "5DU", "5ZO", "5ZZ", "A20", "A30", "A35", "A40", "A45", "C00", "C10", "A00"
                                LeistungsNr = "76"
                            Case Else '1BD,0ML, 0PB, 0PG, 0PS, 1LG, 1ZN, 2AS, 2KO, 2RB, 2SB, 2SI, 2VF, 2VS, 5SI, 5VS, 6AK, 6BE, 6MS, 6SS, 6TS, 6ZW, 9EA, D00,D10,E00
                                LeistungsNr = "482"
                                LeistungsBez = DAKOSY_Worker.cZOLL_IMPORT.getLeistungsBez(d1.Abgabenart)
                        End Select
                        If saveAbgaben Then

                            ABGABEN.Belegart = d1.Abgabenart
                            ABGABEN.Betrag = CDbl(d1.Betrag)
                            ABGABEN.Status = Nothing
                            ABGABEN.LeistungsNr = LeistungsNr
                            ABGABEN.Bezugsnummer = d1.LRN
                            ABGABEN.Registriernummer = d1.CRN
                            '  ABGABEN.AOFD = A.KennBuchstabenAufschub
                            ABGABEN.AKTO = d1.Abgabenkonto
                            'ABGABEN.Fälligkeitsdatum = A.Faelligkeit
                            '  ABGABEN.Mandant = "VERG"
                            ABGABEN.Niederlassung = d1.OperatorId
                            ABGABEN.Abfertigungsdatum = d1.Datum
                            ABGABEN.Übernahmedatum = d1.Datum
                            ABGABEN.Eingabedatum = Now.ToShortDateString
                            ABGABEN.Sachbearbeiter = "AUTO"
                            ABGABEN.LeistungsBez = LeistungsBez
                            If If(ABGABEN.Bezugsnummer, "").ToString.Length > 35 Then ABGABEN.Bezugsnummer = ABGABEN.Bezugsnummer.ToString.Substring(0, 35)
                            If If(ABGABEN.Registriernummer, "").ToString.Length > 21 Then ABGABEN.Registriernummer = ABGABEN.Registriernummer.ToString.Substring(0, 21)

                            Dim errHInweis = "ATC: " & ABGABEN.Registriernummer & " - BezugsNr: " & ABGABEN.Bezugsnummer
                            ABGABEN.SAVE(errHInweis)
                        End If
                    End If
            End Select
        Next
        'MsgBox("TEST3")
    End Sub


    Public Function loadSqlZOLARIS(ByVal datumVon As DateTime, ByVal datumBis As DateTime, Optional where As String = "") As List(Of cEZollData)
        Try
            Dim sql As String =
            "   SELECT zsAnmGdsItem.VorgangID AS VorgangID, zsAnmHea.DecDT as Datum, zsAnmGdsItem.AnmID AS AnmeldungsID, ztIMsgGdsItemDutyCalc.Ty AS Abgabenart,  " &
            " 	  sum(isnull(ztIMsgGdsItemDutyCalc.Base,0)) AS Berechnungsgrundlage, sum(isnull(ztIMsgGdsItemDutyCalc.Amnt,0)) AS Betrag,  " &
            " 	  zsAnmRefs.CRN AS CRN, zsAnmRefs.LRN AS LRN, zsAnmHea.DefPayRef AS Abgabenkonto,vwAnm_First_Rechnung.DRef AS RechnungsNr, zsAnmDHFRefs.InfoText," &
            "       zsAnmDHFRefs.AnschreibeNr as Anschreibenummer ,zsAnmGdsItem.OperatorID as OperatorId" &
            "         FROM zzAktivitaet" &
            " 	INNER JOIN ztIMsgGdsItem ON zzAktivitaet.LizenzNr = ztIMsgGdsItem.LizenzNr AND zzAktivitaet.OperatorID = ztIMsgGdsItem.OperatorID " &
            " 		AND zzAktivitaet.IMsgID = ztIMsgGdsItem.IMsgID " &
            " 	INNER JOIN ztIMsgGdsItemDutyCalc ON ztIMsgGdsItem.LizenzNr = ztIMsgGdsItemDutyCalc.LizenzNr " &
            " 		AND ztIMsgGdsItem.OperatorID = ztIMsgGdsItemDutyCalc.OperatorID AND ztIMsgGdsItem.IMsgID = ztIMsgGdsItemDutyCalc.IMsgID " &
            " 		AND ztIMsgGdsItem.GdsItemID = ztIMsgGdsItemDutyCalc.GdsItemID " &
            " 	INNER JOIN zsAnmGdsItem ON zzAktivitaet.LizenzNr = zsAnmGdsItem.LizenzNr AND zzAktivitaet.OperatorID = zsAnmGdsItem.OperatorID " &
            " 		AND zzAktivitaet.VorgangID = zsAnmGdsItem.VorgangID AND zzAktivitaet.AnmID = zsAnmGdsItem.AnmID " &
            " 		AND ztIMsgGdsItem.ItNr = zsAnmGdsItem.ItNr " &
            " 	INNER JOIN zsAnmGdsItemDHF ON zsAnmGdsItem.LizenzNr = zsAnmGdsItemDHF.LizenzNr AND zsAnmGdsItem.OperatorID = zsAnmGdsItemDHF.OperatorID " &
            " 		AND zsAnmGdsItem.VorgangID = zsAnmGdsItemDHF.VorgangID AND zsAnmGdsItem.AnmID = zsAnmGdsItemDHF.AnmID " &
            " 		AND zsAnmGdsItem.GdsItemID = zsAnmGdsItemDHF.GdsItemID " &
            " 	INNER JOIN zsAnmHea ON zsAnmGdsItem.LizenzNr = zsAnmHea.LizenzNr AND zsAnmGdsItem.OperatorID = zsAnmHea.OperatorID " &
            " 		AND zsAnmGdsItem.VorgangID = zsAnmHea.VorgangID AND zsAnmGdsItem.AnmID = zsAnmHea.AnmID " &
            " 	INNER JOIN zsAnmRefs ON zsAnmGdsItem.LizenzNr = zsAnmRefs.LizenzNr AND zsAnmGdsItem.OperatorID = zsAnmRefs.OperatorID " &
            " 		AND zsAnmGdsItem.VorgangID = zsAnmRefs.VorgangID AND zsAnmGdsItem.AnmID = zsAnmRefs.AnmID " &
            " 	INNER JOIN zsAnmDHFRefs ON zsAnmRefs.LizenzNr = zsAnmDHFRefs.LizenzNr AND zsAnmRefs.OperatorID = zsAnmDHFRefs.OperatorID " &
            " 		AND zsAnmRefs.VorgangID = zsAnmDHFRefs.VorgangID AND zsAnmRefs.AnmID = zsAnmDHFRefs.AnmID " &
            " 	LEFT OUTER JOIN vwAnm_First_Rechnung ON zsAnmGdsItem.LizenzNr = vwAnm_First_Rechnung.LizenzNr " &
            " 		AND zsAnmGdsItem.OperatorID = vwAnm_First_Rechnung.OperatorID AND zsAnmGdsItem.VorgangID = vwAnm_First_Rechnung.VorgangID " &
            " 		AND zsAnmGdsItem.AnmID = vwAnm_First_Rechnung.AnmID And zsAnmGdsItem.GdsItemID = vwAnm_First_Rechnung.GdsItemID " &
            " WHERE (zsAnmDHFRefs.ErledigungsTypID LIKE 'F%') AND (zzAktivitaet.MsgTyp = 'EZ922') " &
            " 	AND (NOT EXISTS (SELECT * FROM zzAktivitaet b WHERE b.MsgTyp = 'EZ922' AND zzAktivitaet.LizenzNr = b.LizenzNr " &
            " 		AND zzAktivitaet.OperatorID = b.OperatorID AND zzAktivitaet.VorgangID = b.VorgangID AND zzAktivitaet.AnmID = b.AnmID " &
            " 		AND zzAktivitaet.AktivitaetID > b.AktivitaetID)) " &
            " 	AND (NOT (ztIMsgGdsItemDutyCalc.Amnt IS NULL)) " &
            " 	/*AND (ztIMsgGdsItemDutyCalc.Ty IN ('1BD','0ML','0PB','0PG','0PS','1LG','1ZN','2AS','2DU','2EU','2IG','2KO','2PE','2RB','2SB','2SI','2VF','2VS','5DU','5EU','5SI','5VS','5ZO','5ZZ','6AK','6BE','6MS','6SS','6TS','6ZW','9EA','A20','A30','A35','A40','A45','C00','C10','D00','D10','E00') /*like 'A%'*/)*/ " &
            " 	AND (zsAnmGdsItem.LizenzNr =  'S01122' ) " &
            " 	AND (zsAnmHea.DecDT >=  convert(datetime, @datumVon,104)) " &
            " 	AND (zsAnmHea.DecDT <=  convert(datetime, @datumBis,104)) " &
                  " GROUP BY ztIMsgGdsItem.IMsgID, zsAnmGdsItem.LizenzNr, zsAnmGdsItem.OperatorID, zsAnmGdsItem.VorgangID, zsAnmGdsItem.AnmID, " &
            " 	 ztIMsgGdsItemDutyCalc.Ty, zsAnmRefs.CRN, " &
            " 	zsAnmRefs.LRN, isnull(zsAnmRefs.FRN,''), zsAnmHea.DefPayRef,  " &
            "         zsAnmHea.DecDT, vwAnm_First_Rechnung.DRef, zsAnmDHFRefs.ErledigungsTypID, zsAnmDHFRefs.InfoText, zzAktivitaet.AnmID, " &
            "         zsAnmDHFRefs.AnschreibeNr " &
            " HAVING sum(isnull(ztIMsgGdsItemDutyCalc.Amnt,0)) >0 " &
            " ORDER BY zsAnmGdsItem.LizenzNr, zsAnmGdsItem.OperatorID, zsAnmGdsItem.VorgangID, zsAnmHea.DefPayRef, " &
            "         zzAktivitaet.AnmID, ztIMsgGdsItemDutyCalc.Ty "
            '  " 	AND (zsAnmHea.DefPayRef IN (@kto)) " &
            ' MsgBox(datumVon.ToShortDateString)
            'OR ztIMsgGdsItemDutyCalc.Ty IN ('2VF', '2PE', '2KO', '2IG')) " &
            Dim daten As New List(Of cEZollData)
            While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()

                Dim myTable = New DataTable()
                Using conn As SqlConnection = GetNewOpenConnectionZOLARIS()
                    Using cmd As New SqlCommand(sql, conn)
                        cmd.Parameters.AddWithValue("@datumVon", datumVon.ToShortDateString)
                        cmd.Parameters.AddWithValue("@datumBis", datumBis.ToShortDateString)
                        cmd.CommandTimeout = 900000
                        Dim dr As SqlDataReader = cmd.ExecuteReader()
                        Try
                            Dim cnt As Integer = 0
                            While dr.Read
                                Dim d As New cEZollData
                                '  MsgBox(dr.Item("Abgabenart"))
                                d.VorgangID = dr.Item("VorgangID")
                                d.Datum = dr.Item("Datum")
                                d.AnmeldungsID = getString(dr.Item("AnmeldungsID"))
                                d.Abgabenart = getString(dr.Item("Abgabenart"))
                                d.Berechnungsgrundlage = dr.Item("Berechnungsgrundlage")
                                d.Betrag = dr.Item("Betrag")
                                d.CRN = getString(dr.Item("CRN"))
                                d.LRN = getString(dr.Item("LRN"))
                                d.Abgabenkonto = getString(dr.Item("Abgabenkonto"))
                                d.RechnungsNr = getString(dr.Item("RechnungsNr"))
                                d.InfoText = getString(dr.Item("InfoText"))
                                d.Anschreibenummer = getString(dr.Item("Anschreibenummer"))
                                d.OperatorId = getString(dr.Item("OperatorId"))

                                daten.Add(d)
                            End While
                            Return daten
                        Catch ex As Exception
                            writeLog("ERROR", "Fehler beim Laden der DB aus EZOLL: " & ex.Message & ex.StackTrace)
                        Finally
                            dr.Close()
                        End Try
                    End Using
                    conn.Close()
                End Using
                Return daten
            End While
        Catch ex As Exception
            writeLog("ERROR", "Fehler bei der Verbindung zur DB EZOLL: " & ex.Message & ex.StackTrace)
        End Try
        Return Nothing
    End Function


    Public Function setEZollData(ByVal daten As cEZollData) As Boolean
        Dim sql As String = " begin tran" &
                            " if exists (select * from tblBrgAufschubDataAT with (updlock,serializable) where Datum = @Datum AND Datum = @Datum AND LRN = @LRN AND Betrag = CAST ( @Betrag  AS float)AND AnmeldungsID=@AnmeldungsID) " &
                                   " begin " &
                                   " UPDATE tblBrgAufschubDataAT " &
                                   " SET VorgangID=@VorgangID, Datum=@Datum, AnmeldungsID=@AnmeldungsID, Abgabenart=@Abgabenart, Berechnungsgrundlage=@Berechnungsgrundlage, Betrag=@Betrag, CRN=@CRN, LRN=@LRN, Abgabenkonto=@Abgabenkonto, RechnungsNr=@RechnungsNr,InfoText=@InfoText, Anschreibenummer=@Anschreibenummer, OperatorId=@OperatorId  " &
                                   " WHERE Datum = @Datum AND Datum = @Datum AND LRN = @LRN AND Betrag = @Betrag AND AnmeldungsID=@AnmeldungsID" &
                            " End " &
                            " Else " &
                            " begin " &
                                "INSERT INTO tblBrgAufschubDataAT " &
                                "(VorgangID, Datum, AnmeldungsID, Abgabenart, Berechnungsgrundlage, Betrag, CRN, LRN, Abgabenkonto, RechnungsNr, InfoText,Anschreibenummer,OperatorId) VALUES " &
                                "(@VorgangID, @Datum, @AnmeldungsID, @Abgabenart, @Berechnungsgrundlage, @Betrag, @CRN, @LRN, @Abgabenkonto, @RechnungsNr, @InfoText, @Anschreibenummer,@OperatorId)" &
                            " End " &
                            " commit tran "

        Using conn As SqlConnection = VERAG_PROG_ALLGEMEIN.SQL.GetNewOpenConnectionADMIN ' GetNewOpenConnectionADMIN()
            Using cmd As New SqlCommand(sql, conn)

                Select Case daten.Abgabenart
                    Case "2EU", "2IG", "2PE", "5EU"
                    Case Else
                        cmd.Parameters.AddWithValue("@VorgangID", daten.VorgangID)
                        cmd.Parameters.AddWithValue("@Datum", daten.Datum)
                        cmd.Parameters.AddWithValue("@AnmeldungsID", daten.AnmeldungsID)
                        cmd.Parameters.AddWithValue("@Abgabenart", daten.Abgabenart)
                        cmd.Parameters.AddWithValue("@Berechnungsgrundlage", daten.Berechnungsgrundlage)
                        cmd.Parameters.AddWithValue("@Betrag", daten.Betrag)
                        cmd.Parameters.AddWithValue("@CRN", daten.CRN)
                        cmd.Parameters.AddWithValue("@LRN", daten.LRN)
                        cmd.Parameters.AddWithValue("@Abgabenkonto", daten.Abgabenkonto)
                        cmd.Parameters.AddWithValue("@RechnungsNr", daten.RechnungsNr)
                        cmd.Parameters.AddWithValue("@InfoText", daten.InfoText)
                        cmd.Parameters.AddWithValue("@Anschreibenummer", daten.Anschreibenummer)
                        cmd.Parameters.AddWithValue("@OperatorId", daten.OperatorId)
                        Try
                            cmd.ExecuteNonQuery()
                            Return True
                        Catch ex As SqlException
                            writeLog("ERROR", "Fehler beim Einfügen in tblBrgAufschubDataAT: " & ex.Message)
                        End Try
                End Select
            End Using
            conn.Close()
        End Using
        Return False
    End Function

    Public Shared Function GetNewOpenConnectionZOLARIS() As SqlConnection
        Dim cn As New SqlConnection()
        cn.ConnectionString = "Data Source=BUCHHALTUNG\SQLEXPRESS;Initial Catalog=ezoll;Integrated Security=false;User ID=AppUser;Password=yp/THDd?xM+pZ$;"
        cn.Open()
        Return cn
    End Function
    Public Shared Function GetNewOpenConnectionADMIN_OLD() As SqlConnection
        Dim cn As New SqlConnection()
        cn.ConnectionString = "Data Source=SQLGUIDE01.verag.ost.dmn;Initial Catalog=ADMIN;Integrated Security=false;User ID=AppUser;Password=yp/THDd?xM+pZ$;"
        cn.Open()
        Return cn
    End Function
    Function getString(o As Object) As String
        Try
            Return CStr(o)
        Catch : End Try
        Return ""
    End Function
End Class

Public Class cEZollData
    Property brgAT_id As Integer = -1
    Property VorgangID As String = ""
    Property Datum As Date
    Property AnmeldungsID As String = ""
    Property Abgabenart As String = ""
    Property Berechnungsgrundlage As Double
    Property Betrag As Double
    Property CRN As String = ""
    Property LRN As String = ""
    Property Abgabenkonto As String = ""
    Property RechnungsNr As String = ""
    Property InfoText As String = ""
    Property Anschreibenummer As String = ""
    Property OperatorId As String
End Class


