Files
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

338 lines
15 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using Centron.BusinessLogic.Finances.IncomingPayments;
using Centron.BusinessLogic.WebServices.Finances.Payments;
using Centron.BusinessLogic.WebServices.Sales.Receipts;
using Centron.BusinessLogic.WebServices.Sales.Receipts.ReceiptSearch;
using Centron.Core;
using Centron.Data.WebServices.Sales.Receipts.ReceiptSearch;
using Centron.Interfaces;
using Centron.Interfaces.BL;
using Centron.Interfaces.Sales.Receipts.ReceiptSearch;
using Centron.Tests.EndToEnd.Infrastructure;
using CentronSoftware.Centron.WebServices.Entities.Finances.Payments.IncomingPayments;
using Xunit;
using Xunit.Abstractions;
using NotImplementedException = System.NotImplementedException;
namespace Centron.Tests.EndToEnd.Tests.IncomingPayment;
public class IncomingPaymentTest: EndToEndTest
{
private int invoiceHeadI3D_2 = 6586;
private int invoiceHeadI3D_1 = 6576;
public IncomingPaymentTest(ITestOutputHelper testOutputHelper) : base(testOutputHelper)
{
}
public override void Execute()
{
var createdI3Ds = this.CreateIncomingPayments();
this.DeleteIncomingPayments(createdI3Ds);
this.TestSearchFilter();
}
private List<int> CreateIncomingPayments()
{
this.CreateIncomingPayments_1();
return this.CreateIncomingPayments_2();
}
private void CreateIncomingPayments_1()
{
var loggedInUser = this.GetLoggedInUser();
var receipt = this.GetInvoice(this.invoiceHeadI3D_1);
var newAmountPaid = 5;
var changedReceipt = this.WithSession(f => f.GetBL<ReceiptWebServiceBL>().UpdateReceiptIsPaid(
CentronObjectKindNumeric.InvoiceClass,
this.invoiceHeadI3D_1,
true,
(newAmountPaid + receipt.PaidPrice) * receipt.CurrencyFactor,
null,
null,
loggedInUser.User)).ThrowIfError();
this.Verifier.Verify("05_paidReceipt", changedReceipt);
IncomingPaymentDTO incomingPayment = new()
{
Amount = newAmountPaid,
Number = receipt.Number,
CreatedAt = new DateTime(1970,1,1),
InvoiceAmount = receipt.TaxPriceComplete + receipt.NetPriceComplete,
PaymentDate = DateTime.Now,
Comment = "What do you call a vampire with Alzheimer’s? A nos forgot to.",
ResidualAmount = (receipt.TaxPriceComplete + receipt.NetPriceComplete) - (receipt.PaidPrice + newAmountPaid),
AccountStatementDate = null,
AccountStatementNumber = 1234,
EmployeeI3D = loggedInUser.User.Employee.I3D,
InvoiceHeadI3D = receipt.I3D,
IsClosed = true
};
var savedIncomingPayment = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().SaveIncomingPayment(incomingPayment)).ThrowIfError();
this.Verifier.Verify("05_incomingPaymentForPaidReceipt", savedIncomingPayment);
}
private List<int> CreateIncomingPayments_2()
{
var loggedInUser = this.GetLoggedInUser();
var receipt = this.GetInvoice(invoiceHeadI3D_2);
var tithe = receipt.OpenPrice % 10;
var paidPrice = tithe * receipt.CurrencyFactor;
var changedReceiptOne = this.WithSession(f => f.GetBL<ReceiptWebServiceBL>().UpdateReceiptIsPaid(
CentronObjectKindNumeric.InvoiceClass,
this.invoiceHeadI3D_1,
null,
paidPrice,
null,
null,
loggedInUser.User)).ThrowIfError();
this.Verifier.Verify("01_partlyPaidReceipt", changedReceiptOne);
IncomingPaymentDTO incomingPaymentOne = new()
{
Amount = paidPrice,
Number = receipt.Number,
CreatedAt = new DateTime(1970,1,1),
InvoiceAmount = receipt.TaxPriceComplete + receipt.NetPriceComplete,
PaymentDate = DateTime.Now,
Comment = "What do you call a ship full of buddies? A friendship.",
ResidualAmount = (receipt.TaxPriceComplete + receipt.NetPriceComplete) - (receipt.PaidPrice + tithe),
AccountStatementDate = null,
AccountStatementNumber = 1234,
EmployeeI3D = loggedInUser.User.Employee.I3D,
InvoiceHeadI3D = receipt.I3D,
IsClosed = false
};
var savedIncomingPaymentOne = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().SaveIncomingPayment(incomingPaymentOne)).ThrowIfError();
this.Verifier.Verify("01_incomingPaymentForPartlyPaidReceipt", savedIncomingPaymentOne);
paidPrice += (tithe * 2) * receipt.CurrencyFactor;
var changedReceiptTwo = this.WithSession(f => f.GetBL<ReceiptWebServiceBL>().UpdateReceiptIsPaid(
CentronObjectKindNumeric.InvoiceClass,
this.invoiceHeadI3D_1,
null,
paidPrice,
null,
null,
loggedInUser.User)).ThrowIfError();
this.Verifier.Verify("02_partlyPaidReceipt", changedReceiptTwo);
IncomingPaymentDTO incomingPaymentTwo = new()
{
Amount = paidPrice,
Number = receipt.Number,
CreatedAt = new DateTime(1970,2,2),
InvoiceAmount = receipt.TaxPriceComplete + receipt.NetPriceComplete,
PaymentDate = DateTime.Now,
Comment = "Why did the grape cross the road? No raisin.",
ResidualAmount = (receipt.TaxPriceComplete + receipt.NetPriceComplete) - (receipt.PaidPrice + tithe),
AccountStatementDate = null,
AccountStatementNumber = 1234,
EmployeeI3D = loggedInUser.User.Employee.I3D,
InvoiceHeadI3D = receipt.I3D,
IsClosed = false
};
var savedIncomingPaymentTwo = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().SaveIncomingPayment(incomingPaymentTwo)).ThrowIfError();
this.Verifier.Verify("02_incomingPaymentForPartlyPaidReceipt", savedIncomingPaymentTwo);
paidPrice += (tithe * 3) * receipt.CurrencyFactor;
var changedReceiptThree = this.WithSession(f => f.GetBL<ReceiptWebServiceBL>().UpdateReceiptIsPaid(
CentronObjectKindNumeric.InvoiceClass,
this.invoiceHeadI3D_1,
null,
paidPrice,
null,
null,
loggedInUser.User)).ThrowIfError();
this.Verifier.Verify("03_partlyPaidReceipt", changedReceiptThree);
IncomingPaymentDTO incomingPaymentThree = new()
{
Amount = paidPrice,
Number = receipt.Number,
CreatedAt = new DateTime(1970,3,3),
InvoiceAmount = receipt.TaxPriceComplete + receipt.NetPriceComplete,
PaymentDate = DateTime.Now,
Comment = "My friend just sprayed some deodorant in my mouth. Now I have some weird Axe scent.",
ResidualAmount = (receipt.TaxPriceComplete + receipt.NetPriceComplete) - (receipt.PaidPrice + tithe),
AccountStatementDate = null,
AccountStatementNumber = 1234,
EmployeeI3D = loggedInUser.User.Employee.I3D,
InvoiceHeadI3D = receipt.I3D,
IsClosed = false
};
var savedIncomingPaymentThree = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().SaveIncomingPayment(incomingPaymentThree)).ThrowIfError();
this.Verifier.Verify("03_incomingPaymentForPartlyPaidReceipt", savedIncomingPaymentThree);
paidPrice += (tithe * 4) * receipt.CurrencyFactor;
var changedReceiptFour = this.WithSession(f => f.GetBL<ReceiptWebServiceBL>().UpdateReceiptIsPaid(
CentronObjectKindNumeric.InvoiceClass,
this.invoiceHeadI3D_1,
null,
paidPrice,
null,
null,
loggedInUser.User)).ThrowIfError();
this.Verifier.Verify("04_partlyPaidReceiptWhichIsNowPaid", changedReceiptFour);
IncomingPaymentDTO incomingPaymentFour = new()
{
Amount = paidPrice,
Number = receipt.Number,
CreatedAt = new DateTime(1970,4,4),
InvoiceAmount = receipt.TaxPriceComplete + receipt.NetPriceComplete,
PaymentDate = DateTime.Now,
Comment = "What do you call a Buddhist Squirrel? A chipmunk.",
ResidualAmount = (receipt.TaxPriceComplete + receipt.NetPriceComplete) - (receipt.PaidPrice + tithe),
AccountStatementDate = null,
AccountStatementNumber = 1234,
EmployeeI3D = loggedInUser.User.Employee.I3D,
InvoiceHeadI3D = receipt.I3D,
IsClosed = true
};
var savedIncomingPaymentFour = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().SaveIncomingPayment(incomingPaymentFour)).ThrowIfError();
this.Verifier.Verify("04_incomingPaymentForPartlyPaidReceipt", savedIncomingPaymentFour);
return new List<int>() { savedIncomingPaymentOne.I3D, savedIncomingPaymentTwo.I3D, savedIncomingPaymentThree.I3D, savedIncomingPaymentFour.I3D };
}
private void DeleteIncomingPayments(List<int> incomingPaymentI3Ds)
{
this.DeleteIncomingPayments_1();
this.DeleteIncomingPayments_2(incomingPaymentI3Ds);
this.DeleteIncomingPayments_3();
}
private void DeleteIncomingPayments_2(List<int> incomingPaymentI3Ds)
{
Guard.Not(incomingPaymentI3Ds.Count != 4, "something went wrong with the incomingPaymentI3Ds");
var incomingPaymentsFilter = new IncomingPaymentsFilter()
{
IncomingPaymentI3Ds = incomingPaymentI3Ds
};
var incomingPayments = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().GetIncomingPayments(incomingPaymentsFilter)).ThrowIfError();
this.Verifier.Verify("07_incomingPayment_BeforeDeletingByPaymentI3D", incomingPayments);
var receiptBeforeDeleting = this.GetInvoice(invoiceHeadI3D_2);
var deleteIncomingPaymentFilter= new DeleteIncomingPaymentFilter()
{
IncomingPaymentI3Ds = new List<int> { incomingPaymentI3Ds[0], incomingPaymentI3Ds[3] },
DontChangeInvoice = false,
};
this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().DeleteIncomingPayment(deleteIncomingPaymentFilter, this.GetLoggedInUser())).ThrowIfError();
var incomingPaymentsAfterDeleting = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().GetIncomingPayments(incomingPaymentsFilter)).ThrowIfError();
this.Verifier.Verify("07_incomingPayment_AfterDeletingByPaymentI3D", incomingPaymentsAfterDeleting);
var receiptAfterDeleting = this.GetInvoice(invoiceHeadI3D_2);
Assert.NotEqual(receiptBeforeDeleting.PaidPrice, receiptAfterDeleting.PaidPrice);
this.Verifier.Verify("07_receipt_AfterDeleting", receiptBeforeDeleting);
}
private void DeleteIncomingPayments_1()
{
var incomingPaymentsFilter = new IncomingPaymentsFilter()
{
InvoiceHeadI3Ds = new List<int>(){invoiceHeadI3D_1}
};
var incomingPaymentsBeforeDeleting = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().GetIncomingPayments(incomingPaymentsFilter)).ThrowIfError();
this.Verifier.Verify("08_incomingPayment_BeforeDeletingByInvoiceI3D", incomingPaymentsBeforeDeleting);
var receiptBeforeDeleting = this.GetInvoice(invoiceHeadI3D_2);
var deleteIncomingPaymentFilter = new DeleteIncomingPaymentFilter()
{
InvoiceHeadI3Ds = new List<int>() { invoiceHeadI3D_1 }
};
this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().DeleteIncomingPayment(deleteIncomingPaymentFilter, this.GetLoggedInUser())).ThrowIfError();
var incomingPaymentsAfterDeleting = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().GetIncomingPayments(incomingPaymentsFilter)).ThrowIfError();
this.Verifier.Verify("08_incomingPaymnets_AfterDeletingByInvoiceI3D", incomingPaymentsAfterDeleting);
var receiptAfterDeleting = this.GetInvoice(invoiceHeadI3D_1);
Assert.NotEqual(receiptBeforeDeleting.PaidPrice, receiptAfterDeleting.PaidPrice);
this.Verifier.Verify("08_receipt_AfterDeletingByInvoiceI3D", receiptBeforeDeleting);
}
private void DeleteIncomingPayments_3()
{
var incomingPaymentsFilter = new IncomingPaymentsFilter();
var incomingPaymentsBeforeDeleting = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().GetIncomingPayments(incomingPaymentsFilter)).ThrowIfError();
this.Verifier.Verify("09_incomingPayment_BeforeDeletingByInvoiceNumber", incomingPaymentsBeforeDeleting);
var receiptBeforeDeleting = this.GetInvoice(invoiceHeadI3D_2);
//this should deletes entries with the invoiceHeadI3D 6586 (the receipt has the number 40286)
var deleteIncomingPaymentFilter= new DeleteIncomingPaymentFilter()
{
InvoiceNumbers = new List<int> { 40286 },
};
this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().DeleteIncomingPayment(deleteIncomingPaymentFilter, this.GetLoggedInUser())).ThrowIfError();
var incomingPaymentsAfterDeleting = this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().GetIncomingPayments(incomingPaymentsFilter)).ThrowIfError();
this.Verifier.Verify("09_incomingPayments_AfterDeletingByInvoiceNumber", incomingPaymentsAfterDeleting);
var receiptAfterDeleting = this.GetInvoice(invoiceHeadI3D_1);
Assert.NotEqual(receiptBeforeDeleting.PaidPrice, receiptAfterDeleting.PaidPrice);
}
private void TestSearchFilter()
{
var filter = new IncomingPaymentsFilter();
filter.IncomingPaymentI3Ds = new List<int>();
filter.InvoiceHeadI3Ds = new List<int>();
for (int i = 0; i < 2500; i++)
{
filter.IncomingPaymentI3Ds.Add(i);
filter.InvoiceHeadI3Ds.Add(i);
}
//we don't care about the result, the method just need to finish, to see if the sql throws an error about the more than 2100 parameters
this.WithSession(f => f.GetBL<PaymentsWebServiceBL>().GetIncomingPayments(filter)).ThrowIfError();
}
private ReceiptSearchItemDTO GetInvoice(int invoiceHeadI3D)
{
var filter = new ReceiptSearchFilter()
{
ReceiptI3Ds = new List<int>() { invoiceHeadI3D },
ReceiptKinds = new List<CentronObjectKindNumeric>() { CentronObjectKindNumeric.InvoiceClass },
IncludeClosedReceipts = true
};
var searchedReceipt = this.WithSession(f => f.GetBL<ReceiptSearchWebServiceBL>().SearchReceipts(this.GetLoggedInUser(), filter, 1, int.MaxValue)).ThrowIfError();
return searchedReceipt.Result.First();
}
}