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()));
        }
Example #2
0
        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()));
        }