public EntryItemsReport GetReport() { var ledger = GetLedger(Journal); var book = new Book(Book); var accountPredicate = new QueryAccountPredicate(NoChildren ? AccountQuery : AccountQuery + ":**"); var entryItems = ledger.GetEntriesAtOrBetween(StartIndex, EndIndex).GetEntryItems(book, accountPredicate); var reportItems = new List <EntryItemsReport.ReportItem>(); foreach (var entryItem in entryItems) { var balanceItem = ledger.GetBalanceAt(book, entryItem.Entry.Index).Items.GetBalanceItem(entryItem.Account, entryItem.Asset); var reportItem = new EntryItemsReport.ReportItem(); reportItem.Index = entryItem.Entry.Index; reportItem.Account = entryItem.Account; reportItem.Asset = entryItem.Asset; reportItem.Debit = entryItem.Debit; reportItem.Credit = entryItem.Credit; reportItem.BalanceDebit = balanceItem.BalanceDebit; reportItem.BalanceCredit = balanceItem.BalanceCredit; reportItems.Add(reportItem); } if (!string.IsNullOrEmpty(AssetQuery)) { var assetPredicate = new QueryAssetPredicate(AssetQuery); reportItems = reportItems.Where(reportItem => assetPredicate.Matches(reportItem.Asset)).ToList(); } return(new EntryItemsReport(reportItems.ToArray())); }
protected static IEnumerable <string> GetChildAccountIds(IBalance balance, string account) { var accountPredicate = new QueryAccountPredicate(account + ":**"); var accountIds = balance.Items.GetBalanceItems(accountPredicate).Select(balanceItem => ((Account)balanceItem.Account).Id); var level = account.Split(':').Length; return(accountIds.Select(accountId => string.Join(":", accountId.Split(':').Take(level))).Distinct()); }
public BalanceReport GetReport() { var ledger = GetLedger(Journal); var book = new Book(Book); var accountPredicate = new QueryAccountPredicate(NoChildren ? AccountQuery : AccountQuery + ":**"); var balance = ledger.GetBalanceAtOrBefore(book, Index); var accountIds = AllLevels ? GetAllAccountIds(balance, accountPredicate) : GetAccountIds(balance, accountPredicate); var reportItems = new List <BalanceReport.ReportItem>(); foreach (var accountId in accountIds) { if (!accountPredicate.Matches(new Account(accountId))) { continue; } var predicate = new QueryAccountPredicate(!AllLevels ? accountId : accountId + ":**"); foreach (var balanceItem in balance.Items.GetBalanceItemsCombined(predicate)) { var reportItem = new BalanceReport.ReportItem(); reportItem.Account = new Account(accountId); reportItem.Asset = balanceItem.Asset; reportItem.TotalDebit = balanceItem.TotalDebit; reportItem.TotalCredit = balanceItem.TotalCredit; reportItem.BalanceDebit = reportItem.TotalDebit > reportItem.TotalCredit ? reportItem.TotalDebit - reportItem.TotalCredit : 0; reportItem.BalanceCredit = reportItem.TotalCredit > reportItem.TotalDebit ? reportItem.TotalCredit - reportItem.TotalDebit : 0; reportItems.Add(reportItem); } } if (!string.IsNullOrEmpty(AssetQuery)) { var assetPredicate = new QueryAssetPredicate(AssetQuery); reportItems = reportItems.Where(reportItem => assetPredicate.Matches(reportItem.Asset)).ToList(); } if (!IncludeZeroBalances) { reportItems = reportItems.Where(reportItem => reportItem.BalanceDebit != 0 || reportItem.BalanceCredit != 0).ToList(); } reportItems = reportItems.OrderBy(reportItem => reportItem.Account, new AccountComparer()).ThenBy(reportItem => reportItem.Asset, new AssetComparer()).ToList(); return(new BalanceReport(reportItems.ToArray())); }