Compare commits

...

158 Commits

Author SHA1 Message Date
Developer01
686b1a3a59 MS Common 2025-05-09 16:51:31 +02:00
Developer01
773b43b1ad Common Rejection update, SendInvitationMailJob 2025-05-08 17:01:12 +02:00
Developer01
5a8f2d298f MS Service Invitations API,Form 2Faktor Properties 2025-05-08 14:37:34 +02:00
Developer01
dc4b5bade0 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-05-07 16:51:02 +02:00
Developer01
6fc0c32c46 Common und Service API Send API Mails 2025-05-07 16:50:46 +02:00
Developer 02
14e6a661d3 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-29 09:37:12 +02:00
Developer 02
3d1966a715 feat(Jenkinsfile): Als Beispiel erstellt 2025-04-29 09:34:57 +02:00
Developer 02
c173814b8d refactor(AuthController): Login-Methoden aktualisieren, um NotImplementedException zu werfen, nur um Swagger-Dokumentation bereitzustellen 2025-04-29 09:21:05 +02:00
Developer 02
a85397a363 refactor(auth): Refactoring der Login-Methoden für OpenAPI-Kompatibilität
– Die Login-Methoden wurden überarbeitet, um NotImplementedException auszulösen und OpenAPI (Swagger) und Skalar zu konfigurieren.
– Unnötige using-Anweisungen wurden entfernt, um den Code zu optimieren.
2025-04-28 16:49:46 +02:00
Developer 02
2d3987b81e Add JWT Bearer authentication support
- Integrated JWT Bearer authentication for API security.
- Replaced previous CookieAuthenticationDefaults with JwtBearerDefaults as the default authentication scheme.
- Configured JWT token validation with issuer, audience, and signing key parameters.
- Added handling for token retrieval from cookies or query strings when missing in the header.
- Updated the authentication configuration to support both Cookie and JWT authentication schemes.
- Enhanced security by validating JWT tokens against provided public keys.
2025-04-28 16:18:31 +02:00
Developer 02
875ff95278 feat(AuthTokenKeys): Erstellt, um Parameter für Authentifizierungs-Tokens zu konfigurieren.
- AuthTokenKeys aus der Konfiguration in Program.cs lesen.
 - Upgrade von Core.Abstractions auf 3.5
2025-04-28 15:49:40 +02:00
Developer 02
dcdf0844cb feat(Program): DeferredServiceProvider-Instanz erstellen und Fabrik einstellen 2025-04-28 15:08:07 +02:00
Developer 02
27e9de4709 chore(Core.Abstraction): Aktualisiert auf 3.4.4 2025-04-28 15:02:49 +02:00
Developer 02
e2bdc73b76 chore: auth-hub-client hinzufügen und konfigurieren 2025-04-28 14:15:45 +02:00
Developer01
4f95a1eed4 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-28 13:27:38 +02:00
Developer01
6874e7e92c MS Initial 2.9.1 2025-04-28 13:27:27 +02:00
Developer 02
7abb3a6c8a chore(deps): NuGet-Paketversionen aktualisieren und DigitalData.Auth.Client hinzufügen 2025-04-28 10:47:55 +02:00
Developer 02
9183ba4da5 Merge branch 'feat/terminal' 2025-04-28 09:19:52 +02:00
Developer 02
08e2e91e9a feat(program): Konfiguration aus appsettings.json laden
Die Anwendung lädt nun Konfigurationseinstellungen aus einer "appsettings.json"-Datei im Basisverzeichnis.
Dies ermöglicht eine externe Konfiguration ohne Codeänderungen und unterstützt das Neuladen der Einstellungen zur Laufzeit bei Änderungen der Datei.
2025-04-28 09:16:24 +02:00
Developer 02
2966d64455 feat(terminal): ReadDocument-Befehl um PDF-Speicheroptionen erweitert
Optionen `save`, `dir` und `fileName` zum `ReadDocument`-Befehl hinzugefügt.
Wenn `save` aktiviert ist, wird das PDF an dem angegebenen oder dem Standardpfad gespeichert.
Ermöglicht dem Benutzer mehr Kontrolle über Speicherort und Dateinamen.
2025-04-25 19:33:29 +02:00
Developer 02
41cb2c2d93 fix(PDFBurnerParams): Verschieben in das Verzeichnis /FinalizeDocument 2025-04-25 11:39:59 +02:00
Developer 02
edd54ab302 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-24 16:08:48 +02:00
Developer 02
51920089af feat(PDFBurner): PDFBurnerParams hinzufügen und Konfiguration binden 2025-04-24 16:08:05 +02:00
Developer01
5714c54385 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-24 16:00:29 +02:00
Developer01
09d2640345 V 2.9.0.0 WISAG 2025-04-24 16:00:16 +02:00
Developer 02
82cb50b7e1 feat(PDFBurnerParams): erstellt, um PDFBurner zu konfigurieren 2025-04-24 15:50:08 +02:00
Developer 02
ff36dc47c1 refactor(PDFBurner): Logik hinzufügen, um den Unterschied zwischen FormField-Annotationen zu verringern 2025-04-24 15:29:22 +02:00
Developer 02
186f3c3319 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-24 12:01:55 +02:00
Developer 02
276adda516 unnötige Protokollierung entfernt 2025-04-24 11:48:54 +02:00
Developer 02
ac0ae10fab unnötige Protokollierung entfernt 2025-04-24 11:47:11 +02:00
Developer01
3713669ec5 Merge 2025-04-24 11:45:38 +02:00
Developer 02
7f0131fc2d refactor(FinalizeDocumentJob): Update für detaillierte Protokollierung 2025-04-24 11:44:29 +02:00
Developer01
d9deb589d1 MS AdminTab 2025-04-24 11:43:55 +02:00
OlgunR
c961e9fffd Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-24 11:43:18 +02:00
OlgunR
ae31b1da0f Funktion zur Aufhebung der Formfelder im Signiervorgang - Class EnvelopeEditorController, Class FlattenFormFields 2025-04-24 11:42:50 +02:00
Developer 02
bf5faf53bd refactor(frmFinalizePDF): Aktualisieren von Button1_Click zum Öffnen von PDF nach dem Brennvorgang 2025-04-24 11:37:46 +02:00
Developer 02
9a74b448f2 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-24 09:32:34 +02:00
Developer 02
784a834214 chore: auf 3.1.2 aufgerüstet 2025-04-24 09:28:27 +02:00
Developer01
3c5f5cb5f5 Neues Release plus Flatternformfleds RO 2025-04-24 08:56:33 +02:00
Developer 02
7c57b7e332 refactor(network): add bias to annot.top 2025-04-24 02:23:22 +02:00
Developer 02
4bf91df85f fx(network): add bias to left position 2025-04-24 02:11:12 +02:00
Developer 02
50796b22d9 refactor(network): convert getAnnotation params to async method 2025-04-24 02:10:18 +02:00
Developer 02
2974ddb985 feat(ConfigController): add authorize attribute 2025-04-24 02:01:09 +02:00
Developer 02
54f39103e1 feat(IAnnotation): Hinzufügen und Implementieren der Eigenschaften BackgroundColor, BorderColor, BorderStyle und BorderWidth.
- Hintergrund mit neuen Eigenschaften in Annotations.js binden
2025-04-24 00:36:24 +02:00
Developer 02
8b505ae39a feat(annotations): verbessertes Styling für Hintergrund-Anmerkungen
- Hintergrundfarbe der Hintergrund-Anmerkungen auf einen benutzerdefinierten hellen Ton geändert
- Unterstrichener Rahmenstil mit spezifischer Farbe und Breite hinzugefügt
- Blendmodus von 'multiply' zu 'normal' vereinheitlicht für bessere Konsistenz
- Visuelle Hierarchie der Anmerkungselemente verbessert
2025-04-23 22:59:45 +02:00
Developer 02
d75da655d2 feat(Hintergrund): Locate add, um die Position des Hintergrunds anhand anderer Anmerkungen zu berechnen.
- Standort des Hintergrunds zu Anmerkungen hinzugefügt
2025-04-23 18:13:46 +02:00
Developer 02
e72ea534e5 refactor(AnnotationParams): AnnotationJSObject aktualisieren, um IAnnotation (anstelle von Annotation) zu enthalten
- Hintergrund in AnnotationJSObject hinzufügen, wenn er nicht null ist
2025-04-23 17:25:58 +02:00
Developer 02
e95d1d782e feat(IAnnotation): Erstellt, um die grundlegenden Eigenschaften einer Annotation zu behandeln.
- implementiert in Annotation und Hintergrund
2025-04-23 16:50:10 +02:00
Developer 02
32be5077f9 feat(Hintergrund): Erstellen, um den Hintergrund von Anmerkungen mit der Eigenschaft MarginRatio zu konfigurieren.
- verschiebt Anmerkungen nach
2025-04-23 15:41:53 +02:00
Developer 02
d80fa0b023 feat(Background): Add Width, Height, Top and Left properties.
- Add JsonIgnroe property to BackGround
2025-04-23 15:38:14 +02:00
Developer 02
ea6ee11a4e feat(Hintergrund): Erstellen, um den Hintergrund von Anmerkungen mit der Eigenschaft MarginRatio zu konfigurieren.
- verschiebt Anmerkungen nach
2025-04-23 15:31:35 +02:00
Developer 02
13a87f29d9 refactor(Annotations.js): Hinzufügen von Container-Widget-Annotationen als Hintergrund von Annotationen ohne BoundingBox-Konfiguration.
- Konvertieren von Signaturen Hintergrundfarbe von gelb zu hellgelb.
2025-04-23 13:38:32 +02:00
Developer01
4e2682a75d DocumentRotationChanged 2025-04-23 12:40:28 +02:00
Developer01
278d56c58d Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-23 12:38:02 +02:00
Developer01
9f71579c78 MS Neue Konstante 2025-04-23 12:37:57 +02:00
Developer 02
5f8df74b9d refactor(BasicDtoMappingProfile): Unter /DTOs verschieben.
- umbenennen in MappingProfile
 - Kommentare zur Dokumentation hinzufügen
2025-04-23 09:36:22 +02:00
Developer 02
ebb248969c fix(DIExtensions): AutoMapper-Konfiguration von UserManager hinzugefügt.
- In das Hauptverzeichnis des Projekts verschoben.
 - Umbenennen in DependencyInjection
2025-04-23 09:27:03 +02:00
Developer 02
4040741e6f Merge remote-tracking branch 'origin/bugfix/signaturfeld-rotiert' 2025-04-23 08:42:38 +02:00
Developer 02
4077786ef7 refactor(Test.Application): Configured dependencies 2025-04-23 01:01:09 +02:00
Developer 02
ba8394c749 feat(EnvelopeGenerator.Terminal): Downgrade to .net 7 2025-04-23 00:49:15 +02:00
Developer 02
97dcc0f0a1 feat(ReadDocumentMappingProfile): Added mapping profile of ReadDocumentResponse 2025-04-23 00:01:57 +02:00
Developer 02
8785505a91 feat(CommandManager): Add ReadDocument command. 2025-04-22 23:47:30 +02:00
Developer 02
975beff416 feat(ReadDocumentQueryHandler): Logik hinzugefügt 2025-04-22 23:16:22 +02:00
Developer 02
45d39069aa feat(infrastructure): generisches Repository mit AutoMapper-Unterstützung integriert
- DbRepository-Registrierungen für alle Umschlag-bezogenen Entitäten mit DigitalData.Core-Infrastruktur und AutoMapper-Integration hinzugefügt. Ermöglicht optimierten Datenzugriff und Mapping-Konfiguration.
2025-04-22 21:23:16 +02:00
Developer 02
d3db1e74fa chore: aktualisierte Baget-Pakete 2025-04-22 21:06:36 +02:00
Developer 02
ba4a57512f Refaktorierung der Dienste und Aktualisierung der Paketabhängigkeiten
- Vereinfachte `IEnvelopeHistoryService`, `IEnvelopeReceiverReadOnlyService` und `IReceiverService` Schnittstellen durch Entfernung unnötiger generischer Parameter.
- Aktualisierte `EnvelopeHistoryService`, `EnvelopeReceiverReadOnlyService` und `ReceiverService` Klassen, um sie an die Schnittstellenänderungen anzupassen.
- Aktualisierte Paketverweise in mehreren Projektdateien, mit Schwerpunkt auf `DigitalData.Core` und `UserManager`.
- Hinzufügen von `DbSet<ClientUser>` zu `EGDbContext` und Einführung neuer privater Felder.
- Verfeinerung von `TestControllerBase` durch Entfernung überflüssiger Typ-Parameter in Constraints.
- Insgesamt verbessern diese Änderungen die Klarheit des Codes und gewährleisten die Kompatibilität mit aktualisierten Bibliotheken.
2025-04-16 14:25:57 +02:00
Developer 02
11f4896556 ReadDocumentQuery und Handler zum Abrufen von Dokumenten hinzufügen
Führt die Struktur `ReadDocumentQuery` zur Abfrage von Dokumenten anhand ihrer eindeutigen Kennung oder der zugehörigen Umschlagkennung ein und implementiert die Schnittstelle `IRequest<ReadDocumentResponse>` von MediatR.

Eine neue Handler-Klasse, `ReadDocumentQueryHandler`, wird erstellt, um die Abfrage zu verarbeiten, obwohl die Verarbeitungslogik noch nicht implementiert ist.

Außerdem wird eine Antwortstruktur, `ReadDocumentResponse`, definiert, um die Daten zu kapseln, die beim Lesen eines Dokuments zurückgegeben werden, einschließlich der Eigenschaften für die ID des Dokuments, die Umschlag-ID, das Hinzufügedatum und die Binärdaten.

Die erforderlichen Namespaces werden für die richtige Organisation und Funktionalität hinzugefügt.
2025-04-14 16:12:07 +02:00
Developer 02
44aeb53413 Refactor EnvelopeDocument class for clarity
Adjusted namespace and reformatted class attributes for consistency. Moved `[Table]`, `[Key]`, `[DatabaseGenerated]`, and `[Column]` attributes to align with properties. The `Elements` property was also repositioned to enhance class structure readability.
2025-04-14 15:19:10 +02:00
Developer 02
d56aa1a778 Remove unused import in EnvelopeDocumentRepository.cs 2025-04-14 15:18:47 +02:00
Developer 02
a012396dd4 Merge branch 'master' into feat/terminal 2025-04-14 14:39:31 +02:00
Developer 02
42a1016607 fix: Vereinfachung des Ziel-Frameworks in der Projektdatei
Aktualisierte `EnvelopeGenerator.Web.csproj`, um ein einziges
Ziel-Framework (`net7.0`) anstelle von mehreren Frameworks
(`net7.0;net8.0;net9.0`) anzugeben, was die Projektkonfiguration vereinfacht.
2025-04-14 14:38:56 +02:00
Developer 02
4b616896f8 Refactor CommandManager und Verbesserung von DependencyInjection
Aktualisierte Eigenschaftsnamen in CommandManager für mehr Klarheit und zusätzliche Lokalisierungsunterstützung in DependencyInjection durch Einbindung der Methode AddLocalization().
2025-04-14 13:53:07 +02:00
Developer 02
54c17f106e feat(Program.cs): Hosting-Unterstützung zu CommandManagerRunner hinzufügen
- Einführung von `Microsoft.Extensions.Hosting` in `DependencyInjection.cs`.
- Überladung für `RunCommandManagerRunner` hinzugefügt, um `IHost` zu akzeptieren.
- Aktualisiert `Program.cs`, um die neue Methode `RunCommandManagerRunner` zu verwenden.
2025-04-14 13:18:50 +02:00
Developer 02
e171b50868 Add service registrations to DependencyInjection
Added using directives for application services and registered
IEnvelopeMailService with its implementation EnvelopeMailService.
Also included in-memory caching to enhance the dependency
injection setup.
2025-04-14 13:15:19 +02:00
Developer 02
a20c2b556f Add CommandDotNet support to IEnvelopeReceiverService
Updated IEnvelopeReceiverService to utilize CommandDotNet for command-line functionality. Added a new command attribute to the VerifyAccessCodeAsync method, allowing it to be invoked via command line. Modified the method signature to accept a string identifier for the envelope receiver, enhancing its usability and alignment with intended functionality.
2025-04-14 13:07:45 +02:00
Developer 02
a070a0f64c Enhance CommandManager and Dependency Injection
- Updated `CommandManager` to include an `IEnvelopeReceiverService` constructor and a new property for service access. Added version printing functionality in the `Execute` method.
- Modified `AddCommandManagerRunner` in `DependencyInjection` to accept a connection string key name and added SQL Server caching configuration.
- Added `Microsoft.Extensions.Caching.SqlServer` package reference in the project file for caching support.
2025-04-14 12:55:48 +02:00
Developer 02
c0608b457c Hinzufügen von CommandDotNet-Referenzen für mehrere Ziel-Frameworks
Hinzufügen von bedingten `<ItemGroup>`-Elementen in der Projektdatei
für `net7.0`, `net8.0` und `net9.0`, die jeweils die
entsprechende Version des `CommandDotNet`-Pakets angeben.
2025-04-14 11:53:38 +02:00
Developer 02
927b89554d feat(DependencyInjection): Verbesserung von DI und Konfigurationsmanagement
DependencyInjection wurde aktualisiert, um IConfiguration zu akzeptieren, appsettings.json für Konfigurationseinstellungen hinzugefügt und Projektreferenzen in der .csproj-Datei geändert. Program.cs wurde angepasst, um die neue Konfigurationsstruktur für die Dienstregistrierung zu nutzen.
2025-04-14 11:38:21 +02:00
Developer 02
160005e230 Merge branch 'master' into feat/terminal 2025-04-14 10:56:45 +02:00
Developer 02
2848425625 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-14 10:52:21 +02:00
Developer 02
c61b497ef2 Update target framework and clean up using directives
Changed target frameworks in `EnvelopeGenerator.GeneratorAPI.csproj` to only `net9.0`. Removed unused `using System.Reflection;` directive in `Program.cs` to streamline the code.
2025-04-14 10:49:51 +02:00
Developer 02
1ece216a27 merge with master 2025-04-14 10:39:34 +02:00
Developer 02
8f6847c060 chore: Aktualisierung der Version auf 1.2.0 für das GeneratorAPI-Projekt 2025-04-14 10:36:25 +02:00
Developer 02
0dc65a53b5 chore: Hinzufügen von IIS-Veröffentlichungsprofilen für .NET 7 und .NET 9 2025-04-14 10:02:03 +02:00
Developer 02
7b75a373bd Fix casing of Bearer scheme in Swagger configuration 2025-04-12 02:11:43 +02:00
Developer 02
fe252b9979 Refactor email template commands and add controller
- Updated `UpdateEmailTemplateCommand` to use a property for `EmailTemplateQuery` with `JsonIgnore`, allowing optional body and subject parameters.
- Simplified `UpdateToDefaultCommand` by removing documentation comments and constructor parameters.
- Corrected namespace for `ReadEmailTemplateQuery` from `Query.Read` to `Queries.Read`.
- Introduced `ResetEnvelopeTemplateCommand` with optional ID and type, inheriting from `EmailTemplateQuery`, along with detailed XML documentation.
- Added `EmailTemplateController` to manage email templates, including methods for retrieval and updates, utilizing AutoMapper and authorization attributes.
2025-04-12 01:20:04 +02:00
Developer 02
f17820e011 Add UpdateToDefaultCommand for email template reset
Introduces a new namespace `EnvelopeGenerator.Application.EmailTemplates.Commands.UpdateToDefault` and defines the `UpdateToDefaultCommand` record. This command allows resetting an email template to its default values, inheriting from `EmailTemplateQuery`. It includes optional parameters for `Id` and `Type`, with comprehensive XML documentation detailing the command's purpose and the possible email template types.
2025-04-12 00:42:04 +02:00
Developer 02
a21c993cb5 Refactor email template handling and namespaces
Updated namespaces for email template files and improved
class structures. Removed the Language parameter from
EmailTemplateQuery. Added ReadEmailTemplateQuery and
ReadEmailTemplateResponse with updated parameters.
Introduced UpdateEmailTemplateCommand for template updates.
These changes enhance clarity and functionality in the
email template management system.
2025-04-12 00:37:13 +02:00
Developer 02
dd4afc5ddf Refactor email template query and response structures
Updated `EmailTemplateQuery` to use `Language` instead of `Culture` and added an explicit body. Introduced a new namespace for better organization and added `ReadEmailTemplateResponse` to provide a structured response for querying email templates, including relevant parameters.
2025-04-12 00:18:14 +02:00
Developer 02
c220b9e1c8 Add new email template types and query records
- Updated `Constants.vb` to include new email template types:
  `DocumentRejected_ADM`, `DocumentRejected_REC`, and
  `DocumentRejected_REC_2`.

- Introduced `EmailTemplateQuery` record in `EmailTemplateQuery.cs`
  with parameters for `Id`, `Type`, and `Culture`, along with
  German documentation.

- Added `ReadEmailTemplateQuery` record in
  `ReadEmailTemplateQuery.cs` that inherits from
  `EmailTemplateQuery` for reading email templates.
2025-04-12 00:11:21 +02:00
Developer 02
778a498e00 Refactor command records for envelope creation
Updated `CreateEnvelopeReceiverCommand` to use new types for `Document` and `Receivers`. Renamed `ReceiverGetOrCreateDto` to `ReceiverGetOrCreateCommand` and `DocumentCreateDto` to `DocumentCreateCommand` to align with the new command structure. Properties within these records remain unchanged.
2025-04-11 23:46:14 +02:00
Developer 02
48240f2f30 Change namespace and update documentation comments
Updated the namespace for the `EnvelopeReceiverQuery` class to `EnvelopeGenerator.Application.EnvelopeReceivers`. Revised the documentation for the `EnvelopeStatusQuery` record to provide a more concise list of envelope statuses while keeping the existing parameters.
2025-04-11 23:43:46 +02:00
Developer 02
e3dfa8dd39 Add ApiExplorerSettings to DTOs and update controllers
This commit introduces the `[ApiExplorerSettings(IgnoreApi = true)]` attribute to various DTO classes to exclude them from API documentation. The `using Microsoft.AspNetCore.Mvc;` directive has been added to several files to support ASP.NET Core MVC features.

Additionally, comments in `HistoryController.cs` have been reformatted for clarity, and `LocalizationController.cs` has been updated with standard API controller attributes. These changes improve code organization and maintain cleaner API documentation.
2025-04-11 23:41:47 +02:00
Developer 02
6e641395d5 Add JWT Bearer authentication to Swagger setup
Implemented security definitions and requirements for JWT Bearer authentication in the Swagger configuration. This includes defining a "Bearer" security scheme and adding a security requirement to support JWT authorization via the Authorization header.
2025-04-11 23:34:43 +02:00
Developer 02
fbd09cb570 Update comments in HistoryController for clarity
Improved descriptions of historical records related to sender, receiver, system, and unknown statuses. Enhanced formatting and provided detailed explanations of associated status codes for better readability.
2025-04-11 23:18:30 +02:00
Developer 02
7389909d77 Update comments in HistoryController class
Revised comments to remove outdated information about letter sending parties. Added new comments to clarify the method's functionality in returning status references for history records, enabling client applications to stay updated.
2025-04-11 22:56:38 +02:00
Developer 02
ded88383b3 refactor(HistoryController): Added new using directives for EmailProfiler and EF Core.
- Expanded XML documentation for GetEnvelopeStatus method,
clarifying the related parameter and its usage.
 - Updated
method signature to include [FromQuery] for better
parameter binding from the query string.
2025-04-11 22:51:40 +02:00
Developer 02
1b9b51fbd2 Add GetEnvelopeStatus method to HistoryController
Implemented a new method `GetEnvelopeStatus` in the `HistoryController` class. This method is accessible via HTTP GET and requires authorization. It returns a dictionary of envelope statuses, enhancing the API's functionality. Additional comments and documentation have been included to clarify the method's purpose and the statuses it handles.
2025-04-11 22:35:47 +02:00
Developer 02
afa6dda16f Update documentation for GetReferenceTypes method
Significantly revised the comments for the GetReferenceTypes method in the HistoryController class. Removed previous summary and response code details, and added a detailed description of the roles involved in the envelope sending process (Receiver, Sender, System, Unknown). Improved clarity with a list format and simplified return type documentation.
2025-04-11 21:08:23 +02:00
Developer 02
994c844f25 Refactor envelope and history query structures
- Removed `Sender` parameter and properties from `EnvelopeQuery`.
- Deleted `SenderQuery` class entirely.
- Cleaned up `HistoryQuery` by removing unused `using` directives and `ReferenceType` logic.
- Added `Related` parameter to `ReadHistoryQuery` for reference type indication.
- Updated `ReferenceType` enum in `Constants.vb` to use explicit integer values.
- Modified `HistoryController` to utilize the new `Related` property for determining sender/receiver inclusion.
2025-04-11 20:51:21 +02:00
Developer 02
4551e5dc64 Refactor envelope history queries and namespaces
Renamed `EnvelopeHistoryQuery` to `HistoryQuery` and
`ReadEnvelopeHistoryQuery` to `ReadHistoryQuery` to improve
clarity. Moved `StatusQuery` to the new
`EnvelopeGenerator.Application.Histories` namespace. Updated
`HistoryController` to use `ReadHistoryQuery`. Removed
unused `using` directives and added relevant ones to align
with the new structure. These changes enhance code
maintainability and organization.
2025-04-11 20:23:51 +02:00
Developer 02
ff34e6afab Revert "Remove GetReferenceTypes method from HistoryController"
This reverts commit a78912260a.
2025-04-11 19:45:12 +02:00
Developer 02
a78912260a Remove GetReferenceTypes method from HistoryController
This commit removes the entire GetReferenceTypes method, along with its XML documentation comments, from the HistoryController class. The method was responsible for retrieving reference types as key-value pairs and returning them in an HTTP response. Its removal indicates a change in functionality, suggesting that reference types are no longer needed or will be managed differently in the application.
2025-04-11 19:43:09 +02:00
Developer 02
c1e81c546f Add OnlyLast parameter to history query records
Updated `EnvelopeHistoryQuery` and `ReadEnvelopeHistoryQuery` to include a new optional `OnlyLast` parameter, removing the `Status` parameter. Documentation comments have been revised to reflect these changes, including updates in the `HistoryController` class.
2025-04-11 19:39:58 +02:00
Developer 02
9a950ae37d Enhance EnvelopeReceiver queries and controller
- Updated `EnvelopeReceiverQuery` to include an optional, nullable `Status` parameter.
- Modified `ReadEnvelopeReceiverQuery` to inherit from the updated `EnvelopeReceiverQuery`.
- Added new using directives in `EnvelopeReceiverController` and enhanced response documentation to include a 401 Unauthorized response.
- Implemented authorization for the `GetEnvelopeReceiver` method.
- Improved documentation and method signature for `GetReceiverName` to accept a `ReadReceiverNameQuery` object.
- Introduced a new `ReadReceiverNameQuery` record for querying the last used salutation of a receiver.
2025-04-11 19:27:53 +02:00
Developer 02
6cec82abd5 Update envelope controllers and improve documentation
- Added using directives in `EnvelopeController.cs` for
  `EnvelopeGenerator.Application.Envelopes.Queries.Read`
  and `EnvelopeGenerator.Common.Constants`.
- Modified `GetAsync` method to use `ReadEnvelopeQuery`
  instead of `StatusQuery`, updating the logic for
  retrieving envelope data.
- Enhanced parameter description in
  `EnvelopeReceiverController.cs` for clarity on
  filtering criteria for envelope recipients.
2025-04-11 18:35:02 +02:00
Developer 02
26616b4cab Update HistoryController comments and response codes
Replaced "Verlaufshistorie" with "Umschlaghistorie" in
the `HistoryController` class to clarify API context.
Added detailed response codes for `GetReferenceTypes`
and `GetAllAsync` methods to enhance API documentation.
2025-04-11 15:08:37 +02:00
Developer 02
178ec9226d Enhance API documentation in EnvelopeController
Added detailed response documentation for HTTP status codes
in the EnvelopeController class. This improves clarity on
expected responses for various scenarios, including success,
client errors, unauthorized access, and server errors.
2025-04-10 19:14:05 +02:00
Developer 02
0147f525fa Update AuthController and Login model for API changes
- Updated API documentation in AuthController.cs to include an optional "id" field in the authentication request body.
- Modified the Login record in Login.cs to require a "Password" field and include optional "Id" and "Username" fields, along with updated documentation comments.
2025-04-10 19:12:01 +02:00
Developer 02
f0ed6137d1 Remove GetSecretAsync method from EnvelopeReceiverController
The GetSecretAsync method, which retrieved secret information based on a UUID, has been completely removed along with its XML documentation comments and error handling logic. This change eliminates the functionality to access secret information via the specified endpoint in the controller.
2025-04-10 19:08:49 +02:00
Developer 02
b4ab2c4423 Enhance API documentation and error handling
Updated `EnvelopeReceiverController` with additional XML documentation for HTTP response codes in key methods. Improved formatting of catch blocks and enhanced logging statements for better error context.
2025-04-10 19:08:35 +02:00
Developer 02
5715343651 Refactor envelope command and controller response
Removed unnecessary parameters from CreateEnvelopeReceiverCommand, simplifying envelope creation. Updated EnvelopeReceiverController to reflect these changes by removing related fields from the JSON response, focusing on essential information.
2025-04-10 19:04:22 +02:00
Developer 02
6550be0235 Add XML documentation for GetReferenceTypes method
This commit introduces XML documentation comments to the
GetReferenceTypes method in the HistoryController class.
The comments clarify the method's purpose, indicating that
it retrieves available reference types and returns them
as key-value pairs, along with a summary and return type
information.
2025-04-10 18:57:48 +02:00
Developer 02
99b0dba79f Refactor envelope sender handling and update namespaces
Changed the namespace for `EnvelopeQuery` and updated the `Sender` parameter type to `SenderQuery?`. Removed `UserQuery.cs` as it is no longer needed. Introduced `SenderQuery.cs` with properties for sender details and added XML documentation for clarity.
2025-04-10 18:50:24 +02:00
Developer 02
2f8d5f1fc8 Refactor Envelope classes to use Sender instead of User
Updated the `EnvelopeHistoryQuery` to determine `ReferenceType` based on the presence of a `Sender` instead of a `User`.

In the `EnvelopeQuery`, replaced the `User` parameter with `Sender`, and updated related properties to reflect this change. This refactor shifts the focus from a user-centric model to a sender-centric model for envelope queries.
2025-04-10 18:49:01 +02:00
Developer 02
6969f5f93e Add XML documentation for EnvelopeQuery properties
This commit introduces XML documentation comments for the `UserId`, `Username`, and `UserEmail` properties in the `EnvelopeQuery` record. The comments clarify the purpose of each property, enhancing code readability and maintainability.
2025-04-10 18:48:08 +02:00
Developer 02
7bbed3890e Add Status parameter to EnvelopeHistoryQuery records
Updated EnvelopeHistoryQuery to include a new `Status` parameter for describing the envelope's status. Modified the `ReferenceType` property to return `ReferenceType.System` when neither the envelope's `User` nor the `Receiver` is defined.

Updated ReadEnvelopeHistoryQuery to include the `Status` parameter and set default values of `null` for `Envelope` and `Receiver`, ensuring consistency with the base class.
2025-04-10 18:46:37 +02:00
Developer 02
98290c7b28 Update comments in ReadEnvelopeReceiverResponse.cs
Enhanced clarity and detail in class documentation.
Rephrased summaries and remarks for better understanding
of the class and its properties, including the relationship
between envelope and receiver. Clarified parameters
`UserId` and `Status` for improved overall documentation.
2025-04-10 18:42:51 +02:00
Developer 02
d55006fdda chore: Hinzufügen von XML-Dokumentationsgenerierung und Swagger-Kommentaren
Aktualisierte Projektdateien zur Aktivierung der XML-Dokumentationsgenerierung durch Hinzufügen der Eigenschaften `<GenerateDocumentationFile>` und `<DocumentationFile>`. Geänderte Swagger-Konfiguration in `Program.cs`, um alle XML-Dateien im Basisverzeichnis für eine flexiblere Einbindung der Dokumentation einzuschließen.
2025-04-10 18:30:12 +02:00
Developer 02
b2cc0cb65a Refactor envelope creation commands and DTOs
Removed `CreateEnvelopeCommand` and introduced `CreateEnvelopeReceiverCommand` with updated parameters. Updated `ReceiverGetOrCreateDto` to include a new `Salution` parameter. Added XML documentation for the new command and associated DTOs.
2025-04-10 18:08:35 +02:00
Developer 02
049827a133 refactor: Deutsche Dokumentation für Umschlagbefehlsdatensätze hinzugefügt
XML-Dokumentationskommentare für `CreateEnvelopeCommand`, `ReceiverGetOrCreateDto` und `DocumentCreateDto` auf Deutsch aktualisiert. Die bestehende englische Dokumentation wurde entfernt, um eine einheitliche Sprache in der Codebasis zu gewährleisten.
2025-04-10 18:03:38 +02:00
Developer01
b8e4dfdf26 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-10 17:47:25 +02:00
Developer01
8a9d5f92f3 MS Bodytext, Bugfixing deleting 2025-04-10 17:46:33 +02:00
Developer 02
b02ab585cb Hinzufügen der Methoden „Create“ und „GetById“ zu ReceiverController
Die Klasse `ReceiverController` wurde um zwei neue Methoden erweitert: `Create` und `GetById`. Beide Methoden sind mit dem Attribut `[NonAction]` gekennzeichnet und derzeit deaktiviert. Die Methode `Create` akzeptiert einen `ReceiverCreateDto`-Parameter, während die Methode `GetById` einen `int`-Parameter annimmt. Die bestehende Methode `Update` bleibt unverändert.

Übersetzt mit DeepL.com (kostenlose Version)
2025-04-10 16:45:17 +02:00
Developer 02
c8a5a8627d Verbesserung der Dokumentation im ReceiverController
Der ReceiverController wurde mit XML-Dokumentationskommentaren versehen, um seinen Zweck und seine Funktionalität zu verdeutlichen. Beibehaltung des Konstruktors mit Parametererklärungen. Verbesserung der Get-Methode für eine bessere Fehlerbehandlung und Protokollierung. Die Create-, Delete- und Update-Methoden wurden als deaktiviert markiert, während ihre Basisfunktionalität beibehalten wurde. Die #region REMOVED ENDPOINTS wurde aktualisiert, um unbenutzte Methoden zu berücksichtigen. Insgesamt verbessern diese Änderungen die Code-Dokumentation und erhalten die Kernfunktionalität.
2025-04-10 16:42:20 +02:00
Developer 02
ecf0771f9e Refactor ReceiverController to use ReadReceiverQuery
Aktualisierte Get- und Delete-Methoden, um ReadReceiverQuery
für die Parameterbehandlung zu verwenden, was die Organisation und Kapselung verbessert.
Service-Aufrufe wurden angepasst, um Eigenschaften des neuen Query-Objekts
anstelle von individuellen Parametern zu verwenden.
2025-04-10 16:40:07 +02:00
Developer 02
02c7040b39 Verbesserung von LocalizationController mit XML-Dokumentation
Die Klasse LocalizationController wurde aktualisiert, um XML-Dokumentationskommentare für eine bessere Klarheit und ein besseres Verständnis der Methoden und Eigenschaften einzuschließen. Zusammenfassungen von Konstruktoren und Methoden sowie Parameterbeschreibungen wurden in deutscher Sprache hinzugefügt. Die allgemeine Struktur und Formatierung der Klasse wurde verbessert, um die richtige Definition und Lesbarkeit zu gewährleisten.
2025-04-10 16:37:33 +02:00
Developer 02
2cb5d0c0d5 Refactor envelope and user query structures
- Introduced a new `UserQuery` record to encapsulate user-related information, replacing individual fields in `EnvelopeQuery`.
- Added a `ReferenceType` property in `EnvelopeHistoryQuery` to enhance reference handling logic.
- Modified `EnvelopeQuery` to use the new `UserQuery` structure, simplifying the data model.
- Updated `HistoryController` with a new constructor and restructured the `GetReferenceTypes` method.
- Introduced `ReadEnvelopeHistoryQuery` to allow for more specific envelope history queries.
- Overall improvements enhance code structure, clarity, and querying capabilities.
2025-04-10 16:35:40 +02:00
Developer 02
9f186afdff refactor(EnvelopeTypeController): aktualisiert zu ignoriert von open-api 2025-04-10 16:09:45 +02:00
Developer 02
ec76014ce7 Verbesserung von EnvelopeReceiverController mit neuen Funktionen
Die Klasse EnvelopeReceiverController wurde aktualisiert, um die Funktionalität und Dokumentation zu verbessern. Es wurde eine neue using-Direktive hinzugefügt und die Namespace-Deklaration verschoben. Einführung der XML-Dokumentation in deutscher Sprache für mehr Klarheit. Die GetEnvelopeReceiver-Methode wurde so geändert, dass sie einen ReadEnvelopeReceiverQuery-Parameter akzeptiert, wodurch ihre Signatur verbessert wurde. Verbesserte Fehlerbehandlung und Protokollierung bei allen Methoden. GetSecretAsync hinzugefügt, um geheime Informationen nach UUID abzurufen. CreateAsync wurde aktualisiert, um die createEnvelopeQuery über den Mediator zu senden und einen akzeptierten Status zurückzugeben.
2025-04-10 16:07:08 +02:00
Developer 02
e7bc43b339 Refactor envelope query structures and controller methods
- Aktualisiert `EnvelopeHistoryQuery` um optionale `Envelope`, `Receiver` und neue `Status` Parameter für mehr Flexibilität zu enthalten.
- Vereinfachte `EnvelopeReceiverQuery`, so dass sie nur noch einen `Status`-Parameter enthält und unnötige Parameter entfernt wurden.
- ReadEnvelopeReceiverQuery„ wurde an das neue Design von ‚EnvelopeReceiverQuery‘ angepasst, indem ein “Status"-Parameter akzeptiert wird.
- Verbesserte XML-Dokumentation in `EnvelopeController` für mehr Klarheit über Methoden und Parameter.
- Die `GetAsync`-Methode wurde gestrafft, um einen `StatusQuery`-Parameter zu akzeptieren, der separate Status-Parameter ersetzt.
- Einführung eines neuen `StatusQuery`-Datensatzes, um Statuswerte mit detaillierter Dokumentation zu kapseln.
- Aktualisierte „using“-Direktiven in relevanten Dateien, um den neuen „EnvelopeHistories“-Namensraum einzubeziehen.
2025-04-10 16:01:21 +02:00
Developer 02
26be8d4565 feat(EnvelopeHistoryQuery): Hinzufügen des EnvelopeHistoryQuery-Datensatzes für den Umschlagverlauf.
- Führt einen neuen Datensatztyp `EnvelopeHistoryQuery` im `EnvelopeGenerator.Application.EnvelopeHistories` Namespace ein. Dieser Datensatz kapselt die Parameter `EnvelopeId`, `Envelope` und `Receiver`, wobei die letzten beiden generische Typen sind, die auf `EnvelopeQuery` und `ReceiverQuery` beschränkt sind. Die XML-Dokumentation enthält Kommentare zur Beschreibung des Datensatzes und seiner Parameter.
2025-04-10 13:19:21 +02:00
Developer 02
17902c4824 Refactor DTOs und Queries für Klarheit und Konsistenz
- Aktualisiert `ReceiverGetOrCreateDto`, um E-Mail in Kleinbuchstaben korrekt zuzuordnen und verbesserte Dokumentation.
- Der Parameter `Receiver` wurde aus der `EnvelopeReceiverQuery` entfernt.
- Verbesserte Kommentare in `ReadEnvelopeReceiverQuery`, um den Zweck zu verdeutlichen.
- Detaillierte Zusammenfassungskommentare zu `ReadEnvelopeReceiverResponse` und `ReadEnvelopeResponse` zum besseren Verständnis der Eigenschaften hinzugefügt.
- Es wurden neue zusammenfassende Kommentare in `ReadReceiverQuery` und `ReadReceiverResponse` eingeführt, um ihre Rollen und Beziehungen zu beschreiben.
2025-04-10 12:45:51 +02:00
Developer 02
115cb86968 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2025-04-09 14:25:33 +02:00
Developer 02
4a898e40ac chore: Hinzufügen von IIS-Veröffentlichungsprofilen für .NET 7 und .NET 9
Mit diesem Commit werden zwei neue XML-Projektdateien eingeführt: `IISProfileNet7.pubxml` für .NET 7.0 und `IISProfileNet9Win64.pubxml` für .NET 9.0 mit Windows 64-bit. Diese Dateien definieren wesentliche Eigenschaften für die Veröffentlichung von .NET-Anwendungen, einschließlich der Web-Publishing-Methode, der Build-Konfiguration, des Speicherorts des Pakets und des Bereitstellungspfads, wodurch die ordnungsgemäße Paketierung und Bereitstellung für IIS erleichtert wird.
2025-04-09 14:25:17 +02:00
Developer 02
bdc0286253 chore: Aktualisierung der Ziel-Frameworks in der Projektdatei
Modifizierte `EnvelopeGenerator.GeneratorAPI.csproj`, um
mehrere Ziel-Frameworks zu unterstützen: `net7.0`, `net8.0`, und `net9.0`.
Diese Änderung verbessert die Kompatibilität und macht die Anwendung zukunftssicher.
2025-04-09 13:26:40 +02:00
Developer 02
8bdc305b82 chore: Aktualisierung der Zielframeworks in der Projektdatei
Die Projektdatei `EnvelopeGenerator.Web.csproj` wurde geändert, um mehrere Zielframeworks zu unterstützen. Das bisherige einzelne Zielframework `net7.0` wurde durch `net7.0`, `net8.0` und `net9.0` ersetzt, was eine verbesserte Kompatibilität und Zukunftssicherheit der Anwendung ermöglicht.
2025-04-09 13:25:48 +02:00
Developer 02
396c6014fb Hinzufügen von XML-Dokumentation für ReadEnvelopeQuery
Der Datensatz `ReadEnvelopeQuery` wurde um XML-Kommentare
erweitert, um seinen Zweck als Abfrage zum Lesen von Umschlägen zu verdeutlichen.
2025-04-09 10:30:36 +02:00
Developer 02
06175b0c95 feat(ReceiverQuery): Hinzufügen von XML-Dokumentation zum ReceiverQuery-Datensatz
- Verbesserte Klarheit und Benutzerfreundlichkeit des Codes durch Hinzufügen von XML-Dokumentationskommentaren zum ReceiverQuery-Datensatz, einschließlich einer Zusammenfassung und detaillierter Parameterbeschreibungen.
2025-04-09 10:28:28 +02:00
Developer 02
5375d89d5b Refactor envelope response and query records
`ReadEnvelopeReceiverResponse` wurde aktualisiert, um mehrere Empfänger zuzulassen und `HasPhoneNumber` hinzugefügt. EnvelopeQuery„ wurde durch die Einführung der optionalen Parameter ‚Username‘ und “E-Mail" für einen besseren Benutzerkontext verbessert.
2025-04-09 10:23:19 +02:00
Developer 02
abd1807b18 chore: Aktualisierung der Projekt-Metadaten in der .csproj-Datei
- Hinzufügen von Paket-ID, Titel, Autoren, Firma, Produktname,
Versionsinformationen und Paketausgabepfad zu
`EnvelopeGenerator.GeneratorAPI.csproj` für verbesserte
Identifizierung und Verwaltung in Paket-Repositories.
2025-04-09 09:59:29 +02:00
Developer 02
3f33be452c feat: Option zur Verwendung von Swagger und Scalar in der Produktion hinzufügen.
- Login-Endpunkt beheben
2025-04-09 09:53:13 +02:00
Developer 02
9a4931781a Refactor envelope and receiver response models
- Updated `ReadEnvelopeReceiverResponse` to use `ReadEnvelopeResponse` instead of `ReadReceiverResponse`.
- Modified `ReadReceiverResponse` to include additional parameters in its constructor for better detail.
- Introduced a new `ReadEnvelopeResponse` record with comprehensive properties and a computed `StatusName`.
2025-04-07 14:53:31 +02:00
Developer 02
b3a2e1559a Refactor envelope handling and introduce new queries
Restructured the `CreateEnvelope` functionality by moving the `CreateEnvelopeCommand` and related DTOs to a new namespace. Der `EnvelopeReceiverController` wurde aktualisiert, um diese Änderungen widerzuspiegeln, und die Parameter wurden zur besseren Übersichtlichkeit umbenannt. Es wurden neue Abfragesätze für das Lesen von Umschlag-Empfängern und definierte Antwortstrukturen eingeführt, wodurch die Gesamtorganisation und die Wartbarkeit der Codebasis verbessert wurden.

Übersetzt mit DeepL.com (kostenlose Version)
2025-04-07 12:03:34 +02:00
Developer 02
261d1b3db9 Verbesserte Funktionen zur Erstellung von Umschlägen und Aktualisierung von Projekten
Neue DTOs und Befehle zur Erstellung von Umschlägen in CreateEnvelope.cs hinzugefügt. Aktualisierte Projektdateien, um net7.0, net8.0 und net9.0 zu unterstützen. Refactored EnvelopeController für bessere Struktur und Fehlerbehandlung. Einführung einer Methode zur Erstellung von Umschlägen in EnvelopeReceiverController unter Verwendung von IMediator. Allgemeine Verbesserungen der Funktionalität und Kompatibilität.
2025-04-04 15:36:03 +02:00
Developer 02
401d03aac2 Verbesserung der Umschlagserstellung mit neuen DTOs und Befehlen
Einführung neuer Datenübertragungsobjekte für Signaturen und Empfänger.
Aktualisiert `CreateEnvelopeCommand` um benötigte Felder wie
`Title`, `Message`, `Document` und `Receivers`, zusammen mit optionalen
Parametern. Entfernt `EnvelopeCreateDto` für einen besser strukturierten
Ansatz zur Verwaltung von Umschlagserstellungsdaten.
2025-04-04 14:02:30 +02:00
Developer 02
7871bf72f6 Add CreateEnvelope command and DTO for envelope creation
Führt den `CreateEnvelopeCommand` Datensatz und seinen Handler ein, der die `IRequest` Schnittstelle von MediatR implementiert. Der Handler wirft derzeit eine `NotImplementedException`.

Fügt die Klasse „EnvelopeCreateDto“ mit Eigenschaften für Titel, Nachricht, Sprache, Verfallsdaten, Vertragstyp und TFA-Flag hinzu. Erforderliche Felder werden mit Datenanmerkungen validiert, und für bestimmte Eigenschaften werden Standardwerte festgelegt.
2025-04-03 17:48:49 +02:00
Developer 02
7e07afa384 Add MediatR package reference to project
This commit adds a new package reference for "MediatR"
with version "11.1.0" to the project file
`EnvelopeGenerator.Application.csproj`.
2025-04-03 13:21:08 +02:00
Developer 02
251420134a Verbesserung der Authentifizierungsmethoden und der Dokumentation
Die XML-Dokumentation für die Methode „Login“ wurde aktualisiert, um die Antwortcodes zu verdeutlichen, und es wurden Beispielanfragen hinzugefügt. Einführung einer neuen „Logout“-Methode mit entsprechender Dokumentation und Autorisierung. Hinzufügen einer Methode `IsAuthenticated` zur Überprüfung auf gültige Token, mit aktualisierter Antwortbehandlung und Dokumentation. Das `AllowAnonymous`-Attribut von `IsAuthenticated` wurde entfernt, um die Autorisierung zu erzwingen.
2025-04-03 11:12:33 +02:00
Developer 02
701b26289b Refactor AuthController and update Login method
- Added using directive for EnvelopeGenerator.GeneratorAPI.Models.
- Changed Login method parameter type from LogInDto to Login.
- Modified HTTP route for Login method from "/form" to "form".
- Enhanced XML documentation for better clarity on method usage.
- Specified response type for successful login as text/javascript.
- Removed ProducesResponseType for 500 Internal Server Error.
2025-04-03 08:02:42 +02:00
Developer 02
754e3ddc7a Verbesserung des AuthControllers und der Projektdokumentation
- AuthController.cs mit XML-Dokumentation aktualisiert und Parameter der Login-Methode umstrukturiert.
- Geänderte Klassendefinition zu partiell für Erweiterbarkeit.
- XML-Dokumentationsgenerierung zur Projektdatei hinzugefügt.
- Verbesserte Swagger-Dokumentation in Program.cs und korrigierte API-Beschreibung.
- Einführung einer neuen Datei Login.cs für ein strukturiertes Login-Datenmodell.
2025-04-02 17:07:07 +02:00
Developer 02
a0e8cc6989 Das Swagger-Setup wurde aktualisiert und enthält nun eine detaillierte Dokumentation mit Versionsangaben, Titel, Beschreibung und Kontaktinformationen. 2025-04-02 15:12:59 +02:00
Developer 02
b9f25a0ac4 Update Swashbuckle.AspNetCore to version 8.1.0 2025-04-02 15:02:36 +02:00
Developer 02
f40ee49977 Verbesserung der Login-Methode und Vereinfachung der IsAuthenticated-Route
- Die Login-Methode wurde geändert, um einen zusätzlichen `bool cookie`-Parameter für mehr Flexibilität zu akzeptieren.
- Hinzufügen einer neuen Login-Methode, die LogInDto aus Formulardaten verarbeitet und die ursprüngliche Methode mit `cookie` auf true setzt.
- Aufnahme eines Platzhalters für JWT- und Cookie-Handling in die ursprüngliche Login-Methode.
2025-04-02 14:40:02 +02:00
Developer 02
d08e93cbef Aktualisieren Sie das Projekt auf .NET 9.0 und verbessern Sie die API-Unterstützung
- Zielen Sie nur auf .NET 9.0 in `EnvelopeGenerator.GeneratorAPI.csproj`.
- Fügen Sie das Paket `AspNetCore.Scalar` hinzu und aktualisieren Sie `Microsoft.AspNetCore.OpenApi` auf Version 9.0.3.
- Scalar.AspNetCore„ in die Datei “Program.cs" einbinden.
- Integrieren Sie OpenAPI-Unterstützung mit `AddOpenApi()` und bilden Sie Endpunkte mit `app.MapOpenApi()` und `app.MapScalarApiReference()` ab.
2025-04-02 11:21:31 +02:00
Developer 02
4a48bbb3e2 Update target frameworks in project file
The project file `EnvelopeGenerator.GeneratorAPI.csproj` has been modified to target multiple frameworks, replacing the single target `net7.0` with `net8.0` and `net9.0`. This change enables the project to be built for the latest versions of .NET.
2025-04-01 20:43:35 +02:00
Developer 02
9725e2a729 fix(Programm): Update des „Envelope Generator“-Repositorys und der Dienstkonfiguration 2025-04-01 19:05:33 +02:00
Developer 02
031f0d4cce Hinzufügen des EnvelopeGenerator.Terminal-Projekts mit CLI-Unterstützung
Die Lösung wurde aktualisiert und enthält nun ein neues Projekt `EnvelopeGenerator.Terminal` für .NET 8.0. Hinzufügen der Klassen `CommandManager` und `DependencyInjection` für die Befehlsausführung und die Injektion von Abhängigkeiten mit CommandDotNet. Die Klasse `Program` wurde eingeführt, um den Anwendungshost einzurichten und Befehle auszuführen. Hinzufügen der erforderlichen Paketverweise in der Projektdatei zur Unterstützung neuer Funktionen.
2025-04-01 18:58:26 +02:00
161 changed files with 5093 additions and 939 deletions

View File

@@ -7,7 +7,7 @@ using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.Contracts.Services;
public interface IEnvelopeHistoryService : ICRUDService<EnvelopeHistoryCreateDto, EnvelopeHistoryDto, EnvelopeHistoryDto, EnvelopeHistory, long>
public interface IEnvelopeHistoryService : ICRUDService<EnvelopeHistoryCreateDto, EnvelopeHistoryDto, EnvelopeHistory, long>
{
Task<int> CountAsync(int? envelopeId = null, string? userReference = null, int? status = null);

View File

@@ -4,6 +4,6 @@ using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts.Services;
public interface IEnvelopeReceiverReadOnlyService : ICRUDService<EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnlyDto, EnvelopeReceiverReadOnlyUpdateDto, EnvelopeReceiverReadOnly, long>
public interface IEnvelopeReceiverReadOnlyService : ICRUDService<EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnlyDto, EnvelopeReceiverReadOnly, long>
{
}

View File

@@ -1,4 +1,5 @@
using DigitalData.Core.Abstractions.Application;
using CommandDotNet;
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Messaging;
@@ -25,6 +26,7 @@ public interface IEnvelopeReceiverService : IBasicCRUDService<EnvelopeReceiverDt
Task<DataResult<bool>> VerifyAccessCodeAsync(string uuid, string signature, string accessCode);
[Command("verify-access-code-async-by-id")]
Task<DataResult<bool>> VerifyAccessCodeAsync(string envelopeReceiverId, string accessCode);
Task<DataResult<bool>> IsExisting(string envelopeReceiverId);

View File

@@ -6,7 +6,7 @@ using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts.Services;
public interface IReceiverService : ICRUDService<ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>
public interface IReceiverService : ICRUDService<ReceiverCreateDto, ReceiverReadDto, Receiver, int>
{
Task<DataResult<ReceiverReadDto>> ReadByAsync(string? emailAddress = null, string? signature = null);

View File

@@ -1,9 +1,11 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record ConfigDto(
string DocumentPath,
int SendingProfile,

View File

@@ -1,7 +1,9 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record DocumentReceiverElementDto(
int Id,
int DocumentId,

View File

@@ -1,7 +1,9 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record DocumentStatusDto(
int Id,
int EnvelopeId,

View File

@@ -1,7 +1,9 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EmailTemplateDto(
int Id,
string Name,

View File

@@ -1,7 +1,9 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeCertificateDto(
int Id,
int EnvelopeId,

View File

@@ -1,7 +1,9 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeDocumentDto
(
int Id,

View File

@@ -2,9 +2,11 @@
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using DigitalData.UserManager.Application.DTOs.User;
using EnvelopeGenerator.Domain.Entities;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeDto() : IUnique<int>
{
public int Id { get; set; }

View File

@@ -1,5 +1,8 @@
namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeHistoryCreateDto(
int EnvelopeId,
string UserReference,

View File

@@ -2,10 +2,12 @@
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.DTOs.User;
using EnvelopeGenerator.Application.DTOs.Receiver;
using Microsoft.AspNetCore.Mvc;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeHistoryDto(
long Id,
int EnvelopeId,

View File

@@ -1,8 +1,10 @@
using DigitalData.Core.Abstractions;
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeReceiverBasicDto() : IUnique<(int Envelope, int Receiver)>
{
public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId);

View File

@@ -1,7 +1,9 @@
using EnvelopeGenerator.Application.DTOs.Receiver;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeReceiverDto() : EnvelopeReceiverBasicDto()
{
public EnvelopeDto? Envelope { get; set; }

View File

@@ -1,5 +1,8 @@
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeReceiverSecretDto() : EnvelopeReceiverDto()
{
public string? AccessCode { get; init; }

View File

@@ -1,8 +1,10 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeReceiverReadOnlyCreateDto(
DateTime DateValid)
{

View File

@@ -1,7 +1,9 @@
using EnvelopeGenerator.Application.DTOs.Receiver;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeReceiverReadOnlyDto(
long Id,
long EnvelopeId,

View File

@@ -1,7 +1,9 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeReceiverReadOnlyUpdateDto(
long Id,
DateTime DateValid,

View File

@@ -1,7 +1,9 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record EnvelopeTypeDto(
int Id,
string Title,

View File

@@ -0,0 +1,70 @@
using AutoMapper;
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.DTOs;
/// <summary>
/// Represents the AutoMapper profile configuration for mapping between
/// domain entities and data transfer objects (DTOs) used within the EnvelopeGenerator application.
/// </summary>
public class MappingProfile : Profile
{
/// <summary>
/// Initializes a new instance of the <see cref="MappingProfile"/> class.
/// Configures the mappings between entities and DTOs used throughout the application.
/// </summary>
public MappingProfile()
{
// 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<Domain.Entities.EnvelopeHistory, EnvelopeHistoryDto>();
CreateMap<Domain.Entities.EnvelopeHistory, EnvelopeHistoryCreateDto>();
CreateMap<Domain.Entities.EnvelopeReceiver, EnvelopeReceiverDto>();
CreateMap<Domain.Entities.EnvelopeReceiver, EnvelopeReceiverSecretDto>();
CreateMap<EnvelopeType, EnvelopeTypeDto>();
CreateMap<Domain.Entities.Receiver, ReceiverReadDto>();
CreateMap<Domain.Entities.Receiver, ReceiverCreateDto>();
CreateMap<Domain.Entities.Receiver, ReceiverUpdateDto>();
CreateMap<UserReceiver, UserReceiverDto>();
CreateMap<Domain.Entities.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, Domain.Entities.EnvelopeHistory>();
CreateMap<EnvelopeHistoryCreateDto, Domain.Entities.EnvelopeHistory>();
CreateMap<EnvelopeReceiverDto, Domain.Entities.EnvelopeReceiver>();
CreateMap<EnvelopeTypeDto, EnvelopeType>();
CreateMap<ReceiverReadDto, Domain.Entities.Receiver>().ForMember(rcv => rcv.EnvelopeReceivers, rcvReadDto => rcvReadDto.Ignore());
CreateMap<ReceiverCreateDto, Domain.Entities.Receiver>();
CreateMap<ReceiverUpdateDto, Domain.Entities.Receiver>();
CreateMap<UserReceiverDto, UserReceiver>();
CreateMap<EnvelopeReceiverBase, EnvelopeReceiverBasicDto>();
CreateMap<EnvelopeReceiverReadOnlyCreateDto, Domain.Entities.EnvelopeReceiverReadOnly>();
CreateMap<EnvelopeReceiverReadOnlyUpdateDto, Domain.Entities.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

@@ -1,4 +1,7 @@
namespace EnvelopeGenerator.Application.DTOs.Messaging
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.Messaging
{
[ApiExplorerSettings(IgnoreApi = true)]
public class GtxMessagingResponse : Dictionary<string, object?> { }
}

View File

@@ -1,5 +1,8 @@
namespace EnvelopeGenerator.Application.DTOs.Messaging
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.Messaging
{
[ApiExplorerSettings(IgnoreApi = true)]
public record SmsResponse
{
public required bool Ok { get; init; }

View File

@@ -1,9 +1,11 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;
using System.Security.Cryptography;
using System.Text;
namespace EnvelopeGenerator.Application.DTOs.Receiver
{
[ApiExplorerSettings(IgnoreApi = true)]
public record ReceiverCreateDto([EmailAddress] string EmailAddress, string? TotpSecretkey = null)
{
public string Signature => sha256HexOfMail.Value;

View File

@@ -2,10 +2,12 @@
using DigitalData.Core.DTO;
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using Microsoft.AspNetCore.Mvc;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs.Receiver;
[ApiExplorerSettings(IgnoreApi = true)]
public record ReceiverReadDto(
int Id,
string EmailAddress,

View File

@@ -1,5 +1,7 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs.Receiver;
[ApiExplorerSettings(IgnoreApi = true)]
public record ReceiverUpdateDto(int Id, string? TotpSecretkey = null, DateTime? TfaRegDeadline = null) : IUnique<int>;

View File

@@ -1,7 +1,9 @@
using DigitalData.Core.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.Application.DTOs
{
[ApiExplorerSettings(IgnoreApi = true)]
public record UserReceiverDto(
int Id,
int UserId,

View File

@@ -1,6 +1,4 @@
using DigitalData.UserManager.Application.MappingProfiles;
using EnvelopeGenerator.Application.MappingProfiles;
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Configurations;
using EnvelopeGenerator.Application.Services;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@@ -8,11 +6,21 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
using DigitalData.Core.Client;
using QRCoder;
using EnvelopeGenerator.Application.Contracts.Services;
using System.Reflection;
namespace EnvelopeGenerator.Application.Extensions;
namespace EnvelopeGenerator.Application;
public static class DIExtensions
/// <summary>
/// Extensions method for dependency injection
/// </summary>
public static class DependencyInjection
{
/// <summary>
/// Adds all required services for envelope generator application
/// </summary>
/// <param name="services"></param>
/// <param name="config"></param>
/// <returns></returns>
public static IServiceCollection AddEnvelopeGeneratorServices(this IServiceCollection services, IConfiguration config)
{
//Inject CRUD Service and repositoriesad
@@ -32,8 +40,8 @@ public static class DIExtensions
services.TryAddScoped<IEnvelopeReceiverReadOnlyService, EnvelopeReceiverReadOnlyService>();
//Auto mapping profiles
services.AddAutoMapper(typeof(BasicDtoMappingProfile).Assembly);
services.AddAutoMapper(typeof(UserMappingProfile).Assembly);
services.AddAutoMapper(Assembly.GetExecutingAssembly());
services.AddAutoMapper(typeof(DigitalData.UserManager.Application.DIExtensions));
services.Configure<DispatcherParams>(config.GetSection(nameof(DispatcherParams)));
services.Configure<MailParams>(config.GetSection(nameof(MailParams)));
@@ -47,6 +55,11 @@ public static class DIExtensions
services.TryAddSingleton<IAuthenticator, Authenticator>();
services.TryAddSingleton<QRCodeGenerator>();
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
});
return services;
}
}

View File

@@ -0,0 +1,18 @@
using AutoMapper;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Documents.Queries.Read;
/// <summary>
///
/// </summary>
public class ReadDocumentMappingProfile : Profile
{
/// <summary>
///
/// </summary>
public ReadDocumentMappingProfile()
{
CreateMap<EnvelopeDocument, ReadDocumentResponse>();
}
}

View File

@@ -0,0 +1,12 @@
using MediatR;
namespace EnvelopeGenerator.Application.Documents.Queries.Read;
/// <summary>
/// Represents a query to read a document based on its unique identifier or associated envelope identifier.
/// </summary>
/// <param name="Id">The unique identifier of the document. Optional.</param>
/// <param name="EnvelopeId">The identifier of the envelope associated with the document. Optional.</param>
public record ReadDocumentQuery(int? Id = null, int? EnvelopeId = null) : IRequest<ReadDocumentResponse?>
{
}

View File

@@ -0,0 +1,47 @@
using DigitalData.Core.Abstractions.Infrastructure;
using EnvelopeGenerator.Domain.Entities;
using MediatR;
namespace EnvelopeGenerator.Application.Documents.Queries.Read;
/// <summary>
/// Handles queries for reading <see cref="EnvelopeDocument"/> data based on either the document ID or the envelope ID.
/// </summary>
public class ReadDocumentQueryHandler : IRequestHandler<ReadDocumentQuery, ReadDocumentResponse?>
{
/// <summary>
/// Repository for accessing <see cref="EnvelopeDocument"/> entities.
/// </summary>
private readonly IRepository<EnvelopeDocument> _repo;
/// <summary>
/// Initializes a new instance of the <see cref="ReadDocumentQueryHandler"/> class.
/// </summary>
/// <param name="envelopeDocumentRepository">The repository used to access <see cref="EnvelopeDocument"/> entities.</param>
public ReadDocumentQueryHandler(IRepository<EnvelopeDocument> envelopeDocumentRepository)
{
_repo = envelopeDocumentRepository;
}
/// <summary>
/// Handles the <see cref="ReadDocumentQuery"/> and returns a <see cref="ReadDocumentResponse"/> based on the provided identifiers.
/// </summary>
/// <param name="query">The query containing the document ID or envelope ID to search for.</param>
/// <param name="cancellationToken">A token to monitor for cancellation requests.</param>
/// <returns>
/// A <see cref="ReadDocumentResponse"/> if a matching document is found; otherwise, <c>null</c>.
/// </returns>
/// <exception cref="InvalidOperationException">
/// Thrown when neither <see cref="ReadDocumentQuery.Id"/> nor <see cref="ReadDocumentQuery.EnvelopeId"/> is provided.
/// </exception>
public async Task<ReadDocumentResponse?> Handle(ReadDocumentQuery query, CancellationToken cancellationToken)
{
if (query.Id is not null)
return await _repo.ReadOrDefaultAsync<ReadDocumentResponse>(d => d.Id == query.Id);
else if (query.EnvelopeId is not null)
return await _repo.ReadOrDefaultAsync<ReadDocumentResponse>(d => d.EnvelopeId == query.EnvelopeId);
throw new InvalidOperationException(
$"Invalid {nameof(ReadDocumentQuery)}: either {nameof(query.Id)} or {nameof(query.EnvelopeId)} must be provided.");
}
}

View File

@@ -0,0 +1,12 @@
namespace EnvelopeGenerator.Application.Documents.Queries.Read;
/// <summary>
/// Represents the response for reading a document.
/// </summary>
public class ReadDocumentResponse : ReadDocumentResponseBase
{
/// <summary>
/// The binary data of the document, if available.
/// </summary>
public byte[]? ByteData { get; init; }
}

View File

@@ -0,0 +1,22 @@
namespace EnvelopeGenerator.Application.Documents.Queries.Read;
/// <summary>
/// Represents the response for reading a document.
/// </summary>
public class ReadDocumentResponseBase
{
/// <summary>
/// The unique identifier of the document.
/// </summary>
public int Guid { get; init; }
/// <summary>
/// The identifier of the associated envelope.
/// </summary>
public int EnvelopeId { get; init; }
/// <summary>
/// The date and time when the document was added.
/// </summary>
public DateTime AddedWhen { get; init; }
}

View File

@@ -0,0 +1,22 @@
using EnvelopeGenerator.Common;
namespace EnvelopeGenerator.Application.EmailTemplates.Commands.Reset;
/// <summary>
/// Ein Befehl zum Zurücksetzen einer E-Mail-Vorlage auf die Standardwerte.
/// Erbt von <see cref="EmailTemplateQuery"/> und ermöglicht die Angabe einer optionalen ID und eines Typs der E-Mail-Vorlage.
/// </summary>
/// <param name="Id">Die optionale ID der E-Mail-Vorlage, die zurückgesetzt werden soll.</param>
/// <param name="Type">Der Typ der E-Mail-Vorlage, z. B. <see cref="Constants.EmailTemplateType"/> (optional). Beispiele:
/// 0 - DocumentReceived: Benachrichtigung über den Empfang eines Dokuments.
/// 1 - DocumentSigned: Benachrichtigung über die Unterzeichnung eines Dokuments.
/// 2 - DocumentDeleted: Benachrichtigung über das Löschen eines Dokuments.
/// 3 - DocumentCompleted: Benachrichtigung über den Abschluss eines Dokuments.
/// 4 - DocumentAccessCodeReceived: Benachrichtigung über den Erhalt eines Zugangscodes.
/// 5 - DocumentShared: Benachrichtigung über das Teilen eines Dokuments.
/// 6 - TotpSecret: Benachrichtigung über ein TOTP-Geheimnis.
/// 7 - DocumentRejected_ADM (Für den Absender): Mail an den Absender, wenn das Dokument abgelehnt wird.
/// 8 - DocumentRejected_REC (Für den ablehnenden Empfänger): Mail an den ablehnenden Empfänger, wenn das Dokument abgelehnt wird.
/// 9 - DocumentRejected_REC_2 (Für sonstige Empfänger): Mail an andere Empfänger (Brief), wenn das Dokument abgelehnt wird.
/// </param>
public record ResetEnvelopeTemplateCommand(int? Id, Constants.EmailTemplateType? Type) : EmailTemplateQuery(Id, Type);

View File

@@ -0,0 +1,22 @@
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.EmailTemplates.Commands.Update;
/// <summary>
/// Befehl zum Aktualisieren einer E-Mail-Vorlage.
/// </summary>
/// <param name="Body">
/// (Optional)Der neue Inhalt des E-Mail-Textkörpers. Wenn null, bleibt der vorhandene Inhalt unverändert.
/// </param>
/// <param name="Subject">
/// (Optional) Der neue Betreff der E-Mail. Wenn null, bleibt der vorhandene Betreff unverändert.
/// </param>
public record UpdateEmailTemplateCommand(string? Body = null, string? Subject = null)
{
/// <param>
/// Die Abfrage, die die E-Mail-Vorlage darstellt, die aktualisiert werden soll.
/// </param>
[JsonIgnore]
public EmailTemplateQuery? EmailTemplateQuery { get; set; }
}

View File

@@ -0,0 +1,24 @@
using EnvelopeGenerator.Common;
namespace EnvelopeGenerator.Application.EmailTemplates;
/// <summary>
/// Repräsentiert eine Abfrage für E-Mail-Vorlagen, die für Absender und Empfänger von Umschlägen verwendet werden.
/// Die Standardkultur ist "de-DE".
/// </summary>
/// <param name="Id">Die eindeutige Kennung der E-Mail-Vorlage (optional).</param>
/// <param name="Type">Der Typ der E-Mail-Vorlage, z. B. <see cref="Constants.EmailTemplateType"/> (optional). Beispiele:
/// 0 - DocumentReceived: Benachrichtigung über den Empfang eines Dokuments.
/// 1 - DocumentSigned: Benachrichtigung über die Unterzeichnung eines Dokuments.
/// 2 - DocumentDeleted: Benachrichtigung über das Löschen eines Dokuments.
/// 3 - DocumentCompleted: Benachrichtigung über den Abschluss eines Dokuments.
/// 4 - DocumentAccessCodeReceived: Benachrichtigung über den Erhalt eines Zugangscodes.
/// 5 - DocumentShared: Benachrichtigung über das Teilen eines Dokuments.
/// 6 - TotpSecret: Benachrichtigung über ein TOTP-Geheimnis.
/// 7 - DocumentRejected_ADM (Für den Absender): Mail an den Absender, wenn das Dokument abgelehnt wird.
/// 8 - DocumentRejected_REC (Für den ablehnenden Empfänger): Mail an den ablehnenden Empfänger, wenn das Dokument abgelehnt wird.
/// 9 - DocumentRejected_REC_2 (Für sonstige Empfänger): Mail an andere Empfänger (Brief), wenn das Dokument abgelehnt wird.
/// </param>
public record EmailTemplateQuery(int? Id = null, Constants.EmailTemplateType? Type = null)
{
}

View File

@@ -0,0 +1,10 @@
namespace EnvelopeGenerator.Application.EmailTemplates.Queries.Read;
/// <summary>
/// Stellt eine Abfrage dar, um eine E-Mail-Vorlage zu lesen.
/// Diese Klasse erbt von <see cref="EmailTemplateQuery"/>.
/// </summary>
public record ReadEmailTemplateQuery : EmailTemplateQuery
{
}

View File

@@ -0,0 +1,20 @@
namespace EnvelopeGenerator.Application.EmailTemplates.Queries.Read;
/// <summary>
/// Stellt die Antwort für eine Abfrage von E-Mail-Vorlagen bereit.
/// </summary>
/// <param name="Id">Die eindeutige Kennung der E-Mail-Vorlage.</param>
/// <param name="Type">Der Typ der E-Mail-Vorlage.</param>
/// <param name="AddedWhen">Das Datum und die Uhrzeit, wann die Vorlage hinzugefügt wurde.</param>
/// <param name="Body">Der Inhalt (Body) der E-Mail-Vorlage. Kann null sein.</param>
/// <param name="Subject">Der Betreff der E-Mail-Vorlage. Kann null sein.</param>
/// <param name="ChangedWhen">Das Datum und die Uhrzeit, wann die Vorlage zuletzt geändert wurde. Kann null sein.</param>
public record ReadEmailTemplateResponse(
int Id,
int Type,
DateTime AddedWhen,
string? Body = null,
string? Subject = null,
DateTime? ChangedWhen = null)
{
}

View File

@@ -1,9 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
</PropertyGroup>
<ItemGroup>
@@ -11,18 +13,18 @@
</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.Abstractions" Version="3.6.0" />
<PackageReference Include="DigitalData.Core.Application" Version="3.2.1" />
<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="DigitalData.Core.DTO" Version="2.0.1" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher" Version="3.0.0" />
<PackageReference Include="MediatR" Version="12.5.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.18" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.4" />
<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" />
<PackageReference Include="UserManager" Version="1.0.0" />
</ItemGroup>
<ItemGroup>
@@ -57,4 +59,25 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="CommandDotNet">
<Version>7.0.5</Version>
</PackageReference>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="CommandDotNet">
<Version>8.1.1</Version>
</PackageReference>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="CommandDotNet">
<Version>8.1.1</Version>
</PackageReference>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,59 @@
using MediatR;
using System.ComponentModel.DataAnnotations;
namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create;
/// <summary>
/// Befehl zur Erstellung eines Umschlags.
/// </summary>
/// <param name="Title">Der Titel des Umschlags. Dies ist ein Pflichtfeld.</param>
/// <param name="Message">Die Nachricht, die im Umschlag enthalten sein soll. Dies ist ein Pflichtfeld.</param>
/// <param name="Document">Das mit dem Umschlag verknüpfte Dokument. Dies ist ein Pflichtfeld.</param>
/// <param name="Receivers">Eine Sammlung von Empfängern, die den Umschlag erhalten. Dies ist ein Pflichtfeld.</param>
/// <param name="TFAEnabled">Gibt an, ob die Zwei-Faktor-Authentifizierung für den Umschlag aktiviert ist. Standardmäßig false.</param>
public record CreateEnvelopeReceiverCommand(
[Required] string Title,
[Required] string Message,
[Required] DocumentCreateCommand Document,
[Required] IEnumerable<ReceiverGetOrCreateCommand> Receivers,
bool TFAEnabled = false
) : IRequest;
#region DTOs
/// <summary>
/// Signaturposition auf einem Dokument.
/// </summary>
/// <param name="X">X-Position</param>
/// <param name="Y">Y-Position</param>
/// <param name="Page">Seite, auf der sie sich befindet</param>
public record Signature([Required] int X, [Required] int Y, [Required] int Page);
/// <summary>
/// DTO für Empfänger, die erstellt oder abgerufen werden sollen.
/// Wenn nicht, wird sie erstellt und mit einer Signatur versehen.
/// </summary>
/// <param name="Signatures">Unterschriften auf Dokumenten.</param>
/// <param name="Salution">Der Name, mit dem der Empfänger angesprochen werden soll. Bei Null oder keinem Wert wird der zuletzt verwendete Name verwendet.</param>
/// <param name="PhoneNumber">Sollte mit Vorwahl geschrieben werden</param>
public record ReceiverGetOrCreateCommand([Required] IEnumerable<Signature> Signatures, string? Salution = null, string? PhoneNumber = null)
{
private string _emailAddress = string.Empty;
/// <summary>
/// E-Mail-Adresse des Empfängers.
/// </summary>
[Required]
public required string EmailAddress { get => _emailAddress.ToLower(); init => _emailAddress = _emailAddress.ToLower(); }
};
/// <summary>
/// DTO zum Erstellen eines Dokuments.
/// </summary>
/// <param name="DataAsByte">
/// Die Dokumentdaten im Byte-Array-Format. Wird verwendet, wenn das Dokument als Roh-Binärdaten bereitgestellt wird.
/// </param>
/// <param name="DataAsBase64">
/// Die Dokumentdaten im Base64-String-Format. Wird verwendet, wenn das Dokument als Base64-codierter String bereitgestellt wird.
/// </param>
public record DocumentCreateCommand(byte[]? DataAsByte = null, string? DataAsBase64 = null);
#endregion

View File

@@ -0,0 +1,47 @@
using EnvelopeGenerator.Application.Histories;
namespace EnvelopeGenerator.Application.EnvelopeReceivers;
/// <summary>
/// Stellt eine Abfrage für einen Envelope-Empfänger dar.
/// </summary>
/// <param name="Status">Der Status der Abfrage, optional.</param>
public record EnvelopeReceiverQuery(EnvelopeStatusQuery? Status = null);
/// <summary>
/// Repräsentiert den Status eines Umschlags und dessen Beziehung zum Empfänger. (vgl. auch <see cref="Common.Constants.EnvelopeStatus"/>
/// Invalid (0): Ungültiger Status.
/// EnvelopeCreated (1001): Der Umschlag wurde erstellt.
/// EnvelopeSaved (1002): Der Umschlag wurde gespeichert.
/// EnvelopeQueued (1003): Der Umschlag wurde zur Verarbeitung eingeplant.
/// EnvelopeSent (1004): Der Umschlag wurde versendet. (Nicht verwendet)
/// EnvelopePartlySigned (1005): Der Umschlag wurde teilweise unterschrieben.
/// EnvelopeCompletelySigned (1006): Der Umschlag wurde vollständig unterschrieben.
/// EnvelopeReportCreated (1007): Ein Abschlussbericht wurde für den Umschlag erstellt.
/// EnvelopeArchived (1008): Der Umschlag wurde archiviert.
/// EnvelopeDeleted (1009): Der Umschlag wurde gelöscht.
/// AccessCodeRequested (2001): Der Zugriffscode wurde angefordert.
/// AccessCodeCorrect (2002): Der Zugriffscode war korrekt.
/// AccessCodeIncorrect (2003): Der Zugriffscode war falsch.
/// DocumentOpened (2004): Das Dokument wurde geöffnet.
/// DocumentSigned (2005): Ein Dokument wurde unterschrieben.
/// SignatureConfirmed (2006): Die Signatur wurde bestätigt.
/// DocumentRejected (2007): Ein Dokument wurde abgelehnt.
/// EnvelopeShared (2008): Der Umschlag wurde geteilt.
/// EnvelopeViewed (2009): Der Umschlag wurde angesehen.
/// DocumentForwarded (4001): Das Dokument wurde weitergeleitet.
/// MessageInvitationSent (3001): Einladung wurde gesendet (vom Trigger verwendet).
/// MessageAccessCodeSent (3002): Zugriffscode wurde gesendet.
/// MessageConfirmationSent (3003): Bestätigungsnachricht wurde gesendet.
/// MessageDeletionSent (3004): Löschbenachrichtigung wurde gesendet.
/// MessageCompletionSent (3005): Abschlussbenachrichtigung wurde gesendet.
/// <param name="Min">Der minimale Statuswert, der berücksichtigt werden soll.</param>
/// <param name="Max">Der maximale Statuswert, der berücksichtigt werden soll.</param>
/// <param name="Ignore">Eine Liste von Statuswerten, die ignoriert werden sollen.</param>
/// </summary>
public record EnvelopeStatusQuery(
int? Min = null,
int? Max = null,
int[]? Ignore = null)
{
}

View File

@@ -0,0 +1,30 @@
using EnvelopeGenerator.Application.Histories;
using EnvelopeGenerator.Application.Envelopes.Queries.Read;
using EnvelopeGenerator.Application.Receivers.Queries.Read;
using MediatR;
namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read;
/// <summary>
/// Repräsentiert eine Abfrage zum Lesen eines Envelope-Empfängers.
/// </summary>
/// <remarks>
/// Diese Abfrage kombiniert Informationen über einen Umschlag (<see cref="ReadEnvelopeQuery"/>)
/// und einen Empfänger (<see cref="ReadReceiverQuery"/>), um eine vollständige Antwort
/// (<see cref="ReadEnvelopeReceiverResponse"/>) zu generieren.
/// Die Antwort enthält Details wie den Status, die Zuordnung zwischen Umschlag und Empfänger
/// sowie zusätzliche Metadaten.
/// </remarks>
/// <param name="Status">Umschlag oder Empfängerstatus.</param>
public record ReadEnvelopeReceiverQuery(EnvelopeStatusQuery? Status = null) : EnvelopeReceiverQuery(Status), IRequest<ReadEnvelopeReceiverResponse>
{
/// <summary>
/// Der Umschlag, der mit dem Empfänger verknüpft ist.
/// </summary>
public ReadEnvelopeQuery? Envelope { get; init; }
/// <summary>
/// Der Empfänger, der mit dem Umschlag verknüpft ist.
/// </summary>
public ReadReceiverQuery? Receiver { get; init; }
};

View File

@@ -0,0 +1,94 @@
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using EnvelopeGenerator.Application.Envelopes.Queries.Read;
using EnvelopeGenerator.Application.Receivers.Queries.Read;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read;
/// <summary>
/// Repräsentiert die Antwort für das Lesen eines Envelope-Empfängers.
/// </summary>
/// <remarks>
/// Diese Klasse enthält Informationen über einen spezifischen Empfänger eines Umschlags (Envelope).
/// Sie verknüpft die Empfängerinformationen mit den zugehörigen Umschlagsdaten und bietet zusätzliche Metadaten.
/// </remarks>
/// <param name="UserId">Die eindeutige Kennung des Benutzers, der den Empfänger erstellt hat.</param>
/// <param name="Status">Der Status des Empfängers als numerischer Wert.</param>
public record ReadEnvelopeReceiverResponse(int UserId, int Status)
{
/// <summary>
/// Gibt die zusammengesetzte Kennung des Empfängers zurück, bestehend aus der Umschlags-ID und der Empfänger-ID.
/// </summary>
/// <remarks>
/// Diese Eigenschaft kombiniert die eindeutige Kennung des Umschlags (EnvelopeId) und die des Empfängers (ReceiverId)
/// zu einer einzigen, leicht zugänglichen Struktur.
/// </remarks>
[NotMapped]
public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId);
/// <summary>
/// Die eindeutige Kennung des zugehörigen Umschlags.
/// </summary>
[Required]
public int EnvelopeId { get; init; }
/// <summary>
/// Die eindeutige Kennung des Empfängers.
/// </summary>
[Required]
public int ReceiverId { get; init; }
/// <summary>
/// Die Reihenfolge des Empfängers innerhalb des Umschlags.
/// </summary>
public int Sequence { get; init; }
/// <summary>
/// Der Name des Empfängers. Kann als Platzhalter verwendet werden.
/// </summary>
[TemplatePlaceholder("[NAME_RECEIVER]")]
public string? Name { get; init; }
/// <summary>
/// Die Berufsbezeichnung des Empfängers.
/// </summary>
public string? JobTitle { get; init; }
/// <summary>
/// Der Firmenname des Empfängers.
/// </summary>
public string? CompanyName { get; init; }
/// <summary>
/// Eine private Nachricht, die mit dem Empfänger verknüpft ist.
/// </summary>
public string? PrivateMessage { get; init; }
/// <summary>
/// Das Datum und die Uhrzeit, wann der Empfänger hinzugefügt wurde.
/// </summary>
public DateTime AddedWhen { get; init; }
/// <summary>
/// Das Datum und die Uhrzeit, wann der Empfänger zuletzt geändert wurde (falls vorhanden).
/// </summary>
public DateTime? ChangedWhen { get; init; }
/// <summary>
/// Gibt an, ob der Empfänger eine Telefonnummer hat.
/// </summary>
public bool HasPhoneNumber { get; init; }
/// <summary>
/// Die zugehörigen Umschlagsdaten.
/// </summary>
[Required]
public required ReadEnvelopeResponse Envelope { get; init; }
/// <summary>
/// Die Liste der Empfängerinformationen.
/// </summary>
[Required]
public IEnumerable<ReadReceiverResponse> Receiver { get; init; } = new List<ReadReceiverResponse>();
}

View File

@@ -0,0 +1,16 @@
using MediatR;
namespace EnvelopeGenerator.Application.Envelopes;
/// <summary>
/// Repräsentiert eine Abfrage für Umschläge.
/// </summary>
/// <param name="Id">Die eindeutige Kennung des Umschlags.</param>
/// <param name="Status">Der Status des Umschlags.</param>
/// <param name="Uuid">Die universell eindeutige Kennung des Umschlags.</param>
public record EnvelopeQuery(
int? Id = null,
int? Status = null,
string? Uuid = null) : IRequest
{
};

View File

@@ -0,0 +1,8 @@
namespace EnvelopeGenerator.Application.Envelopes.Queries.Read;
/// <summary>
/// Stellt eine Abfrage zum Lesen von Briefumschlägen dar.
/// </summary>
public record ReadEnvelopeQuery : EnvelopeQuery
{
}

View File

@@ -0,0 +1,36 @@
using EnvelopeGenerator.Common;
namespace EnvelopeGenerator.Application.Envelopes.Queries.Read;
/// <summary>
/// Repräsentiert die Antwort für das Lesen eines Umschlags.
/// </summary>
/// <param name="Id">Die eindeutige Kennung des Umschlags.</param>
/// <param name="UserId">Die Kennung des Benutzers, der den Umschlag erstellt hat.</param>
/// <param name="Status">Der Status des Umschlags als numerischer Wert.</param>
/// <param name="Uuid">Die universelle eindeutige Kennung (UUID) des Umschlags.</param>
/// <param name="Message">Eine optionale Nachricht, die mit dem Umschlag verknüpft ist.</param>
/// <param name="AddedWhen">Das Datum und die Uhrzeit, wann der Umschlag hinzugefügt wurde.</param>
/// <param name="ChangedWhen">Das Datum und die Uhrzeit, wann der Umschlag zuletzt geändert wurde (falls vorhanden).</param>
/// <param name="Title">Ein optionaler Titel des Umschlags.</param>
/// <param name="Language">Die Sprache, die mit dem Umschlag verknüpft ist.</param>
/// <param name="TFAEnabled">Gibt an, ob die Zwei-Faktor-Authentifizierung (TFA) aktiviert ist.</param>
/// <param name="User">Das Benutzerobjekt, das mit dem Umschlag verknüpft ist.</param>
public record ReadEnvelopeResponse(
int Id,
int UserId,
int Status,
string Uuid,
string? Message,
DateTime AddedWhen,
DateTime? ChangedWhen,
string? Title,
string Language,
bool TFAEnabled,
DigitalData.UserManager.Domain.Entities.User User)
{
/// <summary>
/// Gibt den Namen des Status zurück, der dem numerischen Statuswert entspricht.
/// </summary>
public string StatusName => ((Constants.EnvelopeStatus)Status).ToString();
}

View File

@@ -0,0 +1,13 @@
using EnvelopeGenerator.Application.Receivers.Queries.Read;
namespace EnvelopeGenerator.Application.Envelopes.Queries.ReceiverName;
/// <summary>
/// Eine Abfrage, um die zuletzt verwendete Anrede eines Empfängers zu ermitteln,
/// damit diese für zukünftige Umschläge wiederverwendet werden kann.
/// </summary>
/// <param name="Envelope">Der Umschlag, für den die Anrede des Empfängers ermittelt werden soll.</param>
/// <param name="OnlyLast">Gibt an, ob nur die zuletzt verwendete Anrede zurückgegeben werden soll.</param>
public record ReadReceiverNameQuery(EnvelopeQuery? Envelope = null, bool OnlyLast = true) : ReadReceiverQuery
{
}

View File

@@ -0,0 +1,20 @@
using EnvelopeGenerator.Application.Envelopes.Queries.Read;
using EnvelopeGenerator.Application.Receivers.Queries.Read;
using EnvelopeGenerator.Common;
namespace EnvelopeGenerator.Application.Histories.Queries.Read;
/// <summary>
/// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags.
/// </summary>
/// <param name="EnvelopeId">Die eindeutige Kennung des Umschlags.</param>
/// <param name="Envelope">Die Abfrage, die den Umschlag beschreibt.</param>
/// <param name="Receiver">Die Abfrage, die den Empfänger beschreibt.</param>
/// <param name="Related">Abfrage, die angibt, worauf sich der Datensatz bezieht. Ob er sich auf den Empfänger, den Sender oder das System bezieht, wird durch 0, 1 bzw. 2 dargestellt.</param>
/// <param name="OnlyLast">Abfrage zur Steuerung, ob nur der aktuelle Status oder der gesamte Datensatz zurückgegeben wird.</param>
public record ReadHistoryQuery(
int EnvelopeId,
ReadEnvelopeQuery? Envelope = null,
ReadReceiverQuery? Receiver = null,
Constants.ReferenceType? Related = null,
bool? OnlyLast = true);

View File

@@ -1,64 +0,0 @@
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,10 @@
namespace EnvelopeGenerator.Application.Receivers.Queries.Read;
/// <summary>
/// Stellt eine Abfrage dar, um die Details eines Empfängers zu lesen.
/// Diese Abfrage erbt von <see cref="ReceiverQuery"/> und wird verwendet,
/// um spezifische Informationen über einen Empfänger abzurufen.
/// </summary>
public record ReadReceiverQuery : ReceiverQuery
{
}

View File

@@ -0,0 +1,12 @@
namespace EnvelopeGenerator.Application.Receivers.Queries.Read;
/// <summary>
/// Repräsentiert die Antwort auf eine Abfrage, um einen Empfänger zu lesen.
/// </summary>
/// <param name="Id">Die eindeutige Identifikationsnummer des Empfängers.</param>
/// <param name="EmailAddress">Die E-Mail-Adresse des Empfängers.</param>
/// <param name="AddedWhen">Das Datum und die Uhrzeit, wann der Empfänger hinzugefügt wurde.</param>
/// <param name="Signature">Die Signatur des Empfängers.</param>
public record ReadReceiverResponse(int Id, string EmailAddress, DateTime AddedWhen, string Signature)
{
}

View File

@@ -0,0 +1,9 @@
namespace EnvelopeGenerator.Application.Receivers;
/// <summary>
/// Empfänger des Umschlags
/// </summary>
/// <param name="Id">ID des Empfängers</param>
/// <param name="EmailAddress">E-Mail Adresse des Empfängers</param>
/// <param name="Signature">Eindeutige Signatur des Empfängers</param>
public record ReceiverQuery(int? Id = null, string? EmailAddress = null, string? Signature = null);

View File

@@ -10,7 +10,7 @@ using EnvelopeGenerator.Application.Contracts.Services;
namespace EnvelopeGenerator.Application.Services;
public class EnvelopeHistoryService : CRUDService<IEnvelopeHistoryRepository, EnvelopeHistoryCreateDto, EnvelopeHistoryDto, EnvelopeHistoryDto, EnvelopeHistory, long>, IEnvelopeHistoryService
public class EnvelopeHistoryService : CRUDService<IEnvelopeHistoryRepository, EnvelopeHistoryCreateDto, EnvelopeHistoryDto, EnvelopeHistory, long>, IEnvelopeHistoryService
{
public EnvelopeHistoryService(IEnvelopeHistoryRepository repository, IMapper mapper)
: base(repository, mapper)

View File

@@ -7,7 +7,7 @@ using EnvelopeGenerator.Application.Contracts.Repositories;
namespace EnvelopeGenerator.Application.Services;
public class EnvelopeReceiverReadOnlyService : CRUDService<IEnvelopeReceiverReadOnlyRepository, EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnlyDto, EnvelopeReceiverReadOnlyUpdateDto, EnvelopeReceiverReadOnly, long>, IEnvelopeReceiverReadOnlyService
public class EnvelopeReceiverReadOnlyService : CRUDService<IEnvelopeReceiverReadOnlyRepository, EnvelopeReceiverReadOnlyCreateDto, EnvelopeReceiverReadOnlyDto, EnvelopeReceiverReadOnly, long>, IEnvelopeReceiverReadOnlyService
{
public EnvelopeReceiverReadOnlyService(IEnvelopeReceiverReadOnlyRepository repository, IMapper mapper) : base(repository, mapper)
{

View File

@@ -10,7 +10,7 @@ using EnvelopeGenerator.Application.Contracts.Services;
namespace EnvelopeGenerator.Application.Services;
public class ReceiverService : CRUDService<IReceiverRepository, ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>, IReceiverService
public class ReceiverService : CRUDService<IReceiverRepository, ReceiverCreateDto, ReceiverReadDto, Receiver, int>, IReceiverService
{
public ReceiverService(IReceiverRepository repository, IMapper mapper)
: base(repository, mapper)

View File

@@ -4,6 +4,7 @@ Imports GdPicture14
Imports Newtonsoft.Json.Linq
Imports EnvelopeGenerator.Common.Jobs
Imports System.IO
Imports EnvelopeGenerator.Common.Jobs.FinalizeDocument
Public Class frmFinalizePDF
Private Const CONNECTIONSTRING = "Server=sDD-VMP04-SQL17\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=+bk8oAbbQP1AzoHtvZUbd+Mbok2f8Fl4miEx1qssJ5yEaEWoQJ9prg4L14fURpPnqi1WMNs9fE4=;"
@@ -15,14 +16,14 @@ Public Class frmFinalizePDF
Private Manager As AnnotationManager
Private PDFBurner As FinalizeDocument.PDFBurner
Private pGDPictureLicenseKey As String = "kG1Qf9PwmqgR8aDmIW2zI_ebj48RzqAJegRxcystEmkbTGQqfkNBdFOXIb6C_A00Ra8zZkrHdfjqzOPXK7kgkF2YDhvrqKfqh4WDug2vOt0qO31IommzkANSuLjZ4zmraoubyEVd25rE3veQ2h_j7tGIoH_LyIHmy24GaXsxdG0yCzIBMdiLbMMMDwcPY-809KeZ83Grv76OVhFvcbBWyYc251vou1N-kGg5_ZlHDgfWoY85gTLRxafjD3KS_i9ARW4BMiy36y8n7UP2jN8kGRnW_04ubpFtfjJqvtsrP_J9D0x7bqV8xtVtT5JI6dpKsVTiMgDCrIcoFSo5gCC1fw9oUopX4TDCkBQttO4-WHBlOeq9dG5Yb0otonVmJKaQA2tP6sMR-lZDs3ql_WI9t91yPWgpssrJUxSHDd27_LMTH_owJIqkF3NOJd9mYQuAv22oNKFYbH8e41pVKb8cT33Y9CgcQ_sy6YDA5PTuIRi67mjKge_nD9rd0IN213Ir9M_EFWqg9e4haWzIdHXQUo0md70kVhPX4UIH_BKJnxEEnFfoFRNMh77bB0N4jkcBEHPl-ghOERv8dOztf4vCnNpzzWvcLD2cqWIm6THy8XGGq9h4hp8aEreRleSMwv9QQAC7mjLwhQ1rBYkpUHlpTjhTLnMwHknl6HH0Z6zzmsgkRKVyfquv94Pd7QbQfZrRka0ss_48pf9p8hAywEn81Q=="
Private ReadOnly _ignoredLabels As New List(Of String) From {"Date", "Datum", "ZIP", "PLZ", "Place", "Ort", "Position", "Stellung"}
Private ReadOnly _pdfBurnerParams As New PDFBurnerParams()
Private Sub frmFinalizePDF_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LogConfig = New LogConfig(LogConfig.PathType.CustomPath, Application.StartupPath)
Database = New MSSQLServer(LogConfig, MSSQLServer.DecryptConnectionString(CONNECTIONSTRING))
PDFBurner = New FinalizeDocument.PDFBurner(LogConfig, pGDPictureLicenseKey, _ignoredLabels)
PDFBurner = New FinalizeDocument.PDFBurner(LogConfig, pGDPictureLicenseKey, _pdfBurnerParams)
Viewer = New GdViewer()
Manager = New AnnotationManager()
@@ -77,6 +78,8 @@ Public Class frmFinalizePDF
Dim oNewPath = Path.Combine(desktopPath, $"E{txtEnvelope.Text}R{txtReceiver.Text}.burned.pdf")
File.WriteAllBytes(oNewPath, oNewBuffer)
Process.Start(oNewPath)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try

View File

@@ -13,6 +13,8 @@
EnvelopeReportCreated = 1007
EnvelopeArchived = 1008
EnvelopeDeleted = 1009
EnvelopeRejected = 10007
EnvelopeWithdrawn = 10009
AccessCodeRequested = 2001
AccessCodeCorrect = 2002
AccessCodeIncorrect = 2003
@@ -28,11 +30,12 @@
MessageConfirmationSent = 3003
MessageDeletionSent = 3004
MessageCompletionSent = 3005
DocumentMod_Rotation = 4001
End Enum
'TODO: standardize in xwiki
Public Enum ReferenceType
Receiver
Receiver = 0
Sender
System
Unknown
@@ -94,13 +97,16 @@
End Enum
Public Enum EmailTemplateType
DocumentReceived
DocumentReceived = 0
DocumentSigned
DocumentDeleted
DocumentCompleted
DocumentAccessCodeReceived
DocumentShared
TotpSecret
DocumentRejected_ADM
DocumentRejected_REC
DocumentRejected_REC_2
End Enum
Public Enum EncodeType
@@ -124,7 +130,7 @@
Public Const DATABASE = "DATABASE"
Public Const LOGCONFIG = "LOGCONFIG"
Public Const GDPICTURE = "GDPICTURE"
Public Const IGNORED_LABELS = "IgnoredLabels"
Public Const PDF_BURNER_PARAMS = "PDFBurnerParams"
Public Const GREEN_300 = "#bbf7d0"
Public Const RED_300 = "#fecaca"

View File

@@ -19,6 +19,7 @@ Public Class EmailData
Public Property EmailAttachment As String = ""
Public Property ATT1_RELATED_ID As Long
Public Property ATT1_REL_TYPE As String = ""
Public Property ADDED_WHO_PROCESS As String = "DDEnvelopGenerator"
''' <summary>
''' Constructor for sending email to receiver
@@ -31,7 +32,7 @@ Public Class EmailData
EmailSubject = String.Empty
EmailType = pStatus
Message = pEnvelope.Message
Message = TextToHtml(pEnvelope.Message)
ReferenceID = pEnvelope.Id
ReferenceString = pEnvelope.Uuid
ReceiverName = pReceiver.Name
@@ -40,6 +41,22 @@ Public Class EmailData
SenderName = pEnvelope.User.FullName
EnvelopeTitle = pEnvelope.Title
End Sub
Public Function TextToHtml(input As String) As String
If String.IsNullOrEmpty(input) Then Return ""
' HTML-Encodierung der Sonderzeichen
Dim encoded As String = System.Net.WebUtility.HtmlEncode(input)
' Tabs in &nbsp; umwandeln (z.B. 4 non-breaking spaces)
encoded = encoded.Replace(vbTab, "&nbsp;&nbsp;&nbsp;&nbsp;")
' Zeilenumbrüche in <br /> umwandeln
encoded = encoded.Replace(vbCrLf, "<br />") ' Windows
encoded = encoded.Replace(vbCr, "<br />") ' Mac alt
encoded = encoded.Replace(vbLf, "<br />") ' Unix/Linux
Return encoded
End Function
''' <summary>
''' Constructor for sending email to creator

View File

@@ -25,6 +25,7 @@
Public Property Message As String = My.Resources.Envelope.Please_read_and_sign_this_document
Public Property AddedWhen As Date
Public Property ChangedWhen As Date
Public Property User As New User()
Public Property Documents As New List(Of EnvelopeDocument)
@@ -32,6 +33,7 @@
Public Property History As New List(Of EnvelopeHistoryEntry)
Public Property EnvelopeType As EnvelopeType
Public Property DOC_RESULT As Byte()
Public Property CURRENT_WORK_APP As String = "signFLOW GUI"
Public ReadOnly Property EnvelopeTypeTitle As String
Get
Return EnvelopeType?.Title

View File

@@ -8,6 +8,7 @@
Public Property HasAccess As Boolean
Public Property IsAdmin As Boolean
Public Property GhostModeActive As Boolean
Public ReadOnly Property FullName() As String
Get

View File

@@ -281,6 +281,8 @@
<Compile Include="Entities\ElementStatus.vb" />
<Compile Include="Entities\EmailData.vb" />
<Compile Include="Entities\EmailTemplate.vb" />
<Compile Include="Jobs\APIBackendJobs\APIEnvelopeJob.vb" />
<Compile Include="Jobs\FinalizeDocument\PDFBurnerParams.vb" />
<Compile Include="Services\TemplateService.vb" />
<Compile Include="Entities\Envelope.vb" />
<Compile Include="Entities\EnvelopeDocument.vb" />

View File

@@ -52,6 +52,7 @@ Public Class Helpers
End Function
Public Shared Function GetEnvelopeURL(pHost As String, pEnvelopeUuid As String, pReceiverSignature As String) As String
Dim oEnvelopeUserReference As String = EncodeEnvelopeReceiverId(pEnvelopeUuid, pReceiverSignature)
Dim oURL As String = String.Format("{0}/EnvelopeKey/{1}", pHost.Trim(), oEnvelopeUserReference)
Return oURL

View File

@@ -0,0 +1,221 @@
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Base
Imports GdPicture14
Imports Quartz
Imports System.Security.Cryptography
Imports System.IO
Imports EnvelopeGenerator.Common.Jobs.FinalizeDocument.FinalizeDocumentExceptions
Imports EnvelopeGenerator.Common.Jobs.FinalizeDocument
Imports EnvelopeGenerator.Common.Constants
Imports DevExpress.DataProcessing
Imports System.Data.SqlClient
Imports DevExpress.XtraRichEdit.Layout.Engine
Namespace Jobs
Public Class APIEnvelopeJob
Implements IJob
Private LogConfig As LogConfig
Private Logger As Logger
Private Database As MSSQLServer
Private Config As DbConfig
Private ConfigModel As ConfigModel
Private EnvelopeModel As EnvelopeModel
Private ReceiverModel As ReceiverModel
Private ActionService As ActionService
Private ReadOnly CompleteWaitTime As Integer = 1
Private myTempFiles As TempFiles
Private Class EnvelopeData
Public EnvelopeId As Integer
Public EnvelopeUUID As String
Public DocumentPath As String
End Class
Public Function Execute(pContext As IJobExecutionContext) As Task Implements IJob.Execute
LogConfig = pContext.MergedJobDataMap.Item(Constants.LOGCONFIG)
Logger = LogConfig.GetLogger()
myTempFiles = New TempFiles(LogConfig)
myTempFiles.Create()
Dim JobId = pContext.JobDetail.Key
Logger.Debug("API Envelopes - Starting job {0}", JobId)
Try
Logger.Debug("API Envelopes - Loading Database..")
Database = GetDatabase(pContext, LogConfig)
Logger.Debug("API Envelopes - Loading Models & Services")
Dim oState = GetState()
InitializeModels(oState)
Logger.Debug("API Envelopes - Loading Configuration..")
Config = ConfigModel.LoadConfiguration()
oState.DbConfig = Config
InitializeServices(oState)
Config.DocumentPath = Config.DocumentPath
Logger.Debug("API Envelopes - ExportPath: [{0}]", Config.ExportPath)
Dim oSql = $"SELECT * FROM TBSIG_ENVELOPE where SOURCE = 'API' AND STATUS = 1003 order by guid"
Dim oDTEnv_invitations = Database.GetDatatable(oSql)
Dim oEnvelopeIds As List(Of Integer) = oDTEnv_invitations.Rows.Cast(Of DataRow).
Select(Function(r) r.Item("GUID")).
Cast(Of Integer).
ToList()
If oEnvelopeIds.Count > 0 Then
Logger.Info("SendInvMail - Found [{0}] envelopes.", oEnvelopeIds.Count)
End If
Dim oTotal As Integer = oEnvelopeIds.Count
Dim oCurrent As Integer = 1
For Each oId In oEnvelopeIds
Logger.Info("SendInvMail - Gathering Info for Envelope [{0}] ({1}/{2})", oId, oCurrent, oTotal)
Try
Dim oEnvelope = EnvelopeModel.GetById(oId)
If oEnvelope Is Nothing Then
Logger.Warn("SendInvMail - Envelope could not be loaded for Id [{0}]!", oId)
Throw New ArgumentNullException("EnvelopeData")
End If
oEnvelope.CURRENT_WORK_APP = "signFLOW_API_EnvJob_InvMail"
Logger.Debug("SendInvMail - Loading Envelope Data..")
Dim oEnvelopeData = GetEnvelopeData(oId)
oEnvelope.Receivers = ReceiverModel.ListEnvelopeReceivers(oEnvelope.Id).ToList()
Logger.Debug("SendInvMail - Created Reveivers!")
If oEnvelopeData Is Nothing Then
Logger.Warn("SendInvMail - EnvelopeData could not be loaded for Id [{0}]!", oId)
Throw New ArgumentNullException("EnvelopeData")
End If
Logger.Info("SendInvMail - Sending InvitationMails for Envelope [{0}]", oId)
If ActionService.SendEnvelope(oEnvelope) = False Then
Logger.Warn("SendInvMail - Could not send the InvitationMails for Envelope [{0}]", oId)
Throw New ArgumentNullException("EnvelopeData")
End If
Catch ex As Exception
Logger.Warn(ex, $"SendInvMail - Unhandled exception while working envelope [{oId}]")
End Try
oCurrent += 1
Logger.Info("SendInvMail - Envelope finalized!")
Next
'Hier nun der Teil um zurückgezogene Envelopes abzuarbeiten
oSql = $"SELECT ENV.GUID,REJ.COMMENT REJECTION_REASON FROM
(SELECT * FROM TBSIG_ENVELOPE where STATUS = 1009 AND SOURCE = 'API') ENV INNER JOIN
(SELECT MAX(GUID) GUID,ENVELOPE_ID,MAX(ADDED_WHEN) ADDED_WHEN,MAX(ACTION_DATE) ACTION_DATE, COMMENT FROM TBSIG_ENVELOPE_HISTORY where STATUS = 1009 GROUP BY ENVELOPE_ID,COMMENT ) REJ ON ENV.GUID = REJ.ENVELOPE_ID LEFT JOIN
(SELECT * FROM TBSIG_ENVELOPE_HISTORY where STATUS = 3004 ) M_Send ON ENV.GUID = M_Send.ENVELOPE_ID
where M_Send.GUID IS NULL"
Dim oDT_EnvWithdrawn = Database.GetDatatable(oSql)
oEnvelopeIds = oDTEnv_invitations.Rows.Cast(Of DataRow).
Select(Function(r) r.Item("GUID")).
Cast(Of Integer).
ToList()
If oEnvelopeIds.Count > 0 Then
Logger.Info("WithdrawnEnv - Found [{0}] envelopes.", oEnvelopeIds.Count)
End If
oTotal = oEnvelopeIds.Count
oCurrent = 1
Dim oEnvID As Integer
For Each oRow As DataRow In oDT_EnvWithdrawn.Rows
oEnvID = oRow.Item("GUID")
Dim oReason = oRow.Item("REJECTION_REASON")
Logger.Info("WithdrawnEnv - Gathering Info for Envelope [{0}] ({1}/{2})", oEnvID, oCurrent, oTotal)
Try
Dim oEnvelope = EnvelopeModel.GetById(oEnvID)
If oEnvelope Is Nothing Then
Logger.Warn("WithdrawnEnv - Envelope could not be loaded for Id [{0}]!", oEnvID)
Throw New ArgumentNullException("EnvelopeData")
End If
oEnvelope.CURRENT_WORK_APP = "signFLOW_API_EnvJob_Withdrawn"
oEnvelope.Receivers = ReceiverModel.ListEnvelopeReceivers(oEnvelope.Id).ToList()
Logger.Debug("WithdrawnEnv - Sending Withdrawn Mails..")
If ActionService.API_SendWithdrawn_Mails(oEnvelope, oReason) = False Then
Logger.Warn("Could not send the Mails for withdrawn Envelope")
Else
Dim oStatInsert = $"INSERT INTO TBSIG_ENVELOPE_HISTORY (ENVELOPE_ID,STATUS,USER_REFERENCE,ADDED_WHEN,ACTION_DATE) VALUES ('{oEnvelope.Id}',3004,'API',GETDATE(),GETDATE())"
Database.ExecuteNonQuery(oStatInsert)
End If
Catch ex As Exception
Logger.Warn(ex, $"WithdrawnEnv - Unhandled exception while working envelope [{oEnvID}]")
End Try
oCurrent += 1
Logger.Info("WithdrawnEnv - Envelope finalized!")
Next
Logger.Debug("API Envelopes - Completed job {0} successfully!", JobId)
Catch ex As Exception
Logger.Warn("API Envelopes job failed!")
Logger.Error(ex)
Finally
Logger.Debug("API Envelopes execution for [{0}] ended", JobId)
End Try
Return Task.FromResult(True)
End Function
Private Sub InitializeModels(pState As State)
ConfigModel = New ConfigModel(pState)
EnvelopeModel = New EnvelopeModel(pState)
ReceiverModel = New ReceiverModel(pState)
End Sub
Private Sub InitializeServices(pState As State)
ActionService = New ActionService(pState, Database)
End Sub
Private Function GetDatabase(pContext As IJobExecutionContext, pLogConfig As LogConfig) As MSSQLServer
Dim oConnectionString As String = pContext.MergedJobDataMap.Item(Constants.DATABASE)
Dim Database = New MSSQLServer(pLogConfig, MSSQLServer.DecryptConnectionString(oConnectionString))
Return Database
End Function
Private Function GetEnvelopeData(pEnvelopeId As Integer) As EnvelopeData
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)
Dim oRow As DataRow = oTable.Rows.Cast(Of DataRow).SingleOrDefault()
If oRow Is Nothing Then
Return Nothing
End If
Dim oData As New EnvelopeData With {
.EnvelopeId = pEnvelopeId,
.DocumentPath = oRow.ItemEx("FILEPATH", ""),
.EnvelopeUUID = oRow.ItemEx("ENVELOPE_UUID", "")
}
Logger.Debug("Document path: [{0}]", oData.DocumentPath)
Return oData
End Function
Private Function GetState() As State
Return New State With {
.LogConfig = LogConfig,
.Database = Database,
.UserId = 0,
.Config = Nothing,
.DbConfig = Nothing
}
End Function
End Class
End Namespace

View File

@@ -53,7 +53,7 @@ Namespace Jobs
myTempFiles = New TempFiles(LogConfig)
myTempFiles.Create()
Dim JobId = pContext.JobDetail.Key
Logger.Info("Starting job {0}", JobId)
Logger.Debug("Starting job {0}", JobId)
Try
Logger.Debug("Loading GdViewer..")
@@ -74,8 +74,8 @@ Namespace Jobs
InitializeServices(oState)
Logger.Debug("Loading PDFBurner..")
Dim ignoredLabels As List(Of String) = pContext.MergedJobDataMap.Item(Constants.IGNORED_LABELS)
PDFBurner = New PDFBurner(LogConfig, oGdPictureKey, ignoredLabels)
Dim pdfBurnerParams As PDFBurnerParams = pContext.MergedJobDataMap.Item(Constants.PDF_BURNER_PARAMS)
PDFBurner = New PDFBurner(LogConfig, oGdPictureKey, pdfBurnerParams)
Logger.Debug("Loading PDFMerger..")
PDFMerger = New PDFMerger(LogConfig, oGdPictureKey)
@@ -108,7 +108,6 @@ Namespace Jobs
For Each oId In oEnvelopeIds
Logger.Info("Finalizing Envelope [{0}] ({1}/{2})", oId, oCurrent, oTotal)
Logger.Debug("Loading Envelope..")
Try
Dim oEnvelope = EnvelopeModel.GetById(oId)
If oEnvelope Is Nothing Then
@@ -147,7 +146,7 @@ Namespace Jobs
Directory.CreateDirectory(oOutputDirectoryPath)
End If
Dim oOutputFilePath = Path.Combine(oOutputDirectoryPath, $"{oEnvelope.Uuid}.pdf")
Logger.Info("Writing finalized Pdf to disk..")
Logger.Debug("Writing finalized Pdf to disk..")
Logger.Info("Output path is [{0}]", oOutputFilePath)
Try
@@ -157,12 +156,14 @@ Namespace Jobs
Throw New ExportDocumentException("Could not export final document to disk!", ex)
End Try
Logger.Info("Writing EB-bytes to database...")
Logger.Debug("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!")
Else
Logger.Info("Report-mails successfully sent!")
End If
Logger.Debug("Setting envelope status..")
If ActionService.FinalizeEnvelope(oEnvelope) = False Then
@@ -170,12 +171,12 @@ Namespace Jobs
Throw New ApplicationException("Envelope could not be finalized")
End If
Catch ex As Exception
Logger.Warn($"Unhandled exception while working envelope [{oId}] - [{ex.Message}]")
Logger.Warn(ex, $"Unhandled exception while working envelope [{oId}]")
End Try
oCurrent += 1
Logger.Info("Envelope finalized!")
Logger.Info($"Envelope [{oId}] finalized!")
Next
@@ -192,7 +193,7 @@ Namespace Jobs
Logger.Warn("Certificate Document job failed!")
Logger.Error(ex)
Finally
Logger.Info("Job execution for [{0}] ended", JobId)
Logger.Debug("Job execution for [{0}] ended", JobId)
End Try
Return Task.FromResult(True)
@@ -290,11 +291,15 @@ Namespace Jobs
If oMailToCreator <> FinalEmailType.No Then
Logger.Debug("Sending email to creator ...")
SendFinalEmailToCreator(pEnvelope) ', pAttachment
Else
Logger.Warn($"No SendFinalEmailToCreator - oMailToCreator [{oMailToCreator}] <> [{FinalEmailType.No}] ")
End If
If oMailToReceivers <> FinalEmailType.No Then
Logger.Debug("Sending emails to receivers..")
SendFinalEmailToReceivers(pEnvelope) ', pAttachment
Else
Logger.Warn($"No SendFinalEmailToReceivers - oMailToCreator [{oMailToReceivers}] <> [{FinalEmailType.No}] ")
End If
Return True
@@ -355,9 +360,9 @@ Namespace Jobs
oInputPath = pEnvelopeData.DocumentPath
Logger.Info($"Input path: [{oInputPath}]")
Else
Logger.Info($"we got bytes..")
Logger.Debug($"we got bytes..")
oInputPath = Config.DocumentPathOrigin
Logger.Info($"oInputPath: {Config.DocumentPathOrigin}")
Logger.Debug($"oInputPath: {Config.DocumentPathOrigin}")
End If
@@ -378,12 +383,10 @@ Namespace Jobs
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
@@ -423,7 +426,7 @@ Namespace Jobs
End Function
Private Sub InitializeServices(pState As State)
ActionService = New ActionService(pState)
ActionService = New ActionService(pState, Database)
End Sub
Private Sub InitializeModels(pState As State)

View File

@@ -16,9 +16,9 @@ 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)
Private Property _pdfBurnerParams As PDFBurnerParams
Public Sub New(pLogConfig As LogConfig, pGDPictureLicenseKey As String, ignoredLabels As List(Of String))
Public Sub New(pLogConfig As LogConfig, pGDPictureLicenseKey As String, pdfBurnerParams As PDFBurnerParams)
MyBase.New(pLogConfig)
LicenseManager = New LicenseManager()
@@ -26,56 +26,50 @@ Namespace Jobs.FinalizeDocument
Manager = New AnnotationManager()
_ignoredLabels = ignoredLabels
_pdfBurnerParams = pdfBurnerParams
End Sub
Public Function BurnInstantJSONAnnotationsToPDF(pSourceBuffer As Byte(), pInstantJSONList As List(Of String)) As Byte()
Dim oResult As GdPictureStatus
Using oSourceStream As New MemoryStream(pSourceBuffer)
' Open PDF
oResult = Manager.InitFromStream(oSourceStream)
If oResult <> GdPictureStatus.OK Then
Throw New BurnAnnotationException($"Could not open document for burning: [{oResult}]")
End If
Try
Using oSourceStream As New MemoryStream(pSourceBuffer)
' Open PDF
oResult = Manager.InitFromStream(oSourceStream)
' Add annotation to PDF
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}]")
End If
'Save PDF
Using oNewStream As New MemoryStream()
oResult = Manager.SaveDocumentToPDF(oNewStream)
If oResult <> GdPictureStatus.OK Then
Throw New BurnAnnotationException($"Could not open document for burning: [{oResult}]")
Throw New BurnAnnotationException($"Could not save document to stream: [{oResult}]")
End If
' Add annotation to PDF
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}]")
End If
Manager.Close()
'Save PDF
Using oNewStream As New MemoryStream()
oResult = Manager.SaveDocumentToPDF(oNewStream)
If oResult <> GdPictureStatus.OK Then
Throw New BurnAnnotationException($"Could not save document to stream: [{oResult}]")
End If
Manager.Close()
Return oNewStream.ToArray()
End Using
Return oNewStream.ToArray()
End Using
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Using
End Function
Private Function AddInstantJSONAnnotationToPDF(pInstantJSON As String) As Boolean
Try
Dim oAnnotationData = JsonConvert.DeserializeObject(Of AnnotationData)(pInstantJSON)
oAnnotationData.annotations.Reverse()
Dim formFieldIndex = 0
For Each oAnnotation In oAnnotationData.annotations
Logger.Debug("Adding AnnotationID: " + oAnnotation.id)
Select Case oAnnotation.type
@@ -88,10 +82,12 @@ Namespace Jobs.FinalizeDocument
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)
If formFieldValue IsNot Nothing AndAlso Not _pdfBurnerParams.IgnoredLabels.Contains(formFieldValue.value) Then
AddFormFieldValue(oAnnotation, formFieldValue, formFieldIndex)
formFieldIndex += 1
End If
End Select
Next
Return True
@@ -151,13 +147,13 @@ Namespace Jobs.FinalizeDocument
End Function
Private Function AddFormFieldValue(pAnnotation As Annotation, formFieldValue As FormFieldValue) As Boolean
Private Function AddFormFieldValue(pAnnotation As Annotation, formFieldValue As FormFieldValue, index As Integer) 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 oY = oBounds.Item(1) + _pdfBurnerParams.YOffset * index + _pdfBurnerParams.TopMargin
Dim oWidth = oBounds.Item(2)
Dim oHeight = oBounds.Item(3)
@@ -166,9 +162,9 @@ Namespace Jobs.FinalizeDocument
Dim ant = Manager.AddTextAnnot(oX, oY, oWidth, oHeight, formFieldValue.value)
' Set the font properties
ant.FontName = "Arial"
ant.FontSize = 8
ant.FontStyle = FontStyle.Italic
ant.FontName = _pdfBurnerParams.FontName
ant.FontSize = _pdfBurnerParams.FontSize
ant.FontStyle = _pdfBurnerParams.FontStyle
Manager.SaveAnnotationsToPage()
Return True
Catch ex As Exception

View File

@@ -0,0 +1,16 @@
Imports System.Drawing
Namespace Jobs.FinalizeDocument
Public Class PDFBurnerParams
Public Property IgnoredLabels As New List(Of String) From {"Date", "Datum", "ZIP", "PLZ", "Place", "Ort", "Position", "Stellung"}
Public Property TopMargin As Double = 0.1
Public Property YOffset As Double = -0.3
Public Property FontName As String = "Arial"
Public Property FontSize As Integer = 8
Public Property FontStyle As FontStyle = FontStyle.Italic
End Class
End Namespace

View File

@@ -18,7 +18,7 @@ Public Class EmailModel
oCommand.Parameters.Add("EMAIL_ADRESS", SqlDbType.NVarChar).Value = pEmail.EmailAdress
oCommand.Parameters.Add("EMAIL_SUBJ", SqlDbType.NVarChar).Value = pEmail.EmailSubject
oCommand.Parameters.Add("EMAIL_BODY", SqlDbType.NVarChar).Value = pEmail.EmailBody
oCommand.Parameters.Add("ADDED_WHO", SqlDbType.NVarChar).Value = "DDEnvelopGenerator"
oCommand.Parameters.Add("ADDED_WHO", SqlDbType.NVarChar).Value = pEmail.ADDED_WHO_PROCESS
oCommand.Parameters.Add("SENDING_PROFILE", SqlDbType.Int).Value = State.DbConfig.SendingProfile
oCommand.Parameters.Add("REFERENCE_ID", SqlDbType.Int).Value = pEmail.ReferenceID
oCommand.Parameters.Add("REFERENCE_STRING", SqlDbType.NVarChar).Value = pEmail.ReferenceString

View File

@@ -35,6 +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"),
.ChangedWhen = pRow.ItemEx(Of Date)("CHANGED_WHEN", Nothing),
.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),

View File

@@ -57,7 +57,8 @@ Public Class ReceiverModel
Public Function Insert(pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean
Try
Dim oCheck = $"SELECT COUNT(GUID) FROM [dbo].[TBSIG_RECEIVER] WHERE SIGNATURE = '{pReceiver.GetSignature()}'"
Dim oSignature As String = pReceiver.GetSignature()
Dim oCheck = $"SELECT COUNT(GUID) FROM [dbo].[TBSIG_RECEIVER] WHERE SIGNATURE = '{oSignature}'"
Dim oExists = Database.GetScalarValue(oCheck)
If oExists = 0 Then
@@ -77,7 +78,7 @@ Public Class ReceiverModel
Return False
End If
Else
Logger.Warn($"Receiver [{pReceiver.Email}] already existing! Check collecting not existing Receivers!")
Logger.Warn($"Receiver [{pReceiver.Email}] already existing! SignatureID: {oSignature} Check SQL {oCheck}")
Return True
End If
Catch ex As Exception

View File

@@ -33,10 +33,10 @@ Public Class UserModel
Dim oRow = oTable.Rows.Item(0)
Dim oHasAccess = oRow.ItemEx("MODULE_ACCESS", False)
Dim oIsAdmin = oRow.ItemEx("IS_ADMIN", False)
Dim oGhostmode = oRow.ItemEx("GHOST_MODE_OVERRIDE", False)
pUser.HasAccess = oHasAccess
pUser.IsAdmin = oIsAdmin
pUser.GhostModeActive = oGhostmode
Return pUser
Catch ex As Exception
Logger.Error(ex)
@@ -70,9 +70,9 @@ Public Class UserModel
End Try
End Function
Public Function SelectUserId() As Integer
Public Function SelectUserId(oUserName As String) As Integer
Try
Dim oUserId As Integer = Database.GetScalarValue($"SELECT GUID FROM TBDD_USER WHERE USERNAME = '{Environment.UserName}'")
Dim oUserId As Integer = Database.GetScalarValue($"SELECT GUID FROM TBDD_USER WHERE USERNAME = '{oUserName}'")
Return oUserId
Catch ex As Exception

View File

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

View File

@@ -1,19 +1,25 @@
Imports DevExpress.DataAccess.Native.Web
Imports DigitalData.Modules.Base
Imports EnvelopeGenerator.Common.Constants
Imports EnvelopeGenerator.Common.My.Resources
Imports DigitalData.Modules.Database
Imports System.ComponentModel
Public Class ActionService
Inherits BaseService
Private ReadOnly EmailService As EmailService
Private ReadOnly HistoryService As HistoryService
Private ReadOnly ReceiverModel As ReceiverModel
Private myDatabase As MSSQLServer
Public Sub New(pState As State)
Public Sub New(pState As State, pDD_ECM As MSSQLServer)
MyBase.New(pState)
myDatabase = pDD_ECM
EmailService = New EmailService(pState)
HistoryService = New HistoryService(pState)
ReceiverModel = New ReceiverModel(pState)
@@ -34,6 +40,12 @@ Public Class ActionService
Return True
End Function
Public Function SetStatusDocumentRotationChanged(pEnvelope As Envelope) As Boolean
If HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.DocumentMod_Rotation, pEnvelope.User.Email) = False Then
Return False
End If
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
@@ -50,7 +62,15 @@ Public Class ActionService
Public Function DeleteEnvelope(pEnvelope As Envelope, pReason As String) As Boolean
If HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.EnvelopeDeleted, pEnvelope.User.Email) = False Then
Dim oStatus As EnvelopeStatus
If pEnvelope.IsAlreadySent Then
oStatus = Constants.EnvelopeStatus.EnvelopeWithdrawn
Else
oStatus = Constants.EnvelopeStatus.EnvelopeDeleted
End If
Dim oUpd = $"UPDATE TBSIG_ENVELOPE SET REJECTION_REASON = '{pReason}' WHERE GUID = {pEnvelope.Id}"
myDatabase.ExecuteNonQuery(oUpd)
If HistoryService.SetEnvelopeStatus(pEnvelope, oStatus, pEnvelope.User.Email) = False Then
Return False
End If
@@ -64,6 +84,15 @@ Public Class ActionService
Return True
End Function
Public Function API_SendWithdrawn_Mails(pEnvelope As Envelope, pReason As String) As Boolean
Dim oSendResult As Boolean = False
For Each oReceiver As EnvelopeReceiver In pEnvelope.Receivers
If EmailService.SendEnvelopeDeletedEmail(pEnvelope, oReceiver, pReason) = False Then
Return False
End If
Next
Return True
End Function
Public Function OpenEnvelope(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean
Dim oUserReference = pReceiver.Email

View File

@@ -1,13 +1,10 @@
Imports DigitalData.Modules.Base
Public Class BaseService
Inherits BaseClass
Friend Property State As State
Public Sub New(pState As State)
MyBase.New(pState.LogConfig)
State = pState
End Sub
End Class

View File

@@ -17,10 +17,11 @@ Public Class EmailService
End Sub
Public Function SendEnvelopeDeletedEmail(pEnvelope As Envelope, pReceiver As EnvelopeReceiver, pReason As String) As Boolean
Logger.Debug("Creating email data object.")
Logger.Debug("SendEnvelopeDeletedEmail - Creating email data object...")
Dim oEmailData As New EmailData(pEnvelope, pReceiver, Constants.EnvelopeStatus.MessageDeletionSent) With
{
.SignatureLink = ""
.SignatureLink = "",
.ADDED_WHO_PROCESS = pEnvelope.CURRENT_WORK_APP
}
EmailTemplate.FillEnvelopeDeletedEmailBody(oEmailData, pReason)
@@ -37,7 +38,8 @@ Public Class EmailService
Logger.Debug("Creating email data object.")
Dim oEmailData As New EmailData(pEnvelope, pReceiver, Constants.EnvelopeStatus.MessageInvitationSent) With
{
.SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, pEnvelope.Uuid, pReceiver.Signature)
.SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, pEnvelope.Uuid, pReceiver.Signature),
.ADDED_WHO_PROCESS = pEnvelope.CURRENT_WORK_APP
}
EmailTemplate.FillDocumentReceivedEmailBody(oEmailData)
@@ -51,9 +53,13 @@ Public Class EmailService
End Function
Public Function GetReceiverUrl(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As String
Logger.Debug($"State.DbConfig.SignatureHost: {State.DbConfig.SignatureHost}")
Logger.Debug($" pEnvelope.Uuid: {pEnvelope.Uuid}")
Logger.Debug($" pReceiver.Signature: {pReceiver.Signature}")
Dim oEmailData As New EmailData(pEnvelope, pReceiver, Constants.EnvelopeStatus.MessageInvitationSent) With
{
.SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, pEnvelope.Uuid, pReceiver.Signature)
.SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, pEnvelope.Uuid, pReceiver.Signature),
.ADDED_WHO_PROCESS = pEnvelope.CURRENT_WORK_APP
}
Return oEmailData.SignatureLink
End Function
@@ -61,9 +67,13 @@ Public Class EmailService
Public Function SendDocumentAccessCodeReceivedEmail(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean
Logger.Debug("Creating email data object.")
Logger.Debug($"State.DbConfig.SignatureHost: {State.DbConfig.SignatureHost}")
Logger.Debug($" pEnvelope.Uuid: {pEnvelope.Uuid}")
Logger.Debug($" pReceiver.Signature: {pReceiver.Signature}")
Dim oEmailData As New EmailData(pEnvelope, pReceiver, Constants.EnvelopeStatus.MessageAccessCodeSent) With
{
.SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, pEnvelope.Uuid, pReceiver.Signature)
.SignatureLink = Helpers.GetEnvelopeURL(State.DbConfig.SignatureHost, pEnvelope.Uuid, pReceiver.Signature),
.ADDED_WHO_PROCESS = pEnvelope.CURRENT_WORK_APP
}
EmailTemplate.FillDocumentAccessCodeReceivedEmailBody(oEmailData)

View File

@@ -121,7 +121,7 @@
<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>
<value>Do you really want to withdraw/delete this envelope?</value>
</data>
<data name="Do you really want to remove this document" xml:space="preserve">
<value>Do you really want to remove this document?</value>

View File

@@ -121,7 +121,7 @@
<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>
<value>Wollen Sie diesen Umschlag wirklich zurückrufen/löschen?</value>
</data>
<data name="Do you really want to remove this document" xml:space="preserve">
<value>Wollen Sie dieses Dokument wirklich entfernen?</value>
@@ -220,6 +220,9 @@ Pattern: +491234567890</value>
<data name="Missing Receivers" xml:space="preserve">
<value>Fehlende Empfänger</value>
</data>
<data name="ModificationOriginFile_FormFields" xml:space="preserve">
<value />
</data>
<data name="New Envelope" xml:space="preserve">
<value>Neuer Umschlag</value>
</data>

View File

@@ -74,7 +74,7 @@ Namespace My.Resources
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Wollen Sie diesen Umschlag wirklich löschen? ähnelt.
''' Sucht eine lokalisierte Zeichenfolge, die Wollen Sie diesen Umschlag wirklich zurückrufen/löschen? ähnelt.
'''</summary>
Public Shared ReadOnly Property Do_you_really_want_to_delete_this_envelope() As String
Get
@@ -371,6 +371,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die ähnelt.
'''</summary>
Public Shared ReadOnly Property ModificationOriginFile_FormFields() As String
Get
Return ResourceManager.GetString("ModificationOriginFile_FormFields", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Neuer Umschlag ähnelt.
'''</summary>

View File

@@ -136,6 +136,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Dokument Rotation geändert ähnelt.
'''</summary>
Public Shared ReadOnly Property DocumentMod_Rotation() As String
Get
Return ResourceManager.GetString("DocumentMod_Rotation", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Dokument geöffnet ähnelt.
'''</summary>
@@ -145,6 +154,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Unterzeichnung abgelehnt ähnelt.
'''</summary>
Public Shared ReadOnly Property DocumentRejected() As String
Get
Return ResourceManager.GetString("DocumentRejected", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Dokument unterzeichnet ähnelt.
'''</summary>
@@ -217,6 +235,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Umschlag abgelehnt ähnelt.
'''</summary>
Public Shared ReadOnly Property EnvelopeRejected() As String
Get
Return ResourceManager.GetString("EnvelopeRejected", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Signierungszertifikat erstellt ähnelt.
'''</summary>
@@ -244,6 +271,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Umschlag zurückgezogen ähnelt.
'''</summary>
Public Shared ReadOnly Property EnvelopeWithdrawn() As String
Get
Return ResourceManager.GetString("EnvelopeWithdrawn", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Zugriffscode versendet ähnelt.
'''</summary>
@@ -325,6 +361,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Wollen Sie die 2-Faktor Definition für diesen Empfänger zurücksetzen. Der Empfänger muss sich dann neu identifizieren! ähnelt.
'''</summary>
Public Shared ReadOnly Property ResetTOTPUser() As String
Get
Return ResourceManager.GetString("ResetTOTPUser", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Gespeichert ähnelt.
'''</summary>
@@ -370,6 +415,15 @@ Namespace My.Resources
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Erfolgreich! Dialog wird geschlossen. ähnelt.
'''</summary>
Public Shared ReadOnly Property Success_FormClose() As String
Get
Return ResourceManager.GetString("Success_FormClose", resourceCulture)
End Get
End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Unsigniert ähnelt.
'''</summary>

View File

@@ -138,9 +138,15 @@
<data name="Created" xml:space="preserve">
<value>Created</value>
</data>
<data name="DocumentMod_Rotation" xml:space="preserve">
<value>Document rotation adapted</value>
</data>
<data name="DocumentOpened" xml:space="preserve">
<value>Document opened</value>
</data>
<data name="DocumentRejected" xml:space="preserve">
<value>Signing rejected</value>
</data>
<data name="DocumentSigned" xml:space="preserve">
<value>Document signed</value>
</data>
@@ -154,16 +160,19 @@
<value>Completely signed</value>
</data>
<data name="EnvelopeCreated" xml:space="preserve">
<value>Created</value>
<value>Envelope Created</value>
</data>
<data name="EnvelopeDeleted" xml:space="preserve">
<value>Deleted</value>
<value>Envelope Deleted</value>
</data>
<data name="EnvelopePartlySigned" xml:space="preserve">
<value>Partly signed</value>
</data>
<data name="EnvelopeQueued" xml:space="preserve">
<value>Queued</value>
<value>Envelope Queued</value>
</data>
<data name="EnvelopeRejected" xml:space="preserve">
<value>Envelope Rejected</value>
</data>
<data name="EnvelopeReportCreated" xml:space="preserve">
<value>Signature certificate created</value>
@@ -174,6 +183,9 @@
<data name="EnvelopeSent" xml:space="preserve">
<value>Sent</value>
</data>
<data name="EnvelopeWithdrawn" xml:space="preserve">
<value>Withdrawn</value>
</data>
<data name="MessageAccessCodeSent" xml:space="preserve">
<value>Accesscode sent</value>
</data>
@@ -198,6 +210,9 @@
<data name="ReadAndSign" xml:space="preserve">
<value>Read and Sign</value>
</data>
<data name="ResetTOTPUser" xml:space="preserve">
<value>Do you want to reset the 2-factor definition for this receiver? The receiver must then identify itself again!</value>
</data>
<data name="Saved" xml:space="preserve">
<value>Saved</value>
</data>
@@ -213,6 +228,9 @@
<data name="Signed" xml:space="preserve">
<value>Signed</value>
</data>
<data name="Success_FormClose" xml:space="preserve">
<value>Successful! Dialog is closed.successful! Dialog is closed.</value>
</data>
<data name="Unsigned" xml:space="preserve">
<value>Unsigned</value>
</data>

View File

@@ -141,9 +141,15 @@
<data name="Created" xml:space="preserve">
<value>Erstellt</value>
</data>
<data name="DocumentMod_Rotation" xml:space="preserve">
<value>Dokument Rotation geändert</value>
</data>
<data name="DocumentOpened" xml:space="preserve">
<value>Dokument geöffnet</value>
</data>
<data name="DocumentRejected" xml:space="preserve">
<value>Unterzeichnung abgelehnt</value>
</data>
<data name="DocumentSigned" xml:space="preserve">
<value>Dokument unterzeichnet</value>
</data>
@@ -168,6 +174,9 @@
<data name="EnvelopeQueued" xml:space="preserve">
<value>Umschlag in Queue</value>
</data>
<data name="EnvelopeRejected" xml:space="preserve">
<value>Umschlag abgelehnt</value>
</data>
<data name="EnvelopeReportCreated" xml:space="preserve">
<value>Signierungszertifikat erstellt</value>
</data>
@@ -177,6 +186,9 @@
<data name="EnvelopeSent" xml:space="preserve">
<value>Gesendet</value>
</data>
<data name="EnvelopeWithdrawn" xml:space="preserve">
<value>Umschlag zurückgezogen</value>
</data>
<data name="MessageAccessCodeSent" xml:space="preserve">
<value>Zugriffscode versendet</value>
</data>
@@ -204,6 +216,9 @@
<data name="ReadAndSign" xml:space="preserve">
<value>Arbeitsanweisung</value>
</data>
<data name="ResetTOTPUser" xml:space="preserve">
<value>Wollen Sie die 2-Faktor Definition für diesen Empfänger zurücksetzen. Der Empfänger muss sich dann neu identifizieren!</value>
</data>
<data name="Saved" xml:space="preserve">
<value>Gespeichert</value>
</data>
@@ -219,6 +234,9 @@
<data name="Signed" xml:space="preserve">
<value>Signiert</value>
</data>
<data name="Success_FormClose" xml:space="preserve">
<value>Erfolgreich! Dialog wird geschlossen.</value>
</data>
<data name="Unsigned" xml:space="preserve">
<value>Unsigniert</value>
</data>

View File

@@ -2,27 +2,26 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities
namespace EnvelopeGenerator.Domain.Entities;
[Table("TBSIG_ENVELOPE_DOCUMENT", Schema = "dbo")]
public class EnvelopeDocument : IUnique<int>
{
[Table("TBSIG_ENVELOPE_DOCUMENT", Schema = "dbo")]
public class EnvelopeDocument : IUnique<int>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("GUID")]
public int Id { get; set; }
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("GUID")]
public int Id { get; set; }
[Required]
[Column("ENVELOPE_ID")]
public int EnvelopeId { get; set; }
[Required]
[Column("ENVELOPE_ID")]
public int EnvelopeId { get; set; }
[Required]
[Column("ADDED_WHEN", TypeName = "datetime")]
public required DateTime AddedWhen { get; set; }
[Required]
[Column("ADDED_WHEN", TypeName = "datetime")]
public required DateTime AddedWhen { get; set; }
[Column("BYTE_DATA", TypeName = "varbinary(max)")]
public byte[]? ByteData { get; init; }
[Column("BYTE_DATA", TypeName = "varbinary(max)")]
public byte[]? ByteData { get; init; }
public IEnumerable<DocumentReceiverElement>? Elements { get; set; }
}
public IEnumerable<DocumentReceiverElement>? Elements { get; set; }
}

View File

@@ -1,15 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DigitalData.Core.Abstractions" Version="2.2.1" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher.Abstraction" Version="1.0.0" />
<PackageReference Include="UserManager.Domain" Version="1.0.0" />
<PackageReference Include="DigitalData.Core.Abstractions" Version="3.6.0" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher.Abstraction" Version="3.0.0" />
<PackageReference Include="UserManager.Domain" Version="3.0.2" />
</ItemGroup>
<ItemGroup>

View File

@@ -28,7 +28,7 @@ Public MustInherit Class BaseController
State = pState
Database = pState.Database
InitializeModels(pState)
ActionService = New ActionService(pState)
ActionService = New ActionService(pState, Database)
End Sub
Private Sub InitializeModels(pState As State)

View File

@@ -1,9 +1,11 @@
Imports System.Data.SqlClient
Imports System.IO
Imports DevExpress.XtraBars.Docking
Imports DigitalData.Modules.Logging
Imports EnvelopeGenerator.Common
Imports EnvelopeGenerator.Common.Constants
Imports EnvelopeGenerator.Common.My
Imports GdPicture14
Public Class EnvelopeEditorController
Inherits BaseController
@@ -20,7 +22,7 @@ Public Class EnvelopeEditorController
Envelope = CreateEnvelope()
Thumbnail = New Thumbnail(pState.LogConfig)
EmailService = New EmailService(pState)
ActionService = New ActionService(pState)
ActionService = New ActionService(pState, Nothing)
End Sub
Public Sub New(pState As State, pEnvelope As Envelope)
@@ -31,13 +33,16 @@ Public Class EnvelopeEditorController
Envelope.Receivers = ReceiverModel.ListEnvelopeReceivers(pEnvelope.Id).ToList()
Thumbnail = New Thumbnail(pState.LogConfig)
ActionService = New ActionService(pState)
ActionService = New ActionService(pState, Nothing)
End Sub
#Region "Public"
Public Function SendEnvelope() As Boolean
Return ActionService.SendEnvelope(Envelope)
End Function
Public Function DocumentRotationChanged() As Boolean
Return ActionService.SetStatusDocumentRotationChanged(Envelope)
End Function
Public Function ResendReceiverInvitation(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean
Return ActionService.ResendReceiver(pEnvelope, pReceiver)
End Function
@@ -158,8 +163,10 @@ Public Class EnvelopeEditorController
Try
Dim oFixedPath = FixPageRotation.FixPageRotation(pDocumentFilePath)
If oFixedPath <> pDocumentFilePath Then
DocumentRotationChanged()
Logger.Info("PageRotation has been reseted to 0.")
End If
oFixedPath = FlattenFormFields.FlattenFormFields(oFixedPath)
Dim oFileInfo = New FileInfo(oFixedPath)
Dim oTempFiles As New TempFiles(State.LogConfig)
Dim oTempFilePath = Path.Combine(oTempFiles._TempPath, Guid.NewGuid().ToString + oFileInfo.Extension)

View File

@@ -319,6 +319,12 @@
<Compile Include="Controllers\EnvelopeListController.vb" />
<Compile Include="Controllers\FieldEditorController.vb" />
<Compile Include="Controllers\BaseController.vb" />
<Compile Include="frm2Factor_Properties.Designer.vb">
<DependentUpon>frm2Factor_Properties.vb</DependentUpon>
</Compile>
<Compile Include="frm2Factor_Properties.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmEnvelopeEditor.vb">
<SubType>Form</SubType>
</Compile>
@@ -337,6 +343,12 @@
<Compile Include="frmFieldEditor.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmGhostMode.Designer.vb">
<DependentUpon>frmGhostMode.vb</DependentUpon>
</Compile>
<Compile Include="frmGhostMode.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmMain.Designer.vb">
<DependentUpon>frmMain.vb</DependentUpon>
</Compile>
@@ -363,6 +375,7 @@
</Compile>
<Compile Include="Helper\Encryption.vb" />
<Compile Include="Helper\FixPageRotation.vb" />
<Compile Include="Helper\FlattenFormFields.vb" />
<Compile Include="Helper\RefreshHelper.vb" />
<Compile Include="Helper\TempFiles.vb" />
<Compile Include="Helper\Thumbnail.vb" />
@@ -374,6 +387,9 @@
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="My Project\AssemblyInfo.vb" />
<EmbeddedResource Include="frm2Factor_Properties.resx">
<DependentUpon>frm2Factor_Properties.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="frmEnvelopeEditor.en.resx">
<DependentUpon>frmEnvelopeEditor.vb</DependentUpon>
<SubType>Designer</SubType>
@@ -398,6 +414,19 @@
<DependentUpon>frmFieldEditor.vb</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="frmGhostMode.en-US.resx">
<DependentUpon>frmGhostMode.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="frmGhostMode.en.resx">
<DependentUpon>frmGhostMode.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="frmGhostMode.fr.resx">
<DependentUpon>frmGhostMode.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="frmGhostMode.resx">
<DependentUpon>frmGhostMode.vb</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="frmMain.en.resx">
<DependentUpon>frmMain.vb</DependentUpon>
</EmbeddedResource>

View File

@@ -0,0 +1,35 @@
Imports System.IO
Imports GdPicture14
Public Class FlattenFormFields
Public Shared Function FlattenFormFields(pFilePath As String) As String
Dim oFolder As String = Path.GetDirectoryName(pFilePath)
Dim gdpicturePdf As GdPicturePDF = New GdPicturePDF()
Dim status As GdPictureStatus = gdpicturePdf.LoadFromFile(pFilePath, True)
If status = GdPictureStatus.OK Then
Dim oFormFieldsCount = gdpicturePdf.GetFormFieldsCount()
If oFormFieldsCount > 0 Then
gdpicturePdf.FlattenFormFields()
Dim newFilesPath As String = Path.Combine(oFolder, "InputFieldsFlattend_" & Path.GetFileName(pFilePath))
If gdpicturePdf.SaveToFile(newFilesPath) = GdPictureStatus.OK Then
Dim oNameofFile = Path.GetFileName(newFilesPath)
MsgBox("Your PDF-file contained form-fields!" & vbNewLine & "We needed to adapt the file and created an new version!" & vbNewLine &
$"New filename: {oNameofFile}", MsgBoxStyle.Exclamation, "Information")
Return newFilesPath
End If
End If
End If
Return pFilePath
End Function
End Class

View File

@@ -16,5 +16,14 @@ Module ModuleSettings
Public SQL_REP_ENV_USER_TM As String = ""
Public SQL_REP_ENV_USER_Y As String = ""
Public SQL_REP_ENV_USER_ALL As String = ""
Public SQL_REP_ENV_ALL_USER_MONTH As String = ""
Public SQL_REP_ENV_ALL_USER_LAST_MONTH As String = ""
Public DT_CHARTS As DataTable
Public MyLogger As Logger
Public USER_GHOST_MODE_USRNAME As String = ""
Public USER_GHOST_MODE_ACTIVE As Boolean = False
Public MyUserModel As UserModel
Public MyState As State
Public CurrentEnvelopID As Integer = 0
Public CurrentEnvelopetitle As String = ""
End Module

View File

@@ -32,5 +32,5 @@ Imports System.Runtime.InteropServices
' You can specify all the values or you can default the Build and Revision Numbers
' by using the '*' as shown below:
' [assembly: AssemblyVersion("1.0.*")]
<Assembly: AssemblyVersion("2.9.0.0")>
<Assembly: AssemblyVersion("2.9.1.0")>
<Assembly: AssemblyFileVersion("1.0.0.0")>

View File

@@ -0,0 +1,121 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class frm2Factor_Properties
Inherits System.Windows.Forms.Form
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Wird vom Windows Form-Designer benötigt.
Private components As System.ComponentModel.IContainer
'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frm2Factor_Properties))
Me.txtMail = New System.Windows.Forms.TextBox()
Me.txtValid = New System.Windows.Forms.TextBox()
Me.chkTOTP = New System.Windows.Forms.CheckBox()
Me.Label1 = New System.Windows.Forms.Label()
Me.Label3 = New System.Windows.Forms.Label()
Me.SimpleButton1 = New DevExpress.XtraEditors.SimpleButton()
Me.SuspendLayout()
'
'txtMail
'
Me.txtMail.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.txtMail.Location = New System.Drawing.Point(85, 24)
Me.txtMail.Name = "txtMail"
Me.txtMail.ReadOnly = True
Me.txtMail.Size = New System.Drawing.Size(342, 23)
Me.txtMail.TabIndex = 0
'
'txtValid
'
Me.txtValid.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.txtValid.Location = New System.Drawing.Point(85, 79)
Me.txtValid.Name = "txtValid"
Me.txtValid.ReadOnly = True
Me.txtValid.Size = New System.Drawing.Size(202, 23)
Me.txtValid.TabIndex = 1
'
'chkTOTP
'
Me.chkTOTP.AutoSize = True
Me.chkTOTP.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.chkTOTP.Location = New System.Drawing.Point(85, 53)
Me.chkTOTP.Name = "chkTOTP"
Me.chkTOTP.Size = New System.Drawing.Size(151, 20)
Me.chkTOTP.TabIndex = 2
Me.chkTOTP.Text = "Secret Key vorhanden"
Me.chkTOTP.UseVisualStyleBackColor = True
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label1.Location = New System.Drawing.Point(12, 27)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(47, 16)
Me.Label1.TabIndex = 3
Me.Label1.Text = "E-Mail:"
'
'Label3
'
Me.Label3.AutoSize = True
Me.Label3.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label3.Location = New System.Drawing.Point(15, 82)
Me.Label3.Name = "Label3"
Me.Label3.Size = New System.Drawing.Size(64, 16)
Me.Label3.TabIndex = 5
Me.Label3.Text = "Gültig bis:"
'
'SimpleButton1
'
Me.SimpleButton1.Appearance.Font = New System.Drawing.Font("Tahoma", 9.75!)
Me.SimpleButton1.Appearance.Options.UseFont = True
Me.SimpleButton1.ImageOptions.SvgImage = CType(resources.GetObject("SimpleButton1.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.SimpleButton1.Location = New System.Drawing.Point(18, 121)
Me.SimpleButton1.Name = "SimpleButton1"
Me.SimpleButton1.Size = New System.Drawing.Size(116, 40)
Me.SimpleButton1.TabIndex = 6
Me.SimpleButton1.Text = "Zurücksetzen"
'
'frm2Factor_Properties
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(443, 170)
Me.Controls.Add(Me.SimpleButton1)
Me.Controls.Add(Me.Label3)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.chkTOTP)
Me.Controls.Add(Me.txtValid)
Me.Controls.Add(Me.txtMail)
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "frm2Factor_Properties"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "Zwei-Faktor Eigenschaften Empfänger:"
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents txtMail As TextBox
Friend WithEvents txtValid As TextBox
Friend WithEvents chkTOTP As CheckBox
Friend WithEvents Label1 As Label
Friend WithEvents Label3 As Label
Friend WithEvents SimpleButton1 As DevExpress.XtraEditors.SimpleButton
End Class

View File

@@ -0,0 +1,141 @@
<?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>
<assembly alias="DevExpress.Data.v21.2" name="DevExpress.Data.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="SimpleButton1.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAANcCAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkdyZWVue2ZpbGw6IzAzOUMyMzt9Cgku
QmxhY2t7ZmlsbDojNzI3MjcyO30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5ZZWxsb3d7ZmlsbDojRkZC
MTE1O30KCS5CbHVle2ZpbGw6IzExNzdENzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8ZyBpZD0iUmVzZXRMYXlv
dXRPcHRpb25zIj4NCiAgICA8cGF0aCBkPSJNMTYsNGMtMy4zLDAtNi4zLDEuMy04LjUsMy41TDQsNHYx
MGgwLjJoNC4xSDE0bC0zLjYtMy42QzExLjgsOC45LDEzLjgsOCwxNiw4YzQuNCwwLDgsMy42LDgsOHMt
My42LDgtOCw4ICAgYy0zLjcsMC02LjgtMi42LTcuNy02SDQuMmMxLDUuNyw1LjksMTAsMTEuOCwxMGM2
LjYsMCwxMi01LjQsMTItMTJTMjIuNiw0LDE2LDR6IiBjbGFzcz0iR3JlZW4iIC8+DQogIDwvZz4NCjwv
c3ZnPgs=
</value>
</data>
</root>

View File

@@ -0,0 +1,43 @@
Imports DigitalData.Modules.Database
Imports EnvelopeGenerator.Common.My
Public Class frm2Factor_Properties
Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
If MsgBox(Resources.Model.ResetTOTPUser, MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) = MsgBoxResult.Yes Then
Dim oupdSQL = $"UPDATE TBSIG_RECEIVER SET TOTP_SECRET_KEY = NULL, TFA_REG_DEADLINE = NULL WHERE EMAIL_ADDRESS = '{txtMail.Text}'"
If DD_ECM.ExecuteNonQuery(oupdSQL) = True Then
MsgBox(Resources.Model.Success_FormClose, MsgBoxStyle.Information)
Me.Close()
Else
MsgBox("Something went wrong. Check the log", MsgBoxStyle.Exclamation)
End If
End If
End Sub
Dim TOTP As String
Dim mail As String
Dim Deadline As DateTime
Dim DD_ECM As MSSQLServer
Public Sub New(pmail As String, pTOTP As String, pDeadline As DateTime, pDD_ECM As MSSQLServer)
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
mail = pmail
TOTP = pTOTP
Deadline = pDeadline
DD_ECM = pDD_ECM
End Sub
Private Sub frm2Faktor_Load(sender As Object, e As EventArgs) Handles Me.Load
chkTOTP.Checked = False
If Not IsNothing(TOTP) Then
If TOTP.Length > 1 Then
chkTOTP.Checked = True
End If
End If
txtMail.Text = mail
txtValid.Text = Deadline.ToString
End Sub
End Class

View File

@@ -632,6 +632,7 @@ Partial Public Class frmEnvelopeEditor
resources.ApplyResources(Me.txtMessage, "txtMessage")
Me.txtMessage.MenuManager = Me.RibbonControl1
Me.txtMessage.Name = "txtMessage"
Me.txtMessage.Properties.AcceptsTab = True
Me.txtMessage.Properties.Appearance.Font = CType(resources.GetObject("txtMessage.Properties.Appearance.Font"), System.Drawing.Font)
Me.txtMessage.Properties.Appearance.Options.UseFont = True
Me.txtMessage.StyleController = Me.LayoutControl1
@@ -664,7 +665,7 @@ Partial Public Class frmEnvelopeEditor
Me.LayoutControlItem3.Size = New System.Drawing.Size(873, 216)
resources.ApplyResources(Me.LayoutControlItem3, "LayoutControlItem3")
Me.LayoutControlItem3.TextLocation = DevExpress.Utils.Locations.Top
Me.LayoutControlItem3.TextSize = New System.Drawing.Size(49, 13)
Me.LayoutControlItem3.TextSize = New System.Drawing.Size(46, 13)
'
'FrmEditorBindingSource
'

View File

@@ -122,7 +122,7 @@ Partial Public Class frmEnvelopeEditor
Catch ex As Exception
MsgBox("File might already be open?", MsgBoxStyle.Exclamation)
Me.Cursor = Cursors.Default
Exit Sub
Exit For
End Try
@@ -200,7 +200,7 @@ Partial Public Class frmEnvelopeEditor
Private Sub btnSave_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnSave.ItemClick
Try
If SaveEnvelopeWithOutValidation() = True Then
bsitm_info.Caption = "Data saved succeddfully " + Now.ToString
bsitm_info.Caption = "Data saved successfully " + Now.ToString
Else
bsitm_info.Caption = "Exceprion - Error saving Data. Check LOG"
End If
@@ -421,29 +421,7 @@ Partial Public Class frmEnvelopeEditor
MsgBox(Resources.Envelope.Envelope_could_not_be_sent, MsgBoxStyle.Critical, Text)
Else
If MsgBox(Resources.Envelope.Envelope_Invitations_Sent, MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, Text) = MsgBoxResult.Ok Then
'If DOCUMENT_PATH_MOVE_AFTSEND <> String.Empty Then
' If My.Settings.NetUse_PW <> String.Empty And My.Settings.NetUse_Usr <> String.Empty Then
' Dim oDecrypted = Decryption.Decrypt(My.Settings.NetUse_PW)
' For Each odoc In Controller.Envelope.Documents 'envelope ist leer!
' Directory2Delete = ""
' If CopyFileWithNetUse(odoc.Filepath, DOCUMENT_PATH_MOVE_AFTSEND, My.Settings.NetUse_Usr, My.Settings.NetUse_PW) = False Then
' BarStaticItem1.Caption = "ERROR while copying files to DMZ! Check Your log!"
' End If
' If Directory2Delete <> String.Empty Then
' Logger.Debug("Now Deleting SourcePath: {0} ...", Directory2Delete)
' Try
' System.IO.Directory.Delete(Directory2Delete, True)
' Logger.Debug("Successfully deleted Sourcepath!")
' Catch ex As Exception
' Logger.Warn("Unexpected Error while deleting SourcePath {0}", Directory2Delete)
' Logger.Warn("ErrorMessage: {0}", ex.Message)
' End Try
' End If
' Next
' End If
'End If
Me.Close()
End If
End If
@@ -785,4 +763,6 @@ Partial Public Class frmEnvelopeEditor
Process.Start(Documents.Item(0).Filepath)
End If
End Sub
End Class

View File

@@ -65,6 +65,9 @@ Public Class frmEnvelopeMainData
chked_2Faktor.EditValue = DEF_TF_ENABLED
Else
If IsNothing(Envelope.EnvelopeType) Then
Envelope.EnvelopeType = EnvelopeType
End If
If Envelope.EnvelopeType.ContractType = 0 Then
cmbEnvelopeType.EditValue = EnvelopeType
Else

View File

@@ -0,0 +1,125 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Partial Class frmGhostMode
Inherits System.Windows.Forms.Form
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
<System.Diagnostics.DebuggerNonUserCode()>
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Wird vom Windows Form-Designer benötigt.
Private components As System.ComponentModel.IContainer
'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmGhostMode))
Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl()
Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem()
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar()
Me.GridControl1 = New DevExpress.XtraGrid.GridControl()
Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView()
CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.GridControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'RibbonControl1
'
Me.RibbonControl1.ExpandCollapseItem.Id = 0
Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.BarButtonItem1})
resources.ApplyResources(Me.RibbonControl1, "RibbonControl1")
Me.RibbonControl1.MaxItemId = 2
Me.RibbonControl1.Name = "RibbonControl1"
Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1})
Me.RibbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False]
Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1
'
'BarButtonItem1
'
resources.ApplyResources(Me.BarButtonItem1, "BarButtonItem1")
Me.BarButtonItem1.Id = 1
Me.BarButtonItem1.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem1.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.BarButtonItem1.Name = "BarButtonItem1"
'
'RibbonPage1
'
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1})
Me.RibbonPage1.Name = "RibbonPage1"
resources.ApplyResources(Me.RibbonPage1, "RibbonPage1")
'
'RibbonPageGroup1
'
Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1)
Me.RibbonPageGroup1.Name = "RibbonPageGroup1"
resources.ApplyResources(Me.RibbonPageGroup1, "RibbonPageGroup1")
'
'RibbonStatusBar1
'
resources.ApplyResources(Me.RibbonStatusBar1, "RibbonStatusBar1")
Me.RibbonStatusBar1.Name = "RibbonStatusBar1"
Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1
'
'GridControl1
'
resources.ApplyResources(Me.GridControl1, "GridControl1")
Me.GridControl1.MainView = Me.GridView1
Me.GridControl1.Name = "GridControl1"
Me.GridControl1.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridView1})
'
'GridView1
'
Me.GridView1.Appearance.EvenRow.BackColor = System.Drawing.Color.LightBlue
Me.GridView1.Appearance.EvenRow.Options.UseBackColor = True
Me.GridView1.GridControl = Me.GridControl1
Me.GridView1.Name = "GridView1"
Me.GridView1.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.[False]
Me.GridView1.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.[False]
Me.GridView1.OptionsBehavior.AllowFixedGroups = DevExpress.Utils.DefaultBoolean.[True]
Me.GridView1.OptionsBehavior.AllowGroupExpandAnimation = DevExpress.Utils.DefaultBoolean.[True]
Me.GridView1.OptionsBehavior.Editable = False
Me.GridView1.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.[False]
Me.GridView1.OptionsView.ColumnAutoWidth = False
Me.GridView1.OptionsView.EnableAppearanceEvenRow = True
Me.GridView1.OptionsView.ShowAutoFilterRow = True
Me.GridView1.OptionsView.ShowErrorPanel = DevExpress.Utils.DefaultBoolean.[True]
Me.GridView1.OptionsView.ShowViewCaption = True
resources.ApplyResources(Me.GridView1, "GridView1")
'
'frmGhostMode
'
resources.ApplyResources(Me, "$this")
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.GridControl1)
Me.Controls.Add(Me.RibbonStatusBar1)
Me.Controls.Add(Me.RibbonControl1)
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow
Me.Name = "frmGhostMode"
Me.TopMost = True
CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.GridControl1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents RibbonControl1 As DevExpress.XtraBars.Ribbon.RibbonControl
Friend WithEvents RibbonPage1 As DevExpress.XtraBars.Ribbon.RibbonPage
Friend WithEvents RibbonPageGroup1 As DevExpress.XtraBars.Ribbon.RibbonPageGroup
Friend WithEvents RibbonStatusBar1 As DevExpress.XtraBars.Ribbon.RibbonStatusBar
Friend WithEvents BarButtonItem1 As DevExpress.XtraBars.BarButtonItem
Friend WithEvents GridControl1 As DevExpress.XtraGrid.GridControl
Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView
End Class

View File

@@ -0,0 +1,165 @@
<?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="BarButtonItem1.Caption" xml:space="preserve">
<value>Activate ghost mode</value>
</data>
<assembly alias="DevExpress.Data.v21.2" name="DevExpress.Data.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="BarButtonItem1.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAAIEAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5HcmVlbntmaWxsOiMwMzlD
MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntkaXNwbGF5Om5vbmU7fQoJLnN0M3tk
aXNwbGF5OmlubGluZTtmaWxsOiNGRkIxMTU7fQoJLnN0NHtkaXNwbGF5OmlubGluZTt9Cgkuc3Q1e2Rp
c3BsYXk6aW5saW5lO29wYWNpdHk6MC43NTt9Cgkuc3Q2e2Rpc3BsYXk6aW5saW5lO29wYWNpdHk6MC41
O30KCS5zdDd7ZGlzcGxheTppbmxpbmU7ZmlsbDojMDM5QzIzO30KCS5zdDh7ZGlzcGxheTppbmxpbmU7
ZmlsbDojRDExQzFDO30KCS5zdDl7ZGlzcGxheTppbmxpbmU7ZmlsbDojMTE3N0Q3O30KCS5zdDEwe2Rp
c3BsYXk6aW5saW5lO2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+DQogIDxnIGlkPSJSb2xlIj4NCiAgICA8
cGF0aCBkPSJNNCwydjE2YzAsNi42LDUuNCwxMiwxMiwxMnMxMi01LjQsMTItMTJWMkg0eiBNMTEsOWMx
LjcsMCwzLDEuMywzLDNIOEM4LDEwLjMsOS4zLDksMTEsOXogTTE2LDI0ICAgYy0zLjMsMC02LTIuNy02
LTZjMCwxLjEsMi43LDIsNiwyczYtMC45LDYtMkMyMiwyMS4zLDE5LjMsMjQsMTYsMjR6IE0xOCwxMmMw
LTEuNywxLjMtMywzLTNzMywxLjMsMywzSDE4eiIgY2xhc3M9IlllbGxvdyIgLz4NCiAgPC9nPg0KPC9z
dmc+Cw==
</value>
</data>
<data name="RibbonPageGroup1.Text" xml:space="preserve">
<value>Actions</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="RibbonControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>965, 146</value>
</data>
<data name="GridControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 146</value>
</data>
<data name="GridView1.ViewCaption" xml:space="preserve">
<value>Please choose a ghost user</value>
</data>
<data name="GridControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>965, 341</value>
</data>
</root>

View File

@@ -0,0 +1,132 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="RibbonPageGroup1.Text">
<value>Actions</value>
</data>
<data name="GridView1.ViewCaption">
<value>Please select a ghost user</value>
</data>
<data name="BarButtonItem1.Caption">
<value>Activate ghost mode</value>
</data>
<data name="RibbonPage1.Text">
<value>Start</value>
</data>
</root>

View File

@@ -0,0 +1,132 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="RibbonPageGroup1.Text">
<value>Actions</value>
</data>
<data name="GridView1.ViewCaption">
<value>Veuillez sélectionner un utilisateur fantôme</value>
</data>
<data name="BarButtonItem1.Caption">
<value>Activer le Mode Fantôme</value>
</data>
<data name="RibbonPage1.Text">
<value>Démarrer</value>
</data>
</root>

View File

@@ -0,0 +1,266 @@
<?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="BarButtonItem1.Caption" xml:space="preserve">
<value>Ghost Modus aktivieren</value>
</data>
<assembly alias="DevExpress.Data.v21.2" name="DevExpress.Data.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="BarButtonItem1.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAAIEAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5HcmVlbntmaWxsOiMwMzlD
MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntkaXNwbGF5Om5vbmU7fQoJLnN0M3tk
aXNwbGF5OmlubGluZTtmaWxsOiNGRkIxMTU7fQoJLnN0NHtkaXNwbGF5OmlubGluZTt9Cgkuc3Q1e2Rp
c3BsYXk6aW5saW5lO29wYWNpdHk6MC43NTt9Cgkuc3Q2e2Rpc3BsYXk6aW5saW5lO29wYWNpdHk6MC41
O30KCS5zdDd7ZGlzcGxheTppbmxpbmU7ZmlsbDojMDM5QzIzO30KCS5zdDh7ZGlzcGxheTppbmxpbmU7
ZmlsbDojRDExQzFDO30KCS5zdDl7ZGlzcGxheTppbmxpbmU7ZmlsbDojMTE3N0Q3O30KCS5zdDEwe2Rp
c3BsYXk6aW5saW5lO2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+DQogIDxnIGlkPSJSb2xlIj4NCiAgICA8
cGF0aCBkPSJNNCwydjE2YzAsNi42LDUuNCwxMiwxMiwxMnMxMi01LjQsMTItMTJWMkg0eiBNMTEsOWMx
LjcsMCwzLDEuMywzLDNIOEM4LDEwLjMsOS4zLDksMTEsOXogTTE2LDI0ICAgYy0zLjMsMC02LTIuNy02
LTZjMCwxLjEsMi43LDIsNiwyczYtMC45LDYtMkMyMiwyMS4zLDE5LjMsMjQsMTYsMjR6IE0xOCwxMmMw
LTEuNywxLjMtMywzLTNzMywxLjMsMywzSDE4eiIgY2xhc3M9IlllbGxvdyIgLz4NCiAgPC9nPg0KPC9z
dmc+Cw==
</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="RibbonControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="RibbonPageGroup1.Text" xml:space="preserve">
<value>Aktionen</value>
</data>
<data name="RibbonPage1.Text" xml:space="preserve">
<value>Start</value>
</data>
<data name="RibbonControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>965, 146</value>
</data>
<data name="RibbonStatusBar1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 487</value>
</data>
<data name="RibbonStatusBar1.Size" type="System.Drawing.Size, System.Drawing">
<value>965, 22</value>
</data>
<data name="&gt;&gt;RibbonStatusBar1.Name" xml:space="preserve">
<value>RibbonStatusBar1</value>
</data>
<data name="&gt;&gt;RibbonStatusBar1.Type" xml:space="preserve">
<value>DevExpress.XtraBars.Ribbon.RibbonStatusBar, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;RibbonStatusBar1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;RibbonStatusBar1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;RibbonControl1.Name" xml:space="preserve">
<value>RibbonControl1</value>
</data>
<data name="&gt;&gt;RibbonControl1.Type" xml:space="preserve">
<value>DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;RibbonControl1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;RibbonControl1.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="GridControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="GridControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 146</value>
</data>
<data name="GridView1.ViewCaption" xml:space="preserve">
<value>Bitte wählen Sie einen Ghost User</value>
</data>
<data name="GridControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>965, 341</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="GridControl1.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="&gt;&gt;GridControl1.Name" xml:space="preserve">
<value>GridControl1</value>
</data>
<data name="&gt;&gt;GridControl1.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;GridControl1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;GridControl1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>965, 509</value>
</data>
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
<value>Calibri, 8.25pt</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterParent</value>
</data>
<data name="&gt;&gt;BarButtonItem1.Name" xml:space="preserve">
<value>BarButtonItem1</value>
</data>
<data name="&gt;&gt;BarButtonItem1.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;RibbonPage1.Name" xml:space="preserve">
<value>RibbonPage1</value>
</data>
<data name="&gt;&gt;RibbonPage1.Type" xml:space="preserve">
<value>DevExpress.XtraBars.Ribbon.RibbonPage, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;RibbonPageGroup1.Name" xml:space="preserve">
<value>RibbonPageGroup1</value>
</data>
<data name="&gt;&gt;RibbonPageGroup1.Type" xml:space="preserve">
<value>DevExpress.XtraBars.Ribbon.RibbonPageGroup, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;GridView1.Name" xml:space="preserve">
<value>GridView1</value>
</data>
<data name="&gt;&gt;GridView1.Type" xml:space="preserve">
<value>DevExpress.XtraGrid.Views.Grid.GridView, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>frmGhostMode</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@@ -0,0 +1,59 @@
Public Class frmGhostMode
Private Sub frmGhostMode_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim oSQL = "SELECT T.USERNAME,T.NAME, T.[PRENAME],T.EMAIL FROM TBDD_USER T ORDER BY USERNAME"
Dim DT_USER = DB_DD_ECM.GetDatatable(oSQL)
Try
If Not IsNothing(DT_USER) Then
GridControl1.DataSource = DT_USER
MyLogger.Info($"Received [{DT_USER.Rows.Count}] Ghost-Users to select!")
End If
Catch ex As Exception
MsgBox("Error Load_Users:" & vbNewLine & ex.Message)
End Try
End Sub
Private Sub BarButtonItem1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem1.ItemClick
Set_GhostUser()
End Sub
Private Sub GridView1_DoubleClick(sender As Object, e As EventArgs) Handles GridView1.DoubleClick
Set_GhostUser()
End Sub
Sub Set_GhostUser()
Dim oFocusedUserName
Try
oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("UserName"))
If IsNothing(oFocusedUserName) Then
oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("USERNAME"))
End If
If IsNothing(oFocusedUserName) Then
oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("USER_NAME"))
End If
If IsNothing(oFocusedUserName) Then
oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("USER"))
End If
Catch ex As Exception
oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("UserName"))
If IsNothing(oFocusedUserName) Then
MsgBox(ex.Message, MsgBoxStyle.Critical)
Exit Sub
End If
End Try
If oFocusedUserName <> String.Empty Then
Dim result As MsgBoxResult = MsgBox("Do You really want to activate the Ghost-Mode?", MsgBoxStyle.YesNo, "")
'wenn Speichern ja
If result = MsgBoxResult.Yes Then
USER_GHOST_MODE_USRNAME = oFocusedUserName
USER_GHOST_MODE_ACTIVE = True
Me.Close()
End If
Else
MsgBox("Please choose an user for ghostmode!", MsgBoxStyle.Information)
End If
End Sub
End Class

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