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; })); }