/// <summary> /// Recupera o item com base no identificador do produto do pedido. /// </summary> /// <param name="id"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.ProdutosNf> .ObterItem(int id) { using (var sessao = new GDA.GDASession()) return(((IProvedorItemRentabilidade <Data.Model.ProdutosNf>) this).ObterItem(sessao, id)); }
/// <summary> /// Calcula Medidas das peças do projeto e depois insere os cálculos na tabela /// </summary> private List <PecaProjetoModelo> CalcMedidasPecas(GDA.GDASession sessao, Glass.Data.Model.ItemProjeto itemProj, Glass.Data.Model.ProjetoModelo projModelo, bool calcPecaAuto, bool pcp, bool medidasAlteradas, out string retornoValidacao, Glass.Api.Implementacao.Projeto.CalcModelo calcModelo) { retornoValidacao = string.Empty; // Carrega a lista de medidas do modelo de projeto List <MedidaProjetoModelo> lstMedProjMod = Glass.Data.DAL.MedidaProjetoModeloDAO.Instance.GetByProjetoModelo(sessao, itemProj.IdProjetoModelo, true); var isBoxPadrao = Glass.Data.DAL.ProjetoModeloDAO.Instance.IsBoxPadrao(sessao, projModelo.IdProjetoModelo); var qtd = 0; var largVao = 0; var altVao = 0; var largPorta = 0; var largVaoEsq = 0; var largVaoDir = 0; Glass.Data.Helper.UtilsProjeto.BuscarMedidasVaoItemProjeto(sessao, itemProj, isBoxPadrao, out qtd, out largVao, out altVao, out largPorta, out largVaoEsq, out largVaoDir); // Recupera a quantidade da tabela. var medidaQtd = new MedidaItemProjeto(); // TextBox txtQtd = ((TextBox)tbPecaModelo.FindControl("txtQtdMedInst")); medidaQtd.IdItemProjeto = itemProj.IdItemProjeto; medidaQtd.IdMedidaProjeto = 1; EditableItemValued <MedidaProjetoModelo> mQtd = calcModelo.Medidas.Where(f => f.Item.DescrMedida == "Qtd").FirstOrDefault(); medidaQtd.Valor = mQtd == null && mQtd.Value < 1 ? 1 : mQtd.Value; itemProj.Qtde = medidaQtd.Valor; // Busca as peças deste item, que serão utilizadas nas expressões List <PecaItemProjeto> lstPecaItemProj = Glass.Data.DAL.PecaItemProjetoDAO.Instance.GetByItemProjeto(sessao, itemProj.IdItemProjeto, projModelo.IdProjetoModelo); var pecas = Glass.Data.DAL.PecaProjetoModeloDAO.Instance.GetByModelo(sessao, itemProj.IdProjetoModelo); // Busca as peças com as medidas e produtos inseridos na tela List <PecaProjetoModelo> lstPecas = calcModelo.Pecas.Select(f => new PecaProjetoModelo { IdPecaProjMod = f.Item.IdPecaProjMod, IdPecaItemProj = f.Item.IdPecaItemProj, IdProd = f.Item.IdProd.Value, Qtde = f.Item.Qtde, Obs = f.Item.Obs, Largura = f.Item.Largura, Altura = f.Item.Altura, CalculoAltura = pecas.Where(p => p.IdPecaProjMod == f.Item.IdPecaProjMod).FirstOrDefault().CalculoAltura, CalculoLargura = pecas.Where(p => p.IdPecaProjMod == f.Item.IdPecaProjMod).FirstOrDefault().CalculoLargura, CalculoQtde = pecas.Where(p => p.IdPecaProjMod == f.Item.IdPecaProjMod).FirstOrDefault().CalculoQtde }).ToList(); //= Glass.Data.Helper.UtilsProjeto.GetPecasFromTable(tbPecaModelo, pcp); // Chamado 15837: Se alguma das peças tiver beneficiamento, não permite que as mesmas sejam trocadas // Chamado 16671: Se for projeto de box, uma das peças pode ser diferente da outra (fixo e instalação) para resolver foi criada // a validação lstPecaItemProj[i].IdProd != lstPecas[i].IdProd //for (int i = 0; i < lstPecaItemProj.Count; i++) // foreach (var pecaNova in lstPecas) // if (lstPecaItemProj[i].IdProd != pecaNova.IdProd && lstPecaItemProj[i].IdProd != lstPecas[i].IdProd) // { // var mater = Glass.Data.DAL.MaterialItemProjetoDAO.Instance.GetMaterialByPeca(lstPecaItemProj[i].IdPecaItemProj); // if (mater != null && mater.Beneficiamentos.Count > 0) // throw new Exception("Não é permitido trocar peças que possuam beneficiamentos associados."); // } // Se for para calcular as medidas das peças de vidro automaticamente if ((calcPecaAuto || medidasAlteradas) && !itemProj.MedidaExata) { // Busca as peças do modelo cadastrados por padrão para inserir qtd,altura e largura padrão, // e não as medidas inseridas na tela, isto e feito para manter as peças de vidro selecionadas List <PecaProjetoModelo> lstPecasModelo = Glass.Data.DAL.PecaProjetoModeloDAO.Instance.GetByModelo(sessao, itemProj.IdProjetoModelo); for (int i = 0; i < lstPecas.Count; i++) { // Verifica se há fórmula para calcular a qtd de peças int qtdPeca = !System.String.IsNullOrEmpty(lstPecasModelo[i].CalculoQtde) ? (int)Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, lstPecasModelo[i].CalculoQtde, itemProj, null, lstMedProjMod) : lstPecasModelo[i].Qtde; lstPecas[i].Qtde = qtdPeca; lstPecas[i].Altura = Configuracoes.ProjetoConfig.SelecionarEspessuraAoCalcularProjeto ? (itemProj.EspessuraVidro == 6 ? lstPecasModelo[i].Altura06MM : itemProj.EspessuraVidro == 8 ? lstPecasModelo[i].Altura08MM : itemProj.EspessuraVidro == 10 ? lstPecasModelo[i].Altura10MM : itemProj.EspessuraVidro == 12 ? lstPecasModelo[i].Altura12MM : lstPecasModelo[i].Altura) : lstPecasModelo[i].Altura; lstPecas[i].Largura = Configuracoes.ProjetoConfig.SelecionarEspessuraAoCalcularProjeto ? (itemProj.EspessuraVidro == 6 ? lstPecasModelo[i].Largura06MM : itemProj.EspessuraVidro == 8 ? lstPecasModelo[i].Largura08MM : itemProj.EspessuraVidro == 10 ? lstPecasModelo[i].Largura10MM : itemProj.EspessuraVidro == 12 ? lstPecasModelo[i].Largura12MM : lstPecasModelo[i].Largura) : lstPecasModelo[i].Largura; lstPecas[i].IdAplicacao = lstPecasModelo[i].IdAplicacao; lstPecas[i].IdProcesso = lstPecasModelo[i].IdProcesso; lstPecas[i].Redondo = lstPecasModelo[i].Redondo; } // Se o projeto possuir espessura de tubo, a altura da última (e penúltima) peça deve ser subtraída deste valor if (projModelo.TipoMedidasInst == 8 || projModelo.TipoMedidasInst == 9) { int espTuboMedInst = Glass.Data.DAL.MedidaItemProjetoDAO.Instance.GetByItemProjeto(sessao, itemProj.IdItemProjeto, 16, false); // Se este modelo tiver apenas 3 peças, sempre a última peça deverá ter sua altura subtraída da espessura do tubo, // mas se este modelo tiver 4 peças, as duas últimas peças terão suas alturas subtraídas da espessura do tubo if (lstPecas.Count >= 3) { lstPecas[2].Altura -= espTuboMedInst; } if (lstPecas.Count == 4) { lstPecas[3].Altura -= espTuboMedInst; } } // Pega a quantidade de peças int qtdPecas = 0; foreach (PecaProjetoModelo ppm in lstPecas) { // Verifica se há fórmula para calcular a qtd de peças int qtdPeca = !System.String.IsNullOrEmpty(ppm.CalculoQtde) ? (int)Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, ppm.CalculoQtde, itemProj, null, lstMedProjMod) : ppm.Qtde; qtdPecas += qtdPeca; } // Pega a quantidade de peças por projeto, considerando apenas um projeto qtdPecas /= qtd; #region Calcula as medidas das peças float larguraPecas = 0; foreach (PecaProjetoModelo ppm in lstPecas) { #region Cálculo de Box Padrão if (isBoxPadrao) { int qtdPecasBP = (largVaoDir > 0 ? qtdPecas / 2 : qtdPecas); float largVaoOriginal = largVao > 0 ? largVao : ppm.CalculoLargura.Contains("LARGVAODIR") ? largVaoDir : largVaoEsq; float largVaoCalc = largVaoOriginal; largVaoCalc = largVaoCalc % 100 == 0 ? largVaoCalc : largVaoCalc % 100 <= 20 ? (largVaoCalc - (largVaoCalc % 100) + 50) : largVaoCalc % 100 > 70 ? (largVaoCalc - (largVaoCalc % 100) + 150) : (largVaoCalc - (largVaoCalc % 100) + 100); if (ppm.Largura == 50 && (largVaoCalc / qtdPecasBP) % 50 == 25) { ppm.Largura = 25; } else if (ppm.Largura == 0 && (largVaoCalc / qtdPecasBP) % 50 == 25) { ppm.Largura = -25; } else if (largVaoOriginal % 100 != 0) { ppm.Largura = 0; } if (qtdPecas % 2 == 1) { if (ppm.Largura > 0) { ppm.Largura -= (int)((largVaoCalc / qtdPecasBP) % 50); } else { ppm.Largura -= (int)((largVaoCalc / qtdPecasBP) % 50); } } ppm.Altura += (int)Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, ppm.CalculoAltura, itemProj, lstPecaItemProj, lstMedProjMod); ppm.Largura += (int)(largVaoCalc / qtdPecasBP); // Modificação necessária para que caso seja box de 4 peças e o total do vão dividido por 4 // não dê múltiplo de 50, o ajuste abaixo corrija esta situação if (qtdPecas == 4) { if (ppm.Largura % 50 > 0) { if (ppm.Tipo == 1) { ppm.Largura -= ppm.Largura % 50; } else { ppm.Largura += 50 - (ppm.Largura % 50); } } } larguraPecas += ppm.Largura * (ppm.Qtde / qtd); continue; } #endregion ppm.Altura += (int)System.Math.Ceiling(Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, ppm.CalculoAltura, itemProj, lstPecaItemProj, lstMedProjMod)); ppm.Largura += (int)System.Math.Ceiling(Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, ppm.CalculoLargura, itemProj, lstPecaItemProj, lstMedProjMod)); } #region Ajuste box padrão 3 ou 4 peças // Ajusta a largura da porta de um box padrão de 3 peças de 50 em 50 até ficar maior que a largura do vão if (isBoxPadrao && qtdPecas == 3) { if ((larguraPecas - largVao) < 30) { while ((larguraPecas - largVao) < 30) { foreach (PecaProjetoModelo ppm in lstPecas) { if (ppm.Tipo == 1) { ppm.Largura += 50; larguraPecas += 50; } } } } else if ((larguraPecas - largVao) > 75) { while ((larguraPecas - largVao) > 75) { foreach (PecaProjetoModelo ppm in lstPecas) { if (ppm.Tipo == 1) { ppm.Largura -= 50; larguraPecas -= 50; } } } } } // Calcula o transpasse de box 4 folhas int transpasse = 0; if (larguraPecas != largVao && qtdPecas == 4) { transpasse = 50; } // Modifica a largura do vão a fim de calcular corretamente o transpasse das peças móveis if (largVao % 50 != 0) { largVao = largVao + (50 - (largVao % 50)); } else { largVao += 50; } // Ajusta a largura da porta de um box padrão de 4 peças de 50 em 50 até ficar maior que a largura do vão if (isBoxPadrao && qtdPecas == 4 && ((larguraPecas - transpasse) < largVao || larguraPecas == largVao)) { do { foreach (PecaProjetoModelo ppm in lstPecas) { if (ppm.Tipo == 1) { ppm.Largura += 50; larguraPecas += 50; } } }while (larguraPecas + transpasse <= largVao); } // Se a largura do fixo for maior que a da porta, inverte, para que o transpasse fique na porta if (isBoxPadrao && qtdPecas == 4 && lstPecas.Count == 2) { if ((lstPecas[0].Tipo == 1 && lstPecas[0].Largura < lstPecas[1].Largura) || (lstPecas[1].Tipo == 1 && lstPecas[0].Largura > lstPecas[1].Largura)) { int larguraTemp = lstPecas[0].Largura; lstPecas[0].Largura = lstPecas[1].Largura; lstPecas[1].Largura = larguraTemp; } } #endregion #endregion } else if (itemProj.MedidaExata) { // Busca as peças do modelo cadastrados para atribuir processo e aplicação List <PecaProjetoModelo> lstPecasModelo = Glass.Data.DAL.PecaProjetoModeloDAO.Instance.GetByModelo(sessao, itemProj.IdProjetoModelo); for (int i = 0; i < lstPecas.Count; i++) { lstPecas[i].IdAplicacao = lstPecasModelo[i].IdAplicacao; lstPecas[i].IdProcesso = lstPecasModelo[i].IdProcesso; } } Glass.Data.Helper.UtilsProjeto.ValidarMedidasPecas(sessao, itemProj, lstPecas, lstMedProjMod, out retornoValidacao); return(lstPecas); }
/// <summary> /// Calcula uma cotação de compras, separando os melhores produtos por fornecedor /// de acordo com a prioridade de cálculo selecionada. /// </summary> public Entidade.CotacaoCompraCalculada[] Calcular(GDA.GDASession session, uint codigoCotacaoCompra, Glass.Data.Model.CotacaoCompra.TipoCalculoCotacao tipoCalculo, bool isRpt) { // Valida a cotação de compra selecionada if (!CotacaoCompraDAO.Instance.Exists(session, codigoCotacaoCompra)) { throw new Exception("Cotação de compra não existe."); } var cotacao = CotacaoCompraDAO.Instance.GetElementByPrimaryKey(session, codigoCotacaoCompra); switch (cotacao.Situacao) { case Glass.Data.Model.CotacaoCompra.SituacaoEnum.Cancelada: throw new Exception("Cotação de compra está cancelada."); case Glass.Data.Model.CotacaoCompra.SituacaoEnum.Finalizada: if (!isRpt) { throw new Exception("Cotação de compra está finalizada."); } break; } List <Entidade.CotacaoCompraCalculada> retorno = new List <Entidade.CotacaoCompraCalculada>(); // Recupera os dados dos fornecedores cadastrados para a cotação de compras var fornecedores = ProdutoFornecedorCotacaoCompraDAO.Instance.ObtemProdutosFornecedorCotacao(session, codigoCotacaoCompra, 0, 0, true); var produtosCotacaoCompra = ProdutoCotacaoCompraDAO.Instance.ObtemProdutos(session, codigoCotacaoCompra); if (produtosCotacaoCompra == null || produtosCotacaoCompra.Length == 0) { throw new Exception("A Cotação de compra não possui produtos."); } // Busca os produtos cadastrados na cotação de compras foreach (var produto in produtosCotacaoCompra) { // Busca os fornecedores do produto atual, ordenando em ordem crescente // pela proridade de cálculo var fp = from f in fornecedores where f.IdProd == produto.IdProd orderby(tipoCalculo == Glass.Data.Model.CotacaoCompra.TipoCalculoCotacao.MenorCusto? f.CustoUnit : f.PrazoEntregaDias), (tipoCalculo == Glass.Data.Model.CotacaoCompra.TipoCalculoCotacao.MenorCusto ? f.PrazoEntregaDias : f.CustoUnit) select f; // Ignora o produto se não houver fornecedor if (fp.Count() == 0) { continue; } // Adiciona o item calculado à lista Entidade.CotacaoCompraCalculada item = new Entidade.CotacaoCompraCalculada(cotacao, produto, fp.ToArray()[0]); retorno.Add(item); } if (retorno.Count() == 0) { throw new Exception("Nenhum produto informado está associado a fornecedor."); } // Retorna os itens calculados return(retorno.ToArray()); }
/// <summary> /// Executa o calculo da rentabilidade para o ambiente do tipo principal. /// </summary> /// <param name="sessao"></param> /// <param name="instancia">Instância do ambiente.</param> /// <returns></returns> Data.ICalculoRentabilidadeResultado Data.ICalculadoraRentabilidade <Data.Model.AmbientePedidoEspelho> .Calcular(GDA.GDASession sessao, Data.Model.AmbientePedidoEspelho instancia) { if (!CalculoHabilitado) { return(CriarResultadoNaoExecutado()); } var item = ObterItemAmbientePedido(sessao, instancia); return(Calcular(item)); }
/// <summary> /// Inicia uma nova instância da classe <see cref="EventoComSessaoArgs"/>. /// </summary> /// <param name="sessao">Sessão associada com o evento.</param> protected EventoComSessaoArgs(GDA.GDASession sessao) { this.Sessao = sessao; }
/// <summary> /// Recupera o item com base no ambiente do pedido. /// </summary> /// <param name="sessao"></param> /// <param name="referencia"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.AmbientePedidoEspelho> .ObterItem(GDA.GDASession sessao, Data.Model.AmbientePedidoEspelho referencia) { return(ObterItemAmbientePedido(sessao, referencia)); }
/// <summary> /// Recupera o item com base no identificador do ambiente do pedido. /// </summary> /// <param name="sessao"></param> /// <param name="id"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.AmbientePedidoEspelho> .ObterItem(GDA.GDASession sessao, int id) { var ambiente = Data.DAL.AmbientePedidoEspelhoDAO.Instance.GetElementByPrimaryKey(sessao, id); return(ObterItemAmbientePedido(sessao, ambiente)); }
/// <summary> /// Obtém o valor do limite de crédito para o cliente informado. /// </summary> /// <param name="sessao">Sessão de acesso ao banco de dados.</param> /// <param name="idCliente">Identificador do cliente que será verificado.</param> /// <returns>Valor do limite.</returns> public decimal ObterLimite(GDA.GDASession sessao, int idCliente) => this.Provedor.ObterLimite(sessao, idCliente);
/// <summary> /// Realiza o calculo do imposto para a instancia informada. /// </summary> /// <param name="sessao">Sessão com o banco de dados que será usada para realizar os calculos.</param> /// <param name="instancia">Instancia para qual serão calculado os valores.</param> /// <returns></returns> Data.ICalculoImpostoResultado Data.ICalculadoraImposto <Data.Model.Orcamento> .Calcular(GDA.GDASession sessao, Data.Model.Orcamento instancia) { Global.Negocios.Entidades.Loja loja; Global.Negocios.Entidades.Cliente cliente; var orcamentoContainer = ObterContainer(instancia, out loja, out cliente); var resultado = Calculadora.Calcular(orcamentoContainer); return(new Resultado(orcamentoContainer, resultado, loja, cliente)); }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="session">Instancia da sessão associada.</param> /// <param name="providerName">Nome do provedor associado.</param> public GDAStoredProcedureTransaction(GDA.GDASession session, string providerName) { session.Require("session").NotNull(); _session = session; _providerName = providerName; }
/// <summary> /// Obtém o valor do limite de crédito para o cliente informado. /// </summary> /// <param name="sessao">Sessão de acesso ao banco de dados.</param> /// <param name="cliente">Cliente que será verificado.</param> /// <returns>Valor do limite.</returns> public decimal ObterLimite(GDA.GDASession sessao, Model.Cliente cliente) => this.Provedor.ObterLimite(sessao, cliente);
/// <summary> /// Executa o calculo da rentabilidade para o produto do tipo principal. /// </summary> /// <param name="sessao"></param> /// <param name="instancia">Instância do produto.</param> /// <returns></returns> Data.ICalculoRentabilidadeResultado Data.ICalculadoraRentabilidade <Data.Model.ProdutosNf> .Calcular(GDA.GDASession sessao, Data.Model.ProdutosNf instancia) { if (!CalculoHabilitado) { return(CriarResultadoNaoExecutado()); } var item = ObterItemProdutoNf(sessao, instancia); return(Calcular(item)); }
/// <summary> /// Executa o calculo da rentabilidade para o produto do tipo principal. /// </summary> /// <param name="sessao"></param> /// <param name="id">Identificador do produto.</param> /// <returns></returns> Data.ICalculoRentabilidadeResultado Data.ICalculadoraRentabilidade <Data.Model.ProdutosNf> .Calcular(GDA.GDASession sessao, uint id) { if (!CalculoHabilitado) { return(CriarResultadoNaoExecutado()); } var produtoNf = Data.DAL.ProdutosNfDAO.Instance.GetElementByPrimaryKey(id); return((this as Data.ICalculadoraRentabilidade <Data.Model.ProdutosNf>).Calcular(sessao, produtoNf)); }
/// <summary> /// Executa o calculo da rentabilidade para o tipo principal da calculadora. /// </summary> /// <param name="id">Identificador da instancia principal.</param> Data.ICalculoRentabilidadeResultado Data.ICalculadoraRentabilidade <Data.Model.NotaFiscal> .Calcular(GDA.GDASession sessao, uint id) { if (!CalculoHabilitado) { return(CriarResultadoNaoExecutado()); } var notaFiscal = Data.DAL.NotaFiscalDAO.Instance.GetElementByPrimaryKey(id); return((this as Data.ICalculadoraRentabilidade <Data.Model.NotaFiscal>).Calcular(sessao, notaFiscal)); }
/// <summary> /// Recupera o item com base no identificador do produto do pedido. /// </summary> /// <param name="sessao"></param> /// <param name="id"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.ProdutosPedidoEspelho> .ObterItem(GDA.GDASession sessao, int id) { var produtoPedido = Data.DAL.ProdutosPedidoEspelhoDAO.Instance.GetElementByPrimaryKey(sessao, id); return(ObterItemProdutoPedido(sessao, produtoPedido)); }
/// <summary> /// Salva os dados usando a sessão informada. /// </summary> /// <param name="sessao"></param> public void Salvar(GDA.GDASession sessao) { AplicarImpostos(sessao, ResultadoInterno); }
/// <summary> /// Recupera o item com base no ambiente do pedido. /// </summary> /// <param name="referencia"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.AmbientePedidoEspelho> .ObterItem(Data.Model.AmbientePedidoEspelho referencia) { using (var sessao = new GDA.GDASession()) return(ObterItemAmbientePedido(sessao, referencia)); }
public FotosImpostoServ[] GetByImpostoServ(GDA.GDASession session, uint idImpostoServ) { string sql = "Select * From fotos_imposto_serv Where idImpostoServ=" + idImpostoServ; return(objPersistence.LoadData(session, sql).ToList().ToArray()); }
/// <summary> /// Recupera o item com base no identificador do ambiente do pedido. /// </summary> /// <param name="id"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.AmbientePedidoEspelho> .ObterItem(int id) { using (var sessao = new GDA.GDASession()) return(((IProvedorItemRentabilidade <Data.Model.AmbientePedidoEspelho>) this).ObterItem(sessao, id)); }
/// <summary> /// Verifica se o imposto / serviço possui anexo. /// </summary> public bool PossuiAnexo(GDA.GDASession session, uint idImpostoServ) { string sql = "Select Count(*) From fotos_imposto_serv Where idImpostoServ=" + idImpostoServ; return(objPersistence.ExecuteSqlQueryCount(session, sql) > 0); }
/// <summary> /// Executa o calculo da rentabilidade para o ambiente do tipo principal. /// </summary> /// <param name="sessao"></param> /// <param name="id">Identificador do ambiente.</param> /// <returns></returns> Data.ICalculoRentabilidadeResultado Data.ICalculadoraRentabilidade <Data.Model.AmbientePedidoEspelho> .Calcular(GDA.GDASession sessao, uint id) { if (!CalculoHabilitado) { return(CriarResultadoNaoExecutado()); } var ambiente = Data.DAL.AmbientePedidoEspelhoDAO.Instance.GetElementByPrimaryKey(sessao, id); return((this as Data.ICalculadoraRentabilidade <Data.Model.AmbientePedidoEspelho>).Calcular(sessao, ambiente)); }
public int DeleteInstanceByPrimaryKey(GDA.GDASession session, uint Key) { return(Delete(session, GetElementByPrimaryKey(session, Key))); }
public string ObtemDescricao(GDA.GDASession session, uint idOrigemTrocaDesconto) { return(ObtemValorCampo <string>(session, "Descricao", "idOrigemTrocaDesconto=" + idOrigemTrocaDesconto)); }
/// <summary> /// Recupera um item de rentabilidade para o produto pedido informado. /// </summary> /// <param name="sessao"></param> /// <param name="produtoPedido"></param> /// <param name="prazoMedio"></param> /// <param name="produtos"></param> /// <param name="produtosPedidoFilhos">Relação dos produtos do pedidos filhos do produto informado.</param> /// <returns></returns> private IItemRentabilidade <Data.Model.ProdutosPedidoEspelho> ObterItemProdutoPedido( GDA.GDASession sessao, Data.Model.ProdutosPedidoEspelho produtoPedido, int prazoMedio, IEnumerable <Data.Model.Produto> produtos, IEnumerable <Data.Model.ProdutosPedidoEspelho> produtosPedidoFilhos) { var registros = new Lazy <IList <Data.Model.ProdutoPedidoEspelhoRentabilidade> >( () => Data.DAL.ProdutoPedidoEspelhoRentabilidadeDAO.Instance.ObterPorProdutoPedido(sessao, produtoPedido.IdProdPed)); var criarRegistro = new CriadorRegistroRentabilidade((tipo, nome, valor) => { var idRegistro = ProvedorDescritoresRegistro.ObterRegistro(tipo, nome); var registro = registros.Value.FirstOrDefault(f => f.Tipo == (int)tipo && f.IdRegistro == idRegistro); if (registro == null) { registro = new Data.Model.ProdutoPedidoEspelhoRentabilidade { IdProdPed = (int)produtoPedido.IdProdPed, IdRegistro = idRegistro, Tipo = (int)tipo, Valor = valor }; registros.Value.Add(registro); } else { registro.Valor = valor; } return(ConverterParaRegistroRentabilidade(registro)); }); // Carrega o produto associado var produto = produtos.First(f => f.IdProd == produtoPedido.IdProd); // Calculao custo do produto var custoProd = Global.CalculosFluxo.CalcTotaisItemProdFast(sessao, produto.TipoCalculo, produtoPedido.Altura, produtoPedido.Largura, produtoPedido.Qtde, produtoPedido.TotM, produto.CustoCompra, produtoPedido.AlturaBenef.GetValueOrDefault(2), produtoPedido.LarguraBenef.GetValueOrDefault(2)); if (produtosPedidoFilhos.Any()) { // Recupera os itens dos produtos filhos var itens = produtosPedidoFilhos.Select(produtoPedido1 => ObterItemProdutoPedido(sessao, produtoPedido1, prazoMedio, produtos, new Data.Model.ProdutosPedidoEspelho[0])) .ToList(); return(new ItemRentabilidadeContainer <Data.Model.ProdutosPedidoEspelho, Data.Model.ProdutoPedidoEspelhoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, produtoPedido, itens, f => true, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Produto ({produto?.CodInterno}) {produto?.Descricao}", PrecoVendaSemIPI = produtoPedido.Total + produtoPedido.ValorBenef, PrazoMedio = prazoMedio, PercentualComissao = produtoPedido.PercComissao / 100m, PercentualRentabilidade = produtoPedido.PercentualRentabilidade / 100m, RentabilidadeFinanceira = produtoPedido.RentabilidadeFinanceira }); } else { return new ItemRentabilidade <Data.Model.ProdutosPedidoEspelho, Data.Model.ProdutoPedidoEspelhoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, produtoPedido, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Produto ({produto.CodInterno}) {produto.Descricao}", PrecoVendaSemIPI = produtoPedido.Total + produtoPedido.ValorBenef, // Na atualiza configuração do sistema o total do produto não possui o valor do IPI PrecoCusto = custoProd, PrazoMedio = prazoMedio, PercentualICMSVenda = (decimal)produtoPedido.AliqIcms / 100m, FatorICMSSubstituicao = 0m, PercentualIPICompra = 0m, //(decimal)(produto?.AliqIPI ?? 0) / 100m, PercentualIPIVenda = (decimal)produtoPedido.AliqIpi / 100m, PercentualComissao = produtoPedido.PercComissao / 100m, CustosExtras = 0M, PercentualRentabilidade = produtoPedido.PercentualRentabilidade / 100m, RentabilidadeFinanceira = produtoPedido.RentabilidadeFinanceira } }; }
public string ObtemSqlAliquotaInternaIcmsSt(GDA.GDASession sessao, string idProd, string campoTotal, string campoValorDesconto, string campoAliquotaIcmsSt, string campoFastDelivery) { var valorIcmsSt = ObtemSqlValorIcmsSt(campoTotal, campoValorDesconto, campoAliquotaIcmsSt, campoFastDelivery); return($"({ valorIcmsSt } / { campoTotal }) * 100"); }
/// <summary> /// Recupera o item da rentabilidade para o pedido informado. /// </summary> /// <param name="session"></param> /// <param name="idPedido"></param> /// <returns></returns> private IItemRentabilidade ObterItemPedido(GDA.GDASession sessao, Data.Model.PedidoEspelho pedido) { var registros = new Lazy <IList <Data.Model.PedidoEspelhoRentabilidade> >( () => Data.DAL.PedidoEspelhoRentabilidadeDAO.Instance.ObterPorPedido(sessao, pedido.IdPedido)); var criarRegistro = new CriadorRegistroRentabilidade((tipo, nome, valor) => { var idRegistro = ProvedorDescritoresRegistro.ObterRegistro(tipo, nome); var registro = registros.Value.FirstOrDefault(f => f.Tipo == (int)tipo && f.IdRegistro == idRegistro); if (registro == null) { // Cria o registro da rentabilidade do pedido registro = new Data.Model.PedidoEspelhoRentabilidade { IdPedido = (int)pedido.IdPedido, IdRegistro = idRegistro, Tipo = (int)tipo, Valor = valor }; registros.Value.Add(registro); } else { registro.Valor = valor; } return(ConverterParaRegistroRentabilidade(registro)); }); int prazoMedio = CalcularPrazoMedioPedido(sessao, pedido.IdPedido); // Recupera os itens associados com todos os produtos do pedido var produtos = new LazyItemRentabilidadeEnumerable(ObterItensProdutosPedido(sessao, pedido, prazoMedio)); // Recupera os ambientes do pedido var ambientes = new LazyItemRentabilidadeEnumerable(ObterItensAmbientesPedido(sessao, pedido, prazoMedio, produtos.OfType <IItemRentabilidade <Data.Model.ProdutosPedidoEspelho> >())); var itens = produtos.Concat(ambientes); // Cria o filtro que recupera os itens para serem usados nos calculos var filtroItensParaCalculo = new Func <IItemRentabilidade, bool>((item) => { if (item is IItemRentabilidade <Data.Model.AmbientePedidoEspelho> ) { // Calcula a rentabilidade somente de ambientes com produtos return(((IItemRentabilidadeContainer)item).Itens.Any()); } var produtoPedido = (item as IItemRentabilidade <Data.Model.ProdutosPedidoEspelho>)?.Proprietario; return(produtoPedido != null && !produtoPedido.InvisivelFluxo && !produtoPedido.IdAmbientePedido.HasValue); }); decimal percentualComissao = 0; if (Glass.Configuracoes.PedidoConfig.Comissao.UsarComissaoPorProduto) { decimal percComissao = 0; var total = (pedido.Total - pedido.ValorIpi - pedido.ValorIcms) - pedido.ValorEntrega; if (total > 0) { foreach (var item in itens.Where(filtroItensParaCalculo)) { percComissao += ((item.PrecoVendaSemIPI * 100) / total) * (item.PercentualComissao); } } percentualComissao = percComissao / 100m; } else { percentualComissao = (decimal)Data.DAL.PedidoDAO.Instance.ObterPercentualComissao(sessao, (int)pedido.IdPedido) / 100m; } return(new ItemRentabilidadeContainer <Data.Model.PedidoEspelho, Data.Model.PedidoEspelhoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, pedido, itens, filtroItensParaCalculo, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Pedido {pedido.IdPedido}", PrecoVendaSemIPI = (pedido.Total - pedido.ValorIpi - pedido.ValorIcms) - pedido.ValorEntrega, PrazoMedio = prazoMedio, PercentualComissao = percentualComissao, CustosExtras = pedido.ValorEntrega, PercentualRentabilidade = pedido.PercentualRentabilidade / 100m, RentabilidadeFinanceira = pedido.RentabilidadeFinanceira }); }
/// <summary> /// Calcula uma cotação de compras, separando os melhores produtos por fornecedor /// de acordo com a prioridade de cálculo selecionada. Retorna os produtos por fornecedor. /// </summary> public Dictionary <DadosFornecedor, Entidade.CotacaoCompraCalculada[]> CalcularPorFornecedor(GDA.GDASession session, uint codigoCotacaoCompra, Glass.Data.Model.CotacaoCompra.TipoCalculoCotacao tipoCalculo) { // Dicionário que contém os dados de retorno Dictionary <DadosFornecedor, Entidade.CotacaoCompraCalculada[]> retorno = new Dictionary <DadosFornecedor, Entidade.CotacaoCompraCalculada[]>(); // Recupera os dados calculados var calculados = Calcular(session, codigoCotacaoCompra, tipoCalculo, false); // Agrupa os itens por fornecedor e os adiciona ao dicionário foreach (uint f in calculados.Select(x => x.CodigoFornecedor).Distinct()) { // Busca os itens do fornecedor var itensBase = (from c in calculados where c.CodigoFornecedor == f select c).ToArray(); // Separa as formas de pagamento definidas para o fornecedor var formasPagto = (from i in itensBase select new { i.CodigoParcela, i.DatasParcelasConfiguradas }).Distinct(); // Agrupa os itens por fornecedor e por forma de pagamento foreach (var fp in formasPagto) { // Recupera os itens que possuem a forma de pagamento indicada var itens = from i in itensBase where i.CodigoParcela == fp.CodigoParcela && i.DatasParcelasConfiguradas.Length == fp.DatasParcelasConfiguradas.Length select i; // Recupera o prazo de entrega da compra long prazoEntrega = itens.Max(x => x.PrazoEntregaDiasFornecedor); // Busca as datas das parcelas List <DateTime> datas = new List <DateTime>(); if (fp.CodigoParcela == -1) { datas.AddRange(fp.DatasParcelasConfiguradas); } else if (fp.CodigoParcela > 0) { DateTime dataBase = DateTime.Now; var p = ParcelasDAO.Instance.GetElement(session, (uint)fp.CodigoParcela); foreach (int dias in p.NumeroDias) { datas.Add(dataBase.AddDays(dias)); } } else { throw new Exception("Selecione a condição de pagamento do fornecedor para continuar."); } var dadosFornecedor = new DadosFornecedor(f, prazoEntrega, datas.ToArray()); /* Chamado 35091. */ // Adiciona o item ao dicionário if (!retorno.ContainsKey(dadosFornecedor)) { retorno.Add(dadosFornecedor, itens.ToArray()); } else { retorno[dadosFornecedor].ToList().AddRange(itens.ToArray()); } } } // Retorna o dicionário return(retorno); }
/// <summary> /// Recupera o item de rentabilidade para o ambiente do pedido. /// </summary> /// <param name="sessao"></param> /// <param name="ambiente"></param> /// <returns></returns> private IItemRentabilidade ObterItemAmbientePedido( GDA.GDASession sessao, Data.Model.AmbientePedidoEspelho ambiente, int prazoMedio, IEnumerable <IItemRentabilidade <Data.Model.ProdutosPedidoEspelho> > produtos) { var registros = new Lazy <IList <Data.Model.AmbientePedidoEspelhoRentabilidade> >( () => Data.DAL.AmbientePedidoEspelhoRentabilidadeDAO.Instance.ObterPorAmbiente(sessao, ambiente.IdAmbientePedido)); var criarRegistro = new CriadorRegistroRentabilidade((tipo, nome, valor) => { var idRegistro = ProvedorDescritoresRegistro.ObterRegistro(tipo, nome); var registro = registros.Value.FirstOrDefault(f => f.Tipo == (int)tipo && f.IdRegistro == idRegistro); if (registro == null) { // Cria o registro da rentabilidade do ambiente do pedido registro = new Data.Model.AmbientePedidoEspelhoRentabilidade { IdAmbientePedido = (int)ambiente.IdAmbientePedido, IdRegistro = idRegistro, Tipo = (int)tipo, Valor = valor }; registros.Value.Add(registro); } else { registro.Valor = valor; } return(ConverterParaRegistroRentabilidade(registro)); }); var produtosAmbiente = produtos.Select(f => f.Proprietario); // Calcula os valores dos produtos do ambiente var valorProdutos = produtosAmbiente.Sum(f => f.Total + f.ValorBenef); var valorDescontoAtual = produtosAmbiente.Sum(f => f.ValorDescontoProd); // Calcula o total do ambiente var total = valorProdutos - (!Glass.Configuracoes.PedidoConfig.RatearDescontoProdutos ? valorDescontoAtual : 0); var percentualComissao = 0m; if (Glass.Configuracoes.PedidoConfig.Comissao.UsarComissaoPorProduto) { decimal percComissao = 0; if (total > 0) { foreach (var prod in produtosAmbiente) { percComissao += ((prod.Total * 100) / total) * (prod.PercComissao / 100); } } percentualComissao = percComissao / 100m; } return(new ItemRentabilidadeContainer <Data.Model.AmbientePedidoEspelho, Data.Model.AmbientePedidoEspelhoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, ambiente, produtos, f => true, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Ambiente {ambiente.Ambiente}", PrecoVendaSemIPI = total, // Na atualiza configuração do sistema o total do ambiente não possui o valor do IPI PrazoMedio = prazoMedio, PercentualComissao = percentualComissao, PercentualRentabilidade = ambiente.PercentualRentabilidade / 100m, RentabilidadeFinanceira = ambiente.RentabilidadeFinanceira }); }
public IList <ProdutoInventarioEstoque> ObtemPorInventarioEstoque(GDA.GDASession session, uint idInventarioEstoque) { string sql = "select * from produto_inventario_estoque where idInventarioEstoque=" + idInventarioEstoque; return(objPersistence.LoadData(session, sql).ToList()); }
/// <summary> /// Recupera o item com base no produto do pedido. /// </summary> /// <param name="referencia"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.ProdutosNf> .ObterItem(GDA.GDASession sessao, Data.Model.ProdutosNf referencia) { return(ObterItemProdutoNf(sessao, referencia)); }