Пример #1
0
        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);
            }
        }