using EnvelopeGenerator.Application.Common.Dto;
using EnvelopeGenerator.Application.Common.Interfaces.SQLExecutor;
using MediatR;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.Envelopes.Commands;
///
/// Befehl zur Erstellung eines Umschlags.
///
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.
///
public string? Title { get; set; }
///
/// Die Nachricht, die im Umschlag enthalten sein soll. Dies ist ein Pflichtfeld.
///
public string? Message { get; set; }
///
/// Gibt an, ob die Zwei-Faktor-Authentifizierung für den Umschlag aktiviert ist. Standardmäßig false.
///
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();
///
/// ID des Absenders
///
internal int UserId { get; private set; }
///
///
///
///
///
public CreateEnvelopeCommand WithAuth(int userId)
{
UserId = userId;
return this;
}
///
/// Determines which component is used for envelope processing.
/// When true, processing is delegated to ;
/// when false, is used instead.
/// Note: should only be used in testing scenarios.
///
[JsonIgnore]
[NotMapped]
public bool UseSQLExecutor { get; set; } = true;
}
public record CreateEnvelopeDocumentDto(string DataAsBase64);
public record CreateEnvelopeFieldDto(double X, double Y, int Page);
public record CreateEnvelopeReceiverDto(
string EmailAddress,
string? Name,
string? PhoneNumber,
List Fields);