Added import for EnvelopeGenerator.Domain.Interfaces. Updated logic to send final emails to receivers only if the envelope requires "Read and Sign," adding an extra check to the email dispatch condition.
515 lines
22 KiB
VB.net
515 lines
22 KiB
VB.net
Imports DigitalData.Modules.Database
|
|
Imports DigitalData.Modules.Logging
|
|
Imports DigitalData.Modules.Base
|
|
Imports GdPicture14
|
|
Imports Quartz
|
|
Imports System.Security.Cryptography
|
|
Imports System.IO
|
|
Imports EnvelopeGenerator.CommonServices.Jobs.FinalizeDocument.FinalizeDocumentExceptions
|
|
Imports EnvelopeGenerator.CommonServices.Jobs.FinalizeDocument
|
|
Imports EnvelopeGenerator.Domain.Constants
|
|
Imports DevExpress.DataProcessing
|
|
Imports System.Data.SqlClient
|
|
Imports EnvelopeGenerator.Domain.Entities
|
|
Imports DigitalData.Core.Abstraction.Application
|
|
Imports EnvelopeGenerator.Infrastructure
|
|
Imports Microsoft.EntityFrameworkCore
|
|
Imports DigitalData.Core.Abstractions
|
|
Imports EnvelopeGenerator.Domain.Interfaces
|
|
|
|
Namespace Jobs
|
|
Public Class FinalizeDocumentJob
|
|
Implements IJob
|
|
|
|
Private ReadOnly LicenseManager As New LicenseManager()
|
|
Private GdViewer As GdViewer
|
|
|
|
Private LogConfig As LogConfig
|
|
Private Logger As Logger
|
|
Private Database As MSSQLServer
|
|
Private Config As DbConfig
|
|
|
|
Private ConfigModel As ConfigModel
|
|
Private EnvelopeModel As EnvelopeModel
|
|
Private ReportModel As ReportModel
|
|
|
|
Private ActionService As ActionService
|
|
|
|
Private PDFBurner As PDFBurner
|
|
Private PDFMerger As PDFMerger
|
|
Private ReportCreator As ReportCreator
|
|
|
|
Private ReadOnly CompleteWaitTime As Integer = 1
|
|
Private ParentFolderUID As String = ""
|
|
Private myTempFiles As TempFiles
|
|
|
|
Private Class EnvelopeData
|
|
Public EnvelopeId As Integer
|
|
Public EnvelopeUUID As String
|
|
Public DocumentPath As String
|
|
Public AnnotationData As List(Of String)
|
|
Public DocAsByte As Byte()
|
|
|
|
End Class
|
|
|
|
Public Function Execute(pContext As IJobExecutionContext) As Task Implements IJob.Execute
|
|
Dim oGdPictureKey As String = pContext.MergedJobDataMap.Item(Value.GDPICTURE)
|
|
LogConfig = pContext.MergedJobDataMap.Item(Value.LOGCONFIG)
|
|
Logger = LogConfig.GetLogger()
|
|
myTempFiles = New TempFiles(LogConfig)
|
|
myTempFiles.Create()
|
|
Dim JobId = pContext.JobDetail.Key
|
|
Logger.Debug("Starting job {0}", JobId)
|
|
|
|
Try
|
|
Logger.Debug("Loading GdViewer..")
|
|
GdViewer = New GdViewer()
|
|
LicenseManager.RegisterKEY(oGdPictureKey)
|
|
|
|
Logger.Debug("Loading Database..")
|
|
Dim oConnectionString As String = pContext.MergedJobDataMap.Item(Value.DATABASE)
|
|
Database = New MSSQLServer(LogConfig, MSSQLServer.DecryptConnectionString(oConnectionString))
|
|
|
|
#Disable Warning BC40000 ' Type or member is obsolete
|
|
Factory.Shared _
|
|
.BehaveOnPostBuild(PostBuildBehavior.Ignore) _
|
|
.AddEnvelopeGeneratorInfrastructureServices(
|
|
Sub(opt)
|
|
opt.AddDbTriggerParams(
|
|
Sub(triggers)
|
|
triggers("Envelope") = New List(Of String) From {"TBSIG_ENVELOPE_AFT_INS"}
|
|
triggers("History") = New List(Of String) From {"TBSIG_ENVELOPE_HISTORY_AFT_INS"}
|
|
triggers("EmailOut") = New List(Of String) From {"TBEMLP_EMAIL_OUT_AFT_INS", "TBEMLP_EMAIL_OUT_AFT_UPD"}
|
|
triggers("EnvelopeReceiverReadOnly") = New List(Of String) From {"TBSIG_ENVELOPE_RECEIVER_READ_ONLY_UPD"}
|
|
triggers("Receiver") = New List(Of String)() ' no tigger
|
|
triggers("EmailTemplate") = New List(Of String) From {"TBSIG_EMAIL_TEMPLATE_AFT_UPD"}
|
|
End Sub)
|
|
opt.AddDbContext(
|
|
Sub(options)
|
|
options.UseSqlServer(oConnectionString) _
|
|
.EnableSensitiveDataLogging() _
|
|
.EnableDetailedErrors()
|
|
End Sub)
|
|
End Sub)
|
|
#Enable Warning BC40000 ' Type or member is obsolete
|
|
|
|
Logger.Debug("Loading Models & Services")
|
|
Dim oState = GetState()
|
|
InitializeModels(oState)
|
|
|
|
Logger.Debug("Loading Configuration..")
|
|
Config = ConfigModel.LoadConfiguration()
|
|
oState.DbConfig = Config
|
|
|
|
InitializeServices(oState)
|
|
|
|
Logger.Debug("Loading PDFBurner..")
|
|
Dim pdfBurnerParams As PDFBurnerParams = pContext.MergedJobDataMap.Item(Value.PDF_BURNER_PARAMS)
|
|
PDFBurner = New PDFBurner(LogConfig, oGdPictureKey, pdfBurnerParams)
|
|
|
|
Logger.Debug("Loading PDFMerger..")
|
|
PDFMerger = New PDFMerger(LogConfig, oGdPictureKey)
|
|
|
|
Logger.Debug("Loading ReportCreator..")
|
|
ReportCreator = New ReportCreator(LogConfig, oState)
|
|
|
|
Config.DocumentPath = Config.DocumentPath
|
|
|
|
Logger.Debug("DocumentPath: [{0}]", Config.DocumentPath)
|
|
|
|
|
|
Logger.Debug("ExportPath: [{0}]", Config.ExportPath)
|
|
|
|
Dim oCompleteStatus As Integer = EnvelopeStatus.EnvelopeCompletelySigned
|
|
Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE WHERE STATUS = {oCompleteStatus} AND DATEDIFF(minute, CHANGED_WHEN, GETDATE()) >= {CompleteWaitTime} ORDER BY GUID"
|
|
Dim oTable = Database.GetDatatable(oSql)
|
|
|
|
Dim oEnvelopeIds As List(Of Integer) = oTable.Rows.Cast(Of DataRow).
|
|
Select(Function(r) r.Item("GUID")).
|
|
Cast(Of Integer).
|
|
ToList()
|
|
|
|
If oEnvelopeIds.Count > 0 Then
|
|
Logger.Info("Found [{0}] completed envelopes.", oEnvelopeIds.Count)
|
|
End If
|
|
|
|
Dim oTotal As Integer = oEnvelopeIds.Count
|
|
Dim oCurrent As Integer = 1
|
|
|
|
For Each oId In oEnvelopeIds
|
|
Logger.Info("Finalizing Envelope [{0}] ({1}/{2})", oId, oCurrent, oTotal)
|
|
Try
|
|
Dim oEnvelope = EnvelopeModel.GetById(oId)
|
|
If oEnvelope Is Nothing Then
|
|
Logger.Warn("Envelope could not be loaded for Id [{0}]!", oId)
|
|
Throw New ArgumentNullException("EnvelopeData")
|
|
End If
|
|
Logger.Debug("Loading Envelope Data..")
|
|
Dim oEnvelopeData = GetEnvelopeData(oId)
|
|
|
|
If oEnvelopeData Is Nothing Then
|
|
Logger.Warn("EnvelopeData could not be loaded for Id [{0}]!", oId)
|
|
Throw New ArgumentNullException("EnvelopeData")
|
|
End If
|
|
Logger.Debug("Burning Annotations to pdf ...")
|
|
Dim oBurnedDocument As Byte() = BurnAnnotationsToPdf(oEnvelopeData)
|
|
If oBurnedDocument Is Nothing Then
|
|
Logger.Warn("Document could not be finalized!")
|
|
Throw New ApplicationException("Document could not be finalized")
|
|
End If
|
|
|
|
If ActionService.CreateReport(oEnvelope) = False Then
|
|
Logger.Warn("Document Report could not be created!")
|
|
Throw New ApplicationException("Document Report could not be created")
|
|
End If
|
|
|
|
Logger.Debug("Creating report..")
|
|
Dim oReport As Byte() = ReportCreator.CreateReport(oEnvelope)
|
|
Logger.Debug("Report created!")
|
|
|
|
Logger.Debug("Merging documents ...")
|
|
Dim oMergedDocument As Byte() = PDFMerger.MergeDocuments(oBurnedDocument, oReport)
|
|
Logger.Debug("Documents merged!")
|
|
|
|
Dim oOutputDirectoryPath = Path.Combine(Config.ExportPath, ParentFolderUID)
|
|
Logger.Debug($"oOutputDirectoryPath is {oOutputDirectoryPath}")
|
|
If Not Directory.Exists(oOutputDirectoryPath) Then
|
|
Logger.Debug($"Directory not existing. Creating ... ")
|
|
Directory.CreateDirectory(oOutputDirectoryPath)
|
|
End If
|
|
Dim oOutputFilePath = Path.Combine(oOutputDirectoryPath, $"{oEnvelope.Uuid}.pdf")
|
|
Logger.Debug("Writing finalized Pdf to disk..")
|
|
Logger.Info("Output path is [{0}]", oOutputFilePath)
|
|
|
|
Try
|
|
File.WriteAllBytes(oOutputFilePath, oMergedDocument)
|
|
Catch ex As Exception
|
|
Logger.Warn("Could not export final document to disk!")
|
|
Throw New ExportDocumentException("Could not export final document to disk!", ex)
|
|
End Try
|
|
|
|
Logger.Debug("Writing EB-bytes to database...")
|
|
Update_File_DB(oOutputFilePath, oEnvelope.Id)
|
|
|
|
|
|
If SendFinalEmails(oEnvelope) = False Then ', oOutputFilePath
|
|
Throw New ApplicationException("Final emails could not be sent!")
|
|
Else
|
|
Logger.Info("Report-mails successfully sent!")
|
|
End If
|
|
Logger.Debug("Setting envelope status..")
|
|
If ActionService.FinalizeEnvelope(oEnvelope) = False Then
|
|
Logger.Warn("Envelope could not be finalized!")
|
|
Throw New ApplicationException("Envelope could not be finalized")
|
|
End If
|
|
Catch ex As Exception
|
|
Logger.Error(ex)
|
|
Logger.Warn(ex, $"Unhandled exception while working envelope [{oId}]")
|
|
End Try
|
|
|
|
|
|
oCurrent += 1
|
|
Logger.Info($"Envelope [{oId}] finalized!")
|
|
|
|
Next
|
|
|
|
Logger.Debug("Completed job {0} successfully!", JobId)
|
|
Catch ex As MergeDocumentException
|
|
Logger.Warn("Certificate Document job failed at step: Merging documents!")
|
|
Logger.Error(ex)
|
|
|
|
Catch ex As ExportDocumentException
|
|
Logger.Warn("Certificate Document job failed at step: Exporting document!")
|
|
Logger.Error(ex)
|
|
|
|
Catch ex As Exception
|
|
Logger.Warn("Certificate Document job failed!")
|
|
Logger.Error(ex)
|
|
Finally
|
|
Logger.Debug("Job execution for [{0}] ended", JobId)
|
|
End Try
|
|
|
|
Return Task.FromResult(True)
|
|
End Function
|
|
|
|
#Region "From BBTests"
|
|
Private Function ReadEnvelope(pEnvID As Integer) As Byte()
|
|
Dim strSql As String = "Select [BYTE_DATA] from [TBSIG_ENVELOPE_DOCUMENT] WHERE ENVELOPE_ID = " & pEnvID
|
|
Dim obyteDB = Database.GetScalarValue(strSql)
|
|
If Not IsDBNull(obyteDB) Then
|
|
Dim fileData As Byte() = DirectCast(Database.GetScalarValue(strSql), Byte())
|
|
If fileData IsNot Nothing Then
|
|
Return fileData
|
|
End If
|
|
End If
|
|
|
|
Throw New InvalidOperationException($"Byte data is null. Envelope ID: {pEnvID}")
|
|
|
|
End Function
|
|
|
|
Private Function LoadAnnotationDataForEnvelope(pEnvID As Integer) As DataTable
|
|
Dim oSql = $"SELECT VALUE FROM [TBSIG_DOCUMENT_STATUS] WHERE ENVELOPE_ID = {pEnvID}"
|
|
Return Database.GetDatatable(oSql)
|
|
|
|
End Function
|
|
#End Region
|
|
|
|
Private Sub Update_File_DB(pFilePath As String, pEnvelopeID As Long)
|
|
Dim SqlCom As SqlCommand
|
|
Dim imageData As Byte()
|
|
Dim sFileName As String
|
|
Dim qry As String
|
|
|
|
Try
|
|
'Read Image Bytes into a byte array
|
|
'Initialize SQL Server Connection
|
|
|
|
'Convert File to bytes Array
|
|
imageData = ReadFile(pFilePath)
|
|
If Not IsNothing(imageData) Then
|
|
sFileName = System.IO.Path.GetFileName(pFilePath)
|
|
'Set insert query
|
|
qry = $"UPDATE TBSIG_ENVELOPE SET DOC_RESULT = @ImageData WHERE GUID = {pEnvelopeID}"
|
|
'Initialize SqlCommand object for insert.
|
|
SqlCom = New SqlCommand(qry, Database.GetConnection)
|
|
'We are passing File Name and Image byte data as sql parameters.
|
|
SqlCom.Parameters.Add(New SqlParameter("@ImageData", DirectCast(imageData, Object)))
|
|
'Execute the Query
|
|
SqlCom.ExecuteNonQuery()
|
|
End If
|
|
|
|
Catch ex As Exception
|
|
Logger.Error(ex)
|
|
End Try
|
|
End Sub
|
|
'Open file in to a filestream and read data in a byte array.
|
|
Private Function ReadFile(ByVal sPath As String) As Byte()
|
|
'Initialize byte array with a null value initially.
|
|
Dim data As Byte() = Nothing
|
|
'Use FileInfo object to get file size.
|
|
Dim fInfo As New FileInfo(sPath)
|
|
Dim numBytes As Long = fInfo.Length
|
|
'Open FileStream to read file
|
|
Dim fStream As New FileStream(sPath, FileMode.Open, FileAccess.Read)
|
|
'Use BinaryReader to read file stream into byte array.
|
|
Dim br As New BinaryReader(fStream)
|
|
'When you use BinaryReader, you need to supply number of bytes to read from file.
|
|
'In this case we want to read entire file. So supplying total number of bytes.
|
|
data = br.ReadBytes(CInt(numBytes))
|
|
Return data
|
|
End Function
|
|
'Private Function NetUse_Command(pDestinationPath As String, pUsername As String, pPassword As String)
|
|
' Dim oDectryptedPW = Helpers.Decrypt(My.Settings.NetUse_PW)
|
|
' Dim netUseCommand As String = $"net use {pDestinationPath} /user:{pUsername} {oDectryptedPW}"
|
|
' Logger.Debug("EXECUTING NetUse_Command for " & pDestinationPath)
|
|
' Dim processInfo As New ProcessStartInfo("cmd.exe", $"/C {netUseCommand}")
|
|
' processInfo.RedirectStandardOutput = True
|
|
' processInfo.UseShellExecute = False
|
|
' processInfo.CreateNoWindow = True
|
|
|
|
' Using process As Process = Process.Start(processInfo)
|
|
' process.WaitForExit()
|
|
|
|
' ' Prüfe den Rückgabewert des net use Befehls
|
|
' If process.ExitCode = 0 Then
|
|
' Return True
|
|
' Else
|
|
' Return False
|
|
' End If
|
|
' End Using
|
|
'End Function
|
|
|
|
'Private Function Clean_DNZ_PAth(pSourcePath As String) As Boolean
|
|
' Dim oFilename = System.IO.Path.GetFileName(pSourcePath)
|
|
|
|
' Logger.Debug("## Starting Clean_DNZ_PAth ...")
|
|
' Logger.Debug("## pSourcePath {0}", pSourcePath)
|
|
|
|
' Dim oDirectorySource = Path.Combine(pSourcePath, ParentFolderUID)
|
|
|
|
' Try
|
|
' Logger.Debug($"Deleting oDirectorySource {oDirectorySource} ...")
|
|
' Directory.Delete(oDirectorySource, True)
|
|
' Console.WriteLine($"Folder successfully deleted!")
|
|
' Logger.Debug($"...Deleted!")
|
|
' Return True
|
|
' Catch ex As Exception
|
|
' Logger.Error(ex)
|
|
' Return False
|
|
' End Try
|
|
|
|
|
|
'End Function
|
|
Private Function SendFinalEmails(pEnvelope As Envelope) As Boolean ', pAttachment As String
|
|
Dim oMailToCreator = pEnvelope.FinalEmailToCreator
|
|
Dim oMailToReceivers = pEnvelope.FinalEmailToReceivers
|
|
|
|
If oMailToCreator <> FinalEmailType.No Then
|
|
Logger.Debug("Sending email to creator ...")
|
|
SendFinalEmailToCreator(pEnvelope) ', pAttachment
|
|
Else
|
|
Logger.Warn($"No SendFinalEmailToCreator - oMailToCreator [{oMailToCreator}] <> [{FinalEmailType.No}] ")
|
|
End If
|
|
|
|
If oMailToReceivers <> FinalEmailType.No And pEnvelope.IsReadAndSign() Then
|
|
Logger.Debug("Sending emails to receivers..")
|
|
SendFinalEmailToReceivers(pEnvelope) ', pAttachment
|
|
Else
|
|
Logger.Warn($"No SendFinalEmailToReceivers - oMailToCreator [{oMailToReceivers}] <> [{FinalEmailType.No}] ")
|
|
End If
|
|
|
|
Return True
|
|
End Function
|
|
|
|
Private Function SendFinalEmailToCreator(pEnvelope As Envelope) As Boolean ', pAttachment As String
|
|
Dim oIncludeAttachment = SendFinalEmailWithAttachment(pEnvelope.FinalEmailToCreator)
|
|
' Dim oAttachment = String.Empty
|
|
|
|
Logger.Debug("Attachment included: [{0}]", oIncludeAttachment)
|
|
If oIncludeAttachment Then
|
|
'oAttachment = pAttachment
|
|
End If
|
|
|
|
If ActionService.CompleteEnvelope(pEnvelope) = False Then ', oAttachment
|
|
Logger.Error("Envelope could not be completed for receiver [{0}]", pEnvelope.User.Email)
|
|
Return False
|
|
End If
|
|
|
|
Return True
|
|
End Function
|
|
|
|
Private Function SendFinalEmailToReceivers(pEnvelope As Envelope) As Boolean ', pAttachment As String
|
|
Dim oIncludeAttachment = SendFinalEmailWithAttachment(pEnvelope.FinalEmailToReceivers)
|
|
'Dim oAttachment = String.Empty
|
|
|
|
Logger.Debug("Attachment included: [{0}]", oIncludeAttachment)
|
|
If oIncludeAttachment Then
|
|
|
|
' oAttachment = pAttachment
|
|
End If
|
|
|
|
For Each oReceiver In pEnvelope.EnvelopeReceivers
|
|
If ActionService.CompleteEnvelope(pEnvelope, oReceiver) = False Then ', oAttachment
|
|
Logger.Error("Envelope could not be completed for receiver [{0}]", oReceiver.Receiver.EmailAddress)
|
|
Return False
|
|
End If
|
|
Next
|
|
|
|
Return True
|
|
End Function
|
|
|
|
Private Function SendFinalEmailWithAttachment(pType As FinalEmailType)
|
|
If pType = FinalEmailType.YesWithAttachment Then
|
|
Return True
|
|
Else
|
|
Return False
|
|
End If
|
|
End Function
|
|
|
|
Private Function BurnAnnotationsToPdf(pEnvelopeData As EnvelopeData) As Byte()
|
|
Dim pEnvelopeId = pEnvelopeData.EnvelopeId
|
|
|
|
Logger.Info($"Burning [{pEnvelopeData.AnnotationData.Count}] signatures")
|
|
Dim oAnnotations = pEnvelopeData.AnnotationData
|
|
Dim oInputPath = ""
|
|
If IsNothing(pEnvelopeData.DocAsByte) Then
|
|
oInputPath = pEnvelopeData.DocumentPath
|
|
Logger.Info($"Input path: [{oInputPath}]")
|
|
Else
|
|
Logger.Debug($"we got bytes..")
|
|
oInputPath = Config.DocumentPathOrigin
|
|
Logger.Debug($"oInputPath: {Config.DocumentPathOrigin}")
|
|
End If
|
|
|
|
|
|
If IsNothing(pEnvelopeData.DocAsByte) Then
|
|
Dim oDirectorySource As String = Path.GetDirectoryName(oInputPath)
|
|
Dim split As String() = oDirectorySource.Split("\")
|
|
ParentFolderUID = split(split.Length - 1)
|
|
Else
|
|
ParentFolderUID = pEnvelopeData.EnvelopeUUID
|
|
End If
|
|
|
|
Logger.Info("ParentFolderUID: [{0}]", ParentFolderUID)
|
|
Dim oInputDocumentBuffer As Byte()
|
|
If Not IsNothing(pEnvelopeData.DocAsByte) Then
|
|
oInputDocumentBuffer = pEnvelopeData.DocAsByte
|
|
Else
|
|
Try
|
|
oInputDocumentBuffer = File.ReadAllBytes(oInputPath)
|
|
Catch ex As Exception
|
|
Throw New BurnAnnotationException("Source document could not be read from disk!", ex)
|
|
End Try
|
|
End If
|
|
|
|
#Region "From BBTests"
|
|
Dim oTable = LoadAnnotationDataForEnvelope(pEnvelopeId)
|
|
Dim oJsonList = oTable.Rows.
|
|
Cast(Of DataRow).
|
|
Select(Function(r As DataRow) r.Item("VALUE").ToString()).
|
|
ToList()
|
|
|
|
Dim oBuffer As Byte() = ReadEnvelope(pEnvelopeId)
|
|
|
|
#End Region
|
|
|
|
Return PDFBurner.BurnAnnotsToPDF(oBuffer, oJsonList, pEnvelopeId)
|
|
End Function
|
|
|
|
Private Function GetEnvelopeData(pEnvelopeId As Integer) As EnvelopeData
|
|
Dim oSql = $"SELECT T.GUID, T.ENVELOPE_UUID, T.ENVELOPE_TYPE, T2.FILEPATH, T2.BYTE_DATA FROM [dbo].[TBSIG_ENVELOPE] T
|
|
JOIN TBSIG_ENVELOPE_DOCUMENT T2 ON T.GUID = T2.ENVELOPE_ID
|
|
WHERE T.GUID = {pEnvelopeId}"
|
|
Dim oTable As DataTable = Database.GetDatatable(oSql)
|
|
Dim oRow As DataRow = oTable.Rows.Cast(Of DataRow).SingleOrDefault()
|
|
If oRow Is Nothing Then
|
|
Return Nothing
|
|
End If
|
|
|
|
Dim oAnnotationData = GetAnnotationData(pEnvelopeId)
|
|
Dim oData As New EnvelopeData With {
|
|
.EnvelopeId = pEnvelopeId,
|
|
.DocumentPath = oRow.ItemEx("FILEPATH", ""),
|
|
.AnnotationData = oAnnotationData,
|
|
.DocAsByte = DirectCast(oRow.Item("BYTE_DATA"), Byte()),
|
|
.EnvelopeUUID = oRow.ItemEx("ENVELOPE_UUID", "")
|
|
}
|
|
|
|
Logger.Debug("Document path: [{0}]", oData.DocumentPath)
|
|
|
|
Return oData
|
|
End Function
|
|
|
|
Private Function GetAnnotationData(pEnvelopeId As Integer) As List(Of String)
|
|
Dim oSql = $"SELECT VALUE FROM TBSIG_DOCUMENT_STATUS WHERE ENVELOPE_ID = {pEnvelopeId}"
|
|
Dim oTable As DataTable = Database.GetDatatable(oSql)
|
|
|
|
Return oTable.Rows.Cast(Of DataRow).
|
|
Select(Function(r) r.ItemEx("VALUE", String.Empty)).
|
|
Cast(Of String).
|
|
ToList()
|
|
|
|
End Function
|
|
|
|
Private Sub InitializeServices(pState As State)
|
|
ActionService = New ActionService(pState, Database)
|
|
End Sub
|
|
|
|
Private Sub InitializeModels(pState As State)
|
|
ConfigModel = New ConfigModel(pState)
|
|
EnvelopeModel = New EnvelopeModel(pState)
|
|
ReportModel = New ReportModel(pState)
|
|
End Sub
|
|
|
|
Private Function GetState() As State
|
|
Return New State With {
|
|
.LogConfig = LogConfig,
|
|
.Database = Database,
|
|
.UserId = 0,
|
|
.Config = Nothing,
|
|
.DbConfig = Nothing
|
|
}
|
|
End Function
|
|
End Class
|
|
End Namespace
|