
Imports System.Data.SqlClient

Public Class cRechnungsnummern
    Property SpeditionsbuchNr As String = "" 'FIRMA!
    Property Buchungsjahr As String = ""


    Property VonRechnungsNr As Integer = -1
    Property BisRechnungsNr As Integer = -1
    Property LfdRechnungsNr As Integer = 0

    Dim SQL As New SQL

    Public Sub New(SpeditionsbuchNr As String, Buchungsjahr As String)
        Me.SpeditionsbuchNr = SpeditionsbuchNr
        Me.Buchungsjahr = Buchungsjahr

        'Default-Werte:
        '-------------------------------------
        Select Case SpeditionsbuchNr
            Case 1
                VonRechnungsNr = Now.ToString("yy") & "100001"
                BisRechnungsNr = Now.ToString("yy") & "199999"
            Case 3
                VonRechnungsNr = Now.ToString("yy") & "300001"
                BisRechnungsNr = Now.ToString("yy") & "399999"
            Case 7
                VonRechnungsNr = Now.ToString("yy") & "700001"
                BisRechnungsNr = Now.ToString("yy") & "799999"
            Case 11
                VonRechnungsNr = Now.ToString("yy") & "900001"
                BisRechnungsNr = Now.ToString("yy") & "999999"
            Case 15
                VonRechnungsNr = Now.ToString("yy") & "200001"
                BisRechnungsNr = Now.ToString("yy") & "299999"
            Case 20
                VonRechnungsNr = Now.ToString("yy") & "400001"
                BisRechnungsNr = Now.ToString("yy") & "499999"
            Case 17 'FrontOffice
                VonRechnungsNr = Now.ToString("yy") & "500001"
                BisRechnungsNr = Now.ToString("yy") & "599999"

            Case 21 ' UNISPED AT
                VonRechnungsNr = "7000000"
                BisRechnungsNr = "7999999"
            Case 22 ' UNISPED DE
                VonRechnungsNr = "9000000"
                BisRechnungsNr = "9999999"
            Case 23 ' UNISPED Zollservice
                VonRechnungsNr = "5000000"
                BisRechnungsNr = "5999999"
            Case 26 ' VERAG-UNISPED
                VonRechnungsNr = Now.ToString("yy") & "0000001"
                BisRechnungsNr = Now.ToString("yy") & "9999999"
        End Select
        LfdRechnungsNr = VonRechnungsNr
        '-------------------------------------


        LOAD(SpeditionsbuchNr, Buchungsjahr)
    End Sub


    Public Function INCREASE_RGNR() As Integer
        If LfdRechnungsNr > 0 Then
            LfdRechnungsNr += 1
        Else
            LfdRechnungsNr = 1
        End If
        SAVE()
        Return LfdRechnungsNr
    End Function

    Public Function DECREASE_RGNR() As Integer
        If LfdRechnungsNr > 0 Then
            LfdRechnungsNr -= 1
        End If
        SAVE()
        Return LfdRechnungsNr
    End Function


    Public Function CHECK_RGNR(Optional sleep = False) As Integer ' Prüfung, ob RgNr schon vergeben wurde --> dann +1, bis freie Nr.
        Dim increased = False
        If sleep Then System.Threading.Thread.Sleep(200) ' nur, um abzuwarten falls parallel eine Nr vergeben wird
        While SQL.DLookup("count(*)", "Rechnungsausgang", " RechnungsNr='" & LfdRechnungsNr & "' and Firma_ID='" & SpeditionsbuchNr & "' and Buchungsjahr='" & Buchungsjahr & "' ", "FMZOLL", 0) > 0
            LfdRechnungsNr += 1
            increased = True
            System.Threading.Thread.Sleep(50) ' nur, um abzuwarten falls parallel eine Nr vergeben wird
        End While
        If increased Then SAVE()
        Return LfdRechnungsNr
    End Function


    Public Function SAVE() As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        Dim list As List(Of VERAG_PROG_ALLGEMEIN.MyListItem2) = getParameterList()

        Dim sqlstr = " BEGIN TRAN IF EXISTS(SELECT * FROM [Rechnungsnummern] WITH(updlock,serializable) WHERE [SpeditionsbuchNr]=@SpeditionsbuchNr AND Buchungsjahr=@Buchungsjahr) " &
                       " BEGIN " & getUpdateCmd() & " END " &
                       " Else " &
                       " BEGIN " & getInsertCmd() & " END " &
                       " commit tran "
        'MsgBox(sqlstr)
        Return SQL.doSQL(sqlstr, "FMZOLL", , list)
    End Function

    Public Sub LOAD(SpeditionsbuchNr As String, Buchungsjahr As String)
        Try
            Using conn As SqlConnection = cSqlDb.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("SELECT * FROM Rechnungsnummern WHERE  [SpeditionsbuchNr]=@SpeditionsbuchNr AND Buchungsjahr=@Buchungsjahr ", conn)
                    cmd.Parameters.AddWithValue("@SpeditionsbuchNr", SpeditionsbuchNr)
                    cmd.Parameters.AddWithValue("@Buchungsjahr", Buchungsjahr)

                    Dim dr = cmd.ExecuteReader()
                    If dr.Read Then
                        Me.SpeditionsbuchNr = cSqlDb.checkNullStr(dr.Item("SpeditionsbuchNr"))
                        Me.Buchungsjahr = cSqlDb.checkNullStr(dr.Item("Buchungsjahr"))
                        Me.LfdRechnungsNr = cSqlDb.checkNullStr(dr.Item("LfdRechnungsNr"))
                        Me.VonRechnungsNr = cSqlDb.checkNullInteger(dr.Item("VonRechnungsNr"))
                        Me.BisRechnungsNr = cSqlDb.checkNullInteger(dr.Item("BisRechnungsNr"))

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


    Function getParameterList() As List(Of VERAG_PROG_ALLGEMEIN.MyListItem2)
        Dim list As New List(Of VERAG_PROG_ALLGEMEIN.MyListItem2)
        list.Add(New VERAG_PROG_ALLGEMEIN.MyListItem2("SpeditionsbuchNr", SpeditionsbuchNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.MyListItem2("Buchungsjahr", Buchungsjahr))
        list.Add(New VERAG_PROG_ALLGEMEIN.MyListItem2("LfdRechnungsNr", LfdRechnungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.MyListItem2("VonRechnungsNr", VonRechnungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.MyListItem2("BisRechnungsNr", BisRechnungsNr))
        Return list
    End Function

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

            Dim str As String = ""
            For Each i In list
                str &= "[" & i.Text & "] = @" & i.Text.Replace("-", "").Replace(" ", "") & ","
            Next
            str = str.Substring(0, str.Length - 1) 'wg. ','
            Return (" UPDATE [Rechnungsnummern] SET " & str & " WHERE  [SpeditionsbuchNr]=@SpeditionsbuchNr AND Buchungsjahr=@Buchungsjahr ")

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

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


End Class
