Show transactions in account currency, not always CHF

- Display transaction amounts and total in the account's own currency
  using GetValue(isFxAccount) so FX accounts show their foreign amount
- Fix SaveTransaction/GetTransaction to apply FX conversion when either
  the origin or target account is an FX account, not only origin

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Claudio Schaad 2026-05-23 16:03:39 +02:00
parent 2c91ac7082
commit 5809ee2059
2 changed files with 13 additions and 10 deletions

View file

@ -31,18 +31,18 @@ namespace Schaad.Accounting.Repositories
public void SaveTransaction(Transaction transaction) public void SaveTransaction(Transaction transaction)
{ {
transaction.Value = Math.Abs(transaction.Value); transaction.Value = Math.Abs(transaction.Value);
// prevent saving fxrate for chf account
var isFxAccount = accountRepository.GetAccount(transaction.OriginAccountId).IsFxAccount;
// if source account is fx account, we pass a foreign value -> calc to chf var originIsFx = accountRepository.GetAccount(transaction.OriginAccountId).IsFxAccount;
var targetIsFx = accountRepository.GetAccount(transaction.TargetAccountId).IsFxAccount;
var isFxAccount = originIsFx || targetIsFx;
// user enters amount in the foreign account's currency -> convert to CHF for storage
if (isFxAccount && transaction.FxRate != 0) if (isFxAccount && transaction.FxRate != 0)
{ {
transaction.Value = transaction.Value * transaction.FxRate.Value; transaction.Value = transaction.Value * transaction.FxRate.Value;
} }
isFxAccount |= accountRepository.GetAccount(transaction.TargetAccountId).IsFxAccount; if (!isFxAccount)
if (isFxAccount == false)
{ {
transaction.FxRate = null; transaction.FxRate = null;
} }
@ -69,8 +69,9 @@ namespace Schaad.Accounting.Repositories
var transactions = GetTransactionList(); var transactions = GetTransactionList();
var transaction = transactions.FirstOrDefault(t => t.Id == id); var transaction = transactions.FirstOrDefault(t => t.Id == id);
// if source account is fx account, we save in chf currency -> calc to foreign currency for display // value is stored in CHF -> convert back to foreign currency for display/editing
var isFxAccount = accountRepository.GetAccount(transaction.OriginAccountId).IsFxAccount; var isFxAccount = accountRepository.GetAccount(transaction.OriginAccountId).IsFxAccount
|| accountRepository.GetAccount(transaction.TargetAccountId).IsFxAccount;
if (isFxAccount && transaction.FxRate != 0) if (isFxAccount && transaction.FxRate != 0)
{ {
transaction.Value = transaction.Value / transaction.FxRate.Value; transaction.Value = transaction.Value / transaction.FxRate.Value;

View file

@ -34,7 +34,7 @@
@selectedAccount.Name @selectedAccount.Name
</FluentGridItem> </FluentGridItem>
<FluentGridItem xs="4" Class="align-content-center"> <FluentGridItem xs="4" Class="align-content-center">
Total @Math.Abs(selectedAccount.Balance).ToString("C2") in @transactionList?.Count() Transaktionen Total @Math.Abs(selectedAccount.Balance).ToString("N2") @selectedAccount.Currency in @transactionList?.Count() Transaktionen
</FluentGridItem> </FluentGridItem>
<FluentGridItem xs="4" Class="align-content-center" Justify="JustifyContent.FlexEnd"> <FluentGridItem xs="4" Class="align-content-center" Justify="JustifyContent.FlexEnd">
<FluentButton IconStart="@(new Icons.Regular.Size16.Add())" Appearance="Appearance.Neutral" OnClick="AddAsync">Neue Transaktion hinzufügen</FluentButton> <FluentButton IconStart="@(new Icons.Regular.Size16.Add())" Appearance="Appearance.Neutral" OnClick="AddAsync">Neue Transaktion hinzufügen</FluentButton>
@ -49,7 +49,9 @@
<TemplateColumn Title="Gegenkonto"> <TemplateColumn Title="Gegenkonto">
@GetAccountName(context) @GetAccountName(context)
</TemplateColumn> </TemplateColumn>
<PropertyColumn Property="@(p => p.Value)" Format="C2" Align="Align.End"/> <TemplateColumn Title="Betrag" Align="Align.End">
@context.GetValue(selectedAccount.IsFxAccount).ToString("N2") @selectedAccount.Currency
</TemplateColumn>
<TemplateColumn Align="Align.Center" Width="50px"> <TemplateColumn Align="Align.Center" Width="50px">
<FluentButton IconEnd="@(new Icons.Regular.Size16.Delete())" Appearance="Appearance.Neutral" OnClick="@(() => DeleteAsync(context.Id))"/> <FluentButton IconEnd="@(new Icons.Regular.Size16.Delete())" Appearance="Appearance.Neutral" OnClick="@(() => DeleteAsync(context.Id))"/>
</TemplateColumn> </TemplateColumn>