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, RepositoryCache cache, IAccountRepository accountRepository) : base(settingsService, cache) { this.accountRepository = accountRepository; } /// /// Get transaction list /// public List GetTransactionList() => LoadList(TRANSACTIONS); /// /// Save a transaction (insert/update) /// 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); } /// /// Get transaction /// public Transaction GetTransaction(string id) { var transactions = GetTransactionList(); var stored = transactions.FirstOrDefault(t => t.Id == id); if (stored == null) { return null; } var result = new Transaction(); stored.Copy(result); // value is stored in CHF -> convert back to foreign currency for display/editing var isFxAccount = accountRepository.GetAccount(result.OriginAccountId).IsFxAccount || accountRepository.GetAccount(result.TargetAccountId).IsFxAccount; if (isFxAccount && result.FxRate != 0) { result.Value = result.Value / result.FxRate.Value; } return result; } /// /// Delete transaction /// public void DeleteTransaction(string id) { var transactions = GetTransactionList(); transactions.RemoveAll(t => t.Id == id); Save(transactions, TRANSACTIONS); } } }