Adds two charts to the per-account transactions view: a stacked bar chart of monthly totals and a pie chart of overall totals, both grouped by booking text, so recurring bookings (rent, subscriptions, etc.) are visible at a glance. Chart components are keyed on the account id so switching accounts remounts them instead of reusing a stale Plotly instance.
54 lines
1.8 KiB
C#
54 lines
1.8 KiB
C#
using Schaad.Accounting.Datasets;
|
|
using Schaad.Accounting.Models;
|
|
using Shouldly;
|
|
|
|
namespace Schaad.Accounting.Tests;
|
|
|
|
public class TransactionDatasetTestShould
|
|
{
|
|
private static Account MakeAccount(string id) => new() { Id = id, Name = id, Currency = "CHF" };
|
|
|
|
private static TransactionDataset MakeTransaction(Account origin, Account target, decimal value, decimal? fxRate = null) =>
|
|
new(
|
|
new Transaction
|
|
{
|
|
Id = Guid.NewGuid().ToString(),
|
|
OriginAccountId = origin.Id,
|
|
TargetAccountId = target.Id,
|
|
Value = value,
|
|
FxRate = fxRate,
|
|
ValueDate = DateTime.Now,
|
|
BookingDate = DateTime.Now
|
|
},
|
|
origin, target);
|
|
|
|
[Fact]
|
|
public void ReturnNegativeValueWhenAccountIsOrigin()
|
|
{
|
|
var checking = MakeAccount("chk");
|
|
var groceries = MakeAccount("groc");
|
|
var transaction = MakeTransaction(checking, groceries, value: 50m);
|
|
|
|
transaction.GetValue(withFxRate: false, accountId: "chk").ShouldBe(-50m);
|
|
}
|
|
|
|
[Fact]
|
|
public void ReturnPositiveValueWhenAccountIsTarget()
|
|
{
|
|
var checking = MakeAccount("chk");
|
|
var groceries = MakeAccount("groc");
|
|
var transaction = MakeTransaction(groceries, checking, value: 50m);
|
|
|
|
transaction.GetValue(withFxRate: false, accountId: "chk").ShouldBe(50m);
|
|
}
|
|
|
|
[Fact]
|
|
public void ApplyFxConversionBeforeApplyingSignWhenAccountIsOrigin()
|
|
{
|
|
var checking = MakeAccount("chk");
|
|
var groceries = MakeAccount("groc");
|
|
var transaction = MakeTransaction(checking, groceries, value: 100m, fxRate: 0.5m);
|
|
|
|
transaction.GetValue(withFxRate: true, accountId: "chk").ShouldBe(-200m);
|
|
}
|
|
}
|