using CentronSoftware.Centron.Controls.PositionGrid.Helpers; using CentronSoftware.Centron.Controls.PositionGrid.Interfaces; namespace Centron.Tests.Controls.PositionGrid { /// /// Tests for the Reverse-Charge threshold (Bagatellgrenze) calculation. Reproduces the /// scenario from Ticket 163492: informative/alternative positions must not be counted /// against the threshold, only Standard/Cargo positions do. /// public class ReverseChargeThresholdCalculatorTests { [Fact] public void CalculateThresholdRelevantTotal_ExcludesInformativeAndAlternativePositions() { // Ticket 163492 scenario: two Standard positions (3000 + 1999 = 4999) plus one // informative and two alternative positions (each 3000). Only the Standard net // total (4999) is relevant for the threshold. var positions = new (bool isReverseCharge, ReceiptArticlePositionKind kind, decimal totalPrice)[] { (true, ReceiptArticlePositionKind.Default, 3000m), (true, ReceiptArticlePositionKind.Default, 1999m), (true, ReceiptArticlePositionKind.Informative, 3000m), (true, ReceiptArticlePositionKind.Alternative, 3000m), (true, ReceiptArticlePositionKind.Alternative, 3000m), }; var total = ReverseChargeThresholdCalculator.CalculateThresholdRelevantTotal(positions); Assert.Equal(4999m, total); } [Fact] public void CalculateThresholdRelevantTotal_IncludesCargoPositions() { var positions = new (bool isReverseCharge, ReceiptArticlePositionKind kind, decimal totalPrice)[] { (true, ReceiptArticlePositionKind.Default, 2500m), (true, ReceiptArticlePositionKind.Cargo, 100m), }; var total = ReverseChargeThresholdCalculator.CalculateThresholdRelevantTotal(positions); Assert.Equal(2600m, total); } [Fact] public void CalculateThresholdRelevantTotal_IgnoresNonReverseChargePositions() { var positions = new (bool isReverseCharge, ReceiptArticlePositionKind kind, decimal totalPrice)[] { (true, ReceiptArticlePositionKind.Default, 3000m), (false, ReceiptArticlePositionKind.Default, 5000m), }; var total = ReverseChargeThresholdCalculator.CalculateThresholdRelevantTotal(positions); Assert.Equal(3000m, total); } [Theory] [InlineData(ReceiptArticlePositionKind.Default, true)] [InlineData(ReceiptArticlePositionKind.Cargo, true)] [InlineData(ReceiptArticlePositionKind.Alternative, false)] [InlineData(ReceiptArticlePositionKind.Optional, false)] [InlineData(ReceiptArticlePositionKind.Informative, false)] [InlineData(ReceiptArticlePositionKind.OnDemand, false)] [InlineData(ReceiptArticlePositionKind.OnEffort, false)] [InlineData(ReceiptArticlePositionKind.NoService, false)] [InlineData(ReceiptArticlePositionKind.NoServiceOptional, false)] public void CountsTowardNetTotal_MatchesNetTotalGroupingRules(ReceiptArticlePositionKind kind, bool expected) { Assert.Equal(expected, ReverseChargeThresholdCalculator.CountsTowardNetTotal(kind)); } } }