Esempio n. 1
0
        /// <summary>
        /// Importa os produtos de uma Nfe
        /// </summary>
        /// <param name="nfe"></param>
        public List <EntradaProduto> Importar(TNfeProc nfe)
        {
            const string VERSAO2 = "2.00";
            const string VERSAO3 = "3.10";
            const string VERSAO4 = "4.00";

            try
            {
                CultureInfo           ci                 = new CultureInfo("en-US"); // usado para connversão dos números do xml
                string                numeroNF           = nfe.NFe.infNFe.ide.nNF;
                string                versaoNF           = nfe.NFe.infNFe.versao;
                string                cpf_cnpjFornecedor = nfe.NFe.infNFe.emit.Item;
                IEnumerable <Entrada> entradas           = GerenciadorEntrada.GetInstance().ObterPorNumeroNotaFiscalFornecedor(numeroNF, cpf_cnpjFornecedor);
                if (entradas.Count() == 0)
                {
                    throw new NegocioException("A entrada não foi encontrada para realizar o cadastro de produtos");
                }
                Entrada entrada = entradas.ElementAtOrDefault(0);
                List <EntradaProduto> listaProtutos = new List <EntradaProduto>();
                foreach (TNFeInfNFeDet produto in nfe.NFe.infNFe.det)
                {
                    EntradaProduto entradaProduto = new EntradaProduto();
                    entradaProduto.Cfop          = Convert.ToInt32(produto.prod.CFOP);
                    entradaProduto.CodEntrada    = entrada.CodEntrada;
                    entradaProduto.CodFornecedor = entrada.CodFornecedor;
                    ProdutoPesquisa produtoPesquisa = null;
                    if (!string.IsNullOrEmpty(produto.prod.cEAN))
                    {
                        produtoPesquisa = GerenciadorProduto.GetInstance().ObterPorCodigoBarraExato(produto.prod.cEAN).ElementAtOrDefault(0);
                    }

                    entradaProduto.CodProduto             = (produtoPesquisa != null) ? produtoPesquisa.CodProduto : 1;
                    entradaProduto.DataEntrada            = entrada.DataEntrada;
                    entradaProduto.FornecedorEhFabricante = entrada.FornecedorEhFabricante;
                    if (entrada.ValorFrete > 0)
                    {
                        entradaProduto.Frete = ((entrada.ValorFrete / entrada.TotalProdutos) * 100);
                    }
                    else
                    {
                        entradaProduto.Frete = 0;
                    }
                    entradaProduto.Ncmsh       = produto.prod.NCM;
                    entradaProduto.NomeProduto = produto.prod.xProd.Length > 50 ? produto.prod.xProd.Substring(0, 50).ToUpper() : produto.prod.xProd.ToUpper();

                    entradaProduto.Quantidade          = Convert.ToDecimal(produto.prod.qCom, ci);
                    entradaProduto.QuantidadeEmbalagem = (produtoPesquisa == null) ? 1 : produtoPesquisa.QuantidadeEmbalagem;
                    entradaProduto.Simples             = (produtoPesquisa == null) ? 8 : produtoPesquisa.Simples;
                    entradaProduto.UnidadeCompra       = produto.prod.uCom;
                    entradaProduto.ValorDesconto       = Convert.ToDecimal(produto.prod.vDesc, ci);
                    entradaProduto.ValorUnitario       = Convert.ToDecimal(produto.prod.vUnCom, ci);
                    entradaProduto.Desconto            = Convert.ToDecimal(produto.prod.vDesc, ci) / entradaProduto.ValorTotal * 100;
                    entradaProduto.CodigoBarra         = produto.prod.cEAN;



                    entradaProduto.ReferenciaFabricante = produto.prod.cProd;

                    for (int i = 0; i < produto.imposto.Items.Length; i++)
                    {
                        if (produto.imposto.Items[i] is TNFeInfNFeDetImpostoICMS)
                        {
                            var icms = ((TNFeInfNFeDetImpostoICMS)produto.imposto.Items[i]).Item;
                            if (icms is TNFeInfNFeDetImpostoICMSICMS00)
                            {
                                TNFeInfNFeDetImpostoICMSICMS00 icms00 = ((TNFeInfNFeDetImpostoICMSICMS00)icms);;
                                entradaProduto.BaseCalculoICMS   = Convert.ToDecimal(icms00.vBC, ci);
                                entradaProduto.BaseCalculoICMSST = 0;
                                entradaProduto.CodCST            = icms00.orig.ToString().Substring(4) + icms00.CST.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms00.orig.ToString().Substring(4) + icms00.CST.ToString().Substring(4);
                                entradaProduto.Icms           = Convert.ToDecimal(icms00.pICMS, ci);
                                entradaProduto.IcmsSubstituto = 0;
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMS10)
                            {
                                TNFeInfNFeDetImpostoICMSICMS10 icms10 = ((TNFeInfNFeDetImpostoICMSICMS10)icms);;
                                entradaProduto.BaseCalculoICMS   = Convert.ToDecimal(icms10.vBC, ci);
                                entradaProduto.BaseCalculoICMSST = Convert.ToDecimal(icms10.vBCST, ci);
                                entradaProduto.CodCST            = icms10.orig.ToString().Substring(4) + icms10.CST.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms10.orig.ToString().Substring(4) + icms10.CST.ToString().Substring(4);
                                entradaProduto.Icms = Convert.ToDecimal(icms10.pICMS, ci);
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100; //Convert.ToDecimal(icms10.pICMSST, ci);
                                }
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMS20)
                            {
                                TNFeInfNFeDetImpostoICMSICMS20 icms20 = ((TNFeInfNFeDetImpostoICMSICMS20)icms);;
                                entradaProduto.BaseCalculoICMS   = Convert.ToDecimal(icms20.vBC, ci);
                                entradaProduto.BaseCalculoICMSST = 0;
                                entradaProduto.CodCST            = icms20.orig.ToString().Substring(4) + icms20.CST.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms20.orig.ToString().Substring(4) + icms20.CST.ToString().Substring(4);
                                entradaProduto.Icms           = Convert.ToDecimal(icms20.pICMS, ci);
                                entradaProduto.IcmsSubstituto = 0; //Convert.ToDecimal(icms10.pICMSST, ci);
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMS30)
                            {
                                TNFeInfNFeDetImpostoICMSICMS30 icms30 = ((TNFeInfNFeDetImpostoICMSICMS30)icms);;
                                entradaProduto.BaseCalculoICMS   = 0;
                                entradaProduto.BaseCalculoICMSST = Convert.ToDecimal(icms30.vBCST, ci);
                                entradaProduto.CodCST            = icms30.orig.ToString().Substring(4) + icms30.CST.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms30.orig.ToString().Substring(4) + icms30.CST.ToString().Substring(4);
                                entradaProduto.Icms = 0;
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100; //Convert.ToDecimal(icms10.pICMSST, ci);
                                }
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMS40)
                            {
                                TNFeInfNFeDetImpostoICMSICMS40 icms40 = ((TNFeInfNFeDetImpostoICMSICMS40)icms);;
                                entradaProduto.BaseCalculoICMS   = 0;
                                entradaProduto.BaseCalculoICMSST = 0;
                                entradaProduto.CodCST            = icms40.orig.ToString().Substring(4) + icms40.CST.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms40.orig.ToString().Substring(4) + icms40.CST.ToString().Substring(4);
                                entradaProduto.Icms = 0;
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100; //Convert.ToDecimal(icms10.pICMSST, ci);
                                }
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMS60)
                            {
                                TNFeInfNFeDetImpostoICMSICMS60 icms60 = ((TNFeInfNFeDetImpostoICMSICMS60)icms);;
                                entradaProduto.BaseCalculoICMS   = 0;
                                entradaProduto.BaseCalculoICMSST = Convert.ToDecimal(icms60.vBCSTRet, ci);
                                entradaProduto.CodCST            = icms60.orig.ToString().Substring(4) + icms60.CST.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms60.orig.ToString().Substring(4) + icms60.CST.ToString().Substring(4);
                                entradaProduto.Icms = Convert.ToDecimal(icms60.vICMSSTRet, ci);
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100; //Convert.ToDecimal(icms10.pICMSST, ci);
                                }
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMS70)
                            {
                                TNFeInfNFeDetImpostoICMSICMS70 icms70 = ((TNFeInfNFeDetImpostoICMSICMS70)icms);;
                                entradaProduto.BaseCalculoICMS   = Convert.ToDecimal(icms70.vBC, ci);
                                entradaProduto.BaseCalculoICMSST = Convert.ToDecimal(icms70.vBCST, ci);
                                entradaProduto.CodCST            = icms70.orig.ToString().Substring(4) + icms70.CST.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms70.orig.ToString().Substring(4) + icms70.CST.ToString().Substring(4);
                                entradaProduto.Icms = Convert.ToDecimal(icms70.pICMS, ci);
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100; //Convert.ToDecimal(icms10.pICMSST, ci);
                                }
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMSSN101)
                            {
                                TNFeInfNFeDetImpostoICMSICMSSN101 icms101 = ((TNFeInfNFeDetImpostoICMSICMSSN101)icms);;
                                entradaProduto.BaseCalculoICMS   = 0;
                                entradaProduto.BaseCalculoICMSST = 0;
                                entradaProduto.CodCST            = icms101.orig.ToString().Substring(4) + icms101.CSOSN.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms101.orig.ToString().Substring(4) + icms101.CSOSN.ToString().Substring(4);
                                entradaProduto.Icms           = Convert.ToDecimal(icms101.pCredSN, ci);
                                entradaProduto.IcmsSubstituto = 0;
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMSSN102)
                            {
                                TNFeInfNFeDetImpostoICMSICMSSN102 icms102 = ((TNFeInfNFeDetImpostoICMSICMSSN102)icms);;
                                entradaProduto.BaseCalculoICMS   = 0;
                                entradaProduto.BaseCalculoICMSST = 0;
                                entradaProduto.CodCST            = icms102.orig.ToString().Substring(4) + icms102.CSOSN.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms102.orig.ToString().Substring(4) + icms102.CSOSN.ToString().Substring(4);
                                entradaProduto.Icms           = 0;
                                entradaProduto.IcmsSubstituto = 0;
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMSSN900)
                            {
                                TNFeInfNFeDetImpostoICMSICMSSN900 icms900 = ((TNFeInfNFeDetImpostoICMSICMSSN900)icms);;
                                entradaProduto.BaseCalculoICMS   = Convert.ToDecimal(icms900.vBC, ci);
                                entradaProduto.BaseCalculoICMSST = Convert.ToDecimal(icms900.vBCST, ci);
                                entradaProduto.CodCST            = icms900.orig.ToString().Substring(4) + icms900.CSOSN.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms900.orig.ToString().Substring(4) + icms900.CSOSN.ToString().Substring(4);
                                entradaProduto.Icms           = Convert.ToDecimal(icms900.pICMS, ci);
                                entradaProduto.IcmsSubstituto = 0;
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100;
                                }
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMSSN201)
                            {
                                TNFeInfNFeDetImpostoICMSICMSSN201 icms201 = ((TNFeInfNFeDetImpostoICMSICMSSN201)icms);;
                                entradaProduto.BaseCalculoICMS   = 0;
                                entradaProduto.BaseCalculoICMSST = Convert.ToDecimal(icms201.vBCST, ci);
                                entradaProduto.CodCST            = icms201.orig.ToString().Substring(4) + icms201.CSOSN.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms201.orig.ToString().Substring(4) + icms201.CSOSN.ToString().Substring(4);
                                entradaProduto.Icms = 0;
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100;
                                }
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMSSN202)
                            {
                                TNFeInfNFeDetImpostoICMSICMSSN202 icms202 = ((TNFeInfNFeDetImpostoICMSICMSSN202)icms);;
                                entradaProduto.BaseCalculoICMS   = 0;
                                entradaProduto.BaseCalculoICMSST = Convert.ToDecimal(icms202.vBCST, ci);
                                entradaProduto.CodCST            = icms202.orig.ToString().Substring(4) + icms202.CSOSN.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms202.orig.ToString().Substring(4) + icms202.CSOSN.ToString().Substring(4);
                                entradaProduto.Icms = 0;
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100;
                                }
                            }
                            else if (icms is TNFeInfNFeDetImpostoICMSICMSSN500)
                            {
                                TNFeInfNFeDetImpostoICMSICMSSN500 icms500 = ((TNFeInfNFeDetImpostoICMSICMSSN500)icms);;
                                entradaProduto.BaseCalculoICMS   = 0;
                                entradaProduto.BaseCalculoICMSST = Convert.ToDecimal(icms500.vBCSTRet, ci);
                                entradaProduto.CodCST            = icms500.orig.ToString().Substring(4) + icms500.CSOSN.ToString().Substring(4);
                                entradaProduto.CodCSTNFe         = icms500.orig.ToString().Substring(4) + icms500.CSOSN.ToString().Substring(4);
                                entradaProduto.Icms = 0;
                                if (entrada.TotalProdutosST > 0)
                                {
                                    entradaProduto.IcmsSubstituto = entrada.TotalSubstituicao / entrada.TotalProdutosST * 100;
                                }
                            }

                            else
                            {
                                throw new NegocioException("Existe um imposto ICMS não tratado pela importação. Avise ao administrador.");
                            }
                        }
                        else if (versaoNF.Equals(VERSAO2))
                        {
                            if (produto.imposto.Items[i] is Dominio.NFE2.TNFeInfNFeDetImpostoIPI)
                            {
                                Dominio.NFE2.TNFeInfNFeDetImpostoIPI impostoIPI = (Dominio.NFE2.TNFeInfNFeDetImpostoIPI)produto.imposto.Items[i];

                                if (impostoIPI.Item is Dominio.NFE2.TNFeInfNFeDetImpostoIPIIPITrib)
                                {
                                    Dominio.NFE2.TNFeInfNFeDetImpostoIPIIPITrib ipiTrib = ((Dominio.NFE2.TNFeInfNFeDetImpostoIPIIPITrib)impostoIPI.Item);
                                    entradaProduto.Ipi = Convert.ToDecimal(ipiTrib.vIPI, ci) / entradaProduto.ValorTotal * 100;
                                }
                            }
                        }
                        else if (versaoNF.Equals(VERSAO3) || versaoNF.Equals(VERSAO4))
                        {
                            if (produto.imposto.Items[i] is TIpi)
                            {
                                TIpi ipi = (TIpi)produto.imposto.Items[i];
                                if (ipi.Item is TIpiIPITrib)
                                {
                                    TIpiIPITrib impostoIPI = (TIpiIPITrib)ipi.Item;
                                    entradaProduto.Ipi = Convert.ToDecimal(impostoIPI.vIPI, ci) / entradaProduto.ValorTotal * 100;
                                }
                                else
                                {
                                    entradaProduto.Ipi = 0;
                                }
                            }
                        }
                    }

                    Produto produtoCalculo = new Produto()
                    {
                        Desconto          = entradaProduto.Desconto,
                        Icms              = entradaProduto.Icms,
                        IcmsSubstituto    = entradaProduto.IcmsSubstituto,
                        Ipi               = entradaProduto.Ipi,
                        Frete             = entradaProduto.Frete,
                        Simples           = entradaProduto.Simples,
                        UltimoPrecoCompra = (entradaProduto.ValorUnitario / entradaProduto.QuantidadeEmbalagem)
                    };

                    entradaProduto.PrecoCusto = produtoCalculo.PrecoCusto;

                    if (produtoPesquisa == null)
                    {
                        entradaProduto.LucroPrecoRevenda      = 15;
                        entradaProduto.LucroPrecoVendaAtacado = 30;
                        entradaProduto.LucroPrecoVendaVarejo  = 35;
                        entradaProduto.QtdProdutoAtacado      = 0;
                    }
                    else
                    {
                        entradaProduto.LucroPrecoRevenda      = produtoPesquisa.LucroPrecoRevenda;
                        entradaProduto.LucroPrecoVendaAtacado = produtoPesquisa.LucroPrecoVendaAtacado;
                        entradaProduto.LucroPrecoVendaVarejo  = produtoPesquisa.LucroPrecoVendaVarejo;
                        entradaProduto.QtdProdutoAtacado      = produtoPesquisa.QtdProdutoAtacado;
                    }

                    produtoCalculo.LucroPrecoRevenda      = entradaProduto.LucroPrecoRevenda;
                    produtoCalculo.LucroPrecoVendaAtacado = entradaProduto.LucroPrecoVendaAtacado;
                    produtoCalculo.LucroPrecoVendaVarejo  = entradaProduto.LucroPrecoVendaVarejo;

                    entradaProduto.PrecoRevendaSugestao      = produtoCalculo.PrecoRevendaSugestao;
                    entradaProduto.PrecoVendaAtacadoSugestao = produtoCalculo.PrecoVendaAtacadoSugestao;
                    entradaProduto.PrecoVendaVarejoSugestao  = produtoCalculo.PrecoVendaVarejoSugestao;

                    if (produtoPesquisa == null)
                    {
                        entradaProduto.PrecoRevenda      = entradaProduto.PrecoRevendaSugestao;
                        entradaProduto.PrecoVendaAtacado = entradaProduto.PrecoVendaAtacadoSugestao;
                        entradaProduto.PrecoVendaVarejo  = entradaProduto.PrecoVendaVarejoSugestao;
                    }
                    else
                    {
                        entradaProduto.PrecoRevenda      = produtoPesquisa.PrecoRevenda;
                        entradaProduto.PrecoVendaAtacado = produtoPesquisa.PrecoVendaAtacado;
                        entradaProduto.PrecoVendaVarejo  = produtoPesquisa.PrecoVendaVarejo;
                    }

                    listaProtutos.Add(entradaProduto);
                }

                return(listaProtutos);
            }
            catch (Exception e)
            {
                throw new NegocioException("Problema durante a importação dos dados dos Produtos da NF-e. Favor contactar administrador.", e);
            }
        }
Esempio n. 2
0
        private void UpdateProdutos(TNfeProc nota, IList <Produto> produtos)
        {
            var itensNfe = new List <TNFeInfNFeDet>();

            foreach (var produto in produtos)
            {
                var det = new TNFeInfNFeDet
                {
                    nItem = produto.Num,
                    prod  = new TNFeInfNFeDetProd
                    {
                        cProd    = produto.CodigoProduto,
                        cEAN     = produto.CodigoEANComercial,
                        xProd    = produto.Descricao,
                        NCM      = produto.CodigoNCM,
                        CFOP     = GetProdCfop(produto.CFOP),
                        uCom     = produto.UnidadeComercial,
                        qCom     = double.Parse(produto.QuantidadeComercial).ToString("0.00", enUs),
                        vUnCom   = double.Parse(produto.ValorUnitarioComercializacao).ToString("0.0000", enUs),
                        vProd    = double.Parse(produto.Valor).ToString("0.00", enUs),
                        cEANTrib = produto.CodigoEANTributavel,
                        uTrib    = produto.UnidadeTributavel,
                        qTrib    = double.Parse(produto.QuantidadeTributavel).ToString("0.00", enUs),
                        vUnTrib  = double.Parse(produto.ValorUnitarioTributacao).ToString("0.0000", enUs),
                        indTot   = int.Parse(produto.IndicadorComposicaoValorTotalNFe.Split(new[] { "-" }, StringSplitOptions.None)[0]) == 1 ? TNFeInfNFeDetProdIndTot.Item1 : TNFeInfNFeDetProdIndTot.Item0
                    }
                };

                if (!string.IsNullOrWhiteSpace(produto.nDI))
                {
                    det.prod.DI = new[]
                    {
                        new TNFeInfNFeDetProdDI
                        {
                            nDI         = produto.nDI,
                            dDI         = DateTime.Parse(produto.dDI).ToString("yyyy-MM-dd"),
                            xLocDesemb  = produto.xLocDesemb,
                            UFDesemb    = GetUFEmi(produto.UFDesemb),
                            dDesemb     = DateTime.Parse(produto.dDesemb).ToString("yyyy-MM-dd"),
                            cExportador = produto.cExportador,
                            adi         = new[]
                            {
                                new TNFeInfNFeDetProdDIAdi
                                {
                                    nAdicao     = produto.nAdicao,
                                    nSeqAdic    = produto.nSeqAdic,
                                    cFabricante = produto.cFabricante
                                }
                            }
                        }
                    };
                }

                det.imposto = new TNFeInfNFeDetImposto();

                var tiposImposto = new List <object>();

                //############################ ICMS ############################
                if (!string.IsNullOrWhiteSpace(produto.TributacaoICMS))
                {
                    var tributacaoIcms = produto.TributacaoICMS.Split(new[] { "-" }, StringSplitOptions.None)[0].Trim();
                    var icms           = new TNFeInfNFeDetImpostoICMS();

                    object detIcms;
                    switch (tributacaoIcms)
                    {
                    case "00":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS00();
                        var icms00 = (TNFeInfNFeDetImpostoICMSICMS00)detIcms;
                        if (!string.IsNullOrWhiteSpace(produto.modBC))
                        {
                            var modBC = produto.modBC.Split(new[] { '-' })[0].Trim();
                            switch (modBC)
                            {
                            case "0":
                                icms00.modBC = TNFeInfNFeDetImpostoICMSICMS00ModBC.Item0;
                                break;

                            case "1":
                                icms00.modBC = TNFeInfNFeDetImpostoICMSICMS00ModBC.Item1;
                                break;

                            case "2":
                                icms00.modBC = TNFeInfNFeDetImpostoICMSICMS00ModBC.Item2;
                                break;

                            case "3":
                                icms00.modBC = TNFeInfNFeDetImpostoICMSICMS00ModBC.Item3;
                                break;
                            }
                        }
                        icms00.vBC   = double.Parse(produto.vBC).ToString("0.00", enUs);
                        icms00.pICMS = double.Parse(produto.pICMS).ToString("0.00", enUs);
                        icms00.vICMS = double.Parse(produto.vICMS).ToString("0.00", enUs);
                        break;

                    case "10":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS10();
                        break;

                    case "20":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS20();
                        break;

                    case "30":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS30();
                        break;

                    case "40":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS40();
                        //((TNFeInfNFeDetImpostoICMSICMS40)detIcms).orig =  Torig. produto.OrigemMercadoria;
                        break;

                    case "51":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS51();
                        break;

                    case "60":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS60();
                        break;

                    case "70":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS70();
                        break;

                    case "90":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS90();
                        break;

                    case "Part":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMSPart();
                        break;

                    case "101":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMSSN101();
                        break;

                    case "102":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMSSN102();
                        break;

                    case "201":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMSSN201();
                        break;

                    case "202":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMSSN202();
                        break;

                    case "500":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMSSN500();
                        break;

                    case "900":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMSSN900();
                        break;

                    case "ST":
                        detIcms = new TNFeInfNFeDetImpostoICMSICMSST();
                        break;

                    default:
                        detIcms = new TNFeInfNFeDetImpostoICMSICMS40();
                        break;
                    }
                    icms.Item = detIcms;
                    tiposImposto.Add(icms);
                    det.imposto.Items = tiposImposto.ToArray();
                }
                //############################ PIS ############################
                if (!string.IsNullOrWhiteSpace(produto.PIS_CST))
                {
                    var pis    = new TNFeInfNFeDetImpostoPIS();
                    var pisCST = new TNFeInfNFeDetImpostoPISPISNT();
                    var pCst   = produto.PIS_CST.Split(new[] { "-" }, StringSplitOptions.None)[0].Trim();
                    switch (pCst)
                    {
                    case "04":
                        pisCST.CST = TNFeInfNFeDetImpostoPISPISNTCST.Item04;
                        break;

                    case "06":
                        pisCST.CST = TNFeInfNFeDetImpostoPISPISNTCST.Item06;
                        break;

                    case "07":
                        pisCST.CST = TNFeInfNFeDetImpostoPISPISNTCST.Item07;
                        break;

                    case "08":
                        pisCST.CST = TNFeInfNFeDetImpostoPISPISNTCST.Item08;
                        break;

                    case "09":
                        pisCST.CST = TNFeInfNFeDetImpostoPISPISNTCST.Item09;
                        break;

                    default:
                        break;
                    }
                    pis.Item        = pisCST;
                    det.imposto.PIS = pis;
                }
                //############################ IPI ############################
                if (!string.IsNullOrWhiteSpace(produto.IPI_CST))
                {
                    var ipi = new TNFeInfNFeDetImpostoIPI();
                    ipi.cEnq = produto.cEnq.Trim();
                    var ipiTrib = new TNFeInfNFeDetImpostoIPIIPITrib();
                    switch (produto.IPI_CST.Split(new[] { '-' })[0].Trim())
                    {
                    case "00":
                        ipiTrib.CST = TNFeInfNFeDetImpostoIPIIPITribCST.Item00;
                        break;

                    case "49":
                        ipiTrib.CST = TNFeInfNFeDetImpostoIPIIPITribCST.Item49;
                        break;

                    case "50":
                        ipiTrib.CST = TNFeInfNFeDetImpostoIPIIPITribCST.Item50;
                        break;

                    case "99":
                        ipiTrib.CST = TNFeInfNFeDetImpostoIPIIPITribCST.Item99;
                        break;
                    }
                    ipiTrib.vIPI = double.Parse(produto.IPI_vIpi).ToString("0.00", enUs);

                    var items = new List <ItemsChoiceType>
                    {
                        ItemsChoiceType.vBC,
                        ItemsChoiceType.pIPI
                    };
                    ipiTrib.ItemsElementName = items.ToArray();
                    ipiTrib.Items            = new[]
                    {
                        produto.IPI_vBC.Replace(",", "."),
                        string.Format("{0:0.00}", double.Parse(produto.IPI_pIpi)).Replace(",", "."),
                    };
                    ipi.Item = ipiTrib;

                    tiposImposto.Add(ipi);
                    det.imposto.Items = tiposImposto.ToArray();
                }
                //############################ COFINS ############################
                if (!string.IsNullOrWhiteSpace(produto.COFINS_CST))
                {
                    det.imposto.COFINS = new TNFeInfNFeDetImpostoCOFINS();
                    var confinsNT = new TNFeInfNFeDetImpostoCOFINSCOFINSNT();
                    var cofinsCST = produto.COFINS_CST.Split(new[] { "-" }, StringSplitOptions.None)[0].Trim();
                    switch (cofinsCST)
                    {
                    case "04":
                        confinsNT.CST = TNFeInfNFeDetImpostoCOFINSCOFINSNTCST.Item04;
                        break;

                    case "06":
                        confinsNT.CST = TNFeInfNFeDetImpostoCOFINSCOFINSNTCST.Item06;
                        break;

                    case "07":
                        confinsNT.CST = TNFeInfNFeDetImpostoCOFINSCOFINSNTCST.Item07;
                        break;

                    case "08":
                        confinsNT.CST = TNFeInfNFeDetImpostoCOFINSCOFINSNTCST.Item08;
                        break;

                    case "09":
                        confinsNT.CST = TNFeInfNFeDetImpostoCOFINSCOFINSNTCST.Item09;
                        break;
                    }
                    det.imposto.COFINS.Item = confinsNT;
                    itensNfe.Add(det);
                }
            }
            nota.NFe.infNFe.det = itensNfe.ToArray();
        }