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);
        }
        private void GenerateOrIncreaseEntries(EmpiriaHashTable <TrialBalanceEntry> summaryEntries,
                                               TrialBalanceEntry entry,
                                               StandardAccount targetAccount, Sector targetSector,
                                               TrialBalanceItemType itemType, string hash)
        {
            TrialBalanceEntry summaryEntry;

            summaryEntries.TryGetValue(hash, out summaryEntry);

            if (summaryEntry == null)
            {
                summaryEntry = new TrialBalanceEntry {
                    Ledger                   = entry.Ledger,
                    Currency                 = entry.Currency,
                    Sector                   = targetSector,
                    Account                  = targetAccount,
                    ItemType                 = itemType,
                    GroupNumber              = entry.GroupNumber,
                    GroupName                = entry.GroupName,
                    DebtorCreditor           = entry.DebtorCreditor,
                    SubledgerAccountIdParent = entry.SubledgerAccountIdParent
                };
                summaryEntry.Sum(entry);

                summaryEntries.Insert(hash, summaryEntry);
            }
            else
            {
                summaryEntry.Sum(entry);
            }
        }
        private void GenerateOrIncreaseParentEntries(List <TrialBalanceEntry> subsidiaryEntries,
                                                     List <TrialBalanceEntry> returnedEntries)
        {
            var helper = new TrialBalanceHelper(_command);

            foreach (var entry in subsidiaryEntries)
            {
                int count = 0;
                List <TrialBalanceEntry> summaryEntries = new List <TrialBalanceEntry>();
                var             summaryParentEntries    = new EmpiriaHashTable <TrialBalanceEntry>();
                StandardAccount account = entry.Account;

                while (true)
                {
                    var parent = returnedEntries.FirstOrDefault(a => a.Ledger.Number == entry.Ledger.Number &&
                                                                a.Currency.Code == entry.Currency.Code && a.SubledgerAccountId == 0 &&
                                                                a.SubledgerAccountIdParent == entry.SubledgerAccountId &&
                                                                a.Account.Number == account.Number && a.Sector.Code == entry.Sector.Code);

                    if (parent == null)
                    {
                        count++;
                        TrialBalanceItemType itemType = count == 1 ? TrialBalanceItemType.BalanceEntry :
                                                        TrialBalanceItemType.BalanceSummary;
                        helper.SummaryByEntry(summaryParentEntries, entry, account, entry.Sector, itemType);

                        if (!account.HasParent && entry.HasSector && entry.SubledgerAccountId > 0)
                        {
                            CreateOrAccumulateParentWithoutSector(returnedEntries, entry, summaryParentEntries, account);
                            break;
                        }
                        else if (!account.HasParent)
                        {
                            break;
                        }
                        else
                        {
                            account = account.GetParent();
                        }
                    }
                    else
                    {
                        parent.Sum(entry);

                        if (!account.HasParent)
                        {
                            AccumulateSubledgerAccount(returnedEntries, entry, account);
                            break;
                        }
                        else
                        {
                            account = account.GetParent();
                        }
                    }
                } // while
                summaryEntries.AddRange(summaryParentEntries.Values.ToList());
                returnedEntries.AddRange(summaryEntries);
            } // foreach
        }
        internal void SummaryByEntry(EmpiriaHashTable <TrialBalanceEntry> summaryEntries,
                                     TrialBalanceEntry entry,
                                     StandardAccount targetAccount, Sector targetSector,
                                     TrialBalanceItemType itemType)
        {
            string hash = $"{targetAccount.Number}||{targetSector.Code}||{entry.Currency.Id}||{entry.Ledger.Id}";

            GenerateOrIncreaseEntries(summaryEntries, entry, targetAccount, targetSector, itemType, hash);
        }
        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 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);
        }