Public Class frmKasseAbschliessen
    Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
    Dim FMZOLL_SQL As New FMZOLL_SQL
    Dim SaldoALT As Double = 0.0
    Dim SaldoNEU As Double = 0.0

    Dim PERSONAL As cPersonal = Nothing
    Private Sub frmKasseAbschliessen_Load(sender As Object, e As EventArgs) Handles Me.Load
        lblTESTSYSTEM.Visible = VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM

        MyComboBox2.fillWithSQL("SELECT [KassenbuchNr],[Name] FROM [Personal] WHERE ((Status='A' AND KassenbuchNr IS NOT NULL AND BLC='R') OR (BLC='V00')) ORDER BY Name", False, "FMZOLL")
        NumericUpDown.Value = Now.Year - 1
        NumericUpDown1.Value = Now.Year
    End Sub

    Private Sub MyComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles MyComboBox2.SelectedIndexChanged
        PERSONAL = Nothing
        MyTextBox1.Text = ""
        MyTextBox2.Text = ""
        Label4.Text = ""

        If MyComboBox2._value <> "" Then
            PERSONAL = FMZOLL_SQL.getPersonalKassenbuch(MyComboBox2._value)
            Label4.Text = PERSONAL.ID
            initSALDO()
        End If

       
    End Sub

    Sub initSALDO()
        SaldoALT = SQL.getValueTxtBySql("SELECT isnull((Sum(tblKassenbuch.Soll)-Sum(tblKassenbuch.Haben)),0) AS Saldo " &
            " FROM Personal INNER JOIN tblKassenbuch ON Personal.ID = tblKassenbuch.Benutzer " &
           " WHERE tblKassenbuch.Mandant='" & PERSONAL.Mandant & "' AND tblKassenbuch.Niederlassung='" & PERSONAL.Niederlassung & "' " &
           "  And tblKassenbuch.Benutzer=" & PERSONAL.ID & " AND tblKassenbuch.Geschäftsjahr=" & NumericUpDown.Value & " AND tblKassenbuch.Konto=" & PERSONAL.KassenbuchNr & "", "FMZOLL")
        SaldoNEU = SQL.getValueTxtBySql("SELECT isnull((Sum(tblKassenbuch.Soll)-Sum(tblKassenbuch.Haben)),0) AS Saldo " &
            " FROM Personal INNER JOIN tblKassenbuch ON Personal.ID = tblKassenbuch.Benutzer " &
           " WHERE tblKassenbuch.Mandant='" & PERSONAL.Mandant & "' AND tblKassenbuch.Niederlassung='" & PERSONAL.Niederlassung & "' " &
           "  And tblKassenbuch.Benutzer=" & PERSONAL.ID & " AND tblKassenbuch.Geschäftsjahr=" & NumericUpDown1.Value & " AND tblKassenbuch.Konto=" & PERSONAL.KassenbuchNr & "", "FMZOLL")



        MyTextBox1.Text = SaldoALT
        MyTextBox2.Text = SaldoNEU
        ' Label6.Text = CDbl(If(dt.Rows.Count > 0, cSqlDb.checkNullReturnValue(dt.Rows(0)("Saldo"), 0), 0)).ToString("C")



    End Sub

    Private Sub btnKassensaldoUbertragen_Click(sender As Object, e As EventArgs) Handles btnKassensaldoUbertragen.Click
        Me.Cursor = Cursors.WaitCursor

        If PERSONAL Is Nothing Then MsgBox("Kasse wählen!") : Exit Sub
        If cbxAlt.Checked And cbxNeu.Checked And SaldoALT = 0 Then MsgBox("Kein Betrag zu übertragen!") : Exit Sub

        JAHRESABSCHLUSS(PERSONAL, SaldoALT)
        initSALDO()

        Me.Cursor = Cursors.Default


    End Sub


    Function JAHRESABSCHLUSS(PERSONAL As cPersonal, betrag As Double) As Boolean
        Dim KASSE As New cRKSV_Kasse
        ' Dim betrag As Double = SaldoALT

        If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then
            KASSE.LOAD(6) 'Laden der Kasse anhand der Auswahlbox
        Else
            KASSE.LOAD(PERSONAL.cRKSV_KasseID)
        End If

        If cbxAlt.Checked Then insertBELEGALT(KASSE, betrag)
        If cbxNeu.Checked Then insertBELEGNEU(KASSE, betrag)

        Return True
    End Function


    Sub insertBELEGALT(KASSE As cRKSV_Kasse, betrag As Double)
        Dim BELEG_ALT As New EABeleg(PERSONAL.Mandant, PERSONAL.Niederlassung, PERSONAL.ID) '!!!!!!!!!!!!!!!!
        BELEG_ALT.BelegDat = cRKSV.getGJ_EndOfYear(NumericUpDown.Value).ToShortDateString 'CDate("31.01." & NumericUpDown1.Value)

        If txtxAbwBetragALT._value <> "" AndAlso IsNumeric(txtxAbwBetragALT._value) Then betrag = txtxAbwBetragALT._value

        BELEG_ALT.Belegart = 2 'AUSGANG
        BELEG_ALT.Beleg_TYP = "E"
        BELEG_ALT.rksv_aktiv = KASSE.rksv_aktiv
        BELEG_ALT.Ordnungsbegriff = "* KASSEN-JAHRESABSCHLUSS *" 'IIf(Art = 1, "* KASSEN-JAHRESABSCHLUSS *", "* KASSEN-JAHRESANFANGS-SALDO *")

        BELEG_ALT.rksv_umsatz = betrag
        BELEG_ALT.Steuerschlüssel = 0

        Dim oldBelegZaehler = KASSE.rksv_BelegIdZaehler
        Dim RKSV_Beleg_Id = KASSE.INCREASE_BELEG_UMSATZ(BELEG_ALT.rksv_umsatz)

        Dim KBEntry As cKassenbuch = Nothing
        Dim KBEntryGB As cKassenbuch = Nothing

        ' Dim JournalNr = 0
        If Not insertKB(BELEG_ALT, 9800, KASSE.rksv_id, RKSV_Beleg_Id, KBEntry, KBEntryGB, KASSE.rksv_aktiv) Then ' Eintrag ins Kassenbuch
            MsgBox(BELEG_ALT, "Programmfehler bei Eintrag ins Kassenbuch.")
            Me.Cursor = Cursors.Default : Me.Close() : Exit Sub
        End If
        BELEG_ALT.gebucht = True
        BELEG_ALT.SAVE()

        If RKSV_Beleg_Id < 0 Then
            Me.Cursor = Cursors.Default
            BELEG_ALT = cRKSV.STORNO(BELEG_ALT, "Programmfehler bei der Erstellung der RKSV-Beleg-Id.", KASSE.rksv_firma)
            Me.Cursor = Cursors.Default : Me.Close() : Exit Sub
        End If

        Dim QR_CodeString As String = ""
        Dim LastJWS As String = ""

        Dim summeBRUTTO = betrag
        Dim steuersatz As Double = SQL.getValueTxtBySql("SELECT isnull(tblSteuersätze.Steuersatz,0) FROM tblSteuersätze WHERE tblSteuersätze.Nr='" & BELEG_ALT.Steuerschlüssel & "' ", "FMZOLL")
        If IsNumeric(steuersatz) Then summeBRUTTO += (betrag * steuersatz)

        If BELEG_ALT.Belegart = 2 Then summeBRUTTO *= -1

        Dim answer = ""
        If KASSE.rksv_aktiv Then
            If Not cRKSV.insertRKSV(KASSE, KASSE.rksv_CompanyGUID, KASSE.rksv_Umsatzzaehler, Now, BELEG_ALT.Steuerschlüssel, RKSV_Beleg_Id, summeBRUTTO, QR_CodeString, LastJWS, False, answer) Then 'Digitale Signierung und Erfassung in die RKSV-Datenbank mittels ITG-Service
                KASSE.DECREASE_BELEG_UMSATZ(oldBelegZaehler, BELEG_ALT.rksv_umsatz * -1)
                cRKSV.DELETE(BELEG_ALT, KASSE.rksv_firma)
                MsgBox("Programmfehler bei der digitalen Signatur." & vbNewLine & vbNewLine & answer, MsgBoxStyle.Critical)
                Me.Cursor = Cursors.Default : Me.Close() : Exit Sub
            End If
        End If

        KASSE.SET_LAST_QR_JWS(LastJWS, QR_CodeString)
        'RKSV-Daten beim Beleg ergänzen:
        BELEG_ALT.rksv_jws = LastJWS
        BELEG_ALT.rksv_qr = QR_CodeString
        BELEG_ALT.rksv_BelegId = RKSV_Beleg_Id
        BELEG_ALT.rksv_id = KASSE.rksv_id
        BELEG_ALT.SAVE()
    End Sub
    Sub insertBELEGNEU(KASSE As cRKSV_Kasse, betrag As Double)
        Dim BELEG_NEU As New EABeleg(PERSONAL.Mandant, PERSONAL.Niederlassung, PERSONAL.ID) '!!!!!!!!!!!!!!!!
        BELEG_NEU.BelegDat = cRKSV.getGJ_BeginOfYear(NumericUpDown1.Value).ToShortDateString '' CDate("01.02." & NumericUpDown1.Value)
        BELEG_NEU.Beleg_TYP = "E"
        BELEG_NEU.Belegart = 1 'EINGANG
        BELEG_NEU.rksv_aktiv = KASSE.rksv_aktiv
        BELEG_NEU.Ordnungsbegriff = "* KASSEN-JAHRESANFANGS-SALDO *" 'IIf(Art = 1, "* KASSEN-JAHRESABSCHLUSS *", "* KASSEN-JAHRESANFANGS-SALDO *")

        If txtxAbwBetragNEU._value <> "" AndAlso IsNumeric(txtxAbwBetragNEU._value) Then betrag = txtxAbwBetragNEU._value

        BELEG_NEU.rksv_umsatz = betrag
        BELEG_NEU.Steuerschlüssel = 0

        Dim oldBelegZaehler = KASSE.rksv_BelegIdZaehler
        Dim RKSV_Beleg_Id = KASSE.INCREASE_BELEG_UMSATZ(BELEG_NEU.rksv_umsatz)

        Dim KBEntry As cKassenbuch = Nothing
        Dim KBEntryGB As cKassenbuch = Nothing

        ' Dim JournalNr = 0
        If Not insertKB(BELEG_NEU, 9800, KASSE.rksv_id, RKSV_Beleg_Id, KBEntry, KBEntryGB, KASSE.rksv_aktiv) Then ' Eintrag ins Kassenbuch
            MsgBox(BELEG_NEU, "Programmfehler bei Eintrag ins Kassenbuch.")
            Me.Cursor = Cursors.Default : Me.Close() : Exit Sub
        End If
        BELEG_NEU.gebucht = True
        BELEG_NEU.SAVE()

        If RKSV_Beleg_Id < 0 Then
            Me.Cursor = Cursors.Default
            BELEG_NEU = cRKSV.STORNO(BELEG_NEU, "Programmfehler bei der Erstellung der RKSV-Beleg-Id.", KASSE.rksv_firma)
            Me.Cursor = Cursors.Default : Me.Close() : Exit Sub
        End If

        Dim QR_CodeString As String = ""
        Dim LastJWS As String = ""

        Dim summeBRUTTO = betrag
        Dim steuersatz As Double = SQL.getValueTxtBySql("SELECT isnull(tblSteuersätze.Steuersatz,0) FROM tblSteuersätze WHERE tblSteuersätze.Nr='" & BELEG_NEU.Steuerschlüssel & "' ", "FMZOLL")
        If IsNumeric(steuersatz) Then summeBRUTTO += (betrag * steuersatz)

        If BELEG_NEU.Belegart = 2 Then summeBRUTTO *= -1

        Dim answer = ""
        If KASSE.rksv_aktiv Then
            If Not cRKSV.insertRKSV(KASSE, KASSE.rksv_CompanyGUID, KASSE.rksv_Umsatzzaehler, Now, BELEG_NEU.Steuerschlüssel, RKSV_Beleg_Id, summeBRUTTO, QR_CodeString, LastJWS, False, answer) Then 'Digitale Signierung und Erfassung in die RKSV-Datenbank mittels ITG-Service
                KASSE.DECREASE_BELEG_UMSATZ(oldBelegZaehler, BELEG_NEU.rksv_umsatz * -1)
                cRKSV.DELETE(BELEG_NEU, KASSE.rksv_firma)
                MsgBox("Programmfehler bei der digitalen Signatur." & vbNewLine & vbNewLine & answer, MsgBoxStyle.Critical)
                Me.Cursor = Cursors.Default : Me.Close() : Exit Sub
            End If
        End If

        KASSE.SET_LAST_QR_JWS(LastJWS, QR_CodeString)
        'RKSV-Daten beim Beleg ergänzen:
        BELEG_NEU.rksv_jws = LastJWS
        BELEG_NEU.rksv_qr = QR_CodeString
        BELEG_NEU.rksv_BelegId = RKSV_Beleg_Id
        BELEG_NEU.rksv_id = KASSE.rksv_id
        BELEG_NEU.SAVE()
    End Sub


    Function insertKB(BELEG As EABeleg, Gegenkonto As Integer, RKSV_id As Integer, RKSV_Beleg_Id As Integer, ByRef KBEntry As cKassenbuch, ByRef KBEntryGB As cKassenbuch, RKSV_Aktiv As Boolean) As Boolean
        Dim GJBeleg = New cGeschaeftsjahr(BELEG.Mandant, BELEG.Niederlassung, BELEG.Benutzer, cRKSV.getGJ(BELEG.BelegDat))

        BELEG.BelegNr = GJBeleg.INCREASE_BELEG() 'Vergabe der Belegnummer
        ' BELEG.BelegDat = Now.ToShortDateString
        ' Beleg noch nicht gespeichert.... BELEG.DEL_POS_List()' Positionen löschen, da BelegNr Neu vergeben
        For Each p In BELEG.POS
            p.BelegNr = BELEG.BelegNr
        Next
        BELEG.SAVE()
        'BELEG.SAVE_POS_List()


        '################
        ' EINTRAG: Kassenbuch
        '################
        Dim GJ As New cGeschaeftsjahr(PERSONAL.Mandant, PERSONAL.Niederlassung, PERSONAL.ID, cRKSV.getGJ(BELEG.BelegDat))
        KBEntry = New cKassenbuch(PERSONAL.Mandant, PERSONAL.Niederlassung, PERSONAL.ID, cRKSV.getGJ(BELEG.BelegDat), 0)
        KBEntry.JournalNr = GJ.INCREASE_JOURNAL() 'Vergabe der Journalnummer
        '    KBEntry.JournalNr = fktJournalNr(rst1!Mandant, rst1!Niederlassung, rst1!Benutzer, rst1!BelegDat)
        KBEntry.Konto = PERSONAL.KassenbuchNr
        KBEntry.Buchungstext = BELEG.Ordnungsbegriff
        KBEntry.Buchungsdatum = BELEG.BelegDat ' Now.ToShortDateString
        '  KBEntry.BelegDat = datBelegdatum.Value.ToShortDateString
        KBEntry.BelegDat = BELEG.BelegDat
        KBEntry.BelegNr = BELEG.BelegNr 'GJ.INCREASE_BELEG
        KBEntry.Belegart = BELEG.Belegart 'art
        KBEntry.Eingabeart = 0
        KBEntry.Steuer = 0
        KBEntry.Steuerbetrag = 0
        KBEntry.Referenz = "" 'txtReferenz.Text
        KBEntry.Währung = 900 'cboWaehrung._value
        KBEntry.Kurs = SQL.getValueTxtBySql("SELECT [Eurokurs] FROM Währungstabelle WHERE Währungsschlüssel=900", "FMZOLL") '" & cboWaehrung._value, "FMZOLL")
        If KBEntry.Belegart = 1 Then
            KBEntry.Soll = BELEG.rksv_umsatz ' txtBetrag.Text
        ElseIf KBEntry.Belegart = 2 Then
            KBEntry.Haben = BELEG.rksv_umsatz ' txtBetrag.Text
        End If
        KBEntry.Betrag = BELEG.rksv_umsatz ' txtBetrag.Text
        KBEntry.rksv_id = RKSV_id
        KBEntry.rksv_BelegId = RKSV_Beleg_Id
        KBEntry.rksv_aktiv = RKSV_Aktiv
        KBEntry.Belegverbuchung = True
        KBEntry.gebucht = True
        If Not KBEntry.INSERT() Then Return False

        '################
        ' EINTRAG: Kassenbuch
        '################
        KBEntryGB = New cKassenbuch(PERSONAL.Mandant, PERSONAL.Niederlassung, PERSONAL.ID, cRKSV.getGJ(BELEG.BelegDat), 0)
        KBEntryGB.JournalNr = GJ.INCREASE_JOURNAL() 'Vergabe der Journalnummer
        '    KBEntryGB.JournalNr = fktJournalNr(rst1!Mandant, rst1!Niederlassung, rst1!Benutzer, rst1!BelegDat)
        KBEntryGB.Konto = Gegenkonto
        KBEntryGB.Buchungstext = BELEG.Ordnungsbegriff
        KBEntryGB.Buchungsdatum = BELEG.BelegDat 'Now.ToShortDateString
        '  KBEntryGB.BelegDat = datBelegdatum.Value.ToShortDateString
        KBEntryGB.BelegDat = BELEG.BelegDat
        KBEntryGB.BelegNr = BELEG.BelegNr 'GJ.INCREASE_BELEG
        KBEntryGB.Belegart = BELEG.Belegart ' Art
        KBEntryGB.Eingabeart = 0
        KBEntryGB.Steuer = 0
        KBEntryGB.Steuerbetrag = 0
        KBEntryGB.Referenz = "" 'txtReferenz.Text
        KBEntryGB.Währung = 900 ' cboWaehrung._value

        KBEntryGB.Kurs = SQL.getValueTxtBySql("SELECT [Eurokurs] FROM Währungstabelle WHERE Währungsschlüssel=900", "FMZOLL") '" & cboWaehrung._value, "FMZOLL")
        If KBEntryGB.Belegart = 2 Then
            KBEntryGB.Soll = BELEG.rksv_umsatz ' txtBetrag.Text
        ElseIf KBEntryGB.Belegart = 1 Then
            KBEntryGB.Haben = BELEG.rksv_umsatz 'txtBetrag.Text
        End If
        KBEntryGB.Betrag = BELEG.rksv_umsatz ' txtBetrag.Text

        KBEntryGB.rksv_id = RKSV_id
        KBEntryGB.rksv_BelegId = RKSV_Beleg_Id
        KBEntryGB.rksv_aktiv = RKSV_Aktiv
        KBEntryGB.Belegverbuchung = True
        KBEntryGB.gebucht = True
        If Not KBEntryGB.INSERT() Then Return False

        Return True
    End Function

    Private Sub cbxAlt_CheckedChanged(sender As Object, e As EventArgs) Handles cbxAlt.CheckedChanged
        txtxAbwBetragALT.Enabled = cbxAlt.Checked
    End Sub

    Private Sub cbxNeu_CheckedChanged(sender As Object, e As EventArgs) Handles cbxNeu.CheckedChanged
        txtxAbwBetragNEU.Enabled = cbxNeu.Checked
    End Sub
End Class