Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient

Public Class AbstractVorgangBar
    Inherits AbstractVorgangForm
    Implements InterfacePrintable

    Friend BARRECHNUNG_NUR_BRUTTO_PREISE As Boolean
    Friend BARRECHNUNG_DEAKTIVIERE_RABATT As Boolean
    Friend BARRECHNUNG_DEAKTIVIERE_KUNDE As Boolean
    Friend BARRECHNUNG_DEAKTIVIERE_MITARBEITER As Boolean
    Friend BARRECHNUNG_KASSA_SIMPEL As Boolean = False
    Private localeSettings As New ClassSettings

#Region "Events"
    Public Event NeuerVorgang()
#End Region

    Dim activationDone = False

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub AbstractVorgangBar_Activated(sender As Object, e As EventArgs) Handles Me.Activated
        Try
            If Not activationDone Then
                activationDone = True
                LadenBase()
                LadeCustomerDisplay()

            End If

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

    Public Sub LadenBase()
        Try
            Silent = VarValue_Default(BARRECHNUNG_SILENT, "true")
            BARRECHNUNG_KASSA_SIMPEL = VarValue_Default(Variablen.BARRECHNUNG_KASSA_SIMPEL, "false")
            BARRECHNUNG_KEINE_EINGABE_BAR_GEGEBEN = VarValue_Default(Variablen.BARRECHNUNG_KEINE_EINGABE_BAR_GEGEBEN, "true")
            BARRECHNUNG_NUR_BRUTTO_PREISE = VarValue_Default(Variablen.BARRECHNUNG_NUR_BRUTTO_PREISE, "false")
            BARRECHNUNG_DEAKTIVIERE_RABATT = VarValue_Default(Variablen.BARRECHNUNG_DEAKTIVIERE_RABATT, "false")
            BARRECHNUNG_DEAKTIVIERE_KUNDE = VarValue_Default(Variablen.BARRECHNUNG_DEAKTIVIERE_KUNDE, "false")
            BARRECHNUNG_DEAKTIVIERE_MITARBEITER = VarValue_Default(Variablen.BARRECHNUNG_DEAKTIVIERE_MITARBEITER, "false")

            KundNr = GetBarrechnungKundNr()
            Loading = True
            ds = DsVorgaenge
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

    Public Sub LadeCustomerDisplay()
        Try 'Customer Display 
            If ExistsVarValue(CUSTOMER_DISPLAY_TYP) Then
                Dim typ = VarValue(CUSTOMER_DISPLAY_TYP)
                If typ IsNot Nothing Then
                    If typ.Contains("Orderman") Then
                        Dim custDisplay As New CustomerDisplayOrderman
                        custDisplay.SetVorgangBar(Me)
                    ElseIf typ.Contains("IntraSell") Then
                        Dim custDisplay As New CustomerDisplayIntraSell
                        custDisplay.SetVorgangBar(Me)
                    Else
                        Dim custDisplay As New CustomerDisplayJARLTECH
                        custDisplay.SetVorgangBar(Me)
                    End If
                End If
            End If
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub Storno(vorgangInBear As VorgangInBearbeitung, silent As Boolean)
        If vorgangInBear Is Nothing Then
            StornoLetzterVorgang(silent)
        Else
            If vorgangInBear.Nummer <> GetVorgang().Nummer OrElse vorgangInBear.Typ <> GetVorgang().Typ Then
                MsgBox("Es ist Vorgang mit der Nummer " & GetVorgang().Nummer & " geladen. Abbruch!", vbInformation)
            Else
                StornoGeladenerVorgang(silent)
            End If
        End If
    End Sub
    ''' <summary>
    ''' Storno aktueller vorgang
    ''' </summary>
    ''' <remarks></remarks>
    Sub StornoGeladenerVorgang(silent As Boolean)
        Try
            Dim vorgang As dsVorgaenge.buchvorgangRow = GetVorgang()
            Dim stornoVorgangNr As String = Nothing

            If VorgangStorno(vorgang.Typ, vorgang.Nummer, silent:=silent, stornoVorgangNummer:=stornoVorgangNr) Then
                If Not IsNull(stornoVorgangNr) Then
                    VorgangDrucken(vorgang.Typ, stornoVorgangNr, isUeberleitung:=True, showPreview:=VarValue_Default(PRINT_AM_BILDSCHIRM, False))
                    GetVorgang.Ausgedruckt = True
                End If
                RaiseEventSetButtonsEvent(True)
                Close()
            End If
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    ''' <summary>
    ''' Es wird nur die letzte Position storniert
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub StornoLetzterVorgang(silent As Boolean)
        Try
            Cursor.Current = Cursors.WaitCursor

            Dim cmd As New MySqlCommand("select Nummer from buchVorgang where Typ='AR' and abgeschlossen <> 0 and datum > DATE_ADD(CURRENT_TIMESTAMP, INTERVAL -1 DAY)  order by datum desc limit 1")
            Dim nummer = FirstRow(cmd)
            If nummer Is Nothing Then
                'Keine Rechnung heute gedruckt
                If Not silent Then
                    MsgBox("Es gibt keine abgeschlossene Rechnung heute!")
                End If
            Else
                Dim cmd1 As New MySqlCommand("select SummeBrutto from buchVorgang where Typ='AR' and abgeschlossen <> 0 and datum > DATE_ADD(CURRENT_TIMESTAMP, INTERVAL -1 DAY)  order by datum desc limit 1")
                Dim summe = FirstRow(cmd1)

                If silent Then
                    LadeVorgangNummer(VorgangTypen.AR, Nummer:=nummer)
                    StornoGeladenerVorgang(silent)
                ElseIf MsgBox(String.Format("Wollen Sie den letzten abgeschlossenen Beleg mit der Nr.: {0} mit {1} stornieren?", nummer, summe), vbYesNo) = vbYes Then
                    LadeVorgangNummer(VorgangTypen.AR, Nummer:=nummer)
                    StornoGeladenerVorgang(silent)
                End If
            End If

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

#Region "Touch"
    Public touch As TouchErfassung = Nothing

    Private Sub ButtonTouch_Click(sender As Object, e As EventArgs) Handles ButtonTouch.Click
        ShowTouch()
    End Sub

    Sub StartNeuenVorgang()
        WriteLog("StartNeuenVorgang Silent " & Silent)
        If Silent Then
            BeginNewVorgang(VorgangTypen.AU, KundNr)
        Else
            If MsgBox("Wollen Sie einen neuen Vorgang starten?", vbYesNo) = vbYes Then
                BeginNewVorgang(VorgangTypen.AU, KundNr)
            Else
                Exit Sub
            End If
        End If
        Dim current = GetVorgang()
        If current.IsMitarbeiterNrNull Then
            current.MitarbeiterNr = MitarbeiterID
        End If
        UpdateTouch()
    End Sub

    Sub ShowTouch(Optional starteNeuenVorgang As Boolean = False)
        Try
            WriteLog("ShowTouch " & starteNeuenVorgang)
            If touch IsNot Nothing Then
                UpdateTouchVorgang()
                Return
            End If

            touch = New TouchErfassung
            If starteNeuenVorgang Or IsNothing(BuchvorgangBindingSource.Current) Then
                StartNeuenVorgang()
            End If
            If Not IsNothing(BuchvorgangBindingSource.Current) Then
                UpdateTouchVorgang()

                Controls.Clear()
                Controls.Add(touch)
                touch.Dock = DockStyle.Fill

                UnregisterTouch()
                RegisterTouch()
            End If
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Sub UpdateTouchVorgang()

        Dim current As dsVorgaenge.buchvorgangRow = BuchvorgangBindingSource.Current.row
        touch.Vorgang = New VorgangInBearbeitung(current)
        WriteLog("UpdateTouchVorgang " & touch.Vorgang.ToString)
        touch.UpdateVorgangPreview()
        touch.BringToFront()
    End Sub

    Sub VorgangInfo1(content As String)
        touch.VorgangInfo(content)
    End Sub


    ''' <summary>
    ''' Wird aufgerufen wenn eine Rechnung abgeschlossen wird. 
    ''' </summary>
    ''' <param name="Vorgang"></param>
    ''' <remarks></remarks>
    Private Sub KassaAbschliessen(Vorgang As VorgangInBearbeitung)
        Try
            Dim v = GetVorgang()
            If v.IsSummeNull Then
                Exit Sub
            End If
            If v.IsZahlungsMethodeNull Then
                v.ZahlungsMethode = "Bar"
            End If
            v.GegebenBar = Vorgang.GegebenBar
            SetGegebenBar(v)
            Abschliessen()
            'bereits gemacht in Abschliessen
            Dim neuerVorgangGestartet As Boolean = VarValue_Default(RECHNUNG_BAR_NACH_ABSCHLIESSEN_NEU, "false")
            If Not neuerVorgangGestartet Then
                StartNeuenVorgang()
            End If
            UpdateTouch()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Public Sub Abschliessen()
        Try
            Cursor.Current = Cursors.WaitCursor
            Dim vorgang = GetVorgang()
            If vorgang.IsZahlungsMethodeNull Then
                vorgang.ZahlungsMethode = "Bar"
            End If
            SaveEdits()

            If vorgang.Abgeschlossen Then
                Cursor.Current = Cursors.Default
                Exit Sub
            End If

            VorgangAbschliessenEinreihen(vorgang.Typ, vorgang.Nummer, silent:=Silent, pruefeGegebenBar:=Not BARRECHNUNG_KEINE_EINGABE_BAR_GEGEBEN)
            RaiseEventSetButtonsEvent(True)

            LadeVorgang(vorgang.Typ, vorgang.Nummer)
            LadeVorgangNummer(vorgang.Typ, vorgang.Nummer)

            If VarValue_Default(RECHNUNG_BAR_NACH_ABSCHLIESSEN_NEU, "false") Then
                BeginNewVorgang(VorgangTyp:=VorgangTypen.AR, KundNr:=KundNr)
            End If
        Catch ex As Exception
            If ex.Message.Contains("SpeicherExistiertNicht") Then
                If MsgBox("Die Registrierkasse ist noch nicht vollständig initialisiert. Möchten Sie die Initialisierung jetzt vornehmen?", vbYesNo) = vbYes Then
                    KassaVerwaltung(MdiParent)
                End If
            End If
            HandleAppError(ex)
        Finally
            Cursor.Current = Cursors.Default
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>


    Private Sub ButtonSchliessen_Click(sender As Object, e As EventArgs) Handles ButtonSchliessenBar.Click
        Close()
    End Sub

    Private Sub FormGeschlossen(sender As Object, e As EventArgs)
        Try
            'DELETE Vorgangsnummer falls letzte und keine Positionen 
            LoescheLetzteNichtBenutzteNummer(VorgangTypen.AU)
            LoescheLetzteNichtBenutzteNummer(VorgangTypen.AR)
        Catch
        End Try

        Try
            Me.Controls.Remove(Me.MenuStripRegKasse)
            Me.MenuStripRegKasse.Dispose()
            Me.MenuStripRegKasse = Nothing

            Me.localeSettings = Nothing
            Me.DsVorgaenge = Nothing

            UnregisterTouch()
            If touch IsNot Nothing Then
                Me.Controls.Clear()
                touch.Dispose()
                touch = Nothing
            End If

            RemoveHandler MyBase.Verlassen, AddressOf Form_Verlassen

            Me.MdiParent = Nothing
            Me.Close()
            Me.Dispose(True)
        Catch
        End Try
    End Sub


    Private Sub RegisterTouch()
        If touch IsNot Nothing Then
            AddHandler touch.ArtikelErfasst, AddressOf ArtikelErfasst
            AddHandler touch.ArtikelRabatt, AddressOf ArtikelRabatt
            AddHandler touch.RechnungRabatt, AddressOf RechnungRabatt
            AddHandler touch.ArtikelEntfernt, AddressOf ArtikelEntfernt
            AddHandler touch.KassaAbschliessen, AddressOf KassaAbschliessen
            AddHandler touch.FormGeschlossen, AddressOf FormGeschlossen
            AddHandler touch.Ausschuss, AddressOf VorgangAusschuss
            AddHandler touch.DruckLetzterBeleg, AddressOf DruckLetzterBeleg
            AddHandler touch.DruckAktuellerBeleg, AddressOf DruckAktuellerBeleg
            AddHandler touch.Zustellung, AddressOf Zustellung
            AddHandler touch.KundeGeaendert, AddressOf KundeGeaendert
            AddHandler touch.AuftragKueche, AddressOf AuftragKueche
            AddHandler touch.Storno, AddressOf Storno
            AddHandler VorgangInfo, AddressOf VorgangInfo1
            AddHandler touch.BezahltMitBankomat, AddressOf BezahltMitBankomat
            AddHandler touch.BezahltMitZahlungsmethode, AddressOf BezahltMitZahlungsmethode
            AddHandler touch.VorgangParken, AddressOf VorgangParken
            AddHandler touch.ArtikelPreisGeaendert, AddressOf ArtikelPreisGeaendert
            AddHandler touch.DruckMonatsBeleg, AddressOf DruckMonatsBeleg
            AddHandler touch.BelegSenden, AddressOf BelegSenden
        End If
    End Sub



    Private Sub UnregisterTouch()
        Try
            If touch IsNot Nothing Then
                RemoveHandler touch.ArtikelErfasst, AddressOf ArtikelErfasst
                RemoveHandler touch.ArtikelRabatt, AddressOf ArtikelRabatt
                RemoveHandler touch.RechnungRabatt, AddressOf RechnungRabatt
                RemoveHandler touch.ArtikelEntfernt, AddressOf ArtikelEntfernt
                RemoveHandler touch.KassaAbschliessen, AddressOf KassaAbschliessen
                RemoveHandler touch.FormGeschlossen, AddressOf FormGeschlossen
                RemoveHandler touch.Ausschuss, AddressOf VorgangAusschuss
                RemoveHandler touch.DruckLetzterBeleg, AddressOf DruckLetzterBeleg
                RemoveHandler touch.DruckAktuellerBeleg, AddressOf DruckAktuellerBeleg
                RemoveHandler touch.KundeGeaendert, AddressOf KundeGeaendert
                RemoveHandler touch.Zustellung, AddressOf Zustellung
                RemoveHandler touch.AuftragKueche, AddressOf AuftragKueche
                RemoveHandler touch.Storno, AddressOf Storno
                RemoveHandler VorgangInfo, AddressOf VorgangInfo1
                RemoveHandler touch.BezahltMitBankomat, AddressOf BezahltMitBankomat
                RemoveHandler touch.BezahltMitZahlungsmethode, AddressOf BezahltMitZahlungsmethode
                RemoveHandler touch.VorgangParken, AddressOf VorgangParken
                RemoveHandler touch.ArtikelPreisGeaendert, AddressOf ArtikelPreisGeaendert
                RemoveHandler touch.DruckMonatsBeleg, AddressOf DruckMonatsBeleg
                RemoveHandler touch.BelegSenden, AddressOf BelegSenden
            End If
        Catch ex As Exception
        End Try
    End Sub

#End Region

    Private Sub ButtonEinstellungen_Click(sender As Object, e As EventArgs) Handles ButtonEinstellungen.Click
        Try
            Einstellungen.ShowDialog()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub BezahltMitBankomat()
        Try
            BezahltMitZahlungsmethode("Bankomat")
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub BezahltMitZahlungsmethode(methode As String)
        Try
            Dim v = GetVorgang()
            If v Is Nothing Then
                Throw New Exception("Vorgang nicht vorhanden!")
            End If
            v.ZahlungsMethode = methode
            v.GegebenBar = 0
            v.Restgeld = 0
            'Vorgang abschliessen
            Abschliessen()
            StartNeuenVorgang()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

#Region "RegKassa"
    Private Sub VerwaltungToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles VerwaltungToolStripMenuItem.Click
        Try
            KassaVerwaltung(MdiParent)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub DruckeMonatsbelegToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DruckeMonatsbelegToolStripMenuItem.Click
        DruckMonatsBeleg()
    End Sub
#End Region

    Private Sub VorgangParken(vorgang As VorgangInBearbeitung)
        Try
            Dim v = GetVorgang()
            If v Is Nothing Then
                Throw New Exception("Vorgang nicht vorhanden!")
            End If
            ModuleBuchVorgang.VorgangParken(vorgang, VorgangTypen.AU)

            DsVorgaenge.Clear()
            StartNeuenVorgang()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub UpdateTouch()
        Dim current = GetVorgang()
        If touch IsNot Nothing Then
            touch.Vorgang = New VorgangInBearbeitung(current)
            touch.UpdateVorgangPreview()
            'Artikel in Ausgangsposition 
            touch.LadeTopArtikel()
        End If
    End Sub

    Private Sub HTMLDruckToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HTMLDruckToolStripMenuItem.Click
        Try
            HTMLPrint()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub AbstractVorgangBar_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub EinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EinstellungenToolStripMenuItem.Click
        Try
            Einstellungen.ShowDialog()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

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

    Private Sub BelegSenden(vorgang As VorgangInBearbeitung)
        Try
            HTMLPrint_PDF_Mailform()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="BelegSenden", Silent:=True)
        End Try
    End Sub

    Private Sub VorgangPerEmailSendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles VorgangPerEmailSendenToolStripMenuItem.Click
        Try
            HTMLPrint_PDF_Mailform()
        Catch ex As Exception
            HandleAppError(ex, Hilfe:="BelegSenden", Silent:=True)
        End Try
    End Sub
End Class