
Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient

Public Class Vorgang
    Inherits AbstractVorgangMitTouchForm
    Implements InterfacePrintable

    Public Const COL_ID_INDEX As Integer = 0
    Public Const COL_STK_INDEX As Integer = 3
    Public Const COL_EAN_INDEX As Integer = 4
    Public Const COL_ARTNR_INDEX As Integer = 5
    Public Const COL_BEZEICHNUNG_INDEX As Integer = 6
    Public Const COL_PREIS_NETTO_INDEX As Integer = 7
    Public Const COL_PREIS_BRUTTO_INDEX As Integer = 8
    Public Const COL_RABATT_INDEX As Integer = 9
    Public Const COL_MWST_INDEX As Integer = 10
    Public Const COL_EKPREIS_INDEX As Integer = 11
    Public Const COL_LAGERSTAND_INDEX As Integer = 12
    Public Const COL_LAGERINFO_INDEX As Integer = 13
    Public Const COL_ARTIKELIDENTIFICATION_INDEX As Integer = 14
    Public Const COL_REFERENZ_INDEX As Integer = 17
    Public Const COL_SPEZIFIKATION_INDEX As Integer = 21
    Public Const COL_DELETE_INDEX As Integer = 23
    Dim EANAutoComplete1 As EANAutoComplete

    Event VorgangKonvertierenPressed(VorgangKonvertieren As VorgangKonvertieren)

    ''' <summary>
    ''' Die Datensätze filtern
    ''' </summary>
    ''' <param name="Expression"></param>
    ''' <remarks></remarks>
    Public Sub FilterBy(Expression As String)
        Try
            FillTableAdapterForKundNr()
            BuchvorgangBindingSource.Filter = Expression
        Catch ex As Exception
            HandleAppError(ex)
        End Try

    End Sub

    Private Sub FillTableAdapterForKundNr()
        BuchvorgangTableAdapter.FillByKundNr(DsVorgaenge.buchvorgang, KundNr)
        Buchvorgang_artikelTableAdapter.FillByKundNr(DsVorgaenge._buchvorgang_artikel, KundNr)
    End Sub

    ''' <summary>
    ''' Save edits
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub BuchvorgangBindingNavigatorSaveItem_Click(sender As Object, e As System.EventArgs) Handles MyBase.Save
        SaveVorgang()
    End Sub

    Public Sub SaveVorgang()
        Try
            'Feld fokusieren damit Notiz gespeichert wird
            UcVorgangFunktionen1.Focus()
            Dim vorgang = GetVorgang()
            'keine berechnung wenn schon abgeschlossen 
            If Not IstVorgangAbgeschlossen(vorgang.Typ, vorgang.Nummer) Then
                BerechneVorgangSummen(vorgang)
            End If

            SaveEdits()
            VorgangZusatzdatenAktualisieren(False)
            Try
                EANAutoComplete1.RepeatSortEAN()
            Catch ex As Exception
            End Try
            CheckAbgeschlossen()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Sub LadeKundenSpezifischeDaten(comp As String)
        Try
            Dim istKundNrDefiniert = GetVorgang().KundNr
            Dim istVorgangTypDefiniert = GetVorgang().Typ
            Dim istVorgangNummerDefiniert = GetVorgang().Nummer
        Catch ex As Exception
            'Vorgang Row ist nicht definiert, daher kann nicht geladen werden 
            Return
        End Try
        Dim IDNR As String = GetVorgang().KundNr ' Me.KundNrAdressenControl.IDNR
        If IDNR Is Nothing Then IDNR = "-1"
        Dim VorgangNummer As String = GetVorgang().Nummer
        Dim VorgangTyp As String = GetVorgang().Typ
        If comp = "ZahlungsMethodeComboBox" Then
            Dim oldSel = ZahlungsMethodeComboBox.Text
            FillComboBox(ZahlungsMethodeComboBox, "SELECT Methode FROM `ofAdressen-Zahlungsmethoden` WHERE IdNr in (" & IDNR & ") " &
                         " or IdNr in (select KundNr from buchVorgang where Typ='" & VorgangTyp & "' and nummer = " & VorgangNummer & ") ORDER BY Methode", "Methode")

            If ZahlungsMethodeComboBox.Items.Count <= 0 Then
                FillComboBox(ZahlungsMethodeComboBox, "SELECT Methode FROM grzahlungsmethode ORDER BY Methode", "Methode")
            End If
            If oldSel IsNot Nothing Then
                ZahlungsMethodeComboBox.Text = oldSel
            End If

        End If
        If comp = "ZahlungsbedingungComboBox" Then
            Dim oldSel = ZahlungsbedingungComboBox.Text
            FillComboBox(ZahlungsbedingungComboBox, "SELECT Methode FROM `ofAdressen-Zahlungsbedingungen` INNER JOIN grZahlungsbedingung ON Bedingung = Nr " &
                          " WHERE IdNr in (" & IDNR & ") or IdNr in (select KundNr from buchVorgang where Typ='" & VorgangTyp & "' and nummer = " & VorgangNummer & ") GROUP BY Methode", "Methode")
            If ZahlungsbedingungComboBox.Items.Count <= 0 Then
                FillComboBox(ZahlungsbedingungComboBox, "SELECT Methode FROM grzahlungsbedingung ORDER BY Methode", "Methode")
            End If
            If oldSel IsNot Nothing Then
                ZahlungsbedingungComboBox.Text = oldSel
            End If

        End If
        If comp = "TransportMethodeComboBox" Then
            Dim oldSel = TransportMethodeComboBox.Text
            FillComboBox(TransportMethodeComboBox, "SELECT Methode FROM `ofAdressen-Transportmethoden` WHERE IdNr in (" & IDNR & ") or " &
                         " IdNr in (select KundNr from buchVorgang where Typ='" & VorgangTyp & "' and nummer = " & VorgangNummer & ") ORDER BY Methode", "Methode")

            If TransportMethodeComboBox.Items.Count <= 0 Then
                FillComboBox(TransportMethodeComboBox, "SELECT Methode FROM grtransportmethode ORDER BY Methode", "Methode")
            End If
            If oldSel IsNot Nothing Then
                TransportMethodeComboBox.Text = oldSel
            End If
        End If

        ModuleGlobals.KundenIDNR = IDNR
    End Sub

    Private Sub CheckBoxAlleBedingunen_Click(sender As Object, e As EventArgs) Handles CheckBoxAlleBedingunen.Click

        Dim alteZM = ZahlungsMethodeComboBox.Text
        Dim alteZB = ZahlungsbedingungComboBox.Text
        Dim alteTM = TransportMethodeComboBox.Text

        If CheckBoxAlleBedingunen.Checked Then

            FillComboBox(ZahlungsMethodeComboBox, "SELECT Methode FROM grzahlungsmethode ORDER BY Methode", "Methode")
            FillComboBox(ZahlungsbedingungComboBox, "SELECT Methode FROM grzahlungsbedingung ORDER BY Methode", "Methode")
            FillComboBox(TransportMethodeComboBox, "SELECT Methode FROM grtransportmethode ORDER BY Methode", "Methode")

        Else
            LadeKundenSpezifischeDaten("ZahlungsMethodeComboBox")
            LadeKundenSpezifischeDaten("ZahlungsbedingungComboBox")
            LadeKundenSpezifischeDaten("TransportMethodeComboBox")

        End If

        ZahlungsMethodeComboBox.Text = alteZM
        ZahlungsbedingungComboBox.Text = alteZB
        TransportMethodeComboBox.Text = alteTM

    End Sub


    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Vorgang_Load(sender As Object, e As System.EventArgs) Handles MyBase.Load

        Try
            Cursor = Cursors.WaitCursor
            Silent = VarValue_Default(VORGANG_SILENT, "false")
            'SetBuchvorgangBindingSource(BuchvorgangBindingSource)
            Loading = True
            ds = DsVorgaenge
            ParentBindingNavigator.BindingSource = BuchvorgangBindingSource

            KundNrAdressenControl.ShowAddNew = True
            KundNrAdressenControl.ShowButtonDetails = True
            KundNr2AdressenControl.ShowAddNew = True
            DsArtikel.EnforceConstraints = False
            GrArtikellisteTableAdapter.Fill(DsArtikel.grArtikelliste)


            FillComboBox(StatusComboBox, "select Status from buchVorgaengeStatus Group by Status", "Status")
            FillComboBox(TypComboBox, "select Typ, Bezeichnung FROM buchVorgangTyp ORDER By Bezeichnung", "Bezeichnung", "Typ")
            FillComboBox(WaehrungComboBox, "select zeichen from grWaehrung Group by zeichen", "zeichen")
            FillComboBox(MandantNrComboBox, "select IDNR, Firma FROM Mandant ORDER By Firma", "Firma", "IDNR")


            ArtikelControl1.ShowArtikelSelectorButton = True
            ArtikelControl1.ShowAddNew = True
            ArtikelControl1.ShowDetailsButton = True

            ButtonTouch.BringToFront()
            ButtonSchliessenTop.BringToFront()

            'Muss explizit aufgerufen werden
            '''' If KundNr > 0 Then
            ''''     FillTableAdapterForKundNr()
            '''' End If
            EANAutoComplete1 = New EANAutoComplete(Buchvorgang_artikelDataGridView,
                                          EANColIndex:=COL_EAN_INDEX,
                                          ArtNrColIndex:=COL_ARTNR_INDEX,
                                          BezeichnungColIndex:=COL_BEZEICHNUNG_INDEX,
                                          SpezifikationColIndex:=COL_SPEZIFIKATION_INDEX)
            EANAutoComplete1.MakeEANColumnAutocomplete()


            Me.EAN.ContextMenuStrip = Me.ArtikelContextMenuStrip
            AddHandler MyBase.SetButtonsEvent, AddressOf SetButtons
            AddHandler MyBase.VorgangGeladen, AddressOf OnVorgangGeladen
            Loading = False
        Catch ex As Exception
            HandleAppError(ex)
        Finally
            Cursor = Cursors.Default
        End Try

    End Sub

    Sub OnVorgangGeladen()
        CheckAbgeschlossen()
    End Sub


#Region "New"

    'Dim addingnewflag As Boolean = False
    Private Sub bindingnavigatoraddnewitem_click(sender As Object, e As System.EventArgs) Handles MyBase.AddNew
        Try
            AddingNewFlag = True
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    ''' <summary>
    ''' setzte die Vorgangnummer für neue 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TypComboBox_Leave(sender As Object, e As System.EventArgs) Handles TypComboBox.Leave
        Try
            If String.IsNullOrEmpty(GetVorgang().Nummer) Then
                NummerTextBox.Text = intrasell.vorgang.GetNewVorgangNummer(GetVorgang().Typ, GetVorgang().KundNr)
                DatumDateTimePicker.Value = Date.Now
            End If
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

    Public Sub BeginNew(Optional addNew As Boolean = True, Optional VorgangTyp As String = Nothing)
        Try
            'neuen vorgang erstellen
            'If MessageBox.Show("Wollen Sie einen neuen Vorgang erstellen?", "Vorgang erstellen?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            'Else
            '    Return
            'End If
            If addNew Then BuchvorgangBindingSource.AddNew()
            If VorgangTyp IsNot Nothing Then
                VorgangWizzard.VorgangTyp = VorgangTyp
            End If
            VorgangWizzard.ShowDialog()
            'die Werte Übernehmen 
            If VorgangWizzard.DialogResult = DialogResult.OK Then
                BeginNewVorgangFuerKunden(False,
                                          VorgangWizzard.KundNrAdressenControl.IDNR,
                                          VorgangWizzard.TypComboBox.SelectedValue,
                                          VorgangWizzard.DatumDateTimePicker.Value)
                SaveEdits() 'Nummmer reservieren
            Else
                'cancel ?
            End If

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

    Public Sub BeginNewVorgangFuerKunden(addNew As Boolean, kundNr As Integer, vorgangTyp As String, datum As Date)
        If addNew Then BuchvorgangBindingSource.AddNew()
        NeuerVorgang(GetVorgang(), kundNr, vorgangTyp, datum)

        NummerTextBox.Text = VorgangWizzard.NummerTextBox.Text
        TypComboBox.SelectedValue = vorgangTyp
        KundNrAdressenControl.Refresh()
        KundNrAdressenControl.IDNR = kundNr
        Me.KundNr = kundNr
        DatumDateTimePicker.Value = datum
        MitarbeiterNrComboBox.IDNR = MitarbeiterID

        Try
            If Not GetVorgang.IsKundNr2Null Then
                KundNr2AdressenControl.ID = GetVorgang.KundNr2
            End If
        Catch ex As Exception
            Debug.Print("Me.GetVorgang.KundNr2 kann nicht gesetz werden", ex.Message)
        End Try

        'folgende 3 zeilen damit die rows in artikel die parent typ und nummer übernehmen. 
        Validate()
        BuchvorgangBindingSource.EndEdit()
        Buchvorgang_artikelBindingSource.EndEdit()

        GetVorgang.KundNr = kundNr
        VorgangZusatzdatenAktualisieren(True)

        If Not GetVorgang.IsZahlungsbedingungNull Then
            ZahlungsMethodeComboBox.Text = GetVorgang.ZahlungsMethode
        End If

        If Not GetVorgang.IsZahlungsbedingungNull Then
            ZahlungsbedingungComboBox.Text = GetVorgang.Zahlungsbedingung
        End If

        If Not GetVorgang.IsTransportMethodeNull Then
            TransportMethodeComboBox.Text = GetVorgang.TransportMethode
        End If

    End Sub
#End Region


    Private Sub CheckAbgeschlossen()
        Try
            Dim enable As Boolean = Not (AbgeschlossenCheckBox.Checked _
                                         Or (AusgedrucktCheckBox.Checked And TypComboBox.SelectedValue = VorgangTypen.AR))
            Buchvorgang_artikelDataGridView.ReadOnly = Not enable
            'Details 
            'Me.TableLayoutPanel2.Enabled = enable
            TypComboBox.Enabled = enable
            NummerTextBox.Enabled = enable
            DatumDateTimePicker.Enabled = enable
            'Nicht deaktivieren damit zum Kundenkonto wechseln kann
            'Me.KundNrAdressenControl.Enabled = enable
            KundNr2AdressenControl.Enabled = enable
            ZahlungsbedingungComboBox.Enabled = enable
            ZahlungsMethodeComboBox.Enabled = enable
            TransportMethodeComboBox.Enabled = enable
            StatusComboBox.Enabled = enable
            LieferantNrComboBox.Enabled = enable
            MitarbeiterNrComboBox.Enabled = enable
            MandantNrComboBox.Enabled = enable
            SystemComboBox.Enabled = enable
            AusgedrucktCheckBox.Enabled = enable
            BezahltCheckBox.Enabled = enable
            AbgeschlossenCheckBox.Enabled = enable
            'Ende Details


            WaehrungComboBox.Enabled = enable
            If GetVorgang() IsNot Nothing Then
                UcVorgangFunktionen1.btnSignieren.Visible = (GetVorgang.Typ = VorgangTypen.AR)
            End If
            UcVorgangFunktionen1.btnAbschliessen.Enabled = enable Or Not AbgeschlossenCheckBox.Checked


            TableLayoutPanelPosition.Enabled = enable
            'Eigenschaften nicht sperren damit Paketnummer eingetragen werden kann
            'Me.DataGridViewVorgangEigentschaften.Enabled = enable
            UcVorgangFunktionen1.Enabled = True
        Catch ex As Exception
            HandleAppError(ex)
        End Try

    End Sub

    Private Sub AbgeschlossenCheckBox_CheckedChanged(sender As Object, e As System.EventArgs) Handles AbgeschlossenCheckBox.CheckedChanged
        CheckAbgeschlossen()
    End Sub

    Private Sub AusgedrucktCheckBox_CheckedChanged(sender As Object, e As EventArgs) Handles AusgedrucktCheckBox.CheckedChanged
        CheckAbgeschlossen()
    End Sub

    Private Sub StatusComboBox_DropDown(sender As Object, e As System.EventArgs) Handles StatusComboBox.DropDown
        FillComboBox(StatusComboBox, "select Status from buchVorgaengeStatus where VorgangTyp = '" & TypComboBox.SelectedValue & "' Group by Status", "Status")
    End Sub

    Private Sub ZahlungsMethodeComboBox_Enter(sender As Object, e As System.EventArgs) Handles ZahlungsMethodeComboBox.DropDown
        'LadeKundenSpezifischeDaten("ZahlungsMethodeComboBox")
    End Sub

    Private Sub ZahlungsbedingungComboBox_Enter(sender As Object, e As System.EventArgs) Handles ZahlungsbedingungComboBox.DropDown
        'LadeKundenSpezifischeDaten("ZahlungsbedingungComboBox")
    End Sub

    Private Sub TransportMethodeComboBox_Enter(sender As Object, e As System.EventArgs) Handles TransportMethodeComboBox.DropDown
        'LadeKundenSpezifischeDaten("TransportMethodeComboBox")
    End Sub

#Region "VorgangPositionen Grid"


    Dim normalWidthEAN = 150
    Dim InCellValueChanged = False
    Dim OnCellValueChangedBerechneSummen = False

    Dim maxPosIdErreicht As Integer = 0

    Private Sub Buchvorgang_artikelDataGridView_UserDeletedRow(sender As Object, e As DataGridViewRowEventArgs) Handles Buchvorgang_artikelDataGridView.UserDeletedRow
        Try
            'Beim löschen und Einfügen sollten wir die nächste Pos ID aufgeben damit keine Konflikte 
            If GetNextPosID(Buchvorgang_artikelBindingSource) > maxPosIdErreicht Then
                maxPosIdErreicht = GetNextPosID(Buchvorgang_artikelBindingSource) + 1
            End If

            BerechneVorgangSummen(GetVorgang())
            EANAutoComplete1.RepeatSortEAN()
            Buchvorgang_artikelBindingSource.EndEdit()
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

    'Vergrössern
    Private Sub Buchvorgang_artikelDataGridView_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles Buchvorgang_artikelDataGridView.CellBeginEdit
        'Debug.Print("Buchvorgang_artikelDataGridView_CellBeginEdit " & Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText)
        If e.ColumnIndex = COL_EAN_INDEX Then
            normalWidthEAN = Buchvorgang_artikelDataGridView.Columns(COL_EAN_INDEX).Width
            Buchvorgang_artikelDataGridView.Columns(COL_EAN_INDEX).Width = 400
        End If
    End Sub

    'Verkleinern
    Private Sub Buchvorgang_artikelDataGridView_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles Buchvorgang_artikelDataGridView.CellEndEdit
        'Debug.Print("Buchvorgang_artikelDataGridView_CellEndEdit " & Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText)
        If e.ColumnIndex = COL_EAN_INDEX Then
            Buchvorgang_artikelDataGridView.Columns(COL_EAN_INDEX).Width = normalWidthEAN
        End If
    End Sub


    Private Sub Buchvorgang_artikelDataGridView_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles Buchvorgang_artikelDataGridView.CellValidating
        'Debug.Print("Buchvorgang_artikelDataGridView_CellValidating " & Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText)
    End Sub


    Private Sub Buchvorgang_artikelDataGridView_CellValidated(sender As Object, e As DataGridViewCellEventArgs) Handles Buchvorgang_artikelDataGridView.CellValidated
        'Debug.Print("Buchvorgang_artikelDataGridView_CellValidated " & Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText)
        If OnCellValueChangedBerechneSummen Then
            OnCellValueChangedBerechneSummen = False
            Dim istDetached = GetVorgangPosition().RowState = Data.DataRowState.Detached
            If Not istDetached Then
                Try
                    EANAutoComplete1.IgnoreEventsDuringBinding = True
                    If CheckBoxAutomatischBerechnen.Checked Then
                        BerechneVorgangSummen(GetVorgang())
                    End If
                Catch ex As Exception
                Finally
                    EANAutoComplete1.IgnoreEventsDuringBinding = False
                End Try

            Else
                Debug.Print("Row is detached. Keine Summenberechnung!")
            End If

        End If

    End Sub


    Private Sub Buchvorgang_artikelDataGridView_CellValueChanged(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Buchvorgang_artikelDataGridView.CellValueChanged
        'Debug.Print("Buchvorgang_artikelDataGridView.CellValueChanged " & Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText)
        Try

            'WriteLog("Buchvorgang_artikelDataGridView_CellValueChanged")
            If Loading Or InCellValueChanged Then Exit Sub

            If e.RowIndex < 0 Or GetVorgangPosition() Is Nothing Then
                Exit Sub
            End If

            InCellValueChanged = True

            Dim istDetached = GetVorgangPosition().RowState = Data.DataRowState.Detached

            Dim newRowInErstellung As Boolean = SetPosIDIfNotSet() Or istDetached

            Dim r As DataGridViewRow = Buchvorgang_artikelDataGridView.Rows(e.RowIndex)

            If Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText = "Menge" Then
                'If Not newRowInErstellung Then BerechneVorgangSummen()
                If Not IsNull(r.Cells(COL_ARTNR_INDEX).Value) Then
                    Stk_AfterUpdate(r.Cells(COL_ARTNR_INDEX).Value,
                                    r.Cells(COL_STK_INDEX),
                                    r.Cells(COL_PREIS_NETTO_INDEX),
                                    r.Cells(COL_PREIS_BRUTTO_INDEX),
                                    r.Cells(COL_MWST_INDEX))
                    RecalculatePosition(Buchvorgang_artikelBindingSource.Current.row, berechneVorgangSummenJetzt:=False)
                    OnCellValueChangedBerechneSummen = True
                End If

            End If

            If Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText = "Artikel" Then 'Die Spalte wurde auf EAN umbennant daher ist dieser code nicht mehr abrufbar
                Artikel_AfterUpdate(r.Cells(COL_ARTNR_INDEX),
                                    r.Cells(COL_BEZEICHNUNG_INDEX),
                                    r.Cells(COL_ARTNR_INDEX),
                                    r.Cells(COL_REFERENZ_INDEX))
                RecalculatePosition(Buchvorgang_artikelBindingSource.Current.row, berechneVorgangSummenJetzt:=False)
                'If Not newRowInErstellung Then BerechneVorgangSummen()
                r.Cells(COL_LAGERSTAND_INDEX).Value = Nothing
                OnCellValueChangedBerechneSummen = True
            End If

            If Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText = "ArtNr" Or e.ColumnIndex = COL_ARTNR_INDEX Then
                Artikel_AfterUpdate(r.Cells(COL_ARTNR_INDEX),
                                   r.Cells(COL_BEZEICHNUNG_INDEX),
                                   r.Cells(COL_ARTNR_INDEX),
                                   r.Cells(COL_REFERENZ_INDEX))
                RecalculatePosition(Buchvorgang_artikelBindingSource.Current.row, berechneVorgangSummenJetzt:=False)
                'If Not newRowInErstellung Then BerechneVorgangSummen()
                r.Cells(COL_LAGERSTAND_INDEX).Value = Nothing
                OnCellValueChangedBerechneSummen = True
            End If

            If Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText = "Bezeichnung" Or e.ColumnIndex = COL_BEZEICHNUNG_INDEX Then

                Bezeichnung_AfterUpdate(r.Cells(COL_BEZEICHNUNG_INDEX),
                                        r.Cells(COL_ARTNR_INDEX),
                                        r.Cells(COL_ARTNR_INDEX))

                'set Preise neu 
                RecalculatePosition(Buchvorgang_artikelBindingSource.Current.row, berechneVorgangSummenJetzt:=False)
                'If Not newRowInErstellung Then BerechneVorgangSummen()
                r.Cells(COL_LAGERSTAND_INDEX).Value = Nothing
                OnCellValueChangedBerechneSummen = True
            End If

            If Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText = "Netto" Or e.ColumnIndex = COL_PREIS_NETTO_INDEX Then
                Preis_Netto_AfterUpdate(r.Cells(COL_ARTNR_INDEX).Value,
                                        r.Cells(COL_PREIS_NETTO_INDEX),
                                        r.Cells(COL_PREIS_BRUTTO_INDEX),
                                        r.Cells(COL_MWST_INDEX))

                'If Not newRowInErstellung Then BerechneVorgangSummen()
                OnCellValueChangedBerechneSummen = True
            End If

            If Buchvorgang_artikelDataGridView.Columns(e.ColumnIndex).HeaderText = "Brutto" Or e.ColumnIndex = COL_PREIS_BRUTTO_INDEX Then
                Preis_Brutto_AfterUpdate(r.Cells(COL_ARTNR_INDEX).Value,
                                         r.Cells(COL_PREIS_NETTO_INDEX),
                                         r.Cells(COL_PREIS_BRUTTO_INDEX),
                                         r.Cells(COL_MWST_INDEX))

                'If Not newRowInErstellung Then BerechneVorgangSummen()
                OnCellValueChangedBerechneSummen = True
            End If
            'Me.Buchvorgang_artikelDataGridView.Refresh()
            'EANAutoComplete1.RepeatSortEAN()

        Catch ex As Exception
            HandleAppError(ex)
        Finally
            InCellValueChanged = False
        End Try

    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <returns>true if pos id set (new row)</returns>
    ''' <remarks></remarks>
    Private Function SetPosIDIfNotSetOld()
        'set Position 
        Dim rows As Integer = Buchvorgang_artikelDataGridView.RowCount
        If rows > 1 Then
            Dim curVal = Buchvorgang_artikelDataGridView.Rows(rows - 1).Cells(COL_ID_INDEX).Value
            'Return True
            If IsNull(curVal) Then
                Buchvorgang_artikelDataGridView.Rows(rows - 1).Cells(COL_ID_INDEX).Value = (rows - 1)
                Return True
            End If
        End If
        Return False
    End Function

    Private Function SetPosIDIfNotSet()
        'set Position 
        Dim rows As Integer = Buchvorgang_artikelDataGridView.RowCount
        If rows >= 1 Then
            Dim curVal = Buchvorgang_artikelDataGridView.CurrentRow.Cells(COL_ID_INDEX).Value
            'Return True
            If IsNull(curVal) Then
                Dim nPosId = GetNextPosID(Buchvorgang_artikelBindingSource)

                Buchvorgang_artikelDataGridView.CurrentRow.Cells(COL_ID_INDEX).Value = Math.Max(nPosId, maxPosIdErreicht)
                Return True
            End If
        End If
        Return False
    End Function

    Private Sub Buchvorgang_artikelDataGridView_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles Buchvorgang_artikelDataGridView.CellFormatting
        Try
            If e.ColumnIndex = COL_STK_INDEX Then
                Dim r = Buchvorgang_artikelDataGridView.Rows(e.RowIndex)

                Dim artnr = r.Cells(COL_ARTNR_INDEX).Value
                If IsNumeric(artnr) Then
                    'Farbe setzen  
                    r.Cells(COL_BEZEICHNUNG_INDEX).Style.BackColor = ArtikelFarbe(artnr)
                    'Lagerstand setzen 
                    Dim cell = r.Cells(COL_LAGERSTAND_INDEX)
                    If cell.Value Is Nothing Then
                        cell.Value = GetLagerBestandArtikel(ArtNr:=artnr)
                    End If

                    'Lagerinfo (Bezeichnung1) 
                    Dim cellLI = r.Cells(COL_LAGERINFO_INDEX)
                    If cellLI.Value Is Nothing Then
                        cellLI.Value = GetLagerInfoArtikel(ArtNr:=artnr)
                    End If

                End If
            End If
        Catch ex As Exception
            Debug.Print("Error in Buchvorgang_artikelDataGridView_CellFormatting " & ex.Message)
        End Try
    End Sub

    Private Sub Buchvorgang_artikelDataGridView_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles Buchvorgang_artikelDataGridView.CellContentClick
        If e.ColumnIndex = COL_RABATT_INDEX Then
            Call ButtonRabatt_Click(Nothing, Nothing)
        End If
        If e.ColumnIndex = COL_DELETE_INDEX Then
            Call ButtonPositionDelete_Click(Nothing, Nothing)
        End If
    End Sub


    Private Sub Artikel_AfterUpdate(inArtNrCombo As DataGridViewCell,
                                    outBezeichnung As DataGridViewCell,
                                    outArtNr As DataGridViewCell,
                                    outArtikelIdentifikation As DataGridViewCell)

        Try
            Dim cmd As New MySqlCommand("select artnr, Bezeichnung, Barcode from grartikel where ArtNr=@ArtNr")
            cmd.Parameters.AddWithValue("ArtNr", inArtNrCombo.Value)
            Dim rs = TryGetFromCache(cmd)
            If rs.Rows.Count > 0 Then
                Dim oldBezeichnung As String = ""
                If Not IsDBNull(outBezeichnung.Value) Then
                    oldBezeichnung = outBezeichnung.Value
                End If
                Dim newBezeichnung As String = rs.Rows(0).Item("Bezeichnung")
                If oldBezeichnung <> newBezeichnung Then

                    'Preise zurücksetzen
                    GetVorgangPosition.Preis_Netto = Nothing
                    GetVorgangPosition.Preis_Brutto = Nothing
                    GetVorgangPosition.MWST = Nothing

                    outArtNr.Value = rs.Rows(0)("artnr")
                    outBezeichnung.Value = rs.Rows(0)("Bezeichnung")
                    If Not IsDBNull(rs.Rows(0)("Barcode")) Then
                        If IsDBNull(outArtikelIdentifikation.Value) Then
                            outArtikelIdentifikation.Value = rs.Rows(0)("Barcode")
                        End If
                    End If
                End If
            End If
        Catch ex As Exception
            HandleAppError(ex, "Vorgang.Artikel_AfterUpdate", Silent:=True)
        End Try

    End Sub

    Private Sub Bezeichnung_AfterUpdate(inBezeichnung As DataGridViewCell,
outArtNrCombo As DataGridViewCell,
outArtNr As DataGridViewCell)
        Try
            Dim cmd As New MySqlCommand("select artnr, Bezeichnung from grartikel where bezeichnung like '%@Bezeichnung%'")
            cmd.Parameters.AddWithValue("Bezeichnung", inBezeichnung.Value)
            Dim rs = OpenRecordsetInMemory(cmd)
            If rs.Rows.Count > 0 Then
                outArtNrCombo.Value = rs.Rows(0).Item("artnr")
                outArtNr.Value = rs.Rows(0).Item("artnr")
            End If
        Catch ex As Exception
            HandleAppError(ex, "Vorgng.Bezeichnung_AfterUpdate", Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' Mengenpreise berücksichtigen, wenn Stk geändert wird
    ''' </summary>
    ''' <param name="ArtNr"></param>
    ''' <param name="Preis_Netto"></param>
    ''' <param name="Preis_Brutto"></param>
    ''' <param name="MWST"></param>
    ''' <remarks></remarks>
    Private Sub Stk_AfterUpdate(ArtNr As String,
                                Stk As DataGridViewCell,
                                Preis_Netto As DataGridViewCell,
                                Preis_Brutto As DataGridViewCell,
                                MWST As DataGridViewCell)

        Dim Preisliste = GetVorgangPreisliste(New VorgangInBearbeitung(GetVorgang))
        Dim LieferLandISO2 = GetLieferLandISO2(GetVorgang.Typ, GetVorgang.Nummer)
        Dim neuerPreis As Double = intrasell.preise.GetPreis(GetVorgang.KundNr, ArtNr, Stk.Value, Preisliste:=Preisliste, LieferLandISO2:=LieferLandISO2)
        Dim alterPreis = RoundUp(Preis_Netto.Value, PREIS_GENAUIGKEIT)
        If neuerPreis <> alterPreis Then
            GetVorgangPosition.Preis_Netto = RoundUp(neuerPreis, PREIS_GENAUIGKEIT)
            GetVorgangPosition.Preis_Brutto = RoundUp(intrasell.preise.CalculateBruttoPreis(Preis_Netto.Value, ArtNr, GetVorgang.KundNr, LieferLandISO2), PREIS_GENAUIGKEIT)
            GetVorgangPosition.MWST = GetVorgangPosition.Preis_Brutto - GetVorgangPosition.Preis_Netto
        End If
    End Sub

    Private Sub Preis_Netto_AfterUpdate(ArtNr As String,
Preis_Netto As DataGridViewCell,
Preis_Brutto As DataGridViewCell,
MWST As DataGridViewCell)

        Dim LieferLandISO2 = GetLieferLandISO2(GetVorgang.Typ, GetVorgang.Nummer)
        GetVorgangPosition.Preis_Netto = RoundUp(Preis_Netto.Value, PREIS_GENAUIGKEIT)
        GetVorgangPosition.Preis_Brutto = RoundUp(intrasell.preise.CalculateBruttoPreis(Preis_Netto.Value, ArtNr, GetVorgang.KundNr, LieferLandISO2), PREIS_GENAUIGKEIT)
        GetVorgangPosition.MWST = GetVorgangPosition.Preis_Brutto - GetVorgangPosition.Preis_Netto
    End Sub

    Private Sub Preis_Brutto_AfterUpdate(ArtNr As String,
Preis_Netto As DataGridViewCell,
Preis_Brutto As DataGridViewCell,
MWST As DataGridViewCell)

        Dim LieferLandISO2 = GetLieferLandISO2(GetVorgang.Typ, GetVorgang.Nummer)
        Dim MwstSatz = intrasell.preise.GetMWSTArtikel(ArtNr, IDNR:=GetVorgang.KundNr, LieferLandISO2:=LieferLandISO2)
        GetVorgangPosition.Preis_Brutto = RoundUp(Preis_Brutto.Value, PREIS_GENAUIGKEIT)
        GetVorgangPosition.Preis_Netto = RoundUp(Preis_Brutto.Value / (1 + MwstSatz / 100), PREIS_GENAUIGKEIT)
        MWST.Value = Preis_Brutto.Value - Preis_Netto.Value
    End Sub

    ''' <summary>
    ''' Nicht löschen, sonst Fehler
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Buchvorgang_artikelDataGridView_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles Buchvorgang_artikelDataGridView.DataError
        'Ignore
    End Sub

#End Region


#Region "Menu"


    Private Sub VorlageeditierenToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles VorlageeditierenToolStripMenuItem.Click
        Try
            DokumentInWordZeigen(GetAppPath() & DEFAULT_WORD_VORLAGE_VORGANG, False)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub ToolStripMenuItemHTMLVorlage_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemHTMLVorlage.Click
        Try
            Dim ve As New VorlageEditor(DEFAULT_HTML_VORLAGE_VORGANG) With {
                .MdiParent = MdiParent
            }
            ve.Show()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub AusdruckenToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles AusdruckenToolStripMenuItem.Click
        Try
            Print(sender)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub AusdruckenBonDruckerToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AusdruckenBonDruckerToolStripMenuItem.Click
        Try
            Cursor = Cursors.WaitCursor
            VorgangDrucken(GetVorgang().Typ, GetVorgang().Nummer, False, VarValue_Default(PRINT_AM_BILDSCHIRM, True))
        Catch ex As Exception
            HandleAppError(ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub NeuerVorgangToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles NeuerVorgangToolStripMenuItem.Click
        BeginNew()
    End Sub
    Private Sub AbschliessenToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles AbschliessenToolStripMenuItem.Click
        VorgangAbschliessenMitEvent()
    End Sub

    Private Sub ToolStripMenuItemVorgangEntsperren_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemVorgangEntsperren.Click
        VorgangSperrenEntsperrenMitEvent(False)
    End Sub

    Private Sub ToolStripMenuItemVorgangSperren_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemVorgangSperren.Click
        VorgangSperrenEntsperrenMitEvent(True)
    End Sub

    Private Sub ToolStripMenuItemVorgangNichtGedruckt_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemVorgangNichtGedruckt.Click
        Try
            SetNichtAusgedruckt(GetVorgang.Typ, GetVorgang.Nummer)
            'Me.AusgedrucktCheckBox.Checked = False
            LadeVorgangNummer(GetVorgang.Typ, GetVorgang.Nummer, raiseEventVorgangGeladen:=False)
            CheckAbgeschlossen()
        Catch ex As Exception
            HandleAppError(ex)
        End Try

    End Sub

    Sub StornoToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles StornoToolStripMenuItem.Click
        VorgangStornoMitEvent()
    End Sub

    Private Sub ExportierenToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles ExportierenToolStripMenuItem.Click
        OpenAusdruck_inWord_XML(TypComboBox.SelectedValue, NummerTextBox.Text, Nothing, VIEWER_XML, Silent:=False)
    End Sub

    Private Sub KonvertierenToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles KonvertierenToolStripMenuItem.Click
        VorgangKonvertieren()
    End Sub

    Private Sub VorgangKonvertieren()
        Try
            SaveEdits()
            Dim VorgangKonvertieren As New VorgangKonvertieren
            VorgangKonvertieren.Init(TypComboBox.SelectedValue, NummerTextBox.Text, KundNrAdressenControl.IDNR)
            RaiseEvent VorgangKonvertierenPressed(VorgangKonvertieren)
            VorgangKonvertieren.ShowDialog()
            If VorgangKonvertieren.DialogResult = Windows.Forms.DialogResult.OK Then
                Close()
                Dim konvertiertNach_vorgangForm = VorgangKonvertieren.konvertiertNach_vorgangForm
                If konvertiertNach_vorgangForm IsNot Nothing Then
                    konvertiertNach_vorgangForm.BringToFront()
                End If
            End If
            VorgangKonvertieren.Dispose()

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


    Private Sub VorlagenToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles VorlagenToolStripMenuItem.Click
        DruckVorlage
    End Sub



    Private Sub SendeEmailToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles SendeEmailToolStripMenuItem.Click
        'Call sendVorgang_Email(Me.TypComboBox.SelectedValue, Me.NummerTextBox.Text)
        OpenAusdruck_inWord_XML(GetVorgang().Typ, GetVorgang().Nummer, DEFAULT_WORD_VORLAGE_VORGANG, MAIL_GRITON, Silent:=False)
    End Sub

    Private Sub KassaBuchungToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles KassaBuchungToolStripMenuItem.Click
        btnKassa_Click()
    End Sub
#End Region


#Region "Vorgang"

    Private Sub btnKassa_Click()
        Call KassaBuchung(TypComboBox.SelectedValue, NummerTextBox.Text, SummeBruttoTextBox.Text)
    End Sub

    'Public Sub VorgangAbschliessenMitEvent()
    '    Try
    '
    '        If VorgangAbschliessen(GetVorgang().Typ, GetVorgang().Nummer, Silent) Then
    '            'Event einfügen 
    '            EventErstellen("Mitarbeiter " & MitarbeiterID & " hat einen Vorgang über " & SummeNetto & " € abgeschloßen.")
    '            LadeVorgangNummer(GetVorgang.Typ, GetVorgang.Nummer, raiseEventVorgangGeladen:=False)
    '            CheckAbgeschlossen()
    '        End If
    '
    '    Catch ex As Exception
    '        HandleAppError(ex)
    '    End Try
    'End Sub

    Private Sub SetButtons(neuerVorgang As Boolean)
        CheckAbgeschlossen()
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sperren"></param>
    ''' <remarks></remarks>
    Private Sub VorgangSperrenEntsperrenMitEvent(sperren As Boolean)
        If sperren Then
            If VorgangSperren(GetVorgang().Typ, GetVorgang().Nummer, Silent) Then
                'Event einfügen 
                EventErstellen("Mitarbeiter " & MitarbeiterID & " hat Vorgang " & GetVorgang().Typ & "-" & GetVorgang().Nummer & " gesperrt.")
            End If
        Else
            If VorgangEntsperren(GetVorgang().Typ, GetVorgang().Nummer, Silent) Then
                'Event einfügen 
                EventErstellen("Mitarbeiter " & MitarbeiterID & " hat Vorgang " & GetVorgang().Typ & "-" & GetVorgang().Nummer & " entsperrt.")
            End If
        End If
        LadeVorgangNummer(GetVorgang.Typ, GetVorgang.Nummer, raiseEventVorgangGeladen:=False)
        CheckAbgeschlossen()
    End Sub

#End Region


#Region "Position Tab"

    Private Sub NeuePositionButton_Click(sender As Object, e As System.EventArgs) Handles NeuePositionButton.Click
        Try
            NeuePosition()
            ArtikelControl1.ArtNr = Nothing
            ArtikelControl1.Focus()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Public Sub ArtNr_Changed(newArtNr As Object) Handles ArtikelControl1.ArtNrChanged
        ArtNr_Changed_Base(newArtNr)
    End Sub

    'TODO: Event Validated is wrong here... function shall be performed only after the user changed .. now is called after the user leaves the field event without changing the text
    Private Sub StkTextBox_Validated(sender As Object, e As System.EventArgs) Handles StkTextBox.Validated
        StkChanged()
    End Sub

    'TODO: Event Validated is wrong here... function shall be performed only after the user changed .. now is called after the user leaves the field event without changing the text
    Private Shadows Sub Preis_NettoTextBox_Validated(sender As Object, e As System.EventArgs) Handles Preis_NettoTextBox.Validated
        MyBase.Preis_NettoTextBox_Validated()
    End Sub

    'TODO: Event Validated is wrong here... function shall be performed only after the user changed .. now is called after the user leaves the field event without changing the text
    Private Shadows Sub Preis_BruttoTextBox_Validated(sender As Object, e As System.EventArgs) Handles Preis_BruttoTextBox.Validated
        MyBase.Preis_BruttoTextBox_Validated()
    End Sub

    Private Sub ArtikelControl1_ArtNrAdded(newArtNr As String) Handles ArtikelControl1.ArtNrAdded
        Try
            'Reload der Liste mit Artikeln
            GrArtikellisteTableAdapter.Fill(DsArtikel.grArtikelliste)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub
#End Region

    Private Sub ArtikelstammToolStripMenuItem_Click(sender As Object, e As System.EventArgs) Handles ArtikelstammToolStripMenuItem.Click
        Try
            Dim _ArtNr = Buchvorgang_artikelBindingSource.Current.row.ArtNr
            Dim k As New Artikel With {
                .MdiParent = Main
            }
            k.Show()
            k.FilterBy("ArtNr=" & _ArtNr)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub KundNrAdressenControl_IDNRChanged(IDNR As Integer) Handles KundNrAdressenControl.IDNRChanged
        KundNr = IDNR
        If GetVorgang() IsNot Nothing Then
            GetVorgang().KundNr = IDNR
        End If
    End Sub



    Private Sub UcVorgangFunktionen1_Aktion(name As VorgangAktionenEnum) Handles UcVorgangFunktionen1.Aktion
        Try
            Cursor = Cursors.WaitCursor
            If ds.HasChanges Then
                SaveEdits()
            End If

            If name = VorgangAktionenEnum.NEU Then
                FormManager.BeginNewVorgang(TypComboBox.SelectedValue)
            ElseIf name = VorgangAktionenEnum.DRUCK Then
                Print(Nothing)
            ElseIf name = VorgangAktionenEnum.ABSCHLIESSEN Then
                VorgangAbschliessenMitEvent()
            ElseIf name = VorgangAktionenEnum.BEZAHLT Then
                KassabuchungEintragUndSetBezahlt()
                SetBezahlt(GetVorgang.Typ, GetVorgang.Nummer)
                LadeVorgangNummer(GetVorgang.Typ, GetVorgang.Nummer, raiseEventVorgangGeladen:=False)
                CheckAbgeschlossen()
            ElseIf name = VorgangAktionenEnum.KONVERTIEREN Then
                VorgangKonvertieren()
            ElseIf name = VorgangAktionenEnum.STORNO Then
                VorgangStornoMitEvent()
            ElseIf name = VorgangAktionenEnum.EXPORT Then
                HTMLPrint()
            ElseIf name = VorgangAktionenEnum.PDF Then
                HTMLPrint_PDF_Mail()
            ElseIf name = VorgangAktionenEnum.EMAIL Then
                HTMLPrint_PDF_Mailform()
            ElseIf name = VorgangAktionenEnum.VORLAGE Then
                DruckVorlage()
            ElseIf name = VorgangAktionenEnum.BERECHNEN Then
                VorgangNeuBerechnen()
            ElseIf name = VorgangAktionenEnum.ETIKETTEN Then
                SendeIntraSellVorgangCommand(GetVorgangInBearbeitung(GetVorgang))
            ElseIf name = VorgangAktionenEnum.VERSAND Then
                SendeIntraSellVorgangCommandVersand(GetVorgangInBearbeitung(GetVorgang))
            ElseIf name = VorgangAktionenEnum.SIGNIEREN Then
                VorgangDrucken(GetVorgang.Typ, GetVorgang.Nummer, isUeberleitung:=True, showPreview:=VarValue_Default(PRINT_AM_BILDSCHIRM, False))
            End If

            CheckAbgeschlossen()

        Catch ex As Exception
            Cursor = Cursors.Default
            HandleAppError(ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    ''' <summary>
    ''' Berechnen aller Positionen neu
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub VorgangNeuBerechnen()
        Try

            If MsgBox("Für alle Positionen den Preis neu berechnen?", vbYesNo) = vbYes Then

                Buchvorgang_artikelBindingSource.MoveLast()
                Dim last = Buchvorgang_artikelBindingSource.Current.row

                Buchvorgang_artikelBindingSource.MoveFirst()
                While True
                    If Buchvorgang_artikelBindingSource.Current IsNot Nothing Then
                        Dim r As dsVorgaenge._buchvorgang_artikelRow = Buchvorgang_artikelBindingSource.Current.row
                        r.Preis_Netto = Nothing
                        r.MWST = Nothing
                        r.Preis_Brutto = Nothing
                        RecalculatePosition(r, berechneVorgangSummenJetzt:=False)
                        Buchvorgang_artikelBindingSource.MoveNext()
                        If last.Id = r.ID Then
                            Exit While
                        End If
                    Else
                        Exit While
                    End If
                End While
            End If
            VorgangZusatzdatenAktualisieren(False)
            BerechneVorgangSummen(GetVorgang())

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



    Private Sub ButtonRabatt_Click(sender As Object, e As EventArgs) Handles ButtonRabatt.Click
        Try

            Dim Rabatt
            Rabatt = InputBox("Rabatt in %:", "Rabatt", 0)
            If IsNumeric(Rabatt) Then
                If Rabatt <> 0 Then
                    Dim PreisNetto As Decimal = GetVorgangPosition.Preis_Netto 'CDec(Me.Preis_NettoTextBox.Text)
                    Dim NeuerPreis As Decimal = PreisNetto - PreisNetto * CDec(Rabatt) / 100
                    Dim r As dsVorgaenge._buchvorgang_artikelRow = Buchvorgang_artikelBindingSource.Current.row
                    r.Preis_Netto = NeuerPreis
                    Preis_NettoTextBox.Text = NeuerPreis
                    ' Call PreisATS_AfterUpdate()
                    Call Preis_NettoTextBox_Validated(sender, e)
                End If
            End If
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub ButtonPositionDelete_Click(sender As Object, e As EventArgs)
        Try
            Buchvorgang_artikelBindingSource.RemoveCurrent()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub ButtonPreisRuecksetzen_Click(sender As Object, e As EventArgs) Handles ButtonPreisRuecksetzen.Click
        Try
            If GetVorgangPosition() Is Nothing Then Exit Sub
            GetVorgangPosition.Preis_Netto = Nothing
            GetVorgangPosition.MWST = Nothing
            GetVorgangPosition.Preis_Brutto = Nothing
            Call Preis_NettoTextBox_Validated(sender, e)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

#Region "Eigenschaften"
    Private Sub TabPage4_Enter(sender As Object, e As EventArgs) Handles TabPageEigenschaften.Enter
        Try

            FillComboBoxInDG(VorgangEigenschaftNameDataGridViewTextBoxColumn,
                              "select name as Eigenschaft from buchvorgaengeeigenschaften  where Vorgangtyp='" & GetVorgang().Typ & "' and Nummer=" & GetVorgang().Nummer &
                              " UNION select Eigenschaft from buchvorgangeigenschaft where Vorgangtyp='" & GetVorgang().Typ & "'  order by eigenschaft ",
                              "Eigenschaft", "Eigenschaft")
        Catch ex As Exception
            IntraSell_Net_Base.Log(ex)
        End Try

    End Sub

    Private Sub DataGridViewVorgangEigentschaften_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles DataGridViewVorgangEigentschaften.DataError
        'keine Fehler anzeigen
    End Sub


    Private Sub BuchvorgaengeeigenschaftenBindingSource_CurrentChanged(sender As Object, e As EventArgs) Handles BuchvorgaengeeigenschaftenBindingSource.CurrentChanged
        If BuchvorgaengeeigenschaftenBindingSource.Current Is Nothing Then
            Exit Sub
        End If
        Dim newRow As dsVorgaenge.buchvorgaengeeigenschaftenRow = BuchvorgaengeeigenschaftenBindingSource.Current.Row
        If newRow.IsNummerNull Then
            newRow.VorgangTyp = GetVorgang.Typ
            newRow.Nummer = GetVorgang.Nummer
        End If
    End Sub

#End Region

    Private Sub WoherTextBox_DoubleClick(sender As Object, e As EventArgs) Handles WoherTextBox.DoubleClick
        OpenVorgangFunctionByWoher(WoherTextBox.Text, True)
    End Sub

    Private Sub WohinTextBox_DoubleClick(sender As Object, e As EventArgs) Handles WohinTextBox.DoubleClick
        OpenVorgangFunctionByWoher(WohinTextBox.Text, True)
    End Sub

    Private Sub BuchvorgangBindingSource_CurrentChanged(sender As Object, e As EventArgs) Handles BuchvorgangBindingSource.CurrentChanged
        'TODO: macht probleme weil vorgang nicht erstellt 
        VorgangZusatzdatenAktualisieren(True)
    End Sub

    Dim VorgangZusatzdatenAktualisieren_letzteKundNr = ""

    Sub VorgangZusatzdatenAktualisieren(_LadeKundenSpezifischeDaten As Boolean)
        Try
            Dim vorgang = GetVorgang()
            If vorgang Is Nothing Then
                Exit Sub
            End If
            Try
                Dim istKundNrDefiniert = vorgang.KundNr
                Dim istVorgangTypDefiniert = vorgang.Typ
                Dim istVorgangNummerDefiniert = vorgang.Nummer
            Catch ex As Exception
                'Vorgang GetVorgang().KundNr ist nicht definiert, daher kann nicht geladen werden 
                Exit Sub
            End Try
            Dim check = vorgang.KundNr & vorgang.Typ & vorgang.Nummer
            If VorgangZusatzdatenAktualisieren_letzteKundNr = check Then
                'Bereits geladen
                Exit Sub
            End If
            VorgangZusatzdatenAktualisieren_letzteKundNr = check
            If _LadeKundenSpezifischeDaten Then
                LadeKundenSpezifischeDaten("ZahlungsMethodeComboBox")
                LadeKundenSpezifischeDaten("ZahlungsbedingungComboBox")
                LadeKundenSpezifischeDaten("TransportMethodeComboBox")
            End If


            Dim gesGew = GetGesamtgewichtVorgang(vorgang.Typ, vorgang.Nummer)
            If gesGew <> vorgang.Gesamtgewicht Then
                vorgang.Gesamtgewicht = gesGew
            End If


            TextBoxEmail.Text = KundeEmail(vorgang.KundNr)
            TextBoxUID.Text = KundeUID(vorgang.KundNr)
            Dim note = FirstRow("select name1 from ofAdressen where idnr=" & vorgang.KundNr)
            If Not IsDBNull(note) Then
                TextBoxKundennotiz.Text = note
            End If

            Dim pNr = GetVorgangEigenschaft("Paketnummer")
            If Not IsDBNull(pNr) Then
                TextBoxPaketnummer.Text = pNr
            End If

            'Lieferadresse aktualisieren 
            If vorgang.IsKundNr2Null Then
                KundNr2AdressenControl.ID = Nothing
            Else
                KundNr2AdressenControl.ID = vorgang.KundNr2
            End If
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub


    ''' <summary>
    ''' Mit ENTER wird die Erfassung der Position beendet und kann neue Position eingegeben werden.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub NachEnterNeuePosition(sender As Object, e As KeyPressEventArgs)
        If e.KeyChar = ChrW(Keys.Return) Then
            NeuePositionButton_Click(sender, Nothing)
        End If
    End Sub


    Private Sub NeuePosition2Button_Click(sender As Object, e As EventArgs) Handles NeuePosition2Button.Click
        NeuePositionButton_Click(sender, Nothing)
    End Sub

    Private Sub Kundenadresse1_Load(sender As Object, e As EventArgs) Handles Kundenadresse1.Load
        'Lade Kundendaten
        Try
            Kundenadresse1.ShowIDNR(KundNr)
            AddHandler BuchvorgangBindingSource.CurrentChanged, AddressOf Kundenadresse1_Reload
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

    Private Sub Kundenadresse1_Reload(sender As Object, e As EventArgs)
        Kundenadresse1.ShowIDNR(KundNr)
    End Sub

    Private Sub UcVorgangStatus1_Load(sender As Object, e As EventArgs) Handles UcVorgangStatus1.Load
        Try
            UcVorgangStatus1.LadeDaten(GetVorgang.Typ, GetVorgang.Nummer)
            AddHandler BuchvorgangBindingSource.CurrentChanged, AddressOf UcVorgangStatus1_Reload
        Catch ex As Exception

        End Try
    End Sub

    Private Sub UcVorgangStatus1_Reload(sender As Object, e As EventArgs)
        UcVorgangStatus1.LadeDaten(GetVorgang.Typ, GetVorgang.Nummer)
    End Sub

    Private Sub TextBoxPaketnummer_DoubleClick(sender As Object, e As EventArgs) Handles TextBoxPaketnummer.DoubleClick
        Try
            Dim url = "https://gls-group.eu/DE/de/paketverfolgung?match=" & TextBoxPaketnummer.Text
            Process.Start(url)
        Catch ex As Exception

        End Try
    End Sub

    Private Sub TextBoxPaketnummer_Validated(sender As Object, e As EventArgs) Handles TextBoxPaketnummer.Validated
        SetVorgangEigenschaft("Paketnummer", TextBoxPaketnummer.Text)
    End Sub

#Region "Adressen"
    Private Sub AdressenAdresse1_Load(sender As Object, e As EventArgs) Handles AdressenAdresse1.Load
        Try
            AdressenAdresse1.LadeAdresse(KundNr)
            AddHandler BuchvorgangBindingSource.CurrentChanged, AddressOf AdressenAdresse1_Reload
        Catch ex As Exception

        End Try
    End Sub
    Private Sub AdressenAdresse1_Reload(sender As Object, e As EventArgs)
        AdressenAdresse1.LadeAdresse(KundNr)
        AdressenAdresse2.LadeAdresseWeitere(KundNr2AdressenControl.ID)
    End Sub


    Private Sub AdressenAdresse2_Load(sender As Object, e As EventArgs) Handles AdressenAdresse2.Load
        Try
            AdressenAdresse2.LadeAdresseWeitere(KundNr2AdressenControl.ID)
        Catch ex As Exception

        End Try
    End Sub
#End Region

    Private Sub Vorgang_Resize(sender As Object, e As EventArgs) Handles Me.Resize
        Try
            TypComboBox.SelectionLength = 0
            StatusComboBox.SelectionLength = 0
            WaehrungComboBox.SelectionLength = 0
            KundNrAdressenControl.AdressenComboBox.SelectionLength = 0
            KundNr2AdressenControl.AdressenComboBox.SelectionLength = 0
            ZahlungsbedingungComboBox.SelectionLength = 0
            ZahlungsMethodeComboBox.SelectionLength = 0
            TransportMethodeComboBox.SelectionLength = 0
            MitarbeiterNrComboBox.MitarbeiterComboBox.SelectionLength = 0
            MandantNrComboBox.SelectionLength = 0
        Catch ex As Exception
            'Ignore
        End Try
    End Sub


    ''' <summary>
    ''' Für Tests
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub SortArtikelPositionenNachEAN()
        EANAutoComplete1.SortEAN()
    End Sub

    Private Sub TextBoxKundNr_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles TextBoxKundNr.MouseDoubleClick
        Try
            OeffneKundenMaske(TextBoxKundNr.Text, True)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub ToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem1.Click
        OeffneVorgangLagerbewegung(GetVorgang.Typ, GetVorgang.Nummer)
    End Sub

    Private Sub KundNr2AdressenControl_IDChanged(ID As Object) Handles KundNr2AdressenControl.IDChanged
        If MsgBox("Möchten Sie die Lieferadresse für diesen Vorgang ändern?", vbYesNo) = vbYes Then
            SetLieferadresse(GetVorgang.Typ, GetVorgang.Nummer, GetVorgang.KundNr, ID)
            GetVorgang.KundNr2 = ID
        End If
    End Sub

    Private Sub TabControlVorgang_Click(sender As Object, e As EventArgs) Handles TabControlVorgang.Click
        Try
            Me.BuchkassabuchTableAdapter.FillByVorgang(Me.DsKassa.buchkassabuch, GetVorgang.Nummer, GetVorgang.Typ)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub NotizTextBoxVorne_Validated(sender As Object, e As EventArgs) Handles NotizTextBoxVorne.Validated
        Try
            ModuleBuchVorgang.SetVorgangFeld(GetVorgang.Typ, GetVorgang.Nummer, "Notiz", NotizTextBoxVorne.Text)
            Me.LabelNotiz.Text = "Notiz gespeichert"
            Me.LabelNotiz.ForeColor = Color.Green
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub TextBoxNotizInternVorne_Validated(sender As Object, e As EventArgs) Handles TextBoxNotizInternVorne.Validated
        Try
            ModuleBuchVorgang.SetVorgangFeld(GetVorgang.Typ, GetVorgang.Nummer, "NotizIntern", TextBoxNotizInternVorne.Text)
            Me.LabelNotizInternVorne.Text = "Notiz Intern gespeichert!"
            Me.LabelNotizInternVorne.ForeColor = Color.Green
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub


    Private Sub DateTimePickerZustellzeitDate_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePickerZustellzeitDate.ValueChanged
        DateTimePickerZustellzeit.Value = DateTimePickerZustellzeitDate.Value
    End Sub
    Private Sub DateTimePickerZustellzeit_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePickerZustellzeitDate.Validated, DateTimePickerZustellzeit.Validated
        Try
            intrasell.vorgang.SetVorgangZustellzeit(GetVorgang.Typ, GetVorgang.Nummer, DateTimePickerZustellzeit.Value)
            ModuleGlobal.RequestCommandDirekt(New IntraSellVorgangCommand() _
                                              With {.command = IntraSellCommands.VorgangDetailsGeändert, .Typ = GetVorgang.Typ, .Nummer = GetVorgang.Nummer})
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub DateTimePickerZustellzeitBestätigt_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePickerZustellzeitBestätigt.ValueChanged
        Try
            intrasell.vorgang.SetVorgangZustellzeitBestaetigt(GetVorgang.Typ, GetVorgang.Nummer, DateTimePickerZustellzeitBestätigt.Value)
            ModuleGlobal.RequestCommandDirekt(New IntraSellVorgangCommand() _
                                              With {.command = IntraSellCommands.VorgangDetailsGeändert, .Typ = GetVorgang.Typ, .Nummer = GetVorgang.Nummer})
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub TabPageDokumente_Click(sender As Object, e As EventArgs) Handles TabPageDokumente.Click
        'Ignore
    End Sub

    Private Sub TabPageDokumente_Enter(sender As Object, e As EventArgs) Handles TabPageDokumente.Enter
        Try
            UcDokumente1.TabelleName = "buchVorgang"
            UcDokumente1.FilterString = GetVorgang.Typ & "-" & GetVorgang.Nummer
            UcDokumente1.LadeDaten()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub
End Class