diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverPage.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverPage.razor index c7999655..5db25ac2 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverPage.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverPage.razor @@ -6,6 +6,7 @@ @using EnvelopeGenerator.Server.Client.Models.Constants @using EnvelopeGenerator.Server.Client.Services @using EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiver +@using EnvelopeGenerator.Domain.Constants @using Microsoft.JSInterop @using DevExpress.Blazor @using System.Drawing @@ -510,6 +511,11 @@ _envelopeReceiver = await PageDataService.GetEnvelopeReceiverAsync(EnvelopeKey); if (_envelopeReceiver is null) Logger.LogWarning("Envelope receiver data is null for {EnvelopeKey}", EnvelopeKey); + else if (IsRejected(_envelopeReceiver)) + { + Navigation.NavigateTo($"/envelope/{Uri.EscapeDataString(EnvelopeKey)}/rejected", forceLoad: true); + return; + } // Build initial report (no signature image yet) _report = BuildReport(_pdfBytes, _signatures, capturedSignature: null); @@ -555,6 +561,16 @@ } // ----- Report builder ----- + static bool IsRejected(EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiver.EnvelopeReceiverDto envelopeReceiver) + { + var status = envelopeReceiver.Envelope?.Status; + if (status is EnvelopeStatus.DocumentRejected or EnvelopeStatus.EnvelopeRejected) + return true; + + return envelopeReceiver.Envelope?.Histories?.Any(h => + h.Status is EnvelopeStatus.DocumentRejected or EnvelopeStatus.EnvelopeRejected) == true; + } + /// /// Builds an XtraReport wrapping the PDF bytes. /// If a signature is captured and there are signature fields, the signature image is diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverRejectedPage.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverRejectedPage.razor new file mode 100644 index 00000000..6b8df10d --- /dev/null +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/Pages/ReceiverRejectedPage.razor @@ -0,0 +1,105 @@ +@page "/envelope/{EnvelopeKey}/rejected" +@rendermode InteractiveServer +@using EnvelopeGenerator.Application.Resources +@using EnvelopeGenerator.Domain.Constants +@using EnvelopeGenerator.Domain.Interfaces +@using Microsoft.Extensions.Localization +@inject NavigationManager Navigation +@inject EnvelopeGenerator.Server.Services.EnvelopeReceiverAuthorizationService ReceiverAuthorizationService +@inject EnvelopeGenerator.Server.Services.EnvelopeReceiverPageDataService PageDataService +@inject IStringLocalizer UiLocalizer + +
+
+
+
@L("DocRejected", "Dokument abgelehnt")
+
+ +
+
+
+ + + +
+
+ +

+ @(_isReadAndConfirm + ? L("RejectionInfo1Confirmation", "Dieses Dokument wurde als nicht bestaetigt markiert.") + : L("RejectionInfo1", "Dieses Dokument wurde abgelehnt.")) +

+ +

+ @((MarkupString)_messageLine2) +

+ + +
+
+
+ +@code { + [Parameter] public string? EnvelopeKey { get; set; } + + bool _isReadAndConfirm; + string _messageLine2 = string.Empty; + + protected override async Task OnInitializedAsync() + { + if (string.IsNullOrWhiteSpace(EnvelopeKey)) + { + Navigation.NavigateTo("/"); + return; + } + + var user = await ReceiverAuthorizationService.AuthorizeAsync(EnvelopeKey); + if (user is null) + { + Navigation.NavigateTo($"/envelope/login/{Uri.EscapeDataString(EnvelopeKey)}"); + return; + } + + var envelopeReceiver = await PageDataService.GetEnvelopeReceiverAsync(EnvelopeKey); + if (envelopeReceiver is null) + { + Navigation.NavigateTo($"/envelope/{Uri.EscapeDataString(EnvelopeKey)}", forceLoad: true); + return; + } + + if (!IsRejected(envelopeReceiver)) + { + Navigation.NavigateTo($"/envelope/{Uri.EscapeDataString(EnvelopeKey)}", forceLoad: true); + return; + } + + _isReadAndConfirm = envelopeReceiver.Envelope?.IsReadAndConfirm() ?? false; + + var senderName = envelopeReceiver.Envelope?.User is null + ? string.Empty + : $"{envelopeReceiver.Envelope.User.Prename} {envelopeReceiver.Envelope.User.Name}".Trim(); + var senderEmail = envelopeReceiver.Envelope?.User?.Email ?? string.Empty; + var envelopeTitle = envelopeReceiver.Envelope?.Title ?? string.Empty; + + var template = L("RejectionInfo2", "Das Dokument \"{2}\" von {0} ({1}) wurde abgelehnt."); + _messageLine2 = string.Format(template, senderName, senderEmail, envelopeTitle); + } + + static bool IsRejected(EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiver.EnvelopeReceiverDto envelopeReceiver) + { + var status = envelopeReceiver.Envelope?.Status; + if (status is EnvelopeStatus.DocumentRejected or EnvelopeStatus.EnvelopeRejected) + return true; + + return envelopeReceiver.Envelope?.Histories?.Any(h => + h.Status is EnvelopeStatus.DocumentRejected or EnvelopeStatus.EnvelopeRejected) == true; + } + + string L(string key, string fallback) + { + var value = UiLocalizer[key]; + return value.ResourceNotFound ? fallback : value.Value; + } +}