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