From 73df248d153b823c9c6b52fbf55dcd73dc32b4ff Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 9 Mar 2026 22:50:55 +0100 Subject: [PATCH 01/27] Update System.Text.Json to 8.0.6 and enhance ClickOnce config - Upgraded System.Text.Json NuGet package and binding redirects to 8.0.6. - Updated project references to use System.Text.Json 8.0.0.6. - Enhanced ClickOnce publishing settings: set PublishUrl, enabled autorun, completed wizard, and added manifest signing with a temporary key. - Minor formatting and property order adjustments in the project file. --- EnvelopeGenerator.Service/App.config | 2 +- .../EnvelopeGenerator.Service.vbproj | 28 +++++++++++++++---- EnvelopeGenerator.Service/packages.config | 2 +- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/EnvelopeGenerator.Service/App.config b/EnvelopeGenerator.Service/App.config index 445dd0b3..a817cfcc 100644 --- a/EnvelopeGenerator.Service/App.config +++ b/EnvelopeGenerator.Service/App.config @@ -51,7 +51,7 @@ - + diff --git a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj index 03df4c62..7c4d2948 100644 --- a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj +++ b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj @@ -1,4 +1,4 @@ - + @@ -17,7 +17,8 @@ - publish\ + false + P:\Install .Net\0 DD - Smart UP\signFLOW\Finalization\%24%28Version%29\ true Disk false @@ -27,10 +28,11 @@ false false true + true 0 1.0.0.%2a - false false + true true @@ -65,6 +67,18 @@ On + + 905CDA07C40CC715F90A2F2A0C5C0E5BAACE138B + + + EnvelopeGenerator.Service_TemporaryKey.pfx + + + true + + + true + ..\packages\BouncyCastle.Cryptography.2.6.2\lib\net461\BouncyCastle.Cryptography.dll @@ -258,8 +272,8 @@ ..\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll - - ..\packages\System.Text.Json.8.0.5\lib\net462\System.Text.Json.dll + + ..\packages\System.Text.Json.8.0.6\lib\net462\System.Text.Json.dll ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll @@ -337,6 +351,7 @@ + MyApplicationCodeGenerator Application.Designer.vb @@ -382,4 +397,5 @@ - \ No newline at end of file + + diff --git a/EnvelopeGenerator.Service/packages.config b/EnvelopeGenerator.Service/packages.config index 6ccec828..b3d22784 100644 --- a/EnvelopeGenerator.Service/packages.config +++ b/EnvelopeGenerator.Service/packages.config @@ -35,7 +35,7 @@ - + \ No newline at end of file From 18a563ecd18fd8485e763e2dd5a86f1a294a7a2d Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 00:02:22 +0100 Subject: [PATCH 02/27] Improve annotation handling and date retrieval robustness Refactored annotation processing in PDFBurner.vb to handle null elements and annotations safely, preventing possible errors and improving code clarity. Updated GetSignedDate in ReceiverModel.vb to ensure consistent DateTime return values, handle DBNull and type conversions, and improve error handling. --- .../Jobs/FinalizeDocument/PDFBurner.vb | 31 ++++++++++++++++--- .../Models/ReceiverModel.vb | 18 +++++++++-- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/PDFBurner.vb b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/PDFBurner.vb index 781615ac..97347a72 100644 --- a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/PDFBurner.vb +++ b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/PDFBurner.vb @@ -85,16 +85,37 @@ Namespace Jobs.FinalizeDocument 'Add annotations For Each element In elements + If element Is Nothing Then + Continue For + End If + + Dim elementAnnotations = If(element.Annotations, Enumerable.Empty(Of ElementAnnotation)()) + If Not elementAnnotations.Any() Then + Continue For + End If Dim frameX = (element.Left - 0.7 - margin) - Dim frame = element.Annotations.FirstOrDefault(Function(a) a.Name = "frame") + Dim frame = elementAnnotations.FirstOrDefault(Function(a) a.Name = "frame") Dim frameY = element.Top - 0.5 - margin - Dim frameYShift = frame.Y - frameY * inchFactor - Dim frameXShift = frame.X - frameX * inchFactor + Dim frameYShift As Double = 0 + Dim frameXShift As Double = 0 + + If frame IsNot Nothing Then + frameYShift = frame.Y - frameY * inchFactor + frameXShift = frame.X - frameX * inchFactor + End If + + For Each annot In elementAnnotations + If annot Is Nothing Then + Continue For + End If + + Dim yOffsetofFF As Double = 0 + If Not String.IsNullOrEmpty(annot.Name) Then + yOffsetsOfFF.TryGetValue(annot.Name, yOffsetofFF) + End If - For Each annot In element.Annotations - Dim yOffsetofFF As Double = If(yOffsetsOfFF.TryGetValue(annot.Name, yOffsetofFF), yOffsetofFF, 0) Dim y = frameY + yOffsetofFF If annot.Type = AnnotationType.FormField Then diff --git a/EnvelopeGenerator.CommonServices/Models/ReceiverModel.vb b/EnvelopeGenerator.CommonServices/Models/ReceiverModel.vb index 2d2395c9..78408d40 100644 --- a/EnvelopeGenerator.CommonServices/Models/ReceiverModel.vb +++ b/EnvelopeGenerator.CommonServices/Models/ReceiverModel.vb @@ -270,12 +270,26 @@ Public Class ReceiverModel Private Function GetSignedDate(pEmailAddress As String, pEnvelopeId As Integer) As Date Try Dim oStatusInt As Integer = EnvelopeStatus.DocumentSigned - Return Database.GetScalarValue($"SELECT ACTION_DATE FROM [DD_ECM].[dbo].[TBSIG_ENVELOPE_HISTORY] WHERE ENVELOPE_ID = {pEnvelopeId} + Dim value = Database.GetScalarValue($"SELECT ACTION_DATE FROM [DD_ECM].[dbo].[TBSIG_ENVELOPE_HISTORY] WHERE ENVELOPE_ID = {pEnvelopeId} And USER_REFERENCE = '{pEmailAddress}' AND [STATUS] = {oStatusInt}") + If value Is Nothing OrElse value Is DBNull.Value Then + Return DateTime.MinValue + End If + + If TypeOf value Is DateTime Then + Return DirectCast(value, DateTime) + End If + + Dim parsedDate As DateTime + If DateTime.TryParse(value.ToString(), parsedDate) Then + Return parsedDate + End If + + Return DateTime.MinValue Catch ex As Exception Logger.Error(ex) - Return Nothing + Return DateTime.MinValue End Try End Function From 0d56ac74489d428fdbb436685a9d1606017f6d36 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 00:02:32 +0100 Subject: [PATCH 03/27] Downgrade several NuGet package dependencies Reverted multiple packages in packages.config to earlier versions, including EntityFramework, System.Text.Json, System.Buffers, and others. These downgrades address compatibility issues and ensure alignment with other project dependencies. --- EnvelopeGenerator.BBTests/packages.config | 30 +++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/EnvelopeGenerator.BBTests/packages.config b/EnvelopeGenerator.BBTests/packages.config index 1114c525..2b6489de 100644 --- a/EnvelopeGenerator.BBTests/packages.config +++ b/EnvelopeGenerator.BBTests/packages.config @@ -15,13 +15,13 @@ - + - + @@ -62,10 +62,10 @@ - + - - + + @@ -74,23 +74,23 @@ - + - - + + - - + + - + - - + + - - + + \ No newline at end of file From 2f41348c5902b36360efe91b3b7d6e35f27faf18 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 01:23:06 +0100 Subject: [PATCH 04/27] Add System.ComponentModel.Annotations NuGet package Added System.ComponentModel.Annotations v4.7.0 to support data validation and metadata attributes in .NET Framework 4.8 projects. --- EnvelopeGenerator.Service/packages.config | 1 + 1 file changed, 1 insertion(+) diff --git a/EnvelopeGenerator.Service/packages.config b/EnvelopeGenerator.Service/packages.config index b3d22784..86eb10dc 100644 --- a/EnvelopeGenerator.Service/packages.config +++ b/EnvelopeGenerator.Service/packages.config @@ -27,6 +27,7 @@ + From 69892d566c7eb27ff7b13b94263f28df07b0aec7 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 01:23:26 +0100 Subject: [PATCH 05/27] Add System.ComponentModel.Annotations reference to project Added a reference to System.ComponentModel.Annotations v4.2.1.0 in EnvelopeGenerator.Service.vbproj, specifying the HintPath to the appropriate DLL in the packages directory. This enables use of additional data annotation attributes in the project. --- EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj index 7c4d2948..f9faacfa 100644 --- a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj +++ b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj @@ -235,6 +235,9 @@ ..\packages\System.Collections.Immutable.8.0.0\lib\net462\System.Collections.Immutable.dll + + ..\packages\System.ComponentModel.Annotations.4.7.0\lib\net461\System.ComponentModel.Annotations.dll + From 82c85643c81c2b80a2e3e17814a190d1f3616674 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 01:45:46 +0100 Subject: [PATCH 06/27] Add EF Core, SqlClient, and Microsoft.Extensions packages Updated .vbproj and packages.config to include references and NuGet packages for Microsoft.Data.SqlClient, Entity Framework Core, AutoMapper, and various Microsoft.Extensions libraries (configuration, logging, caching, options). Added import and error checks for SqlClient SNI targets. No source code changes; all updates are related to project and package management. --- .../EnvelopeGenerator.Service.vbproj | 59 +++++++++++++++++++ EnvelopeGenerator.Service/packages.config | 52 ++++++++++------ 2 files changed, 94 insertions(+), 17 deletions(-) diff --git a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj index f9faacfa..943edb50 100644 --- a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj +++ b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj @@ -291,6 +291,63 @@ + + ..\packages\Microsoft.Data.SqlClient.6.1.4\lib\net462\Microsoft.Data.SqlClient.dll + + + ..\packages\AutoMapper.10.1.1\lib\net461\AutoMapper.dll + + + ..\packages\DigitalData.Core.Abstraction.Application.1.6.0\lib\net462\DigitalData.Core.Abstraction.Application.dll + + + ..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll + + + ..\packages\Microsoft.EntityFrameworkCore.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll + + + ..\packages\Microsoft.EntityFrameworkCore.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Abstractions.dll + + + ..\packages\Microsoft.EntityFrameworkCore.Relational.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Relational.dll + + + ..\packages\Microsoft.EntityFrameworkCore.SqlServer.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.SqlServer.dll + + + ..\packages\Microsoft.Extensions.Caching.Abstractions.8.0.0\lib\net462\Microsoft.Extensions.Caching.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Caching.Memory.8.0.1\lib\net462\Microsoft.Extensions.Caching.Memory.dll + + + ..\packages\Microsoft.Extensions.Configuration.7.0.0\lib\net462\Microsoft.Extensions.Configuration.dll + + + ..\packages\Microsoft.Extensions.Configuration.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Configuration.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Configuration.Binder.7.0.0\lib\net462\Microsoft.Extensions.Configuration.Binder.dll + + + ..\packages\Microsoft.Extensions.Logging.7.0.0\lib\net462\Microsoft.Extensions.Logging.dll + + + ..\packages\Microsoft.Extensions.Options.8.0.2\lib\net462\Microsoft.Extensions.Options.dll + + + ..\packages\Microsoft.Extensions.Options.ConfigurationExtensions.7.0.0\lib\net462\Microsoft.Extensions.Options.ConfigurationExtensions.dll + + + ..\packages\Microsoft.Extensions.Primitives.8.0.0\lib\net462\Microsoft.Extensions.Primitives.dll + + + ..\packages\System.Data.Common.4.3.0\lib\net451\System.Data.Common.dll + + + ..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll + @@ -398,7 +455,9 @@ + + diff --git a/EnvelopeGenerator.Service/packages.config b/EnvelopeGenerator.Service/packages.config index 86eb10dc..8985181f 100644 --- a/EnvelopeGenerator.Service/packages.config +++ b/EnvelopeGenerator.Service/packages.config @@ -1,34 +1,36 @@  + - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - + + + + @@ -39,4 +41,20 @@ + + + + + + + + + + + + + + + + \ No newline at end of file From c523153654505c8920e0a26f943d3eb4c8e596fc Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 02:16:58 +0100 Subject: [PATCH 07/27] Add "Full Finalize Test" button for PDF finalization debug Added a new "Full Finalize Test" button to frmFinalizePDF, along with its event handler. The handler loads annotation data, document bytes, and related entities, logs detailed information about the envelope and signatures, and tests the PDF annotation burning process. The result is saved to the desktop and opened automatically. Also added necessary repository/entity imports for EF Core access. This feature aids in debugging and verifying the full PDF finalization workflow. --- .../frmFinalizePDF.Designer.vb | 12 +++ EnvelopeGenerator.BBTests/frmFinalizePDF.vb | 84 +++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/EnvelopeGenerator.BBTests/frmFinalizePDF.Designer.vb b/EnvelopeGenerator.BBTests/frmFinalizePDF.Designer.vb index 5a2794e2..2cd0616b 100644 --- a/EnvelopeGenerator.BBTests/frmFinalizePDF.Designer.vb +++ b/EnvelopeGenerator.BBTests/frmFinalizePDF.Designer.vb @@ -27,6 +27,7 @@ Partial Class frmFinalizePDF Me.Label2 = New System.Windows.Forms.Label() Me.Button1 = New System.Windows.Forms.Button() Me.Button2 = New System.Windows.Forms.Button() + Me.Button3 = New System.Windows.Forms.Button() Me.txtResult = New System.Windows.Forms.TextBox() Me.txtEnvelope = New System.Windows.Forms.TextBox() Me.SuspendLayout() @@ -75,6 +76,15 @@ Partial Class frmFinalizePDF Me.Button2.Text = "Merge Json" Me.Button2.UseVisualStyleBackColor = True ' + 'Button3 + ' + Me.Button3.Location = New System.Drawing.Point(15, 160) + Me.Button3.Name = "Button3" + Me.Button3.Size = New System.Drawing.Size(166, 23) + Me.Button3.TabIndex = 5 + Me.Button3.Text = "Full Finalize Test" + Me.Button3.UseVisualStyleBackColor = True + ' 'txtResult ' Me.txtResult.Location = New System.Drawing.Point(333, 12) @@ -97,6 +107,7 @@ Partial Class frmFinalizePDF Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(800, 450) Me.Controls.Add(Me.txtResult) + Me.Controls.Add(Me.Button3) Me.Controls.Add(Me.Button2) Me.Controls.Add(Me.Button1) Me.Controls.Add(Me.Label2) @@ -116,5 +127,6 @@ Partial Class frmFinalizePDF Friend WithEvents Label2 As Label Friend WithEvents Button1 As Button Friend WithEvents Button2 As Button + Friend WithEvents Button3 As Button Friend WithEvents txtResult As TextBox End Class diff --git a/EnvelopeGenerator.BBTests/frmFinalizePDF.vb b/EnvelopeGenerator.BBTests/frmFinalizePDF.vb index 56122a17..24847ec0 100644 --- a/EnvelopeGenerator.BBTests/frmFinalizePDF.vb +++ b/EnvelopeGenerator.BBTests/frmFinalizePDF.vb @@ -8,6 +8,8 @@ Imports Newtonsoft.Json.Linq Imports EnvelopeGenerator.Infrastructure Imports Microsoft.EntityFrameworkCore Imports DigitalData.Core.Abstractions +Imports DigitalData.Core.Abstraction.Application.Repository +Imports EnvelopeGenerator.Domain.Entities Public Class frmFinalizePDF Private Const CONNECTIONSTRING = "Server=sDD-VMP04-SQL17\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=+bk8oAbbQP1AzoHtvZUbd+Mbok2f8Fl4miEx1qssJ5yEaEWoQJ9prg4L14fURpPnqi1WMNs9fE4=;" + "Encrypt=True;TrustServerCertificate=True;" @@ -124,4 +126,86 @@ Public Class frmFinalizePDF txtResult.Text = oJObject1.ToString() End Sub + + Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click + Try + Dim envelopeId As Integer = CInt(txtEnvelope.Text) + Dim log As New System.Text.StringBuilder() + + ' 1. Load annotation JSON data (same as Service) + Dim oTable = LoadAnnotationDataForEnvelope() + Dim oJsonList = oTable.Rows. + Cast(Of DataRow). + Select(Function(r As DataRow) r.Item("VALUE").ToString()). + ToList() + log.AppendLine($"Annotation JSON count: {oJsonList.Count}") + + ' 2. Load document bytes (same as Service) + Dim oBuffer As Byte() = ReadEnvelope(envelopeId) + log.AppendLine($"Document bytes: {oBuffer.Length}") + + ' 3. Check what BurnAnnotsToPDF will do internally + Using scope = Factory.Shared.ScopeFactory.CreateScope() + Dim envRepo = scope.ServiceProvider.Repository(Of Envelope)() + Dim envelope = envRepo.Where(Function(env) env.Id = envelopeId).FirstOrDefault() + + If envelope Is Nothing Then + log.AppendLine("ERROR: Envelope not found in EF Core!") + txtResult.Text = log.ToString() + Return + End If + + log.AppendLine($"Envelope found: Id={envelope.Id}, EnvelopeTypeId={envelope.EnvelopeTypeId}") + log.AppendLine($"ReadOnly (IsReadAndConfirm): {envelope.ReadOnly}") + + If envelope.ReadOnly Then + log.AppendLine(">>> EARLY RETURN: ReadOnly=True, original PDF returned without burning") + txtResult.Text = log.ToString() + Return + End If + + Dim sigRepo = scope.ServiceProvider.Repository(Of Signature)() + Dim elements = sigRepo _ + .Where(Function(sig) sig.Document.EnvelopeId = envelopeId) _ + .Include(Function(sig) sig.Annotations) _ + .ToList() + + log.AppendLine($"Elements (Signature) count: {elements.Count}") + + If elements.Any() Then + log.AppendLine(">>> PATH: BurnElementAnnotsToPDF (new element-based path)") + For Each elem In elements + Dim annotCount = If(elem.Annotations IsNot Nothing, elem.Annotations.Count(), 0) + log.AppendLine($" Element Id={elem.Id}, Page={elem.Page}, X={elem.X}, Y={elem.Y}, W={elem.Width}, H={elem.Height}, Annotations={annotCount}") + If elem.Annotations IsNot Nothing Then + For Each annot In elem.Annotations + log.AppendLine($" Annot: Name={annot.Name}, Type={annot.Type}, X={annot.X}, Y={annot.Y}, W={annot.Width}, H={annot.Height}") + Next + End If + Next + Else + log.AppendLine(">>> PATH: BurnInstantJSONAnnotsToPDF (old JSON-based path)") + End If + End Using + + ' 4. Actually call BurnAnnotsToPDF (same as Service) + log.AppendLine("") + log.AppendLine("Calling BurnAnnotsToPDF...") + Dim oNewBuffer = PDFBurner.BurnAnnotsToPDF(oBuffer, oJsonList, envelopeId) + log.AppendLine($"Result bytes: {oNewBuffer.Length}") + log.AppendLine($"Same as input: {oBuffer.Length = oNewBuffer.Length AndAlso oBuffer.SequenceEqual(oNewBuffer)}") + + ' 5. Write output + Dim desktopPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + Dim oNewPath = Path.Combine(desktopPath, $"E{txtEnvelope.Text}_FullTest.burned.pdf") + File.WriteAllBytes(oNewPath, oNewBuffer) + log.AppendLine($"Output: {oNewPath}") + + txtResult.Text = log.ToString() + Process.Start(oNewPath) + + Catch ex As Exception + txtResult.Text = $"ERROR: {ex.Message}{vbCrLf}{vbCrLf}{ex.ToString()}" + End Try + End Sub End Class \ No newline at end of file From 8a534b84d001b2d7858b21d29880e05273e3b092 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 02:17:17 +0100 Subject: [PATCH 08/27] Update NuGet packages and binding redirects to latest versions Updated NuGet package references and assembly binding redirects in App.config, EnvelopeGenerator.Service.vbproj, and packages.config to newer versions compatible with .NET 4.8/4.6.2/4.6.3. No application logic changes; these updates ensure dependency consistency and improved framework compatibility. --- EnvelopeGenerator.Service/App.config | 12 ++--- .../EnvelopeGenerator.Service.vbproj | 29 ++++++------ EnvelopeGenerator.Service/packages.config | 46 +++++++++---------- 3 files changed, 43 insertions(+), 44 deletions(-) diff --git a/EnvelopeGenerator.Service/App.config b/EnvelopeGenerator.Service/App.config index a817cfcc..9349ae8f 100644 --- a/EnvelopeGenerator.Service/App.config +++ b/EnvelopeGenerator.Service/App.config @@ -15,7 +15,7 @@ - + @@ -23,15 +23,15 @@ - + - + - + @@ -39,7 +39,7 @@ - + @@ -135,7 +135,7 @@ - + diff --git a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj index 943edb50..17e5ead9 100644 --- a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj +++ b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj @@ -226,8 +226,8 @@ ..\packages\RtfPipe.2.0.7677.4303\lib\net45\RtfPipe.dll - - ..\packages\System.Buffers.4.6.0\lib\net462\System.Buffers.dll + + ..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll ..\packages\System.CodeDom.8.0.0\lib\net462\System.CodeDom.dll @@ -251,18 +251,18 @@ ..\packages\System.IO.Packaging.8.0.1\lib\net462\System.IO.Packaging.dll - - ..\packages\System.Memory.4.6.0\lib\net462\System.Memory.dll + + ..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll ..\packages\Microsoft.AspNet.WebApi.Client.6.0.0\lib\net45\System.Net.Http.Formatting.dll - - ..\packages\System.Numerics.Vectors.4.6.0\lib\net462\System.Numerics.Vectors.dll + + ..\packages\System.Numerics.Vectors.4.6.1\lib\net462\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.6.1.0\lib\net462\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll @@ -278,12 +278,12 @@ ..\packages\System.Text.Json.8.0.6\lib\net462\System.Text.Json.dll - - ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + ..\packages\System.Threading.Tasks.Extensions.4.6.0\lib\net462\System.Threading.Tasks.Extensions.dll - - ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + ..\packages\System.ValueTuple.4.6.1\lib\net462\System.ValueTuple.dll @@ -293,7 +293,7 @@ ..\packages\Microsoft.Data.SqlClient.6.1.4\lib\net462\Microsoft.Data.SqlClient.dll - + ..\packages\AutoMapper.10.1.1\lib\net461\AutoMapper.dll @@ -459,5 +459,4 @@ - - + \ No newline at end of file diff --git a/EnvelopeGenerator.Service/packages.config b/EnvelopeGenerator.Service/packages.config index 8985181f..86c8073d 100644 --- a/EnvelopeGenerator.Service/packages.config +++ b/EnvelopeGenerator.Service/packages.config @@ -2,8 +2,16 @@ - + + + + + + + + + @@ -25,7 +33,15 @@ - + + + + + + + + + @@ -33,28 +49,12 @@ - - - + + + - - - - - - - - - - - - - - - - - - + + \ No newline at end of file From eb5db3d6bed2a50f3b71addf5f8909f8c7cc3304 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 02:44:12 +0100 Subject: [PATCH 09/27] Remove StatusChangedWhen from DocumentStatus entity The StatusChangedWhen property, previously required and mapped to the "STATUS_CHANGED_WHEN" column, has been removed from the DocumentStatus entity in the EnvelopeGenerator.Domain.Entities namespace. This change simplifies the entity and its mapping. --- EnvelopeGenerator.Domain/Entities/DocumentStatus.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/EnvelopeGenerator.Domain/Entities/DocumentStatus.cs b/EnvelopeGenerator.Domain/Entities/DocumentStatus.cs index 3bec79c7..7a3a8fcd 100644 --- a/EnvelopeGenerator.Domain/Entities/DocumentStatus.cs +++ b/EnvelopeGenerator.Domain/Entities/DocumentStatus.cs @@ -35,7 +35,6 @@ namespace EnvelopeGenerator.Domain.Entities [Column("STATUS")] public Constants.DocumentStatus Status { get; set; } - [Required] [Column("STATUS_CHANGED_WHEN", TypeName = "datetime")] public DateTime? StatusChangedWhen { get; set; } From 7281cb47c38c30328fc659d75b0c46c0f8097f63 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 03:25:38 +0100 Subject: [PATCH 10/27] Remove duplicate ProjectReference in BBTests.vbproj Eliminated a redundant ProjectReference to EnvelopeGenerator.CommonServices.vbproj from the EnvelopeGenerator.BBTests.vbproj file, ensuring only a single reference remains. This helps prevent potential build issues and maintains project file clarity. --- EnvelopeGenerator.BBTests/EnvelopeGenerator.BBTests.vbproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/EnvelopeGenerator.BBTests/EnvelopeGenerator.BBTests.vbproj b/EnvelopeGenerator.BBTests/EnvelopeGenerator.BBTests.vbproj index de126637..63b3db6d 100644 --- a/EnvelopeGenerator.BBTests/EnvelopeGenerator.BBTests.vbproj +++ b/EnvelopeGenerator.BBTests/EnvelopeGenerator.BBTests.vbproj @@ -487,10 +487,6 @@ {6EA0C51F-C2B1-4462-8198-3DE0B32B74F8} EnvelopeGenerator.CommonServices - - {6ea0c51f-c2b1-4462-8198-3de0b32b74f8} - EnvelopeGenerator.CommonServices - {4f32a98d-e6f0-4a09-bd97-1cf26107e837} EnvelopeGenerator.Domain From 466d0a3a7aa0497c2fa1b0e8898ed330fc0d3390 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 04:07:14 +0100 Subject: [PATCH 11/27] Refactor envelope and annotation data retrieval logic Add private helper functions ReadEnvelope and LoadAnnotationDataForEnvelope to centralize retrieval of envelope byte data and annotation JSON from the database. Update PDF annotation burning logic to use these helpers, improving code reuse and testability. --- .../FinalizeDocument/FinalizeDocumentJob.vb | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb index cfd2af5e..c921b4df 100644 --- a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb +++ b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb @@ -230,6 +230,29 @@ Namespace Jobs 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() @@ -418,7 +441,18 @@ Namespace Jobs End Try End If - Return PDFBurner.BurnAnnotsToPDF(oInputDocumentBuffer, oAnnotations, pEnvelopeData.EnvelopeId) +#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 From b20aafe7a512a404367d2a309d730756d2391d26 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 04:07:28 +0100 Subject: [PATCH 12/27] Fix PDF/A conversion status check in PDFMerger Previously, the code checked the status of the original document after converting the merged PDF to PDF/A, which could miss conversion errors. Now, it correctly checks the status of the merged PDF to ensure the conversion succeeded. --- .../Jobs/FinalizeDocument/PDFMerger.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/PDFMerger.vb b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/PDFMerger.vb index 207a916c..f0c3f963 100644 --- a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/PDFMerger.vb +++ b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/PDFMerger.vb @@ -56,7 +56,7 @@ Public Class PDFMerger ' Convert to PDF/A oMergedPDF.ConvertToPDFA(oFinalStream, PDFAConformanceLevel, ALLOW_VECTORIZATION, ALLOW_RASTERIZATION) - oStatus = oDocumentPDF.GetStat() + oStatus = oMergedPDF.GetStat() If oStatus <> GdPictureStatus.OK Then Throw New MergeDocumentException($"Document could not be converted to PDF/A: {oStatus}") End If From 1f5468b1ac54f8989cf5e396ee5ea395e3da7df6 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 10 Mar 2026 04:07:37 +0100 Subject: [PATCH 13/27] Refactor PDF canvas transform to use Save/Restore state Move Y-axis flip transform inside signature drawing block and wrap with SaveState/RestoreState to prevent side effects on other drawing operations and pages. Removes redundant page-level transformation for better encapsulation. --- EnvelopeGenerator.PdfEditor/Pdf.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/EnvelopeGenerator.PdfEditor/Pdf.cs b/EnvelopeGenerator.PdfEditor/Pdf.cs index 03b629f0..22011f72 100644 --- a/EnvelopeGenerator.PdfEditor/Pdf.cs +++ b/EnvelopeGenerator.PdfEditor/Pdf.cs @@ -105,17 +105,13 @@ namespace EnvelopeGenerator.PdfEditor public Pdf Background(IEnumerable signatures, double widthPx = 1.9500000000000002, double heightPx = 2.52) where TSignature : ISignature { - // once per page - Page(page => - { - var canvas = new PdfCanvas(page); - canvas.ConcatMatrix(1, 0, 0, -1, 0, page.GetPageSize().GetHeight()); - }); - foreach (var signature in signatures) Page(signature.Page, page => { var canvas = new PdfCanvas(page); + canvas.SaveState(); + canvas.ConcatMatrix(1, 0, 0, -1, 0, page.GetPageSize().GetHeight()); + double inchFactor = 72; double magin = .2; double x = (signature.X - .7 - magin) * inchFactor; @@ -134,6 +130,8 @@ namespace EnvelopeGenerator.PdfEditor canvas.SetFillColor(new DeviceRgb(204, 202, 198)) .Rectangle(x, y + height - bottomLineLength, width, bottomLineLength) .Fill(); + + canvas.RestoreState(); }); return this; From ca9e25abcbbee49c24b9aa3f1fd1a6c16675a0a5 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 09:28:40 +0100 Subject: [PATCH 14/27] Add IsReadAndSign extension method to IEnvelope Introduced the IsReadAndSign method to IEnvelope extensions, which returns true when EnvelopeTypeId is not 2. This allows clear differentiation between "Read and Sign" and "Read and Confirm" envelope types. --- EnvelopeGenerator.Domain/Interfaces/IEnvelope.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/EnvelopeGenerator.Domain/Interfaces/IEnvelope.cs b/EnvelopeGenerator.Domain/Interfaces/IEnvelope.cs index bdc709c6..f4647701 100644 --- a/EnvelopeGenerator.Domain/Interfaces/IEnvelope.cs +++ b/EnvelopeGenerator.Domain/Interfaces/IEnvelope.cs @@ -11,5 +11,10 @@ { return envelope.EnvelopeTypeId == 2; } + + public static bool IsReadAndSign(this IEnvelope envelope) + { + return envelope.EnvelopeTypeId != 2; + } } } \ No newline at end of file From fa73d939b5849d7a8d79105b0152da19bee23445 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 09:29:24 +0100 Subject: [PATCH 15/27] Only check rejection for read-and-sign envelopes Previously, rejection checks were performed for all envelopes. Now, the code checks for rejecting receivers only if the envelope is of the "read-and-sign" type, avoiding unnecessary queries and logic for other envelope types. --- .../Controllers/EnvelopeController.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs index 4bc9692e..11292c49 100644 --- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs @@ -7,6 +7,7 @@ using EnvelopeGenerator.Application.Common.Interfaces.Services; using EnvelopeGenerator.Application.EnvelopeReceivers.Queries; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Constants; +using EnvelopeGenerator.Domain.Interfaces; using EnvelopeGenerator.PdfEditor; using EnvelopeGenerator.Web.Extensions; using EnvelopeGenerator.Web.Models; @@ -162,13 +163,16 @@ public class EnvelopeController : ViewControllerBase } var er_secret = er_secret_res.Data; - //check rejection - var rejRcvrs = await _historyService.ReadRejectingReceivers(er_secret.Envelope!.Id); - if (rejRcvrs.Any()) + //check rejection if the envelope is read-and-sign + if (er_secret.Envelope.IsReadAndSign()) { - await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); - ViewBag.IsExt = !rejRcvrs.Contains(er_secret.Receiver); //external if the current user is not rejected - return View("EnvelopeRejected", er_secret); + var rejRcvrs = await _historyService.ReadRejectingReceivers(er_secret.Envelope!.Id); + if (rejRcvrs.Any()) + { + await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); + ViewBag.IsExt = !rejRcvrs.Contains(er_secret.Receiver); //external if the current user is not rejected + return View("EnvelopeRejected", er_secret); + } } // show envelope if already logged in From 200258ff736773f66b5e63e5c00bb723c793b660 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 09:43:22 +0100 Subject: [PATCH 16/27] Update EnvelopeDto.ReadOnly to use IsReadAndConfirm() Refactored the ReadOnly property in EnvelopeDto to use the IsReadAndConfirm() extension method instead of directly checking EnvelopeTypeId. Marked the property as [Obsolete] and advised using EnvelopeExtensions.IsReadAndConfirm. --- EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs b/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs index 01c24251..1222c343 100644 --- a/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs +++ b/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs @@ -75,10 +75,12 @@ public record EnvelopeDto : IEnvelope /// public int? EnvelopeTypeId { get; set; } + // TODO: use ReadAndConfirm property name /// /// /// - public bool ReadOnly => EnvelopeTypeId == 2; + [Obsolete("Use EnvelopeExtensions.IsReadAndConfirm extension metot instead.")] + public bool ReadOnly => this.IsReadAndConfirm(); /// /// From 8054bb377dffeb8e6ded01c9e8f17bc03db53f90 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 09:43:35 +0100 Subject: [PATCH 17/27] Refine rejection check for read-and-sign envelopes Only return 423 Locked if envelope is read-and-sign and has a rejection history. Also add missing using for Domain.Interfaces in AnnotationController. --- EnvelopeGenerator.Web/Controllers/AnnotationController.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.Web/Controllers/AnnotationController.cs b/EnvelopeGenerator.Web/Controllers/AnnotationController.cs index e2d64966..aacd27de 100644 --- a/EnvelopeGenerator.Web/Controllers/AnnotationController.cs +++ b/EnvelopeGenerator.Web/Controllers/AnnotationController.cs @@ -6,6 +6,7 @@ using EnvelopeGenerator.Application.Common.Notifications.DocSigned; using EnvelopeGenerator.Application.EnvelopeReceivers.Queries; using EnvelopeGenerator.Application.Histories.Queries; using EnvelopeGenerator.Domain.Constants; +using EnvelopeGenerator.Domain.Interfaces; using EnvelopeGenerator.Web.Extensions; using MediatR; using Microsoft.AspNetCore.Authentication; @@ -65,7 +66,7 @@ public class AnnotationController : ControllerBase // Again check if receiver has already signed if (await _mediator.IsSignedAsync(uuid, signature, cancel)) return Problem(statusCode: 409); - else if (await _mediator.AnyHistoryAsync(uuid, new[] { EnvelopeStatus.EnvelopeRejected, EnvelopeStatus.DocumentRejected }, cancel)) + else if (er.Envelope.IsReadAndSign() && await _mediator.AnyHistoryAsync(uuid, new[] { EnvelopeStatus.EnvelopeRejected, EnvelopeStatus.DocumentRejected }, cancel)) return Problem(statusCode: 423); var docSignedNotification = await _mediator From 717da90c01017fbd600ab4ca0e66176451d46446 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 11:07:33 +0100 Subject: [PATCH 18/27] Add .NET 7.0 support and update project dependencies Added net7.0 to TargetFrameworks in EnvelopeGenerator.Web.csproj and introduced a conditional ItemGroup with required package references for .NET 7.0 compatibility. Also removed clipboard2.svg from the list of included static files. --- .../EnvelopeGenerator.Web.csproj | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj index f2d2c9fe..926b4f88 100644 --- a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj +++ b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj @@ -1,7 +1,7 @@  - net8.0;net9.0 + net7.0;net8.0;net9.0 enable enable EnvelopeGenerator.Web @@ -626,7 +626,6 @@ - @@ -2093,6 +2092,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From 48b7afcdc1d6c3d0702cb90d543bc8d9fb816edf Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 11:16:08 +0100 Subject: [PATCH 19/27] Restrict rejection check to ReadAndSign envelopes Previously, rejection logic was applied to all envelopes. Now, the check for rejected receivers and the "EnvelopeRejected" view are only executed if the envelope is of the "ReadAndSign" type, preventing unnecessary rejection handling for other envelope types. --- .../Controllers/EnvelopeController.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs index 11292c49..11f030cf 100644 --- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs @@ -80,12 +80,15 @@ public class EnvelopeController : ViewControllerBase #region Rejected or Signed //check rejection - var rejRcvrs = await _historyService.ReadRejectingReceivers(er.Envelope!.Id); - if (rejRcvrs.Any()) + if (er.Envelope.IsReadAndSign()) { - await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); - ViewBag.IsExt = !rejRcvrs.Contains(er.Receiver); //external if the current user is not rejected - return View("EnvelopeRejected", er); + var rejRcvrs = await _historyService.ReadRejectingReceivers(er.Envelope!.Id); + if (rejRcvrs.Any()) + { + await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); + ViewBag.IsExt = !rejRcvrs.Contains(er.Receiver); //external if the current user is not rejected + return View("EnvelopeRejected", er); + } } //check if it has already signed From e724a74f9cca604d8fbf3d82634c0354968cc191 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 11:19:17 +0100 Subject: [PATCH 20/27] Bump version to 3.12.1 in project file Updated , , and in EnvelopeGenerator.Web.csproj from 3.12.0 to 3.12.1 to reflect a new patch release. No other changes were made. --- EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj index 926b4f88..d0084524 100644 --- a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj +++ b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj @@ -12,9 +12,9 @@ digital data envelope generator web EnvelopeGenerator.Web is an ASP.NET MVC application developed to manage signing processes. It uses Entity Framework Core (EF Core) for database operations. The user interface for signing processes is developed with Razor View Engine (.cshtml files) and JavaScript under wwwroot, integrated with PSPDFKit. This integration allows users to view and sign documents seamlessly. Assets\icon.ico - 3.12.0 - 3.12.0.0 - 3.12.0.0 + 3.12.1 + 3.12.1.0 + 3.12.1.0 Copyright © 2025 Digital Data GmbH. All rights reserved. From 5e840db04ca18d4ec64873fee6d8feb2ebd5b235 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 12:05:20 +0100 Subject: [PATCH 21/27] Refactor envelope rejection logic in EnvelopeController Clarified and streamlined the handling of rejected envelopes: - Moved retrieval of rejecting receivers for clarity. - Signed out users when any rejecting receivers are present. - Improved determination of "external" users. - Updated condition for showing the EnvelopeRejected view. - Temporarily hardcoded ViewBag.IsExt with a TODO for future fix. - Removed redundant code for better maintainability. --- .../Controllers/EnvelopeController.cs | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs index 11f030cf..e8068bd2 100644 --- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs @@ -79,14 +79,16 @@ public class EnvelopeController : ViewControllerBase return this.ViewEnvelopeNotFound(); #region Rejected or Signed - //check rejection - if (er.Envelope.IsReadAndSign()) + var rejRcvrs = await _historyService.ReadRejectingReceivers(er.Envelope!.Id); + if (rejRcvrs.Any()) { - var rejRcvrs = await _historyService.ReadRejectingReceivers(er.Envelope!.Id); - if (rejRcvrs.Any()) + await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); + var isExt = !rejRcvrs.Where(rcv => rcv.Id == er.Receiver!.Id).Any(); //external if the current user is not rejected + + if (er.Envelope.IsReadAndSign() || !isExt) { - await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); - ViewBag.IsExt = !rejRcvrs.Contains(er.Receiver); //external if the current user is not rejected + //TODO: Normally assigned to the isExt variable. However, since the relevant keys are not defined in the resx files, it was assigned false. Fix this. + ViewBag.IsExt = true; return View("EnvelopeRejected", er); } } @@ -166,14 +168,17 @@ public class EnvelopeController : ViewControllerBase } var er_secret = er_secret_res.Data; - //check rejection if the envelope is read-and-sign - if (er_secret.Envelope.IsReadAndSign()) + var rejRcvrs = await _historyService.ReadRejectingReceivers(er_secret.Envelope!.Id); + if (rejRcvrs.Any()) { - var rejRcvrs = await _historyService.ReadRejectingReceivers(er_secret.Envelope!.Id); - if (rejRcvrs.Any()) + await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); + var isExt = !rejRcvrs.Where(rcv => rcv.Id == er_secret.Receiver!.Id).Any(); //external if the current user is not rejected + + //check rejection if the envelope is read-and-sign or non-external (internal) + if (er_secret.Envelope.IsReadAndSign() || !isExt) { - await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); - ViewBag.IsExt = !rejRcvrs.Contains(er_secret.Receiver); //external if the current user is not rejected + //TODO: Normally assigned to the isExt variable. However, since the relevant keys are not defined in the resx files, it was assigned false. Fix this. + ViewBag.IsExt = true; return View("EnvelopeRejected", er_secret); } } From 60db762bccc26da243b642a77f373b88c5100b76 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 12:08:48 +0100 Subject: [PATCH 22/27] Bump project version to 3.12.2 Updated EnvelopeGenerator.Web.csproj to increment , , and from 3.12.1 to 3.12.2, reflecting the new release. No other changes were made. --- EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj index d0084524..938b874c 100644 --- a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj +++ b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj @@ -12,9 +12,9 @@ digital data envelope generator web EnvelopeGenerator.Web is an ASP.NET MVC application developed to manage signing processes. It uses Entity Framework Core (EF Core) for database operations. The user interface for signing processes is developed with Razor View Engine (.cshtml files) and JavaScript under wwwroot, integrated with PSPDFKit. This integration allows users to view and sign documents seamlessly. Assets\icon.ico - 3.12.1 - 3.12.1.0 - 3.12.1.0 + 3.12.2 + 3.12.2.0 + 3.12.2.0 Copyright © 2025 Digital Data GmbH. All rights reserved. From 7cb1546934d8422748001085931caeab37f6ed18 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 12:09:23 +0100 Subject: [PATCH 23/27] Add Reject endpoint to AnnotationController Introduced a new Reject endpoint for users with the ReceiverFull role to reject annotations, with optional reason support. Marked the endpoint as obsolete for future exception handling updates. Also standardized the Unauthorized response to remove the custom error message. --- EnvelopeGenerator.Web/Controllers/AnnotationController.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.Web/Controllers/AnnotationController.cs b/EnvelopeGenerator.Web/Controllers/AnnotationController.cs index aacd27de..0cecccf0 100644 --- a/EnvelopeGenerator.Web/Controllers/AnnotationController.cs +++ b/EnvelopeGenerator.Web/Controllers/AnnotationController.cs @@ -81,6 +81,7 @@ public class AnnotationController : ControllerBase return Ok(); } + //TODO: add logic to check if it is already rejected or signed [Authorize(Roles = Role.ReceiverFull)] [HttpPost("reject")] [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")] @@ -101,7 +102,7 @@ public class AnnotationController : ControllerBase if (envRcvRes.IsFailed) { _logger.LogNotice(envRcvRes.Notices); - return Unauthorized("you are not authirized"); + return Unauthorized(); } var histRes = await _histService.RecordAsync(envRcvRes.Data.EnvelopeId, userReference: mail, EnvelopeStatus.DocumentRejected, comment: reason); From 06c2a07fbcfd9657dd19b218d76b141da7bc1ba8 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 14:11:23 +0100 Subject: [PATCH 24/27] Replace DateTime.UtcNow with DateTime.Now for timestamps Switched all audit and creation timestamps from UTC to local time by replacing DateTime.UtcNow with DateTime.Now across the codebase. This affects audit fields, object creation, and default values for date/time properties. --- .../Common/Extensions/AutoMapperAuditingExtensions.cs | 4 ++-- .../Common/Notifications/SendMailHandler.cs | 2 +- EnvelopeGenerator.Application/DocStatus/MappingProfile.cs | 2 +- .../Histories/Commands/CreateHistoryCommand.cs | 2 +- EnvelopeGenerator.Tests/Application/Fake.cs | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/EnvelopeGenerator.Application/Common/Extensions/AutoMapperAuditingExtensions.cs b/EnvelopeGenerator.Application/Common/Extensions/AutoMapperAuditingExtensions.cs index 4ce31eb1..72f2abef 100644 --- a/EnvelopeGenerator.Application/Common/Extensions/AutoMapperAuditingExtensions.cs +++ b/EnvelopeGenerator.Application/Common/Extensions/AutoMapperAuditingExtensions.cs @@ -13,12 +13,12 @@ public static class AutoMapperAuditingExtensions /// public static IMappingExpression MapAddedWhen(this IMappingExpression expression) where TDestination : IHasAddedWhen - => expression.ForMember(dest => dest.AddedWhen, opt => opt.MapFrom(_ => DateTime.UtcNow)); + => expression.ForMember(dest => dest.AddedWhen, opt => opt.MapFrom(_ => DateTime.Now)); /// /// Maps to the current UTC time. /// public static IMappingExpression MapChangedWhen(this IMappingExpression expression) where TDestination : IHasChangedWhen - => expression.ForMember(dest => dest.ChangedWhen, opt => opt.MapFrom(_ => DateTime.UtcNow)); + => expression.ForMember(dest => dest.ChangedWhen, opt => opt.MapFrom(_ => DateTime.Now)); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Common/Notifications/SendMailHandler.cs b/EnvelopeGenerator.Application/Common/Notifications/SendMailHandler.cs index 5a97ef03..50cf3662 100644 --- a/EnvelopeGenerator.Application/Common/Notifications/SendMailHandler.cs +++ b/EnvelopeGenerator.Application/Common/Notifications/SendMailHandler.cs @@ -113,7 +113,7 @@ public abstract class SendMailHandler : INotificationHandler() .ForMember(dest => dest.Envelope, opt => opt.Ignore()) .ForMember(dest => dest.Receiver, opt => opt.Ignore()) - .ForMember(dest => dest.StatusChangedWhen, opt => opt.MapFrom(src => DateTime.UtcNow)) + .ForMember(dest => dest.StatusChangedWhen, opt => opt.MapFrom(src => DateTime.Now)) .MapChangedWhen(); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Histories/Commands/CreateHistoryCommand.cs b/EnvelopeGenerator.Application/Histories/Commands/CreateHistoryCommand.cs index c8a53f59..4cd83f01 100644 --- a/EnvelopeGenerator.Application/Histories/Commands/CreateHistoryCommand.cs +++ b/EnvelopeGenerator.Application/Histories/Commands/CreateHistoryCommand.cs @@ -34,7 +34,7 @@ public record CreateHistoryCommand : EnvelopeReceiverQueryBase, IRequest /// /// - public DateTime AddedWhen { get; } = DateTime.UtcNow; + public DateTime AddedWhen { get; } = DateTime.Now; /// /// diff --git a/EnvelopeGenerator.Tests/Application/Fake.cs b/EnvelopeGenerator.Tests/Application/Fake.cs index 1281e7bb..66b3e168 100644 --- a/EnvelopeGenerator.Tests/Application/Fake.cs +++ b/EnvelopeGenerator.Tests/Application/Fake.cs @@ -215,7 +215,7 @@ public static class Extensions Title = faker.Lorem.Paragraph(faker.Random.Number(1, 2)), Message = faker.Lorem.Paragraph(faker.Random.Number(2, 5)), TfaEnabled = tfaEnabled, - AddedWhen = DateTime.UtcNow, + AddedWhen = DateTime.Now, CertificationType = (int)CertificationType.AdvancedElectronicSignature, UseAccessCode = false, ContractType = (int)ContractType.Contract, @@ -273,9 +273,9 @@ public static class Extensions EnvelopeId = envelopeId, ReceiverId = receiverId, Status = ReceiverStatus.Unsigned, - AddedWhen = DateTime.UtcNow, + AddedWhen = DateTime.Now, AccessCode = faker.Random.Number(1000, 9999).ToString(), - ChangedWhen = DateTime.UtcNow, + ChangedWhen = DateTime.Now, CompanyName = faker.Company.CompanyName(), JobTitle = faker.Name.JobTitle(), Name = faker.Name.FullName(), From 05d54e87c3dcefbe930642a914c6da8d042d711d Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 14:19:15 +0100 Subject: [PATCH 25/27] Bump version to 3.12.3 in project file Updated EnvelopeGenerator.Web.csproj to increment , , and from 3.12.2 to 3.12.3, preparing for a new release. No other changes included. --- EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj index 938b874c..6c0e5d59 100644 --- a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj +++ b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj @@ -12,9 +12,9 @@ digital data envelope generator web EnvelopeGenerator.Web is an ASP.NET MVC application developed to manage signing processes. It uses Entity Framework Core (EF Core) for database operations. The user interface for signing processes is developed with Razor View Engine (.cshtml files) and JavaScript under wwwroot, integrated with PSPDFKit. This integration allows users to view and sign documents seamlessly. Assets\icon.ico - 3.12.2 - 3.12.2.0 - 3.12.2.0 + 3.12.3 + 3.12.3.0 + 3.12.3.0 Copyright © 2025 Digital Data GmbH. All rights reserved. From 176672d7eb9ce5e0ca56615728d2a7bd06024e4c Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Mar 2026 17:45:27 +0100 Subject: [PATCH 26/27] Add interface import and update email sending condition 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. --- .../Jobs/FinalizeDocument/FinalizeDocumentJob.vb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb index c921b4df..9b0ca0fe 100644 --- a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb +++ b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb @@ -15,6 +15,7 @@ Imports DigitalData.Core.Abstraction.Application Imports EnvelopeGenerator.Infrastructure Imports Microsoft.EntityFrameworkCore Imports DigitalData.Core.Abstractions +Imports EnvelopeGenerator.Domain.Interfaces Namespace Jobs Public Class FinalizeDocumentJob @@ -350,7 +351,7 @@ Namespace Jobs Logger.Warn($"No SendFinalEmailToCreator - oMailToCreator [{oMailToCreator}] <> [{FinalEmailType.No}] ") End If - If oMailToReceivers <> FinalEmailType.No Then + If oMailToReceivers <> FinalEmailType.No And pEnvelope.IsReadAndSign() Then Logger.Debug("Sending emails to receivers..") SendFinalEmailToReceivers(pEnvelope) ', pAttachment Else From 64c018b92e90ddf2d6ff83fb2db23ef9e2c8a491 Mon Sep 17 00:00:00 2001 From: TekH Date: Thu, 12 Mar 2026 16:11:50 +0100 Subject: [PATCH 27/27] Add DbSets for ElementAnnotation and DocumentStatus Added DocumentReceiverElementAnnotations (ElementAnnotation) and DocumentStatus DbSet properties to EGDbContextBase to support database operations for these entities. --- EnvelopeGenerator.Infrastructure/EGDbContext.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index 468aaa4c..cff50672 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -47,6 +47,8 @@ public abstract class EGDbContextBase : DbContext public DbSet DocumentReceiverElements { get; set; } + public DbSet DocumentReceiverElementAnnotations { get; set; } + public DbSet DocumentStatus { get; set; } public DbSet EmailTemplate { get; set; }