Example #1
0
        /// <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;
        }
Example #2
0
        /// <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;
        }
Example #3
0
        /// <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);
        }