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
This commit is contained in:
Christoph Schwörer
2026-08-26 07:43:51 +02:00
parent 18edae75b6
commit f045b99a25
24664 changed files with 5846716 additions and 1 deletions
@@ -0,0 +1,146 @@
using Centron.BusinessLogic;
using Centron.BusinessLogic.Administration.Settings;
using Centron.BusinessLogic.EmployeeArea;
using Centron.BusinessLogic.WebServices.Sales.Receipts;
using Centron.Data.WebServices.Sales.Receipts.Invoices;
using Centron.Interfaces;
using Centron.Tests.EndToEnd.Infrastructure;
using Centron.Tests.EndToEnd.Infrastructure.Verifier;
using CentronSoftware.Centron.WebServices.Entities.Sales.CustomerAssets.TimerBilling;
using Xunit.Abstractions;
namespace Centron.Tests.EndToEnd.TicketTests.Ticket87016
{
public class Ticket87016Test : EndToEndTest
{
public static readonly int HelpdeskI3D = 10461;
public static readonly int HelpdeskTimerI3D = 10509;
public static readonly int HelpdeskTimerArticleI3D = 94;
public static readonly int SpecialArticleFirstI3D = 6228;
public static readonly int SpecialArticleSecondI3D = 6229;
public static readonly int GlobalDriveArticleFirstI3D = 1;
public static readonly int GlobalDriveArticleSecondI3D = 7;
public static readonly int ContractI3D = 28;
public Ticket87016Test(ITestOutputHelper testOutputHelper)
: base(testOutputHelper)
{
}
public override void Execute()
{
this.PrepareDatabase();
// We will create many invoices here from the same single timer
// But we will make some changes to the database between each run, to make sure everything works as expected
//
// So the current state in the database looks like this
//
// Ticket:
// I3D 10461, Number 12475, AddressI3D 1
// Timer:
// I3D 10509, ArticleI3D 94, Timer 407 Seconds, ContractI3D 28
// Special Articles:
// I3D 6228, ArticleI3D 56, Type 0 (Fixed Price), Price 35
// I3D 6229, ArticleI3D 1184, Type 1 (Multiplicator), Multiplier 44
// Global Drive Articles:
// I3D 1, AddressI3D 1, ArticleI3D 56, Type 0 (Fixed Price), Price 35
// I3D 7, AddressI3D 1, ArticleI3D 1184, Type 1(Multiplicator), Multiplier 44
//
// There are NO special prices at the contract
this.CreateOriginalInvoice();
this.CreateInvoiceWithSpecialArticlePriceZero();
this.CreateInvoiceWithCustomPrice();
this.CreateInvoiceWithContractPriceForTimer();
}
private void PrepareDatabase()
{
this.Sql($"UPDATE dbo.Stammdat SET WertText = 'g' WHERE I3D = {(int)AppSettingsConst.HelpdeskTimerStartTimeFormat}");
this.Sql($"UPDATE dbo.Stammdat SET WertText = 'g' WHERE I3D = {(int)AppSettingsConst.HelpdeskTimerEndTimeFormat}");
}
private void CreateOriginalInvoice()
{
// Original Invoice should have the following prices
// Time: 30 €, Quantity 1
// SpecialArticle 56: 35 €, Quantity 1
// SpecialArticle 1184: 1 €, Quantity 44
this.CreateInvoice("Original");
}
private void CreateInvoiceWithSpecialArticlePriceZero()
{
// Set SpecialArticle Price to 0, so the global drive article price should be used
this.Sql($"UPDATE dbo.HelpdeskTimerSpecialArticles SET Price = 0 WHERE I3D = {SpecialArticleFirstI3D}");
this.Sql($"UPDATE dbo.AnschriftSonderartikel SET Preis = 20 WHERE I3D = {GlobalDriveArticleFirstI3D}");
// So now the prices should be
// Time: 30 €, Quantity 1
// SpecialArticle 56: 20 €, Quantity 1
// SpecialArticle 1184: 1 €, Quantity 44
this.CreateInvoice("SpecialArticlePriceZero");
// Reset back to default values
this.Sql($"UPDATE dbo.HelpdeskTimerSpecialArticles SET Price = 35 WHERE I3D = {SpecialArticleFirstI3D}");
this.Sql($"UPDATE dbo.AnschriftSonderartikel SET Preis = 35 WHERE I3D = {GlobalDriveArticleFirstI3D}");
}
private void CreateInvoiceWithCustomPrice()
{
// Set SpecialArticle Price to 50, making sure the custom price is going to be used
this.Sql($"UPDATE dbo.HelpdeskTimerSpecialArticles SET Price = 50 WHERE I3D = {SpecialArticleFirstI3D}");
// So now the prices should be
// Time: 30 €, Quantity 1
// SpecialArticle 56: 50 €, Quantity 1
// SpecialArticle 1184: 1 €, Quantity 44
this.CreateInvoice("CustomSpecialPrice");
// Reset back to default values
this.Sql($"UPDATE dbo.HelpdeskTimerSpecialArticles SET Price = 35 WHERE I3D = {SpecialArticleFirstI3D}");
}
private void CreateInvoiceWithContractPriceForTimer()
{
// Add a contract price for this contract and the timer article
this.Sql($"INSERT INTO dbo.VertragBepreisungArtikel (VertragI3D, ArtikelI3D, Aenderungsart, Aenderungsweise, Aenderungswert, Status)" +
$"VALUES({ContractI3D}, {HelpdeskTimerArticleI3D}, 3, 1, 80, 1)");
// So now the prices should be
// Time: 80 €, Quantity 1
// SpecialArticle 56: 35 €, Quantity 1
// SpecialArticle 1184: 1 €, Quantity 44
this.CreateInvoice("ContractPriceForTimer");
// Reset back to default values
this.Sql($"DELETE FROM dbo.VertragBepreisungArtikel WHERE VertragI3D = {ContractI3D} AND ArtikelI3D = {HelpdeskTimerArticleI3D}");
}
private void CreateInvoice(string name)
{
using (var session = new BLSession())
{
var user = session.GetBL<AppUserBL>().GetAppUser(f => f.I3D == 11);
var settings = new TimerBillingSettingsDTO
{
InsertHelpdeskDescription = true,
InsertHelpdeskShortDescription = true,
InsertTimerText = true,
InsertTimerTime = true,
InsertTheFollowingAreTimersFromHelpdeskText = true,
Sorting = Interfaces.Sales.Receipts.TimerBilling.TimerSorting.ChronologicalUp,
ReceiptKind = CentronObjectKindNumeric.InvoiceClass,
};
var invoiceResult = session.GetBL<ReceiptWebServiceBL>().CreateNewReceiptForHelpdekTimers(new[] { HelpdeskTimerI3D }, settings, user);
var verifierSettings = new CentronVerifierSettings();
verifierSettings.IgnoreProperty<ReceiptInvoiceItemDTO>(f => f.BalanceID);
this.Verifier.Verify(name, invoiceResult, verifierSettings);
}
}
}
}