diff --git a/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs b/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs index 029d621a..01c24251 100644 --- a/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs +++ b/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs @@ -2,6 +2,7 @@ using DigitalData.UserManager.Application.DTOs.User; using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Entities; +using EnvelopeGenerator.Domain.Interfaces; using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.Common.Dto; @@ -10,7 +11,7 @@ namespace EnvelopeGenerator.Application.Common.Dto; /// /// [ApiExplorerSettings(IgnoreApi = true)] -public record EnvelopeDto +public record EnvelopeDto : IEnvelope { /// /// diff --git a/EnvelopeGenerator.Application/Common/Notifications/DocSigned/Handlers/SendSignedMailHandler.cs b/EnvelopeGenerator.Application/Common/Notifications/DocSigned/Handlers/SendSignedMailHandler.cs index 73ae86ba..8b7aa4f1 100644 --- a/EnvelopeGenerator.Application/Common/Notifications/DocSigned/Handlers/SendSignedMailHandler.cs +++ b/EnvelopeGenerator.Application/Common/Notifications/DocSigned/Handlers/SendSignedMailHandler.cs @@ -3,6 +3,7 @@ using DigitalData.EmailProfilerDispatcher.Abstraction.Entities; using EnvelopeGenerator.Application.Common.Configurations; using EnvelopeGenerator.Domain.Entities; using Microsoft.Extensions.Options; +using EnvelopeGenerator.Domain.Interfaces; namespace EnvelopeGenerator.Application.Common.Notifications.DocSigned.Handlers; @@ -45,6 +46,25 @@ public class SendSignedMailHandler : SendMailHandler { "[DOCUMENT_TITLE]", notification.Envelope?.Title ?? string.Empty }, }; + if (notification.Envelope.IsReadAndConfirm()) + { + placeHolders["[SIGNATURE_TYPE]"] = "Lesen und bestätigen"; + placeHolders["[DOCUMENT_PROCESS]"] = string.Empty; + placeHolders["[FINAL_STATUS]"] = "Lesebestätigung"; + placeHolders["[FINAL_ACTION]"] = "Empfänger bestätigt"; + placeHolders["[REJECTED_BY_OTHERS]"] = "anderen Empfänger abgelehnt!"; + placeHolders["[RECEIVER_ACTION]"] = "bestätigt"; + } + else + { + placeHolders["[SIGNATURE_TYPE]"] = "Signieren"; + placeHolders["[DOCUMENT_PROCESS]"] = " und elektronisch unterschreiben"; + placeHolders["[FINAL_STATUS]"] = "Signatur"; + placeHolders["[FINAL_ACTION]"] = "Vertragspartner unterzeichnet"; + placeHolders["[REJECTED_BY_OTHERS]"] = "anderen Vertragspartner abgelehnt! Ihre notwendige Unterzeichnung wurde verworfen."; + placeHolders["[RECEIVER_ACTION]"] = "unterschrieben"; + } + return placeHolders; } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj index 0da15ec9..ba181291 100644 --- a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj +++ b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj @@ -37,7 +37,7 @@ - + @@ -80,7 +80,7 @@ - + 7.0.5 @@ -88,7 +88,6 @@ - 8.1.1 @@ -96,7 +95,6 @@ - 8.1.1 diff --git a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs index 0bfc7a4c..ad154298 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs @@ -12,6 +12,7 @@ using EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiverReadOnly; using EnvelopeGenerator.Application.Common.Extensions; using EnvelopeGenerator.Application.Common.Interfaces.Services; using MediatR; +using EnvelopeGenerator.Domain.Interfaces; namespace EnvelopeGenerator.Application.Services; @@ -49,14 +50,33 @@ public class EnvelopeMailService : EmailOutService, IEnvelopeMailService _sender = sender; } - private async Task> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? envelopeReceiverDto = null) + private async Task> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? er = null) { + if (er!.Envelope.IsReadAndConfirm()) + { + _placeholders["[SIGNATURE_TYPE]"] = "Lesen und bestätigen"; + _placeholders["[DOCUMENT_PROCESS]"] = string.Empty; + _placeholders["[FINAL_STATUS]"] = "Lesebestätigung"; + _placeholders["[FINAL_ACTION]"] = "Empfänger bestätigt"; + _placeholders["[REJECTED_BY_OTHERS]"] = "anderen Empfänger abgelehnt!"; + _placeholders["[RECEIVER_ACTION]"] = "bestätigt"; + } + else + { + _placeholders["[SIGNATURE_TYPE]"] = "Signieren"; + _placeholders["[DOCUMENT_PROCESS]"] = " und elektronisch unterschreiben"; + _placeholders["[FINAL_STATUS]"] = "Signatur"; + _placeholders["[FINAL_ACTION]"] = "Vertragspartner unterzeichnet"; + _placeholders["[REJECTED_BY_OTHERS]"] = "anderen Vertragspartner abgelehnt! Ihre notwendige Unterzeichnung wurde verworfen."; + _placeholders["[RECEIVER_ACTION]"] = "unterschrieben"; + } + if (accessCode is not null) _placeholders["[DOCUMENT_ACCESS_CODE]"] = accessCode; - if (envelopeReceiverDto?.Envelope is not null && envelopeReceiverDto.Receiver is not null) + if (er?.Envelope is not null && er.Receiver is not null) { - var erId = (envelopeReceiverDto.Envelope.Uuid, envelopeReceiverDto.Receiver.Signature).ToEnvelopeKey(); + var erId = (er.Envelope.Uuid, er.Receiver.Signature).ToEnvelopeKey(); var sigHost = await _configService.ReadDefaultSignatureHost(); var linkToDoc = $"{sigHost}/EnvelopeKey/{erId}"; _placeholders["[LINK_TO_DOCUMENT]"] = linkToDoc; @@ -66,7 +86,8 @@ public class EnvelopeMailService : EmailOutService, IEnvelopeMailService return _placeholders; } - private async Task> CreatePlaceholders(EnvelopeReceiverReadOnlyDto? readOnlyDto = null) + // TODO: merge the two CreatePlaceholders methods by using a common parameter object containing all the required information to create the place holders. + private async Task> CreatePlaceholders(EnvelopeReceiverReadOnlyDto? readOnlyDto = null) { if (readOnlyDto?.Envelope is not null && readOnlyDto.Receiver is not null) { @@ -124,7 +145,7 @@ public class EnvelopeMailService : EmailOutService, IEnvelopeMailService return acResult.ToFail().Notice(LogLevel.Error, "Therefore, access code cannot be sent"); var accessCode = acResult.Data; - var placeholders = await CreatePlaceholders(accessCode: accessCode, envelopeReceiverDto: dto); + var placeholders = await CreatePlaceholders(accessCode: accessCode, er: dto); // Add optional place holders. if (optionalPlaceholders is not null) diff --git a/EnvelopeGenerator.Domain/Entities/Envelope.cs b/EnvelopeGenerator.Domain/Entities/Envelope.cs index 21e52a9d..5ba90338 100644 --- a/EnvelopeGenerator.Domain/Entities/Envelope.cs +++ b/EnvelopeGenerator.Domain/Entities/Envelope.cs @@ -5,6 +5,7 @@ using System.ComponentModel.DataAnnotations.Schema; using EnvelopeGenerator.Domain.Constants; using Newtonsoft.Json; using EnvelopeGenerator.Domain.Interfaces.Auditing; +using EnvelopeGenerator.Domain.Interfaces; #if NETFRAMEWORK using System.Collections.Generic; using System.Linq; @@ -13,7 +14,7 @@ using System.Linq; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE", Schema = "dbo")] - public class Envelope : IHasAddedWhen, IHasChangedWhen + public class Envelope : IHasAddedWhen, IHasChangedWhen, IEnvelope { public Envelope() { @@ -106,7 +107,8 @@ namespace EnvelopeGenerator.Domain.Entities [JsonIgnore] [NotMapped] - public bool ReadOnly => EnvelopeTypeId == 2; + [Obsolete("Use EnvelopeGenerator.Domain.Interfaces.EnvelopeExtensions.IsReadAndConfirm extension method instead.")] + public bool ReadOnly => this.IsReadAndConfirm(); [Column("CERTIFICATION_TYPE")] public int? CertificationType { get; set; } diff --git a/EnvelopeGenerator.Domain/Entities/History.cs b/EnvelopeGenerator.Domain/Entities/History.cs index f52700a5..b7a6bc4c 100644 --- a/EnvelopeGenerator.Domain/Entities/History.cs +++ b/EnvelopeGenerator.Domain/Entities/History.cs @@ -37,6 +37,7 @@ namespace EnvelopeGenerator.Domain.Entities [Column("ACTION_DATE", TypeName = "datetime")] public DateTime? ActionDate { get; set; } + [NotMapped] public DateTime? ChangedWhen { get => ActionDate; set => ActionDate = value; } [Column("COMMENT", TypeName = "nvarchar(max)")] diff --git a/EnvelopeGenerator.Domain/Interfaces/IEnvelope.cs b/EnvelopeGenerator.Domain/Interfaces/IEnvelope.cs new file mode 100644 index 00000000..bdc709c6 --- /dev/null +++ b/EnvelopeGenerator.Domain/Interfaces/IEnvelope.cs @@ -0,0 +1,15 @@ +namespace EnvelopeGenerator.Domain.Interfaces +{ + public interface IEnvelope + { + int? EnvelopeTypeId { get; set; } + } + + public static class EnvelopeExtensions + { + public static bool IsReadAndConfirm(this IEnvelope envelope) + { + return envelope.EnvelopeTypeId == 2; + } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj index f3f03d30..23ff4950 100644 --- a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj +++ b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj @@ -25,7 +25,7 @@ - + diff --git a/EnvelopeGenerator.Service/App.config b/EnvelopeGenerator.Service/App.config index 2d238195..445dd0b3 100644 --- a/EnvelopeGenerator.Service/App.config +++ b/EnvelopeGenerator.Service/App.config @@ -23,7 +23,7 @@ - + @@ -31,7 +31,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -67,7 +67,7 @@ - + diff --git a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj index 061d21a6..03df4c62 100644 --- a/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj +++ b/EnvelopeGenerator.Service/EnvelopeGenerator.Service.vbproj @@ -181,11 +181,11 @@ ..\packages\Microsoft.Extensions.DependencyInjection.7.0.0\lib\net462\Microsoft.Extensions.DependencyInjection.dll - - ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.8.0.2\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll - - ..\packages\Microsoft.Extensions.Logging.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll + + ..\packages\Microsoft.Extensions.Logging.Abstractions.8.0.3\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll diff --git a/EnvelopeGenerator.Service/packages.config b/EnvelopeGenerator.Service/packages.config index 571ea90c..6ccec828 100644 --- a/EnvelopeGenerator.Service/packages.config +++ b/EnvelopeGenerator.Service/packages.config @@ -13,8 +13,8 @@ - - + + diff --git a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj index fa60b73d..4612b69b 100644 --- a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj +++ b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj @@ -1,7 +1,7 @@  - net7.0;net8.0;net9.0 + net8.0;net9.0 enable enable EnvelopeGenerator.Web @@ -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.10.0 - 3.10.0.0 - 3.10.0.0 + 3.11.0 + 3.11.0.0 + 3.11.0.0 Copyright © 2025 Digital Data GmbH. All rights reserved. @@ -2093,39 +2093,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -2149,8 +2124,8 @@ - - + + diff --git a/EnvelopeGenerator.Web/appsettings.Mail.json b/EnvelopeGenerator.Web/appsettings.Mail.json index 61dc2518..22b0e1be 100644 --- a/EnvelopeGenerator.Web/appsettings.Mail.json +++ b/EnvelopeGenerator.Web/appsettings.Mail.json @@ -8,7 +8,6 @@ "MailParams": { "Placeholders": { "[NAME_PORTAL]": "signFlow", - "[SIGNATURE_TYPE]": "signieren", "[REASON]": "" } } diff --git a/EnvelopeGenerator.sln b/EnvelopeGenerator.sln index 2f0514d9..b7744f7a 100644 --- a/EnvelopeGenerator.sln +++ b/EnvelopeGenerator.sln @@ -55,8 +55,8 @@ Global {5E0E17C0-FF5A-4246-BF87-1ADD85376A27}.Debug|Any CPU.Build.0 = Debug|Any CPU {5E0E17C0-FF5A-4246-BF87-1ADD85376A27}.Release|Any CPU.ActiveCfg = Debug|Any CPU {5E0E17C0-FF5A-4246-BF87-1ADD85376A27}.Release|Any CPU.Build.0 = Debug|Any CPU - {83ED2617-B398-4859-8F59-B38F8807E83E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {83ED2617-B398-4859-8F59-B38F8807E83E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {83ED2617-B398-4859-8F59-B38F8807E83E}.Debug|Any CPU.ActiveCfg = Release|Any CPU + {83ED2617-B398-4859-8F59-B38F8807E83E}.Debug|Any CPU.Build.0 = Release|Any CPU {83ED2617-B398-4859-8F59-B38F8807E83E}.Release|Any CPU.ActiveCfg = Debug|Any CPU {83ED2617-B398-4859-8F59-B38F8807E83E}.Release|Any CPU.Build.0 = Debug|Any CPU {4F32A98D-E6F0-4A09-BD97-1CF26107E837}.Debug|Any CPU.ActiveCfg = Debug|Any CPU