private void SummaryByGroupEntries(EmpiriaHashTable <TrialBalanceEntry> summaryEntries,
                                           TrialBalanceEntry balanceEntry)
        {
            TrialBalanceEntry groupEntry = TrialBalanceMapper.MapToTrialBalanceEntry(balanceEntry);

            groupEntry.GroupName      = $"TOTAL GRUPO {balanceEntry.Account.GroupNumber}";
            groupEntry.GroupNumber    = balanceEntry.Account.GroupNumber;
            groupEntry.Account        = StandardAccount.Empty;
            groupEntry.Sector         = Sector.Empty;
            groupEntry.DebtorCreditor = balanceEntry.Account.DebtorCreditor;

            string hash;

            if (groupEntry.DebtorCreditor == DebtorCreditorType.Deudora)
            {
                hash = $"{balanceEntry.Ledger.Id}||{balanceEntry.Currency.Id}||{balanceEntry.Account.GroupNumber}||D";

                GenerateOrIncreaseEntries(summaryEntries, groupEntry, StandardAccount.Empty, Sector.Empty,
                                          TrialBalanceItemType.BalanceTotalGroupDebtor, hash);
            }
            else
            {
                hash = $"{balanceEntry.Ledger.Id}||{balanceEntry.Currency.Id}||{balanceEntry.Account.GroupNumber}||A";

                GenerateOrIncreaseEntries(summaryEntries, groupEntry, StandardAccount.Empty, Sector.Empty,
                                          TrialBalanceItemType.BalanceTotalGroupCreditor, hash);
            }
        }
        internal void SummaryByCurrencyEntries(EmpiriaHashTable <TrialBalanceEntry> summaryEntries,
                                               TrialBalanceEntry balanceEntry,
                                               StandardAccount targetAccount, Sector targetSector,
                                               TrialBalanceItemType itemType)
        {
            TrialBalanceEntry entry = TrialBalanceMapper.MapToTrialBalanceEntry(balanceEntry);

            if (_command.TrialBalanceType != TrialBalanceType.SaldosPorCuentaYMayor &&
                entry.ItemType == TrialBalanceItemType.BalanceTotalCreditor)
            {
                entry.InitialBalance = -1 * entry.InitialBalance;
                entry.CurrentBalance = -1 * entry.CurrentBalance;
            }

            entry.GroupName = "TOTAL MONEDA " + entry.Currency.FullName;
            string hash;

            if (_command.TrialBalanceType == TrialBalanceType.SaldosPorCuentaYMayor)
            {
                entry.GroupNumber = "";
                hash = $"{entry.GroupName}||{entry.Currency.Id}";
            }
            else
            {
                hash = $"{entry.GroupName}||{targetSector.Code}||{entry.Currency.Id}||{entry.Ledger.Id}";
            }
            GenerateOrIncreaseEntries(summaryEntries, entry, targetAccount, targetSector, itemType, hash);
        }
        internal List <TrialBalanceEntry> GenerateTotalSummaryConsolidatedByLedger(
            List <TrialBalanceEntry> summaryCurrencies)
        {
            var summaryConsolidatedByLedger = new EmpiriaHashTable <TrialBalanceEntry>(summaryCurrencies.Count);
            List <TrialBalanceEntry> returnedListEntries = new List <TrialBalanceEntry>();

            if (_command.TrialBalanceType == TrialBalanceType.Balanza && _command.ShowCascadeBalances)
            {
                foreach (var currencyEntry in summaryCurrencies.Where(
                             a => a.ItemType == TrialBalanceItemType.BalanceTotalCurrency))
                {
                    TrialBalanceEntry entry = TrialBalanceMapper.MapToTrialBalanceEntry(currencyEntry);

                    entry.GroupName = $"TOTAL CONSOLIDADO {entry.Ledger.FullName}";
                    entry.Currency  = Currency.Empty;
                    string hash = $"{entry.Ledger.Id}||{entry.GroupName}||{Sector.Empty.Code}";

                    GenerateOrIncreaseEntries(summaryConsolidatedByLedger, entry, StandardAccount.Empty, Sector.Empty,
                                              TrialBalanceItemType.BalanceTotalConsolidatedByLedger, hash);
                }

                returnedListEntries.AddRange(summaryConsolidatedByLedger.Values.ToList());
            }
            return(returnedListEntries.OrderBy(a => a.Ledger.Number).ToList());
        }
        internal List <TrialBalanceEntry> GenerateTotalSummaryConsolidated(List <TrialBalanceEntry> balanceEntries)
        {
            var totalSummaryConsolidated = new EmpiriaHashTable <TrialBalanceEntry>(balanceEntries.Count);

            foreach (var currencyEntry in balanceEntries.Where(
                         a => a.ItemType == TrialBalanceItemType.BalanceTotalCurrency))
            {
                TrialBalanceEntry entry = TrialBalanceMapper.MapToTrialBalanceEntry(currencyEntry);

                entry.GroupName = "TOTAL CONSOLIDADO GENERAL";

                string hash;
                if (_command.TrialBalanceType == TrialBalanceType.SaldosPorCuentaYMayor ||
                    (_command.TrialBalanceType == TrialBalanceType.Balanza && _command.ShowCascadeBalances))
                {
                    hash = $"{entry.GroupName}";
                    entry.GroupNumber = "";
                }
                else
                {
                    hash = $"{entry.GroupName}||{Sector.Empty.Code}||{entry.Ledger.Id}";
                }

                GenerateOrIncreaseEntries(totalSummaryConsolidated, entry, StandardAccount.Empty, Sector.Empty,
                                          TrialBalanceItemType.BalanceTotalConsolidated, hash);
            }

            balanceEntries.AddRange(totalSummaryConsolidated.Values.ToList());

            return(balanceEntries);
        }
        public TrialBalanceDto BuildTrialBalance(TrialBalanceCommand command)
        {
            Assertion.AssertObject(command, "command");

            var trialBalanceEngine = new TrialBalanceEngine(command);

            TrialBalance trialBalance = trialBalanceEngine.BuildTrialBalance();

            return(TrialBalanceMapper.Map(trialBalance));
        }
        internal void SummaryBySubsidiaryEntry(EmpiriaHashTable <TrialBalanceEntry> summaryEntries,
                                               TrialBalanceEntry entry, TrialBalanceItemType itemType)
        {
            TrialBalanceEntry balanceEntry = TrialBalanceMapper.MapToTrialBalanceEntry(entry);

            balanceEntry.SubledgerAccountIdParent = entry.SubledgerAccountIdParent;

            string hash = $"{entry.Account.Number}||{entry.Sector.Code}||{entry.Currency.Id}||{entry.Ledger.Id}";

            GenerateOrIncreaseEntries(summaryEntries, balanceEntry,
                                      StandardAccount.Empty, Sector.Empty, itemType, hash);
        }
        internal void SummaryByLedgersGroupEntries(EmpiriaHashTable <TrialBalanceEntry> totalsListByGroupEntries,
                                                   TrialBalanceEntry balanceEntry)
        {
            TrialBalanceEntry groupEntry = TrialBalanceMapper.MapToTrialBalanceEntry(balanceEntry);

            groupEntry.GroupName      = $"TOTAL GRUPO {balanceEntry.Account.GroupNumber}";
            groupEntry.GroupNumber    = balanceEntry.Account.GroupNumber;
            groupEntry.Account        = StandardAccount.Empty;
            groupEntry.Sector         = Sector.Empty;
            groupEntry.DebtorCreditor = balanceEntry.Account.DebtorCreditor;

            string hash = $"{balanceEntry.Account.GroupNumber}||{balanceEntry.Currency.Id}||{balanceEntry.Sector.Code}";

            GenerateOrIncreaseEntries(totalsListByGroupEntries, groupEntry, StandardAccount.Empty, Sector.Empty,
                                      TrialBalanceItemType.BalanceTotalGroupDebtor, hash);
        }
        internal void SummaryByAccount(EmpiriaHashTable <TrialBalanceEntry> summaryEntries,
                                       TrialBalanceEntry balanceEntry,
                                       StandardAccount targetAccount, Sector targetSector,
                                       TrialBalanceItemType itemType)
        {
            TrialBalanceEntry entry = TrialBalanceMapper.MapToTrialBalanceEntry(balanceEntry);

            entry.Ledger         = Ledger.Empty;
            entry.GroupName      = entry.Account.Name.ToUpper();
            entry.InitialBalance = 0;
            entry.Debit          = 0;
            entry.Credit         = 0;
            entry.CurrentBalance = 0;

            string hash = $"{targetAccount.Number}||{targetSector.Code}||{entry.Currency.Id}||{entry.Ledger.Id}";

            GenerateOrIncreaseEntries(summaryEntries, entry, targetAccount, targetSector, itemType, hash);
        }
        private void SummaryByDebtorCreditorEntries(EmpiriaHashTable <TrialBalanceEntry> summaryEntries,
                                                    TrialBalanceEntry balanceEntry,
                                                    StandardAccount targetAccount, Sector targetSector,
                                                    TrialBalanceItemType itemType)
        {
            TrialBalanceEntry entry = TrialBalanceMapper.MapToTrialBalanceEntry(balanceEntry);

            if (itemType == TrialBalanceItemType.BalanceTotalDebtor)
            {
                entry.GroupName = "TOTAL DEUDORAS " + entry.Currency.FullName;
            }
            else if (itemType == TrialBalanceItemType.BalanceTotalCreditor)
            {
                entry.GroupName = "TOTAL ACREEDORAS " + entry.Currency.FullName;
            }

            string hash = $"{entry.GroupName}||{targetSector.Code}||{entry.Currency.Id}||{entry.Ledger.Id}";

            GenerateOrIncreaseEntries(summaryEntries, entry, targetAccount, targetSector, itemType, hash);
        }