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(); }
/// <summary> /// Gerar os detalhes da NFe - Itens, impostos /// </summary> /// <param name="movimento"></param> /// <param name="tnfe"></param> /// <returns></returns> private TNFeInfNFeDet GerarTNFeDetalhes(Movimento movimento, TNFe tnfe) { try { // Gets a NumberFormatInfo associated with the en-US culture. NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat; nfi.NumberDecimalSeparator = "."; //gera detalhes de item e imposto var i = 1; //indice //inicializando o array, maximo 990 itens por NFe tnfe.infNFe.det = new TNFeInfNFeDet[990]; var det = new TNFeInfNFeDet(); foreach (var prod in movimento.ItensMovimento) { //numero do item det.nItem = i.ToString(); //gerar detalhe dos produtos det.prod = new TNFeInfNFeDetProd() { cProd = prod.Produto.CodigoBarras, xProd = prod.Produto.DescricaoProduto, cEAN = "", CFOP = prod.Cfop.CodigoCfop, CEST = "", cEANTrib = "", indTot = TNFeInfNFeDetProdIndTot.ValorProdutoCompoeTotalNF, NCM = prod.Produto.CodigoNCM, qCom = prod.Quantidade.ToString(nfi), qTrib = prod.Quantidade.ToString(nfi), uCom = prod.Produto.UnidadeMedida.NomeUnidadeMedida, uTrib = prod.Produto.UnidadeMedida.NomeUnidadeMedida, vDesc = "0.00", vFrete = "0.00", vOutro = "0.00", vSeg = "0.00", vUnCom = prod.ValorUnitario.ToString(nfi), vUnTrib = prod.ValorUnitario.ToString(nfi), vProd = prod.TotalItem.ToString(nfi) }; var impostosItem = new TNFeInfNFeDetImposto(); det.imposto = impostosItem; det.imposto.Items = new object[prod.ImpostosItemMovimento.Count]; //gerar impostos foreach (var imp in prod.ImpostosItemMovimento) { if (imp.TipoImposto.CodigoImposto == "PIS") { det.imposto.PIS = gerarImpostoPIS(imp); } else if (imp.TipoImposto.CodigoImposto == "COFINS") { det.imposto.COFINS = gerarImpostoCOFINS(imp); } else if (imp.TipoImposto.CodigoImposto == "ICMS") { det.imposto.Items[i] = gerarImpostoICMS(imp); } } //adicionando o item no array de detalhes da NF tnfe.infNFe.det[i] = det; i++; } return(det); } catch (Exception) { throw; } }