Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ public DocumentAmounts Calculate(IReadOnlyList<InvoiceLineItem> lineItems, IRoun

foreach (var (item, originalIndex) in group)
{
var itemGross = item.TotalGrossWith(discountBehavior, rounding).Round(rounding);
var itemDiscount = item.DiscountAmountNetWith(discountBehavior, rounding).Round(rounding);
var (itemGross, itemDiscount) = item.CalculateGrossAndNetDiscount(discountBehavior, rounding);

sumGross += itemGross;
Comment on lines +53 to 55
sumDiscount += itemDiscount;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ public DocumentAmounts Calculate(IReadOnlyList<InvoiceLineItem> lineItems, IRoun

foreach (var (item, originalIndex) in group)
{
var itemNet = item.TotalNetWith(discountBehavior, rounding).Round(rounding);
var itemDiscount = item.DiscountAmountNetWith(discountBehavior, rounding).Round(rounding);
var (itemNet, itemDiscount) = item.CalculateNetAndDiscount(discountBehavior, rounding);

sumNet += itemNet;
sumDiscount += itemDiscount;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ internal interface IVatCalculationStrategy

DocumentAmounts Calculate(IReadOnlyList<InvoiceLineItem> lineItems, IRoundingStrategy rounding, IAbsoluteDiscountBehavior discountBehavior);

DocumentAmounts Calculate(IReadOnlyList<InvoiceLineItem> lineItems, IRoundingStrategy rounding)
=> Calculate(lineItems, rounding, FromTotalAbsoluteDiscountBehavior.Instance);

/// <summary>
/// Converts a per-rate FCY summary to base currency using this strategy's authoritative field.
/// Each strategy knows which field drives the others, so the conversion mirrors that hierarchy.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ public DocumentAmounts Calculate(IReadOnlyList<InvoiceLineItem> lineItems, IRoun
var itemAmounts = lineItems
.Select(item =>
{
var net = item.TotalNetWith(discountBehavior, rounding).Round(rounding);
var discount = item.DiscountAmountNetWith(discountBehavior, rounding).Round(rounding);
var (net, discount) = item.CalculateNetAndDiscount(discountBehavior, rounding);
return LineItemAmounts.FromNet(net, item.VatRate, rounding, discount);
})
.ToList();
Expand Down
28 changes: 26 additions & 2 deletions src/Inflop.VatSharp/ValueObjects/InvoiceLineItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,34 @@ internal Money TotalGrossWith(IAbsoluteDiscountBehavior discountBehavior, IRound
: VatRate.GrossFromNet(totalInInputType);
}

/// <summary>
/// Returns rounded net and net-equivalent discount in a single call,
/// avoiding a redundant second invocation of <see cref="TotalNetWith"/>.
/// </summary>
internal (Money Net, Money Discount) CalculateNetAndDiscount(IAbsoluteDiscountBehavior discountBehavior, IRoundingStrategy rounding)
{
var net = TotalNetWith(discountBehavior, rounding);
var discount = Discount.HasValue ? TotalNetBeforeDiscount - net : Money.Zero;
return (net.Round(rounding), discount.Round(rounding));
}

/// <summary>
/// Returns rounded gross and net-equivalent discount in a single call,
/// avoiding a redundant second invocation of <see cref="TotalGrossWith"/> via
/// <see cref="DiscountAmountNetWith"/>.
Comment on lines +111 to +112
/// </summary>
internal (Money Gross, Money NetDiscount) CalculateGrossAndNetDiscount(IAbsoluteDiscountBehavior discountBehavior, IRoundingStrategy rounding)
{
var gross = TotalGrossWith(discountBehavior, rounding);
var netDiscount = Discount.HasValue
? TotalNetBeforeDiscount - VatRate.NetFromGross(gross)
: Money.Zero;
return (gross.Round(rounding), netDiscount.Round(rounding));
}

internal LineItemAmounts Calculate(IRoundingStrategy rounding, IAbsoluteDiscountBehavior discountBehavior)
{
var net = TotalNetWith(discountBehavior, rounding).Round(rounding);
var discount = DiscountAmountNetWith(discountBehavior, rounding).Round(rounding);
var (net, discount) = CalculateNetAndDiscount(discountBehavior, rounding);
return LineItemAmounts.FromNet(net, VatRate, rounding, discount);
}

Expand Down
2 changes: 1 addition & 1 deletion src/Inflop.VatSharp/ValueObjects/Quantity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public sealed record Quantity : IComparable<Quantity>
public static Quantity Of(int value) => new(value);

/// <summary>A quantity of exactly one.</summary>
public static Quantity One => new(1m);
public static readonly Quantity One = Of(1);
Comment on lines 30 to +31

/// <inheritdoc />
public int CompareTo(Quantity? other)
Expand Down
2 changes: 1 addition & 1 deletion tests/Inflop.VatSharp.Tests/Inflop.VatSharp.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
<IsPackable>false</IsPackable>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
Expand Down
Loading