using System; using System.Collections.Generic; using System.IO; using System.Linq; using Schaad.Accounting.Interfaces; using Schaad.Accounting.Models; namespace Schaad.Accounting.Repositories { public class AccountRepository : BaseRepository, IAccountRepository { private readonly string ACCOUNTS = "Accounts.xml"; public AccountRepository(ISettingsService settingsService) : base(settingsService) { EnsureFileExisits(ACCOUNTS); } /// /// Load accounts /// public List GetAccountList() { var accounts = Load>(ACCOUNTS); return accounts ?? new List(); } /// /// Save an account (insert/update) /// public void SaveAccount(Account account) { var accounts = GetAccountList(); var existingAccount = accounts.FirstOrDefault(a => a.Id == account.Id); if (existingAccount == null) { existingAccount = new Account(); accounts.Add(existingAccount); account.Id = Guid.NewGuid().ToString(); } account.Copy(existingAccount); Save(accounts, ACCOUNTS); } /// /// Get account /// public Account GetAccount(string id) { var accounts = GetAccountList(); return accounts.FirstOrDefault(t => t.Id == id); } /// /// Delete account /// public void DeleteAccount(string id) { var accounts = GetAccountList(); accounts.RemoveAll(t => t.Id == id); Save(accounts, ACCOUNTS); } /// /// Get account /// public Account GetAccountForBankAccountNumber(string bankAccountNumber) { var accounts = GetAccountList(); return accounts.SingleOrDefault(t => t.BankAccountNumber == bankAccountNumber); } public void SaveBankAccountBalance(string bankAccountNumber, decimal accountBalance) { var account = GetAccountForBankAccountNumber(bankAccountNumber); account.LastBankBalance = accountBalance; SaveAccount(account); } private new void EnsureFileExisits(string file) { string filePath = Path.Combine(settingsService.GetDbPath(), file); if (File.Exists(filePath) == false) { var lastYearFile = Path.Combine(settingsService.GetLastYearDbPath(), file); if (File.Exists(lastYearFile)) File.Copy(lastYearFile, filePath); // set start balance to last bank balance if (file.IndexOf("Accounts") > -1) { var accounts = GetAccountList(); foreach (var account in accounts.Where(a => a.Class == ClassIds.Activa)) { // bank accounts if (account.LastBankBalance > 0) { account.StartBalance = account.LastBankBalance; SaveAccount(account); } // cash accounts else if (account.Number < 1010) { account.StartBalance = 0; SaveAccount(account); } } } } } } }