Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient

Public Class VorgangSplit

    Public Vorgang As VorgangInBearbeitung
    Public VorgangSplit As dsVorgaenge.buchvorgangRow
    Dim TischVerschieben As Boolean = False
    Dim Geladen As Boolean = False
    Sub StartSplit(v As VorgangInBearbeitung, Optional verschieben As Boolean = False)
        Try


            Vorgang = v
            UpdateVorgangPreview()

            VorgangSplit = Nothing
            DsVorgaengeSplit._buchvorgang_artikel.Clear()
            DsVorgaengeSplit.buchvorgang.Clear()
            TischVerschieben = verschieben
            If verschieben Then
                'Positionen verschieben
                AdressenControl1.IDNR = -1
                AdressenControl1.Enabled = True
                ButtonAbschliessen.Text = "Positionen verschieben"
                ButtonSplit.Enabled = False
            Else 'Split 
                AdressenControl1.IDNR = BuchvorgangBindingSource.Current.Row.KundNr
                AdressenControl1.Enabled = False
                ButtonAbschliessen.Text = "Rechnung stellen"
            End If
            AddHandler Me.UcZahlungsmethoden1.ZahlungsmethodeAusgewaehlt, AddressOf UcZahlungsmethoden1_ZahlungsmethodeAusgewaehlt
            Bankomat1.Load()
            AddHandler Bankomat1.BezahltMitBankomat, AddressOf BezahltMitBankomat
            ControlsStatus()
            Geladen = True
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub



    Private Sub UpdateVorgangPreview()
        'update preview
        If Not IsNull(Vorgang) Then
            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)
        End If
    End Sub

    Private Sub ButtonSplit_Click(sender As Object, e As EventArgs) Handles ButtonSplit.Click
        Try
            AdressenControl1.Enabled = False
            Dim sourceVorgang = LadeVorgang(Vorgang.Typ, Vorgang.Nummer)
            If sourceVorgang.Abgeschlossen Then
                MsgBox("Vorgang bereits abgeschlossen!")
                Return
            End If

            Dim selected = BuchvorgangartikelBindingSource.Current
            If selected IsNot Nothing Then
                ' Dim sourceVorgang As dsVorgaenge.buchvorgangRow = BuchvorgangBindingSource.Current.Row

                If VorgangSplit Is Nothing Then
                    If TischVerschieben Then
                        VorgangSplit = LadeVorgangIntern(VorgangTypen.AU, AdressenControl1.IDNR)
                        If VorgangSplit Is Nothing Then
                            VorgangSplit = BeginNewVorgang(VorgangTypen.AU, AdressenControl1.IDNR, sourceVorgang.Woher) 'BuchvorgangBindingSource.Current.Row.KundNr
                        End If
                    Else
                        VorgangSplit = BeginNewVorgang(VorgangTypen.AR, BuchvorgangBindingSource.Current.Row.KundNr, sourceVorgang.Woher)
                    End If

                End If

                Dim sel As dsVorgaenge._buchvorgang_artikelRow = selected.Row()
                Dim newE As dsVorgaenge._buchvorgang_artikelRow = Nothing ' = BuchvorgangartikelBindingSourceSplit.AddNew().Row
                If BuchvorgangartikelBindingSourceSplit.Current IsNot Nothing AndAlso
                      BuchvorgangartikelBindingSourceSplit.Current("ArtNr") = sel.ArtNr Then
                    newE = BuchvorgangartikelBindingSourceSplit.Current.Row
                End If

                If newE Is Nothing Then
                    newE = BuchvorgangartikelBindingSourceSplit.AddNew().Row
                    newE.ID = NexPostId(DsVorgaengeSplit)
                    newE.Typ = VorgangSplit.Typ
                    newE.Nummer = VorgangSplit.Nummer
                    newE.Stk = 0
                    newE.ArtNr = sel.ArtNr
                    newE.Bezeichnung = sel.Bezeichnung
                End If

                newE.Stk += 1
                If Not sel.IsStatusNull Then
                    newE.Status = sel.Status 'damit kein Auftrag mehr gedruckt wird
                End If
                If Not sel.IsPackungNull Then
                    newE.Packung = sel.Packung
                End If
                newE.Preis_Netto = sel.Preis_Netto
                newE.MWST = sel.MWST
                newE.Preis_Brutto = sel.Preis_Brutto
                newE.MWSTSatz = sel.MWSTSatz
                VorgangSplit.SummeBrutto += sel.Preis_Brutto
                sel.Stk -= 1
                If sel.Stk <= 0 Then
                    BuchvorgangartikelBindingSource.RemoveCurrent()
                End If
            End If
            DataGridViewVorgangPositionenSplit.Refresh()
            DataGridViewVorgangPositionenSplit.Update()
            ControlsStatus()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub UcZahlungsmethoden1_ZahlungsmethodeAusgewaehlt(Methode As String)
        If VorgangSplit IsNot Nothing Then
            VorgangSplit.ZahlungsMethode = Methode
        End If
    End Sub

    Private Sub BezahltMitBankomat(amount As Decimal)
        WriteLog($"BezahltMitBankomat {amount}")
        If VorgangSplit IsNot Nothing Then
            VorgangSplit.Bezahlt = True
            VorgangSplit.ZahlungsMethode = "Sumup"
            ButtonAbschliessen_Click(Nothing, Nothing)
        End If
    End Sub

    Private Function NexPostId(ds As dsVorgaenge) As Integer
        Dim id = 1
        For Each r As dsVorgaenge._buchvorgang_artikelRow In ds._buchvorgang_artikel.Rows
            Try
                If r.ID >= id Then
                    id = r.ID + 1
                End If
            Catch ex As Exception
                'Ignore
            End Try
        Next
        Return id
    End Function

    Private Sub ButtonBack_Click(sender As Object, e As EventArgs) Handles ButtonBack.Click
        Try
            Dim selected = BuchvorgangartikelBindingSourceSplit.Current
            If selected IsNot Nothing Then

                Dim sel As dsVorgaenge._buchvorgang_artikelRow = selected.Row()
                Dim newE As dsVorgaenge._buchvorgang_artikelRow = Nothing ' = BuchvorgangartikelBindingSourceSplit.AddNew().Row
                If BuchvorgangartikelBindingSource.Current IsNot Nothing AndAlso BuchvorgangartikelBindingSource.Current("ArtNr") = sel.ArtNr Then
                    newE = BuchvorgangartikelBindingSource.Current.Row
                End If
                If newE Is Nothing Then
                    newE = BuchvorgangartikelBindingSource.AddNew().Row
                    newE.Stk = 0
                End If
                VorgangSplit.SummeBrutto -= sel.Preis_Brutto
                newE.ID = NexPostId(DsVorgaenge)
                newE.Typ = Vorgang.Typ
                newE.Nummer = Vorgang.Nummer
                newE.ArtNr = sel.ArtNr
                newE.Bezeichnung = sel.Bezeichnung
                newE.Stk += 1
                newE.Preis_Netto = sel.Preis_Netto
                newE.MWST = sel.MWST
                newE.MWSTSatz = sel.MWSTSatz
                newE.Preis_Brutto = sel.Preis_Brutto
                sel.Stk -= 1
                If sel.Stk <= 0 Then
                    BuchvorgangartikelBindingSourceSplit.RemoveCurrent()
                End If

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


    ''' <summary>
    ''' Ein Neuer Vorgang vom Typ Starten 
    ''' </summary>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="KundNr"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function BeginNewVorgang(VorgangTyp As String, KundNr As Integer, woher As String) As dsVorgaenge.buchvorgangRow
        Try

            Dim vorgangRow As dsVorgaenge.buchvorgangRow = BuchvorgangBindingSourceSplit.AddNew().Row
            vorgangRow.KundNr = KundNr
            vorgangRow.Typ = VorgangTyp
            vorgangRow.Nummer = intrasell.vorgang.GetNewVorgangNummer(VorgangTyp, KundNr)
            vorgangRow.Datum = Date.Now
            vorgangRow.MitarbeiterNr = MitarbeiterID
            vorgangRow.Woher = woher
            If Not String.IsNullOrEmpty(UcZahlungsmethoden1.Zahlungsmethode) Then
                vorgangRow.ZahlungsMethode = UcZahlungsmethoden1.Zahlungsmethode
            End If
            'folgende 3 zeilen damit die rows in artikel die parent typ und nummer übernehmen.
            Validate()
            BuchvorgangBindingSourceSplit.EndEdit()
            BuchvorgangartikelBindingSourceSplit.EndEdit()
            Return vorgangRow
        Catch ex As Exception
            HandleAppError(ex)
        End Try
        Return Nothing
    End Function


    Public Function LadeVorgangIntern(VorgangTyp As String, KundNr As Integer) As dsVorgaenge.buchvorgangRow
        Try
            Dim cmd As New MySqlCommand("select nummer from buchVorgang where Typ=@VorgangTyp  and KundNr=@KundNr and abgeschlossen=0 and datum>=@Datum order by datum desc")
            cmd.Parameters.AddWithValue("VorgangTyp", VorgangTyp)
            cmd.Parameters.AddWithValue("KundNr", KundNr)
            cmd.Parameters.AddWithValue("Datum", Today)

            Dim VorgangNummer = FirstRow(cmd)

            If IsNumeric(VorgangNummer) Then

                DsVorgaengeSplit._buchvorgang_artikel.Clear()
                DsVorgaengeSplit.buchvorgang.Clear()

                BuchvorgangTableAdapter.FillByNummer(DsVorgaengeSplit.buchvorgang, VorgangTyp, VorgangNummer)
                Buchvorgang_artikelTableAdapter.FillByNummer(DsVorgaengeSplit._buchvorgang_artikel, VorgangTyp, VorgangNummer)


                'folgende 3 zeilen damit die rows in artikel die parent typ und nummer übernehmen.
                Validate()
                BuchvorgangBindingSourceSplit.EndEdit()
                BuchvorgangartikelBindingSourceSplit.EndEdit()
                Return DsVorgaengeSplit.buchvorgang.Rows(0)
            End If

        Catch ex As Exception
            HandleAppError(ex)
        End Try
        Return Nothing
    End Function

    Private Sub ButtonAbschliessen_Click(sender As Object, e As EventArgs) Handles ButtonAbschliessen.Click
        Try
            If VorgangSplit Is Nothing Then Return
            CurrentDB.Close()
            CurrentDB.Open()
            Dim Transaction As MySqlTransaction = CurrentDB.BeginTransaction()

            BuchvorgangBindingSource.EndEdit()
            BuchvorgangartikelBindingSource.EndEdit()

            BuchvorgangBindingSourceSplit.EndEdit()
            BuchvorgangartikelBindingSourceSplit.EndEdit()

            BuchvorgangTableAdapter.Update(DsVorgaenge)
            Buchvorgang_artikelTableAdapter.Update(DsVorgaenge)

            BuchvorgangTableAdapter.Update(DsVorgaengeSplit)
            Buchvorgang_artikelTableAdapter.Update(DsVorgaengeSplit)

            Transaction.Commit()

            Dim form = New VorgangBar
            form.LadeVorgangNummer(VorgangSplit.Typ, VorgangSplit.Nummer)
            form.Visible = False
            BerechneVorgangSummen(form.GetVorgang())
            If TischVerschieben Then
                form.Close()
                SetSummeVorgang(VorgangSplit.Typ, VorgangSplit.Nummer)
            Else
                form.Abschliessen()
                form.Close()
            End If

            SetSummeVorgang(Vorgang.Typ, Vorgang.Nummer)

            UpdateVorgangPreview()

            DsVorgaengeSplit._buchvorgang_artikel.Clear()
            DsVorgaengeSplit.buchvorgang.Clear()
            VorgangSplit = Nothing

            If TischVerschieben Then
                CType(Parent, Form).Close()
            End If
            'nicht schliessen .. weiter splitten erlaubt
            ' 
            If DataGridViewVorgangPositionen.RowCount = 0 Then
                'Auftrag löschen 
                If Vorgang.Typ = VorgangTypen.AU Then
                    'VorgangStorno(Vorgang.Typ, Vorgang.Nummer, silent:=True)
                    SetAbgeschlossen(Vorgang.Typ, Vorgang.Nummer)
                End If
                CType(Parent, Form).Close()
            End If
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub ButtonAbbrechen_Click(sender As Object, e As EventArgs) Handles ButtonAbbrechen.Click
        Try
            If Vorgang IsNot Nothing Then
                SetSummeVorgang(Vorgang.Typ, Vorgang.Nummer)
            End If
            VorgangSplit = Nothing
            CType(Parent, Form).Close()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub AdressenControl1_IDNRChanged(IDNR As Integer) Handles AdressenControl1.IDNRChanged
        Try
            If Not Geladen Then
                Return
            End If

            If TischVerschieben Then

                Dim gleicherKundeAusgewehlt = Vorgang.KundNr = IDNR
                If gleicherKundeAusgewehlt Then
                    ShowUserMessage("Bitten anderen Tisch wählen!", "Tisch", MsgBoxStyle.Information, False)
                    Return
                End If


                ButtonAbschliessen.Text = "Positionen auf Tisch verschieben"

                DsVorgaengeSplit._buchvorgang_artikel.Clear()
                DsVorgaengeSplit.buchvorgang.Clear()

                LadeVorgangIntern(VorgangTypen.AU, IDNR)
                ControlsStatus()
            End If

        Catch ex As Exception
            'Ignore
        End Try

    End Sub

    Private Sub ControlsStatus()
        Try

            ButtonAbschliessen.Enabled = False
            If VorgangSplit IsNot Nothing Then
                If VorgangSplit._Getbuchvorgang_artikelRows.Any Then
                    ButtonAbschliessen.Enabled = True
                End If
                If DataGridViewVorgangPositionenSplit.RowCount > 1 Then
                    ButtonAbschliessen.Enabled = True
                End If
            End If

            AdressenControl1.Enabled = TischVerschieben
            Dim positionGewaehlt As Boolean = BuchvorgangartikelBindingSource.Current IsNot Nothing
            ButtonSplit.Enabled = positionGewaehlt AndAlso ((TischVerschieben AndAlso AdressenControl1.IDNR > 0) Or Not TischVerschieben)

            Dim positionenBackGeawehlt As Boolean = BuchvorgangartikelBindingSourceSplit.Current IsNot Nothing
            ButtonBack.Enabled = positionenBackGeawehlt

            Bankomat1.Visible = VorgangSplit IsNot Nothing AndAlso VorgangSplit.SummeBrutto > 0
            If VorgangSplit IsNot Nothing Then
                If Bankomat1.Amount <> VorgangSplit.SummeBrutto Then
                    Bankomat1.Amount = VorgangSplit.SummeBrutto
                    Bankomat1.Load()
                End If
                Me.TextBoxSumme.Text = VorgangSplit.SummeBrutto.ToString("C")
            Else
                Me.TextBoxSumme.Text = ""
            End If
        Catch ex As Exception
            'ignore
        End Try
    End Sub



    Private Sub BuchvorgangartikelBindingSourceSplit_ListChanged(sender As Object, e As System.ComponentModel.ListChangedEventArgs) Handles BuchvorgangartikelBindingSourceSplit.ListChanged
        ControlsStatus()
    End Sub

    Private Sub DataGridViewVorgangPositionen_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridViewVorgangPositionen.SelectionChanged
        ControlsStatus()
    End Sub

    Private Sub trinkGeld100_Click(sender As Object, e As EventArgs) Handles trinkGeld100.Click
        TrinkgeldHinzufügen(1.0)
    End Sub


    Private Sub trinkGeld050_Click(sender As Object, e As EventArgs) Handles trinkGeld050.Click
        TrinkgeldHinzufügen(0.5)
    End Sub

    Private Sub trinkGeld010_Click(sender As Object, e As EventArgs) Handles trinkGeld010.Click
        TrinkgeldHinzufügen(0.1)
    End Sub

    Private Sub trinkGeld010Minus_Click(sender As Object, e As EventArgs) Handles trinkGeld010Minus.Click
        TrinkgeldHinzufügen(-0.1)
    End Sub

    Private Sub TrinkgeldHinzufügen(trinkgeld As Decimal)
        Try
            AdressenControl1.Enabled = False
            Dim sourceVorgang = LadeVorgang(Vorgang.Typ, Vorgang.Nummer)
            If sourceVorgang.Abgeschlossen Then
                MsgBox("Vorgang bereits abgeschlossen!")
                Return
            End If

            If VorgangSplit Is Nothing Then
                Return
            End If

            Dim artNrTrinkgeld = ImportArtikel.ImportArtikel("IntrSell", "Trinkgeld", "Trinkgeld", "Trinkgeld", 1, 1, 0, ProduktAktiv:=True, ProduktAktivOnline:=True)

            Dim newE As dsVorgaenge._buchvorgang_artikelRow = Nothing

            If BuchvorgangartikelBindingSourceSplit.Current IsNot Nothing AndAlso
                  BuchvorgangartikelBindingSourceSplit.Current("ArtNr") = artNrTrinkgeld Then
                newE = BuchvorgangartikelBindingSourceSplit.Current.Row
            End If

            If newE Is Nothing Then
                newE = BuchvorgangartikelBindingSourceSplit.AddNew().Row
                newE.ID = NexPostId(DsVorgaengeSplit)
                newE.Typ = VorgangSplit.Typ
                newE.Nummer = VorgangSplit.Nummer
                newE.Stk = 1
                newE.ArtNr = artNrTrinkgeld
                newE.Bezeichnung = "Trinkgeld"
                newE.Preis_Netto = 0
                newE.Preis_Brutto = 0
            End If

            newE.Preis_Netto += trinkgeld
            newE.MWST = 0
            newE.Preis_Brutto += trinkgeld
            newE.MWSTSatz = 0
            VorgangSplit.SummeBrutto += trinkgeld

            DataGridViewVorgangPositionenSplit.Refresh()
            DataGridViewVorgangPositionenSplit.Update()
            ControlsStatus()
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

End Class
