using System; using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.Extensions.Logging; 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, RepositoryCache cache, ILogger logger) : base(settingsService, cache, logger) { EnsureAccountsFile(); } /// /// Load accounts /// public List GetAccountList() => LoadList(ACCOUNTS); /// /// 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 void EnsureAccountsFile() { string filePath = Path.Combine(settingsService.GetDbPath(), ACCOUNTS); if (File.Exists(filePath)) { return; } var lastYearFile = Path.Combine(settingsService.GetLastYearDbPath(), ACCOUNTS); if (File.Exists(lastYearFile)) { File.Copy(lastYearFile, filePath); } // Year rollover: seed start balances from the previous year's closing values. // Bank accounts start at the last known bank balance; cash accounts start at zero. var accounts = GetAccountList(); var modified = false; foreach (var account in accounts.Where(a => a.Class == ClassIds.Activa)) { if (account.LastBankBalance > 0) { account.StartBalance = account.LastBankBalance; modified = true; } else if (account.Number < 1010) { account.StartBalance = 0; modified = true; } } if (modified) { Save(accounts, ACCOUNTS); } } } }