Compare commits

...

674 Commits

Author SHA1 Message Date
Developer 02
3688373481 fix(_Layout): sanitzer entfernt, um Json-Deserilisationsfehler zu vermeiden. 2025-02-11 13:43:01 +01:00
Developer 02
b8fbeee322 fix(HomeController): Zugehörige Datenbindungen hinzugefügt 2025-02-10 17:17:11 +01:00
Developer 02
57e4dfb3fb feat(EnvelopeLocked): Link zum Senden von E-Mails zu LockedFooterBodyAccess hinzugefügt.
- Gebunden mit Modell.
2025-02-10 16:58:57 +01:00
Developer 02
afc8d3baf0 chore: Upgegradet auf 2.10.4
- Resx-Felder aktualisiert.
2025-02-10 15:23:51 +01:00
Developer 02
51d77367ca fix(DIExtensions): aktualisiert, um den richtigen Abschnittsnamen einzugeben.
- ConfigureByTypeName entfernt
2025-02-10 15:05:46 +01:00
Developer 02
614f3768d9 chore(EnvelopeGenerator): Hochgestuft auf 2.10.3 2025-02-10 13:08:57 +01:00
Developer 02
5f780f8d1e fix(EnvelopeSmsHandler): Korrekte Ablaufprüfung und Cache-Aktualisierung in SendTotpAsync
- Die Bedingung für die Überprüfung des Ablaufs wurde korrigiert, so dass sie korrekt null zurückgibt, wenn der gespeicherte Ablauf in der Zukunft liegt.
- Fehlende Cache-Aktualisierung zur Speicherung des neuen Verfallsdatums nach dem Versand der TOTP-SMS hinzugefügt.
2025-02-10 11:48:36 +01:00
Developer 02
20825aa3ea feat(HomeController): Rollenprüfung für 2FA hinzugefügt
- wenn der Benutzer keine PreAuth Rolle hat, wird Status401Unauthorized zurückgegeben
2025-02-10 11:18:54 +01:00
Developer 02
c5b508d274 chore(EnvelopeGenerator): Hochgestuft auf 2.10.2 2025-02-07 14:49:39 +01:00
Developer 02
4eec4451b2 feat(TFARegController): Authentifizierungsbedingung zum Registrierungsendpunkt hinzugefügt 2025-02-07 13:31:54 +01:00
Developer 02
ca4718e159 feat(ControllerBaseExtensions): Erstellte Erweiterungsmethode zum Login über HttpContext mit Umschlag Empfänger und Rolle.
- Implementiert in HomeController
2025-02-07 13:12:27 +01:00
Developer 02
33fcb5b70e refactor(Controllers): FullyAuth-Rollenbedingung für jedes bestehende Auth-Attribut hinzugefügt, um die Autorisierung in Stufen aufzuteilen. 2025-02-07 10:53:17 +01:00
Developer 02
82d8521a25 feat(Constants): Erstellen von Konstanten für die Empfängerrolle, um die Authentifizierungsschritte des Empfängers zu trennen 2025-02-07 09:47:32 +01:00
Developer 02
2f9d07312b chore(Web): Hochgestuft auf 2.10.0 2025-02-06 19:41:47 +01:00
Developer 02
fa36593b26 refactor(Receiver): Entfernt TotpExpiration aus allen DTOs und Entitäten. 2025-02-06 19:41:11 +01:00
Developer 02
9cdb1409c0 feat(TFARegController): Try-Catch zur Methode reg'e hinzugefügt.
- Ausnahme ist so eingestellt, dass sie protokolliert wird.
2025-02-06 19:31:50 +01:00
Developer 02
95785e8c8b chore(Web): Hochgestuft auf 2.10.0 2025-02-06 18:40:37 +01:00
Developer 02
6d6e62c8d0 feat(EnvelopeLocked): Unterstützung für TFA-Registrierungsfrist auf der gesperrten Seite hinzufügen
- Einführung der TFA-Registrierungsfrist, um einen Link zur Einrichtung der Authenticator-App innerhalb eines gültigen Zeitfensters anzuzeigen.
- Aktualisierung der Ansicht, um die Registrierungsfrist anzuzeigen, falls zutreffend, und den Benutzer zur Einrichtung von TFA zu leiten.
2025-02-06 18:39:32 +01:00
Developer 02
1720e137f9 feat(Reg.cshtml): Zeitüberschreitung hinzugefügt.
- TFARegController.Reg aktualisiert, um die Seite _Expired view zu senden, wenn receiver.TfaRegDeadline abläuft.
 - TFARegParams Klasse für TimeLimit Configuration erstellt und mit appsettings konfiguriert.
2025-02-06 17:59:19 +01:00
Developer 02
3e6e2078bb feat(auth): Unterstützung für Authenticator-App-Setup-Link hinzugefügt
- Es wurde ein neuer Abschnitt eingeführt, der einen Link für Benutzer anzeigt, um ihre Authenticator-App einzurichten, wenn viaAuthenticator aktiviert ist.
 - Abruf von envelopeKey aus ViewData hinzugefügt, um den Einrichtungslink zu erstellen.
 - Refactored codeKeyName Initialisierung für saubereren Code.
2025-02-06 15:49:05 +01:00
Developer 02
6b0ec9386c chore: Bootstrap-icons-Bibliothek hinzufügen 2025-02-06 11:55:15 +01:00
Developer 02
ee49538f1e feat(Receiver): EnvelopeReceiver-Eigenschaft zu Entität, ReadDto und Updated Dto hinzugefügt. 2025-02-05 17:17:44 +01:00
Developer 02
311009bc97 feat(Reg): CSS zu .tfaQrCode hinzugefügt 2025-02-05 16:48:11 +01:00
Developer 02
f5028a82fa feat(Reg View): TFA-Registrierungsschritt erstellt 2025-02-05 16:12:42 +01:00
Developer 02
07d70dbd22 feat(TFARegController): QR-Code zu RegView hinzugefügt. 2025-02-05 13:42:55 +01:00
Developer 02
152050ebf4 feat(ViewControllerBase): Erstellt, um allgemeine Eigenschaften von ViewControllern zu behandeln.
- Implementiert in TFARegController.
 - Implementiert in HomeController.
2025-02-05 12:58:30 +01:00
Developer 02
e27daa4b90 feat(TFARegController): Initialisiert den MVC-Controller und den View zur Bearbeitung der TFA-Registrierung. 2025-02-05 11:32:34 +01:00
Developer 02
808a02968b refactor(CodeGenerator): umbenannt in Authenticator 2025-02-03 09:58:57 +01:00
Developer 02
bbd03615e1 feat(EnvelopeSmsHandler): Methode VerifyTotp hinzugefügt, um Totp mit TotpVerificationWindow von TotpSmsParams zu verifizieren. 2025-02-03 09:52:46 +01:00
Developer 02
772d510705 feat(EnvelopeSmsService): SendTotpAsync-Methode hinzufügen, um totp unter Berücksichtigung der Ablaufzeit zu senden. 2025-01-31 14:59:39 +01:00
Developer 02
aa918d875d refactor(JWT): Ungenutzte Schnittstelle und Controller entfernt 2025-01-31 13:10:55 +01:00
Developer 02
28fdf0a115 renamed(SmsParams): umbenannt in GtxMessagingParams 2025-01-31 13:06:11 +01:00
Developer 02
120c8623dd refactor(Application.Configurations): Config-Suffix in Params umbenannt. 2025-01-31 12:51:44 +01:00
Developer 02
363329ca18 refaktor: Vereinfachung der DI-Konfiguration und Verbesserung der Wiederverwendbarkeit
- Entfernte redundante `AddEnvelopeGenerator`-Überladung.
- Einführung der Erweiterungsmethode `ConfigureByTypeName<TOptions>` für eine sauberere Konfiguration.
- Ersetzte explizite Konfigurationsaufrufe durch `ConfigureByTypeName<TOptions>`.
- Verbesserte Wartbarkeit durch Reduzierung von redundantem Code.
- Markierte `ConfigureByTypeName<TOptions>` zur zukünftigen Verlagerung nach `DigitalData.Core`.
2025-01-31 11:54:49 +01:00
Developer 02
eb0c6dabf4 Revert "refactor(EnvelopeSmsService): Initialisiert mit Schnittstelle, DI-Injektion und Konfigurationen."
This reverts commit cd88af6807.
2025-01-31 11:20:43 +01:00
Developer 02
cd88af6807 refactor(EnvelopeSmsService): Initialisiert mit Schnittstelle, DI-Injektion und Konfigurationen. 2025-01-31 11:20:24 +01:00
Developer 02
1941de1928 refactor(EnvelopeSmsService): Initialisiert mit Schnittstelle, DI-Injektion und Konfigurationen. 2025-01-31 11:15:53 +01:00
Developer 02
22347a0202 refactor(MessagingService): umbenannt in SmsSender 2025-01-31 10:37:59 +01:00
Developer 02
e54d9d2da8 feat(TotpSmsParams): Erstellt, um die Konfiguration von Totp zu handhaben 2025-01-31 10:22:37 +01:00
Developer 02
06b1aa9560 refactor(appsetings): Unnötige Konfigurations-Parameter entfernt. 2025-01-30 16:43:14 +01:00
Developer 02
4f35fe54be fix(HomeController): Berechnungsmethode new_expiration aktualisiert, um AddSeconds zu verwenden 2025-01-30 16:37:01 +01:00
Developer 02
84e3e4e18d refactor(HomeController): renamed authentication methods with Handle prefix for clarity 2025-01-30 16:27:09 +01:00
Developer 02
7f26bb4766 refactor(HomeController): Aufteilung in Sub-TFAView-Methoden, um die Lesbarkeit zu verbessern. 2025-01-30 16:12:42 +01:00
Developer 02
f674be5200 chore: Projekt wurde auf 2.9.0 aktualisiert 2025-01-28 10:21:47 +01:00
Developer 02
0718f24339 feat(HomeController): TFAView wurde als separate Methode geschrieben, um Verwirrung zu vermeiden 2025-01-27 17:12:19 +01:00
Developer 02
6abc17c3bf feat(HomeController): Aktualisiert, um SMS über zu senden.
- Unnötige Parameter in SmsParams entfernt.
 - Code-Sendefunktion von IMessagingService entfernt.
 - GetTotpExpirationTime Methode im CodeGenerator entfernt.
2025-01-27 17:09:23 +01:00
Developer 02
cf300d3ade Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-01-27 16:50:44 +01:00
Developer 02
be44f9f436 refactor(HomeController): Statische Eigenschaften SmsTotpStep und SmsFormat hinzugefügt. 2025-01-27 15:01:34 +01:00
Developer 02
80f9107e4e feat(cache): Unterstützung für GetOrSetAsync mit DateTime-Typ hinzugefügt
- GetOrSetAsync für DateTime mit synchronen und asynchronen Fabrikmethoden implementiert.
- Bestehende GetOrSetAsync-Methoden für Zeichenfolgen und asynchrone Zeichenfolgen refaktoriert, um Klarheit und Struktur zu verbessern.
- Code mit Regionen organisiert, um ähnliche Methoden für bessere Lesbarkeit zu gruppieren.
- TODO für weitere Verbesserungen bei der Codegenerierung für GetOrSetAsync-Methoden hinzugefügt.
2025-01-27 14:50:23 +01:00
Developer 02
c6e9ecfbca refactor(cache): Unterstützung für CancellationToken in IDistributedCache-Erweiterungsmethoden hinzufügen
- Aktualisierte `SetLongAsync`, `GetLongAsync`, `SetDateTimeAsync`, `GetDateTimeAsync`, `SetTimeSpanAsync` und `GetTimeSpanAsync`, um optionale `CancellationToken`-Parameter zu unterstützen.
- Modifizierte `GetOrSetAsync`, um zwischen synchronen und asynchronen Fabrikfunktionen zu unterscheiden.
- Sicherstellung einer konsistenten Handhabung von `CancellationToken` in allen Cache-bezogenen Operationen.
2025-01-27 14:23:06 +01:00
Developer 02
af5d7c289d refactor(HomeController): LogInEnvelope aktualisiert, um SMS-Code als TOTP zu verifizieren 2025-01-27 13:47:26 +01:00
Developer 02
3267acbeb3 feat(CodeGenerator): GenerateTotp und VerifyTotp Methoden hinzugefügt. 2025-01-25 00:35:19 +01:00
Developer 02
95efe58e1b chore(Web): Hochgestuft auf 2.8.2 2025-01-24 20:42:01 +01:00
Developer 02
867756242e refactor(EnvelopeReceiver): TFAEnabled wurde in die Envelope-Tabelle für Entität und DTO verschoben.
- Aktualisierte zugehörige Felder in HomeController.
2025-01-24 18:13:29 +01:00
Developer 02
713c2f3ed2 refactor(GTXMessagingResponse): In die Anwendungsschicht verschoben. 2025-01-24 17:11:38 +01:00
Developer01
5a0e258b35 Ms Auswertungen, Dokument anzeigen, Drag and Drop 2025-01-24 14:34:28 +01:00
Developer01
651095976a Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-01-03 10:25:22 +01:00
Developer01
fcbee75b9b MS Common 2.1 - Enum VerificationType 2025-01-03 10:25:06 +01:00
Developer 02
dcb25ffc4c chore(Web): auf Projekt 2.8.1 hochgerüstet 2024-12-12 18:49:20 +01:00
Developer 02
618e295634 fix(EnvelopeLocked): falschen Buchstaben aus html entfernen 2024-12-12 18:48:14 +01:00
Developer 02
8a2fa2035a chore : alle Projekte als Debugger konfiguriert. 2024-12-12 18:47:27 +01:00
Developer 02
60109e4deb refactor(annotation.js): Standortzuweisung für mobile Geräte entfernt. 2024-12-12 18:21:28 +01:00
Developer 02
ed6a00dfdf refactor(util): Verschieben von Methoden über Standort nach util.location.js. 2024-12-12 17:11:45 +01:00
Developer 02
c693495928 chore(Web): hochgestuft auf 2.8 2024-12-11 20:09:34 +01:00
Developer 02
241991721d feat(DTOExtension): Erweiterungsmethode hinzugefügt, um totp direkt über Receiver zu prüfen 2024-12-11 18:42:23 +01:00
Developer 02
c41d5c4a76 feat(HomeController): Funktion zur Überprüfung des Authenticator-Codes hinzugefügt. 2024-12-11 18:32:35 +01:00
Developer 02
27db664b4d feat(StringExtension): Erstellen, um erforderliche String-Erweiterungsmethoden hinzuzufügen.
- IsValidTotp Erweiterung hinzugefügt, um die totp zu überprüfen.
2024-12-11 18:22:45 +01:00
Developer 02
ba2518cdd2 refactor(EnvelopeLocked): QRCodeExpiration hinzugefügt 2024-12-11 18:06:36 +01:00
Developer 02
72a0cb78c7 refactor(EnvelopeLocked): Umbenennung von Expiration in SmsExpiration.
- HomeController aktualisiert.
2024-12-11 18:00:48 +01:00
Developer 02
e82d7552c2 refactor(EnvelopeLocked): Formatierbare Schlüsselnamen hinzugefügt. 2024-12-11 17:58:46 +01:00
Developer 02
4b50b6c35d refactor(Resource.resx): Schlüssel-Werte für Authenticators hinzugefügt 2024-12-11 17:32:17 +01:00
Developer 02
103d8da6b2 refactor(Resource.resx): Aktualisierte Schlüsselnamen für Schlüsselformate 2024-12-11 16:54:02 +01:00
Developer 02
15f3bd1bbd refactor(WebKey.Formate): Aktualisiert, um in der resx-Datei in alphabetischer Reihenfolge gruppieren zu können. 2024-12-11 16:39:01 +01:00
Developer 02
10a5adeeee fix: LocakedOpen entfernt. 2024-12-11 16:29:20 +01:00
Developer 02
3b5c6086a9 feat(WebKey): Statische Klasse Formats zur Aufnahme von Schlüsselformaten hinzugefügt.
- Erweiterungsmethoden für die Formatierung von Tastenformaten hinzugefügt.
2024-12-11 16:21:31 +01:00
Developer 02
abda0d14e8 fix: Behebung der falschen Variablenbenennung bei der Zuweisung von codeType 2024-12-11 15:41:31 +01:00
Developer 02
569ebc87cc refactor(site.css): aktualisiert, um den Klassennamen tfa hinzuzufügen, um alle TFA-Seiten zu verwenden.
- Umbenennung des Klassennamens sms-tfa in tfa.
2024-12-11 15:32:21 +01:00
Developer 02
6b6c8e407c refactor(EnvelopeLocked): Umbenennung von AccessCodeName in CodeType.
- HomeController aktualisiert.
2024-12-11 15:22:33 +01:00
Developer 02
556d02870e refactor(CodeGeneratorParams): DefaultTotpSecretKeyLength auf 20 setzen. 2024-12-11 14:56:30 +01:00
Developer 02
c6fc665002 refactor(EnvelopeMailService): Hinzufügen von [TFA_EXPIRATION] über optionale Platzhalter in der Methode SendTFAQrCodeAsync. 2024-12-11 14:45:36 +01:00
Developer 02
030fd0e45b refactor(HomeController): Aktualisierung zur Verwendung der SendTFAQrCodeAsync-Methode anstelle von SendAsync durch den Maildienst. 2024-12-11 12:55:53 +01:00
Developer 02
31e647d3e5 feat(EnvelopeMailService): SendTFAQrCodeAsync als Schnittstellenimplementierung zum Senden von QR-Code-E-Mails hinzugefügt. 2024-12-11 12:53:45 +01:00
Developer 02
6dfdd48ec0 fix(IEnvelopeMailService): Optionale Platzhalter in die richtige Methode verschoben. 2024-12-11 12:16:53 +01:00
Developer 02
85cacc822d feat(EnvelopeMailService): Optionale Platzhalter als Wörterbuch hinzugefügt.
- Als Standard ist es null
2024-12-11 12:14:10 +01:00
Developer 02
535ca23c86 feat(HomeController): Befehl zum Senden von E-Mails hinzugefügt, um QR-Code zu senden.
- TotpSecret zu EmailTemplateType hinzugefügt.
2024-12-11 11:44:39 +01:00
Developer 02
7f1009e402 feat(mapping): Ignorierregel für EnvelopeReceivers in ReceiverReadDto-Mapping hinzugefügt.
- ReceiverReadDto-Mapping aktualisiert, um die Eigenschaft EnvelopeReceivers in der Entität Receiver zu ignorieren.
 - Stellt sicher, dass die Datenzuordnung sauber bleibt und keine unbeabsichtigten Eigenschaften einbezogen werden.
2024-12-11 10:02:53 +01:00
Developer 02
ea4b35f4b4 feat(HomeController): Anweisung hinzugefügt, um den geheimen Totp-Schlüssel zu aktualisieren, wenn er in Kraft ist. 2024-12-11 00:04:29 +01:00
Developer 02
8e1b4e0832 feat(ReceiverService): Generische Update-Methode hinzugefügt 2024-12-10 23:48:01 +01:00
Developer 02
4f5b8f9d76 feat(EnvelopeReceiverService): Optionale schreibgeschützte Eingabe als Schnittstellenimplementierung hinzugefügt.
- als Standard ist Nur-Lesen wahr.
2024-12-10 22:48:43 +01:00
Developer 02
f06b41492e feat(EnvelopeReceiverRepository): Standardwert readOnly als true aktualisiert. 2024-12-10 22:43:53 +01:00
Developer 02
f0f1275e75 feat(EnvelopeReceiverRepository): Optionale schreibgeschützte Eingabe als Schnittstellenimplementierung hinzugefügt.
- Standardmäßig ist schreibgeschützt falsch.
2024-12-10 22:33:32 +01:00
Developer 02
085f37de16 feat(CodeGenerator): Die Methoden GenerateTotpSecretKey, GenerateTotpQrCode und GenerateTotpQrCode wurden als Schnittstellenimplementierung hinzugefügt. 2024-12-10 22:05:52 +01:00
Developer 02
1657a99aa6 feat(DTOExtensions): Optionale minutesBeforeExpiration Eingaben zu IsTotpSecretInvalid und IsTotpSecretValid Methoden hinzugefügt. 2024-12-10 20:34:22 +01:00
Developer 02
ff6d27df8e feat(DTOExtensions): Erstellt, um Erweiterungsmethoden für DTOs hinzuzufügen.
- IsTotpSecretExpired, IsTotpSecretInvalid und IsTotpSecretValid Erweiterungsmethoden für ReceiverReadDto hinzugefügt, um den Zustand des geheimen Schlüssels zu behandeln.
2024-12-10 20:32:09 +01:00
Developer 02
76bd1a102f fix(EnvelopedLocked): asp-for tag helper verwendet, um die Daten der UserSelectSMS Eigenschaft zu erhalten.
- nullibility und null check von UserSelectSMS entfernt, weil es für tag helper nicht akzeptabel ist
2024-12-10 20:13:26 +01:00
Developer 02
6a6da39bc4 refactor(HomeController): Aktualisiert, um zu prüfen, ob der UserSelectSMS-Wert falsch ist.
- Relevante Variablen zu EnvelopeLocked.cshtml hinzugefügt
2024-12-10 18:48:05 +01:00
Developer 02
137d8e09d4 refactor(HomeController): Aktualisiert, um zu prüfen, ob der UserSelectSMS-Status null ist. 2024-12-10 18:24:29 +01:00
Developer 02
bed51992d2 feat(Auth): Proproty mit dem Namen AuthenticatorCode für die Verwendung von Authenticators hinzugefügt.
- Getter mit dem Namen HasAuthenticatorCode hinzugefügt.
 - Aktualisierte HasMulti und HasNone Getter Methoden, die dies berücksichtigen.
2024-12-10 18:08:01 +01:00
Developer 02
a371abaabe feat(Auth): Nullbare Eigenschaft namens 'UserSelectSMS' hinzugefügt.
- Sie wird standardmäßig als null zugewiesen.
 - Die Checkbox des Formulars in Envelope.cshtml wurde userSelectSMS genannt.
2024-12-10 17:47:45 +01:00
Developer 02
90c6e87224 feat(EnvelopeLocked): Kontrollkästchen hinzugefügt, um TFA per SMS auswählen zu können oder nicht, wenn tfa aktiviert ist.
- Das Kontrollkästchen ist standardmäßig nicht aktiviert.
 - Das Kontrollkästchen ist deaktiviert, wenn der Benutzer keine Telefonnummer hat.
2024-12-10 17:26:09 +01:00
Developer 02
4af1534194 fix(Receiver): Behoben TotpExpiration Eigenschaft Column atribute name. 2024-12-10 13:15:25 +01:00
Developer 02
f39ac57009 feat(EnvelopeReceiver): TFAEnabled-Eigenschaft zu Entität und Basis-Dto hinzugefügt. 2024-12-10 12:11:58 +01:00
Developer 02
88d01e4ac7 refactor(Receiver): TotpSecretkey und TotpExpiration Eigenschaften zu Entity und DTOs hinzugefügt. 2024-12-10 11:09:25 +01:00
Developer 02
85c33eb0f8 refactor(CacheExtensions): Umbenennung der GetOrCreate-Methoden in GetOrSet 2024-12-09 17:18:24 +01:00
Developer 02
1bc31fe0ee feat: GetOrCreate und GetOrCreateAsync-Methoden zu CacheExtensions hinzugefügt
- GetOrCreate und GetOrCreateAsync-Methoden hinzugefügt, um Caching mit optionalem Hintergrund-Caching zu ermöglichen.
- Methoden prüfen zuerst den Cache, und wenn der Wert nicht gefunden wird, wird der Wert mit einer bereitgestellten Fabrikfunktion erstellt und zwischengespeichert.
- Unterstützt asynchrones und synchrones Caching mit optionalen DistributedCacheEntryOptions.
2024-12-09 17:13:10 +01:00
Developer 02
2e790b4e4c Revert "feat: Hinzufügen und Konfigurieren von EntityFrameworkCore und UI-Paketen von Microsoft.AspNetCore.Identity."
This reverts commit 19485860a5.
2024-12-09 15:29:30 +01:00
Developer 02
19485860a5 feat: Hinzufügen und Konfigurieren von EntityFrameworkCore und UI-Paketen von Microsoft.AspNetCore.Identity. 2024-12-09 09:37:49 +01:00
Developer 02
e33d859603 refactor(ShowEnvelope): änderte die Farbe der Schaltfläche via Bootstrap in 2024-12-02 14:57:10 +01:00
Developer 02
46b8bde162 chore(Web): Aktualisiert auf 2.7.0. 2024-12-02 10:12:10 +01:00
Developer 02
a6468c2ff1 feat(HomeController): Funktionalität zur Überprüfung des SMS-Codes hinzugefügt 2024-11-30 04:23:24 +01:00
Developer 02
40a21a0b89 feat(EnvelopeReceiverCache): zum Abrufen und Setzen von Caches über Envelope Receiver unter Verwendung von Standard-Schlüsselwörtern als Schnittstellenimplementierung erstellt.
- Erstellte Optionen.
 - Zu DI hinzugefügt.
2024-11-30 03:46:40 +01:00
Developer 02
fa44b82493 feat(EnvelopeLocked): Timer mit CSS-Konfiguration und Javascript-Ereignis hinzugefügt.
- Ablauf über Home-Controller-Ansichtsdaten hinzugefügt
2024-11-30 01:56:02 +01:00
Developer 02
cdec5485c6 feat(GtxMessagingService): Zwischenspeicherung für SMS-Code und Ablauf des SMS-Codes mittels Envelope-Receiver-ID hinzugefügt
- Erweiterungsmethode für Zeitcaching hinzugefügt.
2024-11-29 16:25:20 +01:00
Developer 02
2a963a1861 feat(Web): Verteilter Sql Server-Cache hinzugefügt.
- Bat-Datei erstellt, um Tabelle für Cache zu erstellen.
 - Sql-Datei zum Erstellen einer Tabelle für den Cache erstellt
2024-11-29 14:08:07 +01:00
Developer 02
9d1a2e7254 refactor(HomeController): SMS-Code zum Senden hinzugefügt 2024-11-29 12:05:07 +01:00
Developer 02
b779ef6f0b feat(GtxMessagingService): Konfigurierte Codelänge über ioptions.
- Standardmäßig ist sie 5
2024-11-29 11:16:08 +01:00
Developer 02
0c81a86610 feat(GtxMessagingService): SendSmsCodeAsync mit Basisfunktionalität als Schnittstellenimplementierung hinzugefügt 2024-11-29 11:13:59 +01:00
Developer 02
b11f32bd3c feat: CodeGenerator-Service mit Konfigurationsunterstützung implementiert
- CodeGenerator-Service erstellt, der zufällige Codes basierend auf einem konfigurierbaren Zeichensatz generiert.
- IOptions<CodeGeneratorConfig> für DI-Injektion der Konfigurationseinstellungen integriert.
- Lazy-Initialisierung für statische Instanz des CodeGenerators hinzugefügt.
- Validierung hinzugefügt, um sicherzustellen, dass die Code-Länge größer als null ist.
- Geplante zukünftige Verbesserung: Random als Singleton injizieren, um die Multithreading-Performance zu verbessern.
2024-11-29 11:08:01 +01:00
Developer 02
b8d9963fac refactor(HomeController): ReadWithSecretByUuidSignatureAsync implementiert, um alle Informationen in einer einzigen Sql-Transaktion zu erhalten.
- Methode hinzugefügt, um geheimes dto in dto zu konvertieren
2024-11-29 10:22:11 +01:00
Developer 02
e77532ebfd feat(EnvelopeReceiverService): ReadWithSecretByUuidSignatureAsync zum Lesen mit Zugangscode und Telefonnummer hinzugefügt 2024-11-29 10:11:33 +01:00
Developer 02
ec37518245 feat(EnvelopeReceiverSecretDto): Erstellt als Erbe von EnvelopeReceiverDto, hinzugefügt AccessCode und PhoneNumber. 2024-11-29 10:07:09 +01:00
Developer 02
a1618fc8d0 refactor(HomeController): EnvelopeReceiverSecretDto zur Vereinfachung entfernt und direkt String verwendet 2024-11-29 10:01:28 +01:00
Developer 02
6b65fc28fd refactor(HomeController): log message format more appropriately written 2024-11-29 09:29:27 +01:00
Developer 02
a763fd6a24 feat(EnvelopeLocked): Textkörper und Fußzeile für SMS-Ansicht hinzugefügt. 2024-11-29 01:10:08 +01:00
Developer 02
28a8e20b63 feat(WebKey): Lokalisierungstasten sms tfa in EnvelopeLocked Ansicht hinzugefügt. 2024-11-29 00:45:21 +01:00
Developer 02
155f80e8b3 feat(EnvelopeLocked): Angepasste Icon-Farbe für sms TFA 2024-11-29 00:38:18 +01:00
Developer 02
d8f74971f3 feat(EnvelopeLocked): Der Parameter viaSms wurde hinzugefügt, um die Seite sowohl für die Überprüfung des Zugangscodes als auch des SMS-Codes zu verwenden.
- accessCodeName und accessCodeLabel wurden aktualisiert, um bedingt zugewiesen zu werden.
2024-11-29 00:26:29 +01:00
Developer 02
44dc7185c6 feat(Auth): Getter-Methoden zur Werteprüfung hinzugefügt 2024-11-28 23:57:18 +01:00
Developer 02
551ba595b6 refactor(EnvelopeLocked): envelopeRecevier-Modell aus der Ansicht entfernt. 2024-11-28 23:56:18 +01:00
Developer 02
4b77713df4 Merge branch 'master' into feat/two-factor-auth 2024-11-28 23:39:12 +01:00
Developer 02
f1ca1e9067 feat(Auth): Erstellung eines Authentifizierungsmodells anstelle der direkten Verwendung des Zugriffscodes. 2024-11-28 23:38:51 +01:00
Developer 02
0469f057c9 refactor(HomeController): Aktualisiert, um den Envelope-Empfänger als Modell zur EnvelopeLocked-Ansicht hinzuzufügen 2024-11-28 21:50:05 +01:00
Developer 02
b4a97abe6b feat(EnvelopeReceiverBase): HasPhoneNumber-Eigenschaft sowohl zur Entität als auch zum DTO hinzugefügt 2024-11-28 20:46:51 +01:00
Developer 02
423b293197 feat(MessagingService): Möglichkeit hinzugefügt, den Anbieter des Messaging-Servers zu benachrichtigen. 2024-11-27 17:46:32 +01:00
Developer 02
27618a343e feat(EnvelopeReceiverService): SendSmsAsync hinzugefügt, um SMS an den Benutzer über die Umschlag-Empfänger-ID mithilfe des Messaging-Services zu senden. 2024-11-27 17:35:38 +01:00
Developer 02
fe106c5a8c feat(EnvelopeReceiverBase): Eigenschaft „Telefonnummer“ hinzugefügt. 2024-11-27 17:09:17 +01:00
Developer 02
941b98b1a4 feat(SmsResponse): Erstellung eines Standardantwort-DTOs für SMS-Anfragen.
- GtxMessagingResponse für rohe dynamische Antwort erstellt.
 - Mapping-Profil hinzufügen
2024-11-27 15:13:41 +01:00
Developer 02
168c33bfea chore(Application): Core.Client auf 2.0.3 hochgerüstet 2024-11-26 23:58:07 +01:00
Developer 02
40c25ee111 fix(appsettings): Leerzeichen aus SmsConfig.QueryParams.from entfernt, da vom SMS-Dienst nicht erlaubt 2024-11-26 23:47:42 +01:00
Developer 02
608d79d35b chore(Web): upgraded to 2.6.0 2024-11-25 15:54:15 +01:00
Developer 02
62d396932d refactor(EnvelopeDocument): removed Filename, Filepath and FilenameOriginal properties. 2024-11-25 15:42:51 +01:00
Developer 02
62dcb41526 Refactor: Unnötige alte Fußzeilen aus den Ansichten „Umschlag abgelaufen“, „Abgelehnt“ und „Signiert“ entfernt. 2024-11-25 15:37:28 +01:00
Developer 02
360bb9b3d8 refactor(_layout.cshtml): Datenschutz-Link in der Fußzeile aktualisiert, unterstützt mehrere Sprachen 2024-11-25 15:24:18 +01:00
Developer 02
1f57914f9e refactor(_Layout.cshtml): aktualisiert, um Datenschutz und die Website der Digital Data GmbH bei Klick in einem neuen Tab zu öffnen. 2024-11-25 15:12:48 +01:00
Developer 02
9c431ddf56 refactor(Config): DocumentPathDmz, ExportPathDmz und DocumentPathMoveAftsend sowohl in der Entität als auch im DTO entfernt. 2024-11-25 14:58:32 +01:00
Developer 02
61ff2f8cde Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-11-25 14:42:56 +01:00
Developer 02
f2ee509727 chore: Upgrade von Core.Abstractions 2.2.1 und Core.Client auf 2.0.2 2024-11-25 14:40:52 +01:00
Developer 02
da06daf776 refactor(GtxMessagingService): Optionen für generische und dynamische Antworttypen zur SendSmsAsync-Methode hinzugefügt. 2024-11-25 14:13:34 +01:00
Developer 02
d3104500d4 refactor(Application): Aufrüstung von Core.Client auf 2.0.1 2024-11-25 14:08:47 +01:00
Developer 02
d23b8b9187 feat(TestMessagingController): initialized 2024-11-25 13:32:50 +01:00
Developer 02
ec206ab33a feat(DIExtensions): Gtx-Nachrichtendienst hinzugefügt 2024-11-25 13:27:09 +01:00
Developer 02
de6d4b9dd8 feat(DIExtensions): HTTP-Client-Dienst hinzugefügt 2024-11-25 13:25:22 +01:00
Developer 02
2943fe0e2d refactor(DIExtensions): Aktualisiert, um TryAddScoped anstelle von AddScoped für sicherere DI-Injektion zu verwenden. 2024-11-25 13:10:43 +01:00
Developer 02
33e99f584a feat(IMessagingService): Initialisiert und implementiert in GtxMessagingService 2024-11-25 13:07:39 +01:00
Developer 02
4a62ab0c56 feat(GtxMessagingService): Umbenennung von SendSms in SendSmsAsync 2024-11-25 13:01:43 +01:00
Developer 02
132acd35cc feat(GtxMessagingService): Empfänger- und Nachrichteneingaben zur SendSms-Methode über SMS-Parameter hinzugefügt 2024-11-25 13:01:12 +01:00
Developer 02
ed80839777 feat(SmsParams): Aktualisiert, um IHttpClientOptions zu implementieren 2024-11-25 12:47:30 +01:00
Developer01
2114615584 MS Removed PathColumns 2024-11-25 12:38:02 +01:00
Developer 02
6e6f3fd2ed chore: Aktualisierung von Core.Abstraction auf 2.2.0 2024-11-25 11:55:09 +01:00
Developer 02
5da306acd3 feat(GtxMessagingService): SendSms-Methode initialisiert und Authentifizierungspfad hinzugefügt. 2024-11-22 15:37:59 +01:00
Developer 02
18ef1d19b5 feat(GtxMessagingService): Eingespritzter Client.IHttpClientService 2024-11-22 15:20:19 +01:00
Developer 02
b76ebd2abc chore: Aktualisierung von Core.Abstraction auf 2.1.0
- Core.Client zur Anwendungsschicht hinzufügen
2024-11-22 14:57:20 +01:00
Developer 02
d55233061d feat: erweitere SmsParams um zusätzliche Eigenschaften für die SMS-API-Integration
- Neue erforderliche Eigenschaft `Endpoint` hinzugefügt, mit einem Standardwert für den GTX Messaging REST-API-Endpunkt.
- Optionale Eigenschaften wie `Format`, `Accept`, `ContentType` und SMS-spezifische Parameter (`From`, `Texts`, `DlrMask` usw.) hinzugefügt, um API-Anforderungen zu erfüllen.
- XML-Dokumentation mit API-Referenzlink aktualisiert, um besseren Kontext zu bieten.
- TODO hinzugefügt, um Regex-Validierung in `init`-Methoden zu implementieren und Eingabefehler zu reduzieren.
2024-11-21 18:25:14 +01:00
Developer 02
949001791c refactor: Umbenennung von GTX in Gtx und GTXMessagingConfig in SmsParams 2024-11-21 17:22:21 +01:00
Developer 02
30f93f2439 feat(GTXMessagingService): initialisiert mit Konfigurationsoption 2024-11-21 11:46:15 +01:00
Developer01
36ffb9511c Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-11-12 08:30:32 +01:00
Developer01
bf84d5c63a MS Common v1.5.9 email Valdiation, email Resending, Clientintegration 2024-11-12 08:30:14 +01:00
Developer01
57f8d0e398 MS Multiple Files Dialog, Qualifizierte Signatur weg 2024-11-08 11:48:58 +01:00
Developer 02
bb8bd8ed40 chore: Aktualisiert auf 2.5.0. 2024-11-06 00:37:57 +01:00
Developer 02
ba832acad3 feat(Main.cshtml): Bootstrap-Warnung hinzugefügt. 2024-11-06 00:31:25 +01:00
Developer 02
6490a3cb82 feat(home-description): gestaltetes CSS 2024-11-05 23:48:30 +01:00
Developer 02
4c077c90db feat(Main.cshtml): Typed.js für die Beschreibung der Startseite hinzugefügt. 2024-11-05 23:05:30 +01:00
Developer 02
9bd5e63128 feat(Typed.js): hinzugefügt 2024-11-04 17:21:47 +01:00
Developer 02
15ce7c9384 feat(localizer): Wert für HomePageDescription in Deutsch und Englisch hinzugefügt 2024-11-04 17:02:21 +01:00
Developer 02
8707a5cdb5 feat(HomeController): Kultur-Cookie zur Hauptseite hinzugefügt. 2024-11-04 16:28:37 +01:00
Developer 02
47c7070700 feat(Main.cshtml): sign_flow_min.svg hinzugefügt 2024-11-04 15:03:00 +01:00
Developer 02
fcc3223eb1 feat(HomeController): Endpunkt für Stammverzeichnis als Startseite hinzugefügt. 2024-11-04 14:30:09 +01:00
Developer 02
c4114a3800 feat(HomeController): UserCulture zu EnvelopeSigned hinzugefügt 2024-10-18 13:27:42 +02:00
Developer 02
977486bb7d chore: Aktualisiert auf Version 2.4.0.0. 2024-10-18 10:40:24 +02:00
Developer 02
6ccc0d2e0a refactor(HomeController): Aktualisiert, um ein Dokument aus der Datenbank über EnvelopeDocumentDto zu lesen, anstatt das Dokument aus dem Dateipfad mit envelopeOldService zu lesen 2024-10-18 10:34:51 +02:00
Developer 02
084a9b7db4 refactor(EnvelopeDocumentDto): ByteDta-Eigenschaft hinzugefügt 2024-10-18 10:21:01 +02:00
Developer 02
826844cf46 refactor(EnvelopeDocument): ByteDta-Eigenschaft hinzugefügt 2024-10-18 10:17:28 +02:00
Developer 02
39cff26f2d feat(site.css): Die Schriftgröße der Fußzeile und die Anordnung der Elemente wurden angepasst, um eine bessere Reaktionsfähigkeit zu gewährleisten. 2024-10-18 10:05:03 +02:00
Developer 02
1619801526 refactor(appsettings) verschiebt DispatcherConfig in die Nähe von Mail config 2024-10-18 09:55:24 +02:00
Developer 02
5a1263ee3a refactor(CookieConsentSettings ): Entfernen Sie es und es ist DI Injection 2024-10-18 09:50:53 +02:00
Developer 02
bc91baa4fa refactor(appsettings): verschiebe appsettings about developmentement nach appsettings.Dev 2024-10-18 09:46:34 +02:00
Developer 02
a4882a7bfa refactor(appsettings): Der Pfad zu den Protokolldateien wurde auf einen zentralen Speicherort aktualisiert. 2024-10-18 09:43:39 +02:00
Developer 02
c254b5b8df refactor(Envelope): Entfernte DmzMoved-Eigenschaft 2024-10-18 09:32:49 +02:00
Developer 02
66718a3fd8 chore: das Projekt auf 2.3 aktualisiert 2024-10-16 15:06:01 +02:00
Developer 02
99fc2aecd9 refactor(app.js) : Entfernen von /ReadOnly beim Kopieren der Url 2024-10-16 14:56:54 +02:00
Developer 02
a41d03aed5 feat(HomeController): zentralisierte Standard-Kultur-Cookie-Zuweisung. 2024-10-16 14:42:58 +02:00
Developer 02
6d14b79c43 refactor(flag-dropdown): in die footer verschoben 2024-10-16 13:48:06 +02:00
Developer 02
faeac8f290 refactor(EnvelopeRejected): Unnötige _CookieConsentPartial entfernen 2024-10-16 11:58:23 +02:00
Developer 02
d172faacf3 refactor(ShowEnvelope): Unnötige _CookieConsentPartial entfernen 2024-10-16 11:56:54 +02:00
Developer 02
35d6beb3cb feat(ShowEnvelope): Wenn ReadOnly, machen Sie die Kopfzeile ViewDoc anstelle von SignDoc.
- ViewDoc-Schlüssel zu resx in beiden Sprachen hinzugefügt
2024-10-16 11:55:48 +02:00
Developer 02
7ff787ec28 refactor(_layout): City-Regex-Prüfung ignorieren, wenn IS_MOBILE_DEVICE
- IS_MOBILE_DEVICE als globalen konstanten Wert hinzugefügt
 - DEVICE_TYPE geändert in DEVICE_SCREEN_TYPE
 - IS_DESKTOP zu IS_DESKTOP_SIZE geändert
2024-10-16 11:32:25 +02:00
Developer 02
f6fc850a20 fix: Pull-Konflikte in Constant.vb gelöst. 2024-10-16 10:00:20 +02:00
Developer 02
04b8d0ef5d fix: Pull-Konflikte in Constant.vb gelöst. 2024-10-16 09:43:41 +02:00
Developer 02
891f6368f1 refactor(card.css): CSS der footer für Reaktionsfähigkeit bearbeitet 2024-10-16 02:11:07 +02:00
Developer 02
e6011b6201 refactor(card.css): CSS des Kopfbereichs für Reaktionsfähigkeit bearbeitet 2024-10-16 01:54:02 +02:00
Developer 02
8b86114998 refactor (card.css): unnötiges CSS entfernt 2024-10-16 00:31:32 +02:00
Developer 02
c20b115faf feat(logo): minimiertes Logo hinzugefügt 2024-10-16 00:11:14 +02:00
Developer 02
2c8ccd3e7c feat: signFlow-Logo hinzufügen 2024-10-14 19:18:40 +02:00
Developer 02
b1f771c320 feat: Kopierschaltfläche von der linken Navigationsleiste in die pspdf-kit Symbolleiste verschoben. 2024-10-14 18:54:29 +02:00
Developer 02
425645a610 feat: neue Klasse für Desktop-Schaltflächen mit dem Namen 'btn-desktop' erstellt
- CSS hinzugefügt, um die Klasse btn-desktop auszublenden, wenn die Breite weniger als 1024px beträgt.
2024-10-14 17:41:51 +02:00
Developer 02
24e6ffc5ef feat: CSS mit Bootstrap für mobil beschreibbare Toolbar-Elemente anordnen 2024-10-14 17:24:49 +02:00
Developer 02
1dd9ce6bbc feat: Aktivieren Sie die Schaltfläche für die mobile Ablehnung.
- Ereignis hinzugefügt.
 - In die Mitte der Schaltflächenleiste verschoben
2024-10-14 17:06:01 +02:00
Developer 02
e528fa6409 feat: getMobileItems umbenennen in getMobileWritableItems 2024-10-14 16:05:27 +02:00
Developer 02
6440dd09d1 feat: Erstellung der konstanten Variablen DEVICE_TYPE und IS_DESKTOP.
- Aufteilung der benutzerdefinierten Symbolleistenelemente in writableItems und mobileItems
 - beide werden abhängig von der jeweiligen Bedingung hinzugefügt
2024-10-14 15:44:21 +02:00
Developer 02
869493bd97 feat: Globale Konstante isReadOnly-Wert erstellt.
- Constraint für ReadOnly-Schaltfläche mit isReadOnly-Wert hinzugefügt
2024-10-14 14:02:02 +02:00
Developer 02
1cb9042736 feat(ui.js): Freigabe-Schaltfläche als Symbolleisten-Schaltfläche hinzugefügt.
- Share-Button auf der linken Seite der Kopfzeile entfernt
2024-10-14 11:27:41 +02:00
Developer 02
c9410a1e2e feat(ReadOnlyController): Try-Catch zur 'CreateAsync'-Methode hinzugefügt.
- Unnötige Testmethoden wurden aus dem Controller entfernt.
2024-10-14 09:38:16 +02:00
Developer01
683ff03a0f Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-10-13 17:38:48 +02:00
Developer01
c9ba7eeaf9 MS 2024-10-13 17:38:31 +02:00
Developer 02
c4f0ce7d4b feat: bsNotify-Methode und Benachrichtigung für Clipboard-Kopie hinzufügen
- Implementierung der bsNotify-Methode für benutzerdefinierte Benachrichtigungen mit alertify.
- Hinzufügen von benutzerdefinierten Styles für den benutzerdefinierten Benachrichtigungstyp von alertify.
- Hinzufügen der Clipboard-Kopie-Funktionalität mit Erfolgs- und Fehlerbenachrichtigungen.
2024-10-11 14:15:06 +02:00
Developer 02
dc83486032 feat(ShowEnvelope): Nachricht auf Popup-Seite zum Teilen hinzugefügt 2024-10-11 09:51:02 +02:00
Developer 02
2a64091c87 feat: Funktionalität des Datumsauswählers zum Eingabefeld hinzufügen
- Einen Datumsauswähler implementiert, der beim Fokussieren des Eingabefeldes und beim Klicken auf das Kalendersymbol geöffnet wird.
- Sicherstellt, dass das Eingabefeld keine manuelle Dateneingabe zulässt, während der Kalender weiterhin angezeigt werden kann.
- Das `onkeydown`-Ereignis verwendet, um manuelle Eingaben zu verhindern und die Datenauswahl ausschließlich über den Datumsauswähler zu ermöglichen.
2024-10-11 00:59:00 +02:00
Developer 02
f65f749208 feat(ShowEnvelope): Der Rücksetzwert des Verfallsdatums der Briefumschlag-Aktie wird auf das Datum eine Woche später statt auf den leeren String gesetzt. 2024-10-11 00:45:37 +02:00
Developer 02
0b6ed00062 feat(EnvelopeReceiverReadOnlyCreateDto): EmailAddress und Required Attribute zu ReceiverMail hinzugefügt. 2024-10-11 00:36:18 +02:00
Developer 02
e87c976e19 fix(ShowEnvelope): Logik der E-Mail-Formatprüfung korrigiert 2024-10-10 22:00:52 +02:00
Developer 02
f31ece3a59 feat(ShowEnvelope): Logik zur Überprüfung des E-Mail-Formats hinzugefügt. Zeigt eine Fehlermeldung, wenn das Format falsch ist. 2024-10-10 21:56:32 +02:00
Developer 02
cfd08602ab feat(ShowEnvelope): Logik zur Überprüfung des Datums hinzugefügt. Wenn es weniger als einen Tag beträgt, wird eine Fehlermeldung angezeigt. 2024-10-10 21:46:06 +02:00
Developer 02
4b7152b272 feat(ShowEnvelope): Die Attribute min, max und value wurden zu readonly-date-valid hinzugefügt. 2024-10-10 20:47:55 +02:00
Developer 02
5117a66c81 feat(ShowEnvelope): Standarddatum nach 3 Tagen setzen 2024-10-10 19:30:19 +02:00
Developer 02
83794d4bbc feat: add email validation and toggle 'is-invalid' class for inputs with 'email-input' class 2024-10-10 19:21:15 +02:00
Developer 02
76f74778b4 feat(ShowEnvelope): Swal-Nachrichten zur Umschlagfreigabe-Anforderung hinzugefügt 2024-10-10 18:53:35 +02:00
Developer 02
ded3425e31 feat: Funktion hinzugefügt, um aktuelle URL beim Klicken auf den Button in die Zwischenablage zu kopieren 2024-10-09 16:53:44 +02:00
Developer 02
738b379fe5 feat(UI.js): PDF-Export-Symbolleiste zur pspdf-Instanz hinzugefügt 2024-10-09 16:50:01 +02:00
Developer 02
cf8b28441f feat(ShowEnvelope): Bedingung hinzugefügt, die auf Nur-Lesen basiert, um den Share-Button zu sehen.
- Wenn es schreibgeschützt ist, erscheint die Schaltfläche Kopie zur Zwischenablage hinzufügen.
2024-10-09 16:49:07 +02:00
Developer 02
0eb5897185 feat(share pop-up): Post-Request-Prozess hinzugefügt. 2024-10-09 15:03:54 +02:00
Developer 02
25cd1601a6 feat(share pop-up): Datumswähler hinzugefügt. 2024-10-09 13:54:16 +02:00
Developer 02
42e4d110ad refactor(wwwroot\lib): MDB und bootstrap-cookie-consent-settings-main entfernt 2024-10-09 12:43:18 +02:00
Developer 02
2538f34892 feat(ShowEnvelope). erstellt Basis-Popup-Menü, um das Dokument zu senden 2024-10-09 12:37:36 +02:00
Developer 02
3ce11f4cc7 feat(api-service): Methode für Share-Request erstellt. 2024-10-09 11:00:21 +02:00
Developer 02
f2cd34a79e feat(share-button): Basisstruktur der Klick-Aktion hinzugefügt 2024-10-09 10:50:26 +02:00
Developer 02
5f923ad485 feat(ShowEnvelope): Share-Button hinzugefügt
- CSS einstellen.
2024-10-09 10:46:18 +02:00
Developer 02
8f70f085d3 feat(HomeController): Historischer Prozess zum Speichern von Umschlägen hinzugefügt, die unter dem Endpunkt EnvelopeReceiverReadOnly angezeigt werden. 2024-10-09 09:58:20 +02:00
Developer 02
d6c09ed31a feat(ReadOnlyController): Speichern der EnvelopeShared-History zur CreateAsync-Methode hinzugefügt. 2024-10-09 09:37:02 +02:00
Developer 02
7d3ee1331d feat(EnvelopeStatus): Status „EnvelopeViewed“ hinzugefügt 2024-10-09 02:11:51 +02:00
Developer 02
cd5b90a1e2 feat(ReadOnlyControler): History-Dienst hinzugefügt, um envelope-shared-process zu speichern 2024-10-09 02:10:08 +02:00
Developer 02
ac861f5fa0 fix(DIExtensions): arrangierte Mail- und Dispatcher-Konfigurationen 2024-10-09 02:05:21 +02:00
Developer 02
c1d8f817bb feat(ReadOnlyController): envelope-id von create DTO automatisch aus envelope-id claim hinzugefügt. 2024-10-09 01:16:06 +02:00
Developer 02
da28a7332b feat(EnvelopeClaimTypes): „envelope ID“ als Auth-Claim hinzugefügt. 2024-10-09 00:51:59 +02:00
Developer 02
bfd4e6a8ed feat(MailConfig): Schnittstelle zur Mail-Konfiguration über appsettings erstellt. 2024-10-09 00:22:23 +02:00
Developer 02
b4e0e4b6b2 feat(EnvelopeMailService): Arrangiert den Mailservice für read-only Umschläge zum Versenden als E-Mail 2024-10-08 15:56:34 +02:00
Developer 02
e37caf5c8f refactor(ShowEnvelopeView): Kurzzeitanteil der Verfallszeit für schreibgeschützten Umschlag entfernen 2024-10-07 10:08:10 +02:00
Developer 02
e95cf24af7 feat(EnvelopeExpired-View): Erstellt eine Ansicht, die anzeigt, wenn der Umschlag abgelaufen ist 2024-10-05 04:19:52 +02:00
Developer 02
524a72caa0 feat(ShowEnvelope-View): Flex-Action-Panel ausblenden, wenn schreibgeschützt 2024-10-05 03:22:37 +02:00
Developer 02
1919c562cc feat(ShowEnvelope-View): ReadOnlyMessage wurde für verschiedene Kulturen erstellt. Zu View hinzugefügt.
- View-Benutzernachrichten sind so organisiert, dass sie davon abhängen, ob der Umschlag schreibgeschützt ist oder nicht.
2024-10-05 03:20:39 +02:00
Developer 02
62b54d6e75 feat(HomeController): Sanizer hinzugefügt 2024-10-05 02:16:14 +02:00
Developer 02
efa9160c04 feat(EnvelopeReceiverReadOnly): Modelldaten und Dokument im Endpunkt sind so eingestellt, dass sie als Bytes geladen werden. 2024-10-05 02:04:57 +02:00
Developer 02
bc6955055a feat(EnvelopeReceiverReadOnly): Created endpoint for ShowEnvelope view 2024-10-04 11:28:52 +02:00
Developer 02
dc997d5ff2 refactor(.Extensions): Extensions nach Gruppen aufgeteilt.
- erstellt dekodierende Erweiterungen.
 - Kodierungserweiterungen erstellt.
 - XSS-Erweiterungen in das Extensions-Paket verschoben.
 - EncodeTypes vom Paket Common in das Paket Constants verschoben.
2024-10-02 13:33:11 +02:00
Developer 02
a32f495038 refactor(HomeController): EnvelopeReceiverReadOnly-Endpunkt initialisiert.
- injiziert EnvelopeReceiverReadOnlyService
2024-10-01 18:14:59 +02:00
Developer 02
210466883c refactor(SendAccessCode): Prüfung hinzugefügt, ob die envelope-id schreibgeschützt ist. Wenn ja, Umleitung zu /ReadOnly
- Umbenannt in MainAsync
2024-10-01 17:51:31 +02:00
Developer 02
728385b70a feat(extensions): created extensions project.
- Moved encoding extensions from application to extensions project to increase the abstraction
2024-10-01 17:25:50 +02:00
Developer 02
792aa0b922 feat(decode): Methoden zur Konvertierung des dekodierten Arrays in eine Umschlag-Empfänger-ID und eine Nur-Lese-ID mit Ausnahmewirkung hinzugefügt. 2024-10-01 16:44:46 +02:00
Developer 02
6847b74095 feat(EncodeType): Enum zur Klassifizierung von Kodierungstypen erstellt.
- Erweiterungsmethoden hinzugefügt, um zu versuchen, String mit out-keyworld zu dekodieren.

- Erweiterungsmethode hinzugefügt, um den Typ des Kodierungstyps des dekodierten String-Arrays zu finden.
2024-10-01 16:04:44 +02:00
Developer 02
54e86b421c feat(EnvelopeReceiverReadOnly): Erweiterungsmethode zum Kodieren und Dekodieren von Envelope-Receiver ReadOnly Id hinzugefügt 2024-10-01 15:26:06 +02:00
Developer 02
370666cb0e refactor: EnvelopeReceiverReadOnlyRepository so angepasst, dass die Einbindung von Envelope bis zur Klärung des ID-Typs verschoben wird
- Konstruktor von EnvelopeReceiverReadOnlyRepository angepasst, um IEnvelopeRepository zu akzeptieren.
 - Die Zeile Include(erro => erro.Envelope) in der Methode ReadOnly auskommentiert, bis der EnvelopeId-Typ standardisiert ist.
 - Methoden IncludeEnvelope hinzugefügt, um Envelope manuell für jedes EnvelopeReceiverReadOnly einzubinden.
 - Markierte manuelle Einbindungs-Methoden als veraltet, um durch IQueryable.Include ersetzt zu werden, sobald der EnvelopeId-Typ geklärt ist.
2024-10-01 12:54:27 +02:00
Developer 02
e17f7df930 feat(EnvelopeReceiverReadOnly): Controller initialisieren
- Join mit Receiver und Read
 - DI-Konfiguration hinzufügen
 - Auslöser hinzufügen (TBSIG_ENVELOPE_RECEIVER_READ_ONLY_UPD)
2024-10-01 11:17:30 +02:00
Developer 02
0e91df7acc feat (Constants.EmailTemplateType): Einen neuen Typ namens „DocumentShared“ erstellt 2024-09-30 15:14:01 +02:00
Developer 02
ad26230da5 feat (EnvelopeReceiverReadOnly): Erstellt „EnvelopeReceiverReadOnlyService“ als Implementierung von „CRUDService“ und „IEnvelopeReceiverReadOnlyService-interface“ 2024-09-30 15:02:52 +02:00
Developer 02
a103f34230 feat (EnvelopeReceiverReadOnly): Erstellt „mapping-profiles“ für Auto-Mapper.
- EnvelopeReceiverReadOnly zu EnvelopeReceiverReadOnlyDto
 - EnvelopeReceiverReadOnlyCreateDto zu EnvelopeReceiverReadOnly
 - EnvelopeReceiverReadOnlyUpdateDto zu EnvelopeReceiverReadOnly
2024-09-30 14:43:30 +02:00
Developer 02
806bd3b248 feat (EnvelopeReceiverReadOnly): Erstellt „data-transfer-objects“.
- Erstellt „Read-DTO“
 - Erstellt „Create-DTO
 - Erstellt „Update-DTO“ um nur „DateValid“ zu aktualisieren.
2024-09-30 14:39:22 +02:00
Developer 02
c69c39fa44 refactor(EnvelopeReceiverReadOnly): ChangedWho Eigenschaft „nullable“ gemacht 2024-09-30 14:00:40 +02:00
Developer 02
b6badb44af feat(EnvelopeReceiverReadOnly): Erstellte Repository-Klasse mit der Interface-Implementierung 2024-09-30 13:54:39 +02:00
Developer 02
b2195ce13f feat(EnvelopeReceiverReadOnly): Entität erstellt 2024-09-30 13:43:57 +02:00
Developer 02
f3cb9b8510 feat(EnvelopeStatus): Neuer Status für die gemeinsame Nutzung von Umschlägen mit Code 2008 hinzugefügt. 2024-09-30 11:49:08 +02:00
Developer 02
8edfecb9dc refactor (privacy-policy): Fehlende Informationen und CSS aktualisieren 2024-09-30 11:32:14 +02:00
Developer 02
c123d103bb chore Upgrade auf 2.1.1.0 2024-09-25 16:09:01 +02:00
Developer 02
b92d9da387 refactor(envelope-locked): konvertiere submit-button bootstrap Klasse von btn-outline-primary zu btn-primary 2024-09-25 16:07:54 +02:00
Developer 02
8841698aab chore(web): Version auf 2.0.0.0 aktualisieren und Copyrights schreiben 2024-09-25 15:52:09 +02:00
Developer 02
6f140f16cd fix(footer): Entferne den Ursprung der Datenschutzrichtlinien-URL, um auf den aktuellen Ursprung umzuleiten 2024-09-25 15:49:38 +02:00
Developer 02
8bfd31997b Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-09-25 14:46:14 +02:00
Developer 02
4a1459d708 feat: add smooth width transition to progress bar with 1s ease animation 2024-09-25 14:46:08 +02:00
Developer 02
361bdeb2b2 feat(event-binder.js): Es wurde der Effekt hinzugefügt, dass die Breite des Fortschrittsbalkens nach dem Signaturprozess um einen bestimmten Anteil erhöht wird. 2024-09-25 14:41:30 +02:00
Developer 02
9ce5af7cd0 feat(event-binder.js): Signaturkomponente hinzugefügt, um die Animationen in der Fortschrittsleiste der Signatur zu behandeln
- Befehl zum Erhöhen der Anzahl von Signaturen unter der createAnnotationFrameBlob-Methode in annotation.js hinzugefügt

- Vorzeichenbehafteter Befehl zum Nullsetzen der Zählung unter RESET-case der handleClick-Methode in app.js hinzugefügt
2024-09-25 14:03:05 +02:00
Developer 02
84fa9e6e7c refactor(envelope-locked): Zugriffscode-Panel einrichten 2024-09-25 13:28:47 +02:00
Developer 02
36916ed5c8 refactor(envelope-lcoked): Konvertierung von 'access-code' Floating Input 2024-09-25 11:01:54 +02:00
Developer 02
fb366d3e0b refactor: Umschlag nav-menu bearbeiten. minfied card.css 2024-09-25 09:21:55 +02:00
Developer01
6e7670f667 Service GDPicture 2024-09-24 17:48:29 +02:00
Developer01
e82be8b6a5 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-09-24 17:26:19 +02:00
Developer01
07320af4ee MS GPicture 2024-09-24 17:26:11 +02:00
Developer 02
73eb270237 refactor(privacy-policy.css); minified 2024-09-23 09:20:38 +02:00
Developer 02
222684cfc8 feat(footer): Zu _Layout.cshtml hinzugefügt. CSS-Trennungen bearbeitet. 2024-09-21 00:10:50 +02:00
Developer 02
3974d2123e refactor(privacy-policy): Umbenennung zur Berücksichtigung von Kulturinformationen. 2024-09-20 17:09:44 +02:00
Developer 02
b837a63b34 refactor(cookie-policy): Unnötiges html entfernen. 2024-09-20 17:02:23 +02:00
Developer 02
461316713a feat(privacy-policy): erstellt in html mit einem separaten css in Deutsch und Englisch 2024-09-20 17:01:00 +02:00
Developer 02
185af3210b core(EnvelopeGenerator.Web): Paket-, Assembly- und Dateiversionen wurden auf 2.0.0.0 aktualisiert. 2024-09-20 15:33:29 +02:00
Developer 02
e4620b5469 refactor (_CookieConsentPartial): Mit Bootstrap bearbeiten:
- Aktualisierte Cookie-Zustimmungsmeldung hinzugefügt
2024-09-20 15:30:14 +02:00
Developer 02
5c4acd17a0 fix(cookie): Fehlerhaften Consent-Cookie-Button entfernt und durch von Microsoft empfohlene Struktur ersetzt
- Den fehlerhaften Consent-Cookie-Button entfernt und die von Microsoft empfohlene Struktur integriert, um die Compliance und Funktionalität zu verbessern.
2024-09-20 13:07:32 +02:00
Developer 02
fc171e5b89 fix(html): Ungültige <div>-Tags aus cshtml entfernt
- Überflüssige <div>-Tags, die während des Merge-Prozesses entstanden sind, entfernt, um die korrekte HTML-Struktur sicherzustellen.
2024-09-20 11:24:59 +02:00
Developer 02
662faf2512 merge: feat/signFlow-gen in Master zusammenführen 2024-09-20 11:16:08 +02:00
Developer 02
2fb8af9a4f chore(api): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert
- Core-Bibliotheken und UserManager.Infrastructure in den API-Schichten auf Version 2.0.0.0 erhöht.
2024-09-20 11:05:00 +02:00
Developer 02
017d03713b refactor(dbcontext): DbContext aktualisiert, um IUserManagerDbContext zu implementieren und neue DbSets hinzuzufügen
- Implementierung des `IUserManagerDbContext` Interface in `EGDbContext`.
- Neue `DbSet`-Eigenschaften für `GroupOfUser`, `Group`, `ModuleOfUser`, `Module`, `User` und `UserRep` hinzugefügt.
- Neue DbSets im Konstruktor injiziert.
- Namespace-Importe aktualisiert, um zusätzliche Entitäten für die neuen DbSets einzubeziehen.
2024-09-20 09:46:21 +02:00
Developer 02
5f5180d937 chore(application): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert
- Core-Bibliotheken und `UserManager.Infrastructure` in der Application-Schicht auf Version 2.0.0.0 erhöht.
- DbSet-Eigenschaften aus dem DbContext injiziert.
2024-09-20 09:39:14 +02:00
Developer 02
6b3e6cd6f5 chore(infrastructure): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert
- Core-Bibliotheken und UserManager.Infrastructure im Infrastructure-Layer auf Version 2.0.0.0 erhöht.
- DbSet-Eigenschaften aus DbContext injiziert.
2024-09-20 01:16:47 +02:00
Developer 02
f95f3c7b1b refactor(dbcontext): DbSet-Erstellung in DbContext verschieben und DbSet-Eigenschaften hinzufügen
- Ersetzt die Erstellung von DbSet pro Entität durch DbSet-Eigenschaften in `EGDbContext`.
- Hinzugefügt DbSet-Eigenschaften für `UserReceiver`, `Config`, `EnvelopeReceiver` und `Envelope`.
- Aktualisierter `EGDbContext`-Konstruktor zur Initialisierung der DbSet-Eigenschaften mittels der `Set<T>`-Methode.
2024-09-19 15:06:33 +02:00
Developer 02
316b62083c feat(core): IUnique-Schnittstelle hinzufügen und Core.Infrastructure aktualisieren
- `IUnique`-Schnittstelle zu allen Entitäten im Domain-Projekt hinzugefügt.
- `Core.Infrastructure` auf Version 2.0.0.0 im Infrastructure-Layer aktualisiert.
- Domain-Projekt mit `Core.Abstraction` für verbesserte Abstraktion erweitert.
2024-09-19 14:48:34 +02:00
Developer 02
530b63f299 fix: Logo korrigiert 2024-09-19 11:27:17 +02:00
Developer 02
2f228de163 feat: Annotationen für Unterschrift, Ort und Datum neu angeordnet 2024-09-19 10:42:25 +02:00
Developer 02
e5e64b25fe merge 2024-09-19 10:38:39 +02:00
Developer 02
2d5dde177c feat: Anordnung der Annotationen für Unterschrift, Stadt und Datum 2024-09-18 00:10:16 +02:00
Developer 02
ce0ad4ba61 fix: Fix bug where access code wasn't requested when flag was false
- Modified logic to ensure a new access code is requested only if it hasn't been previously requested for the specific envelope and receiver combination.
- Prevents unnecessary access code requests, improving system efficiency.
2024-09-17 16:42:45 +02:00
Developer 02
ebd7c5d6a4 feat: Logo-Modell in den App-Einstellungen für CURSOR-AG konfiguriert 2024-09-17 15:47:44 +02:00
Developer 02
341da273c9 feat: Logo-Konfiguration und -Stile für digitale Daten aktualisiert
- `appsettings` mit neuen Logo-Klassen `dd-show-logo` und `dd-locked-logo` aktualisiert.
- `logo.css` angepasst, um die neuen Logo-Dimensionen und responsive Stile hinzuzufügen.
- Alte Klassen `cursor-logo` und `cursor-img` wurden durch `dd-locked-logo` und `dd-show-logo` ersetzt.
2024-09-17 15:36:05 +02:00
Developer 02
73d2a43a95 fix: CSSPath aus Logo entfernt, um CSS-Injection-Sicherheitslücke zu vermeiden
- Die Eigenschaft `CSSPath` wurde aus der `Logo`-Klasse entfernt, um potenzielle CSS-Injection-Risiken zu verhindern.
- Alle logo-bezogenen Stile in einer einheitlichen `logo.css` Datei standardisiert.
2024-09-17 15:01:58 +02:00
Developer 02
eee18889d6 feat: Logo-Bild in EnvelopeLocked.cshtml über Appsettings und Logo-Modell konfiguriert 2024-09-17 14:55:17 +02:00
Developer 02
590d7fb717 feat: Logo-Bild in ShowEnvelope.cshtml über appsettings konfiguriert 2024-09-17 14:50:23 +02:00
Developer 02
dd28ef7ab6 feat: Logo-Konfiguration zu Program.cs und _ViewImports.cshtml hinzugefügt 2024-09-17 14:41:31 +02:00
Developer 02
36fb033adc feat: Hinzugefügt Logo-Konfiguration für verschiedene Kunden 2024-09-17 14:10:27 +02:00
Developer 02
4275f25f4a fix: Logo auf "Digital Data" aktualisieren 2024-09-17 13:52:52 +02:00
Developer 02
30b5633498 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-09-17 13:35:07 +02:00
Developer 02
00545fdc50 chore: Auto-update min.css after merge 2024-09-17 11:31:25 +02:00
Developer 02
d80e511b08 chore: Auto-update min.css after merge 2024-09-17 11:22:03 +02:00
Developer 02
7313355a83 merge: Integrate customer/CURSOR-Software-AG into master 2024-09-17 11:18:56 +02:00
Developer 02
66466dc865 fix: Sichtbarkeit des Zugangscodes-Formulars im Hochformatmodus auf Mobilgeräten
Das Problem behoben, bei dem das Zugangscodes-Formular im Hochformatmodus auf Mobilgeräten nicht sichtbar war. Die CSS-Stile wurden angepasst, um sicherzustellen, dass das Formular unabhängig von der Geräteausrichtung ordnungsgemäß angezeigt wird.
2024-09-17 11:09:21 +02:00
Developer 02
8cd8df4b02 feat: Unterschriftsdatum unter das Unterschriftsfeld verschoben 2024-09-17 10:17:16 +02:00
Developer 02
dd7454d38e feat: Separate CSS for Cursor company created
Eine separate CSS-Datei für das Unternehmen Cursor wurde erstellt. Die site.css wurde angepasst, um das Layout entsprechend dem Cursor-Logo responsiv zu gestalten.
2024-09-17 10:14:34 +02:00
Developer 02
f7c3ed280a merge: Master-Branch integriert 2024-09-17 00:52:34 +02:00
Developer 02
9ffeb7afe8 feat: UI für die Dokumentenunterzeichnungsseite verbessert
- Layout modernisiert und responsiver gestaltet.
- Button-Stile und Farbschemata aktualisiert.
- Verbesserte Ausrichtung von Text und Symbolen für mehr visuelle Klarheit.
- Fokus auf die Verbesserung der Benutzererfahrung beim Unterzeichnen von Dokumenten.
2024-09-17 00:38:37 +02:00
Developer 02
a83994af43 feat: Google Fonts und Google Icons hinzugefügt; CSP-Anpassungen vorgenommen
- Google Fonts und Google Icons in das Projekt integriert.
- Content Security Policy (CSP) aktualisiert, um die Nutzung von Google Fonts und Google Icons zu ermöglichen.
2024-09-16 15:19:56 +02:00
Developer 02
8345034fcd refactor: Logo aktualisieren 2024-09-16 14:31:18 +02:00
Developer 02
a763d3c353 feat: Mehrsprachige Unterstützung für den Header hinzugefügt 2024-09-16 14:04:34 +02:00
Developer 02
5ba5d2755b feat: EnvelopeLocked Seite anpassen und Stile für Firmenbranding aktualisieren
- Die Datei `EnvelopeLocked.cshtml` wurde aktualisiert, um eine neue Willkommensnachricht, ein Logo und ein benutzerdefiniertes Kopfzeilen-Layout für das eSign-Portal aufzunehmen.
- Aktualisierungen der Lokalisierung hinzugefügt, um die korrekte Anzeige der ausgewählten Sprache und Flagge zu gewährleisten.
- Das Layout und die Abstände wurden angepasst, um besser mit den unternehmensspezifischen Designanforderungen übereinzustimmen.
- Modifizierte `site.css` für benutzerdefinierte Schaltflächenstile, Seitenlayout und fügte unternehmensspezifische Farben für die Markenkonsistenz hinzu.
2024-09-16 13:51:07 +02:00
Developer01
d6bcb8c43d MS Bisl design und Funktionalität 2024-09-12 16:59:06 +02:00
Developer01
2aa2064a67 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-09-11 14:52:03 +02:00
Developer01
f403d12073 MS Rebuild und diverses Customizing 2024-09-11 14:51:48 +02:00
Developer 02
b66c2f67da feat: Hinzufügen einer erweiterten Ansicht für die Tabelle im Envelope Generator
- In der Tabelle für Umschläge wurde ein versteckter Abschnitt unter den Zeilen hinzugefügt.
- Beim Klicken auf eine Zeile wird nun ein Detailbereich angezeigt, der Informationen zu Empfänger und Historie des Umschlags zeigt.
2024-09-09 17:30:36 +02:00
Developer 02
d084a4cd81 feat(component): initialisieren des HistoryTableComponent 2024-09-07 01:48:04 +02:00
Developer 02
5d2bf56493 feat(service): Unterstützung von Query-Parametern im HistoryService hinzugefügt
- Methode `getHistory` hinzugefügt, um das Abrufen von History-Daten mit optionalen Query-Parametern wie `envelopeId`, `referenceType`, `userReference`, `withSender` und `withReceiver` zu ermöglichen.
- Methode `getHistoryAsync` implementiert, um History-Daten mit async/await abzurufen.
- `Options`-Interface eingeführt, um optionale Query-Parameter für History-Anfragen zu definieren.
2024-09-07 01:41:19 +02:00
Developer 02
cd88f5c833 refactor(controller): Optimierung der Handhabung von Referenztypen im HistoryController
- `GetAllAsync`-Methode angepasst, um `withSender` oder `withReceiver` automatisch basierend auf dem `ReferenceType` zu setzen.
- Unnötigen `status`-Query-Parameter entfernt, um die API zu vereinfachen.
2024-09-07 01:32:09 +02:00
Developer 02
ab41e25071 feat: Referenztypen zwischen Backend und Frontend standardisieren
- `GetReferenceTypes`-Endpunkt im `HistoryController` hinzugefügt, um Key-Value-Paare des `ReferenceType`-Enums im camelCase-Format bereitzustellen.
- `ConfigurationService` in Angular erweitert, um die `ReferenceType`-Werte vom neuen API-Endpunkt abzurufen und zu speichern.
2024-09-07 01:12:50 +02:00
Developer 02
eb775da7d4 feat(service): HistoryService für API-Interaktionen erstellen 2024-09-07 00:37:54 +02:00
Developer 02
7bc2695da4 feat(controller): add GetAllAsync endpoint to HistoryController
- Added a new `GetAllAsync` method to HistoryController to retrieve envelope histories.
- Included query parameters for filtering by envelopeId, userReference, referenceType, status, and boolean flags for sender and receiver.
- Implemented validation of `referenceType` with `ReferenceType` enum, throwing an error for invalid values.
2024-09-07 00:08:55 +02:00
Developer 02
75fff426bc feat(HistoryController): HistoryController mit Logging und Envelope History Service Integration hinzugefügt 2024-09-06 16:43:42 +02:00
Developer 02
4172df4d78 refactor(EnvelopeTableComponent): onToggleExpandedRow Methode asynchron gemacht, um die Daten mit async/await zu handhaben 2024-09-06 16:38:15 +02:00
Developer 02
01856b61ef feat(EnvelopeReceiverService): Status-Filteroption zu ReadByUserAsync hinzugefügt, um die Ergebnisse nach Status zu filtern 2024-09-06 16:31:49 +02:00
Developer 02
2e32559132 feat(ReceiverStatusTableComponent): Schema für die Tabellenansicht hinzugefügt, einschließlich Name, Email und Zugangscode 2024-09-06 15:42:03 +02:00
Developer 02
9adb49df78 Refaktorisierung von EnvelopeReceiverService und EnvelopeReceiverController
- Methode `ReadSecretByUuidAsync` zu `EnvelopeReceiverService` hinzugefügt, um Geheimnisse anhand der UUID abzurufen.
- Fehlerbehandlung und Protokollierung in den Methoden von `EnvelopeReceiverService` verbessert, einschließlich besserer Handhabung von Sicherheitsvorfällen und Datenintegritätsproblemen.
- `VerifyAccessCodeAsync` aktualisiert, um explizite Nachrichten für Sicherheitsvorfälle und Datenintegritätsprobleme zu enthalten.
- `EnvelopeReceiverController` aktualisiert, um einen neuen Endpunkt `GetSecretAsync` zum Abrufen von Geheimnissen anhand der UUID einzuführen.
- Fehlerbehandlung und Protokollierung in den Methoden von `EnvelopeReceiverController` verbessert.
- Endpunkte angepasst, um die neue Methode `ReadSecretByUuidAsync` in der Servicelogik zu nutzen.
2024-09-06 15:19:18 +02:00
Developer 02
18e21b0a8e feat: Füge EnvelopeReceiverSecretDto zur Handhabung von Zugangscodes hinzu 2024-09-06 14:06:03 +02:00
Developer 02
e1d7d0e141 feat(EnvelopeTableComponent): Methode onToggleExpandedRow hinzugefügt, um Empfänger anhand der Umschlag-UUID abzurufen und anzuzeigen 2024-09-06 13:52:47 +02:00
Developer 02
cfa40e640b feat(EnvelopeReceiverService): Methode getReceiverByEnvelope hinzugefügt, um Empfänger nach Umschlag-UUID abzurufen 2024-09-06 13:11:53 +02:00
Developer 02
cb0a45bc17 feat(EnvelopeReceiverController): füge Methode GetReceiverByEnvelopeAsync hinzu 2024-09-06 13:00:13 +02:00
Developer 02
c7b6e5bf24 feat(EnvelopeReceiverService): füge Methode ReadReceiverByEnvelopeAsync hinzu
- Neue Methode `ReadReceiverByEnvelopeAsync` zur `EnvelopeReceiverService`-Klasse hinzugefügt, um Empfänger anhand der Umschlag-UUID abzurufen.
- Die `EnvelopeReceiverService`-Klasse wurde angepasst, um das Mapping auf `ReceiverReadDto` für die neue Methode zu ermöglichen.
- Die Using-Anweisungen wurden aktualisiert, um das erforderliche DTO (`EnvelopeGenerator.Application.DTOs.Receiver`) für die neue Funktionalität einzubinden.
2024-09-06 12:45:03 +02:00
Developer 02
a9ca1b71eb feat(repository): ReadReceiverByEnvelope Methode zum EnvelopeReceiverRepository hinzugefügt
- Neue Methode ReadReceiverByEnvelope hinzugefügt, um Empfänger zu ermitteln, die mit einem bestimmten Umschlag (identifiziert durch UUID) verknüpft sind.
2024-09-06 12:08:42 +02:00
Developer 02
97f07bc72d feat(envelope): ReceiverStatusTable-Komponente unter Envelope-Tabelle hinzugefügt und Backend-Unterstützung integriert
- ReceiverStatusTableComponent als Unterkomponente der EnvelopeTable erstellt, um Empfängerstatus anzuzeigen.
- ReceiverStatusTable in EnvelopeTable mit Tabs und dynamischem Datenladen integriert.
- EnvelopeTable angepasst, um Empfängerdaten über den EnvelopeReceiverService abzurufen und in ReceiverStatusTable anzuzeigen.
- Backend aktualisiert, um das Abrufen von Umschlägen nach Benutzer zu unterstützen:
  - `ReadByUserAsync`-Methode im Envelope-Repository hinzugefügt, um Umschläge für einen bestimmten Benutzer abzufragen.
  - Servicemethode implementiert, um die abgefragten Umschläge in DTOs zu konvertieren und das Ergebnis zurückzugeben.
2024-09-06 11:32:39 +02:00
Developer 02
8753875d93 chore(envelope): ReceiverStatusTableComponent entfernt 2024-09-06 11:32:22 +02:00
Developer 02
3692aa80a4 feat(services): Hinzufügen des EnvelopeService zur Verarbeitung von API-Anfragen 2024-09-05 11:53:22 +02:00
Developer 02
b8b09ded5d refactor(api): Vereinfachung der GetCurrentAsync-Methode im EnvelopeController 2024-09-05 10:35:35 +02:00
Developer 02
5b8d8b9e55 refactor(api): Aktualisierung von ControllerExtensions zur Nutzung von ClaimsPrincipal anstelle von ControllerBase
- Refactoring der Erweiterungsmethoden, sodass sie auf `ClaimsPrincipal` anstatt auf `ControllerBase` basieren.
- Alle Verweise und Verwendungen dieser Erweiterungsmethoden im gesamten Code aktualisiert.
- Dies verbessert die Flexibilität und entkoppelt das Abrufen von Benutzeransprüchen von den Controllern.
2024-09-05 10:24:00 +02:00
Developer 02
e3fbf4fc77 feat(api): Hinzufügen des EnvelopeControllers mit GetCurrentAsync-Methode zur Umschlagabfrage
- Implementierung des `EnvelopeController` in der Route `api/envelope` mit der Methode `GetCurrentAsync`, um Umschläge basierend auf der Benutzer-ID abzurufen.
- Fehlerbehandlung hinzugefügt, wenn die Benutzer-ID keine Ganzzahl ist, mit einem möglichen Problem bei der Erstellung der Claims-Liste.
2024-09-05 10:15:36 +02:00
Developer 02
8d680992b7 refactor: Selector von EnvelopeTableComponent umbenannt und ReceiverStatusTable integriert
- Selector von `EnvelopeTableComponent` von `app-envelope-table` auf `envelope-table` umbenannt für Konsistenz.
- `<receiver-status-table>` in die `EnvelopeTableComponent` integriert, um Empfängerstatusdaten anzuzeigen.
2024-09-04 16:55:58 +02:00
Developer 02
01247f73f4 refactor: Bibliotheksreferenzen nach Umstrukturierung der Tabellenkomponenten aktualisiert 2024-09-04 16:34:39 +02:00
Developer 02
6a7a3dcb90 refactor: Bibliotheksreferenzen nach Umstrukturierung der Tabellenkomponenten aktualisiert
- Referenzen für einige Bibliotheken angepasst, um die neue Verzeichnisstruktur unter `/tables` zu unterstützen.
- Importpfade entsprechend der Verschiebung der Tabellenkomponenten aktualisiert.
2024-09-04 16:20:06 +02:00
Developer 02
2fbfbb4eb6 feat: ReceiverStatusTable erstellt und Tabellen unter /tables organisiert
- Neue `ReceiverStatusTable`-Komponente zur Anzeige von Empfängerstatus-Daten erstellt.
- Alle bestehenden Tabellenkomponenten unter das Verzeichnis `/tables` verschoben, um die Projektstruktur zu verbessern und die Wartbarkeit zu erhöhen.
2024-09-04 16:16:50 +02:00
Developer 02
f88b5d2733 feat: Erweiterbare Zeilen in EnvelopeTableComponent aktiviert und mat-tab-Komponente integriert
- Aktiviert die Unterstützung für erweiterbare Zeilen in der `EnvelopeTableComponent` durch Setzen der `isExpandable`-Option auf `true`.
- Integriert die `mat-tab-group`-Komponente innerhalb der erweiterten Zeilen für eine bessere Darstellung von Tab-Inhalten.
- Hinzugefügt: Zwei Tabs ("Emfänger" und "History") für die Anzeige von zusätzlichen Informationen in den erweiterten Zeilen.
2024-09-04 15:14:10 +02:00
Developer 02
363358aaa1 feat: Implementieren und integrieren von wiederverwendbaren Angular Material-Tabellenkomponenten
- Erstellen der `DDTable`-Komponente für dynamische Angular Material-Tabellen mit Unterstützung für erweiterbare Zeilen, Filterung, Sortierung und Pagination.
- Ersetzen der bestehenden Tabellenimplementierung in `EnvelopeTableComponent` durch die `DDTable`-Komponente für verbesserte Funktionalität und Wartbarkeit.
- Aktualisieren der `EnvelopeTableComponent`, um `DDTable` für die Anzeige von Umschlagdaten zu verwenden, einschließlich Filter- und Paginierungsoptionen.
- Implementieren von `ClearableInputComponent` für eine verbesserte Filtererfahrung.
- Anpassen des Datenabrufs und -handlings, um die Integration von `DDTable` zu berücksichtigen.
- Verbessern der `EnvelopeTableComponent` mit ordnungsgemäßen Animationstriggern für erweiterbare Zeilen.
2024-09-04 14:58:48 +02:00
Developer 02
7444eeba2a feat(envelope): Envelopes-Datenquelle und Initialisierung angepasst
- `EnvelopeTypeService` und `EnvelopeTypeController` hinzugefügt, um Envelope-Typen im Cache zu speichern und bereitzustellen.
- `ConfigurationService` erstellt und mit `APP_INITIALIZER` konfiguriert, um Envelope-Typen bei der Anwendungserstellung zu laden.
- `EnvelopeTableComponent` aktualisiert, um Envelope-Typen aus der Konfiguration zu verwenden, anstatt hartkodierte Werte zu nutzen.
2024-09-02 14:48:20 +02:00
Developer 02
e9d686a4c1 fix(receiver-table): Problem mit automatischer Anredezuweisung für den ersten hinzugefügten Empfänger behoben
- Bedingung in der Funktion `receiver_filter` aktualisiert, um den Indexwert korrekt zu überprüfen.
2024-09-02 10:48:24 +02:00
Developer 02
939ba1bb47 feat: Sortierung der Tabelle hinzugefügt 2024-08-30 23:38:02 +02:00
Developer 02
d5de868eb9 feat: added filter and paginator 2024-08-30 23:25:22 +02:00
Developer 02
6e3bb6c3a0 feat: Enhance receiver input and table components
- Updated `ReceiverInputComponent` to support optional index parameter in the `filter` function to manage email input logic more effectively.
- Added `last_used_name` functionality in `ReceiverTableComponent` to auto-fill names based on the last used email name.
- Implemented email duplication prevention logic in `ReceiverTableComponent` to ensure unique email inputs.
- Refactored component lifecycle methods and data handling for improved performance and user experience.
2024-08-30 22:25:13 +02:00
Developer 02
d347ec420c feat: ReadAllAsync-Methode zur ReceiverRepository hinzugefügt
- `ReadAllAsync`-Methode hinzugefügt, um alle `Receiver`-Entitäten asynchron zurückzugeben.
- Stellt sicher, dass alle Empfänger abgerufen werden, während die vorhandene Abfragelogik mit `ReadBy` erhalten bleibt.
2024-08-30 11:58:00 +02:00
Developer 02
a011b677ea refactor: EnvelopeReceiver-Klasse refaktoriert, um eine Endlosschleife zu verhindern und die Datenabfrage zu verbessern
- `EnvelopeReceiver` in `EnvelopeReceiver` und `EnvelopeReceiverBase` aufgeteilt, um zirkuläre Abhängigkeiten zu vermeiden.
- `EnvelopeReceiverBasicDto` für vereinfachte Datenübertragungsobjekte erstellt.
- `ReceiverRepository` aktualisiert, um den zuletzt verwendeten Empfängernamen durch das Laden aktueller `EnvelopeReceiver`-Daten einzubeziehen.
- `ReceiverReadDto` angepasst, um `LastUsedName` zu erhalten und `EnvelopeReceivers` für die JSON-Serialisierung zu ignorieren.
2024-08-30 11:27:36 +02:00
Developer 02
8831436809 feat(controller): add endpoint to retrieve last used receiver name by email
- Implemented `Get` endpoint in `EnvelopeReceiverController` to fetch the last used receiver's name by email.
- Added handling for successful and failed responses, including proper status codes and logging.
2024-08-29 17:15:00 +02:00
Developer 02
1ededc1f64 feat(service): add ReadLastUsedReceiverNameByMail method to IEnvelopeReceiverService and EnvelopeReceiverService
- Added `ReadLastUsedReceiverNameByMail` method to `IEnvelopeReceiverService` interface.
- Implemented `ReadLastUsedReceiverNameByMail` method in `EnvelopeReceiverService` to retrieve the last used receiver's name by email and handle results with `DataResult`.
2024-08-29 16:57:45 +02:00
Developer 02
183c94fd0a Merge branch 'master' into feat/signFlow-gen 2024-08-29 16:49:30 +02:00
Developer 02
8629599f86 fix: aktualisiere TestReceiverController zur Verwendung von CRUDControllerBase und entferne unnötige Pakete
- Ersetze TestControllerBase durch CRUDControllerBase im TestReceiverController
- Aktualisiere generische Typen auf ReceiverCreateDto, ReceiverReadDto und ReceiverUpdateDto
- Entferne nicht benötigte Pakete aus dem Projekt
2024-08-29 16:42:48 +02:00
Developer 02
a0a5568d93 feat(repository): Methode ReadLastByReceiver zu IEnvelopeReceiverRepository und EnvelopeReceiverRepository hinzugefügt
- Methode `ReadLastByReceiver` zum Interface `IEnvelopeReceiverRepository` hinzugefügt.
- Methode `ReadLastByReceiver` in `EnvelopeReceiverRepository` implementiert, um den letzten `EnvelopeReceiver` anhand der E-Mail-Adresse abzurufen.
2024-08-29 16:04:19 +02:00
Developer 02
d166ae5a8b Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-08-29 15:48:53 +02:00
Developer 02
145d139e3a fix(auth): Aktualisierung der Authentifizierungsstatusbehandlung
- Methode `logInOut` aktualisiert, um nach dem Logout zu `/login` zu navigieren.
- Methoden `login` und `logout` angepasst, um `#IsAuthenticated` basierend auf der Antwort zu aktualisieren.
- Sicherstellung, dass der Authentifizierungsstatus nach Login und Logout korrekt gesetzt wird.
2024-08-29 15:46:20 +02:00
Developer01
d3ce34ee31 MS TryCatchBlock Finalize Documents For Each 2024-08-28 11:14:46 +02:00
Developer01
fd61d4431f Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-08-28 11:14:13 +02:00
Developer 02
93417d1b37 fix: Den Text des Navbar-Brand von "SignFlow" auf "signFlow" geändert, um eine konsistente Gestaltung zu gewährleisten. 2024-08-23 10:58:54 +02:00
Developer 02
ca3ea36a83 chore: Favicon aktualisieren 2024-08-23 10:57:23 +02:00
Developer 02
c59d9bbf57 chore: Favicon aktualisieren 2024-08-23 10:54:13 +02:00
Developer 02
0cf1cd10c0 fix: UUID-Generierung und Typdeklarationsprobleme beheben
- `crypto.randomUUID()` durch `uuid.v4()` ersetzt, um die Kompatibilität über verschiedene Node.js-Versionen hinweg zu verbessern.
- Das `uuid`-Paket installiert und Typdeklarationen mit `@types/uuid` hinzugefügt, um TypeScript-Fehler zu beheben.
- Die Funktion `generateAccessCode` aktualisiert, um die `uuid`-Bibliothek zur UUID-Generierung zu verwenden.
2024-08-23 01:21:38 +02:00
Developer 02
1da73d1754 chore: Client-App-Dateien unter wwwroot aktualisiert
- Client-App-Dateien im Verzeichnis `wwwroot` aktualisiert, um die neuesten Änderungen und Verbesserungen widerzuspiegeln.
2024-08-23 00:57:10 +02:00
Developer 02
24037f8366 feat: Navbar mit zusätzlichem Button und Icons aktualisiert
- Neuer "Umschläge"-Button zur Navbar hinzugefügt, um die Navigation zur Startseite zu erleichtern.
- Icon des "Neuer Umschlag"-Buttons zu "forward_to_inbox" geändert für eine bessere visuelle Darstellung.
2024-08-23 00:51:18 +02:00
Developer 02
91b891513f fix: Platzhaltertext für Dateiupload in der Envelopes-Erstellungstabelle aktualisiert
- Platzhaltertext von "No file uploaded yet." zu "Noch keine Datei hochgeladen." für bessere Lokalisierung geändert.
2024-08-23 00:41:22 +02:00
Developer 02
e7d1f1574f refactor: Komponenten-Namen vereinfacht und Envelopes-Seite der '\' Route zugewiesen
- Komponenten-Namen zur besseren Lesbarkeit vereinfacht
- Envelopes-Seite der '\' Route für einfachere Navigation zugewiesen
2024-08-23 00:37:56 +02:00
Developer 02
80a3a26af8 feat: EnvelopeCreationComponent mit neuen Formularelementen und Datei-Upload-Schritt aktualisiert
- `isLinear` und `titelControl` als @Input-Eigenschaften in `EnvelopeCreationComponent` hinzugefügt
- Datei-Upload-Funktionalität mit visueller Rückmeldung für ausgewählte Dateien implementiert
- Mat-stepper refaktoriert, um den neuen Datei-Upload-Schritt einzubeziehen
- Design durch Hinzufügen von Symbolen zu den 'Weiter'-Buttons in jedem Schritt verbessert
2024-08-23 00:26:09 +02:00
Developer 02
9905ea5a12 feat: Symbole zu den Weiter-Buttons in den Envelope Creation Schritten hinzufügen 2024-08-22 23:10:12 +02:00
Developer 02
a7a77cd491 feat: Zugangscode-Generierung zu ReceiverTableComponent hinzufügen
- `generateAccessCode` Funktion implementiert, um einen eindeutigen Zugangscode zu generieren
- Zugangscode-Generierung in die `receiver_filter` Funktion integriert
- `receiver_filter` aktualisiert, um einen generierten Zugangscode der letzten Zeile zuzuweisen, wenn ein neuer Empfänger hinzugefügt wird
- Dynamisches Zeilenmanagement basierend auf Eingabeveränderungen verbessert
2024-08-22 22:53:29 +02:00
Developer 02
f795b1447f feat: ClearableInputComponent hinzufügen und in ReceiverTableComponent integrieren
- `ClearableInputComponent` erstellt mit einer Löschen-Schaltfläche für Texteingaben
- `ClearableInputComponent` in `ReceiverTableComponent` integriert, um dynamische Eingabefelder zu verwalten
- `receiver-table.component.html` aktualisiert, um `ClearableInputComponent` für das Feld 'Anrede Email' zu verwenden
2024-08-22 22:34:07 +02:00
Developer 02
e5e12bfb61 feat: Löschen-Schaltfläche zur ReceiverInputComponent hinzufügen und Verwaltung der Empfängerdaten aktualisieren
- Löschen-Schaltfläche zur `ReceiverInputComponent` hinzugefügt, um den Texteingang zu leeren
- Logik in `receiver_filter` implementiert, um eine leere Zeile hinzuzufügen, wenn ein neuer Empfänger hinzugefügt wird, und Zeilen zu entfernen, wenn Eingaben gelöscht werden
- Verwaltung der `receiverData` aktualisiert, um dynamische Hinzufügung und Entfernung von Zeilen basierend auf Eingaben zu berücksichtigen
2024-08-22 20:15:03 +02:00
Developer 02
6a8baf08ed feat: ReceiverInputComponent zu ReceiverTableComponent hinzufügen
- `ReceiverInputComponent` für E-Mail-Eingabe mit Autocomplete erstellt
- `ReceiverInputComponent` in `ReceiverTableComponent` integriert
- `ReceiverInputComponent` mit Eingabeoptionen für E-Mail-Adressen konfiguriert
2024-08-22 18:24:09 +02:00
Developer 02
10ac34a9f7 refactor: ReceiverInputComponent in ReceiverTableComponent umbenennen und in das Verzeichnis components verschieben 2024-08-22 17:40:14 +02:00
Developer 02
72af1cc2a2 refactor: nicht verwendete Filtermethode aus der Receiver-Input-Komponente entfernen 2024-08-22 17:18:17 +02:00
Developer 02
cd32ae2a35 feat: neuen Receiver-Input-Komponente mit Autocomplete und Tabellenanzeige hinzufügen
- Implementierung der `ReceiverInputComponent` mit Angular Material Autocomplete und Tabelle
- Abruf und Filterung von E-Mail-Adressen aus `ReceiverService`
- Anzeige des E-Mail-Inputs mit Autocomplete-Optionen und einer Datentabelle
- Integration der `ReceiverInputComponent` in den `envelope-creation` Formularschritt
2024-08-22 17:04:46 +02:00
Developer 02
ddc0c9c6f3 feat: DELETE-Anforderungsmethode zu API-Diensten im Angular-Frontend hinzufügen 2024-08-21 18:13:32 +02:00
Developer 02
489c2a2a9f refactor: Receiver-Update-Endpunkt entfernen durch Überschreiben und Hinzufügen des [NonAction]-Attributs 2024-08-21 18:02:09 +02:00
Developer 02
320e81719b feat: HTTP-Anforderungsdienste mit HttpClient im Frontend implementieren 2024-08-21 17:59:55 +02:00
Developer 02
66a8471f05 refactor: Code in Regionen für entfernte Endpunkte organisieren 2024-08-21 17:16:44 +02:00
Developer 02
c7a4ef4722 fix: Füge try-catch-Blöcke zur Fehlerbehandlung in der Delete-Methode und dem Service hinzu 2024-08-21 17:14:06 +02:00
Developer 02
1673ea81df fix: Füge try-catch-Blöcke zur Fehlerbehandlung in der Delete-Methode und dem Service hinzu 2024-08-21 17:09:16 +02:00
Developer 02
306956a7be feat: Löschen nach E-Mail oder Signatur zur Delete-Methode und zum Service hinzugefügt
- Die `Delete`-Methode im Controller aktualisiert, um das Löschen nach `id`, `emailAddress` oder `signature` zu unterstützen.
- `DeleteByAsync`-Methode im Service hinzugefügt, um Datensätze basierend auf `emailAddress` und `signature` zu löschen.
- Fehlerbehandlung mit Protokollierung für fehlgeschlagene Löschversuche verbessert.
2024-08-21 16:37:54 +02:00
Developer 02
bfe3d38ecc fix: E-Mail-Formatvalidierung zu ReceiverCreateDto hinzugefügt und Modellvalidierung im Create-Methoden behandelt
- `[EmailAddress]`-Attribut auf `EmailAddress` in `ReceiverCreateDto` angewendet, um das E-Mail-Format zu validieren.
- `ModelState.IsValid`-Überprüfung zur `Create`-Methode hinzugefügt, um Validierungsfehler vor dem Aufruf der Basis-`Create`-Methode zu behandeln.
2024-08-21 16:19:18 +02:00
Developer 02
6e5bb58f65 feat: E-Mail-Formatvalidierung in der Receiver-Entität mit [EmailAddress]-Attribut hinzugefügt 2024-08-21 15:10:07 +02:00
Developer 02
b96c6c10f8 feat: Filterung nach emailAddress und signature im Receiver-Repository, -Service und -Controller hinzugefügt
- `ReadBy`-Methode im Receiver-Repository implementiert, um nach `emailAddress` und `signature` zu filtern.
- `ReadByAsync`-Methode im Receiver-Service hinzugefügt, um Receiver-Daten abzurufen und zuzuordnen.
- Controller-`Get`-Endpunkt aktualisiert, um optionale `emailAddress` und `signature` Query-Parameter für die Filterung zu unterstützen.
- Fehlerbehandlung mit Protokollierung für fehlgeschlagene Service-Operationen im Controller hinzugefügt.
2024-08-21 15:05:18 +02:00
Developer 02
afedfdd596 refactor: Receiver-Service in CRUD-Service umgewandelt und DTOs aktualisiert
- Receiver-Service von einfachem CRUD zu generischem CRUD-Service umgewandelt.
- `ReceiverDto` in `ReceiverReadDto` umbenannt.
- Neues `ReceiverCreateDto` mit automatischer SHA-256-Signaturerstellung und aktuellem Zeitstempel erstellt.
- Leeres `ReceiverUpdateDto` für zukünftige Updates hinzugefügt.
2024-08-21 14:37:45 +02:00
Developer 02
3a7099feb4 fix: Füge required-Attribut zu Receiver-Eigenschaften hinzu 2024-08-21 11:29:39 +02:00
Developer 02
c704d222f0 fix: Beseitige Duplikation von formControlName="firstCtrl" 2024-08-21 11:27:17 +02:00
Developer 02
83ce528e2f feat: Füge Eingaben für die Umschlagstabelle und Statusfilteroptionen hinzu
- `data`, `displayedColumns` und `schema` wurden als `@Input`-Eigenschaften für die Umschlagstabelle hinzugefügt.
- `min`, `max` und `ignore` Statusfilter wurden als Objekt-Eingaben für Statusbeschränkungen eingeführt.
- Die Methode `getEnvelopeReceiver` wurde aktualisiert, um Statusfilter über Abfrageparameter zu unterstützen.
- `getEnvelopeReceiverAsync` wurde für die Promise-basierte Verarbeitung von Status-gefilterten Anfragen hinzugefügt.
- Die Umschlag-Tab-Konfiguration wurde geändert, um Statusfilter dynamisch anzuwenden.
2024-08-21 11:13:31 +02:00
Developer 02
9cc15f9beb feat: Envelope-Status-Enum erstellt 2024-08-21 09:13:57 +02:00
Developer 02
d323244157 feat: Füge Abfrageparameter zum GetEnvelopeReceiver-Endpunkt hinzu
- Optionale Abfrageparameter hinzugefügt: min_status, max_status und ignore_status.
- ignore_status standardmäßig auf ein leeres Array gesetzt, wenn nicht bereitgestellt.
- Aktualisierte _erService.ReadByUsernameAsync-Methode, um neue Parameter einzuschließen.
- Bestehende Fehlerbehandlung und Protokollierung beibehalten.
2024-08-20 16:15:11 +02:00
Developer 02
56d35c65bb feat: ReadByUsernameAsync-Methode im Service aktualisiert, um Statusfilter zu unterstützen
- `ReadByUsernameAsync` Methode angepasst, um zusätzliche Parameter `min_status`, `max_status` und `ignore_statuses` zu integrieren.
- Die Methode ruft jetzt die aktualisierte Repository-Methode auf, um Umschläge basierend auf Statusfiltern abzurufen.
- DTO-Zuordnung und Erfolgsrückgabe beibehalten.
2024-08-20 12:30:17 +02:00
Developer 02
15eabfc834 feat: ReadByUsernameAsync-Methode erweitert, um Statusfilter hinzuzufügen
- `ReadByUsernameAsync` aktualisiert, um optionale Parameter `min_status`, `max_status` und `ignore_statuses` zu unterstützen.
- Abfrage optimiert, um Umschläge basierend auf Statuswerten zu filtern.
- Ermöglicht das Abrufen von Umschlägen mit spezifischen Statusbereichen oder das Ignorieren bestimmter Status.
2024-08-20 11:28:25 +02:00
Developer 02
11e8c46e44 feat: Umschlag-Erstellungskomponente erstellt und Angular Material Stepper initialisiert 2024-08-20 09:35:00 +02:00
Developer 02
a14bd78415 feat: Navigationsleiste angepasst, Logout- und Neuen-Umschlag-Button hinzugefügt
- Navigationsleiste überarbeitet und das Layout optimiert.
- Logout-Button hinzugefügt, um den Benutzern das Abmelden zu erleichtern.
- Button für das Erstellen eines neuen Umschlags hinzugefügt, um die Benutzerfreundlichkeit zu verbessern.
2024-08-19 16:43:24 +02:00
Developer 02
609f7d09fc feat: Bootstrap zur Projektstruktur hinzugefügt 2024-08-19 13:32:14 +02:00
Developer 02
4c21cb4ba7 feat: Zeilen-Erweiterungsfunktion zur EnvelopeTableComponent hinzugefügt 2024-08-19 11:48:45 +02:00
Developer 02
00ebf45605 refactor: Aktualisierung von EnvelopeTableComponent zur Verwendung der Angular Material Tabelle
- Ersetzte `@generic-ui/ngx-grid` durch Angular Material Tabellenkomponenten.
- Aktualisierte `EnvelopeTableComponent`, um `mat-table` für die Tabellenanzeige zu verwenden.
- Umorganisierte Daten- und Schema-Definitionen zur Kompatibilität mit Angular Material Tabelle.
- Füge `MatTableModule` und `CommonModule` zu den Komponenten-Imports hinzu.
- Implementierte dynamische Spaltenanzeige basierend auf dem Schema.
- Hinzugefügt `updateTable` Methode zur erneuten Darstellung der Tabelle.
2024-08-19 09:41:01 +02:00
Developer 02
387777972b feat: Envelope Status Name geändert in Envelope Name mit contant.Status Enum. Diese Eigenschaft wurde zu envelope entitiy und dto hinzugefügt. Die angular Tabelle wurde entsprechend aktualisiert. 2024-08-15 18:13:51 +02:00
Developer 02
b7569982ff chore: Dateireferenzen durch NuGet-Pakete in der User Manager-Assembly ersetzt 2024-08-15 14:25:16 +02:00
Developer 02
d6be88b61d chore: Content Security Policy (CSP) aktualisiert 2024-08-15 13:06:39 +02:00
Developer01
8e454a0419 MS 2024-07-30 16:24:19 +02:00
Developer 02
f8932e14c0 fix: z-index-Problem für #flex-action-panel, um sicherzustellen, dass es über anderen Elementen angezeigt wird. 2024-07-25 17:19:49 +02:00
Developer 02
812bf9b25a fix: Korrigiere falsche DOM-Element-ID von flex-actio-panel auf flex-action-panel 2024-07-25 17:13:11 +02:00
Developer 02
0d591d5350 chore: PSPDFKit von Version 2023.5.2 auf 2024.3.2 aktualisiert 2024-07-25 17:11:01 +02:00
Developer 02
c9712af73e fix: asp-append-version aus dem PSPDFKit-Skript-Tag entfernt, um Browser-Cache zu ermöglichen; Versionierung im Pfad sorgt für automatische Updates 2024-07-25 16:55:20 +02:00
Developer 02
da483706b1 chore: PSPDFKit Versionen 2023.5.2 und 2024.3.2 separat hinzugefügt, weiterhin 2023.5.2 verwenden 2024-07-25 16:51:20 +02:00
Developer 02
4b600cb190 chore: Initialize versioning for envelope-generator-ui (Angular) 2024-07-25 16:25:47 +02:00
Developer 02
25a56a22fa release: Version 1.0.0.2 auf 1.0.0.3 erhöht 2024-07-22 11:51:02 +02:00
Developer 02
4e81f0949c fix(pspdfkit): Inline-Worker stoppen und aus CSP entfernen 2024-07-22 11:20:38 +02:00
Developer 02
18e79cf516 update(site.css): für eine responsivere Seite px in rem umgewandelt 2024-07-22 10:36:35 +02:00
Developer 02
fad0a6070c refactor(_Layout.cshtml.css): convert px to rem units 2024-07-22 10:07:44 +02:00
Developer 02
755fcfeef2 refactor(site.css): convert px to rem units 2024-07-22 10:01:09 +02:00
Developer01
40739b598b MS SignatureLink 2024-07-22 09:46:48 +02:00
Developer 02
9782503d1d Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-07-18 17:23:31 +02:00
Developer 02
35ced9b9ad feat: Hinzufügen der detaillierten aktuellen Uhrzeit mit Zeitzoneninformation im Format "dd.mm.yyyy, hh:mm:ss GMT+X". 2024-07-18 17:21:54 +02:00
Developer 02
9b28c0a1d1 chore: Minifizierte Versionen der JS- und CSS-Dateien hinzugefügt. 2024-07-18 15:50:47 +02:00
Developer 02
fd19c5be58 feat: Minifizierte Versionen aller JS- und CSS-Dateien erstellt. 2024-07-18 15:07:39 +02:00
Developer01
58b13e233c MS 2024-07-18 14:50:20 +02:00
Developer01
ce55066208 Ms Optimierung 2024-07-18 14:49:28 +02:00
Developer 02
7d582d2422 feat: Regulären Ausdruck zur Überprüfung der Stadt im Frontend hinzugefügt. 2024-07-18 14:13:33 +02:00
Developer 02
fe1d553a8d Reapply "Version von 1.0.0.1 auf 1.0.0.2 erhöht."
This reverts commit 9867e81220.
2024-07-18 11:56:42 +02:00
Developer 02
99c05a44f5 fix: CSS-Stil für die mail-link Klasse angepasst: Links sind nun blau und haben keine Unterstreichung. Aktivierung der href-Eigenschaft, die zuvor durch den Sanitizer entfernt wurde. 2024-07-18 11:56:19 +02:00
Developer 02
678360953d Hinzufügen eines neuen Werts für den Titel des Signierungsprozesses zur Ansicht show-envelope. 2024-07-18 11:37:14 +02:00
Developer 02
9867e81220 Revert "Version von 1.0.0.1 auf 1.0.0.2 erhöht."
This reverts commit 49cfc3c044.
2024-07-18 11:17:22 +02:00
Developer 02
49cfc3c044 Version von 1.0.0.1 auf 1.0.0.2 erhöht. 2024-07-18 10:54:20 +02:00
Developer 02
43ae15b71c Refaktorierung für HTML-Sanitization mit neuer Sanitizer-Klasse.
- Bestehende Sanitization überarbeitet.
- Injektionsmethode für flexible Konfiguration implementiert.
- Wichtige Abschnitte in `show-envelope` hervorgehoben.
2024-07-18 10:52:39 +02:00
Developer 02
1c2df71e0f fix: Viewport-Meta-Tag aktualisiert, um Skalierungsoptionen für eine bessere Layout-Kontrolle einzuschränken. 2024-07-17 17:20:41 +02:00
Developer 02
a806ec27db fix: Version updated from 1.1.0 to 1.1.0.1. 2024-07-17 15:57:51 +02:00
Developer 02
14bd2e22fc feat: Developed markFieldAsRequired and isFieldRequired methods to mark and validate required form fields; added user alert if location information is not provided. 2024-07-17 15:52:04 +02:00
Developer 02
f94728bf67 fix: Ort und Datum Informationen wurden horizontal ausgerichtet. 2024-07-17 14:11:20 +02:00
Developer 02
caeaf1774e feat: Alertify hinzugefügt. 2024-07-17 14:04:35 +02:00
Developer 02
1388b40a6b feat: isMobile-Methode mit Lazy Loading implementiert; Standortinformationen für mobile Browser auf readonly gesetzt. 2024-07-17 13:22:43 +02:00
Developer 02
e44d5f644c fix: Breite von City von 0,75 auf 1,2 erhöht. 2024-07-17 12:32:08 +02:00
Developer 02
fe9fd3024e refactor: Datum und Ort vertauscht. 2024-07-17 12:20:26 +02:00
Developer 02
b664e35b11 fix: Postleitzahl entfernt. 2024-07-17 12:00:50 +02:00
Developer 02
a77a31121f fix: Datum als readonly festgelegt. 2024-07-17 11:57:52 +02:00
Developer 02
381de6b554 fix: createText-Variable entfernt. 2024-07-17 11:47:40 +02:00
Developer 02
13bd727b3e feat: Configure project file for versioning and packaging; updated file and assembly versions from 1.0.0.0 to 1.1.0.0. 2024-07-16 15:58:10 +02:00
Developer 02
9021291aef Hinzufügen einer Bedingung zum Entfernen von Komponenten aus der Ignorierliste 2024-07-16 14:26:41 +02:00
Developer 02
8bd7ab13d0 Liste für ignorierte Etiketten erstellt und zu den Diensten hinzugefügt. 2024-07-16 13:55:36 +02:00
Developer 02
8eefd94569 Hinzufügen von Beschriftungen mit schreibgeschütztem PSPDF Kit-Textformularfeld. Statische PSPDF-Kit-Instanz erstellt. 2024-07-05 17:15:51 +02:00
Developer 02
b3b2baf0e4 Revert "PSPDFKit von 2023.5.2 auf 2024.3.2 aktualisiert."
This reverts commit c91446c5ac.
2024-07-05 10:05:28 +02:00
Developer 02
836380048a Reapply "Endpunkt "EncodeEnvelopeReceiverId" zum Test-Controller hinzugefügt."
This reverts commit f105aaa567.
2024-07-05 10:04:49 +02:00
Developer 02
f105aaa567 Revert "Endpunkt "EncodeEnvelopeReceiverId" zum Test-Controller hinzugefügt."
This reverts commit b615446274.
2024-07-05 10:00:54 +02:00
Developer 02
6238d66ca2 Getrennte Datumsauswahl, Postleitzahl und Stadtfelder hinzugefügt. 2024-07-05 01:37:11 +02:00
Developer 02
7e325a7eb6 Proxy-Konfiguration außerhalb von src verschoben. EmailProfilerDispatcher nuget hinzugefügt und Referenzen aktualisiert. 2024-07-04 10:34:46 +02:00
Developer 02
c91446c5ac PSPDFKit von 2023.5.2 auf 2024.3.2 aktualisiert. 2024-06-26 16:18:17 +02:00
eaf4cd773d Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-06-26 11:38:02 +02:00
8950482bac MS 2024-06-26 11:37:58 +02:00
Developer 02
b615446274 Endpunkt "EncodeEnvelopeReceiverId" zum Test-Controller hinzugefügt. 2024-06-26 10:47:04 +02:00
Developer 02
f276735b5c Referenzen für Common hinzugefügt. 2024-06-26 10:02:15 +02:00
Developer 02
31aa5829f6 Common-Projekt wurde zum Form-Projekt hinzugefügt. Content-Security-Policy wurde aktualisiert, um nominatim.openstreetmap.org zu erlauben. 2024-06-25 18:03:51 +02:00
27a5538229 Ms logging 2024-06-25 15:45:00 +02:00
322fb2fd7e MS 2024-06-25 13:28:17 +02:00
8e33094806 Merge commit 2024-06-25 13:28:03 +02:00
54b246f8e4 MS Sync Hakan 2024-06-25 13:26:35 +02:00
Developer 02
5c51ea679e Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-06-25 13:18:05 +02:00
Developer 02
e264a10a36 String-Lokalisierer für Model.resx im Common-Projekt hinzugefügt. 2024-06-25 13:07:02 +02:00
2f8aed8640 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-06-25 08:42:49 +02:00
29eac347c3 MS 2024-06-25 08:42:42 +02:00
Developer 02
dd6ab13e6e Hinzugefügt Localizer Dienste für beide api und angular 2024-06-24 15:55:27 +02:00
Developer 02
d94d9f045e Standardthema als FABRIC hinzugefügt 2024-06-24 13:29:58 +02:00
Developer 02
12bfcb1f25 Standard-Lokalisierer für generic-ui hinzugefügt. 2024-06-24 13:11:39 +02:00
Developer 02
63613f2073 Seitenverzeichnis hinzugefügt. Seite 'home' dorthin verschoben und Seite 'envelope' hinzugefügt. 2024-06-24 12:43:30 +02:00
Developer 02
1c11a0e8f0 Http-Interceptor hinzugefügt. 2024-06-24 11:56:49 +02:00
Developer 02
d376065246 Integrierte 'Core'-Nuget-Pakete. EnvelopeReceiver-Tabelle für Angular hinzugefügt. 2024-06-23 11:22:06 +02:00
Developer 02
4166dfde4b Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-06-20 11:45:20 +02:00
Developer 02
1bc43a5a77 Hinzufügen der Methode 'AddFormFieldValue' zum Hinzufügen von Datums- und Ortswerten im endgültigen Bericht. 2024-06-20 11:45:03 +02:00
Developer 02
33f4c6e489 Erstellt FormFieldValue für AnnotationData. 2024-06-19 14:12:26 +02:00
Developer 02
a4b880f1d2 pGDPictureLicenseKey als Variable hinzugefügt. 2024-06-19 12:35:46 +02:00
a7f38eafb2 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-06-19 11:16:45 +02:00
67a8506a37 MS Integrating ByteData to DB for SIG Documents 2024-06-19 11:16:32 +02:00
Developer 02
ecec1e1206 frmFinalisePDF als Startprojekt im Test zuweisen 2024-06-19 10:33:27 +02:00
Developer 02
854ed45abd Aktualisieren Sie die Position des Textfeldes Datum. 2024-06-19 09:19:14 +02:00
Developer 02
c0cece62af Entwicklung von Methoden zur Datums- und Ortserkennung. Fügen Sie "annotations" hinzu, damit der Benutzer das Datum und die Ortsangaben bei Bedarf aktualisieren kann. 2024-06-19 01:55:04 +02:00
Developer 02
408969d6dd Doppelte Operation in createAnnotations entfernt 2024-06-18 21:34:50 +02:00
Developer 02
9e019c0b69 eine separate createTextBox-Methode wurde als Teil des Signaturprozesses geschrieben, um die Stadt und das Datum zu schreiben 2024-06-18 21:27:52 +02:00
Developer 02
2f4ffac9c4 createSignatureAnnotation in 'Annotation' entfernt. 2024-06-18 19:55:57 +02:00
Developer 02
6464a591a8 'this'-Schlüsselwort in 'UI' durch 'UI' ersetzt, da dieser Schlüsselwort statisch ist. 2024-06-18 19:12:18 +02:00
Developer 02
56df8234c7 'this'-Schlüsselwort in 'Annotation' durch 'Annotation' ersetzt, da dieser Schlüsselwort statisch ist. 2024-06-18 19:11:07 +02:00
Developer 02
95958f2a1d Refaktorisierte 'UI'-Funktionen zu statischen Methoden 2024-06-18 19:01:40 +02:00
Developer 02
39cc257466 Refaktorisierte 'Annotation'-Funktionen zu statischen Methoden. 2024-06-18 18:58:56 +02:00
Developer 02
c4a66ee5bb UseCSPInDev als 'false' zugewiesen 2024-06-18 18:56:00 +02:00
Developer 02
cc3f6efbd7 Added EnvelopeReceiverService to web client application. 2024-06-18 11:09:13 +02:00
Developer 02
c0a6103eb2 Hinzufügen eines neuen Endpunkts zum EnvelopeReceiverController zum Abrufen von Umschlagempfängerdaten anhand des Benutzernamens mit Autorisierung und Protokollierung. 2024-06-17 11:58:17 +02:00
Developer 02
79bb454fd1 Die grundlegende ReadByUsernameAsync-Methode wurde sowohl dem Repository als auch dem Service, einschließlich Envelope und Receiver, hinzugefügt. 2024-06-17 11:19:35 +02:00
Developer 02
fc91a451f6 Erweiterungsmethoden hinzugefügt, um Benutzeransprüche in ControllerBase für ID, Benutzernamen, Namen, Vornamen und E-Mail abzurufen. 2024-06-17 10:46:41 +02:00
Developer 02
1efd241ab0 Die Service-Schnittstellen wurden überarbeitet, um den generischen Repository-Parameter zur Vereinfachung und besseren Lesbarkeit zu entfernen. 2024-06-15 01:04:58 +02:00
Developer 02
e8ff922726 Anmeldung über LDAP bereitgestellt. 2024-06-15 00:08:57 +02:00
Developer 02
8f3e72ae8b Nonce zum ENV_KEY-Skript hinzugefügt 2024-06-14 15:16:29 +02:00
Developer 02
9279f8e79a Aktualisierte Vererbung von EmailOutService. 2024-06-14 14:31:29 +02:00
Developer 02
1b2a316e5f Added triggers of EMAIL_OUT table to DBContext. 2024-06-14 14:20:31 +02:00
Developer 02
36d305a1e8 API_URL-Token erstellt und über Url-Dienst injiziert. 2024-06-14 11:58:19 +02:00
Developer 02
963a36acfa BaseHrefService hinzugefügt, um das Basis-href vom Dokument-Basis-Element abzurufen. 2024-06-14 10:52:54 +02:00
Developer 02
30ee71eaf5 Links und Css auf der Hauptseite bearbeitet. 2024-06-14 10:20:58 +02:00
Developer 02
5f161d81f2 Front-End-Authentifizierungsdienst und Authentifizierungswächter erstellt. 2024-06-13 17:01:38 +02:00
Developer 02
4d040959a5 Aktualisierung der Navigationsleiste und der Startseite. 2024-06-13 16:40:46 +02:00
Developer 02
5846a7433c Die Cookie-basierte Autorisierung wurde mit DirectorySearchService eingerichtet. 2024-06-13 16:12:07 +02:00
Developer 02
2f41a993ee Anmeldeformular erstellt 2024-06-13 11:42:02 +02:00
Developer 02
eac7454989 bootstrap installiert und hinzugefügt 2024-06-13 10:56:12 +02:00
Developer 02
8c767a73b4 Navbar hinzugefügt 2024-06-13 10:51:06 +02:00
Developer 02
9e33fc1d96 Startprofil für Angular-App erstellt. 2024-06-13 10:04:43 +02:00
Developer 02
23bf7579f6 ng-bootstrap-Paket hinzugefügt. 2024-06-13 09:51:43 +02:00
Developer 02
13b9394073 Angular Material mit Indigo/Pink-Theme, Animationsmodul und globalen Angular Material-Typografiestilen hinzugefügt. 2024-06-13 09:50:02 +02:00
Developer 02
af27163b08 Neues Angular-Projekt mit CLI v17 initialisiert. ngx-grid, Fabric und Hermes installiert. 2024-06-13 09:43:29 +02:00
Developer 02
155726a6b0 angular app entfernt 2024-06-13 09:15:44 +02:00
Developer 02
9f8142a5d6 Favicon.ico aktualisieren 2024-06-12 17:09:58 +02:00
Developer 02
0f97c325cf Refactored Comp Klasse zur Aufnahme der geschachtelten ActPanel Klasse mit Lazy-Initialisierung und hinzugefügten Methoden zum Umschalten der Sichtbarkeit. Konfigurierte Comp.ActPanel.Toggle() so, dass die Schaltflächen ausgeblendet werden, wenn Anmerkungen geöffnet werden, und sichtbar sind, wenn Anmerkungen geschlossen werden, über addEventListener("annotations.willChange", e). 2024-06-12 16:27:34 +02:00
Developer 02
7961fcbf0f Hinzufügen der Möglichkeit, Aktionsschaltflächen auszublenden, wenn das Unterschriftenfeld geöffnet wird 2024-06-12 15:34:54 +02:00
Developer 02
a1d251d705 Comp-Klasse hinzugefügt, um DOM-Komponenten effizient zu cachen und zu verwalten. 2024-06-12 13:36:00 +02:00
Developer 02
07ad18eccb Anzeigeprobleme der Schaltflächen auf Mobilgeräten behoben. 2024-06-12 13:26:59 +02:00
Developer 02
bf23fceb6b Aktualisierte RejectionInfo1 in .resx 2024-06-12 09:37:49 +02:00
Developer 02
2dc860b923 Initialisierung der EnvelopeGeneratorAPI und der Angular-Webschnittstelle 2024-06-12 01:50:11 +02:00
Developer 02
9b2c5d9ca5 Gitignore aktualisieren 2024-06-12 01:49:14 +02:00
Developer 02
76bfb895a9 Nicht-asynchrone Datenbankoperationen wurden aus dem Homecontroller entfernt und der History-Service vollständig genutzt. Die Vererbung von Basis-Controllern wurde abgeschafft. 2024-06-12 00:59:51 +02:00
Developer 02
38aa6a6217 EmailDispatcher ist integriert. 2024-06-12 00:40:50 +02:00
Developer 02
0268756cf9 feat: Implementierung von Caching im EmailTemplateRepository zur Leistungsverbesserung der ReadByNameAsync-Methode. 2024-06-06 17:17:06 +02:00
Developer 02
f509cc8b3b Ein weiterer informativer Text wurde für den Umschlag hinzugefügt, der von anderen Interessengruppen gestrichen wurde. 2024-06-06 16:55:42 +02:00
Developer 02
290a1dd522 Vereinfachte Zugriffscode-Validierung für den Endpunkt EnvelopeKey/{envelopeReceiverId}/Locked POST. resx aktualisiert, um den Benutzer besser zu informieren 2024-06-06 11:27:13 +02:00
Developer 02
2c147f44b7 Der nicht mehr benötigte Entwicklungsendpunkt wurde entfernt. 2024-06-06 10:04:33 +02:00
Developer 02
3fd2f90f65 Die Ansicht EnvelopeRejected (EnvelopeRejected.cshtml) wurde so entwickelt, dass sie nach Ablehnung eines Umschlags angezeigt wird. Logik hinzugefügt, um eine Umleitung zu aktivieren, nachdem ein Umschlag abgelehnt wurde. 2024-06-06 10:02:56 +02:00
Developer 02
d077a66796 Die Datei „api-service.js“ für HTTP-Anfragen erstellt. HTTP-POST-Anforderung erstellt, um die generierten Umschläge zurückzuweisen. 2024-06-05 13:04:47 +02:00
Developer 02
f16a8bcdb9 EnvelopeController aktualisiert, um das Ablehnen von Umschlägen mit optionalem Grund zu ermöglichen. 2024-06-04 16:34:15 +02:00
Developer 02
33f161a5fe Das Problem der mehrdeutigen Referenz von 'DocumentStatus' wurde durch Hinzufügen einer Referenz zur Konstruktormethode gelöst. 2024-06-04 16:20:25 +02:00
Developer 02
7697939d7e Endpunkt für die Ablehnung von Umschlägen hinzugefügt. 2024-06-04 16:11:30 +02:00
Developer 02
34b3c46720 Referenztyp hinzugefügt, um zu klassifizieren, für wen Geschichte geschrieben wird. 2024-06-04 13:50:37 +02:00
Developer 02
65618e5df9 Standardwert des Eingangs 'withReceiver' in EnvelopeHistory.ReadAsync aktualisieren 2024-06-03 16:58:14 +02:00
Developer 02
8d5493969f Entität 'Receiver' zur Entität 'EnvelopeHistory' hinzugefügt. 2024-06-03 16:13:00 +02:00
Developer 02
0818b8d606 IsRejected und ReadRejectedAsync Methoden zu EnvelopeHistoryService hinzugefügt. 2024-06-03 10:15:26 +02:00
Developer 02
047c4d09e8 Spalte 'COMMENT' zu Entitäten und Dto's hinzugefügt: 2024-06-03 09:41:30 +02:00
Developer 02
26f2e157c6 DocumentRejected zu Envelope Status hinzugefügt. 2024-06-03 09:40:09 +02:00
Developer 02
f26f400937 Entfernen der RejectedReason und IsRejected Eigenschaften aus der EnvelopeReceiver Entität und DTO. 2024-05-31 15:38:38 +02:00
Developer 02
0e4cfc452f Entfernte Duplizierung der EnterCorrectAccessCode-Methode im EnvelopeKey/{envelopeReceiverId}/Locked-Post-Endpunkt. 2024-05-31 13:30:08 +02:00
Developer 02
95b80a650c „Back“ wurde anstelle von „Review“ im Localizer für die handleFinish-Ereignisaktion in app.js verwendet. Außerdem wurde das Deutsch für „Finalize“ in resx aktualisiert. 2024-05-31 13:25:57 +02:00
Developer 02
f4dd17fca9 RejectionReason und IsRejected Eigenschaften zur EnvelopeReceiver Klasse hinzugefügt: RejectionReason speichert REJECTION_REASON und IsRejected zeigt den Ablehnungsstatus an. 2024-05-31 10:03:15 +02:00
Developer 02
e4aed5309e Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-05-31 09:39:50 +02:00
Developer 02
c31f081208 Added a signature legal agreement warning and integrated the resource file (resx) as a JavaScript object into the _Layout.cshtml file. This enables the agreement warning to support multiple languages. 2024-05-31 09:39:31 +02:00
76d4151182 Skin 2019 2024-05-29 15:52:22 +02:00
df2537bf29 MS Rückruf! 2024-05-29 14:34:56 +02:00
5ca4c04669 MS Rückruf 2024-05-29 13:43:55 +02:00
297ecfab7b Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-05-29 12:58:21 +02:00
48db26931c MS EnvelopeGenerator.Common v1.6 Reason for Aborting
XX.Form v1.7 Reason Aborting
2024-05-29 12:58:15 +02:00
Developer 02
21934928c2 Schaltfläche „Ablehnen“ in ShowEnvelope.cshtml hinzugefügt. 2024-05-29 11:57:47 +02:00
Developer 02
21e8a86a99 Text der Unterzeichnungsvereinbarung zu resx hinzugefügt. 2024-05-29 11:01:05 +02:00
Developer 02
0228e82c63 Added Hint Path of GdPicture.NET.14 (14.1.0.152) using Quick Actions. 2024-05-29 09:50:06 +02:00
Developer 02
50247517b9 Erweiterungen zusammengeführt. 2024-05-29 09:33:59 +02:00
Developer 02
1357b714cf Nullfähigkeit zu den Methoden GetEnvelopeUuid und GetReceiverSignature hinzugefügt. 2024-05-29 09:27:15 +02:00
Developer 02
88da8e4ace HTTP-Status 401 (Unauthorized) zum Endpoint EnvelopeKey/{envelopeReceiverId}/Locked hinzugefügt, wenn envelopeReceiverId nicht gefunden wird. 2024-05-29 09:23:09 +02:00
Developer 02
89290c03f9 Mehrsprachige Unterstützung für ShowEnvelope-Seite hinzugefügt; Aktualisierung der resx-Dateien für Deutsch und Englisch (US). 2024-05-28 18:01:32 +02:00
Developer 02
3b27260b14 CultureInfo zur Culture hinzugefügt und die Benutzeroberfläche aktualisiert, um den NativeName für eine verbesserte Lokalisierung anzuzeigen. 2024-05-28 16:19:01 +02:00
Developer 02
9fa5827b09 Aktualisiere site.css für eine verbesserte mobile Ansicht und entferne das Benutzericon. 2024-05-28 12:51:50 +02:00
Developer 02
3448c17d8b Mobile Ansicht angepasst, um die Textgröße zu reduzieren und Überlauf mit Ellipsen zu verhindern. 2024-05-27 17:50:00 +02:00
Developer 02
48ec83161d Removed "zu" word from ShowEnvelope View 2024-05-27 16:25:36 +02:00
Developer 02
cc63b24947 Aktualisierter Informationsteil im ShowEnvelope-Teil der Ansicht. 2024-05-27 14:04:00 +02:00
Developer 02
c3db8d0d00 Flaggensymbol mit Bootstrap-Unterrand nach oben verschoben 2024-05-27 12:44:34 +02:00
Developer 02
037ebfbe5c Schrieb die Schnittstellen des Envelope Mail Service für das Senden und Senden von Zugangscode-Mails und injizierte Speicher-Cache. 2024-05-27 11:39:02 +02:00
Developer 02
42258cbbb8 Aktualisierte EnvelopeLocked-Ansicht, um ein Verrutschen aufgrund einer Fehlermeldung zu verhindern 2024-05-24 14:21:46 +02:00
Developer 02
4c96274084 Meldung "Falscher Zugangscode" hinzugefügt. 2024-05-24 14:18:01 +02:00
Developer 02
b594ddb646 Refaktorierung des HomeController zur Verbesserung der Fehlerbehandlung, des Authentifizierungsprozesses und der Verwaltung der Benutzersprache. 2024-05-24 13:42:20 +02:00
Developer 02
b60ae62779 Aktualisierte EnvelopeClaims 2024-05-24 11:39:12 +02:00
Developer 02
7863e861c7 CSP zur Verwendung in der Produktion wurde protokolliert. 2024-05-23 16:37:13 +02:00
Developer 02
2014f6149d Interne Schaltflächen wurden entfernt. Stattdessen wurden externe Sende- und Aktualisierungsschaltflächen hinzugefügt. 2024-05-23 13:52:37 +02:00
Developer 02
60afdc23da Behebt das Scrollproblem des iframes durch Festlegen der Höhe mit Viewport-Einheiten, um eine ordnungsgemäße interne Scroll-Verarbeitung zu gewährleisten. 2024-05-23 10:42:55 +02:00
Developer 02
90ac81c576 Merged scripts 2024-05-22 16:53:55 +02:00
Developer 02
8d6d483c5d Unnötige console.log und console.errors entfernt. 2024-05-22 16:34:14 +02:00
Developer 02
824bf6fb82 B64ToBuff-Funktion zum Konvertieren von Base64-String in ArrayBuffer hinzufügen 2024-05-22 16:16:13 +02:00
Developer 02
0c6fd2efe3 Refaktorieren Sie den App-Konstruktor, um container standardmäßig auf einen Wert basierend auf dem Klassennamen zu setzen, falls nicht angegeben. 2024-05-22 15:50:32 +02:00
Developer 02
1f4cf54406 Fehler behoben: Signaturfilter in Envelope.Documents.Elements in EnvelopeReceiverRepository hinzugefügt 2024-05-22 15:48:37 +02:00
Developer 02
a6635f4a20 Falscher Schlüsselname behoben 2024-05-22 13:13:37 +02:00
Developer 02
ed25482cee Der DiP-Modus (Development in production) wurde für Swagger- und Test-Controller integriert. 2024-05-22 13:11:02 +02:00
Developer 02
1664b5739e Program.cs und appsettings.json bearbeitet. Abschnitt Config aus appsettings.json entfernt. 2024-05-22 12:03:48 +02:00
Developer 02
0ef9d3c49e Unnötige .git-Dateien unter .web wurden entfernt. 2024-05-22 09:56:02 +02:00
Developer 02
86bdb233c2 EmailProfilerDispatcher hinzugefügt und EnvelopeMailService erstellt. 2024-05-22 09:54:49 +02:00
Developer 02
bc6972bcfb ReadByName in EmailTemplate Repositroy und Dienst hinzugefügt. 2024-05-17 13:59:40 +02:00
Developer 02
2e66129485 DTO für EnvelopeHistory-Erstellung hinzugefügt, asynchrone Record-Methode implementiert und Datenbank-Trigger für Envelope- und EnvelopeHistory-Entitäten konfiguriert. 2024-05-16 16:40:38 +02:00
Developer 02
81220ac9b4 Aktualisiere CSP zur Unterstützung von PSPDFKit durch Aktivierung von unsafe-inline, unsafe-eval, Blob-URLs und Anpassung verschiedener Quellrichtlinien. 2024-05-16 11:11:40 +02:00
Developer 02
d7252ce888 Refaktorierte HomeController, um standardmäßig das Culture-Cookie zu setzen, falls es fehlt, und die Kultur aus den übergebenen Query-Parametern zu übernehmen. 2024-05-16 10:38:03 +02:00
Developer 02
ba723bdddb Removed state and ErrorResponse(Exception e) from BaseController. Added logging to catch part in Document and Envelope Controller. 2024-05-16 09:23:33 +02:00
Developer 02
68714c2937 Integrierte Mehrsprachigkeit (Deutsch und Englisch) mit Cookie-basierter Sprachauswahl 2024-05-15 16:11:26 +02:00
Developer 02
cf9286e4c3 Removed inner styles and updated CSP 2024-05-14 13:50:03 +02:00
Developer 02
87a766a2e8 feat: Add CSP configuration to use CSPMiddleware and CSP nonce to script tags in several cshtml script 2024-05-14 11:22:07 +02:00
Developer 02
674d753735 Removed unnecessary nodejs components. 2024-05-14 09:04:46 +02:00
Developer 02
c688a42e45 Hinzufügen der Bibliotheken flag-icons, popper und select2 zur Verbesserung der Dropdown-, Tooltip- und Auswahlfeldfunktionalität. 2024-05-13 17:18:37 +02:00
Developer 02
db83f25d57 Verbesserung der Benutzeroberfläche und Funktionalität des Sprachauswahl-Dropdown-Menüs 2024-05-13 16:27:46 +02:00
Developer 02
ef6e921451 Updated .gitignore 2024-05-13 16:27:38 +02:00
Developer 02
dd18094deb Erfolglose Antwort wird als unbefugt eingestuft 2024-05-08 16:04:53 +02:00
Developer 02
4f61f1b6cb Added status methods in histroy service 2024-05-08 15:55:51 +02:00
Developer 02
efcd254749 Entfernte dateibezogene Eigenschaften (Filename, Filepath, FilenameOriginal) aus EnvelopeDocumentDto. 2024-05-08 12:18:07 +02:00
Developer 02
357866ea44 Aktualisiert, um EnvelopeReceiverDto anstelle von EnvelopeResponse zu verwenden 2024-05-08 12:10:24 +02:00
Developer 02
d8617093ce Implementierung von HtmlSanitizer und UrlEncoder zur Absicherung von Benutzereingaben gegen XSS und URL-Manipulationsanfälligkeiten. 2024-05-07 16:26:04 +02:00
Developer 02
b19cccdc34 Der PSPDFKitLicenseKey-Schlüssel wurde aktualisiert, um den Lizenzcode aus appsettings.json an das Frontend zu übergeben. 2024-05-07 10:14:45 +02:00
Developer 02
79aa6f4cb3 Hinzufügen einer Cookie-basierten Sprachauswahl zum Front-End 2024-05-06 17:38:45 +02:00
Developer 02
a285a0b9c2 Refaktoriert LogInEnvelope zur Verwendung der ViewInnerServiceError Methode für konsistente Fehlerbehandlung. 2024-05-06 11:31:37 +02:00
Developer 02
84442410a5 Erweiterte Funktionalität durch Hinzufügen eines Endpunkts zur Zuweisung von Sprachen zu Cookies. Implementierte eine CORS-Richtlinie, die die Konfiguration von Ursprüngen über appsettings.json ermöglicht. 2024-05-03 22:03:26 +02:00
Developer 02
22a3ec914d Text des Cookie-Zustimmungsformulars auf Englisch und Deutsch aktualisiert. 2024-05-03 14:20:28 +02:00
Developer 02
9620cb7189 Refaktorierung: Hauptentität auf EnvelopeReceiver geändert; Endlosschleifen-Bug behoben
- HomeController und ShowEnvelopeView aktualisiert.
- Endlosschleifenproblem zwischen Envelope und EnvelopeReceiver gelöst.
- Anpassungen an Envelope, EnvelopeDTO, EnvelopeRepository und EnvelopeService vorgenommen.
2024-05-03 14:00:58 +02:00
Developer 02
eb096cb201 Refaktorisierung von HomeController, um die Verwendung von ThenAsync zu integrieren und Codelesbarkeit zu verbessern. 2024-05-03 13:00:51 +02:00
Developer 02
cc01f57125 Refaktorisierung der Lokalisierung und DTO-Integration
- Ersetzung von ITranslateService durch IStringLocalizer<X> für verbesserte Lokalisierung.
- Aktualisierung der DTO-Klassen entsprechend der neuesten Core.DTO-Struktur.
- Integration der neuen Klassen Result und DataResult aus Core.DTO für standardisierte Serviceantworten.
2024-05-02 17:36:23 +02:00
a7cf500858 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-04-26 13:17:02 +02:00
b24f06509e MS GDpictureKey in FormApp via DB 2024-04-26 13:16:54 +02:00
Developer 02
6b3c90c618 Benutzerdefinierte Fehlerseiten für die Statuscodes 404 und 500 im HomeController hinzugefügt, um verschiedene Benutzerfälle zu behandeln. 2024-04-26 12:22:09 +02:00
Developer 02
966b7de3c4 ErrorView und ErrorViewModel hinzugefügt; ContactLink als Singleton konfiguriert, serialisiert aus appSettings 2024-04-25 16:17:10 +02:00
Developer 02
8efe321cc7 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-04-24 13:57:08 +02:00
Developer 02
6338b81571 Refaktorisierung: Absicherung von DB-Operationen und Verbesserung der Geschäftslogik
- Implementierung von LINQ-Abfragen innerhalb der Core-Bibliothek zur Minderung von SQL-Injection-Anfälligkeiten für DB-Operationen von Umschlägen und Empfängern.
- Aktualisierung der Geschäftslogik in der Service-Schicht für verbessertes Transaktionshandling.
- Erweiterung der ServiceMessage um eine neue Flag-Funktion zum Verfolgen von Cybersecurity- und Datenintegritätsproblemen.
- Hinzufügen spezifischer Benutzerverhaltensflags zur besseren Erkennung und Behandlung potenzieller Datenverletzungen.
2024-04-24 13:45:03 +02:00
0582e7e002 MS GD Picture Update 2024-04-24 13:22:49 +02:00
3f40b9449b MS PARTY_MODULES = 1 2024-04-24 08:07:27 +02:00
fd694b2cee Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-04-23 14:53:49 +02:00
d4a9eba6ab MS _ Service Überprüfen der Ordnerkonfiguration 2024-04-23 14:53:40 +02:00
Developer 02
f2e718565d Add EmailOut components: entity, DTO, repository, and services
- Introduced EmailOut and EmailOutDto for data management.
- Added EmailOutRepository and service interfaces based on CRUD patterns.
2024-04-16 16:25:55 +02:00
Developer 02
f7b11e3427 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-04-16 14:28:23 +02:00
Developer 02
74cb595128 Autorisierungsprüfung zu Envelope und Document Controllern hinzufügen
Implementiere eine Signaturverifizierung in den EnvelopeController.Update (api/envelope/{envelopeKey}) und DocumentController.Open (api/document/{envelopeKey}) Methoden, die beide mit dem HTTPPost-Attribut gekennzeichnet sind. Diese Prüfung stellt sicher, dass nur der authentifizierte Empfänger mit einer übereinstimmenden Signatur Zugriff auf die spezifizierten Ressourcen hat oder diese ändern kann. Dies erhöht die Sicherheit, indem unautorisierten Zugriff verhindert wird.
2024-04-16 13:52:09 +02:00
Developer 02
23609d2bd7 [Authorize]-Attribut zu DocumentController und EnvelopeController hinzugefügt
[Authorize]-Attribute wurden zum DocumentController und EnvelopeController hinzugefügt, um die Sicherheit zu erhöhen. [NonAction]-Attribute wurden zu den Methoden DocumentController.Get (api/document/{envelopeKey}) und EnvelopeController.Get (api/envelope/{envelopeKey}) hinzugefügt, um redundante Cookie-basierte Authentifizierung zu vermeiden, da der Datenzugriffscode korrekt gehandhabt wird, nachdem er im HomeController.LogInEnvelope (/EnvelopeKey/{envelopeReceiverId}/Locked) über die entsprechende Razor-Seite (.cshtml) eingegeben wurde.
2024-04-16 13:28:52 +02:00
Developer 02
1c55c4aa99 Implementierte GDPR-konforme Cookie-Zustimmungsmechanik
- Integrierte die 'bootstrap-cookie-consent-settings' Bibliothek für Cookie-Zustimmungsdialoge
- Hinzugefügt mehrsprachige Unterstützung für Cookie-Dialoge
- Konfigurierte Anwendungseinstellungen in 'appsettings.json'
- Erstellt Datenschutz- und Cookie-Richtlinien mit TermsFeed
- Angepasste sprachbasierte Einstellungen in './wwwroot/cookie-consent-content'
2024-04-16 10:32:39 +02:00
Developer 02
87c839549a Cookie-basierte automatische Autorisierung wurde konfiguriert. Middlevare für Benutzerberechtigung hinzugefügt 2024-04-15 17:24:27 +02:00
02d883dfbf Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-04-15 14:09:06 +02:00
f51c500f90 MS Version 2.6.00 Removed CopytoDMZ 2024-04-15 14:08:47 +02:00
Developer 02
49cfeb28d9 Temporäre Lösung: Rückgabe von Ok(new object()) aufgrund falscher Fetch-API-Nutzung. 2024-04-11 09:16:12 +02:00
Developer 02
5e758899ab Methoden hinzugefügt, um UUID und Signatur aus envelopeReceiverId zu extrahieren 2024-04-10 15:54:51 +02:00
Developer 02
f5dd3cf8be PDF-Serialisierung erfolgt jetzt direkt auf Razor Page - Sicherheitsverbesserung
Externer Fetch-Vorgang entfernt, PDF-Inhalt aus Sicherheitsgründen direkt auf der Razor Page serialisiert.
2024-04-10 09:21:56 +02:00
Developer 02
2c17d440c0 Integration von RemoveIfControllerConvention zur bedingten Ausschließung von Test-Controllern
Implementierung von RemoveIfControllerConvention in der Startup-Klasse, um Controller, die mit "Test" beginnen, basierend auf einem Konfigurationsflag auszuschließen, was die Flexibilität der Dienstregistrierung erhöht.
2024-04-09 13:52:38 +02:00
Developer 02
6941a3db8d Optimize data handling by embedding EnvelopeResponse in Razor Page, eliminating additional requests 2024-04-08 17:05:01 +02:00
Developer 02
1584fd6f1c feat: Begrüßung und Dokumentdetails auf Umschlagseite aktualisiert 2024-04-08 16:39:02 +02:00
Developer 02
2512de0f26 Signaturprüfung zur Filterung der Umschlagempfänger hinzugefügt 2024-04-08 16:22:17 +02:00
Developer 02
db83eb90ee Sicherheitsverbesserung: VerifyAccessCode implementiert und Verifizierungscode aus DTO entfernt
Die VerifyAccessCode-Methode wurde zur Validierung von Zugangscodes hinzugefügt und der Verifizierungscode aus Sicherheitsgründen aus dem DTO entfernt.
2024-04-08 12:54:26 +02:00
Developer 02
501d48961e Refaktorisierung der DecodeEnvelopeReceiverId-Methode in EnvelopeGeneratorExtensions 2024-04-08 10:23:54 +02:00
Developer 02
ab713a23ac Feature-Update: Erweiterung der Envelope- und DocumentReceiverElement-Abfragen
Die Methoden `ReadAllWithAsync` und `ReadByUuidAsync` in `EnvelopeRepository` wurden erweitert, um optional DocumentReceiverElemente und Signaturdetails einzubeziehen.
2024-04-05 16:54:29 +02:00
Developer 02
cbb03d77ba Animierte Navbar-Anzeige für envelopeDto-Informationen hinzugefügt 2024-04-04 17:35:43 +02:00
Developer 02
29ae546d98 EF Core Beziehungskonfiguration für Envelope-Entität korrigiert 2024-04-04 13:25:41 +02:00
Developer 02
8de0d70e7b Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-04-04 08:58:25 +02:00
Developer 02
b43b1ef866 Implementierte individuelle Controller für alle Tabellen unter Verwendung der WebCore.API Bibliothek. 2024-04-04 08:58:03 +02:00
Developer 02
b8d4abb7b2 feat: Implementierung von Repositories, Services und DTOs für alle Entitäten
- Notwendige Repositories, Services und DTOs für jede Entität, die SQL-Tabellen entspricht, unter Verwendung der WebCore-Bibliothek erstellt.
- Mapping-Profile für effiziente Datentransformation definiert.
- Dependency Injections für Repositories und Services als scoped konfiguriert, um eine korrekte Lebenszyklusverwaltung zu gewährleisten.
2024-04-03 14:14:19 +02:00
Developer 02
b65766ce24 Alle Entitäten wurden mit Attributen erstellt und zu EFCore DBContex hinzugefügt. 2024-04-02 14:53:25 +02:00
83746abb1b MS 2024-03-31 19:26:16 +02:00
c14ed86181 Ms Änderungen FileCopy 2024-03-28 11:26:32 +01:00
56eb385312 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-03-19 15:11:07 +01:00
5abc1d9779 MS Common Verzeichnisstruktur 2024-03-19 15:10:51 +01:00
Developer 02
6fc210132d Entferne die Eigenschaft SignedMailPath aus der Config-Entität 2024-03-19 10:36:41 +01:00
a3c66ecd19 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-03-15 11:47:30 +01:00
a25b517445 MS Common V 1.5 New paths for email-Service 2024-03-15 11:47:14 +01:00
Developer 02
181ee67bab - Scheduler.cs, PDFBurner.cs und Constants.cs entfernt. 2024-03-14 13:07:42 +01:00
Developer 02
c459828706 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-03-14 12:47:35 +01:00
Developer 02
6f59906a7e - SQL-SELECT-Anweisungen in Dokumenten aktualisiert, um alle Spalten abzurufen.
- Prioritätsbehandlung für document_path_dmz in EnvelopeService.LoadEnvelopes hinzugefügt.
- CRUD-Operationen in EnvlopeDocument und ConfigurationFile Services/Repositories unter Verwendung von WebCoreModules implementiert.
- Verschiedene Dateimethoden in [spezifischen Orten oder Klassen, falls zutreffend] auf async umgestellt.
2024-03-14 12:46:38 +01:00
21baf0bad0 MS BaseControler 2024-03-13 15:03:16 +01:00
47f924ad7e MS Envelope Common DeleteFromDisk 2024-03-13 14:43:05 +01:00
a2b0682a77 MS FileMove 2024-03-13 10:59:00 +01:00
86d9bd185a MS V2.5.0 zum Test 2024-03-12 13:37:21 +01:00
0064eee9d5 FileMOve 2024-03-06 09:15:02 +01:00
d4aa3ec82e MS Encryption 2024-03-06 09:14:04 +01:00
55f2a6a775 MS Config 2024-02-27 16:18:00 +01:00
4cd39c6c5c Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-02-21 09:19:26 +01:00
51741be5de MS Config Common Paths DMZ Version 1.4 2024-02-21 09:19:19 +01:00
31ca8b8b9e SignFlow: Version 2.4.5.0 2024-02-12 10:27:34 +01:00
dd55e2a2d9 SignFlow: Bei Initialisierung prüfen, ob es überhaupt ein USER-Object gibt 2024-02-12 10:24:55 +01:00
Jonathan Jenne
02a197e535 clean up 2024-01-17 10:34:14 +01:00
Jonathan Jenne
ddd0808f41 Version 2.4.4.1 2024-01-16 16:28:20 +01:00
Jonathan Jenne
c504567c41 Fix Init 2024-01-16 16:28:15 +01:00
4755 changed files with 165656 additions and 2363 deletions

4
.gitignore vendored
View File

@@ -360,4 +360,6 @@ MigrationBackup/
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
FodyWeavers.xsd
/EnvelopeGenerator.Web/.config/dotnet-tools.json
/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/.vscode

View File

@@ -0,0 +1,19 @@
namespace EnvelopeGenerator.Application.Configurations
{
public class AuthenticatorParams
{
public string CharPool { get; init; } = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789";
//TODO: Increase the DefaultTotpSecretKeyLength (e.g. to 32) but make sure that the QR code is generated correctly and can be scanned by the authenticator.
public int DefaultTotpSecretKeyLength { get; init; } = 20;
public string TotpIssuer { get; init; } = "signFlow";
/// <summary>
/// 0 is user email, 1 is secret key and 2 is issuer.
/// </summary>
public string TotpUrlFormat { get; init; } = "otpauth://totp/{0}?secret={1}&issuer={2}";
public int TotpQRPixelsPerModule { get; init; } = 20;
}
}

View File

@@ -0,0 +1,12 @@
namespace EnvelopeGenerator.Application.Configurations;
public class DispatcherParams
{
public int SendingProfile { get; init; } = 1;
public string AddedWho { get; init; } = "DDEnvelopGenerator";
public int ReminderTypeId { get; init; } = 202377;
public string EmailAttmt1 { get; init; } = string.Empty;
}

View File

@@ -0,0 +1,20 @@
using DigitalData.Core.Abstractions.Client;
namespace EnvelopeGenerator.Application.Configurations;
/// <summary>
/// https://www.gtx-messaging.com/en/api-docs/sms-rest-api/
/// </summary>
public class GtxMessagingParams : IHttpClientOptions
{
public required string Uri { get; init; }
public string? Path { get; init; }
public Dictionary<string, object>? Headers { get; init; }
public Dictionary<string, object?>? QueryParams { get; init; }
public string RecipientQueryParamName { get; init; } = "to";
public string MessageQueryParamName { get; init; } = "text";
}

View File

@@ -0,0 +1,6 @@
namespace EnvelopeGenerator.Application.Configurations;
public class MailParams
{
public required Dictionary<string, string> Placeholders { get; init; }
}

View File

@@ -0,0 +1,49 @@
using OtpNet;
using System.Globalization;
namespace EnvelopeGenerator.Application.Configurations
{
public class TotpSmsParams
{
/// <summary>
/// The unit is second.
/// </summary>
public int TotpStep { get; init; } = 90;
public string Format { get; init; } = "Ihr 2FA-Passwort lautet {0}. Gültig bis {1}";
public ExpirationHandler Expiration { get; init; } = new();
public VerificationWindow? TotpVerificationWindow { get; private init; } = VerificationWindow.RfcSpecifiedNetworkDelay;
private IEnumerable<int>? _tvwParams;
public IEnumerable<int>? TotpVerificationWindowParams
{
get => _tvwParams;
init
{
_tvwParams = value;
if(_tvwParams is not null)
TotpVerificationWindow = new(previous: _tvwParams.ElementAtOrDefault(0), future: _tvwParams.ElementAtOrDefault(0));
}
}
public class ExpirationHandler
{
public string CacheKeyFormat { get; init; } = "e{0}_r{1}_sms_code_expiration";
public string Format { get; init; } = "HH:mm:ss";
public string CultureName
{
get => _cultureInfo.Name;
init => _cultureInfo = new(value);
}
private CultureInfo _cultureInfo = new("de-DE");
public CultureInfo CultureInfo => _cultureInfo;
}
}
}

View File

@@ -0,0 +1,19 @@
using OtpNet;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IAuthenticator
{
string GenerateCode(int length);
string GenerateTotpSecretKey(int? length = null);
byte[] GenerateTotpQrCode(string userEmail, string secretKey, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null);
byte[] GenerateTotpQrCode(string userEmail, int? length = null, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null);
string GenerateTotp(string secretKey, int step = 30);
bool VerifyTotp(string totpCode, string secretKey, int step = 30, VerificationWindow? window = null);
}
}

View File

@@ -0,0 +1,17 @@
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IConfigService : IReadService<ConfigDto, Config, int>
{
Task<DataResult<ConfigDto>> ReadFirstAsync();
Task<ConfigDto> ReadDefaultAsync();
Task<string> ReadDefaultSignatureHost();
}
}

View File

@@ -0,0 +1,10 @@
using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IDocumentReceiverElementService : IBasicCRUDService<DocumentReceiverElementDto, DocumentReceiverElement, int>
{
}
}

View File

@@ -0,0 +1,9 @@
using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IDocumentStatusService : IBasicCRUDService<DocumentStatusDto, DocumentStatus, int>
{
}
}

View File

@@ -0,0 +1,13 @@
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEmailTemplateService : IBasicCRUDService<EmailTemplateDto, EmailTemplate, int>
{
Task<DataResult<EmailTemplateDto>> ReadByNameAsync(EmailTemplateType type);
}
}

View File

@@ -0,0 +1,10 @@
using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEnvelopeCertificateService : IBasicCRUDService<EnvelopeCertificateDto, EnvelopeCertificate, int>
{
}
}

View File

@@ -0,0 +1,10 @@
using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEnvelopeDocumentService : IBasicCRUDService<EnvelopeDocumentDto, EnvelopeDocument, int>
{
}
}

View File

@@ -0,0 +1,28 @@
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEnvelopeHistoryService : ICRUDService<EnvelopeHistoryCreateDto, EnvelopeHistoryDto, EnvelopeHistoryDto, EnvelopeHistory, long>
{
Task<int> CountAsync(int? envelopeId = null, string? userReference = null, int? status = null);
Task<bool> AccessCodeAlreadyRequested(int envelopeId, string userReference);
Task<bool> IsSigned(int envelopeId, string userReference);
Task<bool> IsRejected(int envelopeId, string? userReference = null);
Task<IEnumerable<EnvelopeHistoryDto>> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null, bool withSender = false, bool withReceiver = false);
Task<IEnumerable<EnvelopeHistoryDto>> ReadRejectedAsync(int envelopeId, string? userReference = null);
Task<IEnumerable<ReceiverReadDto>> ReadRejectingReceivers(int envelopeId);
Task<DataResult<long>> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status, string? comment = null);
}
}

View File

@@ -0,0 +1,19 @@
using DigitalData.Core.DTO;
using DigitalData.EmailProfilerDispatcher.Abstraction.Contracts;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
using EnvelopeGenerator.Common;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEnvelopeMailService : IEmailOutService
{
Task<DataResult<int>> SendAsync(EnvelopeReceiverDto envelopeReceiverDto, Constants.EmailTemplateType tempType, Dictionary<string, object>? optionalPlaceholders = null);
Task<DataResult<int>> SendAsync(EnvelopeReceiverReadOnlyDto dto, Dictionary<string, object>? optionalPlaceholders = null);
Task<DataResult<int>> SendAccessCodeAsync(EnvelopeReceiverDto envelopeReceiverDto);
Task<DataResult<int>> SendTFAQrCodeAsync(EnvelopeReceiverDto envelopeReceiverDto);
}
}

View File

@@ -0,0 +1,10 @@
using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEnvelopeReceiverReadOnlyService : ICRUDService<EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnlyDto, EnvelopeReceiverReadOnlyUpdateDto, EnvelopeReceiverReadOnly, long>
{
}
}

View File

@@ -0,0 +1,38 @@
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Messaging;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEnvelopeReceiverService : IBasicCRUDService<EnvelopeReceiverDto, EnvelopeReceiver, (int Envelope, int Receiver)>
{
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false, bool readOnly = true);
Task<DataResult<IEnumerable<string?>>> ReadAccessCodeByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true);
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true);
Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true);
Task<DataResult<EnvelopeReceiverSecretDto>> ReadWithSecretByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true);
Task<DataResult<EnvelopeReceiverDto>> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true);
Task<DataResult<string>> ReadAccessCodeByIdAsync(int envelopeId, int receiverId);
Task<DataResult<bool>> VerifyAccessCodeAsync(string uuid, string signature, string accessCode);
Task<DataResult<bool>> VerifyAccessCodeAsync(string envelopeReceiverId, string accessCode);
Task<DataResult<bool>> IsExisting(string envelopeReceiverId);
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses);
Task<DataResult<string?>> ReadLastUsedReceiverNameByMail(string mail);
Task<DataResult<SmsResponse>> SendSmsAsync(string envelopeReceiverId, string message);
}
}

View File

@@ -0,0 +1,16 @@
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEnvelopeService : IBasicCRUDService<EnvelopeDto, Envelope, int>
{
Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false);
Task<DataResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false);
Task<DataResult<IEnumerable<EnvelopeDto>>> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[]ignore_statuses);
}
}

View File

@@ -0,0 +1,17 @@
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Messaging;
namespace EnvelopeGenerator.Application.Contracts;
public interface IEnvelopeSmsHandler
{
/// <summary>
/// If expiration is passed then, sends sms and returns smsResponse and up-to-date expiration; otherwise send expiration.
/// </summary>
/// <param name="er_secret"></param>
/// <param name="cToken"></param>
/// <returns></returns>
Task<(SmsResponse? SmsResponse, DateTime Expiration)> SendTotpAsync(EnvelopeReceiverSecretDto er_secret, CancellationToken cToken = default);
bool VerifyTotp(string totpCode, string secretKey);
}

View File

@@ -0,0 +1,10 @@
using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IEnvelopeTypeService : IBasicCRUDService<EnvelopeTypeDto, EnvelopeType, int>
{
}
}

View File

@@ -0,0 +1,17 @@
using DigitalData.Core.Abstractions;
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IReceiverService : ICRUDService<ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>
{
Task<DataResult<ReceiverReadDto>> ReadByAsync(string? emailAddress = null, string? signature = null);
Task<Result> DeleteByAsync(string? emailAddress = null, string? signature = null);
Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto) where TUpdateDto : IUnique<int>;
}
}

View File

@@ -0,0 +1,11 @@
using EnvelopeGenerator.Application.DTOs.Messaging;
namespace EnvelopeGenerator.Application.Contracts;
//TODO: move to DigitalData.Core
public interface ISmsSender
{
string ServiceProvider { get; }
Task<SmsResponse> SendSmsAsync(string recipient, string message);
}

View File

@@ -0,0 +1,10 @@
using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts
{
public interface IUserReceiverService : IBasicCRUDService<UserReceiverDto, UserReceiver, int>
{
}
}

View File

@@ -0,0 +1,19 @@
using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs
{
public record ConfigDto(
string DocumentPath,
int SendingProfile,
string SignatureHost,
string ExternalProgramName,
string ExportPath) : IUnique<int>
{
[NotMapped]
[JsonIgnore]
[Obsolete("Configuration does not have an ID; it represents a single table in the database.")]
public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single row in the database.");
};
}

View File

@@ -0,0 +1,24 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{
public record DocumentReceiverElementDto(
int Id,
int DocumentId,
int ReceiverId,
int ElementType,
double X,
double Y,
double Width,
double Height,
int Page,
bool Required,
string? Tooltip,
bool ReadOnly,
int AnnotationIndex,
DateTime AddedWhen,
DateTime? ChangedWhen,
double Top,
double Left
): IUnique<int>;
}

View File

@@ -0,0 +1,14 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{
public record DocumentStatusDto(
int Id,
int EnvelopeId,
int ReceiverId,
int Status,
DateTime? StatusChangedWhen,
string Value,
DateTime AddedWhen,
DateTime? ChangedWhen) : IUnique<int>;
}

View File

@@ -0,0 +1,10 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{
public record EmailTemplateDto(
int Id,
string Name,
string Body,
string Subject) : IUnique<int>;
}

View File

@@ -0,0 +1,14 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{
public record EnvelopeCertificateDto(
int Id,
int EnvelopeId,
string EnvelopeUuid,
string EnvelopeSubject,
int CreatorId,
string CreatorName,
string CreatorEmail,
int EnvelopeStatus) : IUnique<int>;
}

View File

@@ -0,0 +1,13 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{
public record EnvelopeDocumentDto
(
int Id,
int EnvelopeId,
DateTime AddedWhen,
byte[]? ByteData = null,
IEnumerable<DocumentReceiverElementDto>? Elements = null
) : IUnique<int>;
}

View File

@@ -0,0 +1,69 @@
using DigitalData.Core.Abstractions;
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using DigitalData.UserManager.Application.DTOs.User;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.DTOs
{
public record EnvelopeDto() : IUnique<int>
{
public int Id { get; set; }
public int UserId { get; set; }
public int Status { get; set; }
public string StatusName { get; set; }
public string Uuid { get; set; }
[TemplatePlaceholder("[MESSAGE]")]
public string Message { get; set; }
public DateTime? ExpiresWhen { get; set; }
public DateTime? ExpiresWarningWhen { get; set; }
public DateTime AddedWhen { get; set; }
public DateTime? ChangedWhen { get; set; }
[TemplatePlaceholder("[DOCUMENT_TITLE]")]
public string Title { get; set; }
public int? ContractType { get; set; }
public string Language { get; set; }
public bool? SendReminderEmails { get; set; }
public int? FirstReminderDays { get; set; }
public int? ReminderIntervalDays { get; set; }
public int? EnvelopeTypeId { get; set; }
public int? CertificationType { get; set; }
public bool? UseAccessCode { get; set; }
public int? FinalEmailToCreator { get; set; }
public int? FinalEmailToReceivers { get; set; }
public int? ExpiresWhenDays { get; set; }
public int? ExpiresWarningWhenDays { get; set; }
public bool TFAEnabled { get; init; }
public bool DmzMoved { get; set; }
public UserReadDto? User { get; set; }
public EnvelopeType? EnvelopeType { get; set; }
public string? EnvelopeTypeTitle { get; set; }
public bool IsAlreadySent { get; set; }
public string? StatusTranslated { get; set; }
public string? ContractTypeTranslated { get; set; }
public IEnumerable<EnvelopeDocumentDto>? Documents { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory
{
public record EnvelopeHistoryCreateDto(
int EnvelopeId,
string UserReference,
int Status,
DateTime? ActionDate,
string? Comment = null);
}

View File

@@ -0,0 +1,21 @@
using DigitalData.Core.Abstractions;
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.DTOs.User;
using EnvelopeGenerator.Application.DTOs.Receiver;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory
{
public record EnvelopeHistoryDto(
long Id,
int EnvelopeId,
string UserReference,
int Status,
string? StatusName,
DateTime AddedWhen,
DateTime? ActionDate,
UserCreateDto? Sender,
ReceiverReadDto? Receiver,
ReferenceType ReferenceType,
string? Comment = null) : BaseDTO<long>(Id), IUnique<long>;
}

View File

@@ -0,0 +1,31 @@
using DigitalData.Core.Abstractions;
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
public record EnvelopeReceiverBasicDto() : IUnique<(int Envelope, int Receiver)>
{
public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId);
public int EnvelopeId { get; init; }
public int ReceiverId { get; init; }
public int Sequence { get; init; }
[TemplatePlaceholder("[NAME_RECEIVER]")]
public string? Name { get; init; }
public string? JobTitle { get; init; }
public string? CompanyName { get; init; }
public string? PrivateMessage { get; init; }
public DateTime AddedWhen { get; init; }
public DateTime? ChangedWhen { get; init; }
public bool HasPhoneNumber { get; init; }
}
}

View File

@@ -0,0 +1,11 @@
using EnvelopeGenerator.Application.DTOs.Receiver;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
public record EnvelopeReceiverDto() : EnvelopeReceiverBasicDto()
{
public EnvelopeDto? Envelope { get; set; }
public ReceiverReadDto? Receiver { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
public record EnvelopeReceiverSecretDto() : EnvelopeReceiverDto()
{
public string? AccessCode { get; init; }
public string? PhoneNumber { get; init; }
}
}

View File

@@ -0,0 +1,22 @@
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly
{
public record EnvelopeReceiverReadOnlyCreateDto(
DateTime DateValid)
{
[EmailAddress]
[Required]
public required string ReceiverMail { get; init; }
[JsonIgnore]
public long? EnvelopeId { get; set; } = null;
[JsonIgnore]
public string? AddedWho { get; set; }
[JsonIgnore]
public DateTime AddedWhen { get; } = DateTime.Now;
};
}

View File

@@ -0,0 +1,16 @@
using EnvelopeGenerator.Application.DTOs.Receiver;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly
{
public record EnvelopeReceiverReadOnlyDto(
long Id,
long EnvelopeId,
string ReceiverMail,
DateTime DateValid,
DateTime AddedWhen,
string AddedWho,
EnvelopeDto? Envelope = null,
string? ChangedWho = null,
DateTime? ChangedWhen = null,
ReceiverReadDto? Receiver = null);
}

View File

@@ -0,0 +1,12 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly
{
public record EnvelopeReceiverReadOnlyUpdateDto(
long Id,
DateTime DateValid,
string ChangedWho) : IUnique<long>
{
public DateTime ChangedWhen { get; } = DateTime.Now;
};
}

View File

@@ -0,0 +1,21 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{
public record EnvelopeTypeDto(
int Id,
string Title,
string Language,
int? ExpiresDays,
int? CertificationType,
bool? UseAccessCode,
int? FinalEmailToCreator,
int? FinalEmailToReceivers,
DateTime AddedWhen,
DateTime? ChangedWhen,
int? ExpiresWarningDays,
bool? SendReminderEmails,
int? FirstReminderDays,
int? ReminderIntervalDays,
int? ContractType) : IUnique<int>;
}

View File

@@ -0,0 +1,4 @@
namespace EnvelopeGenerator.Application.DTOs.Messaging
{
public class GtxMessagingResponse : Dictionary<string, object?> { }
}

View File

@@ -0,0 +1,11 @@
namespace EnvelopeGenerator.Application.DTOs.Messaging
{
public record SmsResponse
{
public required bool Ok { get; init; }
public bool Failed => !Ok;
public dynamic? Errors { get; init; }
}
}

View File

@@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations;
using System.Security.Cryptography;
using System.Text;
namespace EnvelopeGenerator.Application.DTOs.Receiver
{
public record ReceiverCreateDto([EmailAddress] string EmailAddress, string? TotpSecretkey = null)
{
public string Signature => sha256HexOfMail.Value;
private readonly Lazy<string> sha256HexOfMail = new(() =>
{
var bytes_arr = Encoding.UTF8.GetBytes(EmailAddress.ToUpper());
var hash_arr = SHA256.HashData(bytes_arr);
var hexa_str = BitConverter.ToString(hash_arr);
return hexa_str.Replace("-", string.Empty);
});
public DateTime AddedWhen { get; } = DateTime.Now;
};
}

View File

@@ -0,0 +1,24 @@
using DigitalData.Core.Abstractions;
using DigitalData.Core.DTO;
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs.Receiver;
public record ReceiverReadDto(
int Id,
string EmailAddress,
string Signature,
DateTime AddedWhen
) : BaseDTO<int>(Id), IUnique<int>
{
[JsonIgnore]
public IEnumerable<EnvelopeReceiverBasicDto>? EnvelopeReceivers { get; init; }
public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name;
public string? TotpSecretkey { get; set; } = null;
public DateTime? TfaRegDeadline { get; set; }
};

View File

@@ -0,0 +1,5 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs.Receiver;
public record ReceiverUpdateDto(int Id, string? TotpSecretkey = null, DateTime? TfaRegDeadline = null) : IUnique<int>;

View File

@@ -0,0 +1,13 @@
using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{
public record UserReceiverDto(
int Id,
int UserId,
int ReceiverId,
string Name,
string CompanyName,
string JobTitle,
DateTime AddedWhen) : IUnique<int>;
}

View File

@@ -0,0 +1,10 @@
namespace EnvelopeGenerator.Application
{
public enum EnvelopeFlag
{
EnvelopeOrReceiverNonexists,
NonDecodableEnvelopeReceiverId,
WrongEnvelopeReceiverId,
AccessCodeNull
}
}

View File

@@ -0,0 +1,60 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Remove="Resources\Model.Designer.vb" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="DigitalData.Core.Abstractions" Version="2.2.1" />
<PackageReference Include="DigitalData.Core.Application" Version="2.0.0" />
<PackageReference Include="DigitalData.Core.Client" Version="2.0.3" />
<PackageReference Include="DigitalData.Core.DTO" Version="2.0.0" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.18" />
<PackageReference Include="Otp.NET" Version="1.4.0" />
<PackageReference Include="QRCoder" Version="1.6.0" />
<PackageReference Include="QRCoder-ImageSharp" Version="0.10.0" />
<PackageReference Include="UserManager.Application" Version="2.0.0" />
<PackageReference Include="UserManager.Infrastructure" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EnvelopeGenerator.Extensions\EnvelopeGenerator.Extensions.csproj" />
<ProjectReference Include="..\EnvelopeGenerator.Infrastructure\EnvelopeGenerator.Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resources\Model.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Model.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resources\Model.en.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<LastGenOutput>Model.en.Designer.vb</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Resources\Model.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<LastGenOutput>Model.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Resources\Resource.de-DE.resx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Update="Resources\Resource.en-US.resx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,131 @@
using Microsoft.Extensions.Caching.Distributed;
namespace EnvelopeGenerator.Application.Extensions
{
public static class CacheExtensions
{
public static Task SetLongAsync(this IDistributedCache cache, string key, long value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default)
=> options is null
? cache.SetAsync(key, BitConverter.GetBytes(value), token: cToken)
: cache.SetAsync(key, BitConverter.GetBytes(value), options: options, token: cToken);
public static async Task<long?> GetLongAsync(this IDistributedCache cache, string key, CancellationToken cToken = default)
{
var value = await cache.GetAsync(key, cToken);
return value is null ? null : BitConverter.ToInt64(value, 0);
}
public static Task SetDateTimeAsync(this IDistributedCache cache, string key, DateTime value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default)
=> cache.SetLongAsync(key: key, value: value.Ticks, options: options, cToken: cToken);
public static async Task<DateTime?> GetDateTimeAsync(this IDistributedCache cache, string key, CancellationToken cToken = default)
{
var value = await cache.GetAsync(key, cToken);
return value is null ? null : new(BitConverter.ToInt64(value, 0));
}
public static Task SetTimeSpanAsync(this IDistributedCache cache, string key, TimeSpan value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default)
=> cache.SetLongAsync(key: key, value: value.Ticks, options: options, cToken);
public static async Task<TimeSpan?> GetTimeSpanAsync(this IDistributedCache cache, string key, CancellationToken cToken = default)
{
var value = await cache.GetAsync(key, cToken);
return value is null ? null : new(BitConverter.ToInt64(value, 0));
}
//TODO: use code generator
#region GetOrSetAsync
#region string
public static async Task<string> GetOrSetAsync(this IDistributedCache cache, string key, Func<string> factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default)
{
var value = await cache.GetStringAsync(key, cToken);
if (value is null)
{
// create new and save
value = factory();
Task CacheAsync() => options is null
? cache.SetStringAsync(key, value, cToken)
: cache.SetStringAsync(key, value, options, cToken);
if (cacheInBackground)
_ = Task.Run(async () => await CacheAsync(), cToken);
else
await CacheAsync();
}
return value;
}
public static async Task<string> GetOrSetAsync(this IDistributedCache cache, string key, Func<Task<string>> factoryAsync, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default)
{
var value = await cache.GetStringAsync(key, cToken);
if(value is null)
{
// create new and save
value = await factoryAsync();
Task CacheAsync() => options is null
? cache.SetStringAsync(key: key, value: value, token: cToken)
: cache.SetStringAsync(key: key, value: value, options: options, token: cToken);
if (cacheInBackground)
_ = Task.Run(async () => await CacheAsync(), cToken);
else
await CacheAsync();
}
return value;
}
#endregion
#region DateTime
public static async Task<DateTime> GetOrSetAsync(this IDistributedCache cache, string key, Func<DateTime> factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default)
{
if (await cache.GetDateTimeAsync(key, cToken) is DateTime dateTimeValue)
return dateTimeValue;
else
{
// create new and save
var newValue = factory();
Task CacheAsync() => options is null
? cache.SetDateTimeAsync(key, newValue, cToken: cToken)
: cache.SetDateTimeAsync(key, newValue, options, cToken);
if (cacheInBackground)
_ = Task.Run(async () => await CacheAsync(), cToken);
else
await CacheAsync();
return newValue;
}
}
public static async Task<DateTime> GetOrSetAsync(this IDistributedCache cache, string key, Func<Task<DateTime>> factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default)
{
if (await cache.GetDateTimeAsync(key, cToken) is DateTime dateTimeValue)
return dateTimeValue;
else
{
// create new and save
var newValue = await factory();
Task CacheAsync() => options is null
? cache.SetDateTimeAsync(key, newValue, cToken: cToken)
: cache.SetDateTimeAsync(key, newValue, options, cToken);
if (cacheInBackground)
_ = Task.Run(async () => await CacheAsync(), cToken);
else
await CacheAsync();
return newValue;
}
}
#endregion
#endregion
}
}

View File

@@ -0,0 +1,69 @@
using DigitalData.UserManager.Application.MappingProfiles;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.MappingProfiles;
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Services;
using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Infrastructure.Repositories;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using DigitalData.Core.Client;
using QRCoder;
namespace EnvelopeGenerator.Application.Extensions;
public static class DIExtensions
{
public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services, IConfiguration config)
{
//Inject CRUD Service and repositoriesad
services.TryAddScoped<IConfigRepository, ConfigRepository>();
services.TryAddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
services.TryAddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
services.TryAddScoped<IConfigRepository, ConfigRepository>();
services.TryAddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
services.TryAddScoped<IDocumentStatusRepository, DocumentStatusRepository>();
services.TryAddScoped<IEmailTemplateRepository, EmailTemplateRepository>();
services.TryAddScoped<IEnvelopeRepository, EnvelopeRepository>();
services.TryAddScoped<IEnvelopeCertificateRepository, EnvelopeCertificateRepository>();
services.TryAddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
services.TryAddScoped<IEnvelopeHistoryRepository, EnvelopeHistoryRepository>();
services.TryAddScoped<IEnvelopeReceiverRepository, EnvelopeReceiverRepository>();
services.TryAddScoped<IEnvelopeTypeRepository, EnvelopeTypeRepository>();
services.TryAddScoped<IReceiverRepository, ReceiverRepository>();
services.TryAddScoped<IUserReceiverRepository, UserReceiverRepository>();
services.TryAddScoped<IEnvelopeReceiverReadOnlyRepository, EnvelopeReceiverReadOnlyRepository>();
services.TryAddScoped<IConfigService, ConfigService>();
services.TryAddScoped<IDocumentReceiverElementService, DocumentReceiverElementService>();
services.TryAddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
services.TryAddScoped<IEnvelopeHistoryService, EnvelopeHistoryService>();
services.TryAddScoped<IDocumentStatusService, DocumentStatusService>();
services.TryAddScoped<IEmailTemplateService, EmailTemplateService>();
services.TryAddScoped<IEnvelopeService, EnvelopeService>();
services.TryAddScoped<IEnvelopeCertificateService, EnvelopeCertificateService>();
services.TryAddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
services.TryAddScoped<IEnvelopeReceiverService, EnvelopeReceiverService>();
services.TryAddScoped<IEnvelopeTypeService, EnvelopeTypeService>();
services.TryAddScoped<IReceiverService, ReceiverService>();
services.TryAddScoped<IUserReceiverService, UserReceiverService>();
services.TryAddScoped<IEnvelopeReceiverReadOnlyService, EnvelopeReceiverReadOnlyService>();
//Auto mapping profiles
services.AddAutoMapper(typeof(BasicDtoMappingProfile).Assembly);
services.AddAutoMapper(typeof(UserMappingProfile).Assembly);
services.Configure<DispatcherParams>(config.GetSection(nameof(DispatcherParams)));
services.Configure<MailParams>(config.GetSection(nameof(MailParams)));
services.Configure<AuthenticatorParams>(config.GetSection(nameof(AuthenticatorParams)));
services.Configure<TotpSmsParams>(config.GetSection(nameof(TotpSmsParams)));
services.AddHttpClientService<GtxMessagingParams>(config.GetSection(nameof(GtxMessagingParams)));
services.TryAddSingleton<ISmsSender, GTXSmsSender>();
services.TryAddSingleton<IEnvelopeSmsHandler, EnvelopeSmsHandler>();
services.TryAddSingleton<IAuthenticator, Authenticator>();
services.TryAddSingleton<QRCodeGenerator>();
return services;
}
}

View File

@@ -0,0 +1,14 @@
using EnvelopeGenerator.Application.DTOs.Messaging;
namespace EnvelopeGenerator.Application.Extensions
{
public static class MappingExtensions
{
public static bool Ok(this GtxMessagingResponse gtxMessagingResponse)
=> gtxMessagingResponse.TryGetValue("message-status", out var status)
&& status?.ToString()?.ToLower() == "ok";
public static string ToBase64String(this byte[] bytes)
=> Convert.ToBase64String(bytes);
}
}

View File

@@ -0,0 +1,20 @@
namespace EnvelopeGenerator.Application
{
public static class Key
{
public static readonly string InnerServiceError = nameof(InnerServiceError);
public static readonly string EnvelopeNotFound = nameof(EnvelopeNotFound);
public static readonly string EnvelopeReceiverNotFound = nameof(EnvelopeReceiverNotFound);
public static readonly string AccessCodeNull = nameof(AccessCodeNull);
public static readonly string WrongAccessCode = nameof(WrongAccessCode);
public static readonly string DataIntegrityIssue = nameof(DataIntegrityIssue);
public static readonly string SecurityBreachOrDataIntegrity = nameof(SecurityBreachOrDataIntegrity);
public static readonly string PossibleDataIntegrityIssue = nameof(PossibleDataIntegrityIssue);
public static readonly string SecurityBreach = nameof(SecurityBreach);
public static readonly string PossibleSecurityBreach = nameof(PossibleSecurityBreach);
public static readonly string WrongEnvelopeReceiverId = nameof(WrongEnvelopeReceiverId);
public static readonly string EnvelopeOrReceiverNonexists = nameof(EnvelopeOrReceiverNonexists);
public static readonly string PhoneNumberNonexists = nameof(PhoneNumberNonexists);
public static readonly string Default = nameof(Default);
}
}

View File

@@ -0,0 +1,64 @@
using AutoMapper;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
using EnvelopeGenerator.Application.DTOs.Messaging;
using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Application.Extensions;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.MappingProfiles
{
public class BasicDtoMappingProfile : Profile
{
public BasicDtoMappingProfile()
{
// Entity to DTO mappings
CreateMap<Config, ConfigDto>();
CreateMap<DocumentReceiverElement, DocumentReceiverElementDto>();
CreateMap<DocumentStatus, DocumentStatusDto>();
CreateMap<EmailTemplate, EmailTemplateDto>();
CreateMap<Envelope, EnvelopeDto>();
CreateMap<EnvelopeCertificate, EnvelopeCertificateDto>();
CreateMap<EnvelopeDocument, EnvelopeDocumentDto>();
CreateMap<EnvelopeHistory, EnvelopeHistoryDto>();
CreateMap<EnvelopeHistory, EnvelopeHistoryCreateDto>();
CreateMap<EnvelopeReceiver, EnvelopeReceiverDto>();
CreateMap<EnvelopeReceiver, EnvelopeReceiverSecretDto>();
CreateMap<EnvelopeType, EnvelopeTypeDto>();
CreateMap<Receiver, ReceiverReadDto>();
CreateMap<Receiver, ReceiverCreateDto>();
CreateMap<Receiver, ReceiverUpdateDto>();
CreateMap<UserReceiver, UserReceiverDto>();
CreateMap<EnvelopeReceiverReadOnly, EnvelopeReceiverReadOnlyDto>();
// DTO to Entity mappings
CreateMap<ConfigDto, Config>();
CreateMap<DocumentReceiverElementDto, DocumentReceiverElement>();
CreateMap<DocumentStatusDto, DocumentStatus>();
CreateMap<EmailTemplateDto, EmailTemplate>();
CreateMap<EnvelopeDto, Envelope>();
CreateMap<EnvelopeCertificateDto, EnvelopeCertificate>();
CreateMap<EnvelopeDocumentDto, EnvelopeDocument>();
CreateMap<EnvelopeHistoryDto, EnvelopeHistory>();
CreateMap<EnvelopeHistoryCreateDto, EnvelopeHistory>();
CreateMap<EnvelopeReceiverDto, EnvelopeReceiver>();
CreateMap<EnvelopeTypeDto, EnvelopeType>();
CreateMap<ReceiverReadDto, Receiver>().ForMember(rcv => rcv.EnvelopeReceivers, rcvReadDto => rcvReadDto.Ignore());
CreateMap<ReceiverCreateDto, Receiver>();
CreateMap<ReceiverUpdateDto, Receiver>();
CreateMap<UserReceiverDto, UserReceiver>();
CreateMap<EnvelopeReceiverBase, EnvelopeReceiverBasicDto>();
CreateMap<EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnly>();
CreateMap<EnvelopeReceiverReadOnlyUpdateDto, EnvelopeReceiverReadOnly>();
// Messaging mappings
// for GTX messaging
CreateMap<GtxMessagingResponse, SmsResponse>()
.ConstructUsing(gtxRes => gtxRes.Ok()
? new SmsResponse() { Ok = true }
: new SmsResponse() { Ok = false, Errors = gtxRes });
}
}
}

View File

@@ -0,0 +1,9 @@
namespace EnvelopeGenerator.Application.Resources
{
/// <summary>
/// The place holder class for Resource.*.resx
/// </summary>
public class Resource
{
}
}

View File

@@ -0,0 +1,261 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="and" xml:space="preserve">
<value>und</value>
</data>
<data name="Back" xml:space="preserve">
<value>Zurück</value>
</data>
<data name="Complete" xml:space="preserve">
<value>Abschließen</value>
</data>
<data name="Confirmation" xml:space="preserve">
<value>Bestätigung</value>
</data>
<data name="de-DE" xml:space="preserve">
<value>Deutch</value>
</data>
<data name="DocProtected" xml:space="preserve">
<value>Dokument geschützt</value>
</data>
<data name="DocRejected" xml:space="preserve">
<value>Dokument abgelehnt</value>
</data>
<data name="DocSigned" xml:space="preserve">
<value>Dokument unterschrieben</value>
</data>
<data name="en-US" xml:space="preserve">
<value>Englisch</value>
</data>
<data name="EnvelopeInfo1" xml:space="preserve">
<value>Sie müssen {0} Vorgang unterzeichen. &lt;span class="highlight highlight-envelope-info-1"&gt;Bitte prüfen Sie die Seite {1}&lt;/span&gt;.</value>
</data>
<data name="EnvelopeInfo2" xml:space="preserve">
<value>Erstellt am {0} von {1}. Sie können den Absender über &lt;span class="highlight highlight-envelope-info-2"&gt;&lt;a class="mail-link" href="mailto:{2}?subject={3}&amp;body=Sehr%20geehrter%20{4}%20{5},%0A%0A%0A"&gt;{6}&lt;/a&gt;&lt;/span&gt; kontaktieren.</value>
</data>
<data name="Finalize" xml:space="preserve">
<value>Abschließen</value>
</data>
<data name="Hello" xml:space="preserve">
<value>Hallo</value>
</data>
<data name="HomePageDescription" xml:space="preserve">
<value>Das digitale Unterschriftenportal ist eine Plattform, die entwickelt wurde, um Ihre Dokumente sicher zu unterschreiben und zu verwalten. Mit seiner benutzerfreundlichen Oberfläche können Sie Ihre Dokumente schnell hochladen, die Unterschriftsprozesse verfolgen und Ihre digitalen Unterschriftenanwendungen einfach durchführen. Dieses Portal beschleunigt Ihren Arbeitsablauf mit rechtlich gültigen Unterschriften und erhöht gleichzeitig die Sicherheit Ihrer Dokumente.</value>
</data>
<data name="LocationWarning" xml:space="preserve">
<value>Bitte überprüfen Sie die Standortinformationen. Wenn sie falsch sind, korrigieren Sie diese bitte.</value>
</data>
<data name="LockedBodyAccess" xml:space="preserve">
<value>Wir senden Ihnen nun einen Zugriffscode an Ihre hinterlegte Email-Adresse. Dies kann evtl. einige Minuten dauern!</value>
</data>
<data name="LockedBodyAuthenticator" xml:space="preserve">
<value>Bitte geben Sie den in Ihrer Authenticator-App angegebenen TOTP-Code ein.</value>
</data>
<data name="LockedBodyAuthenticatorNew" xml:space="preserve">
<value>Wir haben den QR-Code an Ihre E-Mail-Adresse gesendet. Ihr QR-Code ist bis {0} gültig. Sie können ihn für alle Umschläge verwenden, die Sie an diese E-Mail-Adresse erhalten.</value>
</data>
<data name="LockedBodySms" xml:space="preserve">
<value>Wir haben soeben den Zugangscode als SMS an die von Ihnen angegebene Telefonnummer gesendet.</value>
</data>
<data name="LockedCodeLabelAccess" xml:space="preserve">
<value>Zugriffscode</value>
</data>
<data name="LockedCodeLabelAuthenticator" xml:space="preserve">
<value>TOTP</value>
</data>
<data name="LockedCodeLabelSms" xml:space="preserve">
<value>SMS-Code</value>
</data>
<data name="LockedFooterBodyAccess" xml:space="preserve">
<value>Bitte überprüfen Sie Ihr Email Postfach inklusive Spam-Ordner. Sie können auch den Absender &lt;a class="mail-link" href="mailto:{0}?subject={1}&amp;body={2}" target="_blank"&gt;{0}&lt;/a&gt; bitten, Ihnen den Code auf anderem Wege zukommen zu lassen.</value>
</data>
<data name="LockedFooterBodyAuthenticator" xml:space="preserve">
<value>Der neue QR-Code wird nur einmal für einen bestimmten Zeitraum gesendet und nach dem Scannen in Ihrer Authenticator-App gespeichert. Er kann für alle Umschläge verwendet werden, die an dieselbe E-Mail-Adresse gesendet werden, bis er abläuft. Wenn Sie die QR-Code-Mail nicht erhalten oder sie sowohl aus der Mail als auch aus authenticator löschen, kontaktieren Sie bitte den Absender.</value>
</data>
<data name="LockedFooterBodySms" xml:space="preserve">
<value>Sie können den Absender bitten, Ihre Rufnummer zu überprüfen. Die Telefonnummer muss mit der Ortsvorwahl eingegeben werden. Andernfalls können Sie beantragen, den Zwei-Faktor-Schutz zu entfernen.</value>
</data>
<data name="LockedFooterTitleAccess" xml:space="preserve">
<value>Sie haben keinen Zugriffscode erhalten?</value>
</data>
<data name="LockedFooterTitleAuthenticator" xml:space="preserve">
<value>Sie haben keinen QR-Code erhalten?</value>
</data>
<data name="LockedFooterTitleSms" xml:space="preserve">
<value>Sie haben keine SMS erhalten?</value>
</data>
<data name="LockedTitleAccess" xml:space="preserve">
<value>Dokument erfordert einen Zugriffscode</value>
</data>
<data name="LockedTitleAuthenticator" xml:space="preserve">
<value>2-Faktor-Authentifizierung</value>
</data>
<data name="LockedTitleSms" xml:space="preserve">
<value>2-Faktor-Authentifizierung</value>
</data>
<data name="Privacy" xml:space="preserve">
<value>Datenschutz</value>
</data>
<data name="ReadOnlyMessage" xml:space="preserve">
<value>Weitergeleitet von {0}. Gültig bis {1}.</value>
</data>
<data name="Reject" xml:space="preserve">
<value>Ablehnen</value>
</data>
<data name="Rejection" xml:space="preserve">
<value>Ablehnung</value>
</data>
<data name="RejectionInfo1" xml:space="preserve">
<value>Dieser Unterzeichnungsvorgang wurde abgelehnt!</value>
</data>
<data name="RejectionInfo1_ext" xml:space="preserve">
<value>Vorgang abgebrochen!</value>
</data>
<data name="RejectionInfo2" xml:space="preserve">
<value>Sie können bei Bedarf mit {0}, &lt;a href="mailto:{1}?subject={2}&amp;body=Sehr geehrte(r)%20{0},%0A%0A%0A"&gt;{1}&lt;/a&gt; Kontakt aufnehmen.</value>
</data>
<data name="RejectionInfo2_ext" xml:space="preserve">
<value>Das Vorgang wurde von einer der beteiligten Parteien abgelehnt. Sie können bei Bedarf mit {0}, &lt;a href="mailto:{1}?subject={2}&amp;body=Sehr geehrte(r)%20{0},%0A%0A%0A"&gt;{1}&lt;/a&gt; Kontakt aufnehmen.</value>
</data>
<data name="RejectionReasonQ" xml:space="preserve">
<value>Bitte geben Sie einen Grund an:</value>
</data>
<data name="SigAgree" xml:space="preserve">
<value>Durch Klick auf Abschließen stimme ich zu, dass die abgebildete und übermittelte Signatur als elektronische Darstellung meiner Signatur in den Fällen gelten, in denen ich sie auf Dokumenten, einschließlich rechtsgültiger Verträge verwende.</value>
</data>
<data name="SignDoc" xml:space="preserve">
<value>Dokument unterschreiben</value>
</data>
<data name="SigningProcessTitle" xml:space="preserve">
<value>Titel des Unterzeichnungs-Vorgangs</value>
</data>
<data name="UnexpectedError" xml:space="preserve">
<value>Ein unerwarteter Fehler ist aufgetreten.</value>
</data>
<data name="ViewDoc" xml:space="preserve">
<value>Dokument ansehen</value>
</data>
<data name="WelcomeToTheESignPortal" xml:space="preserve">
<value>Herzlich willkommen im eSign-Portal</value>
</data>
<data name="WrongAccessCode" xml:space="preserve">
<value>Ungültiger Zugangscode.</value>
</data>
</root>

View File

@@ -0,0 +1,261 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="and" xml:space="preserve">
<value>and</value>
</data>
<data name="Back" xml:space="preserve">
<value>Back</value>
</data>
<data name="Complete" xml:space="preserve">
<value>Complete</value>
</data>
<data name="Confirmation" xml:space="preserve">
<value>Confirmation</value>
</data>
<data name="de-DE" xml:space="preserve">
<value>German</value>
</data>
<data name="DocProtected" xml:space="preserve">
<value>Document protected</value>
</data>
<data name="DocRejected" xml:space="preserve">
<value>Document rejected</value>
</data>
<data name="DocSigned" xml:space="preserve">
<value>Document signed</value>
</data>
<data name="en-US" xml:space="preserve">
<value>English</value>
</data>
<data name="EnvelopeInfo1" xml:space="preserve">
<value>You have to sign {0} process. &lt;span class="highlight highlight-envelope-info-1"&gt;Please check page {1}&lt;/span&gt;.</value>
</data>
<data name="EnvelopeInfo2" xml:space="preserve">
<value>Created on {0} by {1}. You can contact the sender via &lt;span class="highlight highlight-envelope-info-2"&gt;&lt;a class="mail-link" href="mailto:{2}?subject={3}&amp;body=Dear%20{4}%20{5},%0A%0A%0A"&gt;{6}&lt;/a&gt;&lt;/span&gt;.</value>
</data>
<data name="Finalize" xml:space="preserve">
<value>Finalize</value>
</data>
<data name="Hello" xml:space="preserve">
<value>Hello</value>
</data>
<data name="HomePageDescription" xml:space="preserve">
<value>The Digital Signature Portal is a platform developed for securely signing and managing your documents. With its user-friendly interface, you can quickly upload your documents, track the signing processes, and easily carry out your digital signature applications. This portal accelerates your workflow with legally valid signatures while enhancing the security of your documents.</value>
</data>
<data name="LocationWarning" xml:space="preserve">
<value>Please review the location information. If it is incorrect, kindly make the necessary corrections.</value>
</data>
<data name="LockedBodyAccess" xml:space="preserve">
<value>We will now send you an access code to your registered e-mail address. This may take a few minutes!</value>
</data>
<data name="LockedBodyAuthenticator" xml:space="preserve">
<value>Please enter the TOTP provided in your Authenticator app.</value>
</data>
<data name="LockedBodyAuthenticatorNew" xml:space="preserve">
<value>We have sent the QR code to your e-mail address. Your QR code is valid until {0}. You can use it for all envelopes received at this email address.</value>
</data>
<data name="LockedBodySms" xml:space="preserve">
<value>We have just sent the access code as an SMS to the phone number you provided.</value>
</data>
<data name="LockedCodeLabelAccess" xml:space="preserve">
<value>Access Code</value>
</data>
<data name="LockedCodeLabelAuthenticator" xml:space="preserve">
<value>TOTP</value>
</data>
<data name="LockedCodeLabelSms" xml:space="preserve">
<value>SMS Code</value>
</data>
<data name="LockedFooterBodyAccess" xml:space="preserve">
<value>Please check your email inbox including the spam folder. You can also ask the sender &lt;a class="mail-link" href="mailto:{0}?subject={1}&amp;body={2}" target="_blank"&gt;{0}&lt;/a&gt; to send you the code by other means.</value>
</data>
<data name="LockedFooterBodyAuthenticator" xml:space="preserve">
<value>The new QR code is sent only once for a given period and is saved in your authenticator app once scanned. It can be used for all envelopes received at the same email address until it expires. If you do not receive the QR code mail or delete it both from the mail and from authenticator, please contact the sender.</value>
</data>
<data name="LockedFooterBodySms" xml:space="preserve">
<value>You can ask the sender to check your phone number. The phone number must be entered with the area code. Otherwise you can request to remove the two-factor protection.</value>
</data>
<data name="LockedFooterTitleAccess" xml:space="preserve">
<value>You have not received an access code?</value>
</data>
<data name="LockedFooterTitleAuthenticator" xml:space="preserve">
<value>You have not received a QR code?</value>
</data>
<data name="LockedFooterTitleSms" xml:space="preserve">
<value>You have not received an SMS?</value>
</data>
<data name="LockedTitleAccess" xml:space="preserve">
<value>Document requires an access code</value>
</data>
<data name="LockedTitleAuthenticator" xml:space="preserve">
<value>2-Factor Authentication</value>
</data>
<data name="LockedTitleSms" xml:space="preserve">
<value>2-Factor Authentication</value>
</data>
<data name="Privacy" xml:space="preserve">
<value>Privacy</value>
</data>
<data name="ReadOnlyMessage" xml:space="preserve">
<value>Forwarded by {0}. Valid until {1}.</value>
</data>
<data name="Reject" xml:space="preserve">
<value>Reject</value>
</data>
<data name="Rejection" xml:space="preserve">
<value>Rejection</value>
</data>
<data name="RejectionInfo1" xml:space="preserve">
<value>This signing process was rejected!</value>
</data>
<data name="RejectionInfo1_ext" xml:space="preserve">
<value>Process canceled!</value>
</data>
<data name="RejectionInfo2" xml:space="preserve">
<value>You can contact {0}, &lt;a href="mailto:{1}?subject={2}&amp;body=Dear%20{0},%0A%0A%0A"&gt;{1}&lt;/a&gt; if required.</value>
</data>
<data name="RejectionInfo2_ext" xml:space="preserve">
<value>The process has been rejected by one of the parties involved. You can contact {0}, &lt;a href="mailto:{1}?subject={2}&amp;body=Dear%20{0},%0A%0A%0A"&gt;{1}&lt;/a&gt; if required.</value>
</data>
<data name="RejectionReasonQ" xml:space="preserve">
<value>Please give a reason:</value>
</data>
<data name="SigAgree" xml:space="preserve">
<value>By clicking on Finalize, I agree that the signature shown and submitted is an electronic representation of my signature in cases where I use it on documents, including legally binding contracts.</value>
</data>
<data name="SignDoc" xml:space="preserve">
<value>Sign document</value>
</data>
<data name="SigningProcessTitle" xml:space="preserve">
<value>Title of the signing process</value>
</data>
<data name="UnexpectedError" xml:space="preserve">
<value>An unexpected error has occurred.</value>
</data>
<data name="ViewDoc" xml:space="preserve">
<value>View document</value>
</data>
<data name="WelcomeToTheESignPortal" xml:space="preserve">
<value>Welcome to the eSign portal</value>
</data>
<data name="WrongAccessCode" xml:space="preserve">
<value>Invalid access code.</value>
</data>
</root>

View File

@@ -0,0 +1,71 @@
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Contracts;
using Microsoft.Extensions.Options;
using OtpNet;
using QRCoder;
using System.Text;
namespace EnvelopeGenerator.Application.Services
{
public class Authenticator : IAuthenticator
{
public static Lazy<Authenticator> LazyStatic => new(() => new Authenticator(Options.Create<AuthenticatorParams>(new()), new QRCodeGenerator()));
public static Authenticator Static => LazyStatic.Value;
private readonly AuthenticatorParams _params;
private readonly QRCodeGenerator _qrCodeGenerator;
public Authenticator(IOptions<AuthenticatorParams> options, QRCodeGenerator qrCodeGenerator)
{
_params = options.Value;
_qrCodeGenerator = qrCodeGenerator;
}
public string GenerateCode(int length)
{
//TODO: Inject Random as a singleton to support multithreading to improve performance.
Random random = new();
if (length <= 0)
throw new ArgumentException("Password length must be greater than 0.");
var passwordBuilder = new StringBuilder(length);
for (int i = 0; i < length; i++)
passwordBuilder.Append(_params.CharPool[random.Next(_params.CharPool.Length)]);
return passwordBuilder.ToString();
}
public string GenerateTotpSecretKey(int? length = null)
=> Base32Encoding.ToString(KeyGeneration.GenerateRandomKey(length ?? _params.DefaultTotpSecretKeyLength));
public byte[] GenerateTotpQrCode(string userEmail, string secretKey, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null)
{
var url = string.Format(totpUrlFormat ?? _params.TotpUrlFormat,
Uri.EscapeDataString(userEmail),
Uri.EscapeDataString(secretKey),
Uri.EscapeDataString(issuer ?? _params.TotpIssuer));
using var qrCodeData = _qrCodeGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.Q);
using var qrCode = new BitmapByteQRCode(qrCodeData);
return qrCode.GetGraphic(pixelsPerModule ?? _params.TotpQRPixelsPerModule);
}
public byte[] GenerateTotpQrCode(string userEmail, int? length = null, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null)
{
return GenerateTotpQrCode(
userEmail: userEmail,
secretKey: GenerateTotpSecretKey(length: length),
issuer: issuer,
totpUrlFormat: totpUrlFormat,
pixelsPerModule: pixelsPerModule);
}
public string GenerateTotp(string secretKey, int step = 30) => new Totp(Base32Encoding.ToBytes(secretKey), step).ComputeTotp();
public bool VerifyTotp(string totpCode, string secretKey, int step = 30, VerificationWindow? window = null)
=> new Totp(Base32Encoding.ToBytes(secretKey), step).VerifyTotp(totpCode, out _, window);
}
}

View File

@@ -0,0 +1,60 @@
using AutoMapper;
using DigitalData.Core.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services
{
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;
public ConfigService(IConfigRepository repository, IMapper mapper, IMemoryCache memoryCache, ILogger<ConfigService> logger) : base(repository, mapper)
{
_cache = memoryCache;
_logger = logger;
}
public async Task<DataResult<ConfigDto>> ReadFirstAsync()
{
var config = await _repository.ReadFirstAsync();
return config is null
? Result.Fail<ConfigDto>().Notice(LogLevel.Error, Flag.DataIntegrityIssue, "There is no configuration in DB.")
: Result.Success(_mapper.Map<ConfigDto>(config));
}
/// <summary>
/// Reads the default configuration asynchronously.
/// </summary>
/// <remarks>
/// The configuration is cached in memory upon the first retrieval. If the configuration is updated,
/// the application needs to be restarted for the changes to take effect as the memory cache will not be updated automatically.
/// </remarks>
/// <returns>
/// A task that represents the asynchronous read operation. The task result contains the default configuration as a <see cref="ConfigDto"/>.
/// </returns>
/// <exception cref="InvalidOperationException">
/// Thrown when the default configuration cannot be found.
/// </exception>
public async Task<ConfigDto> ReadDefaultAsync()
{
var config = await _cache.GetOrCreateAsync(DefaultConfigCacheId, _ => ReadFirstAsync().ThenAsync(
Success: config => config,
Fail: (mssg, ntc) =>
{
_logger.LogNotice(ntc);
throw new InvalidOperationException("Default configuration cannot find.");
}));
return config!;
}
public async Task<string> ReadDefaultSignatureHost() => (await ReadDefaultAsync()).SignatureHost;
}
}

View File

@@ -0,0 +1,17 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
namespace EnvelopeGenerator.Application.Services
{
public class DocumentReceiverElementService : BasicCRUDService<IDocumentReceiverElementRepository, DocumentReceiverElementDto, DocumentReceiverElement, int>, IDocumentReceiverElementService
{
public DocumentReceiverElementService(IDocumentReceiverElementRepository repository, IMapper mapper)
: base(repository, mapper)
{
}
}
}

View File

@@ -0,0 +1,17 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
namespace EnvelopeGenerator.Application.Services
{
public class DocumentStatusService : BasicCRUDService<IDocumentStatusRepository, DocumentStatusDto, DocumentStatus, int>, IDocumentStatusService
{
public DocumentStatusService(IDocumentStatusRepository repository, IMapper mapper)
: base(repository, mapper)
{
}
}
}

View File

@@ -0,0 +1,30 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
using static EnvelopeGenerator.Common.Constants;
using DigitalData.Core.DTO;
using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services
{
public class EmailTemplateService : BasicCRUDService<IEmailTemplateRepository, EmailTemplateDto, EmailTemplate, int>, IEmailTemplateService
{
public EmailTemplateService(IEmailTemplateRepository repository, IMapper mapper)
: base(repository, mapper)
{
}
public async Task<DataResult<EmailTemplateDto>> ReadByNameAsync(EmailTemplateType type)
{
var temp = await _repository.ReadByNameAsync(type);
return temp is null
? Result.Fail<EmailTemplateDto>()
.Message(Key.InnerServiceError)
.Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"EmailTemplateType '{type}' is not found in DB. Please, define required e-mail template.")
: Result.Success(_mapper.Map<EmailTemplateDto>(temp));
}
}
}

View File

@@ -0,0 +1,19 @@
using AutoMapper;
using DigitalData.Core.Application;
using Microsoft.Extensions.Localization;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Application.Resources;
namespace EnvelopeGenerator.Application.Services
{
public class EnvelopeCertificateService : BasicCRUDService<IEnvelopeCertificateRepository, EnvelopeCertificateDto, EnvelopeCertificate, int>, IEnvelopeCertificateService
{
public EnvelopeCertificateService(IEnvelopeCertificateRepository repository, IMapper mapper)
: base(repository, mapper)
{
}
}
}

View File

@@ -0,0 +1,16 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
namespace EnvelopeGenerator.Application.Services
{
public class EnvelopeDocumentService : BasicCRUDService<IEnvelopeDocumentRepository, EnvelopeDocumentDto, EnvelopeDocument, int>, IEnvelopeDocumentService
{
public EnvelopeDocumentService(IEnvelopeDocumentRepository repository, IMapper mapper) : base(repository, mapper)
{
}
}
}

View File

@@ -0,0 +1,85 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
using static EnvelopeGenerator.Common.Constants;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.Receiver;
namespace EnvelopeGenerator.Application.Services
{
public class EnvelopeHistoryService : CRUDService<IEnvelopeHistoryRepository, EnvelopeHistoryCreateDto, EnvelopeHistoryDto, EnvelopeHistoryDto, EnvelopeHistory, long>, IEnvelopeHistoryService
{
public EnvelopeHistoryService(IEnvelopeHistoryRepository repository, IMapper mapper)
: base(repository, mapper)
{
}
public async Task<int> CountAsync(int? envelopeId = null, string? userReference = null, int? status = null) => await _repository.CountAsync(envelopeId: envelopeId, userReference: userReference, status: status);
public async Task<bool> HasStatus(EnvelopeStatus status, int envelopeId, string userReference) => await _repository.CountAsync(
envelopeId: envelopeId,
userReference: userReference,
status: (int) status) > 0;
public async Task<bool> AccessCodeAlreadyRequested(int envelopeId, string userReference) => await _repository.CountAsync(
envelopeId: envelopeId,
userReference:userReference,
status: (int) EnvelopeStatus.AccessCodeRequested) > 0;
public async Task<bool> IsSigned(int envelopeId, string userReference) => await _repository.CountAsync(
envelopeId: envelopeId,
userReference: userReference,
status: (int) EnvelopeStatus.DocumentSigned) > 0;
/// <summary>
/// Checks if the specified envelope has been rejected.
/// <para><b>Note:</b> <i>If any document within the envelope is rejected, the entire envelope will be considered rejected.</i></para>
/// </summary>
/// <param name="envelopeId">The ID of the envelope to check.</param>
/// <param name="userReference">Optional user reference associated with the envelope.</param>
/// <returns>A task that represents the asynchronous operation. The task result contains a boolean value indicating whether the envelope is rejected.</returns>
public async Task<bool> IsRejected(int envelopeId, string? userReference = null)
{
return await _repository.CountAsync(
envelopeId: envelopeId,
userReference: userReference,
status: (int)EnvelopeStatus.DocumentRejected) > 0;
}
public async Task<IEnumerable<EnvelopeHistoryDto>> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null, bool withSender = false, bool withReceiver = false)
{
var histDTOs = _mapper.Map<IEnumerable<EnvelopeHistoryDto>>(
await _repository.ReadAsync(
envelopeId: envelopeId,
userReference: userReference,
status: status,
withSender: withSender,
withReceiver: withReceiver));
return referenceType is null ? histDTOs : histDTOs.Where(h => h.ReferenceType == referenceType);
}
public async Task<IEnumerable<EnvelopeHistoryDto>> ReadRejectedAsync(int envelopeId, string? userReference = null) =>
await ReadAsync(envelopeId: envelopeId, userReference: userReference, status: (int)EnvelopeStatus.DocumentRejected, withReceiver:true);
//TODO: use IQueryable in repository to incerease the performance
public async Task<IEnumerable<ReceiverReadDto>> ReadRejectingReceivers(int envelopeId)
{
var envelopes = await ReadRejectedAsync(envelopeId);
return envelopes is null
? Enumerable.Empty<ReceiverReadDto>()
: envelopes
.Where(eh => eh?.Receiver != null)
.Select(eh => eh.Receiver!);
}
public async Task<DataResult<long>> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status, string? comment = null) =>
await CreateAsync(new (EnvelopeId: envelopeId, UserReference: userReference, Status: (int)status, ActionDate: DateTime.Now, Comment: comment))
.ThenAsync(
Success: id => Result.Success(id),
Fail: (mssg, ntc) => Result.Fail<long>().Message(mssg).Notice(ntc)
);
}
}

View File

@@ -0,0 +1,175 @@
using AutoMapper;
using DigitalData.Core.DTO;
using DigitalData.EmailProfilerDispatcher.Abstraction.Contracts;
using DigitalData.EmailProfilerDispatcher.Abstraction.DTOs.EmailOut;
using DigitalData.EmailProfilerDispatcher.Abstraction.Services;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Common;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using static EnvelopeGenerator.Common.Constants;
using EnvelopeGenerator.Extensions;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Extensions;
using Newtonsoft.Json;
namespace EnvelopeGenerator.Application.Services
{
public class EnvelopeMailService : EmailOutService, IEnvelopeMailService
{
private readonly IEmailTemplateService _tempService;
private readonly IEnvelopeReceiverService _envRcvService;
private readonly DispatcherParams _dConfig;
private readonly IConfigService _configService;
private readonly Dictionary<string, string> _placeholders;
private readonly IAuthenticator _authenticator;
public EnvelopeMailService(IEmailOutRepository repository, IMapper mapper, IEmailTemplateService tempService, IEnvelopeReceiverService envelopeReceiverService, IOptions<DispatcherParams> dispatcherConfigOptions, IConfigService configService, IOptions<MailParams> mailConfig, IAuthenticator authenticator) : base(repository, mapper)
{
_tempService = tempService;
_envRcvService = envelopeReceiverService;
_dConfig = dispatcherConfigOptions.Value;
_configService = configService;
_placeholders = mailConfig.Value.Placeholders;
_authenticator = authenticator;
}
private async Task<Dictionary<string, string>> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? envelopeReceiverDto = null)
{
if (accessCode is not null)
_placeholders["[DOCUMENT_ACCESS_CODE]"] = accessCode;
if(envelopeReceiverDto?.Envelope is not null && envelopeReceiverDto.Receiver is not null)
{
var erId = (envelopeReceiverDto.Envelope.Uuid, envelopeReceiverDto.Receiver.Signature).EncodeEnvelopeReceiverId();
var sigHost = await _configService.ReadDefaultSignatureHost();
var linkToDoc = $"{sigHost}/EnvelopeKey/{erId}";
_placeholders["[LINK_TO_DOCUMENT]"] = linkToDoc;
_placeholders["[LINK_TO_DOCUMENT_TEXT]"] = linkToDoc[..Math.Min(40, linkToDoc.Length)] + "..";
}
return _placeholders;
}
private async Task<Dictionary<string, string>> CreatePlaceholders(EnvelopeReceiverReadOnlyDto? readOnlyDto = null)
{
if (readOnlyDto?.Envelope is not null && readOnlyDto.Receiver is not null)
{
_placeholders["[NAME_RECEIVER]"] = await _envRcvService.ReadLastUsedReceiverNameByMail(readOnlyDto.AddedWho).ThenAsync(res => res, (msg, ntc) => string.Empty) ?? string.Empty;
var erReadOnlyId = (readOnlyDto.Id).EncodeEnvelopeReceiverId();
var sigHost = await _configService.ReadDefaultSignatureHost();
var linkToDoc = $"{sigHost}/EnvelopeKey/{erReadOnlyId}";
_placeholders["[LINK_TO_DOCUMENT]"] = linkToDoc;
_placeholders["[LINK_TO_DOCUMENT_TEXT]"] = linkToDoc[..Math.Min(40, linkToDoc.Length)] + "..";
}
return _placeholders;
}
public async Task<DataResult<int>> SendAsync(EnvelopeReceiverDto dto, EmailTemplateType tempType, Dictionary<string, object>? optionalPlaceholders = null)
{
var tempSerResult = await _tempService.ReadByNameAsync(tempType);
if (tempSerResult.IsFailed)
return tempSerResult.ToFail<int>().Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"The email cannot send because '{tempType}' template cannot found.");
var temp = tempSerResult.Data;
var mail = new EmailOutCreateDto()
{
EmailAddress = dto.Receiver!.EmailAddress,
EmailSubj = temp.Subject,
EmailBody = temp.Body,
//email_type = envelope_status,
//message = envelope_message,
ReferenceId = dto.EnvelopeId, //REFERENCE_ID = ENVELOPE_ID
ReferenceString = dto!.Envelope!.Uuid, //REFERENCE_STRING = ENVELOPE_UUID
//receiver_name = receiver.name,
//receiver_access_code = receiver.access_code,
//sender_adress = envelope.user.email,
//sender_name = envelope.user.full_name,
//envelope_title = envelope.title,
ReminderTypeId = _dConfig.ReminderTypeId,
SendingProfile = _dConfig.SendingProfile,
EntityId = null,
WfId = (int) EnvelopeStatus.MessageAccessCodeSent,
WfReference = null,
AddedWho = _dConfig.AddedWho,
EmailAttmt1 = _dConfig.EmailAttmt1
};
//get acccess code
var acResult = await _envRcvService.ReadAccessCodeByIdAsync(envelopeId: dto.EnvelopeId, receiverId: dto.ReceiverId);
if (acResult.IsFailed)
return acResult.ToFail<int>().Notice(LogLevel.Error, "Therefore, access code cannot be sent");
var accessCode = acResult.Data;
var placeholders = await CreatePlaceholders(accessCode: accessCode, envelopeReceiverDto: dto);
// Add optional place holders.
if (optionalPlaceholders is not null)
foreach (var oph in optionalPlaceholders)
placeholders[oph.Key] = oph.Value.ToString() ?? "NULL";
//TODO: remove the requirement to add the models using reflections
return await CreateWithTemplateAsync(createDto: mail,placeholders: placeholders,
dto, dto.Envelope.User!, dto.Envelope);
}
public async Task<DataResult<int>> SendAsync(EnvelopeReceiverReadOnlyDto dto, Dictionary<string, object>? optionalPlaceholders = null)
{
var tempSerResult = await _tempService.ReadByNameAsync(EmailTemplateType.DocumentShared);
if (tempSerResult.IsFailed)
return tempSerResult.ToFail<int>().Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"The email cannot send because '{Constants.EmailTemplateType.DocumentShared}' template cannot found.");
var temp = tempSerResult.Data;
var mail = new EmailOutCreateDto()
{
EmailAddress = dto.ReceiverMail,
EmailSubj = temp.Subject,
EmailBody = temp.Body,
//TODO: remove int casting when all
ReferenceId = (int) dto.EnvelopeId, //REFERENCE_ID = ENVELOPE_ID
ReferenceString = dto.Envelope!.Uuid, //REFERENCE_STRING = ENVELOPE_UUID
//receiver_name = receiver.name,
//receiver_access_code = receiver.access_code,
//sender_adress = envelope.user.email,
//sender_name = envelope.user.full_name,
//envelope_title = envelope.title,
ReminderTypeId = _dConfig.ReminderTypeId,
SendingProfile = _dConfig.SendingProfile,
EntityId = null,
WfId = (int)EnvelopeStatus.EnvelopeShared,
WfReference = null,
AddedWho = _dConfig.AddedWho,
EmailAttmt1 = _dConfig.EmailAttmt1
};
var placeholders = await CreatePlaceholders(readOnlyDto: dto);
// Add optional place holders.
if (optionalPlaceholders is not null)
foreach (var oph in optionalPlaceholders)
placeholders[oph.Key] = oph.Value.ToString() ?? "NULL";
return await CreateWithTemplateAsync(createDto: mail, placeholders: placeholders, dto.Envelope);
}
public async Task<DataResult<int>> SendAccessCodeAsync(EnvelopeReceiverDto dto) => await SendAsync(dto: dto, tempType: EmailTemplateType.DocumentAccessCodeReceived);
public Task<DataResult<int>> SendTFAQrCodeAsync(EnvelopeReceiverDto dto)
{
// Check if receiver or secret key is null
if (dto.Receiver is null)
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver information is missing. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
if (dto.Receiver.TotpSecretkey is null)
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver.TotpSecretKey is null. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
var totp_qr_64 = _authenticator.GenerateTotpQrCode(userEmail: dto.Receiver.EmailAddress, secretKey: dto.Receiver.TotpSecretkey).ToBase64String();
return SendAsync(dto, EmailTemplateType.TotpSecret, new()
{
{"[TFA_QR_CODE]", totp_qr_64 },
});
}
}
}

View File

@@ -0,0 +1,16 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
namespace EnvelopeGenerator.Application.Services
{
public class EnvelopeReceiverReadOnlyService : CRUDService<IEnvelopeReceiverReadOnlyRepository, EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnlyDto, EnvelopeReceiverReadOnlyUpdateDto, EnvelopeReceiverReadOnly, long>, IEnvelopeReceiverReadOnlyService
{
public EnvelopeReceiverReadOnlyService(IEnvelopeReceiverReadOnlyRepository repository, IMapper mapper) : base(repository, mapper)
{
}
}
}

View File

@@ -0,0 +1,179 @@
using AutoMapper;
using DigitalData.Core.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using EnvelopeGenerator.Extensions;
using EnvelopeGenerator.Application.DTOs.Messaging;
namespace EnvelopeGenerator.Application.Services
{
public class EnvelopeReceiverService : BasicCRUDService<IEnvelopeReceiverRepository, EnvelopeReceiverDto, EnvelopeReceiver, (int Envelope, int Receiver)>, IEnvelopeReceiverService
{
private readonly IStringLocalizer<Resource> _localizer;
private readonly ISmsSender _smsSender;
public EnvelopeReceiverService(IEnvelopeReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper, ISmsSender smsSender)
: base(repository, mapper)
{
_localizer = localizer;
_smsSender = smsSender;
}
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true)
{
var env_rcvs = await _repository.ReadBySignatureAsync(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly);
return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverDto>>(env_rcvs));
}
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false, bool readOnly = true)
{
var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly);
return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverDto>>(env_rcvs));
}
public async Task<DataResult<IEnumerable<string?>>> ReadAccessCodeByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true)
{
var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver);
return Result.Success(env_rcvs.Select(er => er.AccessCode));
}
public async Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true)
{
var env_rcv = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly);
if (env_rcv is null)
return Result.Fail<EnvelopeReceiverDto>()
.Message(Key.EnvelopeReceiverNotFound);
return Result.Success(_mapper.Map<EnvelopeReceiverDto>(env_rcv));
}
public async Task<DataResult<EnvelopeReceiverSecretDto>> ReadWithSecretByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true)
{
var env_rcv = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly);
if (env_rcv is null)
return Result.Fail<EnvelopeReceiverSecretDto>()
.Message(Key.EnvelopeReceiverNotFound);
return Result.Success(_mapper.Map<EnvelopeReceiverSecretDto>(env_rcv));
}
public async Task<DataResult<EnvelopeReceiverDto>> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true)
{
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
if (uuid is null || signature is null)
return Result.Fail<EnvelopeReceiverDto>()
.Message(_localizer[Key.WrongEnvelopeReceiverId])
.Notice(LogLevel.Warning, (uuid, signature).ToTitle())
.Notice(LogLevel.Warning, EnvelopeFlag.WrongEnvelopeReceiverId)
.Notice(LogLevel.Warning, Flag.PossibleSecurityBreach);
return await ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly);
}
public async Task<DataResult<bool>> VerifyAccessCodeAsync(string uuid, string signature, string accessCode)
{
var er = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature);
if (er is null)
return Result.Fail<bool>()
.Message(_localizer[Key.EnvelopeOrReceiverNonexists])
.Notice(LogLevel.Warning, (uuid, signature).ToTitle())
.Notice(LogLevel.Warning, EnvelopeFlag.EnvelopeOrReceiverNonexists)
.Notice(LogLevel.Warning, Flag.PossibleDataIntegrityIssue);
var actualAccessCode = er.AccessCode;
if (actualAccessCode is null)
return Result.Fail<bool>()
.Message(_localizer[Key.AccessCodeNull])
.Notice(LogLevel.Critical, (uuid, signature).ToTitle())
.Notice(LogLevel.Critical, EnvelopeFlag.AccessCodeNull)
.Notice(LogLevel.Critical, Flag.DataIntegrityIssue);
else if (accessCode != actualAccessCode)
return Result.Success(false).Message(_localizer[Key.WrongAccessCode]);
else
return Result.Success(true);
}
public async Task<DataResult<bool>> VerifyAccessCodeAsync(string envelopeReceiverId, string accessCode)
{
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
if (uuid is null || signature is null)
return Result.Fail<bool>()
.Message(Key.WrongEnvelopeReceiverId)
.Notice(LogLevel.Critical, EnvelopeFlag.WrongEnvelopeReceiverId)
.Notice(LogLevel.Critical, Flag.SecurityBreach)
.Notice(LogLevel.Critical, "Attempt to verify access code detected. Such actions are generally not initiated by well-intentioned users. Potential security breach suspected. Immediate investigation required.");
return await VerifyAccessCodeAsync(uuid: uuid, signature: signature, accessCode: accessCode);
}
public async Task<DataResult<bool>> IsExisting(string envelopeReceiverId)
{
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
if (uuid is null || signature is null)
return Result.Fail<bool>().Notice(LogLevel.Warning, EnvelopeFlag.NonDecodableEnvelopeReceiverId, "In IsExisting(string envelopeReceiverId)");
int count = await _repository.CountAsync(uuid:uuid, signature:signature);
return Result.Success(count > 0);
}
public async Task<DataResult<string>> ReadAccessCodeByIdAsync(int envelopeId, int receiverId)
{
var code = await _repository.ReadAccessCodeByIdAsync(envelopeId: envelopeId, receiverId: receiverId);
return code is null ?
Result.Fail<string>().Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"Access code is null. Envelope ID is {envelopeId} and receiver ID {receiverId}")
: Result.Success(code);
}
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses)
{
var er_list = await _repository.ReadByUsernameAsync(username: username, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses);
var dto_list = _mapper.Map<IEnumerable<EnvelopeReceiverDto>>(er_list);
return Result.Success(dto_list);
}
public async Task<DataResult<string?>> ReadLastUsedReceiverNameByMail(string mail)
{
var er = await _repository.ReadLastByReceiver(mail);
return er is null ? Result.Fail<string?>().Notice(LogLevel.None, Flag.NotFound) : Result.Success(er.Name);
}
public async Task<DataResult<SmsResponse>> SendSmsAsync(string envelopeReceiverId, string message)
{
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
if (uuid is null || signature is null)
return Result.Fail<SmsResponse>()
.Message(_localizer[Key.WrongEnvelopeReceiverId])
.Notice(LogLevel.Warning, (uuid, signature).ToTitle())
.Notice(LogLevel.Warning, EnvelopeFlag.WrongEnvelopeReceiverId)
.Notice(LogLevel.Warning, Flag.PossibleSecurityBreach);
var env_rcv = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: false, withReceiver: false);
if (env_rcv is null)
return Result.Fail<SmsResponse>()
.Message(Key.EnvelopeReceiverNotFound);
if (env_rcv.PhoneNumber is null)
return Result.Fail<SmsResponse>()
.Message(Key.PhoneNumberNonexists)
.Notice(LogLevel.Error, Flag.NotFound, $"An attempt was made to send sms to the user whose phone number is null. Envelope recipient ID is {envelopeReceiverId}, UUID is {uuid} and signature is {signature}.");
var res = await _smsSender.SendSmsAsync(recipient: env_rcv.PhoneNumber, message: message);
return Result.Success(res);
}
}
}

View File

@@ -0,0 +1,43 @@
using AutoMapper;
using DigitalData.Core.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
namespace EnvelopeGenerator.Application.Services
{
public class EnvelopeService : BasicCRUDService<IEnvelopeRepository, EnvelopeDto, Envelope, int>, IEnvelopeService
{
public EnvelopeService(IEnvelopeRepository repository, IMapper mapper)
: base(repository, mapper)
{
}
public async Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false)
{
var envelopes = await _repository.ReadAllWithAsync(documents: documents, history: history, documentReceiverElement: documentReceiverElement);
var readDto = _mapper.Map<IEnumerable<EnvelopeDto>>(envelopes);
return Result.Success(readDto);
}
public async Task<DataResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false)
{
var envelope = await _repository.ReadByUuidAsync(uuid: uuid, withDocuments: withDocuments, withHistory: withHistory, withDocumentReceiverElement: withDocumentReceiverElement, withUser:withUser, withAll:withAll);
if (envelope is null)
return Result.Fail<EnvelopeDto>();
var readDto = _mapper.Map<EnvelopeDto>(envelope);
return Result.Success(readDto);
}
public async Task<DataResult<IEnumerable<EnvelopeDto>>> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[] ignore_statuses)
{
var users = await _repository.ReadByUserAsync(userId: userId, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses);
var readDto = _mapper.Map<IEnumerable<EnvelopeDto>>(users);
return Result.Success(readDto);
}
}
}

View File

@@ -0,0 +1,54 @@
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Messaging;
using EnvelopeGenerator.Application.Extensions;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Options;
namespace EnvelopeGenerator.Application.Services;
public class EnvelopeSmsHandler : IEnvelopeSmsHandler
{
private readonly ISmsSender _sender;
private readonly TotpSmsParams _totpSmsParams;
private readonly IDistributedCache _dCache;
private readonly IAuthenticator _authenticator;
public EnvelopeSmsHandler(ISmsSender sender, IOptions<TotpSmsParams> totpSmsParamsOptions, IDistributedCache distributedCache, IAuthenticator authenticator)
{
_sender = sender;
_totpSmsParams = totpSmsParamsOptions.Value;
_dCache = distributedCache;
_authenticator = authenticator;
}
/// <summary>
/// If expiration is passed then, sends sms and returns smsResponse and up-to-date expiration; otherwise send expiration.
/// </summary>
/// <param name="er_secret"></param>
/// <param name="cToken"></param>
/// <returns></returns>
public async Task<(SmsResponse? SmsResponse, DateTime Expiration)> SendTotpAsync(EnvelopeReceiverSecretDto er_secret, CancellationToken cToken = default)
{
var key = string.Format(_totpSmsParams.Expiration.CacheKeyFormat, er_secret.EnvelopeId, er_secret.ReceiverId);
var expiration = await _dCache.GetDateTimeAsync(key, cToken);
if(expiration is DateTime expirationDateTime && expirationDateTime >= DateTime.Now)
return (null, expirationDateTime);
else
{
var new_expiration = DateTime.Now.AddSeconds(_totpSmsParams.TotpStep);
var totp = _authenticator.GenerateTotp(er_secret.Receiver!.TotpSecretkey!, _totpSmsParams.TotpStep);
var msg = string.Format(_totpSmsParams.Format, totp, new_expiration.ToString(_totpSmsParams.Expiration.Format, _totpSmsParams.Expiration.CultureInfo));
await _dCache.SetDateTimeAsync(key, new_expiration, cToken: cToken);
return (await _sender.SendSmsAsync(er_secret.PhoneNumber!, msg), new_expiration);
}
}
public bool VerifyTotp(string totpCode, string secretKey) => _authenticator
.VerifyTotp(totpCode, secretKey, _totpSmsParams.TotpStep, _totpSmsParams.TotpVerificationWindow);
}

View File

@@ -0,0 +1,30 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
using Microsoft.Extensions.Caching.Memory;
using DigitalData.Core.DTO;
using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services
{
public class EnvelopeTypeService : BasicCRUDService<IEnvelopeTypeRepository, EnvelopeTypeDto, EnvelopeType, int>, IEnvelopeTypeService
{
private static readonly Guid CacheKey = Guid.NewGuid();
private readonly IMemoryCache _cache;
public EnvelopeTypeService(IEnvelopeTypeRepository repository, IMapper mapper, IMemoryCache cache)
: base(repository, mapper)
{
_cache = cache;
}
public override async Task<DataResult<IEnumerable<EnvelopeTypeDto>>> ReadAllAsync()
=> await _cache.GetOrCreateAsync(CacheKey, async entry => await base.ReadAllAsync())
?? Result.Fail<IEnumerable<EnvelopeTypeDto>>().Notice(LogLevel.Error, Flag.NotFound, "No cached envelope types are available in the database. If you have added any envelope types after the server started, please restart the server.");
}
}

View File

@@ -0,0 +1,40 @@
using AutoMapper;
using DigitalData.Core.Abstractions.Client;
using DigitalData.Core.Client;
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.Messaging;
using Microsoft.Extensions.Options;
namespace EnvelopeGenerator.Application.Services;
//TODO: move to DigitalData.Core
public class GTXSmsSender : ISmsSender
{
private readonly IHttpClientService<GtxMessagingParams> _smsClient;
private readonly GtxMessagingParams _smsParams;
private readonly IMapper _mapper;
public string ServiceProvider { get; }
public GTXSmsSender(IHttpClientService<GtxMessagingParams> smsClient, IOptions<GtxMessagingParams> smsParamsOptions, IMapper mapper)
{
_smsClient = smsClient;
_smsParams = smsParamsOptions.Value;
_mapper = mapper;
ServiceProvider = GetType().Name.Replace("Service", string.Empty);
}
public async Task<SmsResponse> SendSmsAsync(string recipient, string message)
{
return await _smsClient.FetchAsync(queryParams: new Dictionary<string, object?>()
{
{ _smsParams.RecipientQueryParamName, recipient },
{ _smsParams.MessageQueryParamName, message }
})
.ThenAsync(res => res.Json<GtxMessagingResponse>())
.ThenAsync(_mapper.Map<SmsResponse>);
}
}

View File

@@ -0,0 +1,52 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Application.DTOs.Receiver;
using DigitalData.Core.DTO;
using DigitalData.Core.Abstractions;
using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services
{
public class ReceiverService : CRUDService<IReceiverRepository, ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>, IReceiverService
{
public ReceiverService(IReceiverRepository repository, IMapper mapper)
: base(repository, mapper)
{
}
public async Task<DataResult<ReceiverReadDto>> ReadByAsync(string? emailAddress = null, string? signature = null)
{
var rcv = await _repository.ReadByAsync(emailAddress: emailAddress, signature: signature);
if (rcv is null)
return Result.Fail<ReceiverReadDto>();
return Result.Success(_mapper.Map<ReceiverReadDto>(rcv));
}
public async Task<Result> DeleteByAsync(string? emailAddress = null, string? signature = null)
{
var rcv = await _repository.ReadByAsync(emailAddress: emailAddress, signature: signature);
if (rcv is null)
return Result.Fail();
return await _repository.DeleteAsync(rcv) ? Result.Success() : Result.Fail();
}
public virtual async Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto) where TUpdateDto : IUnique<int>
{
var val = await _repository.ReadByIdAsync(updateDto.Id);
if (val == null)
{
return Result.Fail().Notice(LogLevel.Warning, Flag.NotFound, $"{updateDto.Id} is not found in update process of {GetType()} entity.");
}
var entity = _mapper.Map(updateDto, val);
return (await _repository.UpdateAsync(entity)) ? Result.Success() : Result.Fail();
}
}
}

View File

@@ -0,0 +1,17 @@
using AutoMapper;
using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
namespace EnvelopeGenerator.Application.Services
{
public class UserReceiverService : BasicCRUDService<IUserReceiverRepository, UserReceiverDto, UserReceiver, int>, IUserReceiverService
{
public UserReceiverService(IUserReceiverRepository repository, IMapper mapper)
: base(repository, mapper)
{
}
}
}

View File

@@ -1,6 +1,7 @@
Public Class Constants
#Region "Status Fields"
'http://wiki.dd/xwiki13/bin/view/Anwendungen/Produkt-Handbuch/Sonstiges/SignFlow/Envelope%20Status/
Public Enum EnvelopeStatus
Invalid = 0
EnvelopeCreated = 1001
@@ -17,7 +18,11 @@
AccessCodeIncorrect = 2003
DocumentOpened = 2004
DocumentSigned = 2005
DocumentForwarded = 4001
SignatureConfirmed = 2006
DocumentRejected = 2007
EnvelopeShared = 2008
EnvelopeViewed = 2009
MessageInvitationSent = 3001 ' Wird von Trigger verwendet
MessageAccessCodeSent = 3002
MessageConfirmationSent = 3003
@@ -25,6 +30,14 @@
MessageCompletionSent = 3005
End Enum
'TODO: standardize in xwiki
Public Enum ReferenceType
Receiver
Sender
System
Unknown
End Enum
Public Enum ElementStatus
Created = 0
End Enum
@@ -64,8 +77,9 @@
End Enum
Public Enum CertificationType
ElectronicSignature = 1
QualifiedSignature = 2
AdvancedElectronicSignature = 1
'ElectronicSignature = 1
'QualifiedSignature = 2
End Enum
Public Enum FinalEmailType
@@ -85,8 +99,24 @@
DocumentDeleted
DocumentCompleted
DocumentAccessCodeReceived
DocumentShared
TotpSecret
End Enum
Public Enum EncodeType
EnvelopeReceiver
EnvelopeReceiverReadOnly
Undefined
DocumentForwarded
DocumentShared
End Enum
#End Region
#Region "Role"
Public NotInheritable Class ReceiverRole
Public Const PreAuth As String = "PreAuth"
Public Const FullyAuth As String = "FullyAuth"
End Class
#End Region
#Region "Constants"
@@ -94,9 +124,10 @@
Public Const DATABASE = "DATABASE"
Public Const LOGCONFIG = "LOGCONFIG"
Public Const GDPICTURE = "GDPICTURE"
Public Const IGNORED_LABELS = "IgnoredLabels"
Public Const GREEN_300 = "#bbf7d0"
Public Const RED_300 = "#fecaca"
Public Const ORANGE_300 = "#fed7aa"
#End Region
End Class
End Class

View File

@@ -1,7 +1,9 @@
Public Class DbConfig
Public Property ExternalProgramName As String = "Sign Flow"
Public Property ExternalProgramName As String = "signFLOW"
Public Property DocumentPathOrigin As String = ""
Public Property DocumentPath As String = ""
Public Property ExportPath As String = ""
Public Property SendingProfile As Integer = 0
Public Property SignatureHost As String = ""
Public Property Default_TFA_Enabled As Boolean = False
End Class

View File

@@ -17,6 +17,8 @@ Public Class EmailData
Public Property EnvelopeTitle As String = ""
Public Property EmailAttachment As String = ""
Public Property ATT1_RELATED_ID As Long
Public Property ATT1_REL_TYPE As String = ""
''' <summary>
''' Constructor for sending email to receiver

View File

@@ -8,8 +8,8 @@
Public Property Uuid As String = Guid.NewGuid.ToString()
Public Property UseAccessCode As Boolean = False
Public Property Language As String = "de-DE"
Public Property CertificationType As Constants.CertificationType = Constants.CertificationType.ElectronicSignature
Public Property CertificationType As Constants.CertificationType = Constants.CertificationType.AdvancedElectronicSignature
Public Property TFA_Enabled As Boolean = False
Public Property SendReminderEmails As Boolean = False
Public Property FirstReminderDays As Integer = 0
Public Property ReminderIntervalDays As Integer = 0
@@ -31,10 +31,10 @@
Public Property Receivers As New List(Of EnvelopeReceiver)
Public Property History As New List(Of EnvelopeHistoryEntry)
Public Property EnvelopeType As EnvelopeType
Public Property DOC_RESULT As Byte()
Public ReadOnly Property EnvelopeTypeTitle As String
Get
Return EnvelopeType.Title
Return EnvelopeType?.Title
End Get
End Property

View File

@@ -19,10 +19,5 @@ Public Class EnvelopeDocument
Public Property Filepath As String
Public Property PageCount As Integer
Public ReadOnly Property PageCountTranslated As String
Get
Return $"{PageCount} Seiten"
End Get
End Property
End Class
Public Property Byte_Data As Byte()
End Class

View File

@@ -75,6 +75,7 @@ Public Class EnvelopeReceiver
Public Property Sequence As Integer = 0
Public Property PrivateMessage As String = ""
Public Property AccessCode As String = ""
Public Property PhoneNumber As String = ""
Public Function GetSignature() As String
Return StringEx.GetChecksum(Email.ToUpper)

View File

@@ -6,7 +6,8 @@
Public Property ContractType As Integer ' Unbenutzt
Public Property Language As String
Public Property CertificationType As Constants.CertificationType = Constants.CertificationType.ElectronicSignature
Public Property CertificationType As Constants.CertificationType = Constants.CertificationType.AdvancedElectronicSignature
Public Property TFA_Enabled As Boolean = False
Public Property SendReminderEmails As Boolean = False
Public Property FirstReminderDays As Integer = 0
Public Property ReminderIntervalDays As Integer = 0

View File

@@ -13,6 +13,8 @@
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -63,22 +65,20 @@
<Reference Include="DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.XtraGauges.v21.2.Core, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraReports.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DigitalData.Modules.Base, Version=1.3.4.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
<Reference Include="DigitalData.Modules.Base">
<HintPath>..\..\2_DLL Projekte\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
</Reference>
<Reference Include="DigitalData.Modules.Config">
<HintPath>..\..\DDModules\Config\bin\Debug\DigitalData.Modules.Config.dll</HintPath>
<HintPath>..\..\2_DLL Projekte\DDModules\Config\bin\Debug\DigitalData.Modules.Config.dll</HintPath>
</Reference>
<Reference Include="DigitalData.Modules.Database">
<HintPath>..\..\DDModules\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath>
<HintPath>..\..\2_DLL Projekte\DDModules\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath>
</Reference>
<Reference Include="DigitalData.Modules.Logging, Version=2.6.2.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
<Reference Include="DigitalData.Modules.Logging">
<HintPath>..\..\2_DLL Projekte\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
</Reference>
<Reference Include="GdPicture.NET.14">
<HintPath>D:\ProgramFiles\GdPicture.NET 14\Redist\GdPicture.NET (.NET Framework 4.5)\GdPicture.NET.14.dll</HintPath>
<Reference Include="GdPicture.NET.14, Version=14.2.90.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
<HintPath>..\packages\GdPicture.14.2.90\lib\net462\GdPicture.NET.14.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
@@ -220,6 +220,8 @@
<DesignTime>True</DesignTime>
<DependentUpon>Model.resx</DependentUpon>
</Compile>
<Compile Include="Strings\Model.vb" />
<Compile Include="TempFiles.vb" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="My Project\licenses.licx" />
@@ -241,11 +243,13 @@
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Envelope.en.Designer.vb</LastGenOutput>
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Strings\Envelope.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Envelope1.Designer.vb</LastGenOutput>
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Strings\Email.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
@@ -256,14 +260,17 @@
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Model.en.Designer.vb</LastGenOutput>
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Strings\Model.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Model.Designer.vb</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="My Project\Application.myapp">
<Generator>MyApplicationCodeGenerator</Generator>
<LastGenOutput>Application.Designer.vb</LastGenOutput>
@@ -284,4 +291,11 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
<Import Project="..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets" Condition="Exists('..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets'))" />
</Target>
</Project>

View File

@@ -1,9 +1,28 @@
Imports System.Drawing
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text
Imports DevExpress.Utils.Svg
Imports EnvelopeGenerator.Common.Constants
Public Class Helpers
Private Shared key As String = "$xzBvyPETUS&amm8)D8x#)f;4%;?[BPd" ' Passwort-Schlüssel (16, 24, or 32 bytes)
Private Shared iv As String = "1wN&e[zrQ6_B7X/0" ' Initialisierungsvektor (16 bytes)
' Entschlüsselungsfunktion
Public Shared Function Decrypt(cipherText As String) As String
Dim aesAlg As Aes = Aes.Create()
aesAlg.Key = Encoding.UTF8.GetBytes(key)
aesAlg.IV = Encoding.UTF8.GetBytes(iv)
Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)
Dim cipherBytes As Byte() = Convert.FromBase64String(cipherText)
Dim msDecrypt As New IO.MemoryStream(cipherBytes)
Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
Using srDecrypt As New IO.StreamReader(csDecrypt)
Return srDecrypt.ReadToEnd()
End Using
End Using
End Function
''' <summary>
''' Encodes the EnvelopeUUID and the ReceiverSignature into an EnvelopeKey

View File

@@ -7,8 +7,9 @@ Imports System.Security.Cryptography
Imports System.IO
Imports EnvelopeGenerator.Common.Jobs.FinalizeDocument.FinalizeDocumentExceptions
Imports EnvelopeGenerator.Common.Jobs.FinalizeDocument
Imports EnvelopeGenerator.Common.My.Resources
Imports EnvelopeGenerator.Common.Constants
Imports DevExpress.DataProcessing
Imports System.Data.SqlClient
Namespace Jobs
Public Class FinalizeDocumentJob
@@ -32,12 +33,16 @@ Namespace Jobs
Private PDFMerger As PDFMerger
Private ReportCreator As ReportCreator
Private ReadOnly CompleteWaitTimeInMinutes As Integer = 5
Private ReadOnly CompleteWaitTime As Integer = 1
Private ParentFolderUID As String = ""
Private myTempFiles As TempFiles
Private Class EnvelopeData
Public EnvelopeId As Integer
Public EnvelopeUUID As String
Public DocumentPath As String
Public AnnotationData As List(Of String)
Public DocAsByte As Byte()
End Class
@@ -45,7 +50,8 @@ Namespace Jobs
Dim oGdPictureKey As String = pContext.MergedJobDataMap.Item(Constants.GDPICTURE)
LogConfig = pContext.MergedJobDataMap.Item(Constants.LOGCONFIG)
Logger = LogConfig.GetLogger()
myTempFiles = New TempFiles(LogConfig)
myTempFiles.Create()
Dim JobId = pContext.JobDetail.Key
Logger.Info("Starting job {0}", JobId)
@@ -68,7 +74,8 @@ Namespace Jobs
InitializeServices(oState)
Logger.Debug("Loading PDFBurner..")
PDFBurner = New PDFBurner(LogConfig, oGdPictureKey)
Dim ignoredLabels As List(Of String) = pContext.MergedJobDataMap.Item(Constants.IGNORED_LABELS)
PDFBurner = New PDFBurner(LogConfig, oGdPictureKey, ignoredLabels)
Logger.Debug("Loading PDFMerger..")
PDFMerger = New PDFMerger(LogConfig, oGdPictureKey)
@@ -76,11 +83,15 @@ Namespace Jobs
Logger.Debug("Loading ReportCreator..")
ReportCreator = New ReportCreator(LogConfig, oState)
Config.DocumentPath = Config.DocumentPath
Logger.Debug("DocumentPath: [{0}]", Config.DocumentPath)
Logger.Debug("ExportPath: [{0}]", Config.ExportPath)
Dim oCompleteStatus As Integer = Constants.EnvelopeStatus.EnvelopeCompletelySigned
Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE WHERE STATUS = {oCompleteStatus} AND DATEDIFF(minute, CHANGED_WHEN, GETDATE()) >= {CompleteWaitTimeInMinutes}"
Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE WHERE STATUS = {oCompleteStatus} AND DATEDIFF(minute, CHANGED_WHEN, GETDATE()) >= {CompleteWaitTime} ORDER BY GUID"
Dim oTable = Database.GetDatatable(oSql)
Dim oEnvelopeIds As List(Of Integer) = oTable.Rows.Cast(Of DataRow).
@@ -88,81 +99,87 @@ Namespace Jobs
Cast(Of Integer).
ToList()
Logger.Info("Found [{0}] completed envelopes.", oEnvelopeIds.Count)
If oEnvelopeIds.Count > 0 Then
Logger.Info("Found [{0}] completed envelopes.", oEnvelopeIds.Count)
End If
Dim oTotal As Integer = oEnvelopeIds.Count
Dim oCurrent As Integer = 1
For Each oId In oEnvelopeIds
Logger.Info("Finalizing Envelope [{0}] ({1}/{2})", oId, oCurrent, oTotal)
Logger.Debug("Loading Envelope..")
Dim oEnvelope = EnvelopeModel.GetById(oId)
If oEnvelope Is Nothing Then
Logger.Warn("Envelope could not be loaded for Id [{0}]!", oId)
Throw New ArgumentNullException("EnvelopeData")
End If
Logger.Debug("Loading Envelope Data..")
Dim oEnvelopeData = GetEnvelopeData(oId)
If oEnvelopeData Is Nothing Then
Logger.Warn("EnvelopeData could not be loaded for Id [{0}]!", oId)
Throw New ArgumentNullException("EnvelopeData")
End If
Logger.Debug("Burning Annotations to pdf")
Dim oBurnedDocument As Byte() = BurnAnnotationsToPdf(oEnvelopeData)
If oBurnedDocument Is Nothing Then
Logger.Warn("Document could not be finalized!")
Throw New ApplicationException("Document could not be finalized")
End If
If ActionService.CreateReport(oEnvelope) = False Then
Logger.Warn("Document Report could not be created!")
Throw New ApplicationException("Document Report could not be created")
End If
Logger.Debug("Creating report..")
Dim oReport As Byte() = ReportCreator.CreateReport(oEnvelope)
Logger.Debug("Report created.")
Logger.Debug("Merging documents..")
Dim oMergedDocument As Byte() = PDFMerger.MergeDocuments(oBurnedDocument, oReport)
Logger.Debug("Documents merged.")
Dim oOutputDirectoryPath = Config.ExportPath
Dim oOutputFilePath = Path.Combine(oOutputDirectoryPath, $"{oEnvelope.Uuid}.pdf")
Logger.Info("Writing finalized Pdf to disk..")
Logger.Info("Output path is [{0}]", oOutputFilePath)
Try
File.WriteAllBytes(oOutputFilePath, oMergedDocument)
Dim oEnvelope = EnvelopeModel.GetById(oId)
If oEnvelope Is Nothing Then
Logger.Warn("Envelope could not be loaded for Id [{0}]!", oId)
Throw New ArgumentNullException("EnvelopeData")
End If
Logger.Debug("Loading Envelope Data..")
Dim oEnvelopeData = GetEnvelopeData(oId)
If oEnvelopeData Is Nothing Then
Logger.Warn("EnvelopeData could not be loaded for Id [{0}]!", oId)
Throw New ArgumentNullException("EnvelopeData")
End If
Logger.Debug("Burning Annotations to pdf ...")
Dim oBurnedDocument As Byte() = BurnAnnotationsToPdf(oEnvelopeData)
If oBurnedDocument Is Nothing Then
Logger.Warn("Document could not be finalized!")
Throw New ApplicationException("Document could not be finalized")
End If
If ActionService.CreateReport(oEnvelope) = False Then
Logger.Warn("Document Report could not be created!")
Throw New ApplicationException("Document Report could not be created")
End If
Logger.Debug("Creating report..")
Dim oReport As Byte() = ReportCreator.CreateReport(oEnvelope)
Logger.Debug("Report created!")
Logger.Debug("Merging documents ...")
Dim oMergedDocument As Byte() = PDFMerger.MergeDocuments(oBurnedDocument, oReport)
Logger.Debug("Documents merged!")
Dim oOutputDirectoryPath = Path.Combine(Config.ExportPath, ParentFolderUID)
If Not Directory.Exists(oOutputDirectoryPath) Then
Directory.CreateDirectory(oOutputDirectoryPath)
End If
Dim oOutputFilePath = Path.Combine(oOutputDirectoryPath, $"{oEnvelope.Uuid}.pdf")
Logger.Info("Writing finalized Pdf to disk..")
Logger.Info("Output path is [{0}]", oOutputFilePath)
Try
File.WriteAllBytes(oOutputFilePath, oMergedDocument)
Catch ex As Exception
Logger.Warn("Could not export final document to disk!")
Throw New ExportDocumentException("Could not export final document to disk!", ex)
End Try
Logger.Info("Writing EB-bytes to database...")
Update_File_DB(oOutputFilePath, oEnvelope.Id)
Logger.Info("Sending finalized report-mails..")
If SendFinalEmails(oEnvelope) = False Then ', oOutputFilePath
Throw New ApplicationException("Final emails could not be sent!")
End If
Logger.Debug("Setting envelope status..")
If ActionService.FinalizeEnvelope(oEnvelope) = False Then
Logger.Warn("Envelope could not be finalized!")
Throw New ApplicationException("Envelope could not be finalized")
End If
Catch ex As Exception
Logger.Warn("Could not export final document to disk!")
Throw New ExportDocumentException("Could not export final document to disk!", ex)
Logger.Warn($"Unhandled exception while working envelope [{oId}] - [{ex.Message}]")
End Try
Logger.Info("Sending final Emails..")
If SendFinalEmails(oEnvelope, oOutputFilePath) = False Then
Throw New ApplicationException("Final emails could not be sent!")
End If
Logger.Debug("Setting envelope status..")
If ActionService.FinalizeEnvelope(oEnvelope) = False Then
Logger.Warn("Envelope could not be finalized!")
Throw New ApplicationException("Envelope could not be finalized")
End If
oCurrent += 1
Logger.Info("Envelope finalized!")
Next
Logger.Info("Completed job {0} successfully!", JobId)
Logger.Debug("Completed job {0} successfully!", JobId)
Catch ex As MergeDocumentException
Logger.Warn("Certificate Document job failed at step: Merging documents!")
Logger.Error(ex)
@@ -180,34 +197,119 @@ Namespace Jobs
Return Task.FromResult(True)
End Function
Private Sub Update_File_DB(pFilePath As String, pEnvelopeID As Long)
Dim SqlCom As SqlCommand
Dim imageData As Byte()
Dim sFileName As String
Dim qry As String
Private Function SendFinalEmails(pEnvelope As Envelope, pAttachment As String) As Boolean
Try
'Read Image Bytes into a byte array
'Initialize SQL Server Connection
'Convert File to bytes Array
imageData = ReadFile(pFilePath)
If Not IsNothing(imageData) Then
sFileName = System.IO.Path.GetFileName(pFilePath)
'Set insert query
qry = $"UPDATE TBSIG_ENVELOPE SET DOC_RESULT = @ImageData WHERE GUID = {pEnvelopeID}"
'Initialize SqlCommand object for insert.
SqlCom = New SqlCommand(qry, Database.GetConnection)
'We are passing File Name and Image byte data as sql parameters.
SqlCom.Parameters.Add(New SqlParameter("@ImageData", DirectCast(imageData, Object)))
'Execute the Query
SqlCom.ExecuteNonQuery()
End If
Catch ex As Exception
Logger.Error(ex)
End Try
End Sub
'Open file in to a filestream and read data in a byte array.
Private Function ReadFile(ByVal sPath As String) As Byte()
'Initialize byte array with a null value initially.
Dim data As Byte() = Nothing
'Use FileInfo object to get file size.
Dim fInfo As New FileInfo(sPath)
Dim numBytes As Long = fInfo.Length
'Open FileStream to read file
Dim fStream As New FileStream(sPath, FileMode.Open, FileAccess.Read)
'Use BinaryReader to read file stream into byte array.
Dim br As New BinaryReader(fStream)
'When you use BinaryReader, you need to supply number of bytes to read from file.
'In this case we want to read entire file. So supplying total number of bytes.
data = br.ReadBytes(CInt(numBytes))
Return data
End Function
'Private Function NetUse_Command(pDestinationPath As String, pUsername As String, pPassword As String)
' Dim oDectryptedPW = Helpers.Decrypt(My.Settings.NetUse_PW)
' Dim netUseCommand As String = $"net use {pDestinationPath} /user:{pUsername} {oDectryptedPW}"
' Logger.Debug("EXECUTING NetUse_Command for " & pDestinationPath)
' Dim processInfo As New ProcessStartInfo("cmd.exe", $"/C {netUseCommand}")
' processInfo.RedirectStandardOutput = True
' processInfo.UseShellExecute = False
' processInfo.CreateNoWindow = True
' Using process As Process = Process.Start(processInfo)
' process.WaitForExit()
' ' Prüfe den Rückgabewert des net use Befehls
' If process.ExitCode = 0 Then
' Return True
' Else
' Return False
' End If
' End Using
'End Function
'Private Function Clean_DNZ_PAth(pSourcePath As String) As Boolean
' Dim oFilename = System.IO.Path.GetFileName(pSourcePath)
' Logger.Debug("## Starting Clean_DNZ_PAth ...")
' Logger.Debug("## pSourcePath {0}", pSourcePath)
' Dim oDirectorySource = Path.Combine(pSourcePath, ParentFolderUID)
' Try
' Logger.Debug($"Deleting oDirectorySource {oDirectorySource} ...")
' Directory.Delete(oDirectorySource, True)
' Console.WriteLine($"Folder successfully deleted!")
' Logger.Debug($"...Deleted!")
' Return True
' Catch ex As Exception
' Logger.Error(ex)
' Return False
' End Try
'End Function
Private Function SendFinalEmails(pEnvelope As Envelope) As Boolean ', pAttachment As String
Dim oMailToCreator = pEnvelope.FinalEmailToCreator
Dim oMailToReceivers = pEnvelope.FinalEmailToReceivers
If oMailToCreator <> FinalEmailType.No Then
Logger.Debug("Sending email to creator..")
SendFinalEmailToCreator(pEnvelope, pAttachment)
Logger.Debug("Sending email to creator ...")
SendFinalEmailToCreator(pEnvelope) ', pAttachment
End If
If oMailToReceivers <> FinalEmailType.No Then
Logger.Debug("Sending emails to receivers..")
SendFinalEmailToReceivers(pEnvelope, pAttachment)
SendFinalEmailToReceivers(pEnvelope) ', pAttachment
End If
Return True
End Function
Private Function SendFinalEmailToCreator(pEnvelope As Envelope, pAttachment As String) As Boolean
Private Function SendFinalEmailToCreator(pEnvelope As Envelope) As Boolean ', pAttachment As String
Dim oIncludeAttachment = SendFinalEmailWithAttachment(pEnvelope.FinalEmailToCreator)
Dim oAttachment = String.Empty
' Dim oAttachment = String.Empty
Logger.Debug("Attachment included: [{0}]", oIncludeAttachment)
If oIncludeAttachment Then
oAttachment = pAttachment
'oAttachment = pAttachment
End If
If ActionService.CompleteEnvelope(pEnvelope, oAttachment) = False Then
If ActionService.CompleteEnvelope(pEnvelope) = False Then ', oAttachment
Logger.Error("Envelope could not be completed for receiver [{0}]", pEnvelope.User.Email)
Return False
End If
@@ -215,17 +317,18 @@ Namespace Jobs
Return True
End Function
Private Function SendFinalEmailToReceivers(pEnvelope As Envelope, pAttachment As String) As Boolean
Private Function SendFinalEmailToReceivers(pEnvelope As Envelope) As Boolean ', pAttachment As String
Dim oIncludeAttachment = SendFinalEmailWithAttachment(pEnvelope.FinalEmailToReceivers)
Dim oAttachment = String.Empty
'Dim oAttachment = String.Empty
Logger.Debug("Attachment included: [{0}]", oIncludeAttachment)
If oIncludeAttachment Then
oAttachment = pAttachment
' oAttachment = pAttachment
End If
For Each oReceiver In pEnvelope.Receivers
If ActionService.CompleteEnvelope(pEnvelope, oReceiver, oAttachment) = False Then
If ActionService.CompleteEnvelope(pEnvelope, oReceiver) = False Then ', oAttachment
Logger.Error("Envelope could not be completed for receiver [{0}]", oReceiver.Email)
Return False
End If
@@ -242,27 +345,50 @@ Namespace Jobs
End If
End Function
Private Function BurnAnnotationsToPdf(pData As EnvelopeData) As Byte()
Dim pEnvelopeId = pData.EnvelopeId
Private Function BurnAnnotationsToPdf(pEnvelopeData As EnvelopeData) As Byte()
Dim pEnvelopeId = pEnvelopeData.EnvelopeId
Logger.Info("Burning [{0}] signatures", pData.AnnotationData.Count)
Dim oAnnotations = pData.AnnotationData
Dim oInputPath = pData.DocumentPath
Logger.Info($"Burning [{pEnvelopeData.AnnotationData.Count}] signatures")
Dim oAnnotations = pEnvelopeData.AnnotationData
Dim oInputPath = ""
If IsNothing(pEnvelopeData.DocAsByte) Then
oInputPath = pEnvelopeData.DocumentPath
Logger.Info($"Input path: [{oInputPath}]")
Else
Logger.Info($"we got bytes..")
oInputPath = Config.DocumentPathOrigin
Logger.Info($"oInputPath: {Config.DocumentPathOrigin}")
End If
Logger.Info("Input path: [{0}]", oInputPath)
If IsNothing(pEnvelopeData.DocAsByte) Then
Dim oDirectorySource As String = Path.GetDirectoryName(oInputPath)
Dim split As String() = oDirectorySource.Split("\")
ParentFolderUID = split(split.Length - 1)
Else
ParentFolderUID = pEnvelopeData.EnvelopeUUID
End If
Logger.Info("ParentFolderUID: [{0}]", ParentFolderUID)
Dim oInputDocumentBuffer As Byte()
Try
oInputDocumentBuffer = File.ReadAllBytes(oInputPath)
Catch ex As Exception
Logger.Error(ex)
Throw New BurnAnnotationException("Source document could not be read from disk!", ex)
End Try
If Not IsNothing(pEnvelopeData.DocAsByte) Then
oInputDocumentBuffer = pEnvelopeData.DocAsByte
Else
Try
oInputDocumentBuffer = File.ReadAllBytes(oInputPath)
Catch ex As Exception
Logger.Error(ex)
Throw New BurnAnnotationException("Source document could not be read from disk!", ex)
End Try
End If
Return PDFBurner.BurnInstantJSONAnnotationsToPDF(oInputDocumentBuffer, oAnnotations)
End Function
Private Function GetEnvelopeData(pEnvelopeId As Integer) As EnvelopeData
Dim oSql = $"SELECT T.GUID, T2.FILEPATH FROM [dbo].[TBSIG_ENVELOPE] T
Dim oSql = $"SELECT T.GUID, T.ENVELOPE_UUID,T2.FILEPATH, T2.BYTE_DATA FROM [dbo].[TBSIG_ENVELOPE] T
JOIN TBSIG_ENVELOPE_DOCUMENT T2 ON T.GUID = T2.ENVELOPE_ID
WHERE T.GUID = {pEnvelopeId}"
Dim oTable As DataTable = Database.GetDatatable(oSql)
@@ -275,7 +401,9 @@ Namespace Jobs
Dim oData As New EnvelopeData With {
.EnvelopeId = pEnvelopeId,
.DocumentPath = oRow.ItemEx("FILEPATH", ""),
.AnnotationData = oAnnotationData
.AnnotationData = oAnnotationData,
.DocAsByte = DirectCast(oRow.Item("BYTE_DATA"), Byte()),
.EnvelopeUUID = oRow.ItemEx("ENVELOPE_UUID", "")
}
Logger.Debug("Document path: [{0}]", oData.DocumentPath)

View File

@@ -15,14 +15,18 @@ Namespace Jobs.FinalizeDocument
Private Const ANNOTATION_TYPE_IMAGE = "pspdfkit/image"
Private Const ANNOTATION_TYPE_INK = "pspdfkit/ink"
Private Const ANNOTATION_TYPE_WIDGET = "pspdfkit/widget"
Private Property _ignoredLabels As List(Of String)
Public Sub New(pLogConfig As LogConfig, pGDPictureLicenseKey As String)
Public Sub New(pLogConfig As LogConfig, pGDPictureLicenseKey As String, ignoredLabels As List(Of String))
MyBase.New(pLogConfig)
LicenseManager = New LicenseManager()
LicenseManager.RegisterKEY(pGDPictureLicenseKey)
Manager = New AnnotationManager()
_ignoredLabels = ignoredLabels
End Sub
Public Function BurnInstantJSONAnnotationsToPDF(pSourceBuffer As Byte(), pInstantJSONList As List(Of String)) As Byte()
@@ -37,11 +41,11 @@ Namespace Jobs.FinalizeDocument
For Each oJSON In pInstantJSONList
If AddInstantJSONAnnotationToPDF(oJSON) = False Then
Logger.Warn($"Error in AddInstantJSONAnnotationToPDF - oJson: ")
Logger.Warn(oJSON)
Throw New BurnAnnotationException($"Adding Annotation failed")
End If
Next
oResult = Manager.BurnAnnotationsToPage(RemoveInitialAnnots:=True, VectorMode:=True)
If oResult <> GdPictureStatus.OK Then
Throw New BurnAnnotationException($"Could not burn annotations to file: [{oResult}]")
@@ -70,6 +74,7 @@ Namespace Jobs.FinalizeDocument
Dim oAnnotationData = JsonConvert.DeserializeObject(Of AnnotationData)(pInstantJSON)
For Each oAnnotation In oAnnotationData.annotations
Logger.Debug("Adding AnnotationID: " + oAnnotation.id)
Select Case oAnnotation.type
Case ANNOTATION_TYPE_IMAGE
AddImageAnnotation(oAnnotation, oAnnotationData.attachments)
@@ -77,6 +82,12 @@ Namespace Jobs.FinalizeDocument
Case ANNOTATION_TYPE_INK
AddInkAnnotation(oAnnotation)
Case ANNOTATION_TYPE_WIDGET
'Add form field values
Dim formFieldValue = oAnnotationData.formFieldValues.FirstOrDefault(Function(fv) fv.name = oAnnotation.id)
If formFieldValue IsNot Nothing AndAlso Not _ignoredLabels.Contains(formFieldValue.value) Then
AddFormFieldValue(oAnnotation, formFieldValue)
End If
End Select
Next
@@ -137,6 +148,33 @@ Namespace Jobs.FinalizeDocument
End Function
Private Function AddFormFieldValue(pAnnotation As Annotation, formFieldValue As FormFieldValue) As Boolean
Try
' Convert pixels to Inches
Dim oBounds = pAnnotation.bbox.Select(AddressOf ToInches).ToList()
Dim oX = oBounds.Item(0)
Dim oY = oBounds.Item(1)
Dim oWidth = oBounds.Item(2)
Dim oHeight = oBounds.Item(3)
Manager.SelectPage(pAnnotation.pageIndex + 1)
' Add the text annotation
Dim ant = Manager.AddTextAnnot(oX, oY, oWidth, oHeight, formFieldValue.value)
' Set the font properties
ant.FontName = "Arial"
ant.FontSize = 8
ant.FontStyle = FontStyle.Italic
Manager.SaveAnnotationsToPage()
Return True
Catch ex As Exception
Logger.Warn("Could not add image annotation!")
Logger.Error(ex)
Return False
End Try
End Function
Private Function ToPointF(pPoints As List(Of Single)) As PointF
Dim oPoints = pPoints.Select(AddressOf ToInches).ToList()
Return New PointF(oPoints.Item(0), oPoints.Item(1))
@@ -153,6 +191,7 @@ Namespace Jobs.FinalizeDocument
Friend Class AnnotationData
Public Property annotations As List(Of Annotation)
Public Property attachments As Dictionary(Of String, Attachment)
Public Property formFieldValues As List(Of FormFieldValue)
End Class
Friend Class Annotation
@@ -174,5 +213,10 @@ Namespace Jobs.FinalizeDocument
Public Property binary As String
Public Property contentType As String
End Class
Friend Class FormFieldValue
Public Property name As String
Public Property value As String
End Class
End Class
End Namespace

View File

@@ -16,11 +16,13 @@ Public Class ConfigModel
Dim oRow As DataRow = oTable.Rows.Item(0)
Return New DbConfig() With {
.DocumentPath = oRow.ItemEx("DOCUMENT_PATH", ""),
.ExportPath = oRow.ItemEx("EXPORT_PATH", ""),
.SendingProfile = oRow.ItemEx("SENDING_PROFILE", 0),
.SignatureHost = oRow.ItemEx("SIGNATURE_HOST", ""),
.ExternalProgramName = oRow.ItemEx("EXTERNAL_PROGRAM_NAME", "")
.DocumentPath = oRow.ItemEx("DOCUMENT_PATH", ""),
.DocumentPathOrigin = oRow.ItemEx("DOCUMENT_PATH", ""),
.ExportPath = oRow.ItemEx("EXPORT_PATH", ""),
.SendingProfile = oRow.ItemEx("SENDING_PROFILE", 0),
.SignatureHost = oRow.ItemEx("SIGNATURE_HOST", ""),
.ExternalProgramName = oRow.ItemEx("EXTERNAL_PROGRAM_NAME", ""),
.Default_TFA_Enabled = oRow.ItemEx("DEF_TFA_ENABLED", False)
}
Catch ex As Exception
Logger.Error(ex)

View File

@@ -24,7 +24,8 @@ Public Class DocumentModel
.Filepath = pRow.ItemEx("FILEPATH", ""),
.FileNameOriginal = pRow.ItemEx("FILENAME_ORIGINAL", ""),
.IsTempFile = False,
.Elements = ElementModel.List(oDocumentId, pReceiverId)
.Elements = ElementModel.List(oDocumentId, pReceiverId),
.Byte_Data = DirectCast(pRow.Item("BYTE_DATA"), Byte())
}
End Function
@@ -79,18 +80,21 @@ Public Class DocumentModel
([FILENAME]
,[FILENAME_ORIGINAL]
,[FILEPATH]
,[ENVELOPE_ID])
,[ENVELOPE_ID]
,[BYTE_DATA])
VALUES
(@FILENAME
,@FILENAME_ORIGINAL
,@FILEPATH
,@ENVELOPE_ID)"
,@ENVELOPE_ID
,@BYTE_DATA)"
Dim oCommand As New SqlCommand(oSql)
oCommand.Parameters.Add("FILENAME", SqlDbType.NVarChar).Value = pDocument.Filename
oCommand.Parameters.Add("FILENAME_ORIGINAL", SqlDbType.NVarChar).Value = pDocument.FileNameOriginal
oCommand.Parameters.Add("FILEPATH", SqlDbType.NVarChar).Value = pDocument.Filepath
oCommand.Parameters.Add("ENVELOPE_ID", SqlDbType.Int).Value = pEnvelope.Id
oCommand.Parameters.Add(New SqlParameter("@BYTE_DATA", DirectCast(pDocument.Byte_Data, Object)))
If Database.ExecuteNonQuery(oCommand, pTransaction) Then
pDocument.EnvelopeId = pEnvelope.Id

View File

@@ -12,8 +12,8 @@ Public Class EmailModel
Public Function Insert(pEmail As EmailData) As Boolean
Try
Dim oSql = "INSERT INTO [dbo].[TBEMLP_EMAIL_OUT] "
oSql += " (EMAIL_ADRESS, EMAIL_SUBJ, EMAIL_BODY, ADDED_WHO, SENDING_PROFILE, REFERENCE_ID, REFERENCE_STRING, REMINDER_TYPE_ID, EMAIL_ATTMT1, WF_ID) "
oSql += " VALUES (@EMAIL_ADRESS, @EMAIL_SUBJ, @EMAIL_BODY, @ADDED_WHO, @SENDING_PROFILE, @REFERENCE_ID, @REFERENCE_STRING, @REMINDER_TYPE_ID, @EMAIL_ATTMT1, @WF_ID)"
oSql += " (EMAIL_ADRESS, EMAIL_SUBJ, EMAIL_BODY, ADDED_WHO, SENDING_PROFILE, REFERENCE_ID, REFERENCE_STRING, REMINDER_TYPE_ID, WF_ID,ATT1_RELATED_ID,ATT1_REL_TYPE) "
oSql += " VALUES (@EMAIL_ADRESS, @EMAIL_SUBJ, @EMAIL_BODY, @ADDED_WHO, @SENDING_PROFILE, @REFERENCE_ID, @REFERENCE_STRING, @REMINDER_TYPE_ID, @WF_ID,@ATT1_RELATED_ID,@ATT1_REL_TYPE)"
Dim oCommand As New SqlCommand(oSql)
oCommand.Parameters.Add("EMAIL_ADRESS", SqlDbType.NVarChar).Value = pEmail.EmailAdress
oCommand.Parameters.Add("EMAIL_SUBJ", SqlDbType.NVarChar).Value = pEmail.EmailSubject
@@ -23,8 +23,10 @@ Public Class EmailModel
oCommand.Parameters.Add("REFERENCE_ID", SqlDbType.Int).Value = pEmail.ReferenceID
oCommand.Parameters.Add("REFERENCE_STRING", SqlDbType.NVarChar).Value = pEmail.ReferenceString
oCommand.Parameters.Add("REMINDER_TYPE_ID", SqlDbType.Int).Value = 202377
oCommand.Parameters.Add("EMAIL_ATTMT1", SqlDbType.NVarChar).Value = pEmail.EmailAttachment
'oCommand.Parameters.Add("EMAIL_ATTMT1", SqlDbType.NVarChar).Value = pEmail.EmailAttachment
oCommand.Parameters.Add("WF_ID", SqlDbType.Int).Value = pEmail.EmailType ' Wegen DB-Trigger MUSS dieser Wert gesetzt werden
oCommand.Parameters.Add("ATT1_RELATED_ID", SqlDbType.Int).Value = pEmail.ATT1_RELATED_ID
oCommand.Parameters.Add("ATT1_REL_TYPE", SqlDbType.NVarChar).Value = pEmail.ATT1_REL_TYPE
If Database.ExecuteNonQuery(oCommand) Then
Return True

View File

@@ -2,6 +2,7 @@
Imports System.Web.UI.WebControls
Imports DigitalData.Modules.Base
Imports DigitalData.Modules.Logging
Imports EnvelopeGenerator.Common.Constants
Public Class EnvelopeModel
Inherits BaseModel
@@ -34,7 +35,7 @@ Public Class EnvelopeModel
.Language = pRow.ItemEx("LANGUAGE", "de-DE"),
.Status = ObjectEx.ToEnum(Of Constants.EnvelopeStatus)(pRow.ItemEx("STATUS", Constants.EnvelopeStatus.EnvelopeCreated.ToString())),
.AddedWhen = pRow.Item("ADDED_WHEN"),
.CertificationType = ObjectEx.ToEnum(Of Constants.CertificationType)(pRow.ItemEx("CERTIFICATION_TYPE", Constants.CertificationType.ElectronicSignature.ToString())),
.CertificationType = ObjectEx.ToEnum(Of Constants.CertificationType)(pRow.ItemEx("CERTIFICATION_TYPE", Constants.CertificationType.AdvancedElectronicSignature.ToString())),
.User = New User(),
.ExpiresWhen = pRow.ItemEx(Of Date)("EXPIRES_WHEN", Nothing),
.ExpiresWarningWhen = pRow.ItemEx(Of Date)("EXPIRES_WARNING_WHEN", Nothing),
@@ -45,9 +46,18 @@ Public Class EnvelopeModel
.ReminderIntervalDays = pRow.ItemEx("REMINDER_INTERVAL_DAYS", 0),
.UseAccessCode = pRow.ItemEx("USE_ACCESS_CODE", False),
.FinalEmailToCreator = ObjectEx.ToEnum(Of Constants.FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_CREATOR", Constants.FinalEmailType.No.ToString())),
.FinalEmailToReceivers = ObjectEx.ToEnum(Of Constants.FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_RECEIVERS", Constants.FinalEmailType.No.ToString()))
.FinalEmailToReceivers = ObjectEx.ToEnum(Of Constants.FinalEmailType)(pRow.ItemEx("FINAL_EMAIL_TO_RECEIVERS", Constants.FinalEmailType.No.ToString())),
.TFA_Enabled = pRow.ItemEx("TFA_Enabled", False)
}
Dim oDOC_RESULT = pRow.Item("DOC_RESULT")
If Not IsDBNull(oDOC_RESULT) Then
Dim oByte As Byte() = DirectCast(pRow.Item("DOC_RESULT"), Byte())
If Not IsNothing(oByte) Then
oEnvelope.DOC_RESULT = oByte
End If
Else
oEnvelope.DOC_RESULT = Nothing
End If
oEnvelope.User = UserModel.SelectUser(oEnvelope.UserId)
oEnvelope.Receivers = ReceiverModel.ListEnvelopeReceivers(oEnvelope.Id)
oEnvelope.Documents = DocumentModel.List(oEnvelope.Id)
@@ -134,13 +144,17 @@ Public Class EnvelopeModel
Public Function Insert(pEnvelope As Envelope) As Boolean
Try
Dim oSql = "INSERT INTO [dbo].[TBSIG_ENVELOPE] (MESSAGE, ENVELOPE_UUID, STATUS, USER_ID) "
oSql += " VALUES (@MESSAGE, @UUID, @STATUS, @USER_ID)"
Dim oSql = $"INSERT INTO [dbo].[TBSIG_ENVELOPE] (MESSAGE, ENVELOPE_UUID, STATUS, USER_ID)
VALUES('',
'{pEnvelope.Uuid}',
'{CInt([Enum].Parse(GetType(EnvelopeStatus), Constants.EnvelopeStatus.EnvelopeCreated))}',
'{pEnvelope.UserId}')"
Dim oCommand As New SqlCommand(oSql)
oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = String.Empty
oCommand.Parameters.Add("UUID", SqlDbType.NVarChar).Value = pEnvelope.Uuid
oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = Constants.EnvelopeStatus.EnvelopeCreated
oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId
'oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = String.Empty
'oCommand.Parameters.Add("UUID", SqlDbType.NVarChar).Value = pEnvelope.Uuid
'oCommand.Parameters.Add("STATUS", SqlDbType.Int).Value = Constants.EnvelopeStatus.EnvelopeCreated
'oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId
If Database.ExecuteNonQuery(oCommand) Then
pEnvelope.Id = GetEnvelopeId(pEnvelope)
@@ -174,9 +188,11 @@ Public Class EnvelopeModel
oSql += " [REMINDER_INTERVAL_DAYS] = @REMINDER_INTERVAL_DAYS, "
oSql += " [SEND_REMINDER_EMAILS] = @SEND_REMINDER_EMAILS, "
oSql += " [USE_ACCESS_CODE] = @USE_ACCESS_CODE, "
oSql += " [CHANGED_WHEN] = GETDATE() "
oSql += " [CHANGED_WHEN] = GETDATE(), "
oSql += " [TFA_Enabled] = @TFA_Enabled"
oSql += " WHERE GUID = @ID AND USER_ID = @USER_ID"
Dim oCommand As New SqlCommand(oSql)
oCommand.Parameters.Add("ID", SqlDbType.Int).Value = pEnvelope.Id
oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pEnvelope.UserId
@@ -185,6 +201,9 @@ Public Class EnvelopeModel
oCommand.Parameters.Add("TITLE", SqlDbType.NVarChar).Value = pEnvelope.Title
oCommand.Parameters.Add("ENVELOPE_TYPE", SqlDbType.Int).Value = pEnvelope.EnvelopeTypeId
oCommand.Parameters.Add("CONTRACT_TYPE", SqlDbType.Int).Value = pEnvelope.ContractType
If IsNothing(pEnvelope.Language) Then
pEnvelope.Language = "de-DE"
End If
oCommand.Parameters.Add("LANGUAGE", SqlDbType.NVarChar).Value = pEnvelope.Language
oCommand.Parameters.Add("CERTIFICATION_TYPE", SqlDbType.Int).Value = pEnvelope.CertificationType
oCommand.Parameters.Add("EXPIRES_WHEN_DAYS", SqlDbType.Int).Value = pEnvelope.ExpiresWhenDays
@@ -195,7 +214,7 @@ Public Class EnvelopeModel
oCommand.Parameters.Add("REMINDER_INTERVAL_DAYS", SqlDbType.Int).Value = pEnvelope.ReminderIntervalDays
oCommand.Parameters.Add("SEND_REMINDER_EMAILS", SqlDbType.Bit).Value = pEnvelope.SendReminderEmails
oCommand.Parameters.Add("USE_ACCESS_CODE", SqlDbType.Bit).Value = pEnvelope.UseAccessCode
oCommand.Parameters.Add("TFA_ENABLED", SqlDbType.Bit).Value = pEnvelope.TFA_Enabled
Return Database.ExecuteNonQuery(oCommand, pTransaction)
Catch ex As Exception

View File

@@ -1,4 +1,5 @@
Imports DigitalData.Modules.Base
Imports EnvelopeGenerator.Common.Constants
Public Class EnvelopeTypeModel
Inherits BaseModel
@@ -21,7 +22,8 @@ Public Class EnvelopeTypeModel
.FinalEmailToCreator = pRow.ItemEx("FINAL_EMAIL_TO_CREATOR", 0),
.FinalEmailToReceivers = pRow.ItemEx("FINAL_EMAIL_TO_RECEIVERS", 0),
.ContractType = pRow.ItemEx("CONTRACT_TYPE", 0),
.CertificationType = pRow.ItemEx("CERTIFICATION_TYPE", 0)
.CertificationType = pRow.ItemEx("CERTIFICATION_TYPE", 0),
.TFA_Enabled = pRow.ItemEx("TFA_Enabled", 0)
}
End Function

View File

@@ -10,7 +10,7 @@ Public Class HistoryModel
Private Function ToEnvelopeHistoryEntry(pRow As DataRow) As EnvelopeHistoryEntry
Return New EnvelopeHistoryEntry() With {
.ActionDate = pRow.Item("ACTION_DATE"),
.ActionDate = pRow.ItemEx(Of Date)("ACTION_DATE", Nothing),
.EnvelopeId = pRow.Item("ENVELOPE_ID"),
.Status = pRow.Item("STATUS"),
.UserReference = pRow.ItemEx("USER_REFERENCE", "")
@@ -18,7 +18,7 @@ Public Class HistoryModel
End Function
Public Function List(pEnvelopeId As Integer) As List(Of EnvelopeHistoryEntry)
Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE_HISTORY WHERE ENVELOPE_ID = {pEnvelopeId} ORDER BY GUID DESC"
Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE_HISTORY WHERE ENVELOPE_ID = {pEnvelopeId} AND ACTION_DATE IS NOT NULL ORDER BY GUID DESC"
Dim oTable = Database.GetDatatable(oSql)
Return oTable?.Rows.
Cast(Of DataRow).

View File

@@ -33,7 +33,8 @@ Public Class ReceiverModel
.Status = ReceiverSignedStatus,
.ColorType = DirectCast(pColorIndex + 1, ColorType),
.AccessCode = pRow.ItemEx("ACCESS_CODE", ""),
.SignedDate = SignedDate
.SignedDate = SignedDate,
.PhoneNumber = pRow.ItemEx("PHONE_NUMBER", "")
}
End Function
@@ -56,25 +57,29 @@ Public Class ReceiverModel
Public Function Insert(pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean
Try
Dim oSql As String = "INSERT INTO [dbo].[TBSIG_RECEIVER]
Dim oCheck = $"SELECT COUNT(GUID) FROM [dbo].[TBSIG_RECEIVER] WHERE SIGNATURE = '{pReceiver.GetSignature()}'"
Dim oExists = Database.GetScalarValue(oCheck)
If oExists = 0 Then
Dim oSql As String = $"INSERT INTO [dbo].[TBSIG_RECEIVER]
([EMAIL_ADDRESS]
,[SIGNATURE])
VALUES
(@EMAIL
,@SIGNATURE)"
('{pReceiver.Email}'
,'{pReceiver.GetSignature()}')"
Dim oCommand = New SqlCommand(oSql)
oCommand.Parameters.Add("EMAIL", SqlDbType.NVarChar).Value = pReceiver.Email
oCommand.Parameters.Add("SIGNATURE", SqlDbType.NVarChar).Value = pReceiver.GetSignature()
Dim oResult = Database.ExecuteNonQuery(oCommand)
If oResult = True Then
pReceiver.Id = GetReceiverIdByEmail(pReceiver.Email, pTransaction)
Dim oCommand = New SqlCommand(oSql)
Dim oResult = Database.ExecuteNonQuery(oCommand)
If oResult = True Then
pReceiver.Id = GetReceiverIdByEmail(pReceiver.Email, pTransaction)
Return True
Else
Return False
End If
Else
Return False
Logger.Warn($"Receiver [{pReceiver.Email}] already existing! Check collecting not existing Receivers!")
Return True
End If
Return True
Catch ex As Exception
Logger.Error(ex)
Return False
@@ -83,18 +88,18 @@ Public Class ReceiverModel
Public Function Update(pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean
Try
Dim oSql As String = "UPDATE [dbo].[TBSIG_USER_RECEIVER]
SET [NAME] = @NAME
,[COMPANY_NAME] = @COMPANY
,[JOB_TITLE] = @JOB
WHERE RECEIVER_ID = @RECEIVER_ID"
Dim oSql As String = $"UPDATE [dbo].[TBSIG_USER_RECEIVER]
SET [NAME] = '{pReceiver.Name}'
,[COMPANY_NAME] = '{pReceiver.Company}'
,[JOB_TITLE] = '{pReceiver.JobTitle}'
WHERE RECEIVER_ID = {pReceiver.Id}"
Dim oCommand = New SqlCommand(oSql)
oCommand.Parameters.Add("NAME", SqlDbType.NVarChar).Value = pReceiver.Name
oCommand.Parameters.Add("COMPANY", SqlDbType.NVarChar).Value = pReceiver.Company
oCommand.Parameters.Add("JOB", SqlDbType.NVarChar).Value = pReceiver.JobTitle
oCommand.Parameters.Add("RECEIVER_ID", SqlDbType.Int).Value = pReceiver.Id
oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pReceiver.Id
'oCommand.Parameters.Add("NAME", SqlDbType.NVarChar).Value = pReceiver.Name
'oCommand.Parameters.Add("COMPANY", SqlDbType.NVarChar).Value = pReceiver.Company
'oCommand.Parameters.Add("JOB", SqlDbType.NVarChar).Value = pReceiver.JobTitle
'oCommand.Parameters.Add("RECEIVER_ID", SqlDbType.Int).Value = pReceiver.Id
'oCommand.Parameters.Add("USER_ID", SqlDbType.Int).Value = pReceiver.Id
Return Database.ExecuteNonQuery(oCommand, pTransaction)
Catch ex As Exception
@@ -113,7 +118,7 @@ Public Class ReceiverModel
End Function
Public Function Assign(pEnvelope As Envelope, pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean
Dim oSql = "INSERT INTO [dbo].[TBSIG_ENVELOPE_RECEIVER]
Dim oSql = $"INSERT INTO [dbo].[TBSIG_ENVELOPE_RECEIVER]
([ENVELOPE_ID]
,[RECEIVER_ID]
,[PRIVATE_MESSAGE]
@@ -121,26 +126,28 @@ Public Class ReceiverModel
,[NAME]
,[JOB_TITLE]
,[COMPANY_NAME]
,[SEQUENCE])
,[SEQUENCE]
,[PHONE_NUMBER])
VALUES
(@ENVELOPE_ID
,@RECEIVER_ID
,@MESSAGE
,@ACCESS_CODE
,@NAME
,@JOB
,@COMPANY
,@SEQUENCE)"
('{pEnvelope.Id}'
,'{pReceiver.Id}'
,'{pReceiver.PrivateMessage}'
,'{pReceiver.AccessCode}'
,'{pReceiver.Name}'
,'{pReceiver.JobTitle}'
,'{pReceiver.Company}'
,'{pReceiver.Sequence}'
,'{pReceiver.PhoneNumber}')"
Dim oCommand As New SqlCommand(oSql)
oCommand.Parameters.Add("ENVELOPE_ID", SqlDbType.NVarChar).Value = pEnvelope.Id
oCommand.Parameters.Add("RECEIVER_ID", SqlDbType.NVarChar).Value = pReceiver.Id
oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = pReceiver.PrivateMessage
oCommand.Parameters.Add("ACCESS_CODE", SqlDbType.NVarChar).Value = pReceiver.AccessCode
oCommand.Parameters.Add("NAME", SqlDbType.NVarChar).Value = pReceiver.Name
oCommand.Parameters.Add("JOB", SqlDbType.NVarChar).Value = pReceiver.JobTitle
oCommand.Parameters.Add("COMPANY", SqlDbType.NVarChar).Value = pReceiver.Company
oCommand.Parameters.Add("SEQUENCE", SqlDbType.NVarChar).Value = pReceiver.Sequence
'oCommand.Parameters.Add("ENVELOPE_ID", SqlDbType.NVarChar).Value = pEnvelope.Id
'oCommand.Parameters.Add("RECEIVER_ID", SqlDbType.NVarChar).Value = pReceiver.Id
'oCommand.Parameters.Add("MESSAGE", SqlDbType.NVarChar).Value = pReceiver.PrivateMessage
'oCommand.Parameters.Add("ACCESS_CODE", SqlDbType.NVarChar).Value = pReceiver.AccessCode
'oCommand.Parameters.Add("NAME", SqlDbType.NVarChar).Value = pReceiver.Name
'oCommand.Parameters.Add("JOB", SqlDbType.NVarChar).Value = pReceiver.JobTitle
'oCommand.Parameters.Add("COMPANY", SqlDbType.NVarChar).Value = pReceiver.Company
'oCommand.Parameters.Add("SEQUENCE", SqlDbType.NVarChar).Value = pReceiver.Sequence
Return Database.ExecuteNonQuery(oCommand, pTransaction)
End Function
@@ -266,6 +273,22 @@ Public Class ReceiverModel
Return String.Empty
End Try
End Function
Public Function GetLastUsedReceiverPhone(pEmailAddress As String, pUserId As Integer) As String
Try
Dim oSql As String
oSql = "SELECT TOP 1 [PHONE_NUMBER] FROM dbo.VWSIG_ENVELOPE_RECEIVERS "
oSql += $" WHERE ENV_USERID_CREATED = {pUserId}) "
oSql += $" AND EMAIL_ADDRESS = '{pEmailAddress}' "
oSql += " AND Len([PHONE_NUMBER]) > 0 "
oSql += " ORDER BY [ADDED_WHEN] DESC"
Return Database.GetScalarValue(oSql)
Catch ex As Exception
Logger.Error(ex)
Return String.Empty
End Try
End Function
Private Function GetReceiverIdByEmail(pEmailAddress As String, pTransaction As SqlTransaction) As Integer
Try

View File

@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
' indem Sie "*" wie unten gezeigt eingeben:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.3.6.0")>
<Assembly: AssemblyFileVersion("1.3.6.0")>
<Assembly: AssemblyVersion("2.2.0.0")>
<Assembly: AssemblyFileVersion("2.2.0.0")>

View File

@@ -15,7 +15,7 @@ Option Explicit On
Namespace My
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0"), _
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0"), _
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Partial Friend NotInheritable Class MySettings
Inherits Global.System.Configuration.ApplicationSettingsBase

View File

@@ -1,7 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Profiles />
<Settings />
</SettingsFile>
</SettingsFile>

View File

@@ -1,5 +1,6 @@
Imports DevExpress.DataAccess.Native.Web
Imports DigitalData.Modules.Base
Imports EnvelopeGenerator.Common.My.Resources
Public Class ActionService
Inherits BaseService
@@ -33,14 +34,28 @@ Public Class ActionService
Return True
End Function
Public Function Resend_Receiver(pEnvelope As Envelope, pmail As String) As Boolean
If HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.EnvelopeQueued, pEnvelope.User.Email) = False Then
Return False
End If
Dim oSendResult As Boolean = False
For Each oReceiver In pEnvelope.Receivers
EmailService.SendDocumentReceivedEmail(pEnvelope, oReceiver)
Next
Return oSendResult
End Function
Public Function ResendReceiver(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean
Return EmailService.SendDocumentReceivedEmail(pEnvelope, pReceiver)
End Function
Public Function DeleteEnvelope(pEnvelope As Envelope) As Boolean
Public Function DeleteEnvelope(pEnvelope As Envelope, pReason As String) As Boolean
If HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.EnvelopeDeleted, pEnvelope.User.Email) = False Then
Return False
End If
Dim oSendResult = pEnvelope.Receivers.
Select(Function(r) EmailService.SendEnvelopeDeletedEmail(pEnvelope, r)).
Select(Function(r) EmailService.SendEnvelopeDeletedEmail(pEnvelope, r, pReason)).
All(Function(r) r = True)
If oSendResult = False Then
@@ -108,20 +123,20 @@ Public Class ActionService
Return True
End Function
Public Function CompleteEnvelope(pEnvelope As Envelope, pReceiver As EnvelopeReceiver, pAttachment As String) As Boolean
Public Function CompleteEnvelope(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean ', pAttachment As String
If HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.MessageCompletionSent, pReceiver.Email) = False Then
Return False
End If
Return EmailService.SendDocumentCompletedEmailToReceiver(pEnvelope, pReceiver, pAttachment)
Return EmailService.SendDocumentCompletedEmailToReceiver(pEnvelope, pReceiver) ', pAttachment
End Function
Public Function CompleteEnvelope(pEnvelope As Envelope, pAttachment As String) As Boolean
Public Function CompleteEnvelope(pEnvelope As Envelope) As Boolean ', pAttachment As String
If HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.MessageCompletionSent, pEnvelope.User.Email) = False Then
Return False
End If
Return EmailService.SendDocumentCompletedEmailToCreator(pEnvelope, pAttachment)
Return EmailService.SendDocumentCompletedEmailToCreator(pEnvelope) ', pAttachment
End Function
Public Function CreateReport(pEnvelope As Envelope) As Boolean

View File

@@ -1,6 +1,7 @@
Imports DigitalData.Modules.Base
Imports DigitalData.Modules.Logging
Imports EnvelopeGenerator.Common.My.Resources
Public Class EmailService
Inherits BaseService
@@ -15,14 +16,14 @@ Public Class EmailService
EmailTemplate = New TemplateService(pState)
End Sub
Public Function SendEnvelopeDeletedEmail(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean
Public Function SendEnvelopeDeletedEmail(pEnvelope As Envelope, pReceiver As EnvelopeReceiver, pReason As String) As Boolean
Logger.Debug("Creating email data object.")
Dim oEmailData As New EmailData(pEnvelope, pReceiver, Constants.EnvelopeStatus.MessageDeletionSent) With
{
.SignatureLink = ""
}
EmailTemplate.FillEnvelopeDeletedEmailBody(oEmailData)
EmailTemplate.FillEnvelopeDeletedEmailBody(oEmailData, pReason)
If EmailModel.Insert(oEmailData) = False Then
Logger.Error("EMail data could not be inserted.")
@@ -49,6 +50,15 @@ Public Class EmailService
Return True
End Function
Public Function GetReceiverUrl(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As String
Dim oEmailData As New EmailData(pEnvelope, pReceiver, Constants.EnvelopeStatus.MessageInvitationSent) With
{
.SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, pEnvelope.Uuid, pReceiver.Signature)
}
Return oEmailData.SignatureLink
End Function
Public Function SendDocumentAccessCodeReceivedEmail(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean
Logger.Debug("Creating email data object.")
Dim oEmailData As New EmailData(pEnvelope, pReceiver, Constants.EnvelopeStatus.MessageAccessCodeSent) With
@@ -83,14 +93,15 @@ Public Class EmailService
Return True
End Function
Public Function SendDocumentCompletedEmailToReceiver(pEnvelope As Envelope, pReceiver As EnvelopeReceiver, pAttachment As String) As Boolean
Public Function SendDocumentCompletedEmailToReceiver(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean ', pAttachment As String
Logger.Debug("Creating email data object.")
Dim oEmailData = New EmailData(pEnvelope, pReceiver, Constants.EnvelopeStatus.MessageCompletionSent) With
{
.SignatureLink = "",
.EmailAttachment = pAttachment
.ATT1_RELATED_ID = pEnvelope.Id,
.ATT1_REL_TYPE = "EnvelopeResult"
}
' .EmailAttachment = pAttachment,
Logger.Debug("Sending mail to receiver: [{0}]", oEmailData.EmailAdress)
EmailTemplate.FillDocumentCompletedEmailBody(oEmailData)
@@ -103,14 +114,15 @@ Public Class EmailService
Return True
End Function
Public Function SendDocumentCompletedEmailToCreator(pEnvelope As Envelope, pAttachment As String) As Boolean
Public Function SendDocumentCompletedEmailToCreator(pEnvelope As Envelope) As Boolean ', pAttachment As String
Logger.Debug("Creating email data object.")
Dim oEmailData = New EmailData(pEnvelope, Constants.EnvelopeStatus.MessageCompletionSent) With
{
.SignatureLink = "",
.EmailAttachment = pAttachment
.ATT1_RELATED_ID = pEnvelope.Id,
.ATT1_REL_TYPE = "EnvelopeResult"
}
'.EmailAttachment = pAttachment,
EmailTemplate.FillDocumentCompletedEmailBody(oEmailData)
If EmailModel.Insert(oEmailData) = False Then

View File

@@ -16,7 +16,7 @@ Public Class TemplateService
EmailHtmlTemplateModel = New EmailTemplateModel(pState)
End Sub
Private Sub InitDictionary(pEmailData As EmailData)
Private Sub InitDictionary(pEmailData As EmailData, Optional pReason As String = "")
Logger.Debug("Initializing dictionary..")
_replaceDictionary = New Dictionary(Of String, String) From {
@@ -28,7 +28,8 @@ Public Class TemplateService
{"[LINK_TO_DOCUMENT_TEXT]", $"{pEmailData.SignatureLink.Truncate(40)}.."},
{"[DOCUMENT_TITLE]", pEmailData.EnvelopeTitle},
{"[MESSAGE]", pEmailData.Message},
{"[DOCUMENT_ACCESS_CODE]", pEmailData.ReceiverAccessCode}
{"[DOCUMENT_ACCESS_CODE]", pEmailData.ReceiverAccessCode},
{"[REASON]", pReason}
}
End Sub
@@ -40,11 +41,11 @@ Public Class TemplateService
pEmailData.EmailSubject = FillTemplate(oTemplate.Subject)
End Sub
Public Sub FillEnvelopeDeletedEmailBody(pEmailData As EmailData)
InitDictionary(pEmailData)
Public Sub FillEnvelopeDeletedEmailBody(pEmailData As EmailData, pReason As String)
InitDictionary(pEmailData, pReason)
Dim oTemplate = EmailHtmlTemplateModel.GetById(Constants.EmailTemplateType.DocumentDeleted)
pEmailData.EmailBody = FillTemplate(oTemplate.Body)
pEmailData.EmailBody = FillTemplate(oTemplate.Body, pReason)
pEmailData.EmailSubject = FillTemplate(oTemplate.Subject)
End Sub
@@ -72,11 +73,12 @@ Public Class TemplateService
pEmailData.EmailSubject = FillTemplate(oTemplate.Subject)
End Sub
Private Function FillTemplate(pTemplate As String) As String
Private Function FillTemplate(pTemplate As String, Optional pReason As String = "") As String
Dim oText As String = pTemplate
For Each dictItem As KeyValuePair(Of String, String) In _replaceDictionary
If oText.Contains(dictItem.Key) Then
oText = oText.Replace(dictItem.Key, dictItem.Value)
End If

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Dialog Concat PDF" xml:space="preserve">
<value>Please select the PDF documents you would like to link/concat:</value>
</data>
<data name="Do you really want to delete this envelope" xml:space="preserve">
<value>Do you really want to delete this envelope?</value>
</data>
@@ -138,6 +141,15 @@
<data name="Document Could Not Be Saved" xml:space="preserve">
<value>Document could not be saved!</value>
</data>
<data name="Document forwarded" xml:space="preserve">
<value>Document forwarded to receiver: {0}</value>
</data>
<data name="Drop only one file" xml:space="preserve">
<value>Currently, only one PDF file is permitted via drag and drop.</value>
</data>
<data name="Drop only pdf" xml:space="preserve">
<value />
</data>
<data name="Edit Envelope" xml:space="preserve">
<value>Edit Envelope</value>
</data>
@@ -154,7 +166,7 @@
<value>Envelope could not be sent!</value>
</data>
<data name="Envelope Invitations Sent" xml:space="preserve">
<value>Envelope Invitations Sent</value>
<value>The invitations have been scheduled for dispatch.s</value>
</data>
<data name="Envelope Overview" xml:space="preserve">
<value>Overview</value>
@@ -165,6 +177,12 @@
<data name="Envelope-Editor" xml:space="preserve">
<value>Envelope-Editor</value>
</data>
<data name="Error email Validation" xml:space="preserve">
<value>The email [ @Mail ] could not be varified!</value>
</data>
<data name="Error phone Validation" xml:space="preserve">
<value />
</data>
<data name="Error sending the envelope" xml:space="preserve">
<value>Error sending the envelope:</value>
</data>
@@ -186,6 +204,9 @@
<data name="Invalid Email Address" xml:space="preserve">
<value>Receiver {0} has an invalid Email Address.</value>
</data>
<data name="Invitation successfully resend" xml:space="preserve">
<value>Invitation to [@Mail] has been send once again!</value>
</data>
<data name="Missing Documents" xml:space="preserve">
<value>Missing Documents</value>
</data>

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Dialog Concat PDF" xml:space="preserve">
<value>Bitte wählen Sie die PDF-Dokumente die Sie verketten möchten:</value>
</data>
<data name="Do you really want to delete this envelope" xml:space="preserve">
<value>Wollen Sie diesen Umschlag wirklich löschen?</value>
</data>
@@ -138,6 +141,12 @@
<data name="Document Could Not Be Saved" xml:space="preserve">
<value>Dokument konnte nicht gespeichert werden!</value>
</data>
<data name="Document forwarded" xml:space="preserve">
<value>Umschlag an Empfänger {0} weitergeleitet.</value>
</data>
<data name="Drop only one file" xml:space="preserve">
<value>Aktuell ist per Drag and Drop nur eine PDF-Datei erlaubt.</value>
</data>
<data name="Edit Envelope" xml:space="preserve">
<value>Bearbeite Umschlag</value>
</data>
@@ -154,7 +163,7 @@
<value>Umschlag konnte nicht gesendet werden!</value>
</data>
<data name="Envelope Invitations Sent" xml:space="preserve">
<value>Die Einladungen wurden versendet</value>
<value>Die Einladungen zum Signieren wurden zum Versand eingereiht.</value>
</data>
<data name="Envelope Overview" xml:space="preserve">
<value>Übersicht</value>
@@ -165,6 +174,13 @@
<data name="Envelope-Editor" xml:space="preserve">
<value>Umschlag-Editor</value>
</data>
<data name="Error email Validation" xml:space="preserve">
<value>Die Email-Adresse [ @Mail ] konnte nicht validiert werden!</value>
</data>
<data name="Error phone Validation" xml:space="preserve">
<value>The mobile phone number [@PhoneNr] could not be validated.
Pattern: +491234567890</value>
</data>
<data name="Error sending the envelope" xml:space="preserve">
<value>Fehler beim Senden des Umschlags:</value>
</data>
@@ -186,6 +202,9 @@
<data name="Invalid Email Address" xml:space="preserve">
<value>Empfänger {0} hat keine gültige Email Addresse.</value>
</data>
<data name="Invitation successfully resend" xml:space="preserve">
<value>Die Einladung an [@Mail] wurde nochmal versendet!</value>
</data>
<data name="Missing Documents" xml:space="preserve">
<value>Fehlendes Dokument</value>
</data>

View File

@@ -64,6 +64,15 @@ Namespace My.Resources
End Set
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Bitte wählen Sie die PDF-Dokumente die Sie verketten möchten: ähnelt.
'''</summary>
Public Shared ReadOnly Property Dialog_Concat_PDF() As String
Get
Return ResourceManager.GetString("Dialog Concat PDF", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Wollen Sie diesen Umschlag wirklich löschen? ähnelt.
'''</summary>
@@ -127,6 +136,24 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Umschlag an Empfänger {0} weitergeleitet. ähnelt.
'''</summary>
Public Shared ReadOnly Property Document_forwarded() As String
Get
Return ResourceManager.GetString("Document forwarded", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Aktuell ist per Drag and Drop nur eine PDF-Datei erlaubt. ähnelt.
'''</summary>
Public Shared ReadOnly Property Drop_only_one_file() As String
Get
Return ResourceManager.GetString("Drop only one file", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Bearbeite Umschlag ähnelt.
'''</summary>
@@ -182,7 +209,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Die Einladungen wurden versendet ähnelt.
''' Sucht eine lokalisierte Zeichenfolge, die Die Einladungen zum Signieren wurden zum Versand eingereiht. ähnelt.
'''</summary>
Public Shared ReadOnly Property Envelope_Invitations_Sent() As String
Get
@@ -208,6 +235,25 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Die Email-Adresse [ @Mail ] konnte nicht validiert werden! ähnelt.
'''</summary>
Public Shared ReadOnly Property Error_email_Validation() As String
Get
Return ResourceManager.GetString("Error email Validation", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die The mobile phone number [@PhoneNr] could not be validated.
'''Pattern: +491234567890 ähnelt.
'''</summary>
Public Shared ReadOnly Property Error_phone_Validation() As String
Get
Return ResourceManager.GetString("Error phone Validation", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Fehler beim Senden des Umschlags: ähnelt.
'''</summary>
@@ -271,6 +317,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Die Einladung an [@Mail] wurde nochmal versendet! ähnelt.
'''</summary>
Public Shared ReadOnly Property Invitation_successfully_resend() As String
Get
Return ResourceManager.GetString("Invitation successfully resend", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Fehlendes Dokument ähnelt.
'''</summary>

View File

@@ -91,6 +91,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Fortgeschrittene Elektronische Signatur ähnelt.
'''</summary>
Public Shared ReadOnly Property AdvancedElectronicSignature() As String
Get
Return ResourceManager.GetString("AdvancedElectronicSignature", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Abgeschlossen ähnelt.
'''</summary>
@@ -154,15 +163,6 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Elektronische Signatur ähnelt.
'''</summary>
Public Shared ReadOnly Property ElectronicSignature() As String
Get
Return ResourceManager.GetString("ElectronicSignature", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Archiviert ähnelt.
'''</summary>

Some files were not shown because too many files have changed in this diff Show More