Files
Masterarbeit/QuellCode/CentronERP/tests/Centron.Tests.EndToEnd/Tests/OnlineBanking/OnlineBankingAccountTransactionTest.cs
T
Christoph Schwörer f045b99a25 Codebasis als Dateien ins Arbeitsrepo statt als Gitlink
QuellCode/CentronERP war nur als Gitlink (Submodul-Referenz auf 79c1142)
getrackt, ohne .gitmodules und ohne erreichbares Remote. Der
Untersuchungsgegenstand der Versuchsreihe war damit nicht reproduzierbar
gesichert: Ein Klon haette ein leeres Verzeichnis erhalten, und die Belege
der 3.287 Anforderungen waeren nicht ueberpruefbar gewesen.

Umstellung:
- Historie nach c:\DEV\CentronERP_git_snapshot_79c1142 ausgelagert
  (vollstaendig lesbar, enthaelt 79c1142 und Vorgaenger 89ccfd6)
- Gitlink aus dem Index entfernt
- Dateiinhalt aufgenommen: 24.557 Dateien, rund 333 MB

Die verschachtelte .gitignore der Codebasis gilt weiter, Build-Artefakte
bleiben ausgeschlossen. Details in Versuche/Versuch_01/_Codebasis-Nachweis.md
2026-08-26 07:43:51 +02:00

279 lines
13 KiB
C#

using Centron.BusinessLogic;
using Centron.BusinessLogic.Accounting;
using Centron.BusinessLogic.Finances.OnlineBanking;
using Centron.BusinessLogic.Sales.Receipts.DataAndResults;
using Centron.BusinessLogic.WebServices.Administration.CentronConfigDb;
using Centron.BusinessLogic.WebServices.Finances.OnlineBanking;
using Centron.BusinessLogic.WebServices.PasswordManager;
using Centron.BusinessLogic.WebServices.Sales.Customers;
using Centron.BusinessLogic.WebServices.Sales.Receipts;
using Centron.BusinessLogic.WebServices.Sales.Receipts.ReceiptSearch;
using Centron.Data.Entities.Finances.OnlineBanking;
using Centron.Data.WebServices.Sales.Customers;
using Centron.Data.WebServices.Sales.Receipts.Invoices;
using Centron.Interfaces;
using Centron.Interfaces.Accounting;
using Centron.Interfaces.BL;
using Centron.Interfaces.Finances.OnlineBanking;
using Centron.Interfaces.Sales.Receipts.ReceiptSearch;
using Centron.Tests.EndToEnd.Infrastructure;
using CentronSoftware.Centron.WebServices.Entities.Accounts.Accounting;
using CentronSoftware.Centron.WebServices.Entities.Finances.OnlineBanking;
using CentronSoftware.Centron.WebServices.Entities.PasswordManager;
using CentronSoftware.Centron.WebServices.RestRequests.OnlineBanking;
using DevExpress.Xpo;
using FastReport;
using FluentNHibernate.Conventions;
using Microsoft.Graph.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
namespace Centron.Tests.EndToEnd.Tests.OnlineBanking
{
public class OnlineBankingAccountTransactionTest : EndToEndTest
{
private int _configI3D;
public OnlineBankingAccountTransactionTest(ITestOutputHelper testOutputHelper)
: base(testOutputHelper)
{
}
public override void Execute()
{
this.PrepareDatabase();
this.CreateAndSaveAccountTransactions(); // Also checks if the SaveMethod prevents saving duplicates with the same data
// TODO: The new save method also auto checks for complete status. Is this really the right approach?
var accountTransactions1 = this.LoadAccountTransactions();
var accountTransactions2 = this.LoadAccountTransactions();
this.AddCustomerAndAssignmentsManually(accountTransactions1);
this.AddCustomerAndAssignmentsAutomatically(accountTransactions2);
this.TestCheckForUnknownIbans();
}
private void PrepareDatabase()
{
var user = this.GetLoggedInUser();
// Use file instead of config DB
this.WithSession(f => f.GetBL<PasswordManagerWebServiceBL>().UpdatePasswordManagerSettings(user, new PasswordManagerSettingsDTO
{
IsPasswordManagerGuidelineManagementActive = false,
SecondsUntilNewAuthentificationPasswordManagerAccess = 0,
MasterPasswordSaveLocation = MasterPasswordSaveLocation.SecureFile,
MasterPasswordSecureFileName = "TestMasterKey.txt"
}));
var masterkeySaveresult = this.WithSession(f => f.GetBL<CentronConfigurationDbWebServiceBL>().SetHotlineMasterKey(user, "1234ABC567")).ThrowIfError();
Assert.True(masterkeySaveresult);
var config = new OnlineBankingConfigurationFinApiDTO()
{
Name = "Test",
BranchI3D = 0
};
var configSaveResult = this.WithSession(f => f.GetBL<OnlineBankingConfigurationWebServiceBL>().SaveOnlineBankingConfiguration(config, user)).ThrowIfError();
this._configI3D = configSaveResult.I3D;
base.Sql(@"
UPDATE RechKopf
SET Bezahlt = 52.7
WHERE Nummer = 40233");
}
private void CreateAndSaveAccountTransactions()
{
using var session = new BLSession();
var accountTransactionsWebServiceBL = session.GetBL<OnlineBankingAccountTransactionsWebServiceBL>();
var user = this.GetLoggedInUser();
var transaction1 = new OnlineBankingAccountTransactionDTO()
{
OnlineBankingConfigurationI3D = this._configI3D,
TypeCode = "103",
BookingDate = new DateTime(new DateOnly(2024, 03,20), new TimeOnly(15, 00)),
Amount = 190.5m,
Currency = "EUR",
Description = "Rechnung 40233, 40282",
BookingText = "Überweisung",
BIC = "ABCDEFG",
AccountIBAN = "DE12345678901234567890",
Sender = "Martin Herzog",
RelatedCustomerI3D = 10000,
CustomerMatchingRate = 0.75,
IsCompleted = true,
IsVisible = true,
};
var transaction2 = new OnlineBankingAccountTransactionDTO()
{
OnlineBankingConfigurationI3D = 22,
TypeCode = "103",
BookingDate = new DateTime(new DateOnly(2024, 03, 21), new TimeOnly(09, 08)),
Amount = 1671.4m,
Currency = "EUR",
Description = "Bestbeschreibung 2",
BookingText = "Abbuchung",
BIC = "HIJKLMN",
AccountIBAN = "DE26930901000012345678",
Sender = "Test Sender",
RelatedCustomerI3D = 10012,
CustomerMatchingRate = 0.01,
IsCompleted = false,
IsVisible = false,
};
var savedAccountTransactions1 = accountTransactionsWebServiceBL.SaveOnlineBankingAccountTransactions(
new List<OnlineBankingAccountTransactionDTO>()
{
transaction1,
transaction2
}, user).ThrowIfError();
var duplicatesSaveResult = accountTransactionsWebServiceBL.SaveOnlineBankingAccountTransactions(
new List<OnlineBankingAccountTransactionDTO>()
{
transaction2,
transaction1
}, user);
if (duplicatesSaveResult.Status != ResultStatus.Warning || duplicatesSaveResult.Data.Count > 0)
throw new Exception("Account transactions with the same data were saved twice. There should be no data duplicates in the table!");
}
private IList<OnlineBankingAccountTransactionDTO> LoadAccountTransactions()
{
using var session = new BLSession();
var accountTransactionsWebServiceBL = session.GetBL<OnlineBankingAccountTransactionsWebServiceBL>();
var user = this.GetLoggedInUser();
var accountTransactions = accountTransactionsWebServiceBL.GetOnlineBankingAccountTransactionsByFilter(
new OnlineBankingAccountTransactionsFilter(), user).ThrowIfError();
this.Verifier.Verify($"OnlineBankingAccountTransactions", accountTransactions.ToList());
return accountTransactions;
}
private void AddCustomerAndAssignmentsManually(IList<OnlineBankingAccountTransactionDTO> accountTransactions)
{
using var session = new BLSession();
var accountTransactionsWebServiceBL = session.GetBL<OnlineBankingAccountTransactionsWebServiceBL>();
var customerWebServiceBL = session.GetBL<CustomerWebServiceBL>();
var receiptWebServiceBL = session.GetBL<ReceiptSearchWebServiceBL>();
var user = this.GetLoggedInUser();
var customers = customerWebServiceBL.GetCustomersByIDs(new List<int>() { 10000, 10003 });
var filter1 = new ReceiptSearchFilter() { ReceiptI3Ds = new List<int>() { 1318, 1372 } };
var receipts1 = receiptWebServiceBL.SearchReceipts(user, filter1, 1, int.MaxValue).ThrowIfError();
var filter2 = new ReceiptSearchFilter() { ReceiptI3Ds = new List<int>() { 6553, 6565 } };
var receipts2 = receiptWebServiceBL.SearchReceipts(user, filter2, 1, int.MaxValue).ThrowIfError();
if (accountTransactions.Count != 2 || customers.Count != 2 || receipts1.Count != 2 || receipts2.Count != 2)
throw new Exception("Expected two objects each for AccountTransactions, Customers and Receipts!");
for(int i=0; i<2; i++)
{
var accountTransaction = accountTransactions[i];
var customer = customers[i];
var receiptSearchResult = i == 0 ? receipts1 : receipts2;
var receipt1 = receiptSearchResult.Result[0];
var receipt2 = receiptSearchResult.Result[1];
accountTransaction.RelatedCustomerI3D = customer.I3D;
accountTransaction.RelatedCustomerName = customer.Name;
accountTransaction.TransactionAssignments.Add(new OnlineBankingTransactionAssignmentDTO()
{
AccountTransactionI3D = accountTransaction.I3D,
ReceiptI3D = receipt1.I3D,
ReceiptObjectKind = (CentronObjectKindNumeric) receipt1.ObjectKind,
ReceiptMatchingRate = 0.5,
BookedReceiptDemandedGrossAmount = receipt1.NetPriceComplete + receipt1.TaxPriceComplete,
ReceiptPaidGrossAmount = receipt1.PaidPrice,
ReceiptOpenGrossAmount = receipt1.OpenPrice,
AssignedAmount = 0m,
ReceiptMatchingHeuristic = OnlineBankingReceiptMatchingHeuristic.ManuallySet,
ReceiptDate = receipt1.DueDate.Value,
ReceiptNumber = receipt1.Number,
ReceiptCaption = receipt1.Caption,
IsBooked = true,
BookedByEmployeeI3D = 44,
BookedDate = new DateTime(new DateOnly(2024, 03, 22), new TimeOnly(10, 00)),
});
accountTransaction.TransactionAssignments.Add(new OnlineBankingTransactionAssignmentDTO()
{
AccountTransactionI3D = accountTransaction.I3D,
ReceiptI3D = receipt2.I3D,
ReceiptObjectKind = (CentronObjectKindNumeric) receipt2.ObjectKind,
ReceiptMatchingRate = 0.5,
BookedReceiptDemandedGrossAmount = receipt2.NetPriceComplete + receipt2.TaxPriceComplete,
ReceiptPaidGrossAmount = receipt2.PaidPrice,
ReceiptOpenGrossAmount = receipt2.OpenPrice,
AssignedAmount = receipt2.OpenPrice,
ReceiptMatchingHeuristic = OnlineBankingReceiptMatchingHeuristic.ManuallySet,
ReceiptDate = receipt2.DueDate.Value,
ReceiptNumber = receipt2.Number,
ReceiptCaption = receipt2.Caption,
IsBooked = false,
BookedByEmployeeI3D = null,
BookedDate = null
});
}
var savedAccountTransactions = accountTransactionsWebServiceBL.SaveOnlineBankingAccountTransactions(accountTransactions.ToList() , user).ThrowIfError();
this.Verifier.Verify($"AccountTransactionsWithManuallyAddedAssignments", accountTransactions.ToList());
}
private void AddCustomerAndAssignmentsAutomatically(IList<OnlineBankingAccountTransactionDTO> accountTransactions)
{
using var session = new BLSession();
var accountTransactionsWebServiceBL = session.GetBL<OnlineBankingAccountTransactionsWebServiceBL>();
var user = this.GetLoggedInUser();
var request = new AutoCompleteAccountTransactionsRequest() { OnlineBankingAccountTransactions = accountTransactions.ToList() };
var updated = accountTransactionsWebServiceBL.AutoCompleteAccountTransacitons(request, user).ThrowIfError();
this.Verifier.Verify($"AccountTransactionsWithAutomaticallyAddedAssignments", updated.ToList());
}
private void TestCheckForUnknownIbans()
{
using var session = new BLSession();
var accountTransactionsBL = session.GetBL<OnlineBankingAccountTransactionsBL>();
var user = this.GetLoggedInUser();
var request1 = new CheckForUnknownIbansRequest
{
IncludeCompleted = true
};
var result1 = accountTransactionsBL.CheckForUnknownIbans(request1, user).ThrowIfError();
this.Verifier.Verify($"CheckForUnknownIbans_IncludeCompleted", result1.ToList());
var request2 = new CheckForUnknownIbansRequest
{
IncludeCompleted = false,
DateFrom = new DateTime(2024, 03, 01),
DateTo = new DateTime(2024, 03, 31)
};
var result2 = accountTransactionsBL.CheckForUnknownIbans(request2, user).ThrowIfError();
this.Verifier.Verify($"CheckForUnknownIbans_WithDateRange", result2.ToList());
}
}
}