Enhance banking transaction data structure and validation
Playwright Tests / test (push) Has been cancelled

- Increased the length of the NameOfPayer field from NVARCHAR(60) to NVARCHAR(140) in the banking transactions function, table, temporary table, and user-defined type to accommodate longer names.
- Expanded the SepaRemittanceInformation field from VARCHAR(150) to VARCHAR(200) in the banking transactions function for more detailed remittance information.
- Modified the stored procedure fds__setBankingtransaction_done to return additional transaction data (ValueDate and Amount) along with the success flag for improved notification messaging.
- Added validation in MFRClientConfig constructor to ensure the provided URL is not null or empty, enhancing error handling for configuration settings.
This commit is contained in:
Stefan
2026-07-04 16:37:23 +02:00
parent aaf062fd77
commit c98be7b23f
24 changed files with 287 additions and 74 deletions
+1
View File
@@ -21,6 +21,7 @@ public enum DomainEventType
ReminderSendFailed,
BankingTransactionsImported,
BankingImportFailed,
BankingTransactionMarkedDone,
UserIssue
}
+38
View File
@@ -1,3 +1,4 @@
using System.Globalization;
using Fuchs.intranet;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
@@ -130,6 +131,18 @@ public sealed class EventService : IEventService
"Banking",
new Dictionary<string, object?> { ["fileName"] = fileName, ["message"] = message }));
public Task BankingTransactionMarkedDoneAsync(string taId, DateTime? valueDate, decimal? amount, string userAccountId)
=> PublishAsync(new DomainEvent(
DomainEventType.BankingTransactionMarkedDone,
userAccountId,
"Banking",
new Dictionary<string, object?>
{
["taId"] = taId,
["valueDate"] = valueDate,
["amount"] = amount
}));
public Task UserIssueAsync(string title, string message, string userAccountId, IReadOnlyDictionary<string, object?>? context = null)
{
Dictionary<string, object?> ctx = context == null
@@ -181,6 +194,8 @@ public sealed class EventService : IEventService
BankingImportMessage(domainEvent),
DomainEventType.BankingImportFailed =>
Ctx(domainEvent, "message"),
DomainEventType.BankingTransactionMarkedDone =>
BankingTransactionMarkedDoneMessage(domainEvent),
DomainEventType.UserIssue =>
Ctx(domainEvent, "message"),
_ => domainEvent.Title
@@ -242,6 +257,29 @@ public sealed class EventService : IEventService
return DateTime.TryParse(value.ToString(), out var parsed) ? parsed : null;
}
private static string BankingTransactionMarkedDoneMessage(DomainEvent domainEvent)
{
DateTime? valueDate = DateCtx(domainEvent, "valueDate");
string amount = AmountCtx(domainEvent, "amount");
string datePart = valueDate == null ? "" : $" vom {valueDate.Value:dd.MM.yy}";
string amountPart = string.IsNullOrEmpty(amount) ? "" : $" über {amount}€";
return $"Bank-Transaktion{datePart}{amountPart} wurde als erledigt markiert.";
}
private static string AmountCtx(DomainEvent domainEvent, string key)
{
if (!domainEvent.Context.TryGetValue(key, out var value) || value == null) return "";
decimal? amount = value switch
{
decimal d => d,
double d => (decimal)d,
_ => decimal.TryParse(value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out var parsed)
? parsed
: null
};
return amount?.ToString("0.00", Fuchs_intranet.DeCulture) ?? "";
}
private static Dictionary<string, object?> InvoiceContext(FdsInvoiceData invoice)
{
string invoiceNumber = invoice.InvoiceId;
+1
View File
@@ -20,6 +20,7 @@ public interface IEventService
Task BankingTransactionsImportedAsync(DateTime? from, DateTime? to, int rows, string fileName, string userAccountId);
Task BankingImportIssueAsync(string message, string fileName, string userAccountId);
Task BankingTransactionMarkedDoneAsync(string taId, DateTime? valueDate, decimal? amount, string userAccountId);
Task UserIssueAsync(string title, string message, string userAccountId, IReadOnlyDictionary<string, object?>? context = null);
}