'Zu viele Fehler
'Option Strict On

Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient

Module ModuleLager

    Dim LagerInfoCache As New Dictionary(Of Integer, String)



    Public Function maxBestand(real1 As Double, real2 As Double) As Double
        maxBestand = real2
        If real1 > real2 Then
            maxBestand = real1
        End If
    End Function

    ''' <summary>
    ''' Liefert die Lagermenge in allen Läger, wenn Artikel Lagerartikel
    ''' </summary>
    ''' <param name="ArtNr"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetLagerBestandArtikel(ArtNr As Integer) As Double
        'Debug.Print("GetLagerBestandArtikel " & ArtNr)
        Try
            If IsNull(ArtNr) Then
                GetLagerBestandArtikel = 0 : Exit Function
            End If

            Dim sql As String
            sql = "select sum(lb.lagerbestand) as lB from `grArtikel-Lagerbestand` lb, grArtikel a  where lb.ArtNr = a.ArtNr and a.Lagerartikel<>0 and lb.ArtNr = @ArtNr"
            Dim cmd = New MySqlCommand(sql)
            cmd.Parameters.AddWithValue("ArtNr", ArtNr)

            Dim LagerBestand = FirstRow(cmd)
            If IsNumeric(LagerBestand) Then
                Return LagerBestand
            End If
            Return 0

        Catch ex As Exception
            GetLagerBestandArtikel = Nothing
            HandleAppError(ex, "GetLagerBestandArtikel", Silent:=True)
        End Try
    End Function

    Public Function GetLagerInfoArtikel(ArtNr As Integer) As String
        Debug.Print("GetLagerInfoArtikel " & ArtNr)

        Try
            If IsNull(ArtNr) Then
                GetLagerInfoArtikel = Nothing : Exit Function
            End If

            If LagerInfoCache.ContainsKey(ArtNr) Then
                Return LagerInfoCache(ArtNr)
            End If

            Dim sql As String = "select Bezeichnung1 as Lagerinfo from grArtikel a  where  a.Lagerartikel and a.ArtNr = @ArtNr"
            Dim cmd = New MySqlCommand(sql)
            cmd.Parameters.AddWithValue("ArtNr", ArtNr)
            cmd.Connection = New MySqlConnection
            cmd.Connection.ConnectionString = CurrentDB.ConnectionString

            Dim Lagerinfo = FirstRow(cmd)
            If IsDBNull(Lagerinfo) Then
                GetLagerInfoArtikel = Nothing
            Else
                GetLagerInfoArtikel = CStr(Lagerinfo)
                LagerInfoCache.Add(ArtNr, CStr(Lagerinfo))
            End If

            cmd.Connection.Close()
        Catch ex As Exception
            GetLagerInfoArtikel = Nothing
            HandleAppError(ex, "GetLagerInfoArtikel", Silent:=True)
        End Try
    End Function


    ''' <summary>
    ''' Liefert die Lagermenge in bestimmten Lager an bestimmten Datum
    ''' </summary>
    ''' <param name="ArtNr"></param>
    ''' <param name="LagerOrt"></param>
    ''' <param name="Datum"></param>
    ''' <param name="ergebnisSpalte"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetLagerBestandArtikelAnDatum( _
      ArtNr As Object, _
      LagerOrt As String, _
      Datum As Date, _
      ergebnisSpalte As String) As Double

        If IsNull(ArtNr) Then
            getLagerBestandArtikelAnDatum = 0 : Exit Function
        End If
        Dim sql As String
        sql = "select a." & ergebnisSpalte & " as lB from " & _
        " (SELECT   Sum([Eingang]-[Ausgang]) AS Bestand, Sum([grartikel-lagerbewegung].LagerKosten) AS LagerKosten, " & _
        " Sum([grartikel-lagerbewegung].Einheiten*iif(Ausgang>0,-1,1)) AS Einheiten, " & _
        " Sum([grartikel-lagerbewegung].GewichtBrutto*iif(Ausgang>0,-1,1)) AS GewichtBrutto, " & _
        " Sum([grartikel-lagerbewegung].GewichtNetto*iif(Ausgang>0,-1,1)) AS GewichtNetto, " & _
        " Sum([grartikel-lagerbewegung].GewichtTara*iif(Ausgang>0,-1,1)) AS GewichtTara " & _
        " FROM [grartikel-lagerbewegung] " & _
        " where ArtNR = @ArtNr and LagerOrt = @LagerOrt And Datum < @Datum" & _
        " GROUP BY  ArtNr,  Lagerort) a  "

        Dim cmd As New MySqlCommand(sql)
        cmd.Parameters.AddWithValue("ArtNr", ArtNr)
        cmd.Parameters.AddWithValue("LagerOrt", LagerOrt)
        cmd.Parameters.AddWithValue("Datum", Datum)
        Dim res = FirstRow(cmd)

        If IsNumeric(res) Then
            getLagerBestandArtikelAnDatum = CDbl(res)
        Else
            getLagerBestandArtikelAnDatum = 0 'egal ' wird nicht lagerbestand geführt
        End If

    End Function

    ''' <summary>
    ''' Liefert Einstandpreis pro Artikel, ohne Lagerberücksichtigung! nur Lagereingänge!
    ''' </summary>
    ''' <param name="ArtNr"></param>
    ''' <param name="LagerOrt"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetEinstandsPreis(ArtNr As Integer, Optional LagerOrt As Integer = 0) As Decimal
        If Not IsNumeric(ArtNr) Then
            GetEinstandsPreis = 0
            Exit Function
        End If

        'Methode I nur nach Lager Eingänge!
        GetEinstandsPreis = CDec(intrasell.preise.GetEKPreis(ArtNr))

        Dim Sql = "SELECT ArtNr, " &
        " Sum(( CASE [Eingang] WHEN 0 THEN 1 ELSE [Eingang] END  * [PreisEingang]-[Ausgang]*[PreisAusgang]))/Sum([Eingang]-[Ausgang]) AS DurchschnEKPreis, " &
        " Sum(([Eingang]*[PreisEingang]))/Sum([Eingang]) AS DurchschnEKPreisNurEK, " &
        " Sum([Eingang]-[Ausgang]) AS Bestand , " &
        " Sum([Eingang]) AS BestandNurEK " &
        " FROM [grArtikel-LagerBewegung] " &
        " WHERE VorgangsTyp='LE' AND ArtNr = " & ArtNr

        If LagerOrt <> 0 Then
            Sql = Sql & " AND LagerOrt = " & LagerOrt
        End If

        Sql += " GROUP BY ArtNr"

        WriteDebug(Sql)
        Dim rs = OpenRecordsetInMemory(Sql)
        If rs.Rows.Count > 0 Then
            If IsNull(rs.Rows(0)("Bestand")) Then
                GetEinstandsPreis = 0
            Else
                If rs.Rows(0)("Bestand") <= 0 Then
                    'If rs("BestandNurEK") > 0 Then
                    '    getEinstandsPreis = RoundUp(rs("DurchschnEKPreisNurEK"), 2)
                    'End If
                Else
                    If IsNull(rs.Rows(0)("DurchschnEKPreis")) Then
                        GetEinstandsPreis = 0
                    Else
                        GetEinstandsPreis = RoundUp(rs.Rows(0)("DurchschnEKPreis"), 2)
                    End If
                End If
            End If
        End If
    End Function


    ' erstellt eine Nachricht ja nachdem vorgangTyp
    Function CheckVorgangForWarnings(VorgangTyp As String, VorgangNummer As String) As String
        Dim sql As String
        If VorgangTyp = VorgangTypen.LI Or VorgangTyp = VorgangTypen.AU Then
            sql = "select abgeschlossen from buchVorgang where typ='" & VorgangTyp & "' and nummer=" & VorgangNummer
            Dim abgeschlossen As Boolean = FirstRow(sql)

            If abgeschlossen Then
                Return "Abgeschlossen"
                Exit Function
            End If

            If Not CheckIfVorgangLagerBestandOK(VorgangTyp, VorgangNummer) Then
                Return "Lagerbest fehlt"
            Else
                Return "Lagerbest OK"
            End If
        End If
        Return ""
    End Function

    'prüft ob der lagerbestand ist genug um den auftrag zu akzeptieren
    Function CheckIfVorgangLagerBestandOK(Vorgangtyp As String, VorgangNummer As String) As Boolean
        Dim sql As String = "SELECT [buchAuftrag-Artikel].RechNr FROM [buchAuftrag-Artikel] WHERE RechNr=" & VorgangNummer & " AND (getlagerbestandartikel([ArtNr])-[Stk])<0"
        Dim RechNr = FirstRow(sql)
        CheckIfVorgangLagerBestandOK = RechNr = Nothing
    End Function

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="ArtNr"></param>
    ''' <param name="LieferantNr"></param>
    ''' <param name="EKPreis"></param>
    ''' <param name="Bezeichnung"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function MakeLieferantenPreis(ArtNr As Integer, LieferantNr As Integer, EKPreis As Decimal, Optional Bezeichnung As Object = "")
        makeLieferantenPreis = True
        Err.Clear()
        If LieferantNr < 1 Then Exit Function
        Dim cmd = New MySqlCommand("select PreisId FROM `lieferantenArtikel-Preise` where ArtikelNr=@ArtNr AND LieferantNr = @LieferantNr")
        cmd.Parameters.AddWithValue("ArtNr", ArtNr)
        cmd.Parameters.AddWithValue("LieferantNr", LieferantNr)
        Dim PreisId = FirstRow(cmd)
        If Not IsNumeric(PreisId) Then ' add new
            Dim newPreisId As Long = NextId("[lieferantenArtikel-Preise]", "PreisID")
            cmd = New MySqlCommand("insert into [lieferantenArtikel-Preise] (PreisId, ArtikelNr, LieferantNR, EKPreis, Bezeichnung) " & _
            " values (@PreisId, @ArtNr, @LieferantNr, @EKPreis, @Bezeichnung)")
            cmd.Parameters.AddWithValue("PreisID", newPreisId)
            cmd.Parameters.AddWithValue("ArtNr", ArtNr)
            cmd.Parameters.AddWithValue("LieferantNr", LieferantNr)
            cmd.Parameters.AddWithValue("EKPreis", EKPreis)
            cmd.Parameters.AddWithValue("Bezeichnung", Bezeichnung)
        Else ' update
            cmd = New MySqlCommand("update [lieferantenArtikel-Preise] set EKPreis=@EKPreis where PreisId=@PreisId")
            cmd.Parameters.AddWithValue("EKPreis", EKPreis)
            cmd.Parameters.AddWithValue("PreisID", PreisId)
        End If
        RunSQL(cmd)
    End Function

    Public Function GetLagerort(LagerNr As Integer) As String
        Dim cmd = New MySqlCommand("select Lagerort FROM `grartikel-lagerort` WHERE LagerNr=@LagerNr")
        cmd.Parameters.AddWithValue("LagerNr", LagerNr)
        Return CStr(FirstRow(cmd))
    End Function

    Private Function GetStandardLagerort(VorgangTyp As String, VorgangNummer As Integer) As Integer
        Dim cmd = New MySqlCommand("select LagerNr FROM buchVorgang v LEFT JOIN mandant ON v.MandantNr = mandant.IDNR where Typ=@Typ and Nummer=@VorgangNummer")
        cmd.Parameters.AddWithValue("Typ", VorgangTyp)
        cmd.Parameters.AddWithValue("VorgangNummer", VorgangNummer)
        Dim mandantLagerOrt = FirstRow(cmd)
        If IsNumeric(mandantLagerOrt) Then
            Return mandantLagerOrt
        End If
        Return FirstRow("select min(LagerNr) from `grArtikel-Lagerort`")
    End Function

    Public Function LagerortAnlegen(lagerOrtName As String) As Integer
        Dim existsLagerNr = FirstRow("select LagerNr from `grartikel-lagerort` where Lagerort = '" & lagerOrtName & "'")
        If IsNumeric(existsLagerNr) Then
            Return existsLagerNr
        Else
            Dim nId = NextId("`grartikel-lagerort`", "LagerNr")
            RunSQL("insert into `grartikel-lagerort` (LagerNr, Lagerort) Values (" & nId & ",'" & lagerOrtName & "')")
            Return nId
        End If
    End Function

End Module
