diff --git a/EnvelopeGenerator.Application/Envelopes/Commands/CreateEnvelopeCommand.cs b/EnvelopeGenerator.Application/Envelopes/Commands/CreateEnvelopeCommand.cs index 358fbe1c..dfaf7917 100644 --- a/EnvelopeGenerator.Application/Envelopes/Commands/CreateEnvelopeCommand.cs +++ b/EnvelopeGenerator.Application/Envelopes/Commands/CreateEnvelopeCommand.cs @@ -12,8 +12,66 @@ namespace EnvelopeGenerator.Application.Envelopes.Commands; /// public record CreateEnvelopeCommand : IRequest { + /// + /// Optionale Umschlag-ID fuer Aktualisierungsvorgaenge. + /// public int? EnvelopeId { get; init; } + /// + /// Kennung des ausgewaehlten Umschlagtyps (Vorlage). + /// + public int? EnvelopeTypeId { get; set; } + + /// + /// Sprachcode fuer Umschlaginhalt und Benachrichtigungen. + /// + public string? Language { get; set; } + + /// + /// Gibt an, ob der Zugriffscode fuer Empfaenger aktiviert ist. + /// + public bool? UseAccessCode { get; set; } + + /// + /// Zertifizierungstyp fuer den Signaturprozess. + /// + public int? CertificationType { get; set; } + + /// + /// Finale E-Mail-Einstellung fuer den Ersteller. + /// + public int? FinalEmailToCreator { get; set; } + + /// + /// Finale E-Mail-Einstellung fuer die Empfaenger. + /// + public int? FinalEmailToReceivers { get; set; } + + /// + /// Gibt an, ob Erinnerungs-E-Mails aktiviert sind. + /// + public bool? SendReminderEmails { get; set; } + + /// + /// Anzahl der Tage bis zur ersten Erinnerung. + /// + public int? FirstReminderDays { get; set; } + + /// + /// Intervall in Tagen zwischen Erinnerungs-E-Mails. + /// + public int? ReminderIntervalDays { get; set; } + + /// + /// Anzahl der Tage bis zum Ablauf des Umschlags. + /// + public int? ExpiresWhenDays { get; set; } + + /// + /// Anzahl der Tage vor Ablauf, ab denen gewarnt wird. + /// + public int? ExpiresWarningWhenDays { get; set; } + /// /// Der Titel des Umschlags. Dies ist ein Pflichtfeld. /// @@ -29,10 +87,19 @@ public record CreateEnvelopeCommand : IRequest /// public bool TFAEnabled { get; set; } = false; + /// + /// Gibt an, ob der Umschlag nach dem Speichern sofort versendet werden soll. + /// public bool Send { get; init; } + /// + /// Optionaler PDF-Dokumentinhalt als Base64. + /// public CreateEnvelopeDocumentDto? Document { get; init; } + /// + /// Empfaengerliste inklusive optionaler Signaturfeld-Koordinaten. + /// public List Receivers { get; init; } = new(); /// diff --git a/EnvelopeGenerator.Application/Envelopes/Commands/CreateEnvelopeCommandHandler.cs b/EnvelopeGenerator.Application/Envelopes/Commands/CreateEnvelopeCommandHandler.cs index 6b2724d8..5b987941 100644 --- a/EnvelopeGenerator.Application/Envelopes/Commands/CreateEnvelopeCommandHandler.cs +++ b/EnvelopeGenerator.Application/Envelopes/Commands/CreateEnvelopeCommandHandler.cs @@ -33,6 +33,8 @@ public class CreateEnvelopeCommandHandler : IRequestHandler EnvelopeReceiverRepository => _provider.GetRequiredService>(); + private IRepository EnvelopeTypeRepository => _provider.GetRequiredService>(); + private IRepository ReceiverRepository => _provider.GetRequiredService>(); private IRepository DocReceiverElementRepository => _provider.GetRequiredService>(); @@ -73,6 +75,7 @@ public class CreateEnvelopeCommandHandler : IRequestHandler { e.Title = title; e.Message = message; e.TfaEnabled = request.TFAEnabled; + e.EnvelopeTypeId = settings.EnvelopeTypeId; + e.Language = settings.Language; + e.UseAccessCode = settings.UseAccessCode; + e.CertificationType = settings.CertificationType; + e.FinalEmailToCreator = settings.FinalEmailToCreator; + e.FinalEmailToReceivers = settings.FinalEmailToReceivers; + e.SendReminderEmails = settings.SendReminderEmails; + e.FirstReminderDays = settings.FirstReminderDays; + e.ReminderIntervalDays = settings.ReminderIntervalDays; + e.ExpiresWhenDays = settings.ExpiresWhenDays; + e.ExpiresWarningWhenDays = settings.ExpiresWarningWhenDays; + e.ContractType = settings.ContractType; + e.ExpiresWhen = settings.ExpiresWhen; + e.ExpiresWarningWhen = settings.ExpiresWarningWhen; e.Status = EnvelopeStatus.EnvelopeSaved; e.ChangedWhen = now; }, e => e.Id == envelopeId, cancel); @@ -97,6 +116,20 @@ public class CreateEnvelopeCommandHandler : IRequestHandler + { + e.EnvelopeTypeId = settings.EnvelopeTypeId; + e.Language = settings.Language; + e.UseAccessCode = settings.UseAccessCode; + e.CertificationType = settings.CertificationType; + e.FinalEmailToCreator = settings.FinalEmailToCreator; + e.FinalEmailToReceivers = settings.FinalEmailToReceivers; + e.SendReminderEmails = settings.SendReminderEmails; + e.FirstReminderDays = settings.FirstReminderDays; + e.ReminderIntervalDays = settings.ReminderIntervalDays; + e.ExpiresWhenDays = settings.ExpiresWhenDays; + e.ExpiresWarningWhenDays = settings.ExpiresWarningWhenDays; + e.ExpiresWhen = settings.ExpiresWhen; + e.ExpiresWarningWhen = settings.ExpiresWarningWhen; + e.ContractType = settings.ContractType; + e.ChangedWhen = now; + }, e => e.Id == envelope.Id, cancel); + + envelope.EnvelopeTypeId = settings.EnvelopeTypeId; + envelope.Language = settings.Language; + envelope.UseAccessCode = settings.UseAccessCode; + envelope.CertificationType = settings.CertificationType; + envelope.FinalEmailToCreator = settings.FinalEmailToCreator; + envelope.FinalEmailToReceivers = settings.FinalEmailToReceivers; + envelope.SendReminderEmails = settings.SendReminderEmails; + envelope.FirstReminderDays = settings.FirstReminderDays; + envelope.ReminderIntervalDays = settings.ReminderIntervalDays; + envelope.ExpiresWhenDays = settings.ExpiresWhenDays; + envelope.ExpiresWarningWhenDays = settings.ExpiresWarningWhenDays; + envelope.ExpiresWhen = settings.ExpiresWhen; + envelope.ExpiresWarningWhen = settings.ExpiresWarningWhen; + envelope.ContractType = settings.ContractType; + envelope.ChangedWhen = now; + } + await Mediator.Send(new CreateHistoryCommand { EnvelopeId = envelope.Id, @@ -143,6 +225,105 @@ public class CreateEnvelopeCommandHandler : IRequestHandler(envelope); } + private async Task ResolveEnvelopeSettingsAsync(CreateEnvelopeCommand request, Envelope? existing, CancellationToken cancel) + { + EnvelopeType? selectedType = null; + if (request.EnvelopeTypeId is int envelopeTypeId && envelopeTypeId > 0) + { + selectedType = await EnvelopeTypeRepository.Query + .FirstOrDefaultAsync(t => t.Id == envelopeTypeId, cancel) + ?? throw new BadRequestException($"Envelope type {envelopeTypeId} not found."); + } + + var expiresWhenDays = Math.Max(0, + request.ExpiresWhenDays + ?? selectedType?.ExpiresWhenDays + ?? existing?.ExpiresWhenDays + ?? 0); + + var expiresWarningWhenDays = Math.Max(0, + request.ExpiresWarningWhenDays + ?? selectedType?.ExpiresWarningWhenDays + ?? existing?.ExpiresWarningWhenDays + ?? 0); + + var useAccessCode = request.UseAccessCode + ?? selectedType?.UseAccessCode + ?? existing?.UseAccessCode + ?? false; + + if (request.TFAEnabled) + useAccessCode = true; + + return new EnvelopeSettings( + EnvelopeTypeId: request.EnvelopeTypeId ?? existing?.EnvelopeTypeId, + Language: ResolveLanguage(request.Language, selectedType?.Language, existing?.Language), + UseAccessCode: useAccessCode, + CertificationType: request.CertificationType + ?? (int?)selectedType?.CertificationType + ?? existing?.CertificationType + ?? (int)CertificationType.AdvancedElectronicSignature, + FinalEmailToCreator: request.FinalEmailToCreator + ?? (int?)selectedType?.FinalEmailToCreator + ?? existing?.FinalEmailToCreator + ?? (int)FinalEmailType.No, + FinalEmailToReceivers: request.FinalEmailToReceivers + ?? (int?)selectedType?.FinalEmailToReceivers + ?? existing?.FinalEmailToReceivers + ?? (int)FinalEmailType.No, + SendReminderEmails: request.SendReminderEmails + ?? selectedType?.SendReminderEmails + ?? existing?.SendReminderEmails + ?? false, + FirstReminderDays: Math.Max(0, + request.FirstReminderDays + ?? selectedType?.FirstReminderDays + ?? existing?.FirstReminderDays + ?? 0), + ReminderIntervalDays: Math.Max(0, + request.ReminderIntervalDays + ?? selectedType?.ReminderIntervalDays + ?? existing?.ReminderIntervalDays + ?? 0), + ExpiresWhenDays: expiresWhenDays, + ExpiresWarningWhenDays: expiresWarningWhenDays, + ExpiresWhen: expiresWhenDays > 0 ? DateTime.Now.AddDays(expiresWhenDays) : null, + ExpiresWarningWhen: expiresWarningWhenDays > 0 ? DateTime.Now.AddDays(expiresWarningWhenDays) : null, + ContractType: existing?.ContractType + ?? selectedType?.ContractType + ?? (int)ContractType.Contract); + } + + private static string ResolveLanguage(string? preferred, string? fallback1, string? fallback2) + { + if (!string.IsNullOrWhiteSpace(preferred)) + return preferred.Trim(); + + if (!string.IsNullOrWhiteSpace(fallback1)) + return fallback1.Trim(); + + if (!string.IsNullOrWhiteSpace(fallback2)) + return fallback2.Trim(); + + return "de-DE"; + } + + private sealed record EnvelopeSettings( + int? EnvelopeTypeId, + string Language, + bool UseAccessCode, + int CertificationType, + int FinalEmailToCreator, + int FinalEmailToReceivers, + bool SendReminderEmails, + int FirstReminderDays, + int ReminderIntervalDays, + int ExpiresWhenDays, + int ExpiresWarningWhenDays, + DateTime? ExpiresWhen, + DateTime? ExpiresWarningWhen, + int ContractType); + private async Task ResolveSenderReferenceAsync(Envelope envelope, CancellationToken cancel) { if (!string.IsNullOrWhiteSpace(envelope.User?.Email))