示例#1
0
        public float ObtemAliquotaIcmsSt(Model.IProdutoIcmsSt produto, bool saida)
        {
            var aliqIcmsProd   = produto is Model.Produto ? produto.AliquotaIcms : IcmsProdutoUfDAO.Instance.ObterIcmsPorProduto(null, (uint)produto.IdProd, (uint)_idLoja, (uint?)_idFornec, (uint?)_idCliente);
            var aliqIcmsStProd = produto is Model.Produto ? produto.AliquotaIcmsSt : IcmsProdutoUfDAO.Instance.ObterAliquotaIcmsSt(_sessao, (uint)produto.IdProd, (uint)_idLoja, (uint?)_idFornec, (uint?)_idCliente);

            return(produto.AliquotaIcmsSt > 0 ? produto.AliquotaIcmsSt : aliqIcmsStProd > 0 ? aliqIcmsStProd : produto.AliquotaIcms > 0 ? produto.AliquotaIcms : aliqIcmsProd);
        }
示例#2
0
        public float ObtemAliquotaInternaIcmsSt(Model.IProdutoIcmsSt produto, bool saida)
        {
            // Esse método ainda não é alterado com base nos tipos de cálculo de ICMS ST
            // conforme definido na tela de configurações
            var valor = ObtemValorIcmsSt(produto, saida);

            return(produto.Total > 0 ? (float)((valor / produto.Total) * 100) : 0);
        }
示例#3
0
        public decimal ObtemValorIcmsSt(Model.IProdutoIcmsSt produto, bool saida)
        {
            var baseCalculo       = ObtemBaseCalculoIcmsSt(produto, saida);
            var aliqIcmsProd      = produto is Model.Produto ? produto.AliquotaIcms : IcmsProdutoUfDAO.Instance.ObterIcmsPorProduto(null, (uint)produto.IdProd, (uint)_idLoja, (uint?)_idFornec, (uint?)_idCliente);
            var aliqIcmsStProd    = produto is Model.Produto ? produto.AliquotaIcmsSt : IcmsProdutoUfDAO.Instance.ObterAliquotaIcmsSt(_sessao, (uint)produto.IdProd, (uint)_idLoja, (uint?)_idFornec, (uint?)_idCliente);
            var valorIcmsADebitar = (produto.ValorIcms > 0 ? produto.ValorIcms : ((produto.Total - produto.ValorDesconto) * (decimal)(aliqIcmsProd / 100)));

            return(baseCalculo * ((decimal)aliqIcmsStProd / 100) - (_debitarIcmsDoIcmsSt ? valorIcmsADebitar : 0));
        }
示例#4
0
        public decimal ObtemBaseCalculoIcmsSt(Model.IProdutoIcmsSt produto, bool saida)
        {
            if (produto.AliquotaIcms == 0)
            {
                return(0);
            }

            var valorIcmsSt = ObtemValorIcmsSt(produto, saida);

            return((produto.ValorIcms + valorIcmsSt) / (decimal)(produto.AliquotaIcms / 100));
        }
示例#5
0
        public float ObtemAliquotaInternaIcmsSt(Model.IProdutoIcmsSt produto, bool saida)
        {
            var dados     = MvaProdutoUfDAO.Instance.ObterDadosParaBuscar(_sessao, (uint)_idLoja, _idFornec, (uint?)_idCliente, saida);
            var dadosIcms = IcmsProdutoUfDAO.Instance.ObtemPorProduto(_sessao, (uint)produto.IdProd, dados.UfOrigem, dados.UfDestino, dados.TipoCliente);

            if (dadosIcms == null)
            {
                return(0);
            }

            var tipoCalculoIcmsSt = ObterCalculoAliquotaIcmsSt();
            var aliqICMS          = (decimal)dadosIcms.AliquotaInterestadual;
            var aliqICMSST        = (decimal)produto.AliquotaIcmsSt;
            var aliqIPI           = (decimal)produto.AliquotaIpi;

            if (aliqICMSST == 0)
            {
                aliqICMSST = (decimal)dadosIcms.AliquotaIntraestadual;
            }

            // SE a origem e destino forem iguais, iguala a alíquota interestadual com a intraestadual, para que o cálculo abaixo
            // "(aliqICMSST - aliqICMS)" fique correto (zerado)
            if (!string.IsNullOrEmpty(dados.UfOrigem) && dados.UfOrigem == dados.UfDestino)
            {
                aliqICMS = aliqICMSST;
            }

            var mva = produto.MvaProdutoNf > 0 ? (decimal)produto.MvaProdutoNf :
                      Math.Round((decimal)MvaProdutoUfDAO.Instance.ObterMvaPorProduto(_sessao, produto.IdProd, (uint)_idLoja, dados.UfOrigem, dados.UfDestino, dados.Simples, dados.TipoCliente, saida), 2);

            switch (tipoCalculoIcmsSt)
            {
            case NFeUtils.ConfigNFe.TipoCalculoIcmsSt.SemIpi:
            {
                return((float)((mva * aliqICMSST) / 100 + (aliqICMSST - aliqICMS)));
            }

            case NFeUtils.ConfigNFe.TipoCalculoIcmsSt.ComIpiNoCalculo:
            {
                return((float)((((aliqIPI * (1 + (mva / 100))) + mva) * aliqICMSST) / 100 + (aliqICMSST - aliqICMS)));
            }

            case NFeUtils.ConfigNFe.TipoCalculoIcmsSt.ComIpiEmbutidoNoPreco:
            {
                return((float)((((((aliqIPI * (1 + (mva / 100))) + mva) * aliqICMSST) / 100) + (aliqICMSST - aliqICMS)) / (1 + (aliqIPI / 100))));
            }

            default:
            {
                throw new NotImplementedException($"Tipo de cálculo { tipoCalculoIcmsSt }");
            }
            }
        }
示例#6
0
        public decimal ObtemValorIcmsSt(Model.IProdutoIcmsSt produto, bool saida)
        {
            if (produto.AliquotaIcms == 0)
            {
                return(0);
            }

            var baseCalculo   = produto.Total + produto.ValorIpi + produto.ValorFrete + produto.ValorSeguro + produto.ValorOutrasDespesas - produto.ValorDesconto;
            var valorAgregado = baseCalculo * (decimal)(_margemLucro / 100);

            return(valorAgregado * (decimal)(_percCargaTributaria / 100));
        }
示例#7
0
        public float ObtemAliquotaIcmsSt(Model.IProdutoIcmsSt produto, bool saida)
        {
            if (produto.AliquotaIcms == 0)
            {
                return(0);
            }

            var valorIcmsSt = ObtemValorIcmsSt(produto, saida);
            var baseCalculo = ObtemBaseCalculoIcmsSt(produto, saida);

            return((float)(valorIcmsSt / baseCalculo) * 100);
        }
示例#8
0
        public decimal ObtemBaseCalculoIcmsSt(Model.IProdutoIcmsSt produto, bool saida)
        {
            var aliqIcmsProd      = produto is Model.Produto ? ProdutoDAO.Instance.ObtemValorCampo <float>("AliqIcms", $"IdProd={ produto.IdProd }") : produto.AliquotaIcms;
            var baseCalc          = produto.Total + produto.ValorIpi + produto.ValorFrete + produto.ValorSeguro + produto.ValorOutrasDespesas - produto.ValorDesconto;
            var tipoCalculoIcmsSt = ObterCalculoAliquotaIcmsSt();

            //Chamado: 54090
            if (tipoCalculoIcmsSt == NFeUtils.ConfigNFe.TipoCalculoIcmsSt.SemIpi)
            {
                baseCalc -= produto.ValorIpi;
            }

            // Se o cliente for do Amapá e se ele for da cidade de Amapá ou Santana,
            // o valor do icms deve ser deduzido direto da BC do ICMS ST
            if (_idCliente > 0 && !string.IsNullOrEmpty(_suframaCliente))
            {
                if (_codIbgeCidadeCliente == "1600303" || _codIbgeCidadeCliente == "1600600")
                {
                    var valorIcmsADebitar = produto.ValorIcms > 0 ? produto.ValorIcms : (produto.Total - produto.ValorDesconto) * (decimal)(aliqIcmsProd / 100);
                    baseCalc -= valorIcmsADebitar;
                }
            }

            var mva = produto.MvaProdutoNf > 0 ? produto.MvaProdutoNf : Math.Round(MvaProdutoUfDAO.Instance.ObterMvaPorProduto(_sessao, produto.IdProd, (uint)_idLoja, _idFornec, (uint?)_idCliente, saida), 2);

            if (UserInfo.GetUserInfo.UfLoja == "AM")
            {
                if (produto.PercentualReducaoBaseCalculo > 0)
                {
                    baseCalc = baseCalc - ((decimal)(produto.PercentualReducaoBaseCalculo / 100) * baseCalc);
                }

                baseCalc *= (decimal)(1 + (mva / 100));
            }
            else
            {
                baseCalc *= (decimal)(1 + (mva / 100));

                if (produto.PercentualReducaoBaseCalculo > 0)
                {
                    baseCalc *= (decimal)(produto.PercentualReducaoBaseCalculo / 100);
                }
            }

            //Chamado: 54090
            if (tipoCalculoIcmsSt == NFeUtils.ConfigNFe.TipoCalculoIcmsSt.ComIpiEmbutidoNoPreco)
            {
                baseCalc -= produto.ValorIpi;
            }

            return(baseCalc);
        }