Beispiel #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);
            }
        }
        public HttpResponseMessage TrocaFornecedorItem(HttpRequestMessage request, int pedidoId, int itemProdutoId, bool flgOutraMarcaTroca)
        {
            return(CreateHttpResponse(request, () =>
            {
                HttpResponseMessage response = null;
                Usuario usuario = _usuarioRep.GetSingle(int.Parse(HttpContext.Current.User.Identity.GetUserId()));
                if (pedidoId > 0)
                {
                    Pedido pedido = this._pedidoRep.GetAll().Where(x => x.Id.Equals(pedidoId)).FirstOrDefault();
                    CotacaoPedidos CP = _cotacaoPedidosRep.FindBy(cp => cp.PedidoId == pedido.Id).FirstOrDefault();

                    var listFornecedoresId = pedido.ItemPedidos.Where(x => x.AprovacaoMembro && !x.AprovacaoFornecedor && !x.Ativo && x.ProdutoId == itemProdutoId)
                                             .Select(f => f.FornecedorId).ToList();


                    var listPrecoItemFornecedor = _resultadoCotacaoRep.FindBy(rc => rc.CotacaoId == CP.CotacaoId &&
                                                                              rc.ProdutoId == itemProdutoId &&
                                                                              rc.FlgOutraMarca == flgOutraMarcaTroca &&
                                                                              !listFornecedoresId.Contains(rc.FornecedorId))
                                                  .Select(r => new
                    {
                        fornecedor = r.Fornecedor.Pessoa.PessoaJuridica.NomeFantasia,
                        r.PrecoNegociadoUnit,
                        r.FornecedorId,
                        r.Observacao,
                        r.Qtd,
                        SubTotal = (r.Qtd * r.PrecoNegociadoUnit),
                        FornecedorFormaPagtos = r.Fornecedor
                                                .FornecedorFormaPagtos
                                                .Select(f => new TrocaItemFornecedorResponseViewModel
                        {
                            DescFormaPagto = f.FormaPagto.DescFormaPagto,
                            Desconto = f.Desconto,
                            QtdParcelas = f.FormaPagto.QtdParcelas,
                            FormaPagtoId = f.FormaPagtoId,
                            ValorMinParcela = f.ValorMinParcela == null ? 0 : f.ValorMinParcela.Value,
                            ValorMinParcelaPedido = f.ValorMinParcelaPedido == null ? 0 : f.ValorMinParcelaPedido.Value,
                        }).ToList()
                    }).ToList();

                    listPrecoItemFornecedor.ForEach(x =>
                    {
                        var lista = new List <TrocaItemFornecedorResponseViewModel>();

                        x.FornecedorFormaPagtos.ForEach(f =>
                        {
                            if (pedido.ItemPedidos.Count(i => i.FornecedorId == x.FornecedorId) > 0)
                            {
                                var totalItem = pedido.ItemPedidos.Where(i => i.FornecedorId == x.FornecedorId).Sum(s => s.PrecoNegociadoUnit);
                                var soma = (totalItem + x.PrecoNegociadoUnit) + (((totalItem + x.PrecoNegociadoUnit) * f.Desconto) / 100);

                                if (f.ValorMinParcelaPedido > 0)
                                {
                                    f.PodeSelecionar = soma > f.ValorMinParcelaPedido;
                                }
                                else if (f.ValorMinParcela > 0)
                                {
                                    f.PodeSelecionar = (soma / f.QtdParcelas) > f.ValorMinParcela;
                                }
                                else
                                {
                                    f.PodeSelecionar = true;
                                }

                                if (f.PodeSelecionar)
                                {
                                    lista.Add(f);
                                }
                            }
                            else
                            {
                                if (f.ValorMinParcelaPedido > 0)
                                {
                                    f.PodeSelecionar = (((x.PrecoNegociadoUnit * f.Desconto) / 100) + x.PrecoNegociadoUnit) > f.ValorMinParcelaPedido;
                                }
                                else if (f.ValorMinParcela > 0)
                                {
                                    f.PodeSelecionar = (((x.PrecoNegociadoUnit * f.Desconto) / 100) + x.PrecoNegociadoUnit / f.ValorMinParcela) >= f.QtdParcelas;
                                }
                                else
                                {
                                    f.PodeSelecionar = true;
                                }

                                if (f.PodeSelecionar)
                                {
                                    lista.Add(f);
                                }
                            }
                        });

                        x.FornecedorFormaPagtos.Clear();
                        x.FornecedorFormaPagtos.AddRange(lista);
                    });

                    response = request.CreateResponse(HttpStatusCode.OK, new { success = true, listPrecoItemFornecedor });
                }
                else
                {
                    response = request.CreateResponse(HttpStatusCode.BadRequest, "Não foi possível devolver a dados de  Lista de fornecedores que deram preço" + pedidoId);
                }

                return response;
            }));
        }
        public List <Pedido> ListarPedidosPendentes(Enum pCliente)
        {
            bool CotacapoAceiteMembro = true;

            // Status pedido em cotacao
            int statusIdPend     = 0;
            int statusIdPendHist = 0;

            if ((TipoCliente)pCliente == TipoCliente.Membro)
            {
                //Status pedido Aguardando Membro
                statusIdPend     = _statusSistemaRep.GetAll().FirstOrDefault(x => x.WorkflowStatusId == 12 && x.Ordem == 3).Id;
                statusIdPendHist = statusIdPend;
            }
            else
            {
                //Status pedido Aguardando Fornecedor
                statusIdPend     = _statusSistemaRep.GetAll().FirstOrDefault(x => x.WorkflowStatusId == 12 && x.Ordem == 4).Id;
                statusIdPendHist = _statusSistemaRep.GetAll().FirstOrDefault(x => x.WorkflowStatusId == 12 && x.Ordem == 3).Id;
            }

            List <Pedido> lPedidoPendente           = _pedidoRep.FindBy(p => p.StatusSistemaId == statusIdPend).ToList();
            List <Pedido> lPedidoIdPendenteAtrasado = new List <Pedido>();
            Pedido        pedidoAtrasado            = null;

            foreach (Pedido item in lPedidoPendente)
            {
                var objRet = _histStatusPedidoRep.GetAll().FirstOrDefault(hp => hp.PedidoId == item.Id &&
                                                                          hp.StatusSistemaId == statusIdPendHist
                                                                          );

                if (objRet != null)
                {
                    pedidoAtrasado = objRet.Pedido;
                }
                if (pedidoAtrasado != null)
                {
                    CotacapoAceiteMembro = true;

                    if ((TipoCliente)pCliente == TipoCliente.Fornecedor)
                    {
                        //Verifica se Todos os pedidos da cotação foram aceitos pelo membro, para ai sim avisar o fornecedor.
                        CotacaoPedidos        lcotPed = _cotacaoPedidoRep.GetAll().FirstOrDefault(lp => lp.PedidoId == item.Id);
                        List <CotacaoPedidos> lcot    = _cotacaoPedidoRep.GetAll().Where(cpr => cpr.CotacaoId == lcotPed.CotacaoId).ToList();
                        foreach (CotacaoPedidos itemCot in lcot)
                        {
                            if (itemCot.Pedido.StatusSistemaId != statusIdPend)
                            {
                                CotacapoAceiteMembro = false;
                            }
                        }
                    }

                    if (CotacapoAceiteMembro)
                    {
                        lPedidoIdPendenteAtrasado.Add(pedidoAtrasado);
                    }
                }
            }

            return(lPedidoIdPendenteAtrasado);
        }
        public HttpResponseMessage TrocaItemFornecedor(HttpRequestMessage request, int pedidoId, int fornecedorId)
        {
            return(CreateHttpResponse(request, () =>
            {
                HttpResponseMessage response = null;
                Usuario usuario = _usuarioRep.GetSingle(int.Parse(HttpContext.Current.User.Identity.GetUserId()));
                if (pedidoId > 0)
                {
                    Pedido pedido = this._pedidoRep.GetAll().Where(x => x.Id.Equals(pedidoId)).FirstOrDefault();

                    List <ItemPedidosFornecedores> listaPedidoFornecedor = new List <ItemPedidosFornecedores>();

                    List <FornecedorLance> listaFornecedor = new List <FornecedorLance>();

                    CotacaoPedidos CP = _cotacaoPedidosRep.FindBy(cp => cp.PedidoId == pedido.Id).FirstOrDefault();

                    foreach (var item in pedido.ItemPedidos)
                    {
                        listaFornecedor = new List <FornecedorLance>();

                        List <ResultadoCotacao> lResultCotacao = _resultadoCotacaoRep.FindBy(rc => rc.CotacaoId == CP.CotacaoId &&
                                                                                             rc.FornecedorId == fornecedorId &&
                                                                                             rc.ProdutoId == item.ProdutoId &&
                                                                                             rc.FlgOutraMarca == item.FlgOutraMarca).ToList();

                        foreach (var itemResultado in lResultCotacao)
                        {
                            if (itemResultado.PrecoNegociadoUnit > 0)
                            {
                                listaFornecedor.Add(new FornecedorLance
                                {
                                    ItemFornecedorLance = itemResultado.Fornecedor,
                                    valorLance = itemResultado.PrecoNegociadoUnit,
                                    obs = itemResultado.Observacao,
                                    qtd = item.Quantidade
                                });
                            }
                        }

                        if (listaFornecedor.Count > 0)
                        {
                            listaPedidoFornecedor.Add(new ItemPedidosFornecedores
                            {
                                ItemPedidos = item,
                                ListFornecedorLance = listaFornecedor
                            });
                        }
                    }

                    PedidoFornecedoresPorITem histPedidoCotacao = new PedidoFornecedoresPorITem();

                    //histPedidoCotacao.Id = pedido.Id;
                    //histPedidoCotacao.DtPedido = pedido.DtPedido;
                    //histPedidoCotacao.FlgCotado = pedido.FlgCotado;
                    //histPedidoCotacao.StatusSistemaId = pedido.StatusSistemaId;
                    //histPedidoCotacao.MembroId = pedido.MembroId;
                    //histPedidoCotacao.EnderecoId = pedido.EnderecoId;



                    histPedidoCotacao.ItemPedidosFornecedor = listaPedidoFornecedor;

                    PedidoFornecedoresPorItemViewModel histPedidoCotacaoVM = Mapper.Map <PedidoFornecedoresPorITem, PedidoFornecedoresPorItemViewModel>(histPedidoCotacao);


                    response = request.CreateResponse(HttpStatusCode.OK, new { success = true, lancesFornecedorPedido = histPedidoCotacaoVM });
                }
                else
                {
                    response = request.CreateResponse(HttpStatusCode.BadRequest, "Não foi possível devolver a dados de itens do pedido " + pedidoId);
                }

                return response;
            }));
        }