Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient

Module ModuleBuchVorgangUI


    ''' <summary>
    ''' Eine Sammelrechnung für Firma Arfaian Erstellen
    ''' eine neue Rechnung erstellen
    ''' die position einfügen
    ''' </summary>
    ''' <param name="mandantNr"></param>
    ''' <param name="KundNr"></param>
    ''' <param name="RechnungsNummern"></param>
    ''' <remarks></remarks>
    Public Sub SammelRechnungErstellen(mandantNr As Integer, KundNr As Integer, ByRef VorgangTyp As String, ByRef RechnungsNummern As List(Of dsVorgaenge.buchVorgangListeRow))
        Try
            Dim Nummer As String = Nothing

            If MsgBox(Messages.ModuleBuchVorgangUI_Sammelrechnung_erstellen, vbYesNo) = vbYes Then
                Nummer = SammelRechnungErstellenTransaktion(mandantNr, KundNr, VorgangTyp, RechnungsNummern)

                If Nummer IsNot Nothing Then
                    Dim msg = String.Format(Messages.ModuleBuchVorgangUI_Sammelrechnung_erstellt, Nummer)
                    MsgBox(msg, vbInformation)
                    OeffneVorgangByNummerUndBerechne(Nummer)
                End If
            End If

        Catch ex As Exception
            HandleAppError(ex)
        End Try

    End Sub

    ''' <summary>
    ''' die Rechnung öffnen und Preise berechnen
    ''' </summary>
    ''' <param name="Nummer"></param>
    ''' <remarks></remarks>
    Sub OeffneVorgangByNummerUndBerechne(Nummer As Integer)
        Dim vorgangForm = OeffneVorgangByNummer(VorgangTypen.AR, Nummer)
        vorgangForm.BerechneVorgang()
    End Sub

    Function AlsStringListe(ByRef RechnungsNummern As List(Of dsVorgaenge.buchVorgangListeRow))
        Dim list As String = "-1"
        For Each v In RechnungsNummern
            list += ", " & v.Nummer
        Next
        Return list
    End Function


    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="MandantNr">Wenn MandantNr=-1 dann wird nicht geprüft</param>
    ''' <param name="KundNr"></param>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="RechnungsNummern"></param>
    ''' <returns></returns>
    Function SammelRechnungErstellenTransaktion(MandantNr As Integer, KundNr As Integer, ByRef VorgangTyp As String, ByRef RechnungsNummern As List(Of dsVorgaenge.buchVorgangListeRow)) As Integer
        Dim mandant = Nothing
        If (MandantNr <> -1) Then
            mandant = FirstRow("select mandant from ofAdressen where idnr=" & KundNr)
            If Not IsNumeric(mandant) Then
                Dim msg = String.Format(Messages.ModuleBuchVorgangUI_Kunde_Mandant_nicht_definiert, KundNr)
                Throw New Exception(msg)
            End If
            If mandant = MandantNr Then
                Throw New Exception(Messages.ModuleBuchVorgangUI_Kunde_Mandant)
            End If
        End If

        If CurrentDB.State <> ConnectionState.Open Then
            CurrentDB.Open()
        Else
            CurrentDB.Close()
            CurrentDB.Open()
        End If

        Dim tr = CurrentDB.BeginTransaction
        Dim RechnungsNummernListe = AlsStringListe(RechnungsNummern)
        Try
            Dim Nummer = intrasell.vorgang.GetNewVorgangNummer(VorgangTypen.AR, KundNr)
            Dim notiz As String = String.Format(Messages.ModuleBuchVorgangUI_Sammelrechnung_Notiz, MandantNr, KundNr)
            Dim sql As String
            Dim cmd = New MySqlCommand("Insert into buchVorgang (Typ, Nummer, KundNr, Datum , Bezahlt, Ausgedruckt, Abgeschlossen, MandantNr, Notiz) " &
            " values('AR', @Nummer, @KundNr, now(), 0, 0, 0, @Mandant, @Notiz)")
            cmd.Parameters.AddWithValue("Nummer", Nummer)
            cmd.Parameters.AddWithValue("KundNr", KundNr)
            cmd.Parameters.AddWithValue("Mandant", mandant)
            cmd.Parameters.AddWithValue("Notiz", notiz)
            RunSQL(cmd)

            'die Positionen einfügen
            sql = $"Insert into [buchVorgang-Artikel] (Typ, Nummer,  ArtNr,  Stk,  Bezeichnung, Preis_Netto,  MWST, MWSTSatz, Preis_Brutto,  ArtikelIdentifikation,  EKPreis)  
               SELECT  'AR', {Nummer}, ra.ArtNr, sum(ra.Stk), min(ra.Bezeichnung), 0, 0, 0, ra.MWSTSatz, min(ra.ArtikelIdentifikation), 0 
               FROM (select * from buchVorgang where Typ ='{VorgangTyp}' and Nummer in ({RechnungsNummernListe}))  AS recsource INNER JOIN [buchVorgang-artikel] AS ra ON recsource.typ = ra.Typ and recsource.Nummer = ra.Nummer  
               GROUP BY ra.ArtNr"

            RunSQL(sql)

            tr.Commit()
            CurrentDB.Close()
            Return Nummer
        Catch ex As Exception
            tr.Rollback()
            Throw ex
        End Try
        Return Nothing
    End Function

End Module
