202 lines
6.9 KiB
VB.net
202 lines
6.9 KiB
VB.net
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
|
|
|
|
''' <summary>
|
|
''' Turns a database info like "CWLDATEN on SERVER\INSTANCE" into a Tuple of two strings
|
|
''' </summary>
|
|
''' <param name="pRow"></param>
|
|
''' <returns></returns>
|
|
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
|