/// <summary> /// Retorna o objeto XML da nfe no formato documento. /// </summary> /// <returns></returns> protected virtual XmlDocument GenerateXML() { string xmlnsNFe = @"http://www.portalfiscal.inf.br/nfe"; int crt = 0; #region header //procurar a condicao de pagamento se é a vista ou a prazo. Osmir int indpag = 0; foreach(IParcela parcela in Parcelas.OrderBy(o => o.Parcela)) { if(parcela.DataVencimento.Date > DateTime.Now.Date) { indpag = 1; // a prazo } break; } XmlDocument doc = new XmlDocument(); XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null); doc.AppendChild(dec); XmlNode el = null; XmlElement nfe = doc.CreateElement("NFe"); nfe.SetAttribute("xmlns", xmlnsNFe); XmlElement infNfe = doc.CreateElement("infNFe"); if(this is INFe || this is Model.Faturamento.Lancamento.Movimento.NFCe.INFCe) infNfe.SetAttribute("Id", String.Format("NFe{0}", ((INF)this).Chave)); else infNfe.SetAttribute("Id", String.Format("NFe{0}", this.GUID)); infNfe.SetAttribute("versao", Settings.NFe.Versao); doc.AppendChild(nfe); nfe.AppendChild(infNfe); #endregion #region ide IEndereco endereco = Empresa.Enderecos.FirstOrDefault(w => w.Principal); el = infNfe.AppendChild(doc.CreateNFeElement("ide")); el.AppendChild(doc.CreateNFeElement("cUF", endereco.Endereco.Estado.CodigoIBGE)); if(this is INFe || this is Model.Faturamento.Lancamento.Movimento.NFCe.INFCe) el.AppendChild(doc.CreateNFeElement("cNF", ((INF)this).Chave.Substring(35, 8))); else el.AppendChild(doc.CreateNFeElement("cNF", this.EGUID)); el.AppendChild(doc.CreateNFeElement("natOp", Itens.FirstOrDefault().CFOP.Abreviatura)); el.AppendChild(doc.CreateNFeElement("indPag", indpag)); el.AppendChild(doc.CreateNFeElement("mod", Modelo)); el.AppendChild(doc.CreateNFeElement("serie", Unimake.Convert.ToInt(Serie.Serie))); el.AppendChild(doc.CreateNFeElement("nNF", Unimake.Convert.ToInt(((INF)this).Chave.Substring(35, 8))));//Foi criado um spike para estudar o campo(Ticket #29976) if(System.Convert.ToString(Settings.NFe.Versao).Equals("3.10")) { el.AppendChild(doc.CreateNFeElement("dhEmi", Unimake.Format.NFe.Date(DataEmissao, true))); if(Tipo != Enuns.Faturamento.Lancamento.Tipo.NotaFiscalConsumidorEletronica) el.AppendChild(doc.CreateNFeElement("dhSaiEnt", Unimake.Format.NFe.Date(DataEmissao, true))); } else { el.AppendChild(doc.CreateNFeElement("dEmi", Unimake.Format.NFe.Date(DataEmissao))); el.AppendChild(doc.CreateNFeElement("dSaiEnt", Unimake.Format.NFe.Date(DataEmissao))); } el.AppendChild(doc.CreateNFeElement("tpNF", 1)); //Por enquanto só temos notas de saída if(System.Convert.ToString(Settings.NFe.Versao).Equals("3.10") || Tipo == Enuns.Faturamento.Lancamento.Tipo.NotaFiscalConsumidorEletronica) el.AppendChild(doc.CreateNFeElement("idDest", 1));//Foi criado um spike para estudar o campo(Ticket #29977) el.AppendChild(doc.CreateNFeElement("cMunFG", endereco.Endereco.Municipio.CodigoIBGE)); el.AppendChild(doc.CreateNFeElement("tpImp", Tipo == Enuns.Faturamento.Lancamento.Tipo.NotaFiscalConsumidorEletronica ? 4 : Unimake.Convert.ToInt(Settings.NFe.TipoImpressao))); el.AppendChild(doc.CreateNFeElement("tpEmis", Unimake.Convert.ToInt(Settings.NFe.TipoEmissao))); el.AppendChild(doc.CreateNFeElement("cDV", ((INF)this).Chave.ToString().Substring(43, 1))); el.AppendChild(doc.CreateNFeElement("tpAmb", Unimake.Convert.ToInt(Settings.NFe.TipoAmbiente))); el.AppendChild(doc.CreateNFeElement("finNFe", Tipo == Enuns.Faturamento.Lancamento.Tipo.DevolucaoMercadoria ? Unimake.Convert.ToInt(Enuns.NFe.Finalidade.Devolucao) : Unimake.Convert.ToInt(Enuns.NFe.Finalidade.Normal))); if(System.Convert.ToString(Settings.NFe.Versao).Equals("3.10") || Tipo == Enuns.Faturamento.Lancamento.Tipo.NotaFiscalConsumidorEletronica) { el.AppendChild(doc.CreateNFeElement("indFinal", 1));//Foi criado um spike para estudar o campo(Ticket #29978) el.AppendChild(doc.CreateNFeElement("indPres", 1));//Foi criado um spike para estudar o campo(Ticket #29979) } el.AppendChild(doc.CreateNFeElement("procEmi", Unimake.Convert.ToInt(Settings.NFe.ProcessoEmissao))); el.AppendChild(doc.CreateNFeElement("verProc", Settings.AppVersion)); #endregion #region NF ref if(this is IDevolucao) { IDevolucao dev = this as IDevolucao; XmlNode tagnfref = el.AppendChild(doc.CreateNFeElement("NFref")); if(dev.Voucher is INFe) { INFe nfref = dev.Voucher as INFe; tagnfref.AppendChild(doc.CreateNFeElement("refNFe", nfref.Chave)); } else if(dev.Voucher is IVendaCF) { IVendaCF cfref = dev.Voucher as IVendaCF; XmlNode refECF = tagnfref.AppendChild(doc.CreateNFeElement("refECF")); refECF.AppendChild(doc.CreateNFeElement("mod", OpenPOS.Arquivo.Sintegra.ModeloDocumento.Dois2D.ToString())); refECF.AppendChild(doc.CreateNFeElement("nECF", cfref.NumeroOrdemECF)); refECF.AppendChild(doc.CreateNFeElement("nCOO", cfref.COO)); } } #endregion #region emit el = infNfe.AppendChild(doc.CreateNFeElement("emit")); el.AppendChild(doc.CreateNFeElement("CNPJ", Empresa.GetCPFCNPJ(false))); el.AppendChild(doc.CreateNFeElement("xNome", Empresa.RazaoSocial.Trim())); el.AppendChild(doc.CreateNFeElement("xFant", Empresa.NomeFantasia.Trim())); XmlNode enderEmit = el.AppendChild(doc.CreateNFeElement("enderEmit")); enderEmit.AppendChild(doc.CreateNFeElement("xLgr", endereco.Endereco.Endereco)); enderEmit.AppendChild(doc.CreateNFeElement("nro", endereco.Numero)); enderEmit.AppendChild(doc.CreateNFeElement("xBairro", endereco.Endereco.Bairro.Descricao)); enderEmit.AppendChild(doc.CreateNFeElement("cMun", endereco.Endereco.Municipio.CodigoIBGE)); enderEmit.AppendChild(doc.CreateNFeElement("xMun", endereco.Endereco.Municipio.Nome)); enderEmit.AppendChild(doc.CreateNFeElement("UF", endereco.Endereco.Estado.UF.Sigla)); enderEmit.AppendChild(doc.CreateNFeElement("CEP", Unimake.Utilities.OnlyNumbers(endereco.Endereco.CEP, "-."))); enderEmit.AppendChild(doc.CreateNFeElement("cPais", endereco.Endereco.Pais.CodBACEN.Trim().Substring(1, 4))); enderEmit.AppendChild(doc.CreateNFeElement("xPais", endereco.Endereco.Pais.Nome)); if(Empresa.CanaisComunicacao.Where(w => w.Principal == true && w.TipoCanal == TipoCanal.Telefone).Count() > 0 && !String.IsNullOrEmpty(Empresa.CanaisComunicacao.Where(w => w.Principal == true && w.TipoCanal == TipoCanal.Telefone).FirstOrDefault().IdentificadorCanal)) enderEmit.AppendChild(doc.CreateNFeElement("fone", Unimake.Utilities.OnlyNumbers(Empresa.CanaisComunicacao.Where(w => w.Principal == true && w.TipoCanal == TipoCanal.Telefone).FirstOrDefault().IdentificadorCanal, "()-"))); el.AppendChild(enderEmit); el.AppendChild(doc.CreateNFeElement("IE", string.IsNullOrEmpty(Unimake.Utilities.OnlyNumbers(Empresa.Juridica.IE, "-.").ToString()) ? "ISENTO" : Unimake.Utilities.OnlyNumbers(Empresa.Juridica.IE, "-."))); el.AppendChild(doc.CreateNFeElement("IM", Unimake.Utilities.OnlyNumbers(Empresa.Juridica.IM))); el.AppendChild(doc.CreateNFeElement("CNAE", String.IsNullOrEmpty(Empresa.Juridica.IM) ? "" : Empresa.Juridica.RamoAtividade.CodigoCNAE)); switch (Empresa.Juridica.CRT) { case CRT.SimplesNacional: case CRT.SimplesNacionalExcessoSublimite: crt = (int)Empresa.Juridica.CRT; break; case CRT.RegimeNormal: case CRT.LucroReal: case CRT.LucroPresumido: crt = 3; break; } el.AppendChild(doc.CreateNFeElement("CRT", crt)); #endregion #region dest if((DadoPessoa.Cliente != null || Tipo != Enuns.Faturamento.Lancamento.Tipo.NotaFiscalConsumidorEletronica)) { if(!DadoPessoa.Cliente.GetCPFCNPJ().Equals(Settings.ConsumidorFinal.GetCPFCNPJ())) { el = infNfe.AppendChild(doc.CreateNFeElement("dest")); string cpfCnpj = DadoPessoa.Cliente.GetCPFCNPJ(false); el.AppendChild(doc.CreateNFeElement(cpfCnpj.Length > 11 ? "CNPJ" : "CPF", cpfCnpj)); el.AppendChild(doc.CreateNFeElement("xNome", Settings.NFe.TipoAmbiente == Enuns.NFe.TipoAmbiente.Homologacao ? "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL" : DadoPessoa.Cliente.RazaoSocial.Trim())); endereco = DadoPessoa.Cliente.Enderecos.FirstOrDefault(); if(!endereco.IsNullOrEmpty()) { XmlNode enderDest = el.AppendChild(doc.CreateNFeElement("enderDest")); enderDest.AppendChild(doc.CreateNFeElement("xLgr", endereco.Endereco.Endereco)); enderDest.AppendChild(doc.CreateNFeElement("nro", endereco.Numero)); enderDest.AppendChild(doc.CreateNFeElement("xBairro", endereco.Endereco.Bairro.Descricao)); enderDest.AppendChild(doc.CreateNFeElement("cMun", endereco.Endereco.GUID.Equals(GUID.NaoDefinido) ? Empresa.Enderecos.FirstOrDefault(w => w.Principal).Endereco.Municipio.CodigoIBGE : //SE FOR NAO DEFINIDO PEGA O CÓDIGO DO MUNICIPIO DA EMPRESA EMITENTE endereco.Endereco.Municipio.CodigoIBGE)); enderDest.AppendChild(doc.CreateNFeElement("xMun", endereco.Endereco.GUID.Equals(GUID.NaoDefinido) ? Empresa.Enderecos.FirstOrDefault(w => w.Principal).Endereco.Municipio.Nome : //SE FOR NAO DEFINIDO PEGA O CÓDIGO DO MUNICIPIO DA EMPRESA EMITENTE endereco.Endereco.Municipio.Nome)); enderDest.AppendChild(doc.CreateNFeElement("UF", endereco.Endereco.GUID.Equals(GUID.NaoDefinido) ? Empresa.Enderecos.FirstOrDefault(w => w.Principal).Endereco.Estado.UF.Sigla : endereco.Endereco.Estado.UF.Sigla)); enderDest.AppendChild(doc.CreateNFeElement("CEP", endereco.Endereco.GUID.Equals(GUID.NaoDefinido) ? Unimake.Utilities.OnlyNumbers(Empresa.Enderecos.FirstOrDefault(w => w.Principal).Endereco.CEP, "-.") : Unimake.Utilities.OnlyNumbers(endereco.Endereco.CEP, "-."))); enderDest.AppendChild(doc.CreateNFeElement("cPais", endereco.Endereco.GUID.Equals(GUID.NaoDefinido) ? "1058" : endereco.Endereco.Pais.CodBACEN.Trim().Substring(1, 4))); enderDest.AppendChild(doc.CreateNFeElement("xPais", endereco.Endereco.GUID.Equals(GUID.NaoDefinido) ? "BRASIL" : endereco.Endereco.Pais.Nome)); //verifica se existe um canal de comunicação if(DadoPessoa.Cliente.CanaisComunicacao.Where(f => f.Principal && f.TipoCanal == Enuns.Cadastro.Pessoa.TipoCanal.Telefone).Count() > 0 && !string.IsNullOrEmpty(DadoPessoa.Cliente.CanaisComunicacao.FirstOrDefault(f => f.Principal && f.TipoCanal == Enuns.Cadastro.Pessoa.TipoCanal.Telefone).IdentificadorCanal)) enderDest.AppendChild(doc.CreateNFeElement("fone", Unimake.Utilities.OnlyNumbers(((Unimake.Telefone)DadoPessoa.Cliente.CanaisComunicacao.FirstOrDefault(f => f.Principal && f.TipoCanal == Enuns.Cadastro.Pessoa.TipoCanal.Telefone).IdentificadorCanal), "()-"))); el.AppendChild(enderDest); } if(System.Convert.ToString(Settings.NFe.Versao).Equals("3.10")) el.AppendChild(doc.CreateNFeElement("indIEDest", 9)); else el.AppendChild(doc.CreateNFeElement("IE", Settings.NFe.TipoAmbiente == Enuns.NFe.TipoAmbiente.Homologacao ? "" : Unimake.Utilities.OnlyNumbers(DadoPessoa.Cliente.Juridica.IE, "-."))); //se não tiver canais de comunicação ... Não criar a tag email if(DadoPessoa.Cliente.CanaisComunicacao.Count > 0 && DadoPessoa.Cliente.CanaisComunicacao.Where(k => k.TipoCanal == Enuns.Cadastro.Pessoa.TipoCanal.EMailNFe).Count() > 0) el.AppendChild(doc.CreateNFeElement("email", DadoPessoa.Cliente.CanaisComunicacao.Where(w => w.TipoCanal == Enuns.Cadastro.Pessoa.TipoCanal.EMailNFe).FirstOrDefault().IdentificadorCanal)); } else if(ValorTotalLiquido > 200000) // NT2012.004 Rejeição caso seja utilizado NFC-e para faturamentos acima de 200000 { //dispara uma exceção throw new Exceptions.NFe.NFCeValorTotalSuperiorAoPermitidoParaFaturamento(); } else if(ValorTotalLiquido > 10000) // NT2012.004 Rejeição caso não seja informado os dados do destinatário para faturamento acima de 10000 { //dispara uma exceção throw new Exceptions.NFe.NFCeValorTotalSuperiorPermitidoParaDestinatarioNaoIdentificado(); } } #endregion #region det int i = 0; foreach(IItem item in Itens.Where(w => w.Status != (int)Enuns.Faturamento.Lancamento.Movimento.Item.Status.Cancelado)) { AddXmlDocItem(doc, infNfe, item, ++i); } #endregion #region total XmlNode total = doc.CreateElement("total"); infNfe.AppendChild(total); el = doc.CreateElement("ICMSTot"); total.AppendChild(el); el.AppendChild(doc.CreateNFeElement("vBC", Unimake.Format.NFe.Numeric(ValorBaseCalculo, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vICMS", Unimake.Format.NFe.Numeric(Itens .Sum( k => k.Tributos .Where( x => x.Aliquota .Parent .TipoTributo == TipoTributo.ICMS) .Sum( y => y.VlrTributo )), "{0:0.00}"))); if(System.Convert.ToString(Settings.NFe.Versao).Equals("3.10")) el.AppendChild(doc.CreateNFeElement("vICMSDeson", Unimake.Format.NFe.Numeric(0, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vBCST", Unimake.Format.NFe.Numeric(0, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vST", Unimake.Format.NFe.Numeric(0, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vProd", Unimake.Format.NFe.Numeric(ValorTotalBruto, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vFrete", Unimake.Format.NFe.Numeric(0, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vSeg", Unimake.Format.NFe.Numeric(0, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vDesc", Unimake.Format.NFe.Numeric(ValorTotalDesconto, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vII", Unimake.Format.NFe.Numeric(0, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vIPI", Unimake.Format.NFe.Numeric( Itens .Sum( k => k.Tributos .Where( x => x.Aliquota .Parent .TipoTributo == TipoTributo.IPI) .Sum( y=> y.VlrTributo )), "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vPIS", Unimake.Format.NFe.Numeric(Itens .Sum( k => k.Tributos .Where( x => x.Aliquota .Parent .TipoTributo == TipoTributo.PIS) .Sum( y => y.VlrTributo )), "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vCOFINS", Unimake.Format.NFe.Numeric(Itens .Sum( k => k.Tributos .Where( x => x.Aliquota .Parent .TipoTributo == TipoTributo.COFINS) .Sum( y => y.VlrTributo )), "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vOutro", Unimake.Format.NFe.Numeric(0, "{0:0.00}"))); el.AppendChild(doc.CreateNFeElement("vNF", Unimake.Format.NFe.Numeric(ValorTotalLiquido, "{0:0.00}"))); if(this.ValorTotalImpostoAproximado > 0) { el.AppendChild(doc.CreateNFeElement("vTotTrib", Unimake.Format.NFe.Numeric(this.ValorTotalImpostoAproximado, "{0:0.00}"))); } #endregion #region tag <transp> XmlElement transp = doc.CreateElement("transp"); transp.AppendChild(doc.CreateNFeElement("modFrete", 9));//Foi criado um spike para estudar o campo(Ticket #29980) infNfe.AppendChild(transp); #endregion #region Formas de Pagamento if(!Baixa.IsNullOrEmpty()) { if(Tipo == Enuns.Faturamento.Lancamento.Tipo.NotaFiscalConsumidorEletronica) { double vlrTotBaixas = Baixa.Formas.Sum(s => s.ValorLiquido); double trocoPonderado = vlrTotBaixas - ValorTotalLiquido; foreach(Model.Faturamento.Lancamento.Movimento.Baixa.FormaBaixa.IBaixaForma forma in Baixa.Formas) { XmlElement formapgto = doc.CreateElement("pag"); XmlElement cartao = doc.CreateNFeElement("card"); string indiceForma = string.Empty; switch(forma.FormaPagamento.TipoForma) { case OpenPOS.Enuns.Cadastro.TipoForma.Dinheiro: indiceForma = "01"; break; case OpenPOS.Enuns.Cadastro.TipoForma.Cheque: indiceForma = "02"; break; case OpenPOS.Enuns.Cadastro.TipoForma.CartaoCredito: indiceForma = "03"; break; case OpenPOS.Enuns.Cadastro.TipoForma.CartaoDebito: indiceForma = "04"; break; case OpenPOS.Enuns.Cadastro.TipoForma.CartaoPrivateLabel: case OpenPOS.Enuns.Cadastro.TipoForma.ConfirmacaoPreAutorizacao: case OpenPOS.Enuns.Cadastro.TipoForma.CreditoConsumidor: case OpenPOS.Enuns.Cadastro.TipoForma.Parcelado: case OpenPOS.Enuns.Cadastro.TipoForma.Voucher: default: indiceForma = "99"; break; } if(!Settings.TEF.UsaTEF) { if(forma.FormaPagamento.TipoForma == Enuns.Cadastro.TipoForma.CartaoCredito || forma.FormaPagamento.TipoForma == Enuns.Cadastro.TipoForma.CartaoDebito) indiceForma = "99"; formapgto.AppendChild(doc.CreateNFeElement("tPag", indiceForma)); formapgto.AppendChild(doc.CreateNFeElement("vPag", Unimake.Format.NFe.Numeric(forma.ValorLiquido - (trocoPonderado / Baixa.Formas.Count), "{0:0.00}"))); } else { formapgto.AppendChild(doc.CreateNFeElement("tPag", indiceForma)); formapgto.AppendChild(doc.CreateNFeElement("vPag", Unimake.Format.NFe.Numeric(forma.ValorLiquido - (trocoPonderado / Baixa.Formas.Count), "{0:0.00}"))); if(forma.FormaPagamento.TipoForma == Enuns.Cadastro.TipoForma.CartaoCredito || forma.FormaPagamento.TipoForma == Enuns.Cadastro.TipoForma.CartaoDebito) { cartao.AppendChild(doc.CreateNFeElement("CNPJ", "99999999999999")); cartao.AppendChild(doc.CreateNFeElement("tBand", "01")); cartao.AppendChild(doc.CreateNFeElement("cAut", ((Model.Faturamento.Lancamento.Movimento.Baixa.FormaBaixa.IBaixaTEF)forma).CodigoAutorizacaoTransacao)); formapgto.AppendChild(cartao); } } infNfe.AppendChild(formapgto); } } } #endregion #region cobr //Cria a tag <cobr> if(Tipo == Enuns.Faturamento.Lancamento.Tipo.NotaFiscalEletronica) { XmlNode cobr = doc.CreateElement("cobr"); infNfe.AppendChild(cobr); XmlNode dup = null; //Mesmo que não tenha parcela, manda o financeiro if(Parcelas.Count == 0) { dup = doc.CreateElement("dup"); cobr.AppendChild(dup); if(this is IVendaCF) dup.AppendChild(doc.CreateNFeElement("nDup", COO.ToString().PadLeft(6, '0') + "-" + "1/1")); else if(this is INFe) dup.AppendChild(doc.CreateNFeElement("nDup", EGUID + "-" + "1/1")); dup.AppendChild(doc.CreateNFeElement("dVenc", Unimake.Format.NFe.Date(DataEmissao))); dup.AppendChild(doc.CreateNFeElement("vDup", Unimake.Format.NFe.Numeric(ValorTotalLiquido, "{0:0.00}"))); } else { foreach(IParcela parcela in Parcelas.OrderBy(o => o.Parcela)) { dup = doc.CreateElement("dup"); if(this is IVendaCF) dup.AppendChild(doc.CreateNFeElement("nDup", COO.ToString().PadLeft(6, '0') + "-" + parcela.Parcela + "/" + Parcelas.Count)); else if(this is INFe) dup.AppendChild(doc.CreateNFeElement("nDup", EGUID + parcela.Parcela + "/" + Parcelas.Count)); dup.AppendChild(doc.CreateNFeElement("dVenc", Unimake.Format.NFe.Date(parcela.DataVencimento))); dup.AppendChild(doc.CreateNFeElement("vDup", Unimake.Format.NFe.Numeric(parcela.Valor, "{0:0.00}"))); } } } #endregion return doc; }
/// <summary> /// Adiciona os dados do cancelamento no cupom fiscal. /// </summary> /// <returns></returns> public XmlDocument ToXML() { #region Cabeçalho XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement("Cancelamento"); #endregion #region Dados de cancelamento root.AppendChild(doc.CreateNFeElement("GUID", this.Lancamento.EGUID)); root.AppendChild(doc.CreateNFeElement("EGUIDUsuario", this.UsuarioCadastro.EGUID)); root.AppendChild(doc.CreateNFeElement("Data", this.DataHora.ToString("yyyy-MM-dd"))); root.AppendChild(doc.CreateNFeElement("NumeroECF", Settings.ECF.ECFAtual.NumeroUsuario)); root.AppendChild(doc.CreateNFeElement("Motivo", this.Motivo)); #endregion doc.AppendChild(root); return doc; }
/// <summary> /// Adiciona um novo item ao documento XML /// </summary> /// <param name="doc">Documento de base do XML</param> /// <param name="infNfe">Elemento de informações da NFe</param> /// <param name="item">item que será adicionado ao XML</param> /// <param name="nItem">Posição sequencial do item</param> protected virtual void AddXmlDocItem(XmlDocument doc, XmlElement infNfe, Model.Faturamento.Lancamento.Movimento.Item.IItem item, int nItem) { IList<OpenPOS.Model.Faturamento.Lancamento.Movimento.Item.ICSTCSOSN> csts = null; XmlNode det = doc.CreateElement("det"); XmlAttribute attr = doc.CreateAttribute("nItem"); XmlNode prod = doc.CreateElement("prod"); XmlNode imposto = doc.CreateElement("imposto"); XmlNode icms = doc.CreateElement("ICMS"); attr.InnerText = nItem.ToString(); det.Attributes.Append(attr); det.AppendChild(prod); det.AppendChild(imposto); #region tag <prod> prod.AppendChild(doc.CreateNFeElement("cProd", item.ItemMovimentado.EGUID)); Model.Cadastro.Item.ICodigoBarra codeBar = null; Model.Cadastro.Item.Produto.IProduto produto = null; if(item.ItemMovimentado is Model.Cadastro.Item.Produto.IProduto) { produto = item.ItemMovimentado as Model.Cadastro.Item.Produto.IProduto; codeBar = produto.CodigosBarras.FirstOrDefault(w => w.Tipo == TipoCodigoBarra.GTIN_13); } prod.AppendChild(doc.CreateNFeElement("cEAN", codeBar.IsNullOrEmpty() ? "" : codeBar.Codigo)); prod.AppendChild(doc.CreateNFeElement("xProd", item.ItemMovimentado.Descricao)); prod.AppendChild(doc.CreateNFeElement("NCM", produto.IsNullOrEmpty() || produto.NCM.IsNullOrEmpty() ? "" : Unimake.Utilities.OnlyNumbers(produto.NCM.NCM, "."))); prod.AppendChild(doc.CreateNFeElement("CFOP", item.CFOP.IsNullOrEmpty() ? "" : item.CFOP.CFOP)); prod.AppendChild(doc.CreateNFeElement("uCom", item.Unidade.Prefixo.Replace(" ", ""))); prod.AppendChild(doc.CreateNFeElement("qCom", Unimake.Format.String(item.Quantidade, "N4"))); prod.AppendChild(doc.CreateNFeElement("vUnCom", Unimake.Format.NFe.Numeric(item.ValorTotalBruto / item.Quantidade, "{0:0.00}"))); prod.AppendChild(doc.CreateNFeElement("vProd", Unimake.Format.NFe.Numeric(item.ValorTotalBruto, "{0:0.00}"))); prod.AppendChild(doc.CreateNFeElement("cEANTrib", "")); prod.AppendChild(doc.CreateNFeElement("uTrib", item.Unidade.Prefixo.Replace(" ", ""))); prod.AppendChild(doc.CreateNFeElement("qTrib", Unimake.Format.String(item.Quantidade, "N4"))); prod.AppendChild(doc.CreateNFeElement("vUnTrib", Unimake.Format.NFe.Numeric(item.ValorTotalBruto /item.Quantidade, "{0:0.00}"))); if (item.ValorTotalDesconto > 0) prod.AppendChild(doc.CreateNFeElement("vDesc", Unimake.Format.NFe.Numeric(item.ValorTotalDesconto, "{0:0.00}"))); prod.AppendChild(doc.CreateNFeElement("indTot", Unimake.Convert.ToInt(Settings.NFe.IndicadorTotal))); #endregion #region tag <imposto> double ValortotalImpostoPrduto = (item.ValorImpostoAproximadoFederal + item.ValorImpostoAproximadoEstadual + item.ValorImpostoAproximadoImportado + item.ValorImpostoAproximadoMunicipio); if(ValortotalImpostoPrduto > 0) { imposto.AppendChild(doc.CreateNFeElement("vTotTrib", Unimake.Format.NFe.Numeric(ValortotalImpostoPrduto, "{0:0.00}"))); } imposto.AppendChild(icms); csts = item.CSTCSOSNCodigos.Where(w => w.CSTCSOSNCod.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS || w.CSTCSOSNCod.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.SIMPLESNACIONAL) .ToList(); foreach (Model.Faturamento.Lancamento.Movimento.Item.ICSTCSOSN cst in csts) { XmlNode icmssn = null; if (cst.CSTCSOSNCod.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS) { icmssn = doc.CreateElement("ICMS" + cst.CSTCSOSNCod.Codigo); icms.AppendChild(icmssn); icmssn.AppendChild(doc.CreateNFeElement("orig", 0)); //ToDo Luciano: Após implementar a origem do item na mercadoria, ajustar este ponto para informar a origem na nota icmssn.AppendChild(doc.CreateNFeElement("CST", cst.CSTCSOSNCod.Codigo)); icmssn.AppendChild(doc.CreateNFeElement("modBC", 3)); //Todo Luciano: Implementar nas regras de base de cálculo para retornar o titpo de determinação do BC //Verificar se houver redução de base de calculo if (item.Tributos.Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS && w.PercRedBC != 0).Count() > 0) { icmssn.AppendChild(doc.CreateNFeElement("pRedBC", Unimake.Format.NFe.Numeric(item.Tributos.Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS && w.PercRedBC != 0).First().PercRedBC, "{0:0.00}"))); } icmssn.AppendChild(doc.CreateNFeElement("vBC", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS) .First() .VlrBaseCalculo, "{0:0.00}"))); icmssn.AppendChild(doc.CreateNFeElement("pICMS", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS) .First() .Aliquota .Valor, "{0:0.00}"))); icmssn.AppendChild(doc.CreateNFeElement("vICMS", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS) .First() .VlrTributo, "{0:0.00}"))); } else if (cst.CSTCSOSNCod.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.SIMPLESNACIONAL) { string codCSOSN = string.Empty; switch (cst.CSTCSOSNCod.Codigo) { case "101": codCSOSN = "101"; break; case "102": case "103": case "300": case "400": codCSOSN = "102"; break; case "201": codCSOSN = "201"; break; case "202": case "203": codCSOSN = "202"; break; case "500": codCSOSN = "500"; break; case "900": codCSOSN = "900"; break; default: break; } icmssn = doc.CreateElement("ICMSSN" + codCSOSN); icms.AppendChild(icmssn); icmssn.AppendChild(doc.CreateNFeElement("orig", 0)); icmssn.AppendChild(doc.CreateNFeElement("CSOSN", cst.CSTCSOSNCod.Codigo)); if (((codCSOSN.Equals("101") || codCSOSN.Equals("201")) && !(this is INFe)) || (codCSOSN.Equals("202") || codCSOSN.Equals("500") || codCSOSN.Equals("900"))) { icmssn.AppendChild(doc.CreateNFeElement("pCredSN", Unimake.Format.NFe.Numeric(0, "{0:0.00}")));//Foi criado um spike para estudar o campo(Ticket #29983) icmssn.AppendChild(doc.CreateNFeElement("vCredICMSSN", Unimake.Format.NFe.Numeric(0, "{0:0.00}")));//Foi criado um spike para estudar o campo(Ticket #29983) } } } #endregion csts = item.CSTCSOSNCodigos.Where(w => w.CSTCSOSNCod.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.PIS) .ToList(); foreach (Model.Faturamento.Lancamento.Movimento.Item.ICSTCSOSN cst in csts) { string grpPIS = string.Empty; XmlElement pis = null; XmlElement grupoPIS = null; pis = doc.CreateElement("PIS"); imposto.AppendChild(pis); switch (cst.CSTCSOSNCod.Codigo) { case "01": case "02": grpPIS = "PISAliq"; break; case "03": grpPIS = "PISQtde"; break; case "04": case "06": case "07": case "08": case "09": grpPIS = "PISNT"; break; case "99": grpPIS = "PISOutr"; break; default: throw new Exceptions.NFe.PISErroCSTInformada(); } grupoPIS = doc.CreateElement(grpPIS); pis.AppendChild(grupoPIS); grupoPIS.AppendChild(doc.CreateNFeElement("CST", cst.CSTCSOSNCod.Codigo)); switch (grpPIS) { case "PISAliq": case "PISOutr": grupoPIS.AppendChild(doc.CreateNFeElement("vBC", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.PIS) .First() .VlrBaseCalculo, "{0:0.00}"))); grupoPIS.AppendChild(doc.CreateNFeElement("pPIS", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.PIS) .First() .Aliquota .Valor, "{0:0.00}"))); break; case "PISQtde": grupoPIS.AppendChild(doc.CreateNFeElement("qBCProd", Unimake.Format.NFe.Numeric(item .Quantidade, "{0:0.00}"))); grupoPIS.AppendChild(doc.CreateNFeElement("vAliqProd", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.PIS) .First() .Aliquota .Valor, "{0:0.00}"))); grupoPIS.AppendChild(doc.CreateNFeElement("vPIS", Unimake.Format.NFe.Numeric((item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.PIS) .First() .Aliquota .Valor * item.Quantidade), "{0:0.00}"))); break; } if (!grpPIS.Equals("PISQtde") || !grpPIS.Equals("PISNT")) grupoPIS.AppendChild(doc.CreateNFeElement("vPIS", Unimake.Format.NFe.Numeric((item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.PIS) .First() .Aliquota .Valor * item.Quantidade), "{0:0.00}"))); } csts = item.CSTCSOSNCodigos.Where(w => w.CSTCSOSNCod.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.COFINS) .ToList(); foreach (Model.Faturamento.Lancamento.Movimento.Item.ICSTCSOSN cst in csts) { string grpCofins = string.Empty; XmlElement cofins = null; XmlElement grupoCOFINS = null; cofins = doc.CreateElement("COFINS"); imposto.AppendChild(cofins); switch (cst.CSTCSOSNCod.Codigo) { case "01": case "02": grpCofins = "COFINSAliq"; break; case "03": grpCofins = "COFINSQtde"; break; case "04": case "06": case "07": case "08": case "09": grpCofins = "COFINSNT"; break; case "99": grpCofins = "COFINSOutr"; break; } grupoCOFINS = doc.CreateElement(grpCofins); cofins.AppendChild(grupoCOFINS); grupoCOFINS.AppendChild(doc.CreateNFeElement("CST", cst.CSTCSOSNCod.Codigo)); switch (grpCofins) { case "COFINSAliq": case "COFINSOutr": grupoCOFINS.AppendChild(doc.CreateNFeElement("vBC", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.COFINS) .First() .VlrBaseCalculo, "{0:0.00}"))); grupoCOFINS.AppendChild(doc.CreateNFeElement("pCOFINS", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.COFINS) .First() .Aliquota .Valor, "{0:0.00}"))); break; case "COFINSQtde": grupoCOFINS.AppendChild(doc.CreateNFeElement("qBCProd", Unimake.Format.NFe.Numeric(item .Quantidade, "{0:0.00}"))); grupoCOFINS.AppendChild(doc.CreateNFeElement("vAliqProd", Unimake.Format.NFe.Numeric(item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.COFINS) .First() .Aliquota .Valor, "{0:0.00}"))); grupoCOFINS.AppendChild(doc.CreateNFeElement("vCOFINS", Unimake.Format.NFe.Numeric((item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.COFINS) .First() .Aliquota .Valor * item.Quantidade), "{0:0.00}"))); break; } if (!grpCofins.Equals("COFINSQtde") || !grpCofins.Equals("COFINSNT")) grupoCOFINS.AppendChild(doc.CreateNFeElement("vCOFINS", Unimake.Format.NFe.Numeric((item .Tributos .Where(w => w.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.COFINS) .First() .Aliquota .Valor * item.Quantidade), "{0:0.00}"))); } infNfe.AppendChild(det); }