// Agrupa os custos(impressões) dos usuários existentes no "branch" (ramo de centros de custo), todos os centros
        // de custo derivados são contabilizados e o próprio ramo é um centro de custo com seus usuários associados
        private GroupPrintingCost AssembleCosts(CostBranch costBranch, String branchQualifiedName)
        {
            GroupPrintingCost groupPrintingCost = new GroupPrintingCost();

            groupPrintingCost.costCenterId   = costBranch.Id;
            groupPrintingCost.costCenterName = branchQualifiedName;

            SearchAssociates(costBranch, true);
            foreach (int userId in associates)
            {
                comparisonValue = userId;
                UserPrintingCost userPrintingCost = (UserPrintingCost)userPrintingCosts.Find(CheckCostMethod);
                if (userPrintingCost != null)
                {
                    groupPrintingCost.bwPageCount    += userPrintingCost.bwPageCount;
                    groupPrintingCost.colorPageCount += userPrintingCost.colorPageCount;
                    groupPrintingCost.totalPageCount += userPrintingCost.totalPageCount;
                    groupPrintingCost.bwCost         += userPrintingCost.bwCost;
                    groupPrintingCost.colorCost      += userPrintingCost.colorCost;
                    groupPrintingCost.totalCost      += userPrintingCost.totalCost;
                }
            }

            return(groupPrintingCost);
        }
        /// <summary>
        /// Retorna uma lista com os custos de impressão por centro de custo
        /// </summary>
        public List <Object> GetCostsOfBranches(CostTree tree)
        {
            List <Object> costsOfBranches = new List <Object>();

            // Caso não tenham sido passados os custos por usuário retorna a lista em branco
            if (userPrintingCosts == null)
            {
                return(costsOfBranches);
            }

            // Não modificar o método "SearchBranches" para receber um parâmetro apenas, pois "tree.root"
            // é apenas um dos casos, nos outros são branchs variados
            SearchBranches(tree, tree.Root);

            foreach (KeyValuePair <String, CostBranch> pair in orderedBranches)
            {
                GroupPrintingCost groupPrintingCost = AssembleCosts(pair.Value, pair.Key);
                costsOfBranches.Add(groupPrintingCost);
            }

            return(costsOfBranches);
        }