Imports System.Data.SqlClient Imports DigitalData.Modules.Base Imports DigitalData.Modules.Logging Imports EnvelopeGenerator.Domain.Constants Imports EnvelopeGenerator.Domain.Entities Public Class EnvelopeModel Inherits BaseModel Private ReadOnly UserModel As UserModel Private ReadOnly ReceiverModel As ReceiverModel Private ReadOnly HistoryModel As HistoryModel Private ReadOnly DocumentModel As DocumentModel Private ReadOnly EnvelopeTypeModel As EnvelopeTypeModel Public Sub New(pState As State) MyBase.New(pState) UserModel = New UserModel(pState) ReceiverModel = New ReceiverModel(pState) DocumentModel = New DocumentModel(pState) HistoryModel = New HistoryModel(pState) EnvelopeTypeModel = New EnvelopeTypeModel(pState) End Sub Private Function ToEnvelope(pRow As DataRow) As Envelope Dim oEnvelope = New Envelope() With { .Id = pRow.ItemEx("GUID", 0), .Title = pRow.ItemEx("TITLE", ""), .Comment = pRow.ItemEx("COMMENT", ""), .EnvelopeTypeId = pRow.ItemEx("ENVELOPE_TYPE", 0), .ContractType = pRow.ItemEx("CONTRACT_TYPE", 0), .Uuid = pRow.ItemEx("ENVELOPE_UUID", ""), .Message = pRow.ItemEx("MESSAGE", ""), .UserId = pRow.ItemEx("USER_ID", 0), .Language = pRow.ItemEx("LANGUAGE", "de-DE"), .Status = ObjectEx.ToEnum(Of EnvelopeStatus)(pRow.ItemEx("STATUS", EnvelopeStatus.EnvelopeCreated.ToString())), .AddedWhen = pRow.Item("ADDED_WHEN"), .ChangedWhen = pRow.ItemEx(Of Date)("CHANGED_WHEN", Nothing), .CertificationType = ObjectEx.ToEnum(Of CertificationType)(pRow.ItemEx("CERTIFICATION_TYPE", CertificationType.AdvancedElectronicSignature.ToString())), .User = New FormUser(), .ExpiresWhen = pRow.ItemEx(Of Date)("EXPIRES_WHEN", Nothing), .ExpiresWarningWhen = pRow.ItemEx(Of Date)("EXPIRES_WARNING_WHEN", Nothing), .ExpiresWhenDays = pRow.ItemEx("EXPIRES_WHEN_DAYS", 0), .ExpiresWarningWhenDays = pRow.ItemEx("EXPIRES_WARNING_WHEN_DAYS", 0), .SendReminderEmails = pRow.ItemEx("SEND_REMINDER_EMAILS", False), .FirstReminderDays = pRow.ItemEx("FIRST_REMINDER_DAYS", 0), .ReminderIntervalDays = pRow.ItemEx("REMINDER_INTERVAL_DAYS", 0), .UseAccessCode = pRow.ItemEx("USE_ACCESS_CODE", False), .FinalEmailToCreator = ObjectEx.ToEnum(Of FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_CREATOR", FinalEmailType.No.ToString())), .FinalEmailToReceivers = ObjectEx.ToEnum(Of FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_RECEIVERS", FinalEmailType.No.ToString())), .TfaEnabled = pRow.ItemEx("TFA_ENABLED", False) } Dim oDOC_RESULT = pRow.Item("DOC_RESULT") If Not IsDBNull(oDOC_RESULT) Then Dim oByte As Byte() = DirectCast(pRow.Item("DOC_RESULT"), Byte()) If Not IsNothing(oByte) Then oEnvelope.DocResult = oByte End If Else oEnvelope.DocResult = Nothing End If oEnvelope.User = UserModel.SelectUser(oEnvelope.UserId) oEnvelope.EnvelopeReceivers = New List(Of EnvelopeReceiver) For Each rcv In ReceiverModel.ListEnvelopeReceivers(oEnvelope.Id) oEnvelope.EnvelopeReceivers.Add(rcv) Next oEnvelope.Documents = DocumentModel.List(oEnvelope.Id) oEnvelope.Histories = HistoryModel.List(oEnvelope.Id) oEnvelope.Type = EnvelopeTypeModel.GetById(oEnvelope.EnvelopeTypeId) Return oEnvelope End Function Private Function ToEnvelope(pTable As DataTable) As Envelope Return pTable?.Rows.Cast(Of DataRow). Select(AddressOf ToEnvelope). Single() End Function Public Function GetByUuid(pEnvelopeUuid As String) As Envelope Dim oSql = $"SELECT * FROM [dbo].[TBSIG_ENVELOPE] WHERE ENVELOPE_UUID = '{pEnvelopeUuid}'" Dim oTable = Database.GetDatatable(oSql) Return ToEnvelope(oTable) End Function Public Function GetById(pEnvelopeId As Integer) As Envelope Try Dim oSql = $"SELECT * FROM [dbo].[TBSIG_ENVELOPE] WHERE GUID = {pEnvelopeId}" Dim oTable = Database.GetDatatable(oSql) Return ToEnvelope(oTable) Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function Public Function List() As IEnumerable(Of Envelope) Try Dim oSql = $"EXEC [dbo].[PRSIG_GET_ENVELOPES_FOR_USER] {State.UserId}" Dim oTable = Database.GetDatatable(oSql) Return oTable?.Rows.Cast(Of DataRow). Select(AddressOf ToEnvelope). ToList() Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function Public Function ListCompleted() As IEnumerable(Of Envelope) Try Dim oSql = $"EXEC [dbo].[PRSIG_GET_CLOSED_ENVELOPES_FOR_USER] {State.UserId}" Dim oTable = Database.GetDatatable(oSql) Return oTable?.Rows.Cast(Of DataRow). Select(AddressOf ToEnvelope). ToList() Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function Public Function List(pReceiverId As Integer) As IEnumerable(Of Envelope) Try Dim oSql = $"SELECT T.* FROM [dbo].[TBSIG_ENVELOPE] T JOIN TBSIG_ENVELOPE_RECEIVER T2 ON T.GUID = T2.ENVELOPE_ID WHERE T2.RECEIVER_ID = {pReceiverId}" Dim oTable = Database.GetDatatable(oSql) Return oTable?.Rows.Cast(Of DataRow). Select(AddressOf ToEnvelope). ToList() Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function Public Function Insert(pEnvelope As Envelope) As Boolean Try Dim oSql = $"INSERT INTO [dbo].[TBSIG_ENVELOPE] (MESSAGE, ENVELOPE_UUID, STATUS, USER_ID) VALUES('', '{pEnvelope.Uuid}', '{CInt([Enum].Parse(GetType(EnvelopeStatus), EnvelopeStatus.EnvelopeCreated))}', '{pEnvelope.UserId}')" Dim oCommand As New SqlCommand(oSql) 'oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = String.Empty 'oCommand.Parameters.Add("UUID", SqlDbType.NVarChar).Value = pEnvelope.Uuid 'oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = EnvelopeStatus.EnvelopeCreated 'oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId If Database.ExecuteNonQuery(oCommand) Then pEnvelope.Id = GetEnvelopeId(pEnvelope) SetEnvelopeDate(pEnvelope) Return True Else Return False End If Catch ex As Exception Logger.Error(ex) Return False End Try End Function Public Function Update(pEnvelope As Envelope, pTransaction As SqlTransaction) As Boolean Try Dim oSql = "UPDATE [dbo].[TBSIG_ENVELOPE] SET " oSql += " [MESSAGE] = @MESSAGE, " oSql += " [STATUS] = @STATUS, " oSql += " [TITLE] = @TITLE, " oSql += " [ENVELOPE_TYPE] = @ENVELOPE_TYPE, " oSql += " [CONTRACT_TYPE] = @CONTRACT_TYPE, " oSql += " [LANGUAGE] = @LANGUAGE, " oSql += " [CERTIFICATION_TYPE] = @CERTIFICATION_TYPE, " oSql += " [EXPIRES_WHEN_DAYS] = @EXPIRES_WHEN_DAYS, " oSql += " [EXPIRES_WARNING_WHEN_DAYS] = @EXPIRES_WARNING_WHEN_DAYS, " oSql += " [FIRST_REMINDER_DAYS] = @FIRST_REMINDER_DAYS, " oSql += " [FINAL_EMAIL_TO_CREATOR] = @FINAL_EMAIL_TO_CREATOR, " oSql += " [FINAL_EMAIL_TO_RECEIVERS] = @FINAL_EMAIL_TO_RECEIVERS, " oSql += " [REMINDER_INTERVAL_DAYS] = @REMINDER_INTERVAL_DAYS, " oSql += " [SEND_REMINDER_EMAILS] = @SEND_REMINDER_EMAILS, " oSql += " [USE_ACCESS_CODE] = @USE_ACCESS_CODE, " oSql += " [CHANGED_WHEN] = GETDATE(), " oSql += " [TFA_ENABLED] = @TfaEnabled" oSql += " WHERE GUID = @ID AND USER_ID = @USER_ID" Dim oCommand As New SqlCommand(oSql) oCommand.Parameters.Add("ID", SqlDbType.Int).Value = pEnvelope.Id oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = pEnvelope.Message oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = pEnvelope.Status oCommand.Parameters.Add("TITLE", SqlDbType.NVarChar).Value = pEnvelope.Title oCommand.Parameters.Add("ENVELOPE_TYPE", SqlDbType.Int).Value = pEnvelope.EnvelopeTypeId oCommand.Parameters.Add("CONTRACT_TYPE", SqlDbType.Int).Value = pEnvelope.ContractType If IsNothing(pEnvelope.Language) Then pEnvelope.Language = "de-DE" End If oCommand.Parameters.Add("LANGUAGE", SqlDbType.NVarChar).Value = pEnvelope.Language oCommand.Parameters.Add("CERTIFICATION_TYPE", SqlDbType.Int).Value = pEnvelope.CertificationType oCommand.Parameters.Add("EXPIRES_WHEN_DAYS", SqlDbType.Int).Value = pEnvelope.ExpiresWhenDays oCommand.Parameters.Add("EXPIRES_WARNING_WHEN_DAYS", SqlDbType.Int).Value = pEnvelope.ExpiresWarningWhenDays oCommand.Parameters.Add("FIRST_REMINDER_DAYS", SqlDbType.Int).Value = pEnvelope.FirstReminderDays oCommand.Parameters.Add("FINAL_EMAIL_TO_CREATOR", SqlDbType.Int).Value = pEnvelope.FinalEmailToCreator oCommand.Parameters.Add("FINAL_EMAIL_TO_RECEIVERS", SqlDbType.Int).Value = pEnvelope.FinalEmailToReceivers oCommand.Parameters.Add("REMINDER_INTERVAL_DAYS", SqlDbType.Int).Value = pEnvelope.ReminderIntervalDays oCommand.Parameters.Add("SEND_REMINDER_EMAILS", SqlDbType.Bit).Value = pEnvelope.SendReminderEmails oCommand.Parameters.Add("USE_ACCESS_CODE", SqlDbType.Bit).Value = pEnvelope.UseAccessCode oCommand.Parameters.Add("TfaEnabled", SqlDbType.Bit).Value = pEnvelope.TfaEnabled Return Database.ExecuteNonQuery(oCommand, pTransaction) Catch ex As Exception Logger.Error(ex) Return False End Try End Function Public Function Delete(pEnvelope As Envelope, pTransaction As SqlTransaction) As Boolean Try Dim oSql = $"DELETE FROM [dbo].[TBSIG_ENVELOPE] WHERE GUID = {pEnvelope.Id}" Return Database.ExecuteNonQuery(oSql, pTransaction) Catch ex As Exception Return False Logger.Error(ex) End Try End Function Private Function GetEnvelopeId(pEnvelope As Envelope) As Integer Try Return Database.GetScalarValue($"SELECT MAX(GUID) FROM TBSIG_ENVELOPE WHERE USER_ID = {pEnvelope.UserId}") Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function Private Sub SetEnvelopeDate(pEnvelope As Envelope) Try Dim addedWhen As Date = Database.GetScalarValue($"SELECT ADDED_WHEN FROM TBSIG_ENVELOPE WHERE GUID = {pEnvelope.Id}") pEnvelope.AddedWhen = addedWhen Catch ex As Exception Logger.Error(ex) End Try End Sub End Class