From 1b88a6cff77c90f02423fa30a5c33a5062a20871 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 29 Nov 2023 16:15:48 +0100 Subject: [PATCH] 29-11-2023 --- EnvelopeGenerator.Common/Constants.vb | 37 ++++--- .../Entities/EmailTemplate.vb | 14 +++ EnvelopeGenerator.Common/Entities/Envelope.vb | 35 +----- .../Entities/EnvelopeHistoryEntry.vb | 4 +- .../EnvelopeGenerator.Common.vbproj | 2 + EnvelopeGenerator.Common/Helpers.vb | 9 ++ .../Models/EnvelopeModel.vb | 37 +++---- .../Models/HistoryModel.vb | 30 +---- .../Models/ReceiverModel.vb | 25 ++++- .../Services/ActionService.vb | 32 ++++++ .../Services/EmailService.vb | 67 ++++++++++- .../Services/HistoryService.vb | 32 ++++++ .../Controllers/BaseController.vb | 12 ++ .../Controllers/EnvelopeEditorController.vb | 104 ++++++++---------- EnvelopeGenerator.Form/frmEnvelopeEditor.vb | 65 ++++++++--- EnvelopeGenerator.Form/frmMain.resx | 14 +-- .../Controllers/EnvelopeController.cs | 19 +--- .../Controllers/HistoryController.cs | 10 +- EnvelopeGenerator.Web/Program.cs | 1 - .../Services/EmailService.cs | 38 ------- .../Services/EnvelopeService.cs | 2 +- EnvelopeGenerator.Web/wwwroot/js/app.js | 2 +- EnvelopeGenerator.Web/wwwroot/js/network.js | 8 +- 23 files changed, 342 insertions(+), 257 deletions(-) create mode 100644 EnvelopeGenerator.Common/Services/ActionService.vb create mode 100644 EnvelopeGenerator.Common/Services/HistoryService.vb delete mode 100644 EnvelopeGenerator.Web/Services/EmailService.cs diff --git a/EnvelopeGenerator.Common/Constants.vb b/EnvelopeGenerator.Common/Constants.vb index d695884e..acb80343 100644 --- a/EnvelopeGenerator.Common/Constants.vb +++ b/EnvelopeGenerator.Common/Constants.vb @@ -2,11 +2,18 @@ #Region "Status Fields" Public Enum EnvelopeStatus - Created = 0 - Saved = 1 - Sent = 2 - PartlySigned = 3 - CompletelySigned = 4 + EnvelopeCreated = 1001 + EnvelopeSaved = 1002 + EnvelopeQueued = 1003 + EnvelopeSent = 1004 + EnvelopePartlySigned = 1005 + EnvelopeCompletelySigned = 1006 + EnvelopeArchived = 1007 + EnvelopeTransmittedDMS = 1008 + EnvelopeDeleted = 1009 + DocumentOpened = 2001 + DocumentSigned = 2002 + SignatureConfirmed = 2003 End Enum Public Enum ElementStatus @@ -26,16 +33,16 @@ ''' ''' This is a status, which is called Type because it fits with the other action fields ''' - Public Enum EnvelopeHistoryActionType - Created = 0 - Saved = 1 - Sent = 2 - EmailSent = 3 - Delivered = 4 - Seen = 5 - Signed = 6 - Rejected = 7 - End Enum + 'Public Enum EnvelopeHistoryActionType + ' Created = 0 + ' Saved = 1 + ' Sent = 2 + ' EmailSent = 3 + ' Delivered = 4 + ' Seen = 5 + ' Signed = 6 + ' Rejected = 7 + 'End Enum #End Region #Region "Type Fields" diff --git a/EnvelopeGenerator.Common/Entities/EmailTemplate.vb b/EnvelopeGenerator.Common/Entities/EmailTemplate.vb index 871e7631..8ed4d286 100644 --- a/EnvelopeGenerator.Common/Entities/EmailTemplate.vb +++ b/EnvelopeGenerator.Common/Entities/EmailTemplate.vb @@ -4,6 +4,7 @@ Public Class EmailTemplate Private _DocumentReceivedBodyTemplate As List(Of String) Private _DocumentSignedBodyTemplate As List(Of String) Private _DocumentCompletedBodyTemplate As List(Of String) + Private _DocumentDeletedBodyTemplate As List(Of String) Private _replaceDictionary As Dictionary(Of String, String) @@ -34,6 +35,15 @@ Public Class EmailTemplate "" } + _DocumentDeletedBodyTemplate = New List(Of String) From { + "Guten Tag, ", + "", + "Der User hat den Umschlag gelöscht.", + "", + "Mit freundlichen Grüßen", + "" + } + _DocumentCompletedBodyTemplate = New List(Of String) From { "Guten Tag, ", "", @@ -60,6 +70,10 @@ Public Class EmailTemplate FillEmailBody(pEmailData, _DocumentReceivedBodyTemplate) End Sub + Public Sub FillEnvelopeDeletedEmailBody(pEmailData As EmailData) + FillEmailBody(pEmailData, _DocumentDeletedBodyTemplate) + End Sub + Public Sub FillDocumentSignedEmailBody(pEmailData As EmailData) FillEmailBody(pEmailData, _DocumentSignedBodyTemplate) End Sub diff --git a/EnvelopeGenerator.Common/Entities/Envelope.vb b/EnvelopeGenerator.Common/Entities/Envelope.vb index d7fd48af..746491b9 100644 --- a/EnvelopeGenerator.Common/Entities/Envelope.vb +++ b/EnvelopeGenerator.Common/Entities/Envelope.vb @@ -29,33 +29,7 @@ End Get End Property - Public Function Validate() As List(Of String) - Dim oErrors As New List(Of String) - - If String.IsNullOrWhiteSpace(Subject) Then - oErrors.Add(My.Resources.Envelope.Missing_Subject) - End If - - If String.IsNullOrWhiteSpace(Message) Then - oErrors.Add(My.Resources.Envelope.Missing_Message) - End If - - If Documents.Count = 0 Then - oErrors.Add(My.Resources.Envelope.Missing_Documents) - End If - If Receivers.Count = 0 Then - oErrors.Add(My.Resources.Envelope.Missing_Receivers) - End If - - For Each Receiver In Receivers - If IsValidEmailAddress(Receiver.Email) = False Then - oErrors.Add(String.Format(My.Resources.Envelope.Invalid_Email_Address, Receiver.Name)) - End If - Next - - Return oErrors - End Function Public Function ValidateReceiverDocumentData() As List(Of String) Dim oErrors As New List(Of String) @@ -72,12 +46,5 @@ End Function - Private Function IsValidEmailAddress(pEmailAddress As String) As Boolean - Try - Dim oAddress = New System.Net.Mail.MailAddress(pEmailAddress) - Return oAddress.Address = pEmailAddress - Catch ex As Exception - Return False - End Try - End Function + End Class diff --git a/EnvelopeGenerator.Common/Entities/EnvelopeHistoryEntry.vb b/EnvelopeGenerator.Common/Entities/EnvelopeHistoryEntry.vb index 81cb8681..b6c66580 100644 --- a/EnvelopeGenerator.Common/Entities/EnvelopeHistoryEntry.vb +++ b/EnvelopeGenerator.Common/Entities/EnvelopeHistoryEntry.vb @@ -1,6 +1,6 @@ Public Class EnvelopeHistoryEntry Public EnvelopeId As Integer Public UserReference As String - Public ActionType As Constants.EnvelopeHistoryActionType - Public ActionDate As Date + Public Status As Constants.EnvelopeStatus + Public ActionDate As Date = Now() End Class diff --git a/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj b/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj index 7f203374..9d95b57b 100644 --- a/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj +++ b/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj @@ -137,7 +137,9 @@ Settings.settings True + + Email.en.resx True diff --git a/EnvelopeGenerator.Common/Helpers.vb b/EnvelopeGenerator.Common/Helpers.vb index 74539b20..bd0e0c75 100644 --- a/EnvelopeGenerator.Common/Helpers.vb +++ b/EnvelopeGenerator.Common/Helpers.vb @@ -85,4 +85,13 @@ Public Class Helpers Return oColoredImage End Function + + Public Shared Function IsValidEmailAddress(pEmailAddress As String) As Boolean + Try + Dim oAddress = New System.Net.Mail.MailAddress(pEmailAddress) + Return oAddress.Address = pEmailAddress + Catch ex As Exception + Return False + End Try + End Function End Class diff --git a/EnvelopeGenerator.Common/Models/EnvelopeModel.vb b/EnvelopeGenerator.Common/Models/EnvelopeModel.vb index 55823c1c..d1026686 100644 --- a/EnvelopeGenerator.Common/Models/EnvelopeModel.vb +++ b/EnvelopeGenerator.Common/Models/EnvelopeModel.vb @@ -27,7 +27,7 @@ Public Class EnvelopeModel .Subject = pRow.ItemEx("SUBJECT", ""), .Message = pRow.ItemEx("MESSAGE", ""), .UserId = pRow.ItemEx("USER_ID", 0), - .Status = ObjectEx.ToEnum(Of Constants.EnvelopeStatus)(pRow.ItemEx("STATUS", Constants.EnvelopeStatus.Created.ToString())), + .Status = ObjectEx.ToEnum(Of Constants.EnvelopeStatus)(pRow.ItemEx("STATUS", Constants.EnvelopeStatus.EnvelopeCreated.ToString())), .AddedWhen = pRow.Item("ADDED_WHEN"), .User = New User() } @@ -57,6 +57,18 @@ Public Class EnvelopeModel End Try End Function + Public Function GetById(pEnvelopeId As String) 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 = $"SELECT * FROM [dbo].[TBSIG_ENVELOPE] WHERE USER_ID = {State.UserId} AND STATUS IN (0,1,2,3)" @@ -102,25 +114,6 @@ Public Class EnvelopeModel End Try End Function - Public Function Send(pEnvelope As Envelope) As Boolean - Try - Dim oSql = "UPDATE [dbo].[TBSIG_ENVELOPE] SET STATUS = @STATUS, SENT_WHEN = GETDATE() WHERE GUID = @GUID" - Dim oCommand As New SqlCommand(oSql) - oCommand.Parameters.Add("GUID", SqlDbType.Int).Value = pEnvelope.Id - oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = Constants.EnvelopeStatus.Sent - - If Database.ExecuteNonQuery(oCommand) Then - Return True - Else - Return False - End If - - Catch ex As Exception - Logger.Error(ex) - Return False - End Try - End Function - Public Function Insert(pEnvelope As Envelope) As Boolean Try Dim oSql = "INSERT INTO [dbo].[TBSIG_ENVELOPE] (SUBJECT, MESSAGE, ENVELOPE_UUID, STATUS, USER_ID, TITLE, CONTRACT_TYPE) " @@ -129,7 +122,7 @@ Public Class EnvelopeModel oCommand.Parameters.Add("SUBJECT", SqlDbType.NVarChar).Value = String.Empty 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 = Constants.EnvelopeStatus.Created + oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = Constants.EnvelopeStatus.EnvelopeCreated oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId oCommand.Parameters.Add("TITLE", SqlDbType.NVarChar).Value = pEnvelope.Title oCommand.Parameters.Add("CONTRACT_TYPE", SqlDbType.Int).Value = pEnvelope.ContractType @@ -179,7 +172,7 @@ Public Class EnvelopeModel 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) + 'Return Database.ExecuteNonQuery(oSql, pTransaction) Catch ex As Exception Return False diff --git a/EnvelopeGenerator.Common/Models/HistoryModel.vb b/EnvelopeGenerator.Common/Models/HistoryModel.vb index 7d25b9f5..ec8d2f94 100644 --- a/EnvelopeGenerator.Common/Models/HistoryModel.vb +++ b/EnvelopeGenerator.Common/Models/HistoryModel.vb @@ -7,46 +7,24 @@ Public Class HistoryModel MyBase.New(pState) End Sub - Private Function GetActionDescription(pActionType As Constants.EnvelopeHistoryActionType) - Select Case pActionType - Case Constants.EnvelopeHistoryActionType.Created - Return "Umschlag erfolgreich erstellt" - - Case Constants.EnvelopeHistoryActionType.Sent - Return "Umschlag an Empfänger versendet" - - Case Constants.EnvelopeHistoryActionType.Seen - Return "Umschlag von Empfänger geöffnet" - - Case Constants.EnvelopeHistoryActionType.Signed - Return "Umschlag von Empfänger signiert" - - Case Else - Return pActionType.ToString() - End Select - End Function - Public Function Insert(pHistory As EnvelopeHistoryEntry) As Boolean Try Dim oSql = "INSERT INTO [dbo].[TBSIG_ENVELOPE_HISTORY] " oSql += " ([ENVELOPE_ID] " oSql += " ,[USER_REFERENCE] " - oSql += " ,[ACTION_TYPE] " - oSql += " ,[ACTION_DESCRIPTION] " + oSql += " ,[STATUS] " oSql += " ,[ACTION_DATE]) " oSql += " VALUES " oSql += " (@ENVELOPE_ID " oSql += " ,@USER_REFERENCE " - oSql += " ,@ACTION_TYPE " - oSql += " ,@ACTION_DESCRIPTION " + oSql += " ,@STATUS " oSql += " ,@ACTION_DATE) " Dim oCommand As New SqlCommand(oSql) oCommand.Parameters.Add("ENVELOPE_ID", SqlDbType.Int).Value = pHistory.EnvelopeId oCommand.Parameters.Add("USER_REFERENCE", SqlDbType.NVarChar).Value = pHistory.UserReference - oCommand.Parameters.Add("ACTION_TYPE", SqlDbType.Int).Value = pHistory.ActionType - oCommand.Parameters.Add("ACTION_DESCRIPTION", SqlDbType.NVarChar).Value = GetActionDescription(pHistory.ActionType) - oCommand.Parameters.Add("ACTION_DATE", SqlDbType.DateTime).Value = Now() + oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = pHistory.Status + oCommand.Parameters.Add("ACTION_DATE", SqlDbType.DateTime).Value = pHistory.ActionDate If Database.ExecuteNonQuery(oCommand) Then Return True diff --git a/EnvelopeGenerator.Common/Models/ReceiverModel.vb b/EnvelopeGenerator.Common/Models/ReceiverModel.vb index 01686402..8593196d 100644 --- a/EnvelopeGenerator.Common/Models/ReceiverModel.vb +++ b/EnvelopeGenerator.Common/Models/ReceiverModel.vb @@ -23,6 +23,12 @@ Public Class ReceiverModel } End Function + Private Function ToReceiver(pTable As DataTable) As EnvelopeReceiver + Return pTable?.Rows.Cast(Of DataRow). + Select(AddressOf ToReceiver). + Single() + End Function + Public Function TestReceiverExists(pReceiver As EnvelopeReceiver) As Boolean Try Dim oGuid = Database.GetScalarValue($"SELECT COALESCE(GUID, 0) FROM TBSIG_RECEIVER WHERE EMAIL_ADDRESS = '{pReceiver.Email}'") @@ -140,13 +146,13 @@ Public Class ReceiverModel End Try End Function - Public Function ListReceivers(pExistingReceivers As IEnumerable(Of EnvelopeReceiver)) As IEnumerable(Of EnvelopeReceiver) + Public Function ListReceivers(pReceiversFromGrid As List(Of EnvelopeReceiver)) As IEnumerable(Of EnvelopeReceiver) Try - If pExistingReceivers.Count = 0 Then + If pReceiversFromGrid.Count = 0 Then Return New List(Of EnvelopeReceiver) End If - Dim oAddresses = pExistingReceivers.Select(Function(r) $"'{r.Email}'").JoinToString(",") + Dim oAddresses = pReceiversFromGrid.Select(Function(r) $"'{r.Email}'").JoinToString(",") Dim oSql = $"SELECT * FROM [dbo].[TBSIG_RECEIVER] WHERE EMAIL_ADDRESS IN ({oAddresses})" Dim oTable = Database.GetDatatable(oSql) @@ -173,6 +179,19 @@ Public Class ReceiverModel End Try End Function + Public Function GetById(pReceiverId As Integer) As EnvelopeReceiver + Try + Dim oSql = $"SELECT * FROM [dbo].[VWSIG_ENVELOPE_RECEIVERS] WHERE GUID = {pReceiverId}" + Dim oTable = Database.GetDatatable(oSql) + + Return ToReceiver(oTable) + + Catch ex As Exception + Logger.Error(ex) + Return Nothing + End Try + End Function + Public Function GetReceiverIdBySignature(pSignature As String) As Integer Try Return Database.GetScalarValue($"SELECT GUID FROM TBSIG_RECEIVER WHERE SIGNATURE = '{pSignature}'") diff --git a/EnvelopeGenerator.Common/Services/ActionService.vb b/EnvelopeGenerator.Common/Services/ActionService.vb new file mode 100644 index 00000000..cb3ce0fa --- /dev/null +++ b/EnvelopeGenerator.Common/Services/ActionService.vb @@ -0,0 +1,32 @@ +Imports DigitalData.Modules.Base + +Public Class ActionService + Inherits BaseClass + + Private ReadOnly State As State + + Private EmailService As EmailService + Private HistoryService As HistoryService + + + Public Sub New(pState As State) + MyBase.New(pState.LogConfig) + + State = pState + EmailService = New EmailService(pState) + HistoryService = New HistoryService(pState) + End Sub + + Public Function DeleteEnvelope(pEnvelope As Envelope) As Boolean + + HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.EnvelopeDeleted, pEnvelope.User.Email) + + For Each oReceiver As EnvelopeReceiver In pEnvelope.Receivers + EmailService.SendEnvelopeDeletedEmail(oReceiver.Id, pEnvelope.Id) + Next + + + Return True + End Function + +End Class \ No newline at end of file diff --git a/EnvelopeGenerator.Common/Services/EmailService.vb b/EnvelopeGenerator.Common/Services/EmailService.vb index 24322d79..bd697836 100644 --- a/EnvelopeGenerator.Common/Services/EmailService.vb +++ b/EnvelopeGenerator.Common/Services/EmailService.vb @@ -1,18 +1,79 @@ -Imports DigitalData.Modules.Base + +Imports DigitalData.Modules.Base Imports DigitalData.Modules.Logging Public Class EmailService Inherits BaseClass + Private ReadOnly State As State + + Private ReadOnly EnvelopeModel As EnvelopeModel + Private ReadOnly ReceiverModel As ReceiverModel + Private ReadOnly EmailModel As EmailModel + + Private ReadOnly EmailTemplate As EmailTemplate + Public Sub New(pState As State) MyBase.New(pState.LogConfig) + + State = pState + EnvelopeModel = New EnvelopeModel(pState) + ReceiverModel = New ReceiverModel(pState) + EmailModel = New EmailModel(pState) + EmailTemplate = New EmailTemplate() End Sub - Public Function SendSignedEmail(pReceiverId As Integer, pEnvelopeId As Integer) + Public Function SendEnvelopeDeletedEmail(pReceiverId As Integer, pEnvelopeId As Integer) As Boolean + Dim oEnvelope = EnvelopeModel.GetById(pEnvelopeId) + Dim oReceiver = ReceiverModel.GetById(pReceiverId) + + Dim oEmailData As New EmailData(oEnvelope, oReceiver) With + { + .SignatureLink = "" + } + + EmailTemplate.FillEnvelopeDeletedEmailBody(oEmailData) + + If EmailModel.Insert(oEmailData) = False Then + Logger.Error("EMail data could not be inserted.") + Return False + End If + + Return True + End Function + + Public Function SendInitialEmail(pReceiverId As Integer, pEnvelopeId As Integer) As Boolean + Dim oEnvelope = EnvelopeModel.GetById(pEnvelopeId) + Dim oReceiver = ReceiverModel.GetById(pReceiverId) + + Dim oEmailData As New EmailData(oEnvelope, oReceiver) With + { + .SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, oEnvelope.Uuid, oReceiver.Signature) + } + + EmailTemplate.FillDocumentReceivedEmailBody(oEmailData) + + If EmailModel.Insert(oEmailData) = False Then + Logger.Error("EMail data could not be inserted.") + Return False + End If + + Return True + End Function + + Public Function SendSignedEmail(pReceiverId As Integer, pEnvelopeId As Integer) As Boolean + Dim oEnvelope = EnvelopeModel.GetById(pEnvelopeId) + Dim oReceiver = ReceiverModel.GetById(pReceiverId) - Dim oEnvelope = + Dim oEmailData = New EmailData(oEnvelope, oReceiver) With {.SignatureLink = ""} + EmailTemplate.FillDocumentSignedEmailBody(oEmailData) + If EmailModel.Insert(oEmailData) = False Then + Logger.Error("EMail data could not be inserted.") + Return False + End If + Return True End Function diff --git a/EnvelopeGenerator.Common/Services/HistoryService.vb b/EnvelopeGenerator.Common/Services/HistoryService.vb new file mode 100644 index 00000000..ae341a66 --- /dev/null +++ b/EnvelopeGenerator.Common/Services/HistoryService.vb @@ -0,0 +1,32 @@ + +Imports DigitalData.Modules.Base +Imports DigitalData.Modules.Logging +Imports EnvelopeGenerator.Common.Constants + +Public Class HistoryService + Inherits BaseClass + + Private ReadOnly State As State + + Private ReadOnly EnvelopeModel As EnvelopeModel + Private ReadOnly ReceiverModel As ReceiverModel + Private ReadOnly HistoryModel As HistoryModel + + Public Sub New(pState As State) + MyBase.New(pState.LogConfig) + + State = pState + EnvelopeModel = New EnvelopeModel(pState) + ReceiverModel = New ReceiverModel(pState) + HistoryModel = New HistoryModel(pState) + End Sub + + Public Function SetEnvelopeStatus(pEnvelope As Envelope, pStatus As EnvelopeStatus, pUserReference As String) As Boolean + Return HistoryModel.Insert(New EnvelopeHistoryEntry() With { + .EnvelopeId = pEnvelope.Id, + .ActionDate = Now(), + .Status = pStatus, + .UserReference = pUserReference + }) + End Function +End Class diff --git a/EnvelopeGenerator.Form/Controllers/BaseController.vb b/EnvelopeGenerator.Form/Controllers/BaseController.vb index 8f524073..ed241d3e 100644 --- a/EnvelopeGenerator.Form/Controllers/BaseController.vb +++ b/EnvelopeGenerator.Form/Controllers/BaseController.vb @@ -14,6 +14,8 @@ Public MustInherit Class BaseController Public UserModel As UserModel Public EmailModel As EmailModel + Public ActionService As ActionService + Public ReadOnly Property Database As MSSQLServer Public ReadOnly Property State As State @@ -22,6 +24,7 @@ Public MustInherit Class BaseController State = pState Database = pState.Database InitializeModels(pState) + ActionService = New ActionService(pState) End Sub Private Sub InitializeModels(pState As State) @@ -39,6 +42,15 @@ Public MustInherit Class BaseController Return True End If + Return ActionService.DeleteEnvelope(pEnvelope) + + End Function + + Public Function DeleteEnvelope_Old(pEnvelope As Envelope) As Boolean + If pEnvelope Is Nothing Then + Return True + End If + Dim oConnection As SqlConnection = Database.GetConnection() Dim oTransaction As SqlTransaction = oConnection.BeginTransaction() diff --git a/EnvelopeGenerator.Form/Controllers/EnvelopeEditorController.vb b/EnvelopeGenerator.Form/Controllers/EnvelopeEditorController.vb index a544855e..c2cab334 100644 --- a/EnvelopeGenerator.Form/Controllers/EnvelopeEditorController.vb +++ b/EnvelopeGenerator.Form/Controllers/EnvelopeEditorController.vb @@ -9,6 +9,7 @@ Public Class EnvelopeEditorController Inherits BaseController Public ReadOnly Envelope As Envelope = Nothing + Public ReadOnly EmailService As EmailService Public ReadOnly Thumbnail As Thumbnail @@ -17,6 +18,7 @@ Public Class EnvelopeEditorController Envelope = CreateEnvelope() Thumbnail = New Thumbnail(pState.LogConfig) + EmailService = New EmailService(pState) End Sub Public Sub New(pState As State, pEnvelope As Envelope) @@ -27,56 +29,36 @@ Public Class EnvelopeEditorController Envelope.Receivers = ReceiverModel.ListEnvelopeReceivers(pEnvelope.Id).ToList() Thumbnail = New Thumbnail(pState.LogConfig) + EmailService = New EmailService(pState) End Sub #Region "Public" Public Function SendEnvelope() As Boolean - For Each receiverItem As EnvelopeReceiver In Envelope.Receivers - If receiverItem.Signature Is Nothing Then - Logger.Warn("Signature for Receiver is empty. Aborting.") + For Each receiverItem As EnvelopeReceiver In Envelope.Receivers + If EmailService.SendInitialEmail(receiverItem.Id, Envelope.Id) = False Then + Logger.Warn("Email could not be sent.") Return False End If - - Dim oEmailData As New EmailData(Envelope, receiverItem) With - { - .SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, Envelope.Uuid, receiverItem.Signature) - } - - Dim oTemplate As New EmailTemplate() - oTemplate.FillDocumentReceivedEmailBody(oEmailData) - - If EmailModel.Insert(oEmailData) = False Then - Logger.Error("EMail data could not be inserted.") - Dim oResult As Boolean = False - End If - Next - - If EnvelopeModel.Send(Envelope) Then - - Dim newHistoryEntry As New EnvelopeHistoryEntry With { + Dim newHistoryEntry As New EnvelopeHistoryEntry With { .EnvelopeId = Envelope.Id, - .ActionType = EnvelopeHistoryActionType.Sent, + .Status = EnvelopeStatus.EnvelopeQueued, .UserReference = Envelope.User.Email } - If HistoryModel.Insert(newHistoryEntry) Then - 'TODO: Send email to History - Return True - Else - Logger.Warn("History Entry could not be created!") - Return False - End If + If HistoryModel.Insert(newHistoryEntry) Then + Return True Else - Logger.Warn("Envelope could not be updated!") + Logger.Warn("History Entry could not be created!") Return False End If + End Function - Public Function ValidateEnvelopeForSending() As List(Of String) - Dim oEnvelopeErrors = Envelope.Validate() + Public Function ValidateEnvelopeForSending(pErrors As List(Of String)) As List(Of String) + Dim oEnvelopeErrors = pErrors If ElementModel.ElementsExist(Envelope.Id) = False Then oEnvelopeErrors.Add(Resources.Envelope.Missing_Elements) @@ -105,7 +87,7 @@ Public Class EnvelopeEditorController Dim newHistoryEntry As New EnvelopeHistoryEntry With { .EnvelopeId = oEnvelope.Id, - .ActionType = EnvelopeHistoryActionType.Created, + .Status = EnvelopeStatus.EnvelopeCreated, .UserReference = oEnvelope.User.Email } @@ -117,12 +99,38 @@ Public Class EnvelopeEditorController End If End Function + Public Function SaveReceivers(pEnvelope As Envelope, pReceiversFromGrid As List(Of EnvelopeReceiver)) As Boolean + Dim oExistingReceivers As List(Of EnvelopeReceiver) = ReceiverModel.ListReceivers(pReceiversFromGrid).ToList() + Dim oExistingAddresses = oExistingReceivers.Select(Function(r) r.Email) + Dim oNewReceivers = pReceiversFromGrid.Where(Function(r) Not oExistingAddresses.Contains(r.Email)).ToList() + + If CreateNewReceivers(oNewReceivers) = False Then + Return False + End If + + Dim oAllReceivers As List(Of EnvelopeReceiver) = ReceiverModel.ListReceivers(pReceiversFromGrid).ToList() + + pEnvelope.Receivers.Clear() + + For Each oReceiver In pReceiversFromGrid + Dim oDbReceiver = oAllReceivers.Where(Function(r) r.Email = oReceiver.Email).SingleOrDefault() + If oDbReceiver IsNot Nothing Then + oReceiver.Id = oDbReceiver.Id + oReceiver.Signature = oDbReceiver.Signature + End If + + pEnvelope.Receivers.Add(oReceiver) + Next + + Return True + End Function + Public Function SaveEnvelope() As Boolean Dim oConnection = Database.GetConnection() Dim oTransaction = oConnection.BeginTransaction(IsolationLevel.ReadUncommitted) Try - Envelope.Status = EnvelopeStatus.Saved + Envelope.Status = EnvelopeStatus.EnvelopeSaved If SaveEnvelopeDocumentsToFilesystem(Envelope) = False Then Throw New ApplicationException @@ -152,18 +160,6 @@ Public Class EnvelopeEditorController End Try End Function - Public Function CleanupEnvelope() As Boolean - If Envelope Is Nothing Then - Return True - End If - - If Envelope.Status = Common.Constants.EnvelopeStatus.Created Then - Return DeleteEnvelope(Envelope) - Else - Return True - End If - End Function - Public Function CreateDocument(pDocumentFilePath As String) As EnvelopeDocument Try Dim oFileInfo = New FileInfo(pDocumentFilePath) @@ -270,15 +266,8 @@ Public Class EnvelopeEditorController End Try End Function - Public Function CreateEnvelopeReceivers(pCurrentReceivers As List(Of EnvelopeReceiver)) As Boolean - Dim oExistingReceivers As List(Of EnvelopeReceiver) = ReceiverModel.ListReceivers(pCurrentReceivers).ToList() - Dim oExistingAddresses = oExistingReceivers.Select(Function(r) r.Email) - - ' Neue Empfänger - Dim oNewReceivers = pCurrentReceivers. - Where(Function(r) Not oExistingAddresses.Contains(r.Email)).ToList() - - If oNewReceivers.Count = 0 Then + Public Function CreateNewReceivers(pNewReceivers As List(Of EnvelopeReceiver)) As Boolean + If pNewReceivers.Count = 0 Then Return True End If @@ -286,15 +275,12 @@ Public Class EnvelopeEditorController Dim oTransaction = oConnection.BeginTransaction() Try - If InsertReceivers(oNewReceivers, oTransaction) = False Then + If InsertReceivers(pNewReceivers, oTransaction) = False Then Throw New ApplicationException("Could not insert receivers!") End If oTransaction.Commit() - ' Empfänger neu aus der Datenbank laden - Envelope.Receivers = ReceiverModel.ListReceivers(pCurrentReceivers).ToList() - Return True Catch ex As Exception Logger.Error(ex) diff --git a/EnvelopeGenerator.Form/frmEnvelopeEditor.vb b/EnvelopeGenerator.Form/frmEnvelopeEditor.vb index 2b45c937..a21f62d2 100644 --- a/EnvelopeGenerator.Form/frmEnvelopeEditor.vb +++ b/EnvelopeGenerator.Form/frmEnvelopeEditor.vb @@ -4,6 +4,7 @@ Imports DevExpress.Utils.Svg Imports DevExpress.XtraEditors Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid.Views.Grid +Imports DevExpress.XtraPrinting.Native Imports DevExpress.XtraSplashScreen Imports DigitalData.Modules.Logging Imports EnvelopeGenerator.Common @@ -70,7 +71,7 @@ Partial Public Class frmEnvelopeEditor End If Next - If Envelope.Status = Constants.EnvelopeStatus.Sent Then + If Envelope.Status = Constants.EnvelopeStatus.EnvelopeSent Then ' TODO - Nach Testen ' SetFormReadonly() End If @@ -95,10 +96,6 @@ Partial Public Class frmEnvelopeEditor ViewDocuments.OptionsBehavior.ReadOnly = True End Sub - Private Sub frmEnvelopeEditor_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing - Controller.CleanupEnvelope() - End Sub - Private Sub btnDeleteFile_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnDeleteFile.ItemClick If ViewDocuments.GetSelectedRows().Count > 0 Then Dim oDocument As EnvelopeDocument = DirectCast(ViewDocuments.GetFocusedRow(), EnvelopeDocument) @@ -133,7 +130,7 @@ Partial Public Class frmEnvelopeEditor Where(Function(d) d.Filename = oDocument.Filename). SingleOrDefault(), .GDPictureKey = oGDPictureKey, - .Receivers = Receivers.ToList, + .Receivers = Controller.Envelope.Receivers.ToList, .State = State } oForm.ShowDialog() @@ -174,6 +171,37 @@ Partial Public Class frmEnvelopeEditor Return True End Function + Private Function ValidateEnvelope() As List(Of String) + Dim oSubject = GetEditValueFromTextControl(txtSubject) + Dim oMessage = GetEditValueFromTextControl(txtMessage) + + Dim oErrors As New List(Of String) + + If String.IsNullOrWhiteSpace(oSubject) Then + oErrors.Add(Resources.Envelope.Missing_Subject) + End If + + If String.IsNullOrWhiteSpace(oMessage) Then + oErrors.Add(Resources.Envelope.Missing_Message) + End If + + If Documents.Count = 0 Then + oErrors.Add(Resources.Envelope.Missing_Documents) + End If + + If Receivers.Count = 0 Then + oErrors.Add(Resources.Envelope.Missing_Receivers) + End If + + For Each Receiver In Receivers + If Helpers.IsValidEmailAddress(Receiver.Email) = False Then + oErrors.Add(String.Format(Resources.Envelope.Invalid_Email_Address, Receiver.Name)) + End If + Next + + Return oErrors + End Function + Private Function SaveEnvelope(pWithValidation As Boolean) As Boolean Dim oSubject = GetEditValueFromTextControl(txtSubject) Dim oMessage = GetEditValueFromTextControl(txtMessage) @@ -181,20 +209,25 @@ Partial Public Class frmEnvelopeEditor ' Ensure all receivers are saved ViewReceivers.CloseEditor() - Dim oEnvelope = Controller.Envelope - oEnvelope.Subject = oSubject - oEnvelope.Message = oMessage - oEnvelope.Documents = Documents.ToList - If pWithValidation = True Then - Dim oErrors = oEnvelope.Validate() + Dim oErrors = ValidateEnvelope() If oErrors.Any Then ShowValidationErrors(Resources.Envelope.Errors_when_saving_the_envelope, oErrors) Return False End If End If - If Controller.CreateEnvelopeReceivers(Receivers.ToList) = False Then + Dim oEnvelope = Controller.Envelope + oEnvelope.Subject = oSubject + oEnvelope.Message = oMessage + oEnvelope.Documents = Documents.ToList + + + 'oEnvelope.Receivers = Receivers.ToList + + + + If Controller.SaveReceivers(oEnvelope, Receivers.ToList) = False Then MsgBox(Resources.Envelope.Error_when_saving_the_recipients, MsgBoxStyle.Critical, Text) Return False End If @@ -249,7 +282,7 @@ Partial Public Class frmEnvelopeEditor End Sub Private Sub btnSendEnvelope_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnSendEnvelope.ItemClick - If Controller.Envelope.Status = Constants.EnvelopeStatus.Sent Then + If Controller.Envelope.Status = Constants.EnvelopeStatus.EnvelopeSent Then MsgBox(Resources.Envelope.Envelope_already_sent, MsgBoxStyle.Information, Text) Exit Sub End If @@ -258,7 +291,9 @@ Partial Public Class frmEnvelopeEditor Exit Sub End If - Dim oErrors = Controller.ValidateEnvelopeForSending() + Dim oErrors = ValidateEnvelope() + oErrors = Controller.ValidateEnvelopeForSending(oErrors) + If oErrors.Any() Then ShowValidationErrors(Resources.Envelope.Error_sending_the_envelope, oErrors) Exit Sub diff --git a/EnvelopeGenerator.Form/frmMain.resx b/EnvelopeGenerator.Form/frmMain.resx index a0c46884..e77b0599 100644 --- a/EnvelopeGenerator.Form/frmMain.resx +++ b/EnvelopeGenerator.Form/frmMain.resx @@ -298,10 +298,10 @@ 1088, 158 - 0, 657 + 0, 659 - 1088, 24 + 1088, 22 RibbonStatusBar @@ -328,7 +328,7 @@ 2 - 1086, 294 + 1086, 415 2 @@ -346,7 +346,7 @@ 0 - 1086, 294 + 1086, 415 Offene Umschläge @@ -436,7 +436,7 @@ 112 - 1086, 413 + 1086, 415 3 @@ -454,7 +454,7 @@ 0 - 1086, 413 + 1086, 415 Abgeschlossene Umschläge @@ -514,7 +514,7 @@ 1 - 1088, 499 + 1088, 501 5 diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs index 58753a5b..56d57eae 100644 --- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs @@ -9,10 +9,10 @@ namespace EnvelopeGenerator.Web.Controllers private readonly EnvelopeService envelopeService; private readonly EmailService emailService; - public EnvelopeController(DatabaseService database, LoggingService logging, EnvelopeService envelope, EmailService email) : base(database, logging) + public EnvelopeController(DatabaseService database, LoggingService logging, EnvelopeService envelope) : base(database, logging) { envelopeService = envelope; - emailService = email; + emailService = new(state); } [HttpGet] @@ -62,7 +62,7 @@ namespace EnvelopeGenerator.Web.Controllers envelopeService.InsertHistoryEntrySigned(response); - SendSignedEmail(response); + emailService.SendSignedEmail(response.Receiver.Id, response.Envelope.Id); return Ok(); } @@ -71,18 +71,5 @@ namespace EnvelopeGenerator.Web.Controllers return ErrorResponse(e); } } - - public bool SendSignedEmail(EnvelopeResponse response) - { - EmailTemplate template = new(); - EmailData emailData = new(response.Envelope, response.Receiver) - { - SignatureLink = "", - }; - - template.FillDocumentSignedEmailBody(emailData); - - return emailService.SendEmail(emailData); - } } } diff --git a/EnvelopeGenerator.Web/Controllers/HistoryController.cs b/EnvelopeGenerator.Web/Controllers/HistoryController.cs index c0a0d3f7..604b2540 100644 --- a/EnvelopeGenerator.Web/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.Web/Controllers/HistoryController.cs @@ -5,11 +5,6 @@ using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Web.Controllers { - public class ActionObject - { - public int ActionType { get; set; } - } - public class HistoryController : BaseController { private readonly EnvelopeService envelopeService; @@ -21,7 +16,7 @@ namespace EnvelopeGenerator.Web.Controllers [HttpPost] [Route("api/history/{envelopeKey}")] - public IActionResult Get(string envelopeKey, [FromBody] ActionObject action) + public IActionResult Get(string envelopeKey) { try { @@ -30,12 +25,11 @@ namespace EnvelopeGenerator.Web.Controllers // Validate Envelope Key and load envelope envelopeService.EnsureValidEnvelopeKey(envelopeKey); EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey); - EnvelopeHistoryActionType actionType = (EnvelopeHistoryActionType)action.ActionType; envelopeService.InsertHistoryEntry(new EnvelopeHistoryEntry() { ActionDate = DateTime.Now, - ActionType = actionType, + Status = EnvelopeStatus.DocumentOpened, EnvelopeId = response.Envelope.Id, UserReference = response.Receiver.Email }); diff --git a/EnvelopeGenerator.Web/Program.cs b/EnvelopeGenerator.Web/Program.cs index 6a7ccd53..6c896479 100644 --- a/EnvelopeGenerator.Web/Program.cs +++ b/EnvelopeGenerator.Web/Program.cs @@ -11,7 +11,6 @@ namespace EnvelopeGenerator.Web // Add base services builder.Services.AddSingleton(); builder.Services.AddTransient(); - builder.Services.AddTransient(); // Add higher order services builder.Services.AddSingleton(); diff --git a/EnvelopeGenerator.Web/Services/EmailService.cs b/EnvelopeGenerator.Web/Services/EmailService.cs deleted file mode 100644 index 2a9506d3..00000000 --- a/EnvelopeGenerator.Web/Services/EmailService.cs +++ /dev/null @@ -1,38 +0,0 @@ -using EnvelopeGenerator.Common; - -namespace EnvelopeGenerator.Web.Services -{ - public class EmailService : BaseService - { - private ReceiverModel receiverModel; - private EnvelopeModel envelopeModel; - private HistoryModel historyModel; - private DocumentModel documentModel; - private DocumentStatusModel documentStatusModel; - private EmailModel emailModel; - - public EmailService(IConfiguration Config, LoggingService Logging, DatabaseService database) : base(Config, Logging) - { - logger = Logging.LogConfig.GetLogger(); - - if (database.Models == null) - { - throw new ArgumentNullException("Models not loaded."); - } - - receiverModel = database.Models.receiverModel; - envelopeModel = database.Models.envelopeModel; - historyModel = database.Models.historyModel; - documentModel = database.Models.documentModel; - documentStatusModel = database.Models.documentStatusModel; - emailModel = database.Models.emailModel; - } - - public bool SendEmail(EmailData emailData) - { - return emailModel.Insert(emailData); - } - - -} -} diff --git a/EnvelopeGenerator.Web/Services/EnvelopeService.cs b/EnvelopeGenerator.Web/Services/EnvelopeService.cs index 82a654c3..0ece8ac4 100644 --- a/EnvelopeGenerator.Web/Services/EnvelopeService.cs +++ b/EnvelopeGenerator.Web/Services/EnvelopeService.cs @@ -111,7 +111,7 @@ namespace EnvelopeGenerator.Web.Services return historyModel.Insert(new EnvelopeHistoryEntry() { ActionDate = DateTime.Now, - ActionType = EnvelopeHistoryActionType.Signed, + Status = EnvelopeStatus.DocumentSigned, EnvelopeId = response.Envelope.Id, UserReference = response.Receiver.Email }); diff --git a/EnvelopeGenerator.Web/wwwroot/js/app.js b/EnvelopeGenerator.Web/wwwroot/js/app.js index b6e8a447..a97b59c1 100644 --- a/EnvelopeGenerator.Web/wwwroot/js/app.js +++ b/EnvelopeGenerator.Web/wwwroot/js/app.js @@ -90,7 +90,7 @@ class App { ) const createdAnnotations = await this.Instance.create(annotations) - await this.Network.postHistory(this.envelopeKey, ActionType.Seen) + await this.Network.postHistory(this.envelopeKey) } catch (e) { console.error(e) } diff --git a/EnvelopeGenerator.Web/wwwroot/js/network.js b/EnvelopeGenerator.Web/wwwroot/js/network.js index dd0cd609..2a4ccb42 100644 --- a/EnvelopeGenerator.Web/wwwroot/js/network.js +++ b/EnvelopeGenerator.Web/wwwroot/js/network.js @@ -32,20 +32,16 @@ }) } - postHistory(envelopeKey, actionType) { + postHistory(envelopeKey) { const url = `/api/history/${envelopeKey}` - const data = { - actionType: actionType, - } - const options = { credentials: 'include', method: 'POST', headers: { 'Content-Type': 'application/json; charset=utf-8', }, - body: JSON.stringify(data), + body: JSON.stringify({}), } console.debug('PostHistory/Calling url: ' + url)