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().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().CreateFreetextReceiptItem( invoice, "Leistungszeitraum Test")); invoice.Items.Add(item); return invoice; } private ReceiptInvoiceDTO SaveInvoice(ReceiptInvoiceDTO invoice) { return (ReceiptInvoiceDTO)this.TrySaveInvoice(invoice).ThrowIfError().Receipt; } private Result TrySaveInvoice(ReceiptInvoiceDTO invoice) { return this.WithSession(s => s.GetBL().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().GetReceiptByI3D( invoiceI3D, CentronObjectKindNumeric.InvoiceClass)).ThrowIfError(); } private DateTime GetDateFromDatabase(string tableName, string columnName, int i3D) { return this.Sql( $"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); } }