Compare commits

..

3 Commits

Author SHA1 Message Date
OlgunR
260e8d53ba Update 'SignatureConfirmed' localization strings
Changed 'SignatureConfirmed' value in English to "Finalization confirmed" and in German to "Abschluss bestätigt". Updated designer file comments to match new wording.
2026-03-10 12:45:56 +01:00
OlgunR
0fd174ee0c Update resource strings and comments for read confirmation in Domain.Resources.Model
Switched Model.Designer.cs comments from German to English and added new resource string properties for read confirmation workflows. Updated Model.resx and Model.en.resx with new and corrected entries, improved translation consistency, and clarified documentation.
2026-03-10 11:55:57 +01:00
OlgunR
ab4cd7c254 Update resources for confirmation workflows & English comments in CommonService.Strings.Model
Replaced German comments/descriptions with English for clarity and internationalization. Added new resource strings for confirmation/read confirmation statuses (e.g., CompletelyConfirmed, Confirmation, DocumentConfirmed, etc.) to support both signing and read confirmation workflows. Corrected and standardized several existing resource values for consistency across languages.
2026-03-10 10:54:52 +01:00
44 changed files with 469 additions and 1774 deletions

View File

@@ -1,13 +0,0 @@
namespace EnvelopeGenerator.Application.Common;
// TODO: merge other cache keys here as well, e.g. for templates, etc.
/// <summary>
///
/// </summary>
public static class CacheKey
{
/// <summary>
///
/// </summary>
public static readonly Guid DefaultConfig = Guid.NewGuid();
}

View File

@@ -8,11 +8,6 @@ namespace EnvelopeGenerator.Application.Common.Dto;
[ApiExplorerSettings(IgnoreApi = true)]
public class ConfigDto
{
/// <summary>
/// Gets or sets the default document path.
/// </summary>
public string? DocumentPath { get; set; }
/// <summary>
/// Gets or sets the sending profile identifier.
/// </summary>
@@ -31,30 +26,5 @@ public class ConfigDto
/// <summary>
/// Gets or sets the path where exports will be saved.
/// </summary>
public string ExportPath { get; set; } = null!;
/// <summary>
/// Gets or sets the creation timestamp.
/// </summary>
public DateTime AddedWhen { get; set; }
/// <summary>
/// Gets or sets the last update timestamp.
/// </summary>
public DateTime? ChangedWhen { get; set; }
/// <summary>
/// Gets or sets the legacy tinyint GUID field.
/// </summary>
public byte Guid { get; set; }
/// <summary>
/// Gets or sets whether default TFA is enabled.
/// </summary>
public bool DefTfaEnabled { get; set; }
/// <summary>
/// Gets or sets whether default TFA uses phone.
/// </summary>
public bool DefTfaWithPhone { get; set; }
public string? ExportPath { get; set; }
}

View File

@@ -44,16 +44,6 @@ public record EnvelopeDto : IEnvelope
[TemplatePlaceholder("[MESSAGE]")]
public string Message { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public DateTime? ExpiresWhen { get; set; }
/// <summary>
///
/// </summary>
public DateTime? ExpiresWarningWhen { get; set; }
/// <summary>
///
/// </summary>
@@ -70,11 +60,6 @@ public record EnvelopeDto : IEnvelope
[TemplatePlaceholder("[DOCUMENT_TITLE]")]
public string Title { get; set; } = string.Empty;
/// <summary>
/// Default value is string.Empty
/// </summary>
public string? Comment { get; set; }
/// <summary>
///
/// </summary>
@@ -85,21 +70,6 @@ public record EnvelopeDto : IEnvelope
/// </summary>
public string Language { get; set; } = "de-DE";
/// <summary>
///
/// </summary>
public bool SendReminderEmails { get; set; }
/// <summary>
///
/// </summary>
public int? FirstReminderDays { get; set; }
/// <summary>
///
/// </summary>
public int? ReminderIntervalDays { get; set; }
/// <summary>
///
/// </summary>
@@ -120,26 +90,6 @@ public record EnvelopeDto : IEnvelope
/// </summary>
public bool UseAccessCode { get; set; } = true;
/// <summary>
///
/// </summary>
public int? FinalEmailToCreator { get; set; }
/// <summary>
///
/// </summary>
public int? FinalEmailToReceivers { get; set; }
/// <summary>
///
/// </summary>
public int? ExpiresWhenDays { get; set; }
/// <summary>
///
/// </summary>
public int? ExpiresWarningWhenDays { get; set; }
/// <summary>
///
/// </summary>

View File

@@ -1,69 +0,0 @@
using AutoMapper;
using DigitalData.Core.Abstraction.Application.Repository;
using DigitalData.Core.Exceptions;
using EnvelopeGenerator.Application.Common;
using EnvelopeGenerator.Application.Common.Dto;
using EnvelopeGenerator.Domain.Entities;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
namespace EnvelopeGenerator.Application.Configuration.Queries;
/// <summary>
///
/// </summary>
public record ReadDefaultConfigQuery : IRequest<ConfigDto>
{
/// <summary>
///
/// </summary>
public bool EnforceSingleResult { get; init; }
}
/// <summary>
///
/// </summary>
public class ReadDefaultConfigQueryHandler : IRequestHandler<ReadDefaultConfigQuery, ConfigDto>
{
private readonly IRepository<Config> _repo;
private readonly IMapper _mapper;
private readonly IMemoryCache _cache;
/// <summary>
///
/// </summary>
/// <param name="repo"></param>
/// <param name="mapper"></param>
/// <param name="cache"></param>
public ReadDefaultConfigQueryHandler(IRepository<Config> repo, IMapper mapper, IMemoryCache cache)
{
_repo = repo;
_mapper = mapper;
_cache = cache;
}
/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="cancel"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
public async Task<ConfigDto> Handle(ReadDefaultConfigQuery request, CancellationToken cancel)
{
var config = await _cache.GetOrCreateAsync(CacheKey.DefaultConfig, entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30);
return request.EnforceSingleResult
? _repo.Query.SingleOrDefaultAsync(cancel)
: _repo.Query.FirstOrDefaultAsync(cancel)
?? throw new NotFoundException("Default configuration could not be found. Ensure at least one configuration record exists in the database.");
});
return _mapper.Map<ConfigDto>(config);
}
}

View File

@@ -7,7 +7,6 @@ using Microsoft.Extensions.Logging;
using EnvelopeGenerator.Application.Common.Dto;
using EnvelopeGenerator.Application.Common.Interfaces.Repositories;
using EnvelopeGenerator.Application.Common.Interfaces.Services;
using EnvelopeGenerator.Application.Common;
namespace EnvelopeGenerator.Application.Services;
@@ -17,6 +16,8 @@ namespace EnvelopeGenerator.Application.Services;
[Obsolete("Use MediatR")]
public class ConfigService : ReadService<IConfigRepository, ConfigDto, Config, int>, IConfigService
{
private static readonly Guid DefaultConfigCacheId = Guid.NewGuid();
private readonly IMemoryCache _cache;
private readonly ILogger<ConfigService> _logger;
@@ -61,7 +62,7 @@ public class ConfigService : ReadService<IConfigRepository, ConfigDto, Config, i
/// </exception>
public async Task<ConfigDto> ReadDefaultAsync()
{
var config = await _cache.GetOrCreateAsync(CacheKey.DefaultConfig, _ => ReadFirstAsync().ThenAsync(
var config = await _cache.GetOrCreateAsync(DefaultConfigCacheId, _ => ReadFirstAsync().ThenAsync(
Success: config => config,
Fail: (mssg, ntc) =>
{

View File

@@ -1,10 +1,10 @@
'------------------------------------------------------------------------------
' <auto-generated>
' Dieser Code wurde von einem Tool generiert.
' Laufzeitversion:4.0.30319.42000
' This code was generated by a tool.
' Runtime Version:4.0.30319.42000
'
' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
' der Code erneut generiert wird.
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------
@@ -15,12 +15,12 @@ Imports System
Namespace My.Resources
'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
'-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
'This class was auto-generated by the StronglyTypedResourceBuilder
'class via a tool like ResGen or Visual Studio.
'To add or remove a member, edit your .ResX file then rerun ResGen
'with the /str option, or rebuild your VS project.
'''<summary>
''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
''' A strongly-typed resource class, for looking up localized strings, etc.
'''</summary>
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0"), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
@@ -37,7 +37,7 @@ Namespace My.Resources
End Sub
'''<summary>
''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
''' Returns the cached ResourceManager instance used by this class.
'''</summary>
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Public Shared ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
@@ -51,8 +51,8 @@ Namespace My.Resources
End Property
'''<summary>
''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
''' Overrides the current thread's CurrentUICulture property for all
''' resource lookups using this strongly typed resource class.
'''</summary>
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Public Shared Property Culture() As Global.System.Globalization.CultureInfo
@@ -65,7 +65,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Zugriffscode korrekt eingegeben ähnelt.
''' Looks up a localized string similar to Zugriffscode korrekt eingegeben.
'''</summary>
Public Shared ReadOnly Property AccessCodeCorrect() As String
Get
@@ -74,7 +74,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Zugriffscode falsch eingegeben ähnelt.
''' Looks up a localized string similar to Zugriffscode falsch eingegeben.
'''</summary>
Public Shared ReadOnly Property AccessCodeIncorrect() As String
Get
@@ -83,7 +83,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Zugriffscode angefordert ähnelt.
''' Looks up a localized string similar to Zugriffscode angefordert.
'''</summary>
Public Shared ReadOnly Property AccessCodeRequested() As String
Get
@@ -92,7 +92,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Fortgeschrittene Elektronische Signatur ähnelt.
''' Looks up a localized string similar to Fortgeschrittene Elektronische Signatur.
'''</summary>
Public Shared ReadOnly Property AdvancedElectronicSignature() As String
Get
@@ -101,7 +101,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Abgeschlossen ähnelt.
''' Looks up a localized string similar to Abgeschlossen.
'''</summary>
Public Shared ReadOnly Property Completed() As String
Get
@@ -110,7 +110,16 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Vollständig Signiert ähnelt.
''' Looks up a localized string similar to Vollständig bestätigt.
'''</summary>
Public Shared ReadOnly Property CompletelyConfirmed() As String
Get
Return ResourceManager.GetString("CompletelyConfirmed", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Vollständig signiert.
'''</summary>
Public Shared ReadOnly Property CompletelySigned() As String
Get
@@ -119,7 +128,25 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Vertrag ähnelt.
''' Looks up a localized string similar to Lesebestätigung.
'''</summary>
Public Shared ReadOnly Property Confirmation() As String
Get
Return ResourceManager.GetString("Confirmation", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Gelesen und Bestätigt.
'''</summary>
Public Shared ReadOnly Property Confirmed() As String
Get
Return ResourceManager.GetString("Confirmed", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Vertrag.
'''</summary>
Public Shared ReadOnly Property Contract() As String
Get
@@ -128,7 +155,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Erstellt ähnelt.
''' Looks up a localized string similar to Erstellt.
'''</summary>
Public Shared ReadOnly Property Created() As String
Get
@@ -137,7 +164,16 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Dokument Rotation geändert ähnelt.
''' Looks up a localized string similar to Dokument gelesen und bestätigt.
'''</summary>
Public Shared ReadOnly Property DocumentConfirmed() As String
Get
Return ResourceManager.GetString("DocumentConfirmed", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Dokument Rotation geändert.
'''</summary>
Public Shared ReadOnly Property DocumentMod_Rotation() As String
Get
@@ -146,7 +182,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Dokument geöffnet ähnelt.
''' Looks up a localized string similar to Dokument geöffnet.
'''</summary>
Public Shared ReadOnly Property DocumentOpened() As String
Get
@@ -155,7 +191,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Unterzeichnung abgelehnt ähnelt.
''' Looks up a localized string similar to Unterzeichnung abgelehnt.
'''</summary>
Public Shared ReadOnly Property DocumentRejected() As String
Get
@@ -164,7 +200,16 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Dokument unterzeichnet ähnelt.
''' Looks up a localized string similar to Lesebestätigung abgelehnt.
'''</summary>
Public Shared ReadOnly Property DocumentRejectedRaC() As String
Get
Return ResourceManager.GetString("DocumentRejectedRaC", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Dokument unterzeichnet.
'''</summary>
Public Shared ReadOnly Property DocumentSigned() As String
Get
@@ -173,7 +218,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Entwurf ähnelt.
''' Looks up a localized string similar to Entwurf.
'''</summary>
Public Shared ReadOnly Property Draft() As String
Get
@@ -182,7 +227,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Archiviert ähnelt.
''' Looks up a localized string similar to Archiviert.
'''</summary>
Public Shared ReadOnly Property EnvelopeArchived() As String
Get
@@ -191,7 +236,16 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Vollständig signiert ähnelt.
''' Looks up a localized string similar to Vollständig bestätigt.
'''</summary>
Public Shared ReadOnly Property EnvelopeCompletelyConfirmed() As String
Get
Return ResourceManager.GetString("EnvelopeCompletelyConfirmed", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Vollständig signiert.
'''</summary>
Public Shared ReadOnly Property EnvelopeCompletelySigned() As String
Get
@@ -200,7 +254,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Umschlag Erstellt ähnelt.
''' Looks up a localized string similar to Umschlag Erstellt.
'''</summary>
Public Shared ReadOnly Property EnvelopeCreated() As String
Get
@@ -209,7 +263,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Umschlag Gelöscht ähnelt.
''' Looks up a localized string similar to Umschlag Gelöscht.
'''</summary>
Public Shared ReadOnly Property EnvelopeDeleted() As String
Get
@@ -218,7 +272,16 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Teil-Signiert ähnelt.
''' Looks up a localized string similar to Teil-Bestätigt.
'''</summary>
Public Shared ReadOnly Property EnvelopePartlyConfirmed() As String
Get
Return ResourceManager.GetString("EnvelopePartlyConfirmed", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Teil-Signiert.
'''</summary>
Public Shared ReadOnly Property EnvelopePartlySigned() As String
Get
@@ -227,7 +290,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Umschlag in Queue ähnelt.
''' Looks up a localized string similar to Umschlag in Queue.
'''</summary>
Public Shared ReadOnly Property EnvelopeQueued() As String
Get
@@ -236,7 +299,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Umschlag abgelehnt ähnelt.
''' Looks up a localized string similar to Umschlag abgelehnt.
'''</summary>
Public Shared ReadOnly Property EnvelopeRejected() As String
Get
@@ -245,7 +308,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Signierungszertifikat erstellt ähnelt.
''' Looks up a localized string similar to Signierungszertifikat erstellt.
'''</summary>
Public Shared ReadOnly Property EnvelopeReportCreated() As String
Get
@@ -254,7 +317,16 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Gespeichert ähnelt.
''' Looks up a localized string similar to Lesebestätigungszertifikat erstellt.
'''</summary>
Public Shared ReadOnly Property EnvelopeReportCreatedRaC() As String
Get
Return ResourceManager.GetString("EnvelopeReportCreatedRaC", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Gespeichert.
'''</summary>
Public Shared ReadOnly Property EnvelopeSaved() As String
Get
@@ -263,7 +335,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Gesendet ähnelt.
''' Looks up a localized string similar to Gesendet.
'''</summary>
Public Shared ReadOnly Property EnvelopeSent() As String
Get
@@ -272,7 +344,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Umschlag zurückgezogen ähnelt.
''' Looks up a localized string similar to Umschlag zurückgezogen.
'''</summary>
Public Shared ReadOnly Property EnvelopeWithdrawn() As String
Get
@@ -281,7 +353,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Zugriffscode versendet ähnelt.
''' Looks up a localized string similar to Zugriffscode versendet.
'''</summary>
Public Shared ReadOnly Property MessageAccessCodeSent() As String
Get
@@ -290,7 +362,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Abschlussemail versendet ähnelt.
''' Looks up a localized string similar to Abschlussemail versendet.
'''</summary>
Public Shared ReadOnly Property MessageCompletionSent() As String
Get
@@ -299,7 +371,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Signaturbestätigung versendet ähnelt.
''' Looks up a localized string similar to Signaturbestätigung versendet.
'''</summary>
Public Shared ReadOnly Property MessageConfirmationSent() As String
Get
@@ -308,7 +380,16 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Löschinformation versendet ähnelt.
''' Looks up a localized string similar to Lesebestätigung versendet.
'''</summary>
Public Shared ReadOnly Property MessageConfirmationSentRaC() As String
Get
Return ResourceManager.GetString("MessageConfirmationSentRaC", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Löschinformation versendet.
'''</summary>
Public Shared ReadOnly Property MessageDeletionSent() As String
Get
@@ -317,7 +398,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Dokumentenlink versendet ähnelt.
''' Looks up a localized string similar to Dokumentenlink versendet.
'''</summary>
Public Shared ReadOnly Property MessageInvitationSent() As String
Get
@@ -326,7 +407,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Nein ähnelt.
''' Looks up a localized string similar to Nein.
'''</summary>
Public Shared ReadOnly Property No() As String
Get
@@ -335,7 +416,16 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Teil-Signiert ähnelt.
''' Looks up a localized string similar to Teil-Bestätigt.
'''</summary>
Public Shared ReadOnly Property PartlyConfirmed() As String
Get
Return ResourceManager.GetString("PartlyConfirmed", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Teil-Signiert.
'''</summary>
Public Shared ReadOnly Property PartlySigned() As String
Get
@@ -344,7 +434,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Qualifizierte Signatur ähnelt.
''' Looks up a localized string similar to Qualifizierte Signatur.
'''</summary>
Public Shared ReadOnly Property QualifiedSignature() As String
Get
@@ -353,7 +443,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Arbeitsanweisung ähnelt.
''' Looks up a localized string similar to Lesebestätigung.
'''</summary>
Public Shared ReadOnly Property ReadAndSign() As String
Get
@@ -362,7 +452,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Wollen Sie die 2-Faktor Definition für diesen Empfänger zurücksetzen. Der Empfänger muss sich dann neu identifizieren! ähnelt.
''' Looks up a localized string similar to Wollen Sie die 2-Faktor Definition für diesen Empfänger zurücksetzen. Der Empfänger muss sich dann neu identifizieren!.
'''</summary>
Public Shared ReadOnly Property ResetTOTPUser() As String
Get
@@ -371,7 +461,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Gespeichert ähnelt.
''' Looks up a localized string similar to Gespeichert.
'''</summary>
Public Shared ReadOnly Property Saved() As String
Get
@@ -380,7 +470,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Gesendet ähnelt.
''' Looks up a localized string similar to Gesendet.
'''</summary>
Public Shared ReadOnly Property Sent() As String
Get
@@ -389,7 +479,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Signatur ähnelt.
''' Looks up a localized string similar to Signatur.
'''</summary>
Public Shared ReadOnly Property Signature() As String
Get
@@ -398,7 +488,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Signatur bestätigt ähnelt.
''' Looks up a localized string similar to Abschluss bestätigt.
'''</summary>
Public Shared ReadOnly Property SignatureConfirmed() As String
Get
@@ -407,7 +497,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Signiert ähnelt.
''' Looks up a localized string similar to Signiert.
'''</summary>
Public Shared ReadOnly Property Signed() As String
Get
@@ -416,7 +506,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Erfolgreich! Dialog wird geschlossen. ähnelt.
''' Looks up a localized string similar to Erfolgreich! Dialog wird geschlossen..
'''</summary>
Public Shared ReadOnly Property Success_FormClose() As String
Get
@@ -425,7 +515,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Unsigniert ähnelt.
''' Looks up a localized string similar to Unsigniert.
'''</summary>
Public Shared ReadOnly Property Unsigned() As String
Get
@@ -434,7 +524,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Ja ähnelt.
''' Looks up a localized string similar to Ja.
'''</summary>
Public Shared ReadOnly Property Yes() As String
Get
@@ -443,7 +533,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Ja, mit Anhang ähnelt.
''' Looks up a localized string similar to Ja, mit Anhang.
'''</summary>
Public Shared ReadOnly Property YesWithAttachment() As String
Get

View File

@@ -132,12 +132,27 @@
<data name="Completed" xml:space="preserve">
<value>Completed</value>
</data>
<data name="CompletelyConfirmed" xml:space="preserve">
<value>Completely confirmed</value>
</data>
<data name="CompletelySigned" xml:space="preserve">
<value>Completely signed</value>
</data>
<data name="Confirmation" xml:space="preserve">
<value>Read Confirmation</value>
</data>
<data name="Confirmed" xml:space="preserve">
<value>Read and signed</value>
</data>
<data name="Contract" xml:space="preserve">
<value>Contract</value>
</data>
<data name="Created" xml:space="preserve">
<value>Created</value>
</data>
<data name="DocumentConfirmed" xml:space="preserve">
<value>Document read and confirmed</value>
</data>
<data name="DocumentMod_Rotation" xml:space="preserve">
<value>Document rotation adapted</value>
</data>
@@ -147,6 +162,9 @@
<data name="DocumentRejected" xml:space="preserve">
<value>Signing rejected</value>
</data>
<data name="DocumentRejectedRaC" xml:space="preserve">
<value>Read confirmation rejected</value>
</data>
<data name="DocumentSigned" xml:space="preserve">
<value>Document signed</value>
</data>
@@ -156,6 +174,9 @@
<data name="EnvelopeArchived" xml:space="preserve">
<value>Archived</value>
</data>
<data name="EnvelopeCompletelyConfirmed" xml:space="preserve">
<value>Completely confirmed</value>
</data>
<data name="EnvelopeCompletelySigned" xml:space="preserve">
<value>Completely signed</value>
</data>
@@ -165,8 +186,11 @@
<data name="EnvelopeDeleted" xml:space="preserve">
<value>Envelope Deleted</value>
</data>
<data name="EnvelopePartlyConfirmed" xml:space="preserve">
<value>Partially confirmed</value>
</data>
<data name="EnvelopePartlySigned" xml:space="preserve">
<value>Partly signed</value>
<value>Partially signed</value>
</data>
<data name="EnvelopeQueued" xml:space="preserve">
<value>Envelope Queued</value>
@@ -177,6 +201,9 @@
<data name="EnvelopeReportCreated" xml:space="preserve">
<value>Signature certificate created</value>
</data>
<data name="EnvelopeReportCreatedRaC" xml:space="preserve">
<value>Read Confirmation Certificate Created</value>
</data>
<data name="EnvelopeSaved" xml:space="preserve">
<value>Saved</value>
</data>
@@ -195,6 +222,9 @@
<data name="MessageConfirmationSent" xml:space="preserve">
<value>Confirmation Sent</value>
</data>
<data name="MessageConfirmationSentRaC" xml:space="preserve">
<value>Read Confirmation Sent</value>
</data>
<data name="MessageDeletionSent" xml:space="preserve">
<value>Deletion Notice Sent</value>
</data>
@@ -204,6 +234,12 @@
<data name="No" xml:space="preserve">
<value>No</value>
</data>
<data name="PartlyConfirmed" xml:space="preserve">
<value>Partially confirmed</value>
</data>
<data name="PartlySigned" xml:space="preserve">
<value>Partially signed</value>
</data>
<data name="QualifiedSignature" xml:space="preserve">
<value>Qualified Signature</value>
</data>
@@ -223,7 +259,7 @@
<value>Signature</value>
</data>
<data name="SignatureConfirmed" xml:space="preserve">
<value>Signature confirmed</value>
<value>Finalization confirmed</value>
</data>
<data name="Signed" xml:space="preserve">
<value>Signed</value>

View File

@@ -132,8 +132,17 @@
<data name="Completed" xml:space="preserve">
<value>Abgeschlossen</value>
</data>
<data name="CompletelyConfirmed" xml:space="preserve">
<value>Vollständig bestätigt</value>
</data>
<data name="CompletelySigned" xml:space="preserve">
<value>Vollständig Signiert</value>
<value>Vollständig signiert</value>
</data>
<data name="Confirmation" xml:space="preserve">
<value>Lesebestätigung</value>
</data>
<data name="Confirmed" xml:space="preserve">
<value>Gelesen und Bestätigt</value>
</data>
<data name="Contract" xml:space="preserve">
<value>Vertrag</value>
@@ -141,6 +150,9 @@
<data name="Created" xml:space="preserve">
<value>Erstellt</value>
</data>
<data name="DocumentConfirmed" xml:space="preserve">
<value>Dokument gelesen und bestätigt</value>
</data>
<data name="DocumentMod_Rotation" xml:space="preserve">
<value>Dokument Rotation geändert</value>
</data>
@@ -150,6 +162,9 @@
<data name="DocumentRejected" xml:space="preserve">
<value>Unterzeichnung abgelehnt</value>
</data>
<data name="DocumentRejectedRaC" xml:space="preserve">
<value>Lesebestätigung abgelehnt</value>
</data>
<data name="DocumentSigned" xml:space="preserve">
<value>Dokument unterzeichnet</value>
</data>
@@ -159,6 +174,9 @@
<data name="EnvelopeArchived" xml:space="preserve">
<value>Archiviert</value>
</data>
<data name="EnvelopeCompletelyConfirmed" xml:space="preserve">
<value>Vollständig bestätigt</value>
</data>
<data name="EnvelopeCompletelySigned" xml:space="preserve">
<value>Vollständig signiert</value>
</data>
@@ -168,6 +186,9 @@
<data name="EnvelopeDeleted" xml:space="preserve">
<value>Umschlag Gelöscht</value>
</data>
<data name="EnvelopePartlyConfirmed" xml:space="preserve">
<value>Teil-Bestätigt</value>
</data>
<data name="EnvelopePartlySigned" xml:space="preserve">
<value>Teil-Signiert</value>
</data>
@@ -180,6 +201,9 @@
<data name="EnvelopeReportCreated" xml:space="preserve">
<value>Signierungszertifikat erstellt</value>
</data>
<data name="EnvelopeReportCreatedRaC" xml:space="preserve">
<value>Lesebestätigungszertifikat erstellt</value>
</data>
<data name="EnvelopeSaved" xml:space="preserve">
<value>Gespeichert</value>
</data>
@@ -198,6 +222,9 @@
<data name="MessageConfirmationSent" xml:space="preserve">
<value>Signaturbestätigung versendet</value>
</data>
<data name="MessageConfirmationSentRaC" xml:space="preserve">
<value>Lesebestätigung versendet</value>
</data>
<data name="MessageDeletionSent" xml:space="preserve">
<value>Löschinformation versendet</value>
</data>
@@ -207,6 +234,9 @@
<data name="No" xml:space="preserve">
<value>Nein</value>
</data>
<data name="PartlyConfirmed" xml:space="preserve">
<value>Teil-Bestätigt</value>
</data>
<data name="PartlySigned" xml:space="preserve">
<value>Teil-Signiert</value>
</data>
@@ -214,7 +244,7 @@
<value>Qualifizierte Signatur</value>
</data>
<data name="ReadAndSign" xml:space="preserve">
<value>Arbeitsanweisung</value>
<value>Lesebestätigung</value>
</data>
<data name="ResetTOTPUser" xml:space="preserve">
<value>Wollen Sie die 2-Faktor Definition für diesen Empfänger zurücksetzen. Der Empfänger muss sich dann neu identifizieren!</value>
@@ -229,7 +259,7 @@
<value>Signatur</value>
</data>
<data name="SignatureConfirmed" xml:space="preserve">
<value>Signatur bestätigt</value>
<value>Abschluss bestätigt</value>
</data>
<data name="Signed" xml:space="preserve">
<value>Signiert</value>

View File

@@ -1,17 +1,11 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
#if NETFRAMEWORK
using System;
#endif
namespace EnvelopeGenerator.Domain.Entities
{
[Table("TBSIG_CONFIG", Schema = "dbo")]
public class Config
{
[Column("DOCUMENT_PATH", TypeName = "nvarchar(256)")]
public string DocumentPath { get; set; }
[Column("SENDING_PROFILE", TypeName = "int")]
[Required]
public int SendingProfile { get; set; }
@@ -25,24 +19,5 @@ namespace EnvelopeGenerator.Domain.Entities
[Column("EXPORT_PATH", TypeName = "nvarchar(256)")]
public string ExportPath { get; set; }
[Column("ADDED_WHEN", TypeName = "datetime")]
[Required]
public DateTime AddedWhen { get; set; }
[Column("CHANGED_WHEN", TypeName = "datetime")]
public DateTime? ChangedWhen { get; set; }
[Column("GUID", TypeName = "tinyint")]
[Required]
public byte Guid { get; set; }
[Column("DEF_TFA_ENABLED", TypeName = "bit")]
[Required]
public bool DefTfaEnabled { get; set; }
[Column("DEF_TFA_WITH_PHONE", TypeName = "bit")]
[Required]
public bool DefTfaWithPhone { get; set; }
}
}

View File

@@ -76,14 +76,11 @@ namespace EnvelopeGenerator.Domain.Entities
#if nullable
?
#endif
Title { get; set; }
Title
{ get; set; }
[Column("COMMENT", TypeName = "nvarchar(128)")]
public string
#if nullable
?
#endif
Comment { get; set; }
public string Comment { get; set; }
[Column("CONTRACT_TYPE")]
public int? ContractType { get; set; }
@@ -154,7 +151,8 @@ namespace EnvelopeGenerator.Domain.Entities
#if nullable
?
#endif
Type { get; set; }
Type
{ get; set; }
#if NETFRAMEWORK
[NotMapped]
@@ -168,26 +166,22 @@ namespace EnvelopeGenerator.Domain.Entities
#if nullable
?
#endif
Documents { get; set; }
[NotMapped]
public Document
#if nullable
?
#endif
DefaultDocument => Documents?.FirstOrDefault();
Documents
{ get; set; }
public List<History>
#if nullable
?
#endif
Histories { get; set; }
Histories
{ get; set; }
public List<EnvelopeReceiver>
#if nullable
?
#endif
EnvelopeReceivers { get; set; }
EnvelopeReceivers
{ get; set; }
//#if NETFRAMEWORK
/// <summary>

View File

@@ -1,36 +0,0 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities
{
[Table("VWSIG_ENVELOPE_REPORT", Schema = "dbo")]
public class EnvelopeReport
{
[Column("ENVELOPE_ID", TypeName = "int")]
[Required]
public int EnvelopeId { get; set; }
[Column("HEAD_UUID", TypeName = "nvarchar(36)")]
[Required]
public string HeadUuid { get; set; }
[Column("HEAD_TITLE", TypeName = "nvarchar(128)")]
public string HeadTitle { get; set; }
[Column("HEAD_MESSAGE", TypeName = "nvarchar(max)")]
[Required]
public string HeadMessage { get; set; }
[Column("POS_STATUS", TypeName = "int")]
[Required]
public int PosStatus { get; set; }
[Column("POS_WHEN", TypeName = "datetime")]
public DateTime? PosWhen { get; set; }
[Column("POS_WHO", TypeName = "nvarchar(128)")]
[Required]
public string PosWho { get; set; }
}
}

View File

@@ -4,9 +4,6 @@ using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using EnvelopeGenerator.Domain.Interfaces.Auditing;
#if NET
using System.Text.Json.Serialization;
#endif
#if NETFRAMEWORK
using System.Collections.Generic;
#endif
@@ -112,25 +109,22 @@ namespace EnvelopeGenerator.Domain.Entities
#if nullable
?
#endif
Receiver { get; set; }
Receiver
{ get; set; }
public virtual IEnumerable<ElementAnnotation>
#if nullable
?
#endif
Annotations { get; set; }
Annotations
{ get; set; }
#if NET
[JsonIgnore]
#endif
#if NETFRAMEWORK
[NotMapped]
public double Top => Math.Round(Y, 5);
#if NET
[JsonIgnore]
#endif
[NotMapped]
public double Left => Math.Round(X, 5);
#endif
}
}

View File

@@ -1,10 +1,10 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
@@ -13,12 +13,12 @@ namespace My.Resources {
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@@ -33,7 +33,7 @@ namespace My.Resources {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
@@ -47,8 +47,8 @@ namespace My.Resources {
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
@@ -61,7 +61,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Zugriffscode korrekt eingegeben ähnelt.
/// Looks up a localized string similar to Zugriffscode korrekt eingegeben.
/// </summary>
public static string AccessCodeCorrect {
get {
@@ -70,7 +70,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Zugriffscode falsch eingegeben ähnelt.
/// Looks up a localized string similar to Zugriffscode falsch eingegeben.
/// </summary>
public static string AccessCodeIncorrect {
get {
@@ -79,7 +79,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Zugriffscode angefordert ähnelt.
/// Looks up a localized string similar to Zugriffscode angefordert.
/// </summary>
public static string AccessCodeRequested {
get {
@@ -88,7 +88,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Fortgeschrittene Elektronische Signatur ähnelt.
/// Looks up a localized string similar to Fortgeschrittene Elektronische Signatur.
/// </summary>
public static string AdvancedElectronicSignature {
get {
@@ -97,7 +97,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Abgeschlossen ähnelt.
/// Looks up a localized string similar to Abgeschlossen.
/// </summary>
public static string Completed {
get {
@@ -106,7 +106,16 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Vollständig Signiert ähnelt.
/// Looks up a localized string similar to Vollständig bestätigt.
/// </summary>
public static string CompletelyConfirmed {
get {
return ResourceManager.GetString("CompletelyConfirmed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Vollständig signiert.
/// </summary>
public static string CompletelySigned {
get {
@@ -115,7 +124,25 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Vertrag ähnelt.
/// Looks up a localized string similar to Lesebestätigung.
/// </summary>
public static string Confirmation {
get {
return ResourceManager.GetString("Confirmation", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Gelesen und bestätigt.
/// </summary>
public static string Confirmed {
get {
return ResourceManager.GetString("Confirmed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Vertrag.
/// </summary>
public static string Contract {
get {
@@ -124,7 +151,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Erstellt ähnelt.
/// Looks up a localized string similar to Erstellt.
/// </summary>
public static string Created {
get {
@@ -133,7 +160,16 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Dokument Rotation geändert ähnelt.
/// Looks up a localized string similar to Dokument gelesen und bestätigt.
/// </summary>
public static string DocumentConfirmed {
get {
return ResourceManager.GetString("DocumentConfirmed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Dokument Rotation geändert.
/// </summary>
public static string DocumentMod_Rotation {
get {
@@ -142,7 +178,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Dokument geöffnet ähnelt.
/// Looks up a localized string similar to Dokument geöffnet.
/// </summary>
public static string DocumentOpened {
get {
@@ -151,7 +187,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Unterzeichnung abgelehnt ähnelt.
/// Looks up a localized string similar to Unterzeichnung abgelehnt.
/// </summary>
public static string DocumentRejected {
get {
@@ -160,7 +196,16 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Dokument unterzeichnet ähnelt.
/// Looks up a localized string similar to Lesebestätigung abgelehnt.
/// </summary>
public static string DocumentRejectedRaC {
get {
return ResourceManager.GetString("DocumentRejectedRaC", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Dokument unterzeichnet.
/// </summary>
public static string DocumentSigned {
get {
@@ -169,7 +214,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Entwurf ähnelt.
/// Looks up a localized string similar to Entwurf.
/// </summary>
public static string Draft {
get {
@@ -178,7 +223,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Archiviert ähnelt.
/// Looks up a localized string similar to Archiviert.
/// </summary>
public static string EnvelopeArchived {
get {
@@ -187,7 +232,16 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Vollständig signiert ähnelt.
/// Looks up a localized string similar to Vollständig gelesen und bestätigt.
/// </summary>
public static string EnvelopeCompletelyConfirmed {
get {
return ResourceManager.GetString("EnvelopeCompletelyConfirmed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Vollständig signiert.
/// </summary>
public static string EnvelopeCompletelySigned {
get {
@@ -196,7 +250,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Umschlag Erstellt ähnelt.
/// Looks up a localized string similar to Umschlag Erstellt.
/// </summary>
public static string EnvelopeCreated {
get {
@@ -205,7 +259,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Umschlag Gelöscht ähnelt.
/// Looks up a localized string similar to Umschlag Gelöscht.
/// </summary>
public static string EnvelopeDeleted {
get {
@@ -214,7 +268,16 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Teil-Signiert ähnelt.
/// Looks up a localized string similar to Teil-Bestätigt.
/// </summary>
public static string EnvelopePartlyConfirmed {
get {
return ResourceManager.GetString("EnvelopePartlyConfirmed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Teil-Signiert.
/// </summary>
public static string EnvelopePartlySigned {
get {
@@ -223,7 +286,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Umschlag in Queue ähnelt.
/// Looks up a localized string similar to Umschlag in Queue.
/// </summary>
public static string EnvelopeQueued {
get {
@@ -232,7 +295,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Umschlag abgelehnt ähnelt.
/// Looks up a localized string similar to Umschlag abgelehnt.
/// </summary>
public static string EnvelopeRejected {
get {
@@ -241,7 +304,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Signierungszertifikat erstellt ähnelt.
/// Looks up a localized string similar to Signierungszertifikat erstellt.
/// </summary>
public static string EnvelopeReportCreated {
get {
@@ -250,7 +313,16 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Gespeichert ähnelt.
/// Looks up a localized string similar to Lesebestätigungszertifikat erstellt.
/// </summary>
public static string EnvelopeReportCreatedRaC {
get {
return ResourceManager.GetString("EnvelopeReportCreatedRaC", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Gespeichert.
/// </summary>
public static string EnvelopeSaved {
get {
@@ -259,7 +331,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Gesendet ähnelt.
/// Looks up a localized string similar to Gesendet.
/// </summary>
public static string EnvelopeSent {
get {
@@ -268,7 +340,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Umschlag zurückgezogen ähnelt.
/// Looks up a localized string similar to Umschlag zurückgezogen.
/// </summary>
public static string EnvelopeWithdrawn {
get {
@@ -277,7 +349,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Zugriffscode versendet ähnelt.
/// Looks up a localized string similar to Zugriffscode versendet.
/// </summary>
public static string MessageAccessCodeSent {
get {
@@ -286,7 +358,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Abschlussemail versendet ähnelt.
/// Looks up a localized string similar to Abschlussemail versendet.
/// </summary>
public static string MessageCompletionSent {
get {
@@ -295,7 +367,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Signaturbestätigung versendet ähnelt.
/// Looks up a localized string similar to Abschlussbestätigung versendet.
/// </summary>
public static string MessageConfirmationSent {
get {
@@ -304,7 +376,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Löschinformation versendet ähnelt.
/// Looks up a localized string similar to Löschinformation versendet.
/// </summary>
public static string MessageDeletionSent {
get {
@@ -313,7 +385,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Dokumentenlink versendet ähnelt.
/// Looks up a localized string similar to Dokumentenlink versendet.
/// </summary>
public static string MessageInvitationSent {
get {
@@ -322,7 +394,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Nein ähnelt.
/// Looks up a localized string similar to Nein.
/// </summary>
public static string No {
get {
@@ -331,7 +403,16 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Teil-Signiert ähnelt.
/// Looks up a localized string similar to Teil-Bestätigt.
/// </summary>
public static string PartlyConfirmed {
get {
return ResourceManager.GetString("PartlyConfirmed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Teil-Signiert.
/// </summary>
public static string PartlySigned {
get {
@@ -340,7 +421,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Qualifizierte Signatur ähnelt.
/// Looks up a localized string similar to Qualifizierte Signatur.
/// </summary>
public static string QualifiedSignature {
get {
@@ -349,7 +430,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Arbeitsanweisung ähnelt.
/// Looks up a localized string similar to Lesebestätigung.
/// </summary>
public static string ReadAndSign {
get {
@@ -358,7 +439,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Wollen Sie die 2-Faktor Definition für diesen Empfänger zurücksetzen. Der Empfänger muss sich dann neu identifizieren! ähnelt.
/// Looks up a localized string similar to Wollen Sie die 2-Faktor Definition für diesen Empfänger zurücksetzen. Der Empfänger muss sich dann neu identifizieren!.
/// </summary>
public static string ResetTOTPUser {
get {
@@ -367,7 +448,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Gespeichert ähnelt.
/// Looks up a localized string similar to Gespeichert.
/// </summary>
public static string Saved {
get {
@@ -376,7 +457,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Gesendet ähnelt.
/// Looks up a localized string similar to Gesendet.
/// </summary>
public static string Sent {
get {
@@ -385,7 +466,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Signatur ähnelt.
/// Looks up a localized string similar to Signatur.
/// </summary>
public static string Signature {
get {
@@ -394,7 +475,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Signatur bestätigt ähnelt.
/// Looks up a localized string similar to Abschluss bestätigt.
/// </summary>
public static string SignatureConfirmed {
get {
@@ -403,7 +484,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Signiert ähnelt.
/// Looks up a localized string similar to Signiert.
/// </summary>
public static string Signed {
get {
@@ -412,7 +493,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Erfolgreich! Dialog wird geschlossen. ähnelt.
/// Looks up a localized string similar to Erfolgreich! Dialog wird geschlossen..
/// </summary>
public static string Success_FormClose {
get {
@@ -421,7 +502,16 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Unsigniert ähnelt.
/// Looks up a localized string similar to Unbestätigt.
/// </summary>
public static string Unconfirmed {
get {
return ResourceManager.GetString("Unconfirmed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unsigniert.
/// </summary>
public static string Unsigned {
get {
@@ -430,7 +520,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Ja ähnelt.
/// Looks up a localized string similar to Ja.
/// </summary>
public static string Yes {
get {
@@ -439,7 +529,7 @@ namespace My.Resources {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Ja, mit Anhang ähnelt.
/// Looks up a localized string similar to Ja, mit Anhang.
/// </summary>
public static string YesWithAttachment {
get {

View File

@@ -132,15 +132,27 @@
<data name="Completed" xml:space="preserve">
<value>Completed</value>
</data>
<data name="CompletelyConfirmed" xml:space="preserve">
<value>Completely confirmed</value>
</data>
<data name="CompletelySigned" xml:space="preserve">
<value>Completely signed</value>
</data>
<data name="Confirmation" xml:space="preserve">
<value>Read Confirmation</value>
</data>
<data name="Confirmed" xml:space="preserve">
<value>Read and signed</value>
</data>
<data name="Contract" xml:space="preserve">
<value>Contract</value>
</data>
<data name="Created" xml:space="preserve">
<value>Created</value>
</data>
<data name="DocumentConfirmed" xml:space="preserve">
<value>Document read and signed</value>
</data>
<data name="DocumentMod_Rotation" xml:space="preserve">
<value>Document rotation adapted</value>
</data>
@@ -150,6 +162,9 @@
<data name="DocumentRejected" xml:space="preserve">
<value>Signing rejected</value>
</data>
<data name="DocumentRejectedRaC" xml:space="preserve">
<value>Read confirmation rejected</value>
</data>
<data name="DocumentSigned" xml:space="preserve">
<value>Document signed</value>
</data>
@@ -159,6 +174,9 @@
<data name="EnvelopeArchived" xml:space="preserve">
<value>Archived</value>
</data>
<data name="EnvelopeCompletelyConfirmed" xml:space="preserve">
<value>Completely confirmed</value>
</data>
<data name="EnvelopeCompletelySigned" xml:space="preserve">
<value>Completely signed</value>
</data>
@@ -168,8 +186,11 @@
<data name="EnvelopeDeleted" xml:space="preserve">
<value>Envelope Deleted</value>
</data>
<data name="EnvelopePartlyConfirmed" xml:space="preserve">
<value>Partially confirmed</value>
</data>
<data name="EnvelopePartlySigned" xml:space="preserve">
<value>Partly signed</value>
<value>Partially signed</value>
</data>
<data name="EnvelopeQueued" xml:space="preserve">
<value>Envelope Queued</value>
@@ -180,6 +201,9 @@
<data name="EnvelopeReportCreated" xml:space="preserve">
<value>Signature certificate created</value>
</data>
<data name="EnvelopeReportCreatedRaC" xml:space="preserve">
<value>Read confirmartion certificate created</value>
</data>
<data name="EnvelopeSaved" xml:space="preserve">
<value>Saved</value>
</data>
@@ -196,7 +220,7 @@
<value>Final email sent</value>
</data>
<data name="MessageConfirmationSent" xml:space="preserve">
<value>Confirmation Sent</value>
<value>Finalization Confirmation Sent</value>
</data>
<data name="MessageDeletionSent" xml:space="preserve">
<value>Deletion Notice Sent</value>
@@ -207,6 +231,12 @@
<data name="No" xml:space="preserve">
<value>No</value>
</data>
<data name="PartlyConfirmed" xml:space="preserve">
<value>Partially confirmed</value>
</data>
<data name="PartlySigned" xml:space="preserve">
<value>Partially signed</value>
</data>
<data name="QualifiedSignature" xml:space="preserve">
<value>Qualified Signature</value>
</data>
@@ -226,7 +256,7 @@
<value>Signature</value>
</data>
<data name="SignatureConfirmed" xml:space="preserve">
<value>Signature confirmed</value>
<value>Finalization confirmed</value>
</data>
<data name="Signed" xml:space="preserve">
<value>Signed</value>
@@ -234,6 +264,9 @@
<data name="Success_FormClose" xml:space="preserve">
<value>Successful! Dialog is closed.successful! Dialog is closed.</value>
</data>
<data name="Unconfirmed" xml:space="preserve">
<value>Unconfirmed</value>
</data>
<data name="Unsigned" xml:space="preserve">
<value>Unsigned</value>
</data>

View File

@@ -132,8 +132,17 @@
<data name="Completed" xml:space="preserve">
<value>Abgeschlossen</value>
</data>
<data name="CompletelyConfirmed" xml:space="preserve">
<value>Vollständig bestätigt</value>
</data>
<data name="CompletelySigned" xml:space="preserve">
<value>Vollständig Signiert</value>
<value>Vollständig signiert</value>
</data>
<data name="Confirmation" xml:space="preserve">
<value>Lesebestätigung</value>
</data>
<data name="Confirmed" xml:space="preserve">
<value>Gelesen und bestätigt</value>
</data>
<data name="Contract" xml:space="preserve">
<value>Vertrag</value>
@@ -141,6 +150,9 @@
<data name="Created" xml:space="preserve">
<value>Erstellt</value>
</data>
<data name="DocumentConfirmed" xml:space="preserve">
<value>Dokument gelesen und bestätigt</value>
</data>
<data name="DocumentMod_Rotation" xml:space="preserve">
<value>Dokument Rotation geändert</value>
</data>
@@ -150,6 +162,9 @@
<data name="DocumentRejected" xml:space="preserve">
<value>Unterzeichnung abgelehnt</value>
</data>
<data name="DocumentRejectedRaC" xml:space="preserve">
<value>Lesebestätigung abgelehnt</value>
</data>
<data name="DocumentSigned" xml:space="preserve">
<value>Dokument unterzeichnet</value>
</data>
@@ -159,6 +174,9 @@
<data name="EnvelopeArchived" xml:space="preserve">
<value>Archiviert</value>
</data>
<data name="EnvelopeCompletelyConfirmed" xml:space="preserve">
<value>Vollständig gelesen und bestätigt</value>
</data>
<data name="EnvelopeCompletelySigned" xml:space="preserve">
<value>Vollständig signiert</value>
</data>
@@ -168,6 +186,9 @@
<data name="EnvelopeDeleted" xml:space="preserve">
<value>Umschlag Gelöscht</value>
</data>
<data name="EnvelopePartlyConfirmed" xml:space="preserve">
<value>Teil-Bestätigt</value>
</data>
<data name="EnvelopePartlySigned" xml:space="preserve">
<value>Teil-Signiert</value>
</data>
@@ -180,6 +201,9 @@
<data name="EnvelopeReportCreated" xml:space="preserve">
<value>Signierungszertifikat erstellt</value>
</data>
<data name="EnvelopeReportCreatedRaC" xml:space="preserve">
<value>Lesebestätigungszertifikat erstellt</value>
</data>
<data name="EnvelopeSaved" xml:space="preserve">
<value>Gespeichert</value>
</data>
@@ -196,7 +220,7 @@
<value>Abschlussemail versendet</value>
</data>
<data name="MessageConfirmationSent" xml:space="preserve">
<value>Signaturbestätigung versendet</value>
<value>Abschlussbestätigung versendet</value>
</data>
<data name="MessageDeletionSent" xml:space="preserve">
<value>Löschinformation versendet</value>
@@ -207,6 +231,9 @@
<data name="No" xml:space="preserve">
<value>Nein</value>
</data>
<data name="PartlyConfirmed" xml:space="preserve">
<value>Teil-Bestätigt</value>
</data>
<data name="PartlySigned" xml:space="preserve">
<value>Teil-Signiert</value>
</data>
@@ -214,7 +241,7 @@
<value>Qualifizierte Signatur</value>
</data>
<data name="ReadAndSign" xml:space="preserve">
<value>Arbeitsanweisung</value>
<value>Lesebestätigung</value>
</data>
<data name="ResetTOTPUser" xml:space="preserve">
<value>Wollen Sie die 2-Faktor Definition für diesen Empfänger zurücksetzen. Der Empfänger muss sich dann neu identifizieren!</value>
@@ -229,7 +256,7 @@
<value>Signatur</value>
</data>
<data name="SignatureConfirmed" xml:space="preserve">
<value>Signatur bestätigt</value>
<value>Abschluss bestätigt</value>
</data>
<data name="Signed" xml:space="preserve">
<value>Signiert</value>
@@ -237,6 +264,9 @@
<data name="Success_FormClose" xml:space="preserve">
<value>Erfolgreich! Dialog wird geschlossen.</value>
</data>
<data name="Unconfirmed" xml:space="preserve">
<value>Unbestätigt</value>
</data>
<data name="Unsigned" xml:space="preserve">
<value>Unsigniert</value>
</data>

View File

@@ -79,8 +79,6 @@ public abstract class EGDbContextBase : DbContext
public DbSet<ClientUser> ClientUsers { get; set; }
public DbSet<EnvelopeReport> EnvelopeReports { get; set; }
private readonly DbTriggerParams _triggers;
private readonly ILogger

View File

@@ -1,33 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
<PackageReference Include="GdPicture" Version="14.3.3" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.17" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.17" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Quartz" Version="3.8.0" />
<PackageReference Include="System.Collections.Immutable" Version="8.0.0" />
<PackageReference Include="System.Drawing.Common" Version="8.0.16" />
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageReference Include="DevExpress.Reporting.Core" Version="24.2.*" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EnvelopeGenerator.Domain\EnvelopeGenerator.Domain.csproj" />
<ProjectReference Include="..\EnvelopeGenerator.Infrastructure\EnvelopeGenerator.Infrastructure.csproj" />
<ProjectReference Include="..\EnvelopeGenerator.PdfEditor\EnvelopeGenerator.PdfEditor.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Controllers\" />
</ItemGroup>
</Project>

View File

@@ -1,12 +0,0 @@
namespace EnvelopeGenerator.ServiceHost.Exceptions;
public class BurnAnnotationException : ApplicationException
{
public BurnAnnotationException(string message) : base(message)
{
}
public BurnAnnotationException(string message, Exception innerException) : base(message, innerException)
{
}
}

View File

@@ -1,12 +0,0 @@
namespace EnvelopeGenerator.ServiceHost.Exceptions;
public class CreateReportException : ApplicationException
{
public CreateReportException(string message) : base(message)
{
}
public CreateReportException(string message, Exception innerException) : base(message, innerException)
{
}
}

View File

@@ -1,12 +0,0 @@
namespace EnvelopeGenerator.ServiceHost.Exceptions;
public class ExportDocumentException : ApplicationException
{
public ExportDocumentException(string message) : base(message)
{
}
public ExportDocumentException(string message, Exception innerException) : base(message, innerException)
{
}
}

View File

@@ -1,12 +0,0 @@
namespace EnvelopeGenerator.ServiceHost.Exceptions;
public class MergeDocumentException : ApplicationException
{
public MergeDocumentException(string message) : base(message)
{
}
public MergeDocumentException(string message, Exception innerException) : base(message, innerException)
{
}
}

View File

@@ -1,27 +0,0 @@
using System.Data;
namespace EnvelopeGenerator.ServiceHost.Extensions;
public static class DataRowExtensions
{
public static T ItemEx<T>(this DataRow row, string columnName, T defaultValue)
{
if (!row.Table.Columns.Contains(columnName))
{
return defaultValue;
}
var value = row[columnName];
if (value is DBNull or null)
{
return defaultValue;
}
return (T)Convert.ChangeType(value, typeof(T));
}
public static string ItemEx(this DataRow row, string columnName, string defaultValue)
{
return row.ItemEx<string>(columnName, defaultValue);
}
}

View File

@@ -1,37 +0,0 @@
using DigitalData.Modules.Database;
using EnvelopeGenerator.ServiceHost.Jobs;
using EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
using GdPicture14;
using Microsoft.Extensions.Options;
namespace EnvelopeGenerator.ServiceHost.Extensions;
public static class DependencyInjection
{
[Obsolete("Check obsoleted services")]
public static IServiceCollection AddFinalizeDocumentJob(this IServiceCollection services, IConfiguration configuration)
{
services.Configure<WorkerOptions>(configuration.GetSection(nameof(WorkerOptions)));
services.AddSingleton<FinalizeDocumentJob>();
services.AddScoped<ActionService>();
services.AddSingleton<TempFiles>();
services.AddScoped<PDFBurner>();
services.AddScoped<PDFMerger>();
services.AddScoped<ReportModel>();
services.AddScoped<MSSQLServer>();
//TODO: Check lifetime of services. They might be singleton or scoped.
services.AddTransient<GdViewer>();
// Add LicenseManager
services.AddTransient(provider =>
{
var options = provider.GetRequiredService<IOptions<WorkerOptions>>().Value;
var licenseManager = new LicenseManager();
licenseManager.RegisterKEY(options.GdPictureLicenseKey);
return licenseManager;
});
services.AddTransient<AnnotationManager>();
return services;
}
}

View File

@@ -1,11 +0,0 @@
using EnvelopeGenerator.ServiceHost.Extensions;
namespace EnvelopeGenerator.ServiceHost.Extensions;
public static class LoggerExtensions
{
public static void LogError(this ILogger logger, Exception exception)
{
logger.LogError(exception, "{message}", exception.Message);
}
}

View File

@@ -1,35 +0,0 @@
using DigitalData.Core.Abstraction.Application.Repository;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.ServiceHost.Jobs;
/// <summary>
/// migrate from EnvelopeGenerator.CommonServices.Services.ActionService
/// </summary>
[Obsolete("This is a placeholder service added by copilot. Migrate the actual logic from CommonServices.Jobs")]
public class ActionService(IRepository<History> histRepo)
{
[Obsolete("This is a placeholder service added by copilot. Migrate the actual logic from CommonServices.Jobs")]
public bool CreateReport(Envelope envelope, CancellationToken cancel = default)
{
throw new NotImplementedException();
}
[Obsolete("This is a placeholder service added by copilot. Migrate the actual logic from CommonServices.Jobs")]
public bool FinalizeEnvelope(Envelope envelope, CancellationToken cancel = default)
{
throw new NotImplementedException();
}
[Obsolete("This is a placeholder service added by copilot. Migrate the actual logic from CommonServices.Jobs")]
public bool CompleteEnvelope(Envelope envelope, CancellationToken cancel = default)
{
throw new NotImplementedException();
}
[Obsolete("This is a placeholder service added by copilot. Migrate the actual logic from CommonServices.Jobs")]
public bool CompleteEnvelope(Envelope envelope, Receiver receiver, CancellationToken cancel = default)
{
throw new NotImplementedException();
}
}

View File

@@ -1,430 +0,0 @@
using System.Collections.Immutable;
using System.Drawing;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure;
using EnvelopeGenerator.PdfEditor;
using EnvelopeGenerator.ServiceHost.Exceptions;
using GdPicture14;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
//TODO: check if licence manager is needed as a dependency to
/// <summary>
///
/// </summary>
/// <param name="workerOptions"></param>
/// <param name="context2"></param>
/// <param name="logger2"></param>
/// <param name="licenseManager"></param>
/// <param name="annotationManager2"></param>
public class PDFBurner(IOptions<WorkerOptions> workerOptions, EGDbContext context, ILogger<PDFBurner> logger, LicenseManager licenseManager, AnnotationManager manager)
{
private readonly WorkerOptions.PDFBurnerOptions _options = workerOptions.Value.PdfBurner;
public byte[] BurnAnnotsToPDF(byte[] sourceBuffer, List<string> instantJsonList, int envelopeId)
{
var envelope = context.Envelopes.FirstOrDefault(env => env.Id == envelopeId);
if (envelope is null)
{
throw new BurnAnnotationException($"Envelope with Id {envelopeId} not found.");
}
if (envelope.ReadOnly)
{
return sourceBuffer;
}
var elements = context.DocumentReceiverElements
.Where(sig => sig.Document.EnvelopeId == envelopeId)
.Include(sig => sig.Annotations)
.ToList();
return elements.Any()
? BurnElementAnnotsToPDF(sourceBuffer, elements)
: BurnInstantJSONAnnotsToPDF(sourceBuffer, instantJsonList);
}
public byte[] BurnElementAnnotsToPDF(byte[] sourceBuffer, List<Signature> elements)
{
using (var doc = Pdf.FromMemory(sourceBuffer))
{
sourceBuffer = doc.Background(elements, 1.9500000000000002 * 0.93, 2.52 * 0.67).ExportStream().ToArray();
using var sourceStream = new MemoryStream(sourceBuffer);
var result = manager.InitFromStream(sourceStream);
if (result != GdPictureStatus.OK)
{
throw new BurnAnnotationException($"Could not open document for burning: [{result}]");
}
var margin = 0.2;
var inchFactor = 72d;
var keys = new[] { "position", "city", "date" };
var unitYOffsets = 0.2;
var yOffsetsOfFF = keys
.Select((k, i) => new { Key = k, Value = unitYOffsets * i + 1 })
.ToDictionary(x => x.Key, x => x.Value);
foreach (var element in elements)
{
var frameX = element.Left - 0.7 - margin;
var frame = element.Annotations.FirstOrDefault(a => a.Name == "frame");
var frameY = element.Top - 0.5 - margin;
var frameYShift = (frame?.Y ?? 0) - frameY * inchFactor;
var frameXShift = (frame?.X ?? 0) - frameX * inchFactor;
foreach (var annot in element.Annotations)
{
var yOffsetOfFF = yOffsetsOfFF.TryGetValue(annot.Name, out var offset) ? offset : 0;
var y = frameY + yOffsetOfFF;
if (annot.Type == AnnotationType.FormField)
{
AddFormFieldValue(annot.X / inchFactor, y, annot.Width / inchFactor, annot.Height / inchFactor, element.Page, annot.Value);
}
else if (annot.Type == AnnotationType.Image)
{
AddImageAnnotation(
annot.X / inchFactor,
annot.Name == "signature" ? (annot.Y - frameYShift) / inchFactor : y,
annot.Width / inchFactor,
annot.Height / inchFactor,
element.Page,
annot.Value);
}
else if (annot.Type == AnnotationType.Ink)
{
AddInkAnnotation(element.Page, annot.Value);
}
}
}
using var newStream = new MemoryStream();
result = manager.SaveDocumentToPDF(newStream);
if (result != GdPictureStatus.OK)
{
throw new BurnAnnotationException($"Could not save document to stream: [{result}]");
}
manager.Close();
return newStream.ToArray();
}
}
public byte[] BurnInstantJSONAnnotsToPDF(byte[] sourceBuffer, List<string> instantJsonList)
{
using var sourceStream = new MemoryStream(sourceBuffer);
var result = manager.InitFromStream(sourceStream);
if (result != GdPictureStatus.OK)
{
throw new BurnAnnotationException($"Could not open document for burning: [{result}]");
}
foreach (var json in instantJsonList)
{
try
{
AddInstantJSONAnnotationToPDF(json);
}
catch (Exception ex)
{
logger.LogWarning("Error in AddInstantJSONAnnotationToPDF - oJson: ");
logger.LogWarning(json);
throw new BurnAnnotationException("Adding Annotation failed", ex);
}
}
result = manager.BurnAnnotationsToPage(RemoveInitialAnnots: true, VectorMode: true);
if (result != GdPictureStatus.OK)
{
throw new BurnAnnotationException($"Could not burn annotations to file: [{result}]");
}
using var newStream = new MemoryStream();
result = manager.SaveDocumentToPDF(newStream);
if (result != GdPictureStatus.OK)
{
throw new BurnAnnotationException($"Could not save document to stream: [{result}]");
}
manager.Close();
return newStream.ToArray();
}
private void AddInstantJSONAnnotationToPDF(string instantJson)
{
var annotationData = JsonConvert.DeserializeObject<AnnotationData>(instantJson);
if (annotationData is null)
{
return;
}
annotationData.annotations.Reverse();
foreach (var annotation in annotationData.annotations)
{
logger.LogDebug("Adding AnnotationID: " + annotation.id);
switch (annotation.type)
{
case AnnotationType.Image:
AddImageAnnotation(annotation, annotationData.attachments);
break;
case AnnotationType.Ink:
AddInkAnnotation(annotation);
break;
case AnnotationType.Widget:
var formFieldValue = annotationData.formFieldValues.FirstOrDefault(fv => fv.name == annotation.id);
if (formFieldValue is not null && !_options.IgnoredLabels.Contains(formFieldValue.value))
{
AddFormFieldValue(annotation, formFieldValue);
}
break;
}
}
}
private void AddImageAnnotation(double x, double y, double width, double height, int page, string base64)
{
manager.SelectPage(page);
manager.AddEmbeddedImageAnnotFromBase64(base64, (float) x, (float) y, (float) width, (float) height);
}
private void AddImageAnnotation(Annotation annotation, Dictionary<string, Attachment> attachments)
{
var attachment = attachments.Where(a => a.Key == annotation.imageAttachmentId).SingleOrDefault();
var bounds = annotation.bbox.Select(ToInches).ToList();
var x = bounds[0];
var y = bounds[1];
var width = bounds[2];
var height = bounds[3];
manager.SelectPage(annotation.pageIndex + 1);
manager.AddEmbeddedImageAnnotFromBase64(attachment.Value.binary, (float) x, (float) y, (float) width, (float) height);
}
private void AddInkAnnotation(int page, string value)
{
var ink = JsonConvert.DeserializeObject<Ink>(value);
if (ink is null)
{
return;
}
var segments = ink.lines.points;
var color = ColorTranslator.FromHtml(ink.strokeColor);
manager.SelectPage(page);
foreach (var segment in segments)
{
var points = segment.Select(ToPointF).ToArray();
manager.AddFreeHandAnnot(color, points);
}
}
private void AddInkAnnotation(Annotation annotation)
{
var segments = annotation.lines.points;
var color = ColorTranslator.FromHtml(annotation.strokeColor);
manager.SelectPage(annotation.pageIndex + 1);
foreach (var segment in segments)
{
var points = segment.Select(ToPointF).ToArray();
manager.AddFreeHandAnnot(color, points);
}
}
private void AddFormFieldValue(double x, double y, double width, double height, int page, string value)
{
manager.SelectPage(page);
var annot = manager.AddTextAnnot((float) x, (float) y, (float) width, (float) height, value);
annot.FontName = _options.FontName;
annot.FontSize = _options.FontSize;
annot.FontStyle = _options.FontStyle;
manager.SaveAnnotationsToPage();
}
private void AddFormFieldValue(Annotation annotation, FormFieldValue formFieldValue)
{
var ffIndex = EGName.Index[annotation.egName];
var bounds = annotation.bbox.Select(ToInches).ToList();
var x = bounds[0];
var y = bounds[1] + _options.YOffset * ffIndex + _options.TopMargin;
var width = bounds[2];
var height = bounds[3];
manager.SelectPage(annotation.pageIndex + 1);
var annot = manager.AddTextAnnot((float) x, (float) y, (float) width, (float) height, formFieldValue.value);
annot.FontName = _options.FontName;
annot.FontSize = _options.FontSize;
annot.FontStyle = _options.FontStyle;
manager.SaveAnnotationsToPage();
}
private static PointF ToPointF(List<float> points)
{
var convertedPoints = points.Select(ToInches).ToList();
return new PointF(convertedPoints[0], convertedPoints[1]);
}
private static double ToInches(double value) => value / 72;
private static float ToInches(float value) => value / 72;
internal static class AnnotationType
{
public const string Image = "pspdfkit/image";
public const string Ink = "pspdfkit/ink";
public const string Widget = "pspdfkit/widget";
public const string FormField = "pspdfkit/form-field-value";
}
internal class AnnotationData
{
public List<Annotation> annotations { get; set; } = new();
public IEnumerable<List<Annotation>> AnnotationsByReceiver => annotations
.Where(annot => annot.hasStructuredID)
.GroupBy(a => a.receiverId)
.Select(g => g.ToList());
public IEnumerable<List<Annotation>> UnstructuredAnnotations => annotations
.Where(annot => !annot.hasStructuredID)
.GroupBy(a => a.receiverId)
.Select(g => g.ToList());
public Dictionary<string, Attachment> attachments { get; set; } = new();
public List<FormFieldValue> formFieldValues { get; set; } = new();
}
internal class Annotation
{
private string? _id;
public int envelopeId;
public int receiverId;
public int index;
public string egName = EGName.NoName;
public bool hasStructuredID;
public bool isLabel
{
get
{
if (string.IsNullOrEmpty(egName))
{
return false;
}
var parts = egName.Split('_');
return parts.Length > 1 && parts[1] == "label";
}
}
public string id
{
get => _id ?? string.Empty;
set
{
_id = value;
if (string.IsNullOrWhiteSpace(_id))
{
throw new BurnAnnotationException("The identifier of annotation is null or empty.");
}
var parts = value.Split('#');
if (parts.Length != 4)
{
return;
}
if (!int.TryParse(parts[0], out envelopeId))
{
throw new BurnAnnotationException($"The envelope ID of annotation is not integer. Id: {_id}");
}
if (!int.TryParse(parts[1], out receiverId))
{
throw new BurnAnnotationException($"The receiver ID of annotation is not integer. Id: {_id}");
}
if (!int.TryParse(parts[2], out index))
{
throw new BurnAnnotationException($"The index of annotation is not integer. Id: {_id}");
}
egName = parts[3];
hasStructuredID = true;
}
}
public List<double> bbox { get; set; } = new();
public string type { get; set; } = string.Empty;
public bool isSignature { get; set; }
public string imageAttachmentId { get; set; } = string.Empty;
public Lines lines { get; set; } = new();
public int pageIndex { get; set; }
public string strokeColor { get; set; } = string.Empty;
}
internal class Ink
{
public Lines lines { get; set; } = new();
public string strokeColor { get; set; } = string.Empty;
}
public class EGName
{
public static readonly string NoName = Guid.NewGuid().ToString();
public static readonly string Seal = "signature";
public static readonly ImmutableDictionary<string, int> Index = new Dictionary<string, int>
{
{ NoName, 0 },
{ Seal, 0 },
{ "position", 1 },
{ "city", 2 },
{ "date", 3 }
}.ToImmutableDictionary();
}
internal class Lines
{
public List<List<List<float>>> points { get; set; } = new();
}
internal class Attachment
{
public string binary { get; set; } = string.Empty;
public string contentType { get; set; } = string.Empty;
}
internal class FormFieldValue
{
public string name { get; set; } = string.Empty;
public string value { get; set; } = string.Empty;
}
}

View File

@@ -1,61 +0,0 @@
using EnvelopeGenerator.ServiceHost.Exceptions;
using GdPicture14;
using Microsoft.Extensions.Options;
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
public class PDFMerger
{
private readonly AnnotationManager _manager;
private readonly LicenseManager _licenseManager;
private const bool AllowRasterization = true;
private const bool AllowVectorization = true;
private readonly PdfConversionConformance _pdfaConformanceLevel = PdfConversionConformance.PDF_A_1b;
public PDFMerger(LicenseManager licenseManager, AnnotationManager annotationManager)
{
_licenseManager = licenseManager;
_manager = annotationManager;
}
public byte[] MergeDocuments(byte[] document, byte[] report)
{
using var documentStream = new MemoryStream(document);
using var reportStream = new MemoryStream(report);
using var finalStream = new MemoryStream();
using var documentPdf = new GdPicturePDF();
using var reportPdf = new GdPicturePDF();
documentPdf.LoadFromStream(documentStream, true);
var status = documentPdf.GetStat();
if (status != GdPictureStatus.OK)
{
throw new MergeDocumentException($"Document could not be loaded: {status}");
}
reportPdf.LoadFromStream(reportStream, true);
status = reportPdf.GetStat();
if (status != GdPictureStatus.OK)
{
throw new MergeDocumentException($"Report could not be loaded: {status}");
}
var mergedPdf = documentPdf.Merge2Documents(documentPdf, reportPdf);
status = mergedPdf.GetStat();
if (status != GdPictureStatus.OK)
{
throw new MergeDocumentException($"Documents could not be merged: {status}");
}
mergedPdf.ConvertToPDFA(finalStream, _pdfaConformanceLevel, AllowVectorization, AllowRasterization);
status = documentPdf.GetStat();
if (status != GdPictureStatus.OK)
{
throw new MergeDocumentException($"Document could not be converted to PDF/A: {status}");
}
return finalStream.ToArray();
}
}

View File

@@ -1,103 +0,0 @@
using System.Data;
using DigitalData.Core.Abstraction.Application.Repository;
using EnvelopeGenerator.Domain.Constants;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.ServiceHost.Exceptions;
using EnvelopeGenerator.ServiceHost.Extensions;
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
[Obsolete("Instead of ReportModel create and use EnvelopeReport mediator queries")]
public class ReportCreator(ReportModel ReportModel, ILogger<ReportCreator> Logger, IRepository<EnvelopeReport> reportRepo)
{
[Obsolete("Solve the spaghetti...")]
private Envelope? _envelope;
[Obsolete("Instead of ReportModel create and use EnvelopeReport mediator queries and solve this spaghetti...")]
public byte[] CreateReport(Envelope envelope)
{
try
{
Logger.LogDebug("Loading report data..");
var table = ReportModel.List(envelope.Id);
var items = GetReportSource(table);
_envelope = envelope;
if (items.Count == 0)
{
throw new CreateReportException("No report data found!");
}
Logger.LogDebug("Creating report with [{count}] items..", items.Count);
var buffer = DoCreateReport(items);
Logger.LogDebug("Report created!");
return buffer;
}
catch (Exception ex)
{
Logger.LogError(ex);
throw new CreateReportException("Could not prepare report data!", ex);
}
}
private List<ReportItem> GetReportSource(DataTable dataTable)
{
Logger.LogDebug("Preparing report data");
return dataTable.Rows
.Cast<DataRow>()
.Select(ToReportItem)
.OrderByDescending(r => r.ItemDate)
.ToList();
}
private byte[] DoCreateReport(List<ReportItem> reportItems)
{
var items = reportItems.Select(MergeEnvelope).ToList();
var source = new ReportSource { Items = items };
var report = new rptEnvelopeHistory { DataSource = source, DataMember = "Items" };
Logger.LogDebug("Creating report in memory..");
report.CreateDocument();
Logger.LogDebug("Exporting report to stream..");
using var stream = new MemoryStream();
report.ExportToPdf(stream);
Logger.LogDebug("Writing report to buffer..");
return stream.ToArray();
}
[Obsolete("Solve this spaghetti...")]
private ReportItem MergeEnvelope(ReportItem item)
{
if (item.Envelope is null)
{
item.Envelope = _envelope;
}
return item;
}
private ReportItem ToReportItem(DataRow row)
{
try
{
return new ReportItem
{
EnvelopeId = row.ItemEx("ENVELOPE_ID", 0),
EnvelopeTitle = row.ItemEx("HEAD_TITLE", string.Empty),
EnvelopeSubject = row.ItemEx("HEAD_SUBJECT", string.Empty),
ItemDate = row.ItemEx("POS_WHEN", DateTime.MinValue),
ItemStatus = (EnvelopeStatus)row.ItemEx("POS_STATUS", 0),
ItemUserReference = row.ItemEx("POS_WHO", string.Empty)
};
}
catch (Exception ex)
{
Logger.LogError(ex);
throw new CreateReportException("Could not read data from database!", ex);
}
}
}

View File

@@ -1,19 +0,0 @@
using EnvelopeGenerator.Domain.Constants;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
public class ReportItem
{
public Envelope? Envelope { get; set; }
public int EnvelopeId { get; set; }
public string EnvelopeTitle { get; set; } = string.Empty;
public string EnvelopeSubject { get; set; } = string.Empty;
public EnvelopeStatus ItemStatus { get; set; }
public string ItemStatusTranslated => ItemStatus.ToString();
public string ItemUserReference { get; set; } = string.Empty;
public DateTime ItemDate { get; set; }
}

View File

@@ -1,6 +0,0 @@
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
public class ReportSource
{
public List<ReportItem> Items { get; set; } = new();
}

View File

@@ -1,103 +0,0 @@
using DevExpress.XtraReports.UI;
using DevExpress.Drawing;
using System.Drawing;
using System.IO;
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
public class rptEnvelopeHistory : XtraReport
{
public rptEnvelopeHistory()
{
BuildLayout();
}
private void BuildLayout()
{
Bands.AddRange(
[
new TopMarginBand(),
new BottomMarginBand(),
new ReportHeaderBand { HeightF = 40 },
new PageHeaderBand { HeightF = 24 },
new DetailBand { HeightF = 22 }
]);
var reportHeader = (ReportHeaderBand)Bands[nameof(ReportHeaderBand)]!;
var pageHeader = (PageHeaderBand)Bands[nameof(PageHeaderBand)]!;
var detail = (DetailBand)Bands[nameof(DetailBand)]!;
var title = new XRLabel
{
BoundsF = new RectangleF(0, 0, 750, 28),
Font = new DXFont("Segoe UI", 14, DXFontStyle.Bold),
Text = "Envelope History"
};
reportHeader.Controls.Add(title);
var headerTable = CreateTable(isHeader: true);
pageHeader.Controls.Add(headerTable);
var detailTable = CreateTable(isHeader: false);
detail.Controls.Add(detailTable);
Margins = new DXMargins(40, 40, 40, 40);
PaperKind = (DevExpress.Drawing.Printing.DXPaperKind)System.Drawing.Printing.PaperKind.A4;
}
private static XRTable CreateTable(bool isHeader)
{
var table = new XRTable
{
BoundsF = new RectangleF(0, 0, 750, 22),
Borders = DevExpress.XtraPrinting.BorderSide.All
};
var row = new XRTableRow();
if (isHeader)
{
row.Font = new DXFont("Segoe UI", 9, DXFontStyle.Bold);
row.BackColor = Color.Gainsboro;
row.Cells.Add(CreateCell("Date"));
row.Cells.Add(CreateCell("Status"));
row.Cells.Add(CreateCell("User"));
row.Cells.Add(CreateCell("Title"));
row.Cells.Add(CreateCell("Subject"));
}
else
{
row.Font = new DXFont("Segoe UI", 9, DXFontStyle.Regular);
row.Cells.Add(CreateCell("[ItemDate]"));
row.Cells.Add(CreateCell("[ItemStatusTranslated]"));
row.Cells.Add(CreateCell("[ItemUserReference]"));
row.Cells.Add(CreateCell("[EnvelopeTitle]"));
row.Cells.Add(CreateCell("[EnvelopeSubject]"));
}
table.Rows.Add(row);
return table;
}
private static XRTableCell CreateCell(string textOrExpression)
{
return new XRTableCell
{
Text = textOrExpression,
Padding = new DevExpress.XtraPrinting.PaddingInfo(4, 4, 2, 2),
CanGrow = false
};
}
public object? DataSource { get; set; }
public string? DataMember { get; set; }
public void CreateDocument()
{
}
public void ExportToPdf(Stream stream)
{
stream.Write(Array.Empty<byte>(), 0, 0);
}
}

View File

@@ -1,160 +0,0 @@
using DigitalData.Core.Abstraction.Application.Repository;
using DigitalData.Modules.Database;
using EnvelopeGenerator.Application.Common.Dto;
using EnvelopeGenerator.Application.Configuration.Queries;
using EnvelopeGenerator.Application.Envelopes.Queries;
using EnvelopeGenerator.Domain.Constants;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.ServiceHost.Exceptions;
using EnvelopeGenerator.ServiceHost.Extensions;
using EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
using GdPicture.Internal.MSOfficeBinary.translator.Spreadsheet.XlsFileFormat.Records;
using GdPicture14;
using MediatR;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using System.Data;
namespace EnvelopeGenerator.ServiceHost.Jobs;
[Obsolete("ActionService is a placeholder service added by copilot. Migrate the actual logic from CommonServices.Jobs")]
public class FinalizeDocumentJob(IOptions<WorkerOptions> options, ILogger<FinalizeDocumentJob> logger, TempFiles tempFiles, ActionService actionService, PDFBurner pdfBurner, PDFMerger pdfMerger, ReportCreator reportCreator, GdViewer? _gdViewer, LicenseManager licenseManager, IMediator mediator, IRepository<Envelope> envRepo, IRepository<Domain.Entities.DocumentStatus> docStatusRepo)
{
private readonly WorkerOptions _options = options.Value;
private ConfigDto? _config;
private const int CompleteWaitTime = 1;
private string _parentFolderUid = string.Empty;
private sealed class EnvelopeData
{
public int EnvelopeId { get; set; }
public string EnvelopeUuid { get; set; } = string.Empty;
public string DocumentPath { get; set; } = string.Empty;
public List<string> AnnotationData { get; set; } = new();
public byte[]? DocAsByte { get; set; }
}
public bool RethrowOnError { get; set; } = true;
public async Task ExecuteAsync(CancellationToken cancel = default)
{
var gdPictureKey = _options.GdPictureLicenseKey;
tempFiles.Create();
var jobId = typeof(FinalizeDocumentJob).FullName;
_config = await mediator.Send(new ReadDefaultConfigQuery(), cancel);
var envelopes = await envRepo
.Where(e => e.Status == EnvelopeStatus.EnvelopeCompletelySigned
&& e.ChangedWhen.HasValue
&& EF.Functions.DateDiffMinute(e.ChangedWhen.Value, DateTime.Now) >= CompleteWaitTime)
.OrderBy(e => e.Id)
.ToListAsync(cancel);
if (envelopes.Count > 0)
logger.LogInformation("Found [{count}] completed envelopes.", envelopes.Count);
foreach (var envelope in envelopes)
{
try
{
await Finalize(envelope, cancel);
}
catch (Exception ex)
{
logger.LogError(ex, "Unhandled exception while working envelope [{id}]", envelope.Id);
if(RethrowOnError)
throw;
}
logger.LogInformation("Envelope [{id}] finalized!", envelope.Id);
}
}
private async Task Finalize(Envelope envelope, CancellationToken cancel)
{
var annotations = await docStatusRepo.Where(s => s.EnvelopeId == envelope.Id).Select(s => s.Value).ToListAsync(cancel);
var burnedDocument = pdfBurner!.BurnAnnotsToPDF(envelope.DefaultDocument.ByteData!, annotations, envelope.Id)
?? throw new ApplicationException("Document could not be finalized");
actionService.CreateReport(envelope, cancel);
var report = reportCreator!.CreateReport(envelope);
var mergedDocument = pdfMerger!.MergeDocuments(burnedDocument, report);
var outputDirectoryPath = Path.Combine(_config!.ExportPath, _parentFolderUid);
if (!Directory.Exists(outputDirectoryPath))
Directory.CreateDirectory(outputDirectoryPath);
var outputFilePath = Path.Combine(outputDirectoryPath, $"{envelope.Uuid}.pdf");
try
{
File.WriteAllBytes(outputFilePath, mergedDocument);
}
catch (Exception ex)
{
throw new ExportDocumentException("Could not export final document to disk. Envelope Id is " + envelope.Id, ex);
}
var outputFile = await File.ReadAllBytesAsync(outputFilePath, cancel);
await envRepo.UpdateAsync(e => e.DocResult = outputFile, e => e.Id == envelope.Id, cancel);
SendFinalEmails(envelope);
actionService?.FinalizeEnvelope(envelope, cancel);
}
private bool SendFinalEmails(Envelope envelope)
{
var mailToCreator = (FinalEmailType)(envelope.FinalEmailToCreator ?? 0);
var mailToReceivers = (FinalEmailType)(envelope.FinalEmailToReceivers ?? 0);
if (mailToCreator != FinalEmailType.No)
SendFinalEmailToCreator(envelope, mailToCreator);
else
logger?.LogWarning("No SendFinalEmailToCreator - oMailToCreator [{mailToCreator}] <> [{noFinalEmailType}] ", mailToCreator, FinalEmailType.No);
if (mailToReceivers != FinalEmailType.No)
{
SendFinalEmailToReceivers(envelope, mailToReceivers);
}
else
{
logger?.LogWarning("No SendFinalEmailToReceivers - oMailToCreator [{mailToReceivers}] <> [{noFinalEmailType}] ", mailToReceivers, FinalEmailType.No);
}
return true;
}
private bool SendFinalEmailToCreator(Envelope envelope, FinalEmailType mailToCreator)
{
if (actionService?.CompleteEnvelope(envelope) == false)
{
logger?.LogError(new Exception("CompleteEnvelope failed"), "Envelope could not be completed for receiver [{email}]", envelope.User?.Email);
return false;
}
return true;
}
private bool SendFinalEmailToReceivers(Envelope envelope, FinalEmailType mailToReceivers)
{
foreach (var receiver in envelope.EnvelopeReceivers ?? Enumerable.Empty<EnvelopeReceiver>())
{
if (actionService?.CompleteEnvelope(envelope, receiver.Receiver) == false)
{
logger?.LogError(new Exception("CompleteEnvelope failed"), "Envelope could not be completed for receiver [{email}]", receiver.Receiver?.EmailAddress);
return false;
}
}
return true;
}
}

View File

@@ -1,60 +0,0 @@
using System.Data;
using Microsoft.Data.SqlClient;
namespace DigitalData.Modules.Database;
public class MSSQLServer(IConfiguration configuration)
{
private readonly string _connectionString = configuration.GetConnectionString("Default")
?? throw new InvalidOperationException("Connection string 'Default' not found.");
public static string DecryptConnectionString(string connectionString) => connectionString;
public SqlConnection GetConnection
{
get
{
var connection = new SqlConnection(_connectionString);
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
return connection;
}
}
public DataTable GetDatatable(string sql)
{
using var connection = new SqlConnection(_connectionString);
using var command = new SqlCommand(sql, connection);
using var adapter = new SqlDataAdapter(command);
var table = new DataTable();
adapter.Fill(table);
return table;
}
public object? GetScalarValue(string sql)
{
using var connection = new SqlConnection(_connectionString);
using var command = new SqlCommand(sql, connection);
connection.Open();
return command.ExecuteScalar();
}
public bool ExecuteNonQuery(string sql)
{
using var connection = new SqlConnection(_connectionString);
using var command = new SqlCommand(sql, connection);
connection.Open();
return command.ExecuteNonQuery() > 0;
}
public bool ExecuteNonQuery(SqlCommand command)
{
using var connection = new SqlConnection(_connectionString);
command.Connection = connection;
connection.Open();
return command.ExecuteNonQuery() > 0;
}
}

View File

@@ -1,15 +0,0 @@
using DigitalData.Modules.Database;
using System.Data;
namespace EnvelopeGenerator.ServiceHost.Jobs;
[Obsolete("Create and use EnvelopeReport mediator queries")]
public class ReportModel(MSSQLServer Database)
{
[Obsolete("Create and use EnvelopeReport mediator queries")]
public DataTable List(int envelopeId)
{
var sql = $"SELECT * FROM VWSIG_ENVELOPE_REPORT WHERE ENVELOPE_ID = {envelopeId}";
return Database.GetDatatable(sql);
}
}

View File

@@ -1,84 +0,0 @@
using EnvelopeGenerator.ServiceHost.Extensions;
namespace EnvelopeGenerator.ServiceHost.Jobs;
[Obsolete("Use memory cache instead of temp files.")]
public class TempFiles
{
[Obsolete("Use memory cache instead of temp files.")]
public string TempPath { get; }
private readonly ILogger<TempFiles> _logger;
[Obsolete("Use memory cache instead of temp files.")]
public TempFiles(ILogger<TempFiles> logger)
{
_logger = logger;
var tempDirectoryPath = Path.GetTempPath();
TempPath = Path.Combine(tempDirectoryPath, "EnvelopeGenerator");
}
[Obsolete("Use memory cache instead of temp files.")]
public bool Create()
{
try
{
if (!Directory.Exists(TempPath))
{
Directory.CreateDirectory(TempPath);
}
else
{
CleanUpFiles();
}
return true;
}
catch (Exception ex)
{
_logger.LogError(ex);
return false;
}
}
[Obsolete("Use memory cache instead of temp files.")]
private bool CleanUpFiles()
{
try
{
foreach (var fileItem in Directory.GetFiles(TempPath))
{
_logger.LogDebug("Deleting tempPath-file: {fileItem} ...", fileItem);
File.Delete(fileItem);
}
return true;
}
catch (Exception ex)
{
_logger.LogError(ex);
return false;
}
}
[Obsolete("Use memory cache instead of temp files.")]
public bool CleanUp()
{
try
{
_logger.LogDebug("Deleting tempPath-Data: {TempPath} ...", TempPath);
Directory.Delete(TempPath, true);
return true;
}
catch (Exception ex)
{
_logger.LogError(ex);
return false;
}
}
}

View File

@@ -1,29 +0,0 @@
using EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
using System.Drawing;
namespace EnvelopeGenerator.ServiceHost.Jobs;
public class WorkerOptions
{
public string GdPictureLicenseKey { get; set; } = null!;
[Obsolete("Use ILogger.")]
public bool Debug { get; set; }
public PDFBurnerOptions PdfBurner { get; set; } = new();
public record PDFBurnerOptions
{
public List<string> IgnoredLabels { get; set; } = ["Date", "Datum", "ZIP", "PLZ", "Place", "Ort", "Position", "Stellung"];
public double TopMargin { get; set; } = 0.1;
public double YOffset { get; set; } = -0.3;
public string FontName { get; set; } = "Arial";
public int FontSize { get; set; } = 8;
public FontStyle FontStyle { get; set; } = FontStyle.Italic;
}
}

View File

@@ -1,31 +0,0 @@
using EnvelopeGenerator.ServiceHost;
using EnvelopeGenerator.ServiceHost.Extensions;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddFinalizeDocumentJob(builder.Configuration);
builder.Services.AddHostedService<Worker>();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

View File

@@ -1,41 +0,0 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:27420",
"sslPort": 44372
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5088",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7234;http://localhost:5088",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -1,31 +0,0 @@
using EnvelopeGenerator.ServiceHost.Jobs;
namespace EnvelopeGenerator.ServiceHost;
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly int _delayMilliseconds;
private readonly FinalizeDocumentJob _finalizeDocumentJob;
public Worker(ILogger<Worker> logger, IConfiguration configuration, FinalizeDocumentJob finalizeDocumentJob)
{
_logger = logger;
_delayMilliseconds = Math.Max(1, configuration.GetValue("Worker:DelayMilliseconds", 1000));
_finalizeDocumentJob = finalizeDocumentJob;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
if (_logger.IsEnabled(LogLevel.Information))
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
}
await _finalizeDocumentJob.ExecuteAsync(stoppingToken);
await Task.Delay(_delayMilliseconds, stoppingToken);
}
}
}

View File

@@ -1,8 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -1,12 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Worker": {
"DelayMilliseconds": 1000
},
"AllowedHosts": "*"
}

View File

@@ -0,0 +1,17 @@
using EnvelopeGenerator.Domain.Constants;
using NUnit.Framework;
namespace EnvelopeGenerator.Tests.Domain;
public class ConstantsTests
{
[TestCase(EnvelopeSigningType.ReadAndSign, EnvelopeSigningType.ReadAndSign)]
[TestCase(EnvelopeSigningType.WetSignature, EnvelopeSigningType.WetSignature)]
[TestCase((EnvelopeSigningType)5, EnvelopeSigningType.WetSignature)]
public void Normalize_ReturnsExpectedValue(EnvelopeSigningType input, EnvelopeSigningType expected)
{
var normalized = input.Normalize();
Assert.That(normalized, Is.EqualTo(expected));
}
}

View File

@@ -53,8 +53,4 @@
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="Domain\" />
</ItemGroup>
</Project>

View File

@@ -35,8 +35,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvelopeGenerator.Tests", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvelopeGenerator.API", "EnvelopeGenerator.API\EnvelopeGenerator.API.csproj", "{EC768913-6270-14F4-1DD3-69C87A659462}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvelopeGenerator.ServiceHost", "EnvelopeGenerator.ServiceHost\EnvelopeGenerator.ServiceHost.csproj", "{5DD82482-E560-405F-BF55-04D647B05BEF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -87,10 +85,6 @@ Global
{EC768913-6270-14F4-1DD3-69C87A659462}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EC768913-6270-14F4-1DD3-69C87A659462}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EC768913-6270-14F4-1DD3-69C87A659462}.Release|Any CPU.Build.0 = Release|Any CPU
{5DD82482-E560-405F-BF55-04D647B05BEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5DD82482-E560-405F-BF55-04D647B05BEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5DD82482-E560-405F-BF55-04D647B05BEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5DD82482-E560-405F-BF55-04D647B05BEF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -110,7 +104,6 @@ Global
{211619F5-AE25-4BA5-A552-BACAFE0632D3} = {9943209E-1744-4944-B1BA-4F87FC1A0EEB}
{224C4845-1CDE-22B7-F3A9-1FF9297F70E8} = {0CBC2432-A561-4440-89BC-671B66A24146}
{EC768913-6270-14F4-1DD3-69C87A659462} = {E3C758DC-914D-4B7E-8457-0813F1FDB0CB}
{5DD82482-E560-405F-BF55-04D647B05BEF} = {E3C758DC-914D-4B7E-8457-0813F1FDB0CB}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {73E60370-756D-45AD-A19A-C40A02DACCC7}