Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient
Imports UIControls

Public Class TouchErfassung

    Dim zuletztGeladeneArtKatNr As Integer
    Friend ArtikelNr As Integer
    Property AktuelleArtKatNr As Integer
    Dim Stk As Decimal = 1
    Private _vorgang As VorgangInBearbeitung = Nothing
    Dim SoundPlayer As New SoundPlayer(Parent)

    Public Event ArtikelErfasst(ea As ArtikelPosition)
    Public Event ArtikelRabatt(ea As ArtikelPosition)
    Public Event ArtikelPreisGeaendert(ea As ArtikelPosition)
    Public Event RechnungRabatt(vorgang As VorgangInBearbeitung, rabattInProcent As Integer)
    Public Event ArtikelEntfernt(ea As ArtikelPosition)
    Public Event KassaAbschliessen(Vorgang As VorgangInBearbeitung)
    Public Event FormGeschlossen As EventHandler
    Public Event Ausschuss(grund As String)
    Public Event Storno(vorgang As VorgangInBearbeitung, silent As Boolean)
    Public Event DruckLetzterBeleg As EventHandler
    Public Event AuftragKueche(vorgang As VorgangInBearbeitung, ziel As String)
    Public Event Zustellung(trasportMethode As String)
    Public Event KundeGeaendert(IDNR As Integer, notiz As String, zustellmethode As String) 'für Zustellung
    Public Event RechnungVorschauDruck(vorgang As VorgangInBearbeitung)
    Public Event BezahltMitBankomat()
    Public Event BezahltMitZahlungsmethode(methode As String)
    Public Event VorgangParken(vorgang As VorgangInBearbeitung)
    Public Event DruckAktuellerBeleg(vorgang As VorgangInBearbeitung)
    Public Event KategorieGewaehlt(ArtKatNr As Integer)
    Public Event DruckMonatsBeleg()
    Public Event BelegSenden(vorgang As VorgangInBearbeitung)


    Dim SORTING_BEZ_AS_NUMBER As String = "CONVERT(substring(a.bezeichnung, 1, LOCATE('.', a.bezeichnung) -1 ), SIGNED INTEGER)"
    Dim BARRECHNUNG_KEINE_EINGABE_BAR_GEGEBEN As Boolean = False
    Dim BARRECHNUNG_RESTAURANT_KASSA_SIMPEL As Boolean = False
    Dim BARRECHNUNG_RESTAURANT_SORTIERUNG As String
    Dim BARRECHNUNG_RESTAURANT_KASSA_BUTTON_HOEHE, BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BREITE, BARRECHNUNG_RESTAURANT_KASSA_SCHRIFT_GROESSE As Integer
    Dim BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BILD As Boolean
    Dim BARRECHNUNG_RESTAURANT_KASSA_MAIN_MENU_VERSTECKT As Boolean
    Dim BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT As Boolean = False
    Dim BARRECHNUNG_KEINE_TISCHE As Boolean = False
    Dim BARRECHNUNG_KEINE_ZUSTELLUNG As Boolean = False
    Dim BARRECHNUNG_TOP_ARTIKEL As Boolean = True

    Friend dndKategorien As TouchErfassungDnD
    Friend dndArtikel As TouchErfassungDnD
    Dim buttonSplit2 As New Button()

    Friend Property silent As Boolean = False
    Dim UpdateVorgangPreviewAufgerufenAm As Date = Now.AddSeconds(-10)
    Dim VorgangInfoGeladen As Boolean = False 'Falls beim Starten Vorgang Preview zu zeigen ist

    Public Property Vorgang As VorgangInBearbeitung
        Get
            Return _vorgang
        End Get
        Set(value As VorgangInBearbeitung)
            _vorgang = value
        End Set
    End Property

    Sub SetzeSortierung()
        If BARRECHNUNG_RESTAURANT_SORTIERUNG <> "Bezeichnung" Then
            SORTING_BEZ_AS_NUMBER = BARRECHNUNG_RESTAURANT_SORTIERUNG
        End If
    End Sub

    Private Sub TouchErfassung_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Laden()
    End Sub

    Public Sub Laden()
        Try

            SuspendLayout()
            ApplyStyle()
            BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT = VarValue_Default(Variablen.BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT, False) And HasRecht("Restaurantkassa Rabatt geben")
            BARRECHNUNG_RESTAURANT_KASSA_BUTTON_HOEHE = VarValue_Default(Variablen.BARRECHNUNG_RESTAURANT_KASSA_BUTTON_HOEHE, 50)
            BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BREITE = VarValue_Default(Variablen.BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BREITE, 100)
            BARRECHNUNG_RESTAURANT_KASSA_SCHRIFT_GROESSE = VarValue_Default(Variablen.BARRECHNUNG_RESTAURANT_KASSA_SCHRIFT_GROESSE, 12)
            BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BILD = CBool(VarValue_Default(Variablen.BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BILD, False))
            BARRECHNUNG_RESTAURANT_KASSA_SIMPEL = VarValue_Default(Variablen.BARRECHNUNG_RESTAURANT_KASSA_SIMPEL, False)
            BARRECHNUNG_KEINE_EINGABE_BAR_GEGEBEN = VarValue_Default(Variablen.BARRECHNUNG_KEINE_EINGABE_BAR_GEGEBEN, "true")
            BARRECHNUNG_RESTAURANT_SORTIERUNG = VarValue_Default(Variablen.BARRECHNUNG_RESTAURANT_SORTIERUNG, "Bezeichnung")
            BARRECHNUNG_RESTAURANT_KASSA_MAIN_MENU_VERSTECKT = VarValue_Default(Variablen.BARRECHNUNG_RESTAURANT_KASSA_MAIN_MENU_VERSTECKT, True)
            BARRECHNUNG_KEINE_TISCHE = VarValue_Default(Variablen.BARRECHNUNG_KEINE_TISCHE, False)
            If ExistsVarValue(Variablen.BARRECHNUNG_KEINE_ZUSTELLUNG) Then
                BARRECHNUNG_KEINE_ZUSTELLUNG = VarValue_Default(Variablen.BARRECHNUNG_KEINE_ZUSTELLUNG, False)
            End If
            If ExistsVarValue(Variablen.BARRECHNUNG_TOP_ARTIKEL) Then
                BARRECHNUNG_TOP_ARTIKEL = VarValue_Default(Variablen.BARRECHNUNG_TOP_ARTIKEL, True)
            End If
            ButtonOeffneKassa.Enabled = HasRecht(Rechte.Kassenschublade_öffnen)
            ButtonZwischenrechnung.Enabled = HasRecht(Rechte.Zwischenrechnung_erstellen)
            ButtonStornoGeladenerBeleg.Enabled = HasRecht(Rechte.Rechnung_stornieren)
            Main.HideMenu(BARRECHNUNG_RESTAURANT_KASSA_MAIN_MENU_VERSTECKT)

            SetzeSortierung()
            LadeKategorien()
            UpdateVorgangPreview()

            If Not VorgangInfoGeladen Then
                LadeTopArtikel()
            End If

            ButtonPositionEntfernen.Enabled = False
            btnKassaAbschliessen.Enabled = False
            ButtonZahlung.Enabled = False
            SetControlStatus()
            If BARRECHNUNG_RESTAURANT_KASSA_SIMPEL Then
                TableLayoutPanelMenge.Visible = False
                TableLayoutPanelMenge.Width = 0
                TableLayoutPanel1.ColumnStyles(2).Width = 0
            End If
            'Ausscuss 
            ButtonAusschuss1.Visible = HasRecht(Rechte.Administrator)
            ButtonAusschuss2.Visible = HasRecht(Rechte.Administrator)
            ButtonAusschuss3.Visible = HasRecht(Rechte.Administrator)
            ButtonAusschuss4.Visible = HasRecht(Rechte.Administrator)
            ButtonAusschuss5.Visible = HasRecht(Rechte.Administrator)

            'Rabatt 
            TableRabatte.Visible = BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT
            ButtonRabatteListen.Visible = BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT
            ButtonRabatt10.Visible = BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT
            ButtonRabattEuro.Visible = BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT
            ButtonRabattVariabel.Visible = BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT

            ButtonGRATIS.Visible = BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT
            ButtonPreis.Visible = BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT
            ButtonPreisAendern.Visible = BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT

            BestellungenButton.Visible = Not BARRECHNUNG_KEINE_TISCHE
            ButtonAuftragKochen.Visible = Not BARRECHNUNG_KEINE_TISCHE
            cbZustellung.Visible = Not BARRECHNUNG_KEINE_TISCHE

            ButtonEinstellungen2.Visible = HasRecht(Rechte.Administrator)
            ButtonWizzard.Visible = HasRecht(Rechte.Administrator)

            ButtonArtikelNeu.Visible = HasRecht(Rechte.Artikel)

            ButtonDruckMonatsbeleg.Visible = HasRecht(Rechte.Administrator)

            If BARRECHNUNG_KEINE_ZUSTELLUNG Then
                cbZustellung.Visible = Not BARRECHNUNG_KEINE_ZUSTELLUNG

                buttonSplit2.Text = ButtonSplit.Text
                FlowLayoutPanel2.Controls.Remove(cbZustellung)
                FlowLayoutPanel2.Controls.Add(buttonSplit2)

                AddHandler buttonSplit2.Click, AddressOf ButtonSplit_Click
            End If

            ArtikelControl1.Focus()
            InitPaymentControls()
            RemoveHandler ModuleBuchVorgang.PostMsgEvent, AddressOf PostMsg
            AddHandler ModuleBuchVorgang.PostMsgEvent, AddressOf PostMsg

            ResumeLayout()

            Dim fU = New FormUtility
            fU.MakeSplitterCustomizable(SplitContainerLinks, BARRECHNUNG_RESTAURANT_KASSA_SPLITTER_DISTANCE)
            Dim fU2 = New FormUtility
            fU2.MakeSplitterCustomizable(SplitContainerMain, BARRECHNUNG_RESTAURANT_KASSA_SPLITTER_DISTANCE_MAIN)

        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Sub ApplyStyle()

        ModuleStyle.StylePanel(FlowLayoutPanelKategorien)
        ModuleStyle.StylePanel(FlowLayoutPanelArtikel)
        ModuleStyle.StylePanel(TableLayoutPanelMenge)

        ModuleStyle.StylePanel(TableLayoutPanel1)
        ModuleStyle.StylePanel(TableLayoutPanel2)
        ModuleStyle.StylePanel(TableLayoutPanel4)
        ModuleStyle.StylePanel(FlowLayoutPanel1)
        ModuleStyle.StylePanel(FlowLayoutPanel2)
        ModuleStyle.StylePanel(TableLayoutPanel5)

        ModuleStyle.StyleButton(ButtonMengeAendern)
        ModuleStyle.StyleButton(ButtonMinus, changeForeColor:=False)
        ModuleStyle.StyleButton(ButtonPlus, changeForeColor:=False)
        ModuleStyle.StyleButton(ButtonRabatteListen)
        ModuleStyle.StyleButton(ButtonPreisAendern)
        ModuleStyle.StyleButton(ButtonPositionEntfernen, changeForeColor:=False)
        ModuleStyle.StyleButton(ButtonSchliessen)

        ModuleStyle.StyleButton(btnKassaAbschliessen)
        ModuleStyle.StyleButton(ButtonZahlung)
        ModuleStyle.StyleButton(ButtonMehr)
        ModuleStyle.StyleButton(ButtonAuftragKochen)
        ModuleStyle.StyleButton(BestellungenButton)
        ModuleStyle.Style(cbZustellung)
        ModuleStyle.Style(LabelMessages)

        ModuleStyle.StyleButton(Stk2)
        ModuleStyle.StyleButton(Stk3)
        ModuleStyle.StyleButton(Stk4)
        ModuleStyle.StyleButton(Stk5)
        ModuleStyle.StyleButton(Stk6)
        ModuleStyle.StyleButton(Stk7)
        ModuleStyle.StyleButton(Stk8)
        ModuleStyle.StyleButton(Stk9)
        ModuleStyle.StyleButton(Stk10)
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub SetControlStatus()
        Try

            If Not IsNull(Vorgang) Then
                TableAktionenWennVorgangOffen.Enabled = Not Vorgang.Abgeschlossen
                TableRabatte.Enabled = Not Vorgang.Abgeschlossen
                ButtonPositionEntfernen.Enabled = Not Vorgang.Abgeschlossen
                btnKassaAbschliessen.Enabled = Not Vorgang.Abgeschlossen
                ButtonAuftragKochen.Enabled = Not Vorgang.Abgeschlossen
                ButtonPlus.Enabled = Not Vorgang.Abgeschlossen
                ButtonMinus.Enabled = Not Vorgang.Abgeschlossen

                If Vorgang.Abgeschlossen Then
                    Exit Sub
                End If
            End If

            UpdateTotal()

            Dim positionAktionEnabled = IsNumeric(ArtikelNr) And IsNumeric(Stk)
            Dim vorgangOffenUndHatSumme As Boolean = False
            Dim vorgangOffen As Boolean = False
            Try
                If Vorgang IsNot Nothing Then
                    vorgangOffen = Not (Vorgang.Abgeschlossen) And IsNumeric(CleanEur(TextBoxTotal.Text))
                    vorgangOffenUndHatSumme = Vorgang.Abgeschlossen = False And IsNumeric(CleanEur(TextBoxTotal.Text)) And (CleanEur(TextBoxTotal.Text)) <> 0
                End If
            Catch ex As Exception

            End Try

            Dim hatPositionen As Boolean = DataGridViewVorgangPositionen.RowCount >= 1

            ButtonPositionEntfernen.Enabled = hatPositionen
            ButtonRabatteListen.Enabled = hatPositionen
            ButtonMengeAendern.Enabled = hatPositionen
            ButtonPlus.Enabled = hatPositionen
            ButtonMinus.Enabled = hatPositionen
            ButtonPreisAendern.Enabled = hatPositionen

            If IsNumeric(CleanEur(TextBoxTotal.Text)) Then
                If BARRECHNUNG_KEINE_EINGABE_BAR_GEGEBEN Then
                    TextBoxGegebenBar.Text = TextBoxTotal.Text
                    btnKassaAbschliessen.Enabled = vorgangOffen And hatPositionen
                Else
                    btnKassaAbschliessen.Enabled = False
                    If TextBoxGegebenBar.Text <> "" And TextBoxTotal.Text <> "" Then
                        If IsNumeric(CleanEur(TextBoxGegebenBar.Text)) And IsNumeric(CleanEur(TextBoxTotal.Text)) Then
                            btnKassaAbschliessen.Enabled = CDbl(CleanEur(TextBoxGegebenBar.Text)) >= CDbl(CleanEur(TextBoxTotal.Text))
                        End If
                    End If

                End If
            Else
                If Vorgang IsNot Nothing Then
                    btnKassaAbschliessen.Enabled = Vorgang.ZahlungsMethode = "Bankomat"
                End If
            End If
            ButtonZahlung.Enabled = vorgangOffenUndHatSumme
            ButtonAuftragKochen.Enabled = vorgangOffen And hatPositionen
            Try
                If Vorgang IsNot Nothing Then
                    Dim istAuftrag = Vorgang.Typ = VorgangTypen.AU And IsNumeric(TextBoxTotal.Text) And TextBoxTotal.Text > 0
                    ButtonSplit.Enabled = istAuftrag
                Else
                    ButtonSplit.Enabled = False
                End If
            Catch ex As Exception
                ButtonSplit.Enabled = False
            End Try
            buttonSplit2.Enabled = ButtonSplit.Enabled
            ButtonTischVerschieben.Enabled = ButtonSplit.Enabled
            ButtonZwischenrechnung.Enabled = ButtonSplit.Enabled

            'PruefeOffeneBestellungen()

            Dim rechtKassa = HasRecht(MitarbeiterID, Rechte.Kassabuch, False)
            ButtonBerichte.Enabled = rechtKassa
            ButtonKasseMWSTStatistik.Enabled = rechtKassa
            ButtonKasseMWSTStatistikMonat.Enabled = rechtKassa
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="SetControlStatus", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Friend Sub DataGridResetBindings()
        DataGridViewVorgangPositionen.DataSource = Nothing
        DataGridViewVorgangPositionen.DataSource = BuchvorgangartikelBindingSource
    End Sub


    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="LeereKategorienLaden"></param>
    ''' <remarks></remarks>
    Public Sub LadeKategorien(Optional LeereKategorienLaden As Boolean = False)
        If LeereKategorienLaden Then
            Grartikel_kategorienTableAdapter.Fill(DsArtikel._grartikel_kategorien)
        Else 'nur kategorien mit aktiven produkten
            Grartikel_kategorienTableAdapter.FillWithProducts(DsArtikel._grartikel_kategorien)
        End If

        If dndKategorien Is Nothing Then
            dndKategorien = New TouchErfassungDnD(FlowLayoutPanelKategorien, "Kategorien")
        End If

        'add top 
        If BARRECHNUNG_TOP_ARTIKEL Then
            Dim rTop As dsArtikel._grartikel_kategorienRow = DsArtikel._grartikel_kategorien.New_grartikel_kategorienRow
            rTop.ArtKatNr = -1
            rTop.Name = "Top"
            rTop.Stylesheet = Color.GreenYellow.ToArgb
            DsArtikel._grartikel_kategorien.Rows.InsertAt(rTop, 0)
        End If
        'end add 
        FlowLayoutPanelKategorien.Controls.Clear()

        For Each kat As dsArtikel._grartikel_kategorienRow In DsArtikel._grartikel_kategorien.Rows
            Dim btn = New ArtikelButton With {
                .Tag = kat.ArtKatNr,
                .Text = kat.Name,
                .Height = BARRECHNUNG_RESTAURANT_KASSA_BUTTON_HOEHE,
                .Width = BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BREITE,
                .Margin = New Padding(0),
                .Font = New Font("Arial", BARRECHNUNG_RESTAURANT_KASSA_SCHRIFT_GROESSE),
                .BackColor = ModuleStyle.ButtonBackcolor
            }
            Try
                If Not kat.IsStylesheetNull Then
                    If IsNumeric(kat.Stylesheet) Then
                        btn.BackColor = Color.FromArgb(kat.Stylesheet)
                    End If
                End If

                If kat.GetgrartikelRows().Count() > 0 Then
                    btn.ArtikelPreis = "(" & kat.GetgrartikelRows().Count() & ")"
                End If
            Catch ex As Exception
            End Try

            AddHandler btn.Click, AddressOf Kategorien_Clicks
            dndKategorien.AktiviereDnD(btn)
            FlowLayoutPanelKategorien.Controls.Add(btn)
        Next
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Friend Sub Kategorien_Clicks(sender As Object, e As System.EventArgs)
        AktuelleArtKatNr = sender.Tag
        If AktuelleArtKatNr = -1 Then 'top 
            LadeTopArtikel()
        Else
            LadeArtikelFuerKategorie(AktuelleArtKatNr)
        End If
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="artKatNr"></param>
    Public Sub LadeArtikelFuerKategorie(artKatNr As Integer)
        Dim cmd As New MySqlCommand($"select a.Artnr, a.EAN, a.Bezeichnung, a.PreisATS_Brutto, ifnull(a.style, k.Stylesheet) as stylesheet, a.Modifikationen
                                      from grArtikel a, `grArtikel-Kategorien` k  
                                      where a.ArtKatNr = k.ArtKatNr and a.ArtKatNr = @Kategorie
                                      and produktAktiv<>0 order by ArtKatPos, {SORTING_BEZ_AS_NUMBER}, Bezeichnung")
        cmd.Parameters.AddWithValue("Kategorie", artKatNr)
        LadeArtikel(FlowLayoutPanelArtikel, cmd)

        RaiseEvent KategorieGewaehlt(artKatNr)
        zuletztGeladeneArtKatNr = artKatNr
        HighlightKategorie()
    End Sub

    Private Sub HighlightKategorie()
        For Each c In FlowLayoutPanelKategorien.Controls
            If TypeOf (c) Is Button Then
                Dim artkatButton = CType(c, Button)
                If artkatButton.Tag = AktuelleArtKatNr Then
                    ModuleUI.Highlight(artkatButton)
                Else
                    ModuleUI.UnHighlight(artkatButton)
                End If
            End If
        Next
    End Sub

    Private Sub HighlightArtikel()
        For Each c In FlowLayoutPanelArtikel.Controls
            If TypeOf (c) Is Button Then
                Dim artButton = CType(c, Button)
                If artButton.Tag = ArtikelNr Then
                    ModuleUI.Highlight(artButton)
                Else
                    ModuleUI.UnHighlight(artButton)
                End If
            End If
        Next
    End Sub

    Public Sub LadeTopArtikel()
        If Not LadeStartKategorie() Then
            LadeTopArtikelImpl()
        End If
    End Sub

    Public Function LadeStartKategorie() As Boolean
        If ExistsVarValue(BARRECHNUNG_STANDARD_ARTKATNR & "_" & MitarbeiterID) Then
            Dim artkatnr = VarValue(BARRECHNUNG_STANDARD_ARTKATNR & "_" & MitarbeiterID)
            If IsNumeric(artkatnr) Then
                LadeArtikelFuerKategorie(artkatnr)
                Return True
            End If
        End If
        Return False
    End Function

    Private Sub LadeTopArtikelImpl()
        Dim cmd As New MySqlCommand($"select distinct a.Artnr, EAN, a.Bezeichnung, k.Name, a.PreisATS_Brutto, ifnull(a.style, k.Stylesheet) as stylesheet, a.Modifikationen
                                      from grArtikel a, `grArtikel-Kategorien` k, buchVorgang v, `buchVorgang-Artikel` va  
                                      where a.ArtKatNr = k.ArtKatNr 
                                        and a.ArtNR = va.ArtNr 
                                        and v.Nummer = va.Nummer 
                                        and produktAktiv<>0 and v.Datum > date_add(current_timestamp,interval @DAYS day) 
                                      order by k.Name, {SORTING_BEZ_AS_NUMBER}, a.Bezeichnung")
        cmd.Parameters.AddWithValue("DAYS", -3)
        LadeArtikel(FlowLayoutPanelArtikel, cmd)
    End Sub

    ''' <summary>
    ''' Lade Artikel definiert mit cmd 
    ''' </summary>
    ''' <param name="panel"></param>
    ''' <param name="cmd"></param>
    ''' <remarks></remarks>
    Private Sub LadeArtikel(panel As FlowLayoutPanel, cmd As MySqlCommand)

        If BARRECHNUNG_RESTAURANT_KASSA_BUTTON_HOEHE = 0 Or
            BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BREITE = 0 Or
            BARRECHNUNG_RESTAURANT_KASSA_SCHRIFT_GROESSE = 0 Then
            Exit Sub
        End If

        Try
            Dim rdr As DataTable = TryGetFromCache(cmd)

            panel.Controls.Clear()
            If dndArtikel Is Nothing Then
                dndArtikel = New TouchErfassungDnD(FlowLayoutPanelArtikel, "Artikel")
            End If

            Dim cnt = 0
            For Each r In rdr.Rows
                cnt += 1
                If cnt >= 200 Then
                    ShowUserMessage("Es sind mehr als 200 Artikel in dieser Kategorie. Bitte Kategorie aufteilen.", "Kategorie Artikel", MsgBoxStyle.OkOnly, Silent:=True)
                    Return
                End If

                If IsNumeric(r("PreisATS_Brutto")) Then
                    Dim btn = New ArtikelButton With {.Tag = r("ArtNr")}
                    If IsNumeric(r("PreisATS_Brutto")) Then
                        Dim preis = CalculateEinzehlpreis(r("ArtNr"), r("PreisATS_Brutto"), Vorgang)
                        btn.Text = r("Bezeichnung")
                        btn.ArtikelPreis = Format(preis, "c2")
                        Dim modif = r("Modifikationen")
                        If Not IsDBNull(modif) Then
                            Dim modifS = CStr(modif)
                            If modifS.Contains("|") Then
                                btn.Modifikationen = modifS.Split("|").Count & " Modif."
                            End If
                        End If
                    Else
                        btn.Text = r("Bezeichnung")
                    End If
                    If UseEAN() Then
                        btn.ArtikelNummer = r("EAN")
                    End If
                    btn.Height = BARRECHNUNG_RESTAURANT_KASSA_BUTTON_HOEHE
                    btn.Width = BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BREITE
                    btn.Font = New Font("Arial", BARRECHNUNG_RESTAURANT_KASSA_SCHRIFT_GROESSE)
                    btn.Margin = New Padding(0)
                    btn.BackColor = FarbeVonStylesheet(r("Stylesheet"))

                    If BARRECHNUNG_RESTAURANT_KASSA_BUTTON_BILD Then
                        If Not IsDBNull(r("ArtNr")) Then
                            ArtikelBild(r("ArtNr"), btn)
                            btn.BackgroundImageLayout = ImageLayout.Zoom
                        End If
                    End If
                    AddHandler btn.Click, AddressOf Artikel_Click

                    dndArtikel.AktiviereDnD(btn)

                    panel.Controls.Add(btn)
                End If
            Next
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="LadeArtikel", Silent:=True)
        End Try
    End Sub


    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub DataGridViewVorgangPositionen_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewVorgangPositionen.CellContentClick
        Try
            'ArtikelNr wechseln 
            Dim current As dsVorgaenge._buchvorgang_artikelRow = BuchvorgangartikelBindingSource.Current.row
            ArtikelNr = current.ArtNr
            SetControlStatus()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="DataGridViewVorgangPositionen_CellContentClick", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub DataGridViewVorgangPositionen_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewVorgangPositionen.CellClick
        DataGridViewVorgangPositionen_CellContentClick(sender, e)
    End Sub


    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Public Sub Artikel_Click(sender As Object, e As System.EventArgs)
        Try
            Dim btn As Button = CType(sender, Button)
            ArtikelAuswahl(btn.Tag)
            ArtikelControl1.Focus()
            HighlightArtikel()

            If btn.Parent IsNot WeitereArtikel Then
                LadeZusammenVerkaufteArtikel(btn.Tag)
            End If

        Catch ex As Exception
            HandleAppError(ex, Hilfe:="Artikel_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' Barcode Erfassung
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TouchErfassung_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
        Try
            Dim barcodeScannerSendsReturn As Boolean = VarValue_Default(BARCODE_SCANNER_SENDS_RUTURN, "True")
            If Not barcodeScannerSendsReturn Or e.KeyValue = Keys.Enter Then
                'Debug.Print("k:" & e.KeyValue)
                Dim neuerText As String = sender.Text ' + e.KeyChar
                If neuerText.Length >= 2 Then
                    Dim artNrTxt = GetArtNrNachSeriennummer(neuerText)
                    If artNrTxt <> "" Then 'erkannt seriennummer
                        Dim ArtNr = CType(artNrTxt, Integer)
                        'Me.ArtikelComboBox.Text = ArtikelBezeichnung(ArtNr)
                        ArtikelAuswahl(ArtNr)
                    End If
                End If
            End If
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="TouchErfassung_KeyUp", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="ArtNr"></param>
    ''' <remarks></remarks>
    Private Sub ArtikelControl1_ArtNrChanged(ArtNr As Integer) Handles ArtikelControl1.ArtNrChanged
        Try
            ArtikelAuswahl(ArtNr)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ArtikelControl1_ArtNrChanged", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="artNr"></param>
    Private Sub ArtikelAuswahl(artNr As Object)
        ArtikelNr = artNr
        Stk = 1
        'nicht benötigt SetControlStatus()
        ButtonUebernehmen_Click()
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonSchliessen_Click(sender As Object, e As EventArgs) Handles ButtonSchliessen.Click
        Try
            Main.HideMenu(False)
            RaiseEvent FormGeschlossen(Me, Nothing)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonSchliessen_Click", Silent:=True)
        End Try
    End Sub

    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()>
    Protected Overrides Sub Dispose(disposing As Boolean)
        Try
            If bankomat IsNot Nothing Then
                bankomat.Unregister()
            End If

            RemoveHandler ModuleBuchVorgang.PostMsgEvent, AddressOf PostMsg

            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Stk_Click(sender As Object, e As EventArgs) Handles Stk2.Click, Stk3.Click, Stk4.Click, Stk5.Click, Stk6.Click, Stk7.Click, Stk8.Click, Stk9.Click, Stk10.Click
        Try
            Dim btn As Button = CType(sender, Button)
            Stk = btn.Text
            SetControlStatus()
            ButtonUebernehmen_Click()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="Stk_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Stk10Plus_Click(sender As Object, e As EventArgs)
        Try
            Stk = 10 + Stk
            SetControlStatus()
            ButtonUebernehmen_Click()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="Stk10Plus_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' Artikel Erfasst Event
    ''' </summary> 
    ''' <remarks></remarks>
    Private Sub ButtonUebernehmen_Click()
        Try
            Try
                If VarValue_Default(BEEP, True) Then
                    SoundPlayer.SoundPlayBeep()
                End If
            Catch ex As Exception
            End Try
            If ArtikelNr <= 0 Then Exit Sub
            Dim artikelPosition As New ArtikelPosition With {
                .ArtNr = ArtikelNr,
                .Stk = Stk
            }
            If CheckBoxMinus.Checked Then
                artikelPosition.Stk = -1 * artikelPosition.Stk
            End If

            'Start Optionen 
            'Zeige Maske für die Modifikationen
            Dim selectedOptionen = FrageNachOptionenFuer(ArtikelNr)
            If selectedOptionen IsNot Nothing Then
                'Dim artikel = IntraSellContext.Artikeln.Find(ArtikelNr)
                'artikelPosition.Preis_Brutto = artikel.PreisBrutto ' CDec(ArtikelColumn(ArtikelNr, "PreisATS_Brutto"))
                artikelPosition.Preis_Brutto = CDec(ArtikelColumn(ArtikelNr, "PreisATS_Brutto"))
                If selectedOptionen.Count > 0 Then
                    artikelPosition.Spezifikation = String.Join(";", (From o In selectedOptionen Select IIf(o.Menge <> 1, o.Menge & " x ", "") & o.Name & ":" & o.Werte).ToArray())
                    artikelPosition.Preis_Brutto += (From o In selectedOptionen Select o.Menge * o.Preis).Sum()
                End If
            End If
            'Ende Optionen 

            RaiseEvent ArtikelErfasst(artikelPosition)
            If selectedOptionen IsNot Nothing Then
                RaiseEvent ArtikelPreisGeaendert(artikelPosition)
            End If
            'Stk = 1
            'SetControlStatus()
            UpdateVorgangPreview(forceRefresh:=True)
            SelectRow(ArtikelNr)
            SetControlStatus()

        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonUebernehmen_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="ArtNr"></param>
    ''' <returns></returns>
    Private Function FrageNachOptionenFuer(ArtNr As Integer) As List(Of ArtikelOption)
        'Dim artikelModifikationen = IntraSellContext.Artikeln.Find(ArtNr).Modifikationen
        Dim artikelModifikationen = ArtikelColumn(ArtNr, "Modifikationen")
        If IsDBNull(artikelModifikationen) Then
            Return Nothing
        End If

        If Not String.IsNullOrEmpty(artikelModifikationen) Then
            Dim modifikationen = ModuleOptionen.ParseOptionen(artikelModifikationen)
            If modifikationen.Count > 0 Then
                TouchErfassungDnD.DnDDeaktiviert = True
                Dim form = New ArtikelOptionen
                form.ShowModifikationenFuerArtikel(artikelModifikationen)
                Dim fU = New FormUtility
                fU.MakeFormCustomizable(form)
                form.ShowDialog()
                TouchErfassungDnD.DnDDeaktiviert = False
                Return form.GetSelectedOptionen()
            End If
        End If
        Return Nothing
    End Function

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Friend Sub ButtonPositionEntfernen_Click(sender As Object, e As EventArgs) Handles ButtonPositionEntfernen.Click
        Try
            If Vorgang.Abgeschlossen Then
                Exit Sub
            End If
            If Not DataGridViewVorgangPositionen.SelectedRows.Count = 1 Then
                Exit Sub
            End If
            Dim selektiertePos = GetMarkiertePosition()
            Dim ea As New ArtikelPosition With {
                .ID = selektiertePos.ID,
                .ArtNr = selektiertePos.ArtNr,
                .Stk = selektiertePos.Stk
            }
            RaiseEvent ArtikelEntfernt(ea)
            Stk = 0
            SetControlStatus()
            ButtonPositionEntfernen.Enabled = False
            UpdateVorgangPreview(forceRefresh:=True)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonPositionEntfernen_Click", Silent:=True)
        End Try
    End Sub

    Friend Sub btnKassaAbschliessen_Click(sender As Object, e As EventArgs) Handles btnKassaAbschliessen.Click
        PerformKassaAbschliessen()
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub PerformKassaAbschliessen()
        If TextBoxGegebenBar.Text = "" Then
            MsgBox(Messages.TouchErfassung_GegebenBar_fehlt, vbAbort)
            Exit Sub
        End If
        If Vorgang.Abgeschlossen Then
            Exit Sub
        End If
        Try
            If VarValue_Default(BEEP, True) Then
                SoundPlayer.SoundPlay(1, 200, SetVolumeUp:=False)
            End If
        Catch ex As Exception
        End Try
        btnKassaAbschliessen.Enabled = False
        Vorgang.ZahlungsMethode = "Bar"
        Vorgang.GegebenBar = CDec(TextBoxGegebenBar.Text)
        Vorgang.Resto = CDec(TextBoxGegebenBar.Text) - CDec(TextBoxTotal.Text)
        RaiseEvent KassaAbschliessen(Vorgang)
    End Sub



    ''' <summary>
    ''' DataGrid mit Artikelpositionen aktualisieren
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub UpdateVorgangPreview(Optional forceRefresh As Boolean = False)
        Try
            'unnötige Updates vermeiden
            If Not forceRefresh Then
                Dim diff = Now - UpdateVorgangPreviewAufgerufenAm
                If diff.Seconds < 1 Then
                    Exit Sub
                End If
            End If
            UpdateVorgangPreviewAufgerufenAm = Now

            'update preview
            If Not IsNull(Vorgang) Then

                Dim selRowIndex = -1
                If DataGridViewVorgangPositionen.SelectedRows.Count = 1 Then
                    selRowIndex = DataGridViewVorgangPositionen.SelectedRows(0).Index
                End If

                TextBoxGegebenBar.Text = ""
                TextBoxTotal.Text = ""
                DsVorgaenge._buchvorgang_artikel.Clear()
                DsVorgaenge.buchvorgang.Clear()
                BuchvorgangTableAdapter.FillByNummer(DsVorgaenge.buchvorgang, Vorgang.Typ, Vorgang.Nummer)
                Buchvorgang_artikelTableAdapter.FillByNummer(DsVorgaenge._buchvorgang_artikel, Vorgang.Typ, Vorgang.Nummer)

                BuchvorgangartikelBindingSource.ResetBindings(False)
                DataGridViewVorgangPositionen.DataSource = Nothing
                DataGridViewVorgangPositionen.DataSource = BuchvorgangartikelBindingSource
                If selRowIndex >= 0 And DataGridViewVorgangPositionen.Rows.Count > selRowIndex Then
                    DataGridViewVorgangPositionen.Rows(selRowIndex).Selected = True
                End If
                'Wenn Nur eine Position gleich auswählen
                If selRowIndex = -1 And DataGridViewVorgangPositionen.Rows.Count > 0 Then
                    DataGridViewVorgangPositionen.Rows(0).Selected = True
                    ArtikelNr = BuchvorgangartikelBindingSource.Current.row.ArtNr
                End If

            End If
            SetControlStatus()

        Catch ex As Exception
            HandleAppError(ex, Hilfe:="UpdateVorgangPreview", Silent:=True)
        End Try
    End Sub

    Public Sub SelectRow(artNr)
        Try
            For Each r As DataGridViewRow In DataGridViewVorgangPositionen.Rows
                Dim artRow As dsVorgaenge._buchvorgang_artikelRow = r.DataBoundItem.Row
                If artRow.ArtNr = artNr Then
                    r.Selected = True
                End If
            Next
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="SelectRow", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' Position Stk*Preis und Farbe aktualisieren
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub DataGridViewVorgangPositionen_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridViewVorgangPositionen.CellFormatting
        Try
            If e.ColumnIndex = 3 Then

                Dim r = DataGridViewVorgangPositionen.Rows(e.RowIndex)

                Dim brutto = r.Cells(0).Value * r.Cells(2).Value
                e.Value = FormatCurrency(brutto, 2)

                Dim artnr = r.Cells(4).Value
                If IsNumeric(artnr) Then
                    r.Cells(0).Style.BackColor = ArtikelFarbe(artnr) 'farbe setzen 
                End If

            End If

            If e.ColumnIndex = 1 Then
                'Spezifikationen
                Dim r = DataGridViewVorgangPositionen.Rows(e.RowIndex)
                If Not r.DataBoundItem Is Nothing Then
                    Dim pos As dsVorgaenge._buchvorgang_artikelRow = r.DataBoundItem.Row
                    If Not pos.IsSpezifikationNull Then
                        Dim spezifikation As String = pos.Spezifikation 'r.Cells(6).Value
                        Dim bezeichnung As String = pos.Bezeichnung
                        If Not String.IsNullOrEmpty(spezifikation) Then
                            If Len(spezifikation) > 3 Then
                                Dim anzSpez = spezifikation.Split(";").Count
                                r.Height = 24 + 24 * anzSpez 'Doppelte Höhe 
                                DataGridViewVorgangPositionen.Columns(1).DefaultCellStyle.WrapMode = DataGridViewTriState.True
                                e.Value = bezeichnung + vbNewLine + spezifikation.Replace(";", vbNewLine)
                            End If
                        End If
                    End If
                End If
            End If
            UpdateTotal()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="DataGridViewVorgangPositionen_CellFormatting", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' Summe aktualisieren
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub UpdateTotal()
        Try
            'update total
            Dim total As Decimal = 0
            For Each rr In DataGridViewVorgangPositionen.Rows
                total += rr.Cells(0).Value * rr.Cells(2).Value
            Next
            TextBoxTotal.Text = FormatCurrency(total, 2)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="UpdateTotal", Silent:=True)
        End Try
    End Sub

#Region "Checkout"
    Private ziffernblock As Ziffernblock = Nothing
    Private bankomat As Bankomat = Nothing
    Private FlowLayoutSonstigeZahlungsMethoden As New FlowLayoutPanel

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub InitPaymentControls()
        'ziffernblock.Dock = DockStyle.Fill
        ziffernblock = New Ziffernblock With {
            .Width = 180,
            .Height = 180
        }
        AddHandler ziffernblock.AmountChanging, AddressOf ziffernblock_AmountChanging
        AddHandler ziffernblock.AmountChanged, AddressOf ziffernblock_AmountChanged

        bankomat = New Bankomat With {.Width = 180, .Height = 180}
        AddHandler bankomat.BezahltMitBankomat, AddressOf bankomat_BezahltMitBankomat

        'Sonstige Zahlungsmethoden 
        FlowLayoutSonstigeZahlungsMethoden.Width = 180 'FlowLayoutPanelArtikel.Width - 10
        FlowLayoutSonstigeZahlungsMethoden.Height = 60
        Dim sonstigeZM = OpenRecordsetInMemory("select Methode from grZahlungsmethode where Methode <>'Bankomat' and AktivInKasse<>0 order by Methode")
        For Each r In sonstigeZM.Rows
            Dim b = New Button With {
                .Text = r("Methode"),
                .Tag = r("Methode"),
                .Width = 174,
                .Height = 60
            }
            AddHandler b.Click, AddressOf sonstigeZahlungsMethode_Click
            'sonstigeZahlungsmethoden.Add(b)
            FlowLayoutSonstigeZahlungsMethoden.Height += 60
            FlowLayoutSonstigeZahlungsMethoden.Controls.Add(b)
        Next
        sonstigeZM = Nothing
    End Sub

    ''' <summary>
    ''' Keypad für Bankomat
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TextBoxGegebenBar_Click(sender As Object, e As EventArgs) Handles TextBoxGegebenBar.Click
        Try
            If BuchvorgangBindingSource.Current Is Nothing Then
                Exit Sub
            End If

            FlowLayoutPanelArtikel.Controls.Clear()

            'Bar
            FlowLayoutPanelArtikel.Controls.Add(ziffernblock)
            'Bankomat 
            FlowLayoutPanelArtikel.Controls.Add(bankomat)
            'Sonstige Zahlungsmethoden 
            FlowLayoutPanelArtikel.Controls.Add(FlowLayoutSonstigeZahlungsMethoden)

            Dim vorgang As dsVorgaenge.buchvorgangRow = BuchvorgangBindingSource.Current.row
            bankomat.Amount = vorgang.SummeBrutto
            bankomat.Load()

        Catch ex As Exception
            HandleAppError(ex, Hilfe:="TextBoxGegebenBar_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TextBoxGegebenBar_TextChanged(sender As Object, e As EventArgs) Handles TextBoxGegebenBar.TextChanged
        Try
            'Restgeld berechnen 
            If BuchvorgangBindingSource.Current Is Nothing Then
                Exit Sub
            End If
            Dim vorgang As dsVorgaenge.buchvorgangRow = BuchvorgangBindingSource.Current.row
            If Not (vorgang.IsSummeBruttoNull) Then
                Dim gegebenBar = Replace(TextBoxGegebenBar.Text, "€", "")

                If IsNumeric(gegebenBar) Then
                    If gegebenBar.Contains(",") And gegebenBar.Contains(".") Then
                        gegebenBar = gegebenBar.Replace(".", "") 'Dezimal Separator
                    End If

                    Dim restgeld = Decimal.Parse(gegebenBar) - vorgang.SummeBrutto
                    LabelRestgeld.Text = FormatCurrency(restgeld, 2)
                End If
            End If
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="TextBoxGegebenBar_TextChanged", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="amount"></param>
    ''' <remarks></remarks>
    Private Sub ziffernblock_AmountChanging(amount)
        Try
            If TextBoxTotal.Text = "" Then
                Exit Sub
            End If

            If IsNumeric(amount) Then
                TextBoxGegebenBar.Text = FormatCurrency(amount, 2)
                Dim a As Decimal = TextBoxGegebenBar.Text
                Dim b As Decimal = TextBoxTotal.Text
                btnKassaAbschliessen.Enabled = a >= b
            Else
                TextBoxGegebenBar.Text = ""
                btnKassaAbschliessen.Enabled = False
            End If
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ziffernblock_AmountChanging", Silent:=True)
        End Try
    End Sub

    Friend Sub ziffernblock_AmountChanged(amount)
        ziffernblock_AmountChanging(amount)
        If IsNumeric(amount) Then
            If btnKassaAbschliessen.Enabled Then
                PerformKassaAbschliessen()
            End If
        End If
    End Sub

    Friend Sub bankomat_BezahltMitBankomat()
        Try
            TextBoxGegebenBar.Text = TextBoxTotal.Text
            Vorgang.ZahlungsMethode = "Bankomat"
            SetControlStatus()
            RaiseEvent BezahltMitBankomat()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="bankomat_BezahltMitBankomat")
        End Try
    End Sub

    Private Sub sonstigeZahlungsMethode_Click(sender As Object, e As EventArgs)
        Try
            Dim methode = CType(sender, Button).Tag
            TextBoxGegebenBar.Text = TextBoxTotal.Text
            Vorgang.ZahlungsMethode = methode
            SetControlStatus()
            RaiseEvent BezahltMitZahlungsmethode(methode)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="sonstigeZahlungsMethode_Click")
        End Try
    End Sub

#End Region

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub CheckBoxMinus_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBoxMinus.CheckedChanged
        If CheckBoxMinus.Checked Then
            CheckBoxMinus.ForeColor = Color.Red
        Else
            CheckBoxMinus.ForeColor = Color.Maroon
        End If
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonMehr_Click(sender As Object, e As EventArgs) Handles ButtonMehr.Click
        Mehr()
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonAusschuss1_Click(sender As Object, e As EventArgs) Handles ButtonAusschuss1.Click, ButtonAusschuss2.Click, ButtonAusschuss3.Click,
        ButtonAusschuss4.Click, ButtonAusschuss5.Click
        Try
            Dim btnGrund As Button = CType(sender, Button)
            WriteLog($"Starte Ausschuss vom Typ {btnGrund.Text}")
            RaiseEvent Ausschuss(btnGrund.Text)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonAusschuss1_Click")
        End Try
    End Sub

    ''' <summary>
    ''' do not delete !!!
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub DataGridViewVorgangPositionen_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles DataGridViewVorgangPositionen.DataError

    End Sub

    ''' <summary>
    ''' Position löschen
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub DataGridViewVorgangPositionen_CellMouseDoubleClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridViewVorgangPositionen.CellMouseDoubleClick
        ButtonPositionEntfernen_Click(Nothing, Nothing)
    End Sub

    Sub VorgangInfo(content As String)
        Try
            VorgangInfoGeladen = True
            FlowLayoutPanelArtikel.Controls.Clear()
            'vorgangInfo.Dock = DockStyle.Fill
            Dim vorgangInfo As New Label With {
                .AutoSize = True,
                .Text = SaubernFuerUI(content),
                .BackColor = Color.White,
                .ForeColor = Color.Black
            }
            FlowLayoutPanelArtikel.Controls.Add(vorgangInfo)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="VorgangInfo", Silent:=True)
        End Try
    End Sub

    Private Sub ButtonDruckLetzter_Click(sender As Object, e As EventArgs)
        RaiseEvent DruckLetzterBeleg(sender, e)
    End Sub

    Private Sub ButtonEinstellungen_Click(sender As Object, e As EventArgs) Handles ButtonEinstellungen2.Click
        Try
            Einstellungen.ShowDialog()
            TouchErfassung_Load(Nothing, Nothing)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonEinstellungen_Click", Silent:=True)
        End Try
    End Sub

    Private Sub BestellungenButton_Click(sender As Object, e As EventArgs) Handles BestellungenButton.Click
        Try
            'RaiseEvent FormGeschlossen(Me, Nothing)
            TouchBestellung.MdiParent = Main
            TouchBestellung.Show()
            TouchBestellung.WindowState = FormWindowState.Maximized
            TouchBestellung.DatenAktualisieren()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="BestellungenButton_Click", Silent:=True)
        End Try
    End Sub

    Private Sub cbZustellung_CheckedChanged(sender As Object, e As EventArgs) Handles cbZustellung.CheckStateChanged
        If Vorgang Is Nothing Then Exit Sub
        If cbZustellung.CheckState = CheckState.Checked Then
            Vorgang.LieferMethode = Transportmethoden.Zustellung
        ElseIf cbZustellung.CheckState = CheckState.Unchecked Then
            Vorgang.LieferMethode = Transportmethoden.Abholung
        Else
            Vorgang.LieferMethode = Transportmethoden.Nicht_definiert
        End If

        RaiseEvent Zustellung(Vorgang.LieferMethode)
        If cbZustellung.CheckState = CheckState.Checked Then
            ShowKundenanlage()
        Else
            'Preise aktualisieren
            LadeArtikelFuerKategorie(AktuelleArtKatNr)
        End If
    End Sub

    Friend Sub ButtonAuftragKochen_Click(sender As Object, e As EventArgs) Handles ButtonAuftragKochen.Click
        RaiseEvent AuftragKueche(Vorgang, "ALLE")
    End Sub

    Private Sub ButtonKueche_Click(sender As Object, e As EventArgs)
        RaiseEvent AuftragKueche(Vorgang, "KUECHE")
    End Sub

    Private Sub ButtonPizza_Click(sender As Object, e As EventArgs)
        RaiseEvent AuftragKueche(Vorgang, "PIZZA")
    End Sub

    Private Sub ButtonBar_Click(sender As Object, e As EventArgs)
        RaiseEvent AuftragKueche(Vorgang, "BAR")
    End Sub

    Private Sub TimerUpdateUI_Tick(sender As Object, e As EventArgs) Handles TimerUpdateUI.Tick
        PruefeOffeneBestellungen()
    End Sub

    Private Sub PruefeOffeneBestellungen()
        'Offene Bestellungen prüfen 
        Try
            Dim cmd = New MySqlCommand($"select count(*) from buchVorgang 
                                         where Typ='AU' and Datum > date_add(CURRENT_TIMESTAMP, INTERVAL - 1  DAY ) 
                                         and abgeschlossen=0 and KundNr>1 and Summe>0")
            Dim cntOffeneBestellungen As Integer = FirstRow(cmd)
            If cntOffeneBestellungen > 0 Then
                BestellungenButton.Text = cntOffeneBestellungen & " Offene B..."
                BestellungenButton.ForeColor = Color.Lime
            Else
                BestellungenButton.Text = "&Offene B..."
                BestellungenButton.ForeColor = ModuleStyle.ForeColor
            End If
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="PruefeOffeneBestellungen", Silent:=True)
        End Try
    End Sub

    Friend Sub ButtonSTORNO_Click(sender As Object, e As EventArgs)
        RaiseEvent Storno(Nothing, silent:=False)
    End Sub

    Friend Sub ButtonSTORNO_Click_Test(sender As Object, e As EventArgs)
        RaiseEvent Storno(Nothing, silent:=True)
    End Sub

    Private Sub ButtonStornoGeladenerBeleg_Click(sender As Object, e As EventArgs) Handles ButtonStornoGeladenerBeleg.Click
        WriteLog($"Starte Storno für {Vorgang.ToString}")
        RaiseEvent Storno(_vorgang, silent:=False)
    End Sub

#Region "Rabatt"

    Private Sub ButtonRabattVariabel_Click(sender As Object, e As EventArgs) Handles ButtonRabattVariabel.Click
        If ExistsVarValue(RABATT_VARIABEL) Then
            ziffernblock_AmountChanged_rabatt(VarValue(RABATT_VARIABEL))
        Else
            Dim response = InputBox(Messages.TouchErfassung_Rabatt_Einstellen, , "15")
            If IsNumeric(response) Then
                SetVarValue(RABATT_VARIABEL, response)
            End If
        End If
    End Sub

    Friend Sub ButtonRabatt_Click(sender As Object, e As EventArgs) Handles ButtonRabatt.Click
        Try
            FlowLayoutPanelArtikel.Controls.Clear()
            Dim ziffernblock As New Ziffernblock With {
                .Width = 250,
                .Height = 250
            }
            Dim l = New Label With {
                .Text = Messages.TouchErfassung_Rabatt_Eingeben
            }
            Dim checkBoxGesamtRabatt = New CheckBox With {
            .Text = "Gesamtrabatt",
            .Checked = False
            } : l.Width = FlowLayoutPanelArtikel.Width
            checkBoxGesamtRabatt.Width = FlowLayoutPanelArtikel.Width
            FlowLayoutPanelArtikel.Controls.Add(l)
            FlowLayoutPanelArtikel.Controls.Add(checkBoxGesamtRabatt)
            FlowLayoutPanelArtikel.Controls.Add(ziffernblock)
            ziffernblock.Select0()
            AddHandler checkBoxGesamtRabatt.CheckedChanged, AddressOf checkBoxGesamtRabatt_CheckedChanged
            AddHandler ziffernblock.AmountChanged, AddressOf ziffernblock_AmountChanged_rabatt
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonRabatt_Click")
        End Try
    End Sub

    Function GetMarkiertePosition() As dsVorgaenge._buchvorgang_artikelRow
        If Not DataGridViewVorgangPositionen.SelectedRows.Count = 1 Then
            Return Nothing
        End If
        Dim selectedRow = DataGridViewVorgangPositionen.SelectedRows(0)

        Dim artRow As dsVorgaenge._buchvorgang_artikelRow = selectedRow.DataBoundItem.Row
        Return artRow

        ' If BuchvorgangartikelBindingSource.Current Is Nothing Then
        'Return Nothing
        'End If
        'Return BuchvorgangartikelBindingSource.Current.row
    End Function


    ''' <summary>
    ''' Rabatt in Fixen Betrag
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonRabattEuro_Click(sender As Object, e As EventArgs) Handles ButtonRabattEuro.Click
        Try
            FlowLayoutPanelArtikel.Controls.Clear()
            Dim ziffernblock As New Ziffernblock With {
                .Width = 250,
                .Height = 250
            }
            Dim l = New Label With {
                .Text = "Bitte Rabatt für die Position in Euro eingeben:"
            } : FlowLayoutPanelArtikel.Controls.Add(l)
            FlowLayoutPanelArtikel.Controls.Add(ziffernblock)
            AddHandler ziffernblock.AmountChanged, AddressOf ziffernblock_AmountChanged_rabattEuro
            ziffernblock.Select0()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonRabattEuro_Click")
        End Try
    End Sub

    Friend GesamtRabattAktiv As Boolean = False

    Private Sub checkBoxGesamtRabatt_CheckedChanged(sender As Object, e As EventArgs)
        GesamtRabattAktiv = CType(sender, CheckBox).Checked
    End Sub

    Friend Sub ziffernblock_AmountChanged_rabatt(rabatt As Decimal)
        If BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT Then
            If rabatt > 0 And rabatt <= 100 Then
                Dim ok As Boolean

                If GesamtRabattAktiv Then

                    If silent Then
                        ok = True
                    Else
                        ok = MsgBox("Rabatt von " & rabatt & " % für die gesamte Rechnung geben?", vbYesNo) = vbYes
                    End If
                    If ok Then
                        RaiseEvent RechnungRabatt(Vorgang, rabatt)
                        UpdateVorgangPreview(forceRefresh:=True)
                        LadeArtikelFuerKategorie(zuletztGeladeneArtKatNr)
                    End If
                Else
                    If silent Then
                        ok = True
                    Else
                        If GetMarkiertePosition() Is Nothing Then
                            MsgBox("Eine Position zuerst markieren!")
                            Exit Sub
                        End If
                        Dim artText = GetMarkiertePosition().Bezeichnung
                        ok = MsgBox("Rabatt von " & rabatt & " % für Artikel '" & artText & "' geben?", vbYesNo) = vbYes
                    End If

                    If ok Then
                        If GetMarkiertePosition() Is Nothing Then Exit Sub
                        Dim artikelPosition As New ArtikelPosition With {
                            .ID = GetMarkiertePosition().ID,
                            .ArtNr = GetMarkiertePosition().ArtNr,
                            .Stk = Stk,
                            .Rabatt = rabatt
                        }
                        RaiseEvent ArtikelRabatt(artikelPosition)
                        UpdateVorgangPreview(forceRefresh:=True)
                        LadeArtikelFuerKategorie(zuletztGeladeneArtKatNr)
                    End If
                End If

            End If
        Else
            MsgBox("Sie haben keine Berechtigung um einen Rabatt zu geben!", vbOKOnly)
        End If
    End Sub

    Private Sub ziffernblock_AmountChanged_rabattEuro(rabatt As Decimal)
        If BARRECHNUNG_RESTAURANT_KASSA_RABATT_ERLAUBT Then
            If rabatt > 0 Then
                If GetMarkiertePosition() Is Nothing Then
                    MsgBox("Eine Position zuerst markieren!")
                    Exit Sub
                End If
                Dim artText = GetMarkiertePosition().Bezeichnung

                If MsgBox("Rabatt von " & rabatt & " € für Artikel '" & artText & "' geben?", vbYesNo) = vbYes Then
                    If GetMarkiertePosition() Is Nothing Then Exit Sub
                    Dim artikelPosition As New ArtikelPosition With {
                        .ID = GetMarkiertePosition().ID,
                        .ArtNr = GetMarkiertePosition().ArtNr,
                        .Stk = Stk,
                        .RabattEuro = rabatt
                    }
                    RaiseEvent ArtikelRabatt(artikelPosition)
                    UpdateVorgangPreview()
                    LadeArtikelFuerKategorie(zuletztGeladeneArtKatNr)
                End If
            End If
        Else
            MsgBox("Sie haben keine Berechtigung um einen Rabatt zu geben!", vbOKOnly)
        End If
    End Sub

    Private Sub ButtonRabatt10_Click(sender As Object, e As EventArgs) Handles ButtonRabatt10.Click
        ziffernblock_AmountChanged_rabatt(10)
    End Sub

    Private Sub ButtonRabatt20_Click(sender As Object, e As EventArgs)
        ziffernblock_AmountChanged_rabatt(20)
    End Sub

    Private Sub ButtonRabatt50_Click(sender As Object, e As EventArgs)
        ziffernblock_AmountChanged_rabatt(50)
    End Sub

    Private Sub ButtonGRATIS_Click(sender As Object, e As EventArgs) Handles ButtonGRATIS.Click
        ziffernblock_AmountChanged_rabatt(100)
    End Sub

    Private Sub ButtonRabatt3Euro_Click(sender As Object, e As EventArgs)
        ziffernblock_AmountChanged_rabattEuro(3)
    End Sub

    Private Sub ButtonRabatt7Euro_Click(sender As Object, e As EventArgs)
        ziffernblock_AmountChanged_rabattEuro(7)
    End Sub
#End Region

#Region "Vorgang Aktionen"
    Private Sub ButtonAktionen_Click(sender As Object, e As EventArgs) Handles ButtonAktionen.Click
        Try
            Dim ucAktionen As New VorgangAktionen With {
                .Vorgang = Vorgang
            }
            FlowLayoutPanelArtikel.Controls.Clear()
            FlowLayoutPanelArtikel.Controls.Add(ucAktionen)
            ucAktionen.Width = FlowLayoutPanelArtikel.Width - 10
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonAktionen_Click", Silent:=True)
        End Try
    End Sub

#End Region

    Private Sub ButtonZwischenrechnung_Click(sender As Object, e As EventArgs) Handles ButtonZwischenrechnung.Click
        WriteLog($"Starte Zwischenrechnung für {Vorgang.ToString}")
        RaiseEvent RechnungVorschauDruck(Vorgang)
    End Sub

#Region "Split"
    Private Sub ButtonSplit_Click(sender As Object, e As EventArgs) Handles ButtonSplit.Click
        Split(verschieben:=False)
    End Sub

    Private Sub ButtonTischVerschieben_Click(sender As Object, e As EventArgs) Handles ButtonTischVerschieben.Click
        Split(verschieben:=True)
    End Sub

    Sub Split(verschieben As Boolean)
        Try
            If verschieben Then
                WriteLog($"Starte Verschieben für {Vorgang.ToString}")
            Else
                WriteLog($"Starte Split für {Vorgang.ToString}")
            End If

            VorgangSplitForm.StartSplit(Vorgang, verschieben:=verschieben)
            VorgangSplitForm.ShowDialog()
            Dim VorgangSplit = VorgangSplitForm.VorgangSplit1.VorgangSplit

            Dim checkVogang = LadeVorgang(Vorgang.Typ, Vorgang.Nummer)
            If checkVogang Is Nothing Then
                RaiseEvent FormGeschlossen(Me, Nothing)
            End If
            UpdateVorgangPreview()
            'End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
#End Region

    Dim kundenanlage As TouchKundeAnlegen = Nothing

    Private Sub ShowKundenanlage()
        Try
            If kundenanlage Is Nothing Then
                kundenanlage = New TouchKundeAnlegen
                AddHandler kundenanlage.Order, AddressOf kundenanlage_IDNRChanged
            End If

            FlowLayoutPanelArtikel.Controls.Clear()
            FlowLayoutPanelArtikel.Controls.Add(kundenanlage)
            kundenanlage.Width = FlowLayoutPanelArtikel.Width - 10
            kundenanlage.ShowIDNR(Vorgang.KundNr, Vorgang.Notiz)

        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ShowKundenanlage", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="idnr"></param>
    ''' <param name="notiz"></param>
    ''' <param name="liefermethode"></param>
    ''' <remarks></remarks>
    Private Sub kundenanlage_IDNRChanged(IDNR As Integer, Notiz As String, LieferMethode As String, typ As String)
        Try
            Vorgang.KundNr = IDNR
            Vorgang.Notiz = Notiz
            Vorgang.LieferMethode = LieferMethode
            RaiseEvent KundeGeaendert(IDNR, Notiz, LieferMethode)
            If kundenanlage IsNot Nothing Then
                kundenanlage.Enabled = False
            End If
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="kundenanlage_IDNRChanged", Silent:=True)
        End Try
    End Sub

    Private Sub ButtonBerichte_Click(sender As Object, e As EventArgs) Handles ButtonBerichte.Click
        Try
            Berichte.Show()
            Berichte.BringToFront()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonKassa_Click", Silent:=True)
        End Try
    End Sub

    Private Sub ButtonKassaMonat_Click(sender As Object, e As EventArgs)
        Try
            KassaListe.MdiParent = Main
            KassaListe.Show()
            KassaListe.MonatsReport()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonKassaMonat_Click", Silent:=True)
        End Try
    End Sub

    Private Sub ButtonKasseMWSTStatistik_Click(sender As Object, e As EventArgs) Handles ButtonKasseMWSTStatistik.Click
        Try
            WriteLog($"Starte Tagesbericht")
            VorgangStat.MdiParent = Main
            VorgangStat.Show()
            VorgangStat.MWSTStatistik()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonKasseMWSTStatistik_Click", Silent:=True)
        End Try
    End Sub

    Private Sub ButtonKasseMWSTStatistikMonat_Click(sender As Object, e As EventArgs) Handles ButtonKasseMWSTStatistikMonat.Click
        Try
            WriteLog($"Starte Monatsbericht")
            VorgangStat.MdiParent = Main
            VorgangStat.Show()
            VorgangStat.MWSTStatistikMonat()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonKasseMWSTStatistikMonat_Click", Silent:=True)
        End Try
    End Sub

    Private Sub ButtonArtikelNeu_Click(sender As Object, e As EventArgs) Handles ButtonArtikelNeu.Click
        Try
            'ArtikelQuick2.MdiParent = Main
            ArtikelQuick2.ShowDialog()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonArtikelNeu_Click", Silent:=True)
        End Try
    End Sub

    Private Sub ButtonKueche1_Click(sender As Object, e As EventArgs)
        ButtonKueche_Click(sender, e)
    End Sub

    Private Sub ButtonPizza1_Click(sender As Object, e As EventArgs)
        ButtonPizza_Click(sender, e)
    End Sub

    Private Sub ButtonBar1_Click(sender As Object, e As EventArgs)
        ButtonBar_Click(sender, e)
    End Sub

    Private Sub ButtonDruckLetzter1_Click(sender As Object, e As EventArgs) Handles ButtonDruckLetzter1.Click
        ButtonDruckLetzter_Click(sender, e)
    End Sub

    Friend Sub ButtonZahlung_Click(sender As Object, e As EventArgs) Handles ButtonZahlung.Click
        TextBoxGegebenBar_Click(sender, e)
    End Sub

    Private Sub ButtonDruckMonatsbeleg_Click(sender As Object, e As EventArgs) Handles ButtonDruckMonatsbeleg.Click
        WriteLog($"Starte Print Null Beleg")
        RaiseEvent DruckMonatsBeleg()
    End Sub

#Region "Menge"
    Private ziffernblockMenge As Ziffernblock = Nothing
    Private elicomWaage As IntraSell_Net_CustomerDisplay.UserControlElicomScale = Nothing

    Friend Sub ButtonMengeAendern_Click(sender As Object, e As EventArgs) Handles ButtonMengeAendern.Click
        Try
            If ziffernblockMenge Is Nothing Then
                ziffernblockMenge = New Ziffernblock With {.Width = 250, .Height = 250}
                AddHandler ziffernblockMenge.AmountChanged, AddressOf ziffernblockMenge_AmountChanged
            End If

            If BuchvorgangBindingSource.Current Is Nothing Then
                Exit Sub
            End If

            FlowLayoutPanelArtikel.Controls.Clear()
            FlowLayoutPanelArtikel.Controls.Add(ziffernblockMenge)
            ziffernblockMenge.Select0()

            'Elicom Waage 
            If elicomWaage Is Nothing Then
                elicomWaage = New IntraSell_Net_CustomerDisplay.UserControlElicomScale With {.Width = 300, .Height = 150}
                AddHandler elicomWaage.WeightReadEvent, AddressOf ziffernblockMenge_AmountChangedElicom
            End If
            FlowLayoutPanelArtikel.Controls.Add(elicomWaage)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonMengeAendern_Click", Silent:=True)
        End Try
    End Sub

    Private Sub ziffernblockMenge_AmountChangedElicom(amount As Decimal)
        ziffernblockMenge_AmountChanged(amount * VarValue_Default(ELICOM_GEWICHT_MULTIPLICATOR, 10))
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="amount"></param>
    ''' <remarks></remarks>
    Private Sub ziffernblockMenge_AmountChanged(amount As Decimal)
        Try
            If IstAbgewogen(amount) And VarValue_Default(BARRECHNUNG_POSITIONEN_GRUPPIEREN, "true") Then
                SetVarValue(BARRECHNUNG_POSITIONEN_GRUPPIEREN, "false")
            End If

            Dim selektiertePos = GetMarkiertePosition()

            If selektiertePos Is Nothing Then Exit Sub
            If ArtikelNr <= 0 Then Exit Sub

            Dim artikelPosition As New ArtikelPosition With {
                .ID = selektiertePos.ID,
                .ArtNr = selektiertePos.ArtNr,
                .Stk = selektiertePos.Stk
            }

            Dim neueMenge = amount
            RaiseEvent ArtikelEntfernt(artikelPosition)

            artikelPosition.Stk = neueMenge
            RaiseEvent ArtikelErfasst(artikelPosition)

            Stk = neueMenge
            SetControlStatus()
            UpdateVorgangPreview()
            SetControlStatus()
            LadeArtikelFuerKategorie(zuletztGeladeneArtKatNr)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ziffernblockMenge_AmountChanged", Silent:=True)
        End Try
    End Sub

    Private Function IstAbgewogen(amount As Decimal) As Boolean
        Return amount <> CInt(amount)
    End Function

#End Region

#Region "Parken"
    Private Sub ButtonRechnungParken_Click(sender As Object, e As EventArgs) Handles ButtonRechnungParken.Click
        If Not IsNull(Vorgang) Then
            WriteLog($"Starte Rechnung Parken für {Vorgang.ToString}")
            RaiseEvent VorgangParken(Vorgang)
            OffeneBestellungenListe()
        End If
    End Sub

    Private Sub ButtonGeparkteListe_Click(sender As Object, e As EventArgs) Handles ButtonGeparkteListe.Click
        OffeneBestellungenListe()
    End Sub
#End Region

    Private Sub ButtonRabatteListen_Click(sender As Object, e As EventArgs) Handles ButtonRabatteListen.Click
        Rabatte()
    End Sub

    Private Sub Rabatte()
        Try
            If Not TableAktionenWennVorgangOffen.Visible Then
                FlowLayoutPanelArtikel.Controls.Clear()
                TableRabatte.Width = FlowLayoutPanelArtikel.Width - 10
                FlowLayoutPanelArtikel.Controls.Add(TableRabatte)
            End If
            TableAktionenWennVorgangOffen.Visible = Not TableAktionenWennVorgangOffen.Visible
            TableFunktionen.Visible = Not TableFunktionen.Visible
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="Rabatte", Silent:=True)
        End Try
    End Sub

    Private Sub Mehr()
        Try
            If Not TableAktionenWennVorgangOffen.Visible Then
                FlowLayoutPanelArtikel.Controls.Clear()
                TableAktionenWennVorgangOffen.Width = FlowLayoutPanelArtikel.Width - 10
                TableRabatte.Width = FlowLayoutPanelArtikel.Width - 10
                TableFunktionen.Width = FlowLayoutPanelArtikel.Width - 10
                FlowLayoutPanelArtikel.Controls.Add(TableAktionenWennVorgangOffen)
                'FlowLayoutPanelArtikel.Controls.Add(TableRabatte)
                FlowLayoutPanelArtikel.Controls.Add(TableFunktionen)
            End If
            TableAktionenWennVorgangOffen.Visible = Not TableAktionenWennVorgangOffen.Visible
            TableFunktionen.Visible = Not TableFunktionen.Visible
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="Mehr", Silent:=True)
        End Try
    End Sub

    Private Sub TableLayoutPanel4_SizeChanged(sender As Object, e As EventArgs) Handles TableLayoutPanel4.SizeChanged
        Try
            For Each c As Control In FlowLayoutPanel2.Controls
                c.Size = btnKassaAbschliessen.Size
            Next
            BestellungenButton.Size = btnKassaAbschliessen.Size
            ButtonMehr.Size = btnKassaAbschliessen.Size
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="TableLayoutPanel4_SizeChanged", Silent:=True)
        End Try
    End Sub

    Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
        WriteLog($"Starte Druck Beleg für {Vorgang.ToString}")
        RaiseEvent DruckAktuellerBeleg(_vorgang)
    End Sub

#Region "Preis"
    Private ziffernblockPreis As Ziffernblock = Nothing

    Friend Sub ButtonPreis_Click(sender As Object, e As EventArgs) Handles ButtonPreis.Click, ButtonPreisAendern.Click

        Try
            If ziffernblockPreis Is Nothing Then
                ziffernblockPreis = New Ziffernblock With {.Width = 250, .Height = 250}

                AddHandler ziffernblockPreis.AmountChanged, AddressOf ziffernblockPreis_AmountChanged
            End If

            If BuchvorgangBindingSource.Current Is Nothing Then
                Exit Sub
            End If

            ziffernblockPreis.Reset()
            FlowLayoutPanelArtikel.Controls.Clear()
            FlowLayoutPanelArtikel.Controls.Add(ziffernblockPreis)
            ziffernblockPreis.Select0()

        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonPreis_Click", Silent:=True)
        End Try
    End Sub

    Friend Sub ziffernblockPreis_AmountChanged(amount As Decimal)
        Try
            Dim selektiertePos = GetMarkiertePosition()
            If selektiertePos Is Nothing Then Exit Sub

            Dim ea As New ArtikelPosition With {
                .ID = selektiertePos.ID,
                .ArtNr = selektiertePos.ArtNr,
                .Stk = selektiertePos.Stk
            }

            Dim neuerPreis = amount

            If ArtikelNr <= 0 Then Exit Sub
            Dim artikelPosition As New ArtikelPosition With {
                .ID = ea.ID,
                .ArtNr = ea.ArtNr,
                .Preis_Brutto = amount
            }
            RaiseEvent ArtikelPreisGeaendert(artikelPosition)

            SetControlStatus()
            UpdateVorgangPreview(forceRefresh:=True)
            SetControlStatus()
            LadeArtikelFuerKategorie(zuletztGeladeneArtKatNr)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ziffernblockPreis_AmountChanged", Silent:=True)
        End Try
    End Sub
#End Region

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Friend Sub ButtonPlus_Click(sender As Object, e As EventArgs) Handles ButtonPlus.Click
        Try
            Stk = 1
            SetControlStatus()
            ButtonUebernehmen_Click()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonPlus_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Friend Sub ButtonMinus_Click(sender As Object, e As EventArgs) Handles ButtonMinus.Click
        Try
            Stk = -1
            SetControlStatus()
            ButtonUebernehmen_Click()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonMinus_Click", Silent:=True)
        End Try
    End Sub

    Private Sub ButtonOeffneKassa_Click(sender As Object, e As EventArgs) Handles ButtonOeffneKassa.Click
        Try
            PrintOpenKassa()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonOeffneKassa_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonWizzard_Click(sender As Object, e As EventArgs) Handles ButtonWizzard.Click
        Try
            Dim iTools As InterfaceTools = InterfaceTools
            iTools.UcInterfaceTools1.touch = Me
            iTools.UcInterfaceTools1.ArtKatNr = AktuelleArtKatNr
            iTools.UcInterfaceTools1.dndArtikel = dndArtikel
            iTools.UcInterfaceTools1.dndKategorie = dndKategorien
            AddHandler dndArtikel.ArtikelButtonMouseClicked, AddressOf iTools.ArtikelButtonMouseClicked
            AddHandler dndKategorien.ArtikelButtonMouseClicked, AddressOf iTools.UcInterfaceTools1.KategorieButtonMouseClicked

            iTools.Show()
            iTools.Left = Width - iTools.Width
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonWizzard_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonRechnungSuchen_Click(sender As Object, e As EventArgs) Handles ButtonRechnungSuchen.Click
        Try
            OeffneVorgangListe()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonRechnungSuchen_Click", Silent:=True)
        End Try
    End Sub

#Region "Weitere Artikel"
    Dim WeitereArtikelParent As FlowLayoutPanel
    Dim WeitereArtikel As New FlowLayoutPanel
    Private Sub LadeZusammenVerkaufteArtikel(ArtNr As Object)
        Try
            Dim t As New Threading.Thread(AddressOf LadeZusammenVerkaufteArtikelNonUIThread)
            t.Start(ArtNr)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="LadeZusammenVerkaufteArtikel", Silent:=True)
        End Try
    End Sub
    Private Sub LadeZusammenVerkaufteArtikelNonUIThread(ArtNr As Object)
        Try

            If VarValue_Default(ZUSAMMENGEKAUFT_ANZEIGE, False) Then
                ' Cursor = Cursors.WaitCursor

                Dim zusammengekauft = ZusammenVerkaufteArtikel(ArtNr)
                If zusammengekauft.Count > 0 Then

                    InitWeitereArtikelParent()

                    Dim artnrs = String.Join(",", zusammengekauft)

                    Dim cmd = New MySqlCommand($"select a.Artnr, a.EAN, a.Bezeichnung, a.PreisATS_Brutto, ifnull(a.style, k.Stylesheet) as stylesheet, a.Modifikationen 
                                             from grArtikel a, `grArtikel-Kategorien` k where a.ArtKatNr=k.ArtKatNr and ArtNr in ({ artnrs })")

                    Me.Invoke(Sub()
                                  LadeArtikel(WeitereArtikel, cmd)
                                  If Not FlowLayoutPanelArtikel.Controls.Contains(WeitereArtikelParent) Then
                                      FlowLayoutPanelArtikel.Controls.Add(WeitereArtikelParent)
                                  End If
                              End Sub)
                End If
                ' Cursor = Cursors.Default
            End If
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="LadeZusammenVerkaufteArtikelNonUIThread", Silent:=True)
        End Try
    End Sub

    Private Sub InitWeitereArtikelParent()
        If WeitereArtikelParent Is Nothing Then
            WeitereArtikelParent = New FlowLayoutPanel
            Dim l = New LinkLabel With {
                .Text = "Oft Zusammengekauft",
                .Width = FlowLayoutPanelArtikel.Width
            }
            AddHandler l.Click, AddressOf DeaktiviereZusammengekauft
            WeitereArtikelParent.Controls.Add(l)
            WeitereArtikelParent.Controls.Add(WeitereArtikel)
            WeitereArtikelParent.Width = FlowLayoutPanelArtikel.Width - 10

            WeitereArtikel.Width = FlowLayoutPanelArtikel.Width - 15
        End If
        WeitereArtikelParent.Height = BARRECHNUNG_RESTAURANT_KASSA_BUTTON_HOEHE + 26
        WeitereArtikel.Height = BARRECHNUNG_RESTAURANT_KASSA_BUTTON_HOEHE
    End Sub

    Private Sub DeaktiviereZusammengekauft(sender As Object, e As EventArgs)
        If MsgBox(Messages.TouchErfassung_Anzeige_Deaktivieren, vbYesNo) Then
            SetVarValue(ZUSAMMENGEKAUFT_ANZEIGE, False)
            FlowLayoutPanelArtikel.Controls.Remove(WeitereArtikelParent)
        End If
    End Sub
#End Region

    Private Sub ButtonCharts_Click(sender As Object, e As EventArgs)
        Try
            VorgangStat.MdiParent = Main
            VorgangStat.Show()
            VorgangStat.Charts()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonCharts_Click", Silent:=True)
        End Try
    End Sub

    Private Sub LabelMessages_Click(sender As Object, e As EventArgs) Handles LabelMessages.Click

    End Sub

    Private Sub ArtikelMengeWaehlen_ArtikelGewahlt(ByRef ArtNr As Object, ByRef stk As Decimal)
        Me.ArtikelNr = ArtNr
        Me.Stk = stk
        ButtonUebernehmen_Click()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim f As New ArtikelMengeWaehlen
        f.Show()
        AddHandler f.ArtikelGewaehlt, AddressOf ArtikelMengeWaehlen_ArtikelGewahlt
    End Sub

    Private Sub ButtonBelegSenden_Click(sender As Object, e As EventArgs) Handles ButtonBelegSenden.Click
        Try
            RaiseEvent BelegSenden(Vorgang)
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="ButtonBelegSenden_Click", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' Show Message from Vorgang Module (in silent mode)
    ''' </summary>
    ''' <param name="msg"></param>
    ''' <remarks></remarks>
    Private Sub PostMsg(msg As String, Style As MsgBoxStyle)
        Try
            LabelMessages.Text = msg & " " & LabelMessages.Text
            If Style = MsgBoxStyle.Information Then
                LabelMessages.ForeColor = Color.Green
            Else
                LabelMessages.ForeColor = Color.Red
            End If
        Catch ex As Exception
            WriteLog("Error in PostMsg " + ex.Message)
        End Try
    End Sub

    Private Function CleanEur(text As String) As Object
        Return text.Replace("€", "").Replace(" ", "")
    End Function

End Class