Imports System.Data.SqlClient
Imports System.Reflection

Public Class cKunde
    Property KundenNr As Object = Nothing
    Property KundenNrZentrale As Object = Nothing
    Property FilialenNr As Object = Nothing
    Property Einmalige_Abfertigung As Boolean = False
    Property Neutralisierung As Object = Nothing
    Property Avis As Object = Nothing
    Property Zollvollmacht As Boolean = False
    Property Zollvollmacht_vom As Object = Nothing
    Property Lastschrift As Boolean = False
    Property Lastschrift_von As Object = Nothing
    Property Lastschrift_bis As Object = Nothing
    Property Rabattstaffel As Boolean = False
    Property SVS As Boolean = False
    Property Vorlageprovision As Object = Nothing
    Property Kreditaufwendungen As Object = Nothing
    Property Bankspesen As Object = Nothing
    Property Bankspesen_Mindestbetrag As Object = Nothing
    Property Besonderheiten As Object = Nothing
    Property Sammelrechnung As Object = Nothing
    Property Steuerschlüssel As Object = Nothing
    Property Referenznummer As Object = Nothing
    Property Antragssumme As Object = Nothing
    Property Antrag_vom As Object = Nothing
    Property Versicherungssumme As Object = Nothing
    Property Entscheidung_vom As Object = Nothing
    Property Kreditlimit As Object = Nothing
    Property Kreditlimit_vom As Object = Nothing
    Property Info As Object = Nothing
    Property Überwachungskunde As Boolean = False
    Property Abfertigungsverbot As Boolean = False
    Property Abfertigungsverbot_seit As Object = Nothing
    Property Abfertigungsverbot_Grund As Object = Nothing
    Property Rechtsanwalt As Boolean = False
    Property Rechtsanwalt_seit As Object = Nothing
    Property Eingegeben_am As Object = Nothing
    Property Geändert_am As Object = Nothing
    Property Sachbearbeiter As Object = Nothing
    Property LfdSaldo As Object = Nothing
    Property Erste_Abfertigung As Object = Nothing
    Property Vorkasse As Boolean = False
    Property Zahlungsinformationen As Object = Nothing
    Property EORITIN As Object = Nothing
    Property EORITIN_NL As Object = Nothing
    Property Zollnummer As Object = Nothing
    Property ZulassungsNr_ZnV As Object = Nothing
    Property Aufschubkonto_EUSt As Object = Nothing
    Property Aufschubkonto_Zoll As Object = Nothing
    Property Währungscode As Object = Nothing
    Property Euroeinführung As Object = Nothing
    Property LetzteRechnungsNr As Object = Nothing
    Property LetztesRechnungsDatum As Object = Nothing
    Property Konzernkonto As Boolean = False
    Property FiBuSchnittstelle As Boolean = False
    Property Planzahl As Object = Nothing
    Property Gesprächsbericht As Object = Nothing
    Property Bonität As Object = Nothing
    Property Bonitätsdatum As Object = Nothing
    Property Zahlungsziel As Object = Nothing
    Property UStV_SummeUmsatzsteuerbetragEUR As Object = Nothing
    Property UStV_SummeErstattungsbetragEUR As Object = Nothing
    Property UStV_Summe3470BetragEUR As Object = Nothing
    Property UStV_SummeVZBetragEUR As Object = Nothing
    Property UStV_SummeVorschaubetragEUR As Object = Nothing
    Property UStV_SummeVorschaubetragEUR_VERAG As Object = Nothing
    Property UStV_SummeVorschaubetragEUR_IDS As Object = Nothing
    Property Fiskal As Boolean = False
    Property Ausfuhr As Boolean = False
    Property BankgarantieBetrag As Object = Nothing
    Property BankgarantieGültigBis As Object = Nothing
    Property KD_Korrespondenz As Object = Nothing
    Property Fiskal_Aktiv As Object = Nothing
    Property DokumenteLKWFreigabe As Object = Nothing
    Property EmailAnkunft As Boolean = False
    Property EmailFreigabe As Boolean = False

    Property Höchstkredit As Object = Nothing
    Property DakosyExport As Object = Nothing
    Property FiBuSchnittstelleNr As Object = Nothing






    Public hasEntry As Boolean = False
    Dim SQL As New SQL

    Sub New(KundenNr)
        Me.KundenNr = KundenNr
        If KundenNr <= 0 Then
            INIT_NEWKD_DATA()
        Else
            LOAD()
        End If
    End Sub
    Function getParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
        Dim list As New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
        '  list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Mandant", Mandant))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KundenNr", KundenNr, , True))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KundenNrZentrale", KundenNrZentrale))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("FilialenNr", FilialenNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Einmalige Abfertigung", Einmalige_Abfertigung, "Einmalige_Abfertigung"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Neutralisierung", Neutralisierung))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Avis", Avis))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Zollvollmacht", Zollvollmacht))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Zollvollmacht vom", Zollvollmacht_vom, "Zollvollmacht_vom"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Lastschrift", Lastschrift))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Lastschrift von", Lastschrift_von, "Lastschrift_von"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Lastschrift bis", Lastschrift_bis, "Lastschrift_bis"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Rabattstaffel", Rabattstaffel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("SVS", SVS))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Vorlageprovision %", Vorlageprovision, "Vorlageprovision"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Kreditaufwendungen %", Kreditaufwendungen, "Kreditaufwendungen"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Bankspesen %", Bankspesen, "Bankspesen"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Bankspesen Mindestbetrag", Bankspesen_Mindestbetrag, "Bankspesen_Mindestbetrag"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Besonderheiten", Besonderheiten))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Sammelrechnung", Sammelrechnung))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Steuerschlüssel", Steuerschlüssel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Referenznummer", Referenznummer))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Antragssumme", Antragssumme))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Antrag vom", Antrag_vom, "Antrag_vom"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Versicherungssumme", Versicherungssumme))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Entscheidung vom", Entscheidung_vom, "Entscheidung_vom"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Kreditlimit", Kreditlimit))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Kreditlimit vom", Kreditlimit_vom, "Kreditlimit_vom"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Info", Info))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Überwachungskunde", Überwachungskunde))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Abfertigungsverbot", Abfertigungsverbot))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Abfertigungsverbot seit", Abfertigungsverbot_seit, "Abfertigungsverbot_seit"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Abfertigungsverbot Grund", Abfertigungsverbot_Grund, "Abfertigungsverbot_Grund"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Rechtsanwalt", Rechtsanwalt))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Rechtsanwalt seit", Rechtsanwalt_seit, "Rechtsanwalt_seit"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Eingegeben am", Eingegeben_am, "Eingegeben_am"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Geändert am", Geändert_am, "Geändert_am"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Sachbearbeiter", Sachbearbeiter))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("LfdSaldo", LfdSaldo))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Erste Abfertigung", Erste_Abfertigung, "Erste_Abfertigung"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Vorkasse", Vorkasse))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Zahlungsinformationen", Zahlungsinformationen))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EORITIN", EORITIN))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EORITIN_NL", EORITIN_NL))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Zollnummer", Zollnummer))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("ZulassungsNr ZnV", ZulassungsNr_ZnV, "ZulassungsNr_ZnV"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Aufschubkonto EUSt", Aufschubkonto_EUSt, "Aufschubkonto_EUSt"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Aufschubkonto Zoll", Aufschubkonto_Zoll, "Aufschubkonto_Zoll"))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Währungscode", Währungscode))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Euroeinführung", Euroeinführung))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("LetzteRechnungsNr", LetzteRechnungsNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("LetztesRechnungsDatum", LetztesRechnungsDatum))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Konzernkonto", Konzernkonto))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("FiBuSchnittstelle", FiBuSchnittstelle))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("FiBuSchnittstelleNr", FiBuSchnittstelleNr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Planzahl", Planzahl))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Gesprächsbericht", Gesprächsbericht))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Bonität", Bonität))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Bonitätsdatum", Bonitätsdatum))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Zahlungsziel", Zahlungsziel))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("UStV_SummeUmsatzsteuerbetragEUR", UStV_SummeUmsatzsteuerbetragEUR))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("UStV_SummeErstattungsbetragEUR", UStV_SummeErstattungsbetragEUR))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("UStV_Summe3470BetragEUR", UStV_Summe3470BetragEUR))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("UStV_SummeVZBetragEUR", UStV_SummeVZBetragEUR))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("UStV_SummeVorschaubetragEUR", UStV_SummeVorschaubetragEUR))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("UStV_SummeVorschaubetragEUR_VERAG", UStV_SummeVorschaubetragEUR_VERAG))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("UStV_SummeVorschaubetragEUR_IDS", UStV_SummeVorschaubetragEUR_IDS))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Fiskal", Fiskal))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Ausfuhr", Ausfuhr))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BankgarantieBetrag", BankgarantieBetrag))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("BankgarantieGültigBis", BankgarantieGültigBis))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KD_Korrespondenz", KD_Korrespondenz))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Fiskal_Aktiv", Fiskal_Aktiv))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("DokumenteLKWFreigabe", DokumenteLKWFreigabe))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmailAnkunft", EmailAnkunft))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("EmailFreigabe", EmailFreigabe))

        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Höchstkredit", Höchstkredit))
        list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("DakosyExport", DakosyExport))

        Return list
    End Function



    Function VALID(ByRef ERROR_TXT) As Boolean
        If Not hasEntry Then
            'Prüfung Neuanlage:
            If If(FilialenNr Is Nothing, "", FilialenNr).ToString = "" Then ERROR_TXT = "Bitte geben Sie die zuständige Filiale an!" : Return False 'Es gibt alte Einträge ohne FilialenNr
            If checkEORI() Then ERROR_TXT = "Die EORI Nummer existiert bereits!" & vbNewLine & "Bitte prüfen, damit es zu keiner doppelten Erfassung des Kunden kommt." : Return False
        End If
        Return True
    End Function
    Function checkEORI() As Boolean
        If If(EORITIN, String.Empty) <> String.Empty Then
            If SQL.getValueTxtBySql("SELECT COUNT(*) FROM Kunden WHERE EORITIN='" & EORITIN & "' AND  kunden.FilialenNr='" & FilialenNr & "' ", "FMZOLL") > 0 Then
                Return True
            End If
        End If
        Return False
    End Function

    Sub INIT_NEWKD_DATA()

        '    Me.KundenNrZentrale = Me.KundenNr

        If Me.FilialenNr Is Nothing Then Me.FilialenNr = 4803
        If Me.Sachbearbeiter Is Nothing Then Me.Sachbearbeiter = VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME

        Me.Währungscode = "EUR"
        Me.Eingegeben_am = Now.ToShortDateString

        Me.Vorlageprovision = 0.01
        Me.Kreditaufwendungen = 0.02
        Me.Bankspesen = 0
        Me.Bankspesen_Mindestbetrag = 0

        Me.Zahlungsziel = 10
        Me.Sammelrechnung = 0
        Me.Steuerschlüssel = 10
        Me.Kreditlimit = 0 '2600
        Me.Überwachungskunde = 0
        Me.Abfertigungsverbot = 0
        Me.Rechtsanwalt = 0
        Me.Euroeinführung = CDate("01.01.2002")
        Me.UStV_Summe3470BetragEUR = 0
        Me.UStV_SummeErstattungsbetragEUR = 0
        Me.UStV_SummeVorschaubetragEUR = 0
        Me.UStV_SummeVorschaubetragEUR_IDS = 0
        Me.UStV_SummeVorschaubetragEUR_VERAG = 0
        Me.UStV_SummeUmsatzsteuerbetragEUR = 0
        Me.UStV_SummeVZBetragEUR = 0
        Me.Fiskal_Aktiv = 0
        Me.SVS = 1

    End Sub

    Public Function SAVE(Optional newFlag = False) As Boolean 'obj As Object, tablename As String, where As String) As Boolean
        If newFlag Then INIT_NEWKD_DATA()
        If EORITIN IsNot Nothing Then EORITIN = EORITIN.ToString.Replace(" ", "") 'Falls NL-Nr. mit leer einegegeben wird

        Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
        If KundenNr <= 0 Then
            MsgBox("Fehler: KundenNr <= 0!")
            Return False
        End If
        Dim sqlstr = " BEGIN TRAN IF EXISTS(SELECT * FROM Kunden WHERE KundenNr=@KundenNr) " &
                       " BEGIN " & getUpdateCmd() & " END " &
                       " Else " &
                       " BEGIN " & getInsertCmd() & " END " &
                       " commit tran "
        ' MsgBox(sqlstr)
        Dim id = SQL.doSQLVarListID(KundenNr, sqlstr, "FMZOLL", , list,,, False, 2)
        If id = -2 Then id = SQL.doSQLVarListID(KundenNr, sqlstr, "FMZOLL", , list,,, False, 10) '2.Versuch --> Oft Timeout wg.Fmzoll
        If id = -2 Then id = SQL.doSQLVarListID(KundenNr, sqlstr, "FMZOLL", , list) '3.Versuch --> Oft Timeout wg.Fmzoll

        If id > 0 Then
            KundenNr = id 'Sonst wird beim Speichern mit Fehler -1 in die KundenNr übergeben
            If If(Me.KundenNrZentrale, 0) <= 0 Then SQL.doSQL("UPDATE Kunden SET KundenNrZentrale=KundenNr WHERE KundenNr=" & id, "FMZOLL")
        End If
        Return id > 0
    End Function

    Public Sub LOAD()
        Dim test = ""
        Try
            Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand("SELECT * FROM Kunden WHERE KundenNr=@KundenNr  ", conn)
                    cmd.Parameters.AddWithValue("@KundenNr", KundenNr)

                    Dim dr = cmd.ExecuteReader()
                    If dr.Read Then
                        For Each li In getParameterList()
                            '  Me.GetType.GetProperty(l.Scalarvariable) = dr.Item(l.Text)
                            Dim propInfo As PropertyInfo = Me.GetType.GetProperty(li.Scalarvariable)
                            ' MsgBox(l.Text)
                            ' MsgBox(propInfo.PropertyType.ToString)
                            '  propInfo.SetValue(GetType(Object), l.Text)

                            'propInfo.SetValue(Me, l.Text)

                            ' Try
                            test = li.Text
                            If dr.Item(li.Text) Is DBNull.Value Then
                                propInfo.SetValue(Me, Nothing)
                            Else
                                propInfo.SetValue(Me, dr.Item(li.Text))
                            End If

                            '  Catch ex As Exception

                            '  End Try

                            ' Me.GetType.GetProperty(l.Scalarvariable).setSetValue(GetType(Object), l.Text)
                            'If propInfo IsNot Nothing Then
                            'propInfo.SetValue(l.Scalarvariable, l.Text)
                            '  End If
                        Next
                        hasEntry = True
                    End If
                    dr.Close()
                End Using
            End Using
            'Return Nothing
        Catch ex As Exception
            MsgBox(test & "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
            End Try
        '  Return Nothing
    End Sub



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

            Dim str As String = ""
            For Each i In list
                If Not i.isPrimaryParam Then
                    str &= "[" & i.Text & "] = @" & i.Scalarvariable & "," '.Replace("-", "").Replace(" ", "") & ","
                End If
            Next
            str = str.Substring(0, str.Length - 1) 'wg. ','
            Return (" UPDATE [Kunden] SET " & str & " WHERE KundenNr=@KundenNr ")

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


    Public Function getInsertCmd() As String
        Try
            Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList()
            Dim str As String = ""
            Dim values As String = ""
            For Each i In list
                If Not i.isonlyForLoad Then 'And (Not i.isPrimaryParam OrElse i.Value > 0) Then
                    str &= "[" & i.Text & "],"
                    values &= "@" & i.Scalarvariable & "," '.Replace("-", "").Replace(" ", "") & ","
                End If
            Next
            str = str.Substring(0, str.Length - 1) 'wg. ','
            values = values.Substring(0, values.Length - 1) 'wg. ','
            Return (" INSERT INTO Kunden  (" & 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
