Imports System.Text.RegularExpressions Imports DevExpress.XtraReports Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Imports MultiTool.Common.Documents Imports MultiTool.Common.Documents.DocumentRow Imports MultiTool.Common.Report Imports MultiTool.Common.Templates Imports MultiTool.Common.Winline.Entities Public Class ReportGenerator(Of TReport As IReport) Inherits BaseClass Private ReadOnly TemplateConfig As TemplateConfig Private ReadOnly GeneralConfig As GeneralConfig Private ReadOnly Patterns As Patterns Private ReadOnly FileEx As DigitalData.Modules.Filesystem.File Public Sub New(pLogConfig As LogConfig, pDatabase As MSSQLServer, pTemplateConfig As TemplateConfig, pGeneralConfig As GeneralConfig) MyBase.New(pLogConfig) Database = pDatabase GeneralConfig = pGeneralConfig TemplateConfig = pTemplateConfig Patterns = New Patterns(pLogConfig, pGeneralConfig) FileEx = New DigitalData.Modules.Filesystem.File(LogConfig) End Sub Public Function GetReportFilePath(pDocument As Document, pTemplate As Template) Dim oFinalDirectory = FileEx.CreateDateDirectory(pTemplate.OutputReportDirectory) Dim oFileName = FileEx.GetFilenameWithSuffix(IO.Path.GetFileNameWithoutExtension(pDocument.File.Name), FileEx.GetDateTimeString, "pdf") Dim oFilePath As String = IO.Path.Combine(oFinalDirectory, oFileName) Return oFilePath End Function Public Function GenerateReport(pDocument As Document, pTemplate As Template) As ReportResult(Of TReport) Dim oFilePath = GetReportFilePath(pDocument, pTemplate) Dim oMapperConfig As New Mapper(LogConfig) Dim oHeadMapper = oMapperConfig.GetMapper(Of ReportHead)(New Dictionary(Of String, String) From { {"Fakt_Kontoname", "Text1"}, {"Fakt_Kontonummer[Final]", "Text2"}, {"Auftrags-Bestellnummer", "Text3"}, {"Datum_Auftrag-Bestellung", "Text4"}, {"Bestellt_von", "Text5"} }) Dim oPositionMapper = oMapperConfig.GetMapper(Of ReportPosition)(New Dictionary(Of String, String) From { {"Artikelnummer", "Text1"}, {"Positionstext", "Text2"}, {"Bezeichnung", "Text3"}, {"Menge_bestellt", "Text4"}, {"Menge_geliefert", "Text5"}, {"Colli", "Text6"}, {"Einzelpreis[Original]", "Text7"}, {"Einzelpreis[Final]", "Text8"}, {"EinheitProPalette", "Text9"}, {"Lagerstand", "Text10"} }) pDocument = FillFieldValuesFromSQL(pDocument, TemplateConfig.SqlItems, oFilePath) Dim oHeadRow = pDocument.Rows. Where(Function(r) r.TableName.EndsWith("T025")). Select(Function(r) r.Fields). FirstOrDefault() Dim oPositionRows = pDocument.Rows. Where(Function(r) r.TableName.EndsWith("T026")). ToList() Dim oReportHead = oHeadMapper.Map(Of Dictionary(Of String, FieldValue), ReportHead)(oHeadRow) oReportHead.Title = pTemplate.Name oReportHead.Subtitle = "Schaum" oReportHead.Filename = pDocument.FileName Dim oReportPositions As New List(Of ReportPosition) Dim oCounter = 1 For Each oRow As DocumentRow In oPositionRows Dim oReportPosition As ReportPosition = oPositionMapper.Map(Of Dictionary(Of String, FieldValue), ReportPosition)(oRow.Fields) oReportPosition.Id = oCounter oReportPositions.Add(oReportPosition) oCounter += 1 Next Dim oReportSource As New ReportSource With { .Head = oReportHead, .Positions = oReportPositions } Dim oReport = Activator.CreateInstance(GetType(TReport)) Dim oDataSource = New DevExpress.DataAccess.ObjectBinding.ObjectDataSource With { .DataSource = oReportSource } oDataSource.Fill() oReport.DataSource = oDataSource Dim oResult = New ReportResult(Of TReport) With { .Report = oReport, .FileName = oFilePath } Return oResult End Function Private Function FillFieldValuesFromSQL(pDocument As Document, pSQLConfig As List(Of FieldConfig), pReportFileName As String) As Document For Each oSQLConfigItem In pSQLConfig ' FieldList is a list of fields that will be changed ' Example: Setting SQL for Article StorageLocation will invoke the sql for each row Dim oRowList = pDocument.Rows. Where(Function(row) row.Fields.Any(Function(field) field.Key = oSQLConfigItem.Name)). ToList() For Each oRow As DocumentRow In oRowList For Each oFunction In oSQLConfigItem.Functions Dim oSQL = oFunction.Params Dim oField = oRow.Fields. Where(Function(field) field.Key = oSQLConfigItem.Name). SingleOrDefault() oSQL = Patterns.ReplaceForImportFinalSQL(pDocument, pReportFileName, oSQL) Dim oValue = Database.GetScalarValue(oSQL) If oValue IsNot Nothing Then oField.Value.SetExternalValue(oValue) End If Next Next Next Return pDocument End Function Public Structure ReportResult(Of T) Public Report As T Public FileName As String End Structure End Class