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
142 lines
5.1 KiB
C#
142 lines
5.1 KiB
C#
using System;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using Centron.BusinessLogic.Sales.Receipts.DataAndResults;
|
|
using Centron.BusinessLogic.WebServices.Sales.Receipts;
|
|
using Centron.BusinessLogic.WebServices.Sales.Receipts.DataAndResults;
|
|
using Centron.Core.Extensions;
|
|
using Centron.DAO.AdoNETDataAccess;
|
|
using Centron.Data.WebServices.Sales.Receipts.Invoices;
|
|
using Centron.Interfaces;
|
|
using Centron.Interfaces.Administration.Environment;
|
|
using Centron.Interfaces.BL;
|
|
using Centron.Tests.EndToEnd.Infrastructure;
|
|
using Xunit;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace Centron.Tests.EndToEnd.TicketTests.Ticket160877;
|
|
|
|
public class Ticket160877Tests : EndToEndTest
|
|
{
|
|
private const int CustomerI3D = 10022;
|
|
|
|
public Ticket160877Tests(ITestOutputHelper testOutputHelper)
|
|
: base(testOutputHelper)
|
|
{
|
|
}
|
|
|
|
public override void Execute()
|
|
{
|
|
var headerFrom = new DateTime(2026, 1, 1, 10, 0, 0);
|
|
var headerTo = new DateTime(2026, 1, 31, 13, 30, 0);
|
|
var itemFrom = new DateTime(2026, 2, 1, 10, 0, 0);
|
|
var itemTo = new DateTime(2026, 2, 28, 13, 30, 0);
|
|
|
|
var invoice = this.CreateInvoice();
|
|
invoice.ServicePeriodFrom = headerFrom;
|
|
invoice.ServicePeriodTo = headerTo;
|
|
invoice.Items.Single().ServicePeriodFrom = itemFrom;
|
|
invoice.Items.Single().ServicePeriodTo = itemTo;
|
|
|
|
var savedInvoice = this.SaveInvoice(invoice);
|
|
AssertServicePeriod(savedInvoice, headerFrom, headerTo, itemFrom, itemTo);
|
|
|
|
var loadedInvoice = this.LoadInvoice(savedInvoice.I3D);
|
|
AssertServicePeriod(loadedInvoice, headerFrom, headerTo, itemFrom, itemTo);
|
|
|
|
Assert.Equal(headerFrom, this.GetDateFromDatabase("dbo.RechKopf", "ServicePeriodFrom", savedInvoice.I3D));
|
|
Assert.Equal(headerTo, this.GetDateFromDatabase("dbo.RechKopf", "ServicePeriodTo", savedInvoice.I3D));
|
|
Assert.Equal(itemFrom, this.GetDateFromDatabase("dbo.RechPos", "ServicePeriodFrom", savedInvoice.Items.Single().I3D));
|
|
Assert.Equal(itemTo, this.GetDateFromDatabase("dbo.RechPos", "ServicePeriodTo", savedInvoice.Items.Single().I3D));
|
|
|
|
this.AssertInvalidHeaderServicePeriodIsRejected();
|
|
}
|
|
|
|
private ReceiptInvoiceDTO CreateInvoice()
|
|
{
|
|
var invoice = (ReceiptInvoiceDTO)this.WithSession(s => s.GetBL<ReceiptWebServiceBL>().CreateNewReceipt(
|
|
CentronObjectKindNumeric.InvoiceClass,
|
|
this.GetLoggedInUser(),
|
|
CustomerI3D,
|
|
new CreateReceiptData
|
|
{
|
|
IgnoreCallbacks = true,
|
|
},
|
|
addressI3D: null,
|
|
contactPersonI3D: null,
|
|
insertSalutationAndAgreement: true,
|
|
ignoreDefaultContract: false,
|
|
insertCustomerDiscount: true)).ThrowIfError().Receipt;
|
|
|
|
invoice.Items.Clear();
|
|
|
|
var item = (ReceiptInvoiceItemDTO)this.WithSession(s => s.GetBL<ReceiptItemWebServiceBL>().CreateFreetextReceiptItem(
|
|
invoice,
|
|
"Leistungszeitraum Test"));
|
|
invoice.Items.Add(item);
|
|
|
|
return invoice;
|
|
}
|
|
|
|
private ReceiptInvoiceDTO SaveInvoice(ReceiptInvoiceDTO invoice)
|
|
{
|
|
return (ReceiptInvoiceDTO)this.TrySaveInvoice(invoice).ThrowIfError().Receipt;
|
|
}
|
|
|
|
private Result<SaveReceiptResultDTO> TrySaveInvoice(ReceiptInvoiceDTO invoice)
|
|
{
|
|
return this.WithSession(s => s.GetBL<ReceiptWebServiceBL>().SaveReceipt(
|
|
invoice,
|
|
this.GetLoggedInUser().User,
|
|
new SaveReceiptData
|
|
{
|
|
IgnoreCallbacks = true,
|
|
},
|
|
autoLockIfNewReceipt: false,
|
|
CreatedThroughApplication.WebServices,
|
|
receiptTemplateFolderI3D: null));
|
|
}
|
|
|
|
private ReceiptInvoiceDTO LoadInvoice(int invoiceI3D)
|
|
{
|
|
return (ReceiptInvoiceDTO)this.WithSession(s => s.GetBL<ReceiptWebServiceBL>().GetReceiptByI3D(
|
|
invoiceI3D,
|
|
CentronObjectKindNumeric.InvoiceClass)).ThrowIfError();
|
|
}
|
|
|
|
private DateTime GetDateFromDatabase(string tableName, string columnName, int i3D)
|
|
{
|
|
return this.Sql<DateTime>(
|
|
$"SELECT {columnName} FROM {tableName} WHERE I3D = @I3D",
|
|
command => command.AddParameter("I3D", i3D, DbType.Int32));
|
|
}
|
|
|
|
private static void AssertServicePeriod(
|
|
ReceiptInvoiceDTO invoice,
|
|
DateTime headerFrom,
|
|
DateTime headerTo,
|
|
DateTime itemFrom,
|
|
DateTime itemTo)
|
|
{
|
|
Assert.Equal(headerFrom, invoice.ServicePeriodFrom);
|
|
Assert.Equal(headerTo, invoice.ServicePeriodTo);
|
|
|
|
var item = invoice.Items.Single();
|
|
Assert.Equal(itemFrom, item.ServicePeriodFrom);
|
|
Assert.Equal(itemTo, item.ServicePeriodTo);
|
|
}
|
|
|
|
private void AssertInvalidHeaderServicePeriodIsRejected()
|
|
{
|
|
var invoice = this.CreateInvoice();
|
|
invoice.ServicePeriodFrom = new DateTime(2026, 3, 1, 14, 0, 0);
|
|
invoice.ServicePeriodTo = new DateTime(2026, 3, 1, 13, 0, 0);
|
|
|
|
var result = this.TrySaveInvoice(invoice);
|
|
|
|
Assert.Equal(ResultStatus.Error, result.Status);
|
|
Assert.Contains("im Belegkopf", result.Message);
|
|
Assert.Contains("nicht nach", result.Message);
|
|
}
|
|
}
|