Beispiel #1
0
 /// <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));
 }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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());
        }
Beispiel #4
0
        /// <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));
        }
Beispiel #5
0
 /// <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;
 }
Beispiel #6
0
 /// <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));
 }
Beispiel #7
0
        /// <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));
        }
Beispiel #8
0
 /// <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);
Beispiel #9
0
        /// <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;
 }
Beispiel #11
0
 /// <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);
Beispiel #12
0
        /// <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));
        }
Beispiel #13
0
        /// <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));
        }
Beispiel #14
0
        /// <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));
        }
Beispiel #15
0
        /// <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));
        }
Beispiel #16
0
 /// <summary>
 /// Salva os dados usando a sessão informada.
 /// </summary>
 /// <param name="sessao"></param>
 public void Salvar(GDA.GDASession sessao)
 {
     AplicarImpostos(sessao, ResultadoInterno);
 }
Beispiel #17
0
 /// <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));
 }
Beispiel #18
0
        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());
        }
Beispiel #19
0
 /// <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));
 }
Beispiel #20
0
        /// <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);
        }
Beispiel #21
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));
        }
Beispiel #22
0
 public int DeleteInstanceByPrimaryKey(GDA.GDASession session, uint Key)
 {
     return(Delete(session, GetElementByPrimaryKey(session, Key)));
 }
Beispiel #23
0
 public string ObtemDescricao(GDA.GDASession session, uint idOrigemTrocaDesconto)
 {
     return(ObtemValorCampo <string>(session, "Descricao", "idOrigemTrocaDesconto=" + idOrigemTrocaDesconto));
 }
Beispiel #24
0
        /// <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
                       }
            };
        }
Beispiel #25
0
        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");
        }
Beispiel #26
0
        /// <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
            });
        }
Beispiel #27
0
        /// <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);
        }
Beispiel #28
0
        /// <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
            });
        }
Beispiel #29
0
        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());
        }
Beispiel #30
0
 /// <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));
 }