Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Database Imports DigitalData.Modules.Language Public Class WinLineInfo Inherits Base Private Database As MSSQLServer Private Config As Config Public Accounts As New List(Of Account) Public Mandators As New List(Of Mandator) Public Years As List(Of Integer) Public Const V21_ARTICLENUMBER = "c011" Public Const V50_ACCOUNTNUMBER = "c002" Public Class Account Public Property Id As String Public Property Name As String Public Property Mandator As String Public Overrides Function ToString() As String Return $"{Name} ({Id})" End Function End Class Public Class Mandator Public Property Id As String Public Property Name As String Public Property Database As String Public Property Server As String Public Property Regex As String Public Property Order As Integer Public Property IsWhitelisted As Boolean Public Overrides Function ToString() As String Return $"{Name} ({Id})" End Function End Class Public Sub New(pLogConfig As LogConfig, pDatabase As MSSQLServer, pConfig As Config) MyBase.New(pLogConfig, pLogConfig.GetLogger()) Database = pDatabase Config = pConfig End Sub Public Function GetWinLineYear(pYear As Integer) Return (pYear - 1900) * 12 End Function Public Function GetWinLineYear() Return GetWinLineYear(Config.GetYear) End Function Public Sub LoadAccounts(pMandator As Mandator) Dim oSQL = $"SELECT [c002], [c003] FROM [{pMandator.Server}].[{pMandator.Database}].[dbo].[v005] WHERE c139 IS NULL" Dim oTable = Database.GetDatatable(oSQL) For Each oRow As DataRow In oTable.Rows Accounts.Add(New Account With { .Id = oRow.Item("c002"), .Name = oRow.Item("c003"), .Mandator = pMandator.Id }) Next End Sub Public Sub LoadMandators() Dim oSQL = "SELECT [c000], [c003], [c004] FROM [cwlsystem].[dbo].[T001SRV] (NOLOCK)" Dim oTable = Database.GetDatatable(oSQL) Mandators.Clear() For Each oRow As DataRow In oTable.Rows Dim oDbInfo = SplitConnectionInfo(oRow) Dim oMandator = New Mandator With { .Id = oRow.Item("c000"), .Name = oRow.Item("c003"), .Database = oDbInfo.Item1, .Server = oDbInfo.Item2 } Dim oMandatorConfig As Config.Mandator = Config.Mandators. Where(Function(m) oMandator.Id = m.Name). SingleOrDefault() If oMandatorConfig IsNot Nothing Then oMandator.IsWhitelisted = True oMandator.Regex = oMandatorConfig.ArticleRegex oMandator.Order = oMandatorConfig.Order End If Mandators.Add(oMandator) Next End Sub Public Sub LoadEconomicYears() Dim oCurrentYear = Now.Year Dim oRange As IEnumerable(Of Integer) = Enumerable.Range(oCurrentYear - 10, 12).ToList() Years = oRange End Sub Public Function TryGetAccountNumber(pGLN As String, pMandator As Mandator) As String Try Dim oYear As Integer = GetWinLineYear() Dim oSQL = $" SELECT [c002], -- Kundennummer [c003] -- Kundenname FROM [{pMandator.Database}].[dbo].[v050] WHERE [c004] = 2 -- Was für ein Konto?? AND [c260] = {pGLN} AND [mesocomp] = '{pMandator.Id}' and [mesoyear] = {oYear}" Dim oTable As DataTable = Database.GetDatatable(oSQL) ' GLN not found in this Mandator, continue to next one If oTable.Rows.Count = 0 Then Logger.Debug("GLN [{0}] was not found in Mandator: [{1}]", pGLN, pMandator.Id) Return Nothing End If ' Duplicate GLN, exit and do nothing about this number If oTable.Rows.Count > 1 Then Logger.Warn("GLN [{0}] was found more than once in Mandator: [{1}]", pGLN, pMandator.Id) Return Nothing End If Dim oRow As DataRow = oTable.Rows.Item(0) Dim oArticleNumber As String = Utils.NotNull(oRow.Item(V50_ACCOUNTNUMBER), String.Empty) Return oArticleNumber Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function Public Function TryGetArticleNumber(pEAN As String, pMandator As Mandator) As String Try Dim oYear As Integer = GetWinLineYear() Dim oSQL As String = $" SELECT [c011], -- Artikelnummer [c003], -- Artikelbezeichnung [c075], -- EAN-Nummer [c123] -- Ersatzartikelnummer FROM [{pMandator.Database}].[dbo].[v021] WHERE [c075] = '{pEAN}' AND [mesocomp] = '{pMandator.Id}' AND [mesoyear] = {oYear}" Dim oTable As DataTable = Database.GetDatatable(oSQL) ' EAN not found in this Mandator, continue to next one If oTable.Rows.Count = 0 Then Logger.Debug("EAN [{0}] was not found in Mandator: [{1}]", pEAN, pMandator.Id) Return Nothing End If ' Duplicate EAN, exit and do nothing about this number If oTable.Rows.Count > 1 Then Logger.Warn("EAN [{0}] was found more than once", pEAN) Return Nothing End If Dim oRow As DataRow = oTable.Rows.Item(0) Dim oArticleNumber As String = Utils.NotNull(oRow.Item(V21_ARTICLENUMBER), String.Empty) Return oArticleNumber Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function ''' ''' Turns a database info like "CWLDATEN on SERVER\INSTANCE" into a Tuple of two strings ''' ''' ''' Private Function SplitConnectionInfo(pRow As DataRow) As Tuple(Of String, String) Dim oDbInfo = pRow.Item("c004").ToString() Dim oSplittedInfo = SplitAtString(oDbInfo.ToUpper, "ON") Dim oServer = oSplittedInfo.Item(1).Trim() Dim oDatabase = oSplittedInfo.Item(0).Trim() If oDatabase.StartsWith("SQL") Then oDatabase = oDatabase.Remove(0, 3) End If Return New Tuple(Of String, String)(oDatabase, oServer) End Function Private Function SplitAtString(pStringToSplit As String, pDelimiter As String) As List(Of String) Dim oDelimiter As String() = New String(0) {pDelimiter} Return pStringToSplit. Split(oDelimiter, StringSplitOptions.None). ToList() End Function End Class