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; } /// /// Get transaction list /// public List GetTransactionList() { var transactionList = Load>(TRANSACTIONS); return transactionList ?? new List(); } /// /// 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 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; } /// /// Delete transaction /// public void DeleteTransaction(string id) { var transactions = GetTransactionList(); transactions.RemoveAll(t => t.Id == id); Save(transactions, TRANSACTIONS); } } }