216 lines
8.7 KiB
VB.net

Imports System.ComponentModel
Imports System.IO
Imports System.Timers
Imports DigitalData.Modules.Config
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Interfaces
Imports DigitalData.Modules.Jobs
Imports DigitalData.Modules.Logging
Public Class ThreadRunner
Private WithEvents _workerThread As BackgroundWorker
Private WithEvents _workerTimer As Timer
Private ReadOnly _config As ConfigManager(Of Config)
Private ReadOnly _logConfig As LogConfig
Private ReadOnly _logger As Logger
Private ReadOnly _jobArguments As WorkerArgs
Private ReadOnly _mssql As MSSQLServer
Private BusyCounter As Integer = 0
Public Sub New(LogConfig As LogConfig, ConfigManager As ConfigManager(Of Config), MSSQL As MSSQLServer)
_logConfig = LogConfig
_logger = _logConfig.GetLogger()
_config = ConfigManager
_mssql = MSSQL
Try
Dim directory As New IO.DirectoryInfo(_logConfig.LogDirectory)
For Each file As IO.FileInfo In directory.GetFiles
If (Now - file.CreationTime).Days > 29 Then
file.Delete()
Else
Exit For
End If
Next
Catch ex As Exception
End Try
Dim oArgs As New WorkerArgs With {
.ExceptionEmailAddress = _config.Config.ExceptionEmailAddress,
.IgnoreRejectionStatus = _config.Config.Custom.IgnoreRejectionStatus,
.MaxAttachmentSizeInMegaBytes = _config.Config.Custom.MaxAttachmentSizeInMegaBytes,
.MinFileAgeInMinutes = _config.Config.Custom.MinFileAgeInMinutes,
.NamePortal = _config.Config.PORTAL_NAME,
.EmailOutProfileId = _config.Config.MSSQLEmailOutAccountID,
.AllowFacturX = _config.Config.Custom.AllowFacturX,
.AllowXRechnung = _config.Config.Custom.AllowXRechnung,
.AllowZugferd10 = _config.Config.Custom.AllowZugferd10,
.AllowZugferd2x = _config.Config.Custom.AllowZugferd2x,
.AllowZugferd23x = _config.Config.Custom.AllowZugferd23x,
.AllowPeppolBISBill3x = _config.Config.Custom.AllowPeppolBISBill3x,
.RejectionTemplateId = _config.Config.Custom.RejectionTemplateId,
.GDPictureVersion = _config.Config.Custom.GDPictureVersion
}
oArgs = LoadFolderConfig(oArgs)
oArgs = LoadPropertyMapListFor(oArgs)
_logger.Debug("Custom Options:")
_logger.Debug("ExceptionEmailAddress: [{0}]", oArgs.ExceptionEmailAddress)
_logger.Debug("IgnoreRejectionStatus: [{0}]", oArgs.IgnoreRejectionStatus)
_logger.Debug("MaxAttachmentSizeInMegaBytes: [{0}]", oArgs.MaxAttachmentSizeInMegaBytes)
_logger.Debug("MinFileAgeInMinutes: [{0}]", oArgs.MinFileAgeInMinutes)
_logger.Debug("RejectionTemplateId: [{0}]", oArgs.RejectionTemplateId)
_logger.Debug("GDPictureVersion: [{0}]", oArgs.GDPictureVersion)
_jobArguments = oArgs
_logger.Debug("Checking SuccessDirectory [{0}]", oArgs.SuccessDirectory)
If Not Directory.Exists(oArgs.SuccessDirectory) Then
_logger.Warn("SuccessDirectory [{0}] does not exist!", oArgs.SuccessDirectory)
End If
_logger.Debug("Checking ErrorDirectory [{0}]", oArgs.ErrorDirectory)
If Not Directory.Exists(oArgs.ErrorDirectory) Then
_logger.Warn("ErrorDirectory [{0}] does not exist!", oArgs.ErrorDirectory)
End If
_logger.Debug("Checking Original Email Directory [{0}]", oArgs.OriginalEmailDirectory)
If Not Directory.Exists(oArgs.OriginalEmailDirectory) Then
_logger.Warn("OriginalEmailDirectory [{0}] does not exist!", oArgs.OriginalEmailDirectory)
End If
_logger.Debug("Checking Rejected Email Directory [{0}]", oArgs.RejectedEmailDirectory)
If Not Directory.Exists(oArgs.RejectedEmailDirectory) Then
_logger.Warn("RejectedEmailDirectory [{0}] does not exist!", oArgs.RejectedEmailDirectory)
End If
_logger.Debug("Checking Non ZUGFeRD Directory [{0}]", oArgs.NonZugferdDirectory)
If Not Directory.Exists(oArgs.NonZugferdDirectory) Then
_logger.Warn("NonZugferdDirectory [{0}] does not exist!", oArgs.NonZugferdDirectory)
End If
_logger.Debug("Checking Watch Directory [{0}]", oArgs.WatchDirectory)
If Not Directory.Exists(oArgs.WatchDirectory) Then
_logger.Warn("WatchDirectory [{0}] does not exist!", oArgs.WatchDirectory)
End If
_logger.Debug("Checking Exception Email Adress [{0}]", oArgs.ExceptionEmailAddress)
If oArgs.ExceptionEmailAddress = String.Empty Then
_logger.Warn("ExceptionEmailAddress [{0}] is not set!", oArgs.ExceptionEmailAddress)
End If
_workerThread = New BackgroundWorker() With {
.WorkerReportsProgress = False,
.WorkerSupportsCancellation = True
}
_workerTimer = New Timer()
End Sub
Public Sub Start(Interval As Integer)
_workerTimer.Interval = Interval * 1000
_workerTimer.Start()
_logger.Debug("ThreadRunner started with {0}s Interval.", Interval)
End Sub
Public Sub [Stop]()
Try
If _workerThread.IsBusy Then
_workerThread.CancelAsync()
_logger.Debug("Worker cancelled.")
End If
_workerTimer.Stop()
_logger.Debug("ThreadRunner stopped.")
Catch ex As Exception
_logger.Error(ex)
End Try
End Sub
Private Sub TimerElapsed(sender As Object, e As ElapsedEventArgs) Handles _workerTimer.Elapsed
If Not _workerThread.IsBusy Then
BusyCounter = 0
_workerThread.RunWorkerAsync(_jobArguments)
Else
BusyCounter = +1
_logger.Info("Worker is busy, skipping execution. Tried for [{0}] times.", BusyCounter)
End If
End Sub
Private Sub DoWork(sender As Object, e As DoWorkEventArgs) Handles _workerThread.DoWork
Try
Dim oArgs As WorkerArgs = e.Argument
_logger.Debug("Background worker running..")
Dim oJob As New ImportZUGFeRDFiles(_logConfig, _mssql)
oJob.Start(oArgs)
Catch ex As Exception
_logger.Warn("Background worker failed!")
_logger.Error(ex)
End Try
End Sub
Private Sub WorkCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles _workerThread.RunWorkerCompleted
_logger.Debug("Background worker completed!")
End Sub
Private Function LoadFolderConfig(pArgs As WorkerArgs) As WorkerArgs
pArgs.WatchDirectory = _config.Config.WatchDirectory
pArgs.SuccessDirectory = _config.Config.SuccessDirectory
pArgs.ErrorDirectory = _config.Config.ErrorDirectory
pArgs.OriginalEmailDirectory = _config.Config.OriginalEmailDirectory
pArgs.RejectedEmailDirectory = _config.Config.RejectedEmailDirectory
pArgs.AttachmentsSubDirectory = _config.Config.AttachmentsSubDirectory
pArgs.NonZugferdDirectory = _config.Config.NonZugferdDirectory
Return pArgs
End Function
Private Function LoadPropertyMapListFor(Args As WorkerArgs) As WorkerArgs
Try
Args.PropertyMapList.Clear()
Dim oSQL As String = $"SELECT * FROM TBDD_ZUGFERD_XML_ITEMS WHERE ACTIVE = 1 ORDER BY XML_PATH"
Dim oResult As DataTable = _mssql.GetDatatable(oSQL)
For Each oRow As DataRow In oResult.Rows
Dim xmlPath As String = oRow.Item("XML_PATH")
Dim tableName = oRow.Item("TABLE_NAME")
Dim tableColumn = oRow.Item("TABLE_COLUMN")
Dim description = oRow.Item("DESCRIPTION")
Dim isRequired = oRow.Item("IS_REQUIRED")
Dim isGrouped = oRow.Item("IS_GROUPED")
Dim groupScope = oRow.Item("GROUP_SCOPE")
Dim specification = oRow.Item("SPECIFICATION")
Dim oItemType = oRow.Item("ITEM_TYPE")
Dim oEN16931_ID = oRow.Item("EN16931_ID")
Args.PropertyMapList.Add(New XmlItemProperty() With {
.XMLPath = xmlPath,
.Description = description,
.TableName = tableName,
.TableColumn = tableColumn,
.IsRequired = isRequired,
.IsGrouped = isGrouped,
.GroupScope = groupScope,
.Specification = specification,
.ItemType = oItemType,
.EN16931_ID = oEN16931_ID
})
Next
Return Args
Catch ex As Exception
_logger.Error(ex)
Return Args
End Try
End Function
End Class