AccountingNext/Schaad.Accounting.Db/Repositories/TransactionRepository.cs
Claudio Schaad 5809ee2059 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>
2026-05-23 16:03:39 +02:00

93 lines
No EOL
3.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Schaad.Accounting.Interfaces;
using Schaad.Accounting.Models;
namespace Schaad.Accounting.Repositories
{
public class TransactionRepository : BaseRepository, ITransactionRepository
{
private readonly IAccountRepository accountRepository;
private readonly string TRANSACTIONS = "Transactions.xml";
public TransactionRepository(ISettingsService settingsService, IAccountRepository accountRepository) : base(settingsService)
{
this.accountRepository = accountRepository;
}
/// <summary>
/// Get transaction list
/// </summary>
public List<Transaction> GetTransactionList()
{
var transactionList = Load<List<Transaction>>(TRANSACTIONS);
return transactionList ?? new List<Transaction>();
}
/// <summary>
/// Save a transaction (insert/update)
/// </summary>
public void SaveTransaction(Transaction transaction)
{
transaction.Value = Math.Abs(transaction.Value);
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)
{
transaction.Value = transaction.Value * transaction.FxRate.Value;
}
if (!isFxAccount)
{
transaction.FxRate = null;
}
var transactionList = GetTransactionList();
var existingTransaction = transactionList.FirstOrDefault(a => a.Id == transaction.Id);
if (existingTransaction == null)
{
existingTransaction = new Transaction();
transactionList.Add(existingTransaction);
transaction.Id = Guid.NewGuid().ToString();
}
transaction.Copy(existingTransaction);
Save(transactionList, TRANSACTIONS);
}
/// <summary>
/// Get transaction
/// </summary>
public Transaction GetTransaction(string id)
{
var transactions = GetTransactionList();
var transaction = transactions.FirstOrDefault(t => t.Id == id);
// value is stored in CHF -> convert back to foreign currency for display/editing
var isFxAccount = accountRepository.GetAccount(transaction.OriginAccountId).IsFxAccount
|| accountRepository.GetAccount(transaction.TargetAccountId).IsFxAccount;
if (isFxAccount && transaction.FxRate != 0)
{
transaction.Value = transaction.Value / transaction.FxRate.Value;
}
return transaction;
}
/// <summary>
/// Delete transaction
/// </summary>
public void DeleteTransaction(string id)
{
var transactions = GetTransactionList();
transactions.RemoveAll(t => t.Id == id);
Save(transactions, TRANSACTIONS);
}
}
}