From f509cc8b3b79c4b4419a6944229951cdf49de554 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 6 Jun 2024 16:55:42 +0200 Subject: [PATCH] =?UTF-8?q?Ein=20weiterer=20informativer=20Text=20wurde=20?= =?UTF-8?q?f=C3=BCr=20den=20Umschlag=20hinzugef=C3=BCgt,=20der=20von=20and?= =?UTF-8?q?eren=20Interessengruppen=20gestrichen=20wurde.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contracts/IEnvelopeHistoryService.cs | 7 ++++-- .../EnvelopeHistory/EnvelopeHistoryDto.cs | 5 ++-- .../DTOs/ReceiverDto.cs | 6 +++-- .../EnvelopeGeneratorExtensions.cs | 4 ++-- .../Resources/Resource.de-DE.resx | 8 ++++++- .../Resources/Resource.en-US.resx | 6 +++++ .../Services/EnvelopeHistoryService.cs | 22 ++++++++++++++---- .../EnvelopeGenerator.Domain.csproj | 3 +++ .../Controllers/HomeController.cs | 23 +++++++++++++------ .../Views/Home/EnvelopeRejected.cshtml | 13 ++++++----- EnvelopeGenerator.Web/WebKey.cs | 4 +++- 11 files changed, 74 insertions(+), 27 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs index 1d7ffa73..44ea3e44 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs @@ -1,5 +1,6 @@ using DigitalData.Core.Contracts.Application; using DigitalData.Core.DTO; +using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; @@ -17,10 +18,12 @@ namespace EnvelopeGenerator.Application.Contracts Task IsRejected(int envelopeId, string? userReference = null); - Task> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null); + Task> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null, bool withSender = false, bool withReceiver = false); Task> ReadRejectedAsync(int envelopeId, string? userReference = null); - Task> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status, string? comment = null); + Task> ReadRejectingReceivers(int envelopeId); + + Task> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status, string? comment = null); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs index 1667efa6..c70e6b30 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs @@ -1,4 +1,5 @@ -using DigitalData.UserManager.Application.DTOs.User; +using DigitalData.Core.DTO; +using DigitalData.UserManager.Application.DTOs.User; using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory @@ -13,5 +14,5 @@ namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory UserCreateDto? Sender, ReceiverDto? Receiver, ReferenceType ReferenceType, - string? Comment = null); + string? Comment = null) : BaseDTO(Id); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/ReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/ReceiverDto.cs index cc27ef93..be0fee90 100644 --- a/EnvelopeGenerator.Application/DTOs/ReceiverDto.cs +++ b/EnvelopeGenerator.Application/DTOs/ReceiverDto.cs @@ -1,9 +1,11 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.DTO; + +namespace EnvelopeGenerator.Application.DTOs { public record ReceiverDto( int Id, string EmailAddress, string Signature, DateTime AddedWhen - ); + ) : BaseDTO(Id); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeGeneratorExtensions.cs b/EnvelopeGenerator.Application/EnvelopeGeneratorExtensions.cs index 7e1e3c41..9166b90e 100644 --- a/EnvelopeGenerator.Application/EnvelopeGeneratorExtensions.cs +++ b/EnvelopeGenerator.Application/EnvelopeGeneratorExtensions.cs @@ -102,9 +102,9 @@ namespace EnvelopeGenerator.Application /// The receiver signature. public static string? GetReceiverSignature(this string envelopeReceiverId) => envelopeReceiverId.DecodeEnvelopeReceiverId().ReceiverSignature; - public static void LogEnvelopeError(this ILogger logger, string envelopeEeceiverId, Exception? exception = null, string? message = null, params object?[] args) + public static void LogEnvelopeError(this ILogger logger, string envelopeReceiverId, Exception? exception = null, string? message = null, params object?[] args) { - var sb = new StringBuilder().AppendLine(envelopeEeceiverId.DecodeEnvelopeReceiverId().ToTitle()); + var sb = new StringBuilder().AppendLine(envelopeReceiverId.DecodeEnvelopeReceiverId().ToTitle()); if (message is not null) sb.AppendLine(message); diff --git a/EnvelopeGenerator.Application/Resources/Resource.de-DE.resx b/EnvelopeGenerator.Application/Resources/Resource.de-DE.resx index 1744f5bf..89eb6ece 100644 --- a/EnvelopeGenerator.Application/Resources/Resource.de-DE.resx +++ b/EnvelopeGenerator.Application/Resources/Resource.de-DE.resx @@ -183,8 +183,14 @@ Ihre Ablehnung wurde weitergeleitet! + + Vorgang abgebrochen! + - Sie können bei Bedarf mit {0}, <a href="mailto:{1}?subject={2}&body=Dear%20{0},%0A%0A%0A">{1}</a> Kontakt aufnehmen. + Sie können bei Bedarf mit {0}, <a href="mailto:{1}?subject={2}&body=Sehr geehrte(r)%20{0},%0A%0A%0A">{1}</a> Kontakt aufnehmen. + + + Das Vorgang wurde von einer der beteiligten Parteien abgelehnt. Sie können bei Bedarf mit {0}, <a href="mailto:{1}?subject={2}&body=Sehr geehrte(r)%20{0},%0A%0A%0A">{1}</a> Kontakt aufnehmen. Bitte geben Sie einen Grund an: diff --git a/EnvelopeGenerator.Application/Resources/Resource.en-US.resx b/EnvelopeGenerator.Application/Resources/Resource.en-US.resx index 1a0bda54..c3119dcb 100644 --- a/EnvelopeGenerator.Application/Resources/Resource.en-US.resx +++ b/EnvelopeGenerator.Application/Resources/Resource.en-US.resx @@ -183,9 +183,15 @@ Your rejection has been forwarded! + + Process canceled! + You can contact {0}, <a href="mailto:{1}?subject={2}&body=Dear%20{0},%0A%0A%0A">{1}</a> if required. + + The process has been rejected by one of the parties involved. You can contact {0}, <a href="mailto:{1}?subject={2}&body=Dear%20{0},%0A%0A%0A">{1}</a> if required. + Please give a reason: diff --git a/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs b/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs index 43cc0f6b..eb2cd5f6 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs @@ -8,6 +8,7 @@ using static EnvelopeGenerator.Common.Constants; using EnvelopeGenerator.Application.Resources; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; +using EnvelopeGenerator.Application.DTOs; namespace EnvelopeGenerator.Application.Services { @@ -50,20 +51,33 @@ namespace EnvelopeGenerator.Application.Services status: (int)EnvelopeStatus.DocumentRejected) > 0; } - public async Task> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null) + public async Task> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null, bool withSender = false, bool withReceiver = false) { var histDTOs = _mapper.MapOrThrow>( await _repository.ReadAsync( envelopeId: envelopeId, userReference: userReference, - status: status)); + status: status, + withSender: withSender, + withReceiver: withReceiver)); return referenceType is null ? histDTOs : histDTOs.Where(h => h.ReferenceType == referenceType); } public async Task> ReadRejectedAsync(int envelopeId, string? userReference = null) => - await ReadAsync(envelopeId: envelopeId, userReference: userReference, status: (int)EnvelopeStatus.DocumentRejected); + await ReadAsync(envelopeId: envelopeId, userReference: userReference, status: (int)EnvelopeStatus.DocumentRejected, withReceiver:true); - public async Task> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status, string? comment = null) => + //TODO: use IQueryable in repository to incerease the performance + public async Task> ReadRejectingReceivers(int envelopeId) + { + var envelopes = await ReadRejectedAsync(envelopeId); + return envelopes is null + ? Enumerable.Empty() + : envelopes + .Where(eh => eh?.Receiver != null) + .Select(eh => eh.Receiver!); + } + + public async Task> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status, string? comment = null) => await CreateAsync(new (EnvelopeId: envelopeId, UserReference: userReference, Status: (int)status, ActionDate: DateTime.Now, Comment: comment)) .ThenAsync( Success: id => Result.Success(id), diff --git a/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj b/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj index 5f342ff9..f0aa084a 100644 --- a/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj +++ b/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj @@ -11,6 +11,9 @@ + + ..\..\WebCoreModules\DigitalData.Core.Domain\bin\Debug\net7.0\DigitalData.Core.Domain.dll + ..\..\WebUserManager\DigitalData.UserManager.Domain\bin\Debug\net7.0\DigitalData.UserManager.Domain.dll diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index 0a62549f..2be479e1 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -70,7 +70,7 @@ namespace EnvelopeGenerator.Web.Controllers } catch(Exception ex) { - _logger.LogEnvelopeError(envelopeEeceiverId: envelopeReceiverId, exception:ex, message: _localizer[WebKey.UnexpectedError]); + _logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception:ex, message: _localizer[WebKey.UnexpectedError]); return this.ViewInnerServiceError(); } } @@ -104,7 +104,7 @@ namespace EnvelopeGenerator.Web.Controllers } catch(Exception ex) { - _logger.LogEnvelopeError(envelopeEeceiverId: envelopeReceiverId, exception: ex); + _logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex); return this.ViewInnerServiceError(); } } @@ -154,9 +154,15 @@ namespace EnvelopeGenerator.Web.Controllers return await _envRcvService.ReadByUuidSignatureAsync(uuid: uuid, signature: signature).ThenAsync( SuccessAsync: async er => { - if (await _historyService.IsRejected(envelopeId: er.Envelope!.Id)) + //check rejection + var rejRcvrs = await _historyService.ReadRejectingReceivers(er.Envelope!.Id); + if(rejRcvrs.Any()) + { + ViewBag.IsExt = !rejRcvrs.Contains(er.Receiver); //external if the current user is not rejected return View("EnvelopeRejected", er); + } + //check if it has already signed if (await _historyService.IsSigned(envelopeId: er.Envelope!.Id, userReference: er.Receiver!.EmailAddress)) return View("EnvelopeSigned"); @@ -167,7 +173,10 @@ namespace EnvelopeGenerator.Web.Controllers ViewData["DocumentBytes"] = bytes; } else - return this.ViewDocumentNotFound(); + { + _logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, message: "No document was found."); + return this.ViewDocumentNotFound(); + } var claims = new List { new(ClaimTypes.NameIdentifier, uuid), @@ -204,7 +213,7 @@ namespace EnvelopeGenerator.Web.Controllers } catch (Exception ex) { - _logger.LogEnvelopeError(envelopeEeceiverId: envelopeReceiverId, exception: ex); + _logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex); return this.ViewInnerServiceError(); } } @@ -238,7 +247,7 @@ namespace EnvelopeGenerator.Web.Controllers } catch (Exception ex) { - _logger.LogEnvelopeError(envelopeEeceiverId: envelopeReceiverId, exception: ex); + _logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex); return this.ViewInnerServiceError(); } } @@ -269,7 +278,7 @@ namespace EnvelopeGenerator.Web.Controllers } catch (Exception ex) { - _logger.LogEnvelopeError(envelopeEeceiverId: envelopeReceiverId, exception: ex); + _logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex); return this.ViewInnerServiceError(); } } diff --git a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml index 19dadebe..c007d932 100644 --- a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml @@ -11,10 +11,11 @@ @model EnvelopeReceiverDto; @{ - var userCulture = ViewData["UserCulture"] as Culture; - var envelope = Model.Envelope; - var document = Model.Envelope?.Documents?.FirstOrDefault(); - var sender = Model.Envelope?.User; + var userCulture = ViewData["UserCulture"] as Culture; + var envelope = Model.Envelope; + var document = Model.Envelope?.Documents?.FirstOrDefault(); + var sender = Model.Envelope?.User; + var isExt = ViewBag.IsExt ?? false; }
@@ -54,13 +55,13 @@ c-5.791,5.79-15.176,5.79-20.969,0l-30.32-30.322l-11.676,11.676l30.32,30.32c5.79,5.79,5.79,15.178,0,20.969L299.11,404.045z"/>
-

@_localizer[WebKey.RejectionInfo1].TrySanitize(_sanitizer)

+

@_localizer[isExt ? WebKey.RejectionInfo1_ext : WebKey.RejectionInfo1].TrySanitize(_sanitizer)

- @Html.Raw(string.Format(_localizer[WebKey.RejectionInfo2], + @Html.Raw(string.Format(_localizer[isExt ? WebKey.RejectionInfo2_ext : WebKey.RejectionInfo2], $"{sender?.Prename} {sender?.Name}".TrySanitize(_sanitizer), sender?.Email.TrySanitize(_sanitizer), envelope?.Title.TrySanitize(_sanitizer))) diff --git a/EnvelopeGenerator.Web/WebKey.cs b/EnvelopeGenerator.Web/WebKey.cs index 02b24b6d..8c8b0ea8 100644 --- a/EnvelopeGenerator.Web/WebKey.cs +++ b/EnvelopeGenerator.Web/WebKey.cs @@ -30,5 +30,7 @@ public static readonly string Hello = nameof(Hello); public static readonly string RejectionInfo1 = nameof(RejectionInfo1); public static readonly string RejectionInfo2 = nameof(RejectionInfo2); - } + public static readonly string RejectionInfo1_ext = nameof(RejectionInfo1_ext); + public static readonly string RejectionInfo2_ext = nameof(RejectionInfo2_ext); + } } \ No newline at end of file