Imports System.Drawing.Printing

Public Class frmFremdbeleg
    Public Art = 2
    Public PERSONAL As New cPersonal
    '   Public GESCHAEFTSJAHR
    Dim KASSE As New cRKSV_Kasse
    Public BELEG As EABeleg = Nothing
    Public isUmbuchung As Boolean = False

    Dim SQL As New SQL

    Public Sub New()
        InitializeComponent()
    End Sub

    Public Sub New(isUmbuchung As Boolean)
        InitializeComponent()
        Me.isUmbuchung = isUmbuchung
    End Sub

    Public Sub New(PERSONAL As cPersonal, Mandant As String, Niederlassung As String, Benutzer As Integer, BelegNr As Integer, BelegDat As Date)
        InitializeComponent()
        Me.PERSONAL = PERSONAL
        Me.BELEG = New EABeleg("LOAD", Mandant, Niederlassung, Benutzer, BelegNr, BelegDat)
        Me.Art = BELEG.Belegart
    End Sub



    Private Sub btnEinnahmeBeleg_Click(sender As Object, e As EventArgs) Handles btnEinnahmeBeleg.Click
        Art = 1
        initArt()
        cboKonto._value = ""
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles btnAusgabebeleg.Click
        Art = 2
        initArt()
        cboKonto._value = ""
    End Sub
    Sub initArt()
        If Art = 1 Then
            btnEinnahmeBeleg.BackColor = Color.SteelBlue
            btnEinnahmeBeleg.ForeColor = Color.White
            btnAusgabebeleg.BackColor = Color.Transparent
            btnAusgabebeleg.ForeColor = Color.DimGray
            '  cbxBelegDrucken.Checked = True
            '  cbxBelegDrucken.Enabled = False
        ElseIf Art = 2 Then
            btnAusgabebeleg.BackColor = Color.SteelBlue
            btnAusgabebeleg.ForeColor = Color.White
            btnEinnahmeBeleg.BackColor = Color.Transparent
            btnEinnahmeBeleg.ForeColor = Color.DimGray
            '  cbxBelegDrucken.Enabled = True
            ' cbxBelegDrucken.Checked = False
        End If

        cboKonto.fillWithSQL("SELECT Gegenkonto,Buchungstext  FROM tblBuchungstext WHERE Belegart= " & Art & " AND visible=1 AND Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' ORDER BY Buchungstext", False, "FMZOLL")
    End Sub

    Private Sub frmFremdbeleg_Load(sender As Object, e As EventArgs) Handles Me.Load
        cProgramFunctions.initBONDrucker(cboPrinter, "EPSON")

        If BELEG Is Nothing Or isUmbuchung Then
            BELEG = New EABeleg(PERSONAL.Mandant, PERSONAL.Niederlassung, PERSONAL.ID)
            BELEG.Beleg_TYP = "E"
            initArt()
        Else
            '   If BELEG.gebucht Then
            btn.Text = "Beleg Kopie drucken"
            initArt()
            init()

            btnEinnahmeBeleg.Enabled = False
            btnAusgabebeleg.Enabled = False
            cboKonto.Enabled = False
            txtReferenz.Enabled = False
            txtBetrag.Enabled = False

            'End If
        End If
        'cboKonto.changeItem(9800)

        cboWaehrung.fillWithSQL("SELECT Währungsschlüssel, Währungscode FROM Währungstabelle ORDER BY Währungscode", False, "FMZOLL")
        cboWaehrung._value = 900
        datBeleg.Text = Now.ToShortDateString
        lblSB.Text = PERSONAL.Name
        lblMandant.Text = PERSONAL.Mandant & " / " & PERSONAL.Niederlassung

    End Sub


    Sub init()
        Dim KBEntry As cKassenbuch = Nothing
        Dim KBEntryGB As cKassenbuch = Nothing
        If cRKSV.getKB(BELEG, PERSONAL, KBEntry, KBEntryGB, KASSE.rksv_firma) Then
            txtReferenz.Text = KBEntry.Referenz
            txtBetrag._value = KBEntry.Haben
            ' MsgBox(KBEntry.Soll)
            datBelegdatum.Value = KBEntry.BelegDat
            cboKonto.changeItem(KBEntryGB.Konto.ToString.Trim)

            'Da manche Konten doppelt vorkommen, hier noch die Suche nach dem Text:
            For Each i In cboKonto.Items
                Dim ii = DirectCast(i, VERAG_PROG_ALLGEMEIN.MyListItem)
                'MsgBox(ii.Text & " - " & KBEntryGB.Buchungstext & " ///  " & ii.Value & " - " & KBEntryGB.Konto)
                If ii.Value = KBEntryGB.Konto And ii.Text = KBEntryGB.Buchungstext Then
                    '  MsgBox("OK")
                    cboKonto.SelectedItem = i : Exit Sub

                End If
            Next

            cboKonto.changeItem(KBEntryGB.Konto.ToString.Trim)
        Else
            MsgBox("Fehler beim Laden der Daten!")
            Me.Close()
        End If

    End Sub
   



    Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click
        Try

            If BELEG.gebucht Or BELEG.gebuchtStorno Then
                Dim KBEntry As cKassenbuch = Nothing
                Dim KBEntryGB As cKassenbuch = Nothing
                If cRKSV.getKB(BELEG, PERSONAL, KBEntry, KBEntryGB, KASSE.rksv_firma) Then
                    '  KASSE.LOAD(PERSONAL.cRKSV_KasseID)
                    If BELEG.rksv_id > 0 Then KASSE.LOAD(BELEG.rksv_id)
                    If cbxBelegDrucken.Checked Then cRKSV.printFremdBeleg(BELEG, KASSE, PERSONAL, KBEntry, KBEntryGB, cboPrinter.SelectedItem.ToString)
                End If
                'BELEG, KASSE, PERSONAL, cboPrinter.SelectedItem.ToString)
                Me.Close()
            Else

                If cRKSV.isforbiddenDate Then
                    MsgBox("Die Kasse wir am Monatsende abgeschlossen. Es dürfen keine weiteren Belege erstellt werden. Bitte veruchen Sie den Vorgang nach Mitternacht erneut.")
                    Exit Sub
                End If

                Me.Cursor = Cursors.WaitCursor

                lblErr_Buchungstext.Visible = False
                lblErr_Betrag.Visible = False
                lblErr_Referenz.Visible = False

                If Not IsNumeric(cboKonto._value) OrElse cboKonto._value <= 0 Then
                    lblErr_Buchungstext.Visible = True
                    Exit Sub
                End If
                If Not IsNumeric(txtBetrag.Text) OrElse txtBetrag.Text <= 0 Then
                    lblErr_Betrag.Visible = True
                    Exit Sub
                End If
                If txtReferenz.Text = "" Then
                    lblErr_Referenz.Visible = True
                    Exit Sub
                End If

                If Not IsNumeric(txtBetrag._value) Then
                    lblErr_Betrag.Visible = True
                    Exit Sub
                End If

                If CDbl(txtBetrag._value) <= 0 Then
                    lblErr_Betrag.Visible = True
                    Exit Sub
                End If

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


                BELEG.Belegart = Art
                BELEG.rksv_aktiv = (KASSE.rksv_aktiv Or KASSE.rksvDE_aktiv)
                BELEG.Ordnungsbegriff = IIf(Art = 1, "* KASSEN-EINGANG *", "* KASSEN-AUSGANG *")
                ' BELEG.BelegDat = Now.ToShortDateString
                ' BELEG.BelegDat = Now.ToShortDateString ' datBelegdatum.Value.ToShortDateString
                Dim betrag As Double = txtBetrag._value

                BELEG.rksv_umsatz = betrag
                BELEG.Steuerschlüssel = 3510

                Dim oldBelegZaehler = KASSE.rksv_BelegIdZaehler
                Dim TESTBUCHUNG = False
                Dim RKSV_Beleg_Id = KASSE.INCREASE_BELEG_UMSATZ(If(TESTBUCHUNG, 0, BELEG.rksv_umsatz))

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

                If Not insertKB(KASSE.rksv_id, RKSV_Beleg_Id, KBEntry, KBEntryGB, (KASSE.rksv_aktiv Or KASSE.rksvDE_aktiv), KASSE.rksv_firma) Then ' Eintrag ins Kassenbuch
                    MsgBox(BELEG, "Programmfehler bei Eintrag ins Kassenbuch.")
                    Me.Cursor = Cursors.Default : Me.Close() : Exit Sub
                End If
                BELEG.gebucht = True
                BELEG.SAVE()

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

                '  QR_Image = Nothing
                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.Steuerschlüssel & "' ", "FMZOLL")
                If IsNumeric(steuersatz) Then summeBRUTTO += (betrag * steuersatz)

                If Art = 2 Then
                    summeBRUTTO *= -1
                End If

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

                If KASSE.rksvDE_aktiv Then
                    If Not cRKSV_DE.insertRKSV_DE(PERSONAL, BELEG, KASSE, RKSV_Beleg_Id, summeBRUTTO, QR_CodeString, LastJWS, TESTBUCHUNG, answer) Then 'Digitale Signierung und Erfassung in die RKSV-Datenbank mittels ITG-Service
                        If Not TESTBUCHUNG Then
                            KASSE.DECREASE_BELEG_UMSATZ(oldBelegZaehler, BELEG.rksv_umsatz * -1)
                            cRKSV.DELETE(BELEG, KASSE.rksv_firma)
                        End If
                        MsgBox("Programmfehler bei der digitalen Signatur." & vbNewLine & vbNewLine & answer, MsgBoxStyle.Critical)
                        '  BELEG = cRKSV.STORNO(BELEG, "Programmfehler")
                        'MsgBox("Programmfehler bei der digitalen Signatur.")
                        Me.Cursor = Cursors.Default : Me.Close() : Exit Sub
                    End If
                    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                    If KASSE.rksv_KassaGuid = "KASSE_01" Then
                        BELEG.rksv_jws = Nothing
                        BELEG.rksv_qr = Nothing
                    End If
                    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

                End If


                KASSE.SET_LAST_QR_JWS(LastJWS, QR_CodeString)

                'RKSV-Daten beim Beleg ergänzen:
                BELEG.rksv_jws = LastJWS
                BELEG.rksv_qr = QR_CodeString
                BELEG.rksv_BelegId = RKSV_Beleg_Id
                BELEG.rksv_id = KASSE.rksv_id
                BELEG.SAVE()

                If cbxBelegDrucken.Checked Then cRKSV.printFremdBeleg(BELEG, KASSE, PERSONAL, KBEntry, KBEntryGB, cboPrinter.SelectedItem.ToString)

                Me.Cursor = Cursors.Default

            End If
            Me.Close()
        Catch ex As Exception
            Me.Cursor = Cursors.Default
            MsgBox("Allgemeiner Programmfehler - Belegerfassung wird geschlossen!")
            Me.Close()
        End Try
    End Sub

    Function insertKB(RKSV_id As Integer, RKSV_Beleg_Id As Integer, ByRef KBEntry As cKassenbuch, ByRef KBEntryGB As cKassenbuch, RKSV_Aktiv As Boolean, Firma As String, Optional Finanzwege As String = "Bar") As Boolean
        Dim GJBeleg = New cGeschaeftsjahr(BELEG.Mandant, BELEG.Niederlassung, BELEG.Benutzer, cRKSV.getGJ_FIRMA(BELEG.BelegDat, Firma))

        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_FIRMA(BELEG.BelegDat, Firma))
        KBEntry = New cKassenbuch(PERSONAL.Mandant, PERSONAL.Niederlassung, PERSONAL.ID, cRKSV.getGJ_FIRMA(BELEG.BelegDat, Firma), 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 = cboKonto.Text
        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
        KBEntry.Finanzwege = Finanzwege
        If Not KBEntry.INSERT() Then Return False

        '################
        ' EINTRAG: Kassenbuch
        '################
        KBEntryGB = New cKassenbuch(PERSONAL.Mandant, PERSONAL.Niederlassung, PERSONAL.ID, cRKSV.getGJ_FIRMA(BELEG.BelegDat, Firma), 0)
        KBEntryGB.JournalNr = GJ.INCREASE_JOURNAL() 'Vergabe der Journalnummer
        '    KBEntryGB.JournalNr = fktJournalNr(rst1!Mandant, rst1!Niederlassung, rst1!Benutzer, rst1!BelegDat)
        KBEntryGB.Konto = cboKonto._value
        KBEntryGB.Buchungstext = cboKonto.Text
        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
        KBEntryGB.Finanzwege = Finanzwege
        If Not KBEntryGB.INSERT() Then Return False

        Return True
    End Function


    Private Sub txtBetrag_TextChanged(sender As Object, e As KeyEventArgs) Handles txtBetrag.KeyDown
        If e.KeyCode = Keys.Return Then
            btn.Focus() 'damit txtBetrag._value passt
            btn.PerformClick()
        End If
    End Sub

    Private Sub cboKonto_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboKonto.SelectedIndexChanged
        lblKontoNr.Text = cboKonto._value
    End Sub

    Private Sub pnlData_Paint(sender As Object, e As PaintEventArgs) Handles pnlData.Paint

    End Sub

    Private Sub cbxBelegDrucken_CheckedChanged(sender As Object, e As EventArgs) Handles cbxBelegDrucken.CheckedChanged
        cboPrinter.Enabled = cbxBelegDrucken.Checked
    End Sub

    Private Sub frmFremdbeleg_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        'If BELEG IsNot Nothing Then init()
    End Sub
End Class