Пример #1
0
 private KhanPedidoServiceReference.ItemPedido ConverterItemPedido(
     Data.Model.ProdutosNf produtoNf,
     Data.Model.Produto produto,
     ref int sequencia)
 {
     return(new KhanPedidoServiceReference.ItemPedido
     {
         numped_int = (int)produtoNf.IdNf,
         seqped_int = 0,
         codempresa = this.configuracao.Empresa,
         seq = sequencia++,
         codpro = produto.CodInterno,
         codbar = string.Empty,
         qtdpro = produtoNf.Qtde,
         prunit = (float)produtoNf.ValorUnitario,
         vfrete = (float)produtoNf.ValorFrete,
         vdesc = (float)produtoNf.ValorDesconto,
         lote = string.Empty,
         PPIS = produtoNf.AliqPis,
         PCOFINS = produtoNf.AliqCofins,
         PIPI = produtoNf.AliqIpi,
         PICMS = produtoNf.AliqIcms,
         PICMSSUB = produtoNf.AliqIcmsSt,
         SITTRIB = "000",
         SITTRIB_IPI = string.Empty,
         SITTRIB_COFINS = string.Empty,
         SITTRIB_PIS = string.Empty,
     });
 }
Пример #2
0
 private KhanPedidoServiceReference.ItemPedido Converter(Data.Model.ProdutosNf produto)
 {
     return(new KhanPedidoServiceReference.ItemPedido
     {
         NUMBICO = null,
         NUMTICKET_TROCA = null,
         NUM_ABASTECIMENTO = null,
         NUM_SEQ_ABASTECIMENTO = null,
         PCOFINS = produto.AliqCofins,
         PICMS = produto.AliqIcms,
         PICMSSUB = produto.AliqIcmsSt,
         PIPI = produto.AliqIpi,
         PPIS = produto.AliqPis,
         SITTRIB = null,
         SITTRIB_COFINS = null,
         SITTRIB_IPI = null,
         SITTRIB_PIS = null,
         TANQUE = null,
         codbar = null,
         codempresa = null,
         codpro = produto.CodInterno,
         idt = 0,
         lote = null,
         numped_int = 0,
         obsvint = produto.Obs,
         prunit = (float)produto.ValorUnitario,
         qtdpro = produto.Qtde,
         seq = 0,
         seqped_int = 0,
         vdesc = 0,
         vfrete = (float)produto.ValorFrete,
     });
 }
Пример #3
0
        /// <summary>
        /// Recupera o item da rentabilidade para o custo do produto da nota fiscal.
        /// </summary>
        /// <param name="sessao"></param>
        /// <param name="produtoNf"></param>
        /// <param name="produtoNfCusto"></param>
        /// <param name="prazoMedio"></param>
        /// <param name="produto"></param>
        /// <returns></returns>
        private IItemRentabilidade <Data.Model.ProdutoNfCusto> ObterItemProdutoNfCusto(
            GDA.GDASession sessao, Data.Model.ProdutosNf produtoNf,
            Data.Model.ProdutoNfCusto produtoNfCusto, int prazoMedio, Data.Model.Produto produto)
        {
            var registros = new Lazy <IList <Data.Model.ProdutoNfCustoRentabilidade> >(
                () => Data.DAL.ProdutoNfCustoRentabilidadeDAO.Instance.ObterPorProdutoNf(sessao, produtoNfCusto.IdProdNfCusto));

            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.ProdutoNfCustoRentabilidade
                    {
                        IdProdNfCusto = produtoNfCusto.IdProdNfCusto,
                        IdRegistro    = idRegistro,
                        Tipo          = (int)tipo,
                        Valor         = valor
                    };
                    registros.Value.Add(registro);
                }
                else
                {
                    registro.Valor = valor;
                }

                return(ConverterParaRegistroRentabilidade(registro));
            });

            // Calcula o custo do produto
            var custoProd = Glass.Global.CalculosFluxo.CalcTotaisItemProdFast(sessao, produto.TipoCalculo,
                                                                              produtoNf.Altura, produtoNf.Largura, produtoNf.Qtde,
                                                                              produtoNf.TotM, produtoNfCusto.CustoCompra,
                                                                              produtoNf.AlturaBenef.GetValueOrDefault(2),
                                                                              produtoNf.LarguraBenef.GetValueOrDefault(2));

            var preceoVendaSemIPIUnitario = (produtoNf.Total + produtoNf.ValorIcmsSt) / (decimal)produtoNf.Qtde;

            return(new ItemRentabilidade <Data.Model.ProdutoNfCusto, Data.Model.ProdutoNfCustoRentabilidade>(
                       ProvedorIndicadoresFinanceiro, criarRegistro, produtoNfCusto, registros, ConverterParaRegistroRentabilidade)
            {
                Descricao = $"Produto [{produtoNfCusto.Qtde}] ({produto?.CodInterno}) {produto?.Descricao}",
                PrecoVendaSemIPI = preceoVendaSemIPIUnitario * produtoNfCusto.Qtde,
                PrecoCusto = custoProd,
                PrazoMedio = prazoMedio,
                PercentualICMSCompra = (decimal)(produtoNfCusto.AliqIcmsCompra ?? 0) / 100m,
                PercentualICMSVenda = (decimal)produtoNf.AliqIcms / 100m,
                FatorICMSSubstituicao = 0m,
                PercentualIPICompra = (decimal)(produtoNfCusto.AliqIpiCompra ?? 0) / 100m,
                PercentualIPIVenda = (decimal)produtoNf.AliqIpi / 100m,
                PercentualComissao = produtoNf.PercComissao / 100m,
                CustosExtras = 0m,
                PercentualRentabilidade = produtoNfCusto.PercentualRentabilidade / 100m,
                RentabilidadeFinanceira = produtoNfCusto.RentabilidadeFinanceira
            });
        }
Пример #4
0
        /// <summary>
        /// Recupera o item de rentabilidade para o produto da nota fiscal.
        /// </summary>
        /// <param name="sessao"></param>
        /// <param name="produtoNf"></param>
        /// <returns></returns>
        private IItemRentabilidade ObterItemProdutoNf(GDA.GDASession sessao, Data.Model.ProdutosNf produtoNf)
        {
            var prazoMedio = CalcularPrazoMedioNotaFiscal(sessao, produtoNf.IdNf);
            var produto    = Data.DAL.ProdutoDAO.Instance.GetElementByPrimaryKey(produtoNf.IdProd);
            var custos     = Data.DAL.ProdutoNfCustoDAO.Instance.ObterCustosPorProdutoNotaFiscal(sessao, produtoNf.IdProdNf);

            return(ObterItemProdutoNf(sessao, produtoNf, custos, prazoMedio, new[] { produto }));
        }
Пример #5
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="produtoNf"></param>
 /// <param name="naturezaOperacao"></param>
 /// <param name="produto"></param>
 public ProdutoNfItemImposto(
     Data.Model.ProdutosNf produtoNf,
     Fiscal.Negocios.Entidades.NaturezaOperacao naturezaOperacao,
     Global.Negocios.Entidades.Produto produto)
 {
     ProdutoNf        = produtoNf;
     NaturezaOperacao = naturezaOperacao;
     Produto          = produto;
 }
Пример #6
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));
        }
Пример #7
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));
 }
Пример #8
0
 /// <summary>
 /// Recupera o item com base no produto do pedido.
 /// </summary>
 /// <param name="referencia"></param>
 /// <returns></returns>
 IItemRentabilidade IProvedorItemRentabilidade <Data.Model.ProdutosNf> .ObterItem(Data.Model.ProdutosNf referencia)
 {
     using (var sessao = new GDA.GDASession())
         return(ObterItemProdutoNf(sessao, referencia));
 }
Пример #9
0
        /// <summary>
        /// Recupera um item de rentabilidade para o produto pedido informado.
        /// </summary>
        /// <param name="sessao"></param>
        /// <param name="produtoNf"></param>
        /// <param name="produtoNfCustos">Custos associados.</param>
        /// <param name="prazoMedio"></param>
        /// <param name="produtos"></param>
        /// <returns></returns>
        private IItemRentabilidade <Data.Model.ProdutosNf> ObterItemProdutoNf(
            GDA.GDASession sessao, Data.Model.ProdutosNf produtoNf,
            IEnumerable <Data.Model.ProdutoNfCusto> produtoNfCustos,
            int prazoMedio, IEnumerable <Data.Model.Produto> produtos)
        {
            var registros = new Lazy <IList <Data.Model.ProdutoNfRentabilidade> >(
                () => Data.DAL.ProdutoNfRentabilidadeDAO.Instance.ObterPorProdutoNf(sessao, produtoNf.IdProdNf));

            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.ProdutoNfRentabilidade
                    {
                        IdProdNf   = (int)produtoNf.IdProdNf,
                        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.FirstOrDefault(f => f.IdProd == produtoNf.IdProd);

            if (!produtoNfCustos.Any())
            {
                produtoNfCustos = new[]
                {
                    new Data.Model.ProdutoNfCusto
                    {
                        IdProdNf        = produtoNf.IdProdNf,
                        IdProdNfEntrada = 0,
                        Qtde            = (int)produtoNf.Qtde,
                        CustoCompra     = produto.CustoCompra
                    }
                }
            }
            ;

            var qtdeProdutoNfCustos = produtoNfCustos.Count();

            if (qtdeProdutoNfCustos > 1)
            {
                var itens = produtoNfCustos.Select(produtoNfCusto => ObterItemProdutoNfCusto(sessao, produtoNf, produtoNfCusto, prazoMedio, produto));

                return(new ItemRentabilidadeContainer <Data.Model.ProdutosNf, Data.Model.ProdutoNfRentabilidade>(
                           ProvedorIndicadoresFinanceiro, criarRegistro,
                           produtoNf, itens, f => true, registros,
                           ConverterParaRegistroRentabilidade)
                {
                    Descricao = $"Produto ({produto?.CodInterno}) {produto?.Descricao}",
                    PrecoVendaSemIPI = produtoNf.Total + produtoNf.ValorIcmsSt,
                    PrazoMedio = prazoMedio,
                    PercentualComissao = produtoNf.PercComissao / 100m,
                    PercentualRentabilidade = produtoNf.PercentualRentabilidade / 100m,
                    RentabilidadeFinanceira = produtoNf.RentabilidadeFinanceira
                });
            }
            else
            {
                var custoCompra = qtdeProdutoNfCustos == 1 ? produtoNfCustos.First().CustoCompra : produto.CustoCompra;

                // Calcula o custo do produto
                var custoProd = Glass.Global.CalculosFluxo.CalcTotaisItemProdFast(sessao, produto.TipoCalculo,
                                                                                  produtoNf.Altura, produtoNf.Largura, produtoNf.Qtde,
                                                                                  produtoNf.TotM, custoCompra,
                                                                                  produtoNf.AlturaBenef.GetValueOrDefault(2),
                                                                                  produtoNf.LarguraBenef.GetValueOrDefault(2));

                return(new ItemRentabilidade <Data.Model.ProdutosNf, Data.Model.ProdutoNfRentabilidade>(
                           ProvedorIndicadoresFinanceiro, criarRegistro, produtoNf, registros, ConverterParaRegistroRentabilidade)
                {
                    Descricao = $"Produto ({produto?.CodInterno}) {produto?.Descricao}",
                    PrecoVendaSemIPI = produtoNf.Total + produtoNf.ValorIcmsSt, // Não atualizar a configuração do sistema o total do produto não possui o valor do IPI
                    PrecoCusto = custoProd,
                    PrazoMedio = prazoMedio,
                    PercentualICMSCompra = (decimal)(produtoNfCustos.FirstOrDefault()?.AliqIcmsCompra ?? 0f) / 100m,
                    PercentualICMSVenda = (decimal)produtoNf.AliqIcms / 100m,
                    FatorICMSSubstituicao = 0m,
                    PercentualIPICompra = (decimal)(produtoNfCustos.FirstOrDefault()?.AliqIpiCompra ?? 0f) / 100m,
                    PercentualIPIVenda = (decimal)produtoNf.AliqIpi / 100m,
                    PercentualComissao = produtoNf.PercComissao / 100m,
                    CustosExtras = 0m,
                    PercentualRentabilidade = produtoNf.PercentualRentabilidade / 100m,
                    RentabilidadeFinanceira = produtoNf.RentabilidadeFinanceira
                });
            }
        }