public void ImportarValores(MetadaUnidade metaUnidade, string pathTemp, Enum.OrcamentodaUnidade.Trimestres?trimestre = null)
        {
            int quantidadePorLote = 1000;
            var trace             = new Trace("Meta-Supervisor-IMPORTAR" + metaUnidade.ID.Value);

            trace.Add(" --------------------------- Iniciando --------------------------- ");


            try
            {
                var listaErros   = new Dictionary <Guid, string>();
                var mensagemErro = new StringBuilder();


                // Atualizar Status
                metaUnidade.MensagemdeProcessamento = string.Format("{0} - Iniciando Importação do Supervisor{1}{2}", DateTime.Now, Environment.NewLine + Environment.NewLine, metaUnidade.MensagemdeProcessamento).Truncate(1000);
                RepositoryService.MetadaUnidade.Update(new MetadaUnidade(metaUnidade.OrganizationName, metaUnidade.IsOffline)
                {
                    ID = metaUnidade.ID,
                    RazaodoStatusMetaSupervisor = (int)Enum.MetaUnidade.RazaodoStatusMetaSupervisor.ImportandoPlanilhaMetaSupervisor,
                    MensagemdeProcessamento     = metaUnidade.MensagemdeProcessamento
                });

                #region Criando níveis da meta


                // Supervisor
                listaErros = AtualizarValoresPotencialSupervisor(metaUnidade, quantidadePorLote);
                if (listaErros.Count > 0)
                {
                    mensagemErro.AppendLine("Atualização do Potencial por Supervisor!");
                    foreach (var item in listaErros)
                    {
                        mensagemErro.AppendLine(item.Key + " - " + item.Value);
                    }
                }


                // Trimestre
                listaErros = AtualizarValoresPotencialTrimestre(metaUnidade, quantidadePorLote, trimestre);
                if (listaErros.Count > 0)
                {
                    mensagemErro.AppendLine("Atualização do Potencial por Trimestre!");
                    foreach (var item in listaErros)
                    {
                        mensagemErro.AppendLine(item.Key + " - " + item.Value);
                    }
                }


                // Segmento
                listaErros = AtualizarValoresPotencialSegmento(metaUnidade, quantidadePorLote, trimestre);
                if (listaErros.Count > 0)
                {
                    mensagemErro.AppendLine("Atualização do Potencial por Segmento!");
                    foreach (var item in listaErros)
                    {
                        mensagemErro.AppendLine(item.Key + " - " + item.Value);
                    }
                }

                // Familia
                listaErros = AtualizarValoresPotencialFamilia(metaUnidade, quantidadePorLote, trimestre);
                if (listaErros.Count > 0)
                {
                    mensagemErro.AppendLine("Atualização do Potencial por Supervisor!");
                    foreach (var item in listaErros)
                    {
                        mensagemErro.AppendLine(item.Key + " - " + item.Value);
                    }
                }

                // Subfamilia
                listaErros = AtualizarValoresPotencialSubfamilia(metaUnidade, quantidadePorLote, trimestre);
                if (listaErros.Count > 0)
                {
                    mensagemErro.AppendLine("Atualização do Potencial por Supervisor!");
                    foreach (var item in listaErros)
                    {
                        mensagemErro.AppendLine(item.Key + " - " + item.Value);
                    }
                }



                // Produto
                if (trimestre.HasValue)
                {
                    listaErros = AtualizarValoresPotencialProduto(metaUnidade, quantidadePorLote, trimestre.Value);
                    if (listaErros.Count > 0)
                    {
                        mensagemErro.AppendLine("Atualização do Potencial por Produto!");
                        foreach (var item in listaErros)
                        {
                            mensagemErro.AppendLine(item.Key + " - " + item.Value);
                        }
                    }

                    listaErros = AtualizarValoresPotencialProdutoMes(metaUnidade, quantidadePorLote, trimestre.Value);
                    if (listaErros.Count > 0)
                    {
                        mensagemErro.AppendLine("Atualização do Potencial por Produto Mes!");
                        foreach (var item in listaErros)
                        {
                            mensagemErro.AppendLine(item.Key + " - " + item.Value);
                        }
                    }
                }
                else
                {
                    listaErros = AtualizarValoresPotencialProduto(metaUnidade, quantidadePorLote);
                    if (listaErros.Count > 0)
                    {
                        mensagemErro.AppendLine("Atualização do Potencial por Produto!");
                        foreach (var item in listaErros)
                        {
                            mensagemErro.AppendLine(item.Key + " - " + item.Value);
                        }
                    }

                    listaErros = AtualizarValoresPotencialProdutoMes(metaUnidade, quantidadePorLote);
                    if (listaErros.Count > 0)
                    {
                        mensagemErro.AppendLine("Atualização do Potencial por Produto Mes!");
                        foreach (var item in listaErros)
                        {
                            mensagemErro.AppendLine(item.Key + " - " + item.Value);
                        }
                    }
                }

                #endregion



                if (mensagemErro.Length == 0)
                {
                    trace.Add("{0} - Alterando status de registro do CRM", DateTime.Now);

                    metaUnidade.MensagemdeProcessamento = string.Format("{0} - Finalizando Importação do Supervisor{1}{2}", DateTime.Now, Environment.NewLine, metaUnidade.MensagemdeProcessamento).Truncate(1000);
                    RepositoryService.MetadaUnidade.Update(new MetadaUnidade(metaUnidade.OrganizationName, metaUnidade.IsOffline)
                    {
                        ID = metaUnidade.ID,
                        RazaodoStatusMetaSupervisor = (int)Enum.MetaUnidade.RazaodoStatusMetaSupervisor.PlanilhaMetaSupervisorImportadaSucesso,
                        StatusCode = (int)Enum.OrcamentodaUnidade.StatusCodeOrcamento.ImportarPlanilhaOrcamento,
                        MensagemdeProcessamento = metaUnidade.MensagemdeProcessamento
                    });
                }
                else
                {
                    trace.Add("{0} - Alterando status de registro do CRM", DateTime.Now);

                    metaUnidade.MensagemdeProcessamento = string.Format("{0} - Erro Importação do Supervisor{1}{2}", DateTime.Now, Environment.NewLine, metaUnidade.MensagemdeProcessamento).Truncate(1000);
                    RepositoryService.MetadaUnidade.Update(new MetadaUnidade(metaUnidade.OrganizationName, metaUnidade.IsOffline)
                    {
                        ID = metaUnidade.ID,
                        RazaodoStatusMetaKARepresentante = (int)Enum.MetaUnidade.RazaodoStatusMetaKARepresentante.ErroImportarMetaKARepresentante,
                        MensagemdeProcessamento          = metaUnidade.MensagemdeProcessamento
                    });

                    trace.Add("{0} - Criando arquivo de log", DateTime.Now);

                    string file = pathTemp + "Log Error Metas.txt";

                    new ArquivoService(RepositoryService).CriarArquivoLog(metaUnidade, mensagemErro.ToString(), file);
                }
            }
            catch (Exception ex)
            {
                string mensagem = Error.Handler(ex);
                trace.Add(ex);

                metaUnidade.MensagemdeProcessamento = string.Format("{0} - Erro Importação: {1}{2}{3}", DateTime.Now, mensagem, Environment.NewLine, metaUnidade.MensagemdeProcessamento).Truncate(1000);
                RepositoryService.MetadaUnidade.Update(new MetadaUnidade(metaUnidade.OrganizationName, metaUnidade.IsOffline)
                {
                    ID = metaUnidade.ID,
                    RazaodoStatusMetaSupervisor = (int)Enum.MetaUnidade.RazaodoStatusMetaSupervisor.ErroImportarMetaSupervisor,
                    MensagemdeProcessamento     = metaUnidade.MensagemdeProcessamento
                });
            }
            finally
            {
                trace.SaveClear();
            }
        }
        private Dictionary <Guid, string> AtualizarValoresPotencialProduto(MetadaUnidade metaUnidade, int quantidadePorLote, Enum.OrcamentodaUnidade.Trimestres trimeste)
        {
            var listaTodos               = RepositoryService.PotencialdoSupervisorporProduto.ListarValoresPorUnidadeNegocio(metaUnidade.UnidadedeNegocios.Id, metaUnidade.Ano.Value, trimeste);
            var listaExistentes          = RepositoryService.PotencialdoSupervisorporProduto.ListarPorUnidadeNegocio(metaUnidade.UnidadedeNegocios.Id, metaUnidade.Ano.Value, trimeste);
            var listaPotencialSubfamilia = RepositoryService.PotencialdoSupervisorporSubfamilia.ListarPorUnidadeNegocio(metaUnidade.UnidadedeNegocios.Id, metaUnidade.Ano.Value, trimeste);

            var listaError  = new Dictionary <Guid, string>();
            var listaCreate = new List <PotencialdoSupervisorporProduto>();
            var listaUpdate = new List <PotencialdoSupervisorporProduto>();

            foreach (var item in listaTodos)
            {
                var itemExistente = listaExistentes.Find(x => x.Trimestre.Value == item.Trimestre.Value &&
                                                         x.Produto.Id == item.Produto.Id &&
                                                         x.Supervisor.Id == item.Supervisor.Id);


                if (itemExistente == null)
                {
                    var potencialSubfamilia = listaPotencialSubfamilia.Find(x => x.SubfamiliadeProduto.Id == item.Subfamilia.Id &&
                                                                            x.Supervisor.Id == item.Supervisor.Id);


                    item.UnidadeNegocio = metaUnidade.UnidadedeNegocios;
                    item.Nome           = string.Format("{0} - {1}", metaUnidade.UnidadedeNegocios.Name, item.Produto.Name);
                    item.PotencialdoSupervisorPorProduto = new Lookup(potencialSubfamilia.ID.Value, potencialSubfamilia.Nome, SDKore.Crm.Util.Utility.GetEntityName(potencialSubfamilia));
                    item.RazaoStatus = (int)Domain.Enum.PotencialdoSupervisorporProduto.StatusCode.Ativa;

                    listaCreate.Add(item);
                }
                else
                {
                    item.ID = itemExistente.ID;
                    listaUpdate.Add(item);
                }
            }

            // Update em lote
            for (int i = 0; i < listaUpdate.Count; i += quantidadePorLote)
            {
                var retorno = RepositoryService.PotencialdoSupervisorporProduto.Update(listaUpdate.Skip(i).Take(quantidadePorLote).ToList());

                foreach (var item in retorno)
                {
                    listaError.Add(item.Key, item.Value);
                }
            }

            // Create em lote
            for (int i = 0; i < listaCreate.Count; i += quantidadePorLote)
            {
                var listaEmLote = listaCreate.Skip(i).Take(quantidadePorLote).ToList();

                DomainExecuteMultiple retorno = RepositoryService.PotencialdoSupervisorporProduto.Create(listaEmLote);

                if (retorno.IsFaulted)
                {
                    for (int x = 0; x < retorno.List.Length; x++)
                    {
                        var item = retorno.List[x];

                        listaError.Add(Guid.Empty, item.Message);
                    }
                }
            }

            return(listaError);
        }
        private Dictionary <Guid, string> AtualizarValoresPotencialSupervisor(MetadaUnidade metaUnidade, int quantidadePorLote)
        {
            var listaTodos      = RepositoryService.PotencialdoSupervisor.ListarValoresPorUnidadeNegocio(metaUnidade.UnidadedeNegocios.Id, metaUnidade.Ano.Value);
            var listaExistentes = RepositoryService.PotencialdoSupervisor.ListarPorUnidadeNegocio(metaUnidade.UnidadedeNegocios.Id, metaUnidade.Ano.Value);

            var listaError  = new Dictionary <Guid, string>();
            var listaCreate = new List <PotencialdoSupervisor>();
            var listaUpdate = new List <PotencialdoSupervisor>();

            foreach (var item in listaTodos)
            {
                var itemExistente = listaExistentes.Find(x => x.Supervisor.Id == item.Supervisor.Id);

                if (itemExistente == null)
                {
                    item.UnidadedeNegocio = metaUnidade.UnidadedeNegocios;
                    item.Ano         = metaUnidade.Ano;
                    item.Nome        = string.Format("{0} - {1}", metaUnidade.UnidadedeNegocios.Name, item.Supervisor.Name);
                    item.RazaoStatus = (int)Domain.Enum.PotencialdoSupervisor.StatusCode.Ativa;

                    listaCreate.Add(item);
                }
                else
                {
                    item.ID = itemExistente.ID;
                    listaUpdate.Add(item);
                }
            }

            // Update em lote
            for (int i = 0; i < listaUpdate.Count; i += quantidadePorLote)
            {
                var retorno = RepositoryService.PotencialdoSupervisor.Update(listaUpdate.Skip(i).Take(quantidadePorLote).ToList());

                foreach (var item in retorno)
                {
                    listaError.Add(item.Key, item.Value);
                }
            }

            // Create em lote
            for (int i = 0; i < listaCreate.Count; i += quantidadePorLote)
            {
                var listaEmLote = listaCreate.Skip(i).Take(quantidadePorLote).ToList();

                DomainExecuteMultiple retorno = RepositoryService.PotencialdoSupervisor.Create(listaEmLote);


                if (retorno.IsFaulted)
                {
                    for (int x = 0; x < retorno.List.Length; x++)
                    {
                        var item = retorno.List[x];

                        if (item.IsFaulted)
                        {
                            listaError.Add(Guid.Empty, item.Message);
                        }
                    }
                }
            }

            return(listaError);
        }