private void FecharCotacaoService() { var cotacaoAtualID = 0; var listaFornecedoresMelhorPreco = new List <Fornecedor>(); try { eventLog.WriteEntry("Início processamento Cotações.", EventLogEntryType.Information); var naService = new NotificacoesAlertasService(); List <Usuario> listaUsuarioDeuCotacao = new List <Usuario>(); List <Pedido> listaMembroPedido = null; CotacaoPedidos cotacaoAnteior = null; int statusID = 0; //Seta usuário Padrão de Robô SessaoEconomiza.UsuarioId = int.Parse(ConfigurationManager.AppSettings["usuarioPadraoRobo"]); CotacaoService CS = new CotacaoService(); //Consulta Cotações em aberto para processar List <CotacaoPedidos> listaCotacaoPedido = CS.ListarCotacaoPedidos().OrderBy(ob => ob.CotacaoId).ThenBy(tb => tb.PedidoId).ToList(); //Lista todos Pedidos das cotações Fechadas. //Verifica quantidade de cotacoes /////qtdCotacoes = listaCotacaoPedido.GroupBy(gb => gb.CotacaoId).Select(s => new { s.Key }).Count(); /////var teste = listaCotacaoPedido.GroupBy(gb => gb.CotacaoId).Select( s=> new { t = s.Key, c = s.Count() }); foreach (var itemCotacao in listaCotacaoPedido) { var pedidoCotacao = itemCotacao.Pedido; var resultadoCotacao = CS.ListarResultadoCotacao(itemCotacao.CotacaoId); //Lista os resultados da cotação int PedidoComLance = 0; if (cotacaoAnteior == null || cotacaoAnteior.CotacaoId != cotacaoAtualID) { cotacaoAnteior = itemCotacao; } cotacaoAtualID = itemCotacao.CotacaoId; //pega cotação atual para tratamento //Atualiza Cotação com todos pedidos Cotados if (cotacaoAtualID != cotacaoAnteior.CotacaoId) { fctAtualizarCotacaoEncerrada(cotacaoAnteior.CotacaoId); CS.EmailNotificacaoFornecedor(listaUsuarioDeuCotacao.Distinct().ToList(), cotacaoAnteior.CotacaoId); CS.SmsNotificacaoFornecedor(listaUsuarioDeuCotacao.Distinct().ToList(), cotacaoAnteior.CotacaoId); listaUsuarioDeuCotacao = new List <Usuario>(); } listaMembroPedido = new List <Pedido>(); if (resultadoCotacao.Count > 0) { foreach (ItemPedido itemPedido in pedidoCotacao.ItemPedidos) //Varre todos os pedidos da Cotação { decimal precoUnitario = 0; var resultadoCotacaoMenorValor = resultadoCotacao.FindAll(rc => rc.ProdutoId == itemPedido.ProdutoId && rc.PrecoNegociadoUnit > 0); // Filtra único produto na Resultado Cotação que tenha o lance mairo que zero if (!resultadoCotacaoMenorValor.Any()) { itemPedido.Ativo = false; //inativa item sem lance CS.SalvarItemPedido(itemPedido); continue; } PedidoComLance++; // verifica se cotaçao tem fornecedor que não atende todos os clientes decimal precoMedio = 0; Usuario usuarioDeuCotacao = null; if (resultadoCotacao.GroupBy(rc => rc.Qtd).Select(n => new { n.Key }).Count() > 1) //Verifica se na cotação existe divisão Membro / Fornecedor { List <Fornecedor> LFornec = CS.ListaFornecedoresPorMembro(itemPedido.Pedido.MembroId); var ValidaSeTemResultadoItemCotado = resultadoCotacaoMenorValor.Where(w => w.Cotacao.CotacaoPedidos.Select(ww => ww.PedidoId == itemPedido.PedidoId).Any() && // identifica se é pedido correto LFornec.Contains(w.Fornecedor)); if (!ValidaSeTemResultadoItemCotado.Any()) //valida se algum Fornecedor vinculado ao Membro deu lance. { PedidoComLance--; itemPedido.Ativo = false; //inativa Item sem lance CS.SalvarItemPedido(itemPedido); continue; } if (itemPedido.FlgOutraMarca && ValidaSeTemResultadoItemCotado.Count(c => c.FlgOutraMarca) > 0) { precoUnitario = ValidaSeTemResultadoItemCotado.Where(x => x.FlgOutraMarca).Min(mp => mp.PrecoNegociadoUnit); precoMedio = ValidaSeTemResultadoItemCotado.Where(x => x.FlgOutraMarca).Average(ap => ap.PrecoNegociadoUnit); // Pega valor médio da lista } else if (!itemPedido.FlgOutraMarca && ValidaSeTemResultadoItemCotado.Count(c => !c.FlgOutraMarca) > 0) { precoUnitario = ValidaSeTemResultadoItemCotado.Where(ic => !ic.FlgOutraMarca).Min(mp => mp.PrecoNegociadoUnit); // Pega menor valor da lista precoMedio = ValidaSeTemResultadoItemCotado.Where(ic => !ic.FlgOutraMarca).Average(ap => ap.PrecoNegociadoUnit); // Pega valor médio da lista } itemPedido.PrecoMedioUnit = precoMedio; itemPedido.PrecoNegociadoUnit = precoUnitario; var objFornecedor = resultadoCotacaoMenorValor.Where(w => w.Cotacao.CotacaoPedidos.Select(ww => ww.PedidoId == itemPedido.PedidoId).Any() && // identifica se é pedido correto LFornec.Contains(w.Fornecedor)).FirstOrDefault(x => x.PrecoNegociadoUnit == precoUnitario); if (objFornecedor != null) { itemPedido.FornecedorId = objFornecedor.FornecedorId; usuarioDeuCotacao = objFornecedor.UsuarioCriacao; itemPedido.FornecedorUsuario = usuarioDeuCotacao; itemPedido.FornecedorUsuarioId = usuarioDeuCotacao.Id; } //Pegando observação. var itemObservacao = resultadoCotacaoMenorValor.OrderByDescending(o => o.DtCriacao) .FirstOrDefault(x => x.ProdutoId == itemPedido.ProdutoId && !string.IsNullOrEmpty(x.Observacao) && x.FornecedorId == itemPedido.FornecedorId && itemPedido.FlgOutraMarca); itemPedido.Observacao = itemObservacao != null ? itemObservacao.Observacao : string.Empty; } else //Cotação com todos fornecedores atendendo todos clientes { if (itemPedido.FlgOutraMarca && resultadoCotacaoMenorValor.Count(c => c.FlgOutraMarca) > 0) { itemPedido.PrecoNegociadoUnit = resultadoCotacaoMenorValor.Where(x => x.FlgOutraMarca).Min(mp => mp.PrecoNegociadoUnit); itemPedido.PrecoMedioUnit = resultadoCotacaoMenorValor.Where(x => x.FlgOutraMarca).Average(ap => ap.PrecoNegociadoUnit); } else if (!itemPedido.FlgOutraMarca && resultadoCotacaoMenorValor.Count(c => !c.FlgOutraMarca) > 0) { itemPedido.PrecoNegociadoUnit = resultadoCotacaoMenorValor.Where(x => !x.FlgOutraMarca).Min(mp => mp.PrecoNegociadoUnit); itemPedido.PrecoMedioUnit = resultadoCotacaoMenorValor.Where(x => !x.FlgOutraMarca).Average(ap => ap.PrecoNegociadoUnit); } if (resultadoCotacaoMenorValor.Any()) { itemPedido.FornecedorId = resultadoCotacaoMenorValor .FirstOrDefault(x => x.PrecoNegociadoUnit == itemPedido.PrecoNegociadoUnit && x.FlgOutraMarca == itemPedido.FlgOutraMarca).FornecedorId; usuarioDeuCotacao = resultadoCotacaoMenorValor .FirstOrDefault(x => x.PrecoNegociadoUnit == itemPedido.PrecoNegociadoUnit && x.FlgOutraMarca == itemPedido.FlgOutraMarca).UsuarioCriacao; itemPedido.FornecedorUsuario = usuarioDeuCotacao; itemPedido.FornecedorUsuarioId = usuarioDeuCotacao.Id; //Pegando observação. var itemObservacao = resultadoCotacaoMenorValor.OrderByDescending(o => o.DtCriacao) .FirstOrDefault(x => x.ProdutoId == itemPedido.ProdutoId && !string.IsNullOrEmpty(x.Observacao) && x.FornecedorId == itemPedido.FornecedorId && itemPedido.FlgOutraMarca); itemPedido.Observacao = itemObservacao != null ? itemObservacao.Observacao : string.Empty; } } //Salva Item Pedido CS.SalvarItemPedido(itemPedido); if (itemPedido.FornecedorId != null) { listaFornecedoresMelhorPreco.Add(CS.BuscaFornecedorById(int.Parse(itemPedido.FornecedorId.ToString()))); } listaUsuarioDeuCotacao.Add(usuarioDeuCotacao); } if (PedidoComLance > 0) { statusID = CS.BuscaStatusSistema(12, 3).Id;// Pedido com lance em algum produto } else { statusID = CS.BuscaStatusSistema(12, 9).Id; // Pedido sem lance } } else { // Cotação sem Lances foreach (ItemPedido itemPedido in pedidoCotacao.ItemPedidos) //Varre todos os itens do pedido desativando { itemPedido.Ativo = false; //inativa Item sem lance CS.SalvarItemPedido(itemPedido); } // Apenas atualiza Status do Pedido para tratamento statusID = CS.BuscaStatusSistema(12, 9).Id; // Pedido sem itens } pedidoCotacao.StatusSistemaId = statusID; //23 CS.SalvarPedido(pedidoCotacao); listaMembroPedido.Add(pedidoCotacao); //Inserir Histórico Pedido var pedidoHistorico = new HistStatusPedido { Ativo = true, DtCriacao = DateTime.Now, Pedido = pedidoCotacao, PedidoId = pedidoCotacao.Id, StatusSistemaId = statusID }; //Status do histórico CS.InserirHistoricoPedido(pedidoHistorico); CS.EmailNotificacaoMembro(listaMembroPedido.Distinct().ToList()); CS.SmsNotificacaoMembro(listaMembroPedido.Distinct().ToList()); // Remove todos os avisos de todos todos os fornecedores referente a estpa cotação naService.RemoverAvisosFornecedoresCotacao(cotacaoAtualID, (int)TipoAviso.NovaCotacao); }//foreach (var itemCotacao in listaCotacaoPedido) //Atualiza ultima Cotação do laço, ou quando temos apenas uma cotação if (cotacaoAtualID > 0 && cotacaoAtualID == cotacaoAnteior.CotacaoId) { fctAtualizarCotacaoEncerrada(cotacaoAtualID); CS.EmailNotificacaoFornecedor(listaUsuarioDeuCotacao.Distinct().ToList(), cotacaoAtualID); CS.SmsNotificacaoFornecedor(listaUsuarioDeuCotacao.Distinct().ToList(), cotacaoAtualID); } eventLog.WriteEntry("Fim processamento Cotações.", EventLogEntryType.Information); } catch (Exception ex) { eventLog.WriteEntry("Cotação - " + cotacaoAtualID + " > " + ex.Message + Environment.NewLine + ex.StackTrace, EventLogEntryType.Error); } }