Esempio n. 1
0
        /// <summary>
        ///     Salva o documento.
        /// </summary>
        /// <param name="stream">The stream.</param>
        /// <param name="options">The options.</param>
        /// <param name="encoding">The encoding.</param>
        /// <returns>TDocument.</returns>
        public virtual void Save(Stream stream, DFeSaveOptions options = DFeSaveOptions.DisableFormatting, Encoding encoding = null)
        {
            var serializer = new DFeSerializer <TDocument>();

            if (!options.HasFlag(DFeSaveOptions.None))
            {
                serializer.Options.RemoverAcentos   = options.HasFlag(DFeSaveOptions.RemoveAccents);
                serializer.Options.RemoverEspacos   = options.HasFlag(DFeSaveOptions.RemoveSpaces);
                serializer.Options.FormatarXml      = !options.HasFlag(DFeSaveOptions.DisableFormatting);
                serializer.Options.OmitirDeclaracao = options.HasFlag(DFeSaveOptions.OmitDeclaration);
            }

            if (encoding != null)
            {
                serializer.Options.Encoding = encoding;
            }

            serializer.Serialize(this, stream);

            using (var ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                stream.Position = 0;
                using (var reader = new StreamReader(ms, serializer.Options.Encoding)) Xml = reader.ReadToEnd();
            }
        }
Esempio n. 2
0
 /// <summary>
 ///     Retorna o Xml do documento.
 /// </summary>
 /// <param name="options">The options.</param>
 /// <param name="encoding">The encoding.</param>
 /// <returns>System.String.</returns>
 public virtual string GetXml(DFeSaveOptions options = DFeSaveOptions.DisableFormatting, Encoding encoding = null)
 {
     using (var stream = new MemoryStream())
     {
         Save(stream, options, encoding);
         using (var streamReader = new StreamReader(stream)) return(streamReader.ReadToEnd());
     }
 }
Esempio n. 3
0
 /// <summary>
 /// Retorna o Xml do documento.
 /// </summary>
 /// <param name="options">The options.</param>
 /// <param name="encoding">The encoding.</param>
 /// <returns>System.String.</returns>
 public string GetXml(DFeSaveOptions options = DFeSaveOptions.None, Encoding encoding = null)
 {
     using (var stream = new MemoryStream())
     {
         Save(stream, options, encoding);
         using (var streamReader = new StreamReader(stream))
         {
             return(streamReader.ReadToEnd());
         }
     }
 }
Esempio n. 4
0
        /// <summary>
        /// Assina o CTe.
        /// </summary>
        /// <param name="certificado">The certificado.</param>
        /// <param name="saveOptions">The save options.</param>
        public void Assinar(X509Certificate2 certificado, DFeSaveOptions saveOptions)
        {
            Guard.Against <ArgumentNullException>(certificado == null, "Certificado não pode ser nulo.");

            if (InfCTe.Id.IsEmpty() || InfCTe.Id.Length < 44)
            {
                var chave = ChaveDFe.Gerar(InfCTe.Ide.CUF, InfCTe.Ide.DhEmi.DateTime,
                                           InfCTe.Emit.CNPJ, (int)InfCTe.Ide.Mod, InfCTe.Ide.Serie,
                                           InfCTe.Ide.NCT, InfCTe.Ide.TpEmis, InfCTe.Ide.CCT);

                InfCTe.Id      = $"CTe{chave.Chave}";
                InfCTe.Ide.CDV = chave.Digito;
            }

            AssinarDocumento(certificado, saveOptions, false, SignDigest.SHA1);
        }
Esempio n. 5
0
        /// <summary>
        /// Salva o documento.
        /// </summary>
        /// <param name="stream">The stream.</param>
        /// <param name="options">The options.</param>
        /// <param name="encoding">The encoding.</param>
        /// <returns>TDocument.</returns>
        public void Save(Stream stream, DFeSaveOptions options = DFeSaveOptions.None, Encoding encoding = null)
        {
            var serializer = new DFeSerializer(typeof(TDocument));

            if (!options.HasFlag(DFeSaveOptions.None))
            {
                serializer.Options.RemoverAcentos   = options.HasFlag(DFeSaveOptions.RemoveAccents);
                serializer.Options.FormatarXml      = !options.HasFlag(DFeSaveOptions.DisableFormatting);
                serializer.Options.OmitirDeclaracao = !options.HasFlag(DFeSaveOptions.OmitDeclaration);
            }

            if (encoding != null)
            {
                serializer.Options.Encoder = encoding;
            }

            serializer.Serialize(this, stream);
        }
Esempio n. 6
0
        /// <summary>
        /// Assina as CTe não autorizadas.
        /// </summary>
        /// <param name="certificado">O certificado.</param>
        /// <param name="options"></param>
        public void Assinar(X509Certificate2 certificado, DFeSaveOptions options)
        {
            if (CTe.Any())
            {
                foreach (var cte in CTe)
                {
                    cte.Assinar(certificado, options);
                }
            }

            if (CTeOS.Any())
            {
                foreach (var cte in CTeOS)
                {
                    cte.Assinar(certificado, options);
                }
            }
        }
Esempio n. 7
0
        /// <summary>
        ///     Salva o documento.
        /// </summary>
        /// <param name="path">The path.</param>
        /// <param name="options">The options.</param>
        /// <param name="encoding">The encoding.</param>
        /// <returns>TDocument.</returns>
        public virtual void Save(string path, DFeSaveOptions options = DFeSaveOptions.DisableFormatting, Encoding encoding = null)
        {
            var serializer = new DFeSerializer <TDocument>();

            if (!options.HasFlag(DFeSaveOptions.None))
            {
                serializer.Options.RemoverAcentos   = options.HasFlag(DFeSaveOptions.RemoveAccents);
                serializer.Options.RemoverEspacos   = options.HasFlag(DFeSaveOptions.RemoveSpaces);
                serializer.Options.FormatarXml      = !options.HasFlag(DFeSaveOptions.DisableFormatting);
                serializer.Options.OmitirDeclaracao = options.HasFlag(DFeSaveOptions.OmitDeclaration);
            }

            if (encoding != null)
            {
                serializer.Options.Encoding = encoding;
            }

            serializer.Serialize(this, path);
            Xml = File.ReadAllText(path, serializer.Options.Encoding);
        }
Esempio n. 8
0
        /// <summary>
        /// Gera a assinatura do xml e retorna uma instancia da classe <see cref="DFeSignature"/>.
        /// </summary>
        /// <typeparam name="TDocument">The type of the t document.</typeparam>
        /// <param name="document">The document.</param>
        /// <param name="certificado">The certificado.</param>
        /// <param name="comments">if set to <c>true</c> [comments].</param>
        /// <param name="digest">The digest.</param>
        /// <param name="options">The options.</param>
        /// <returns>DFeSignature.</returns>
        public static DFeSignature AssinarDocumento <TDocument>(DFeSignDocument <TDocument> document,
                                                                X509Certificate2 certificado, bool comments, SignDigest digest,
                                                                DFeSaveOptions options, out string signedXml) where TDocument : class
        {
            Guard.Against <ArgumentException>(!typeof(TDocument).HasAttribute <DFeSignInfoElement>(), "Atributo [DFeSignInfoElement] não encontrado.");

            var xml    = document.GetXml(options, Encoding.UTF8);
            var xmlDoc = new XmlDocument {
                PreserveWhitespace = true
            };

            xmlDoc.LoadXml(xml);

            var signatureInfo = typeof(TDocument).GetAttribute <DFeSignInfoElement>();
            var xmlSignature  = GerarAssinatura(xmlDoc, signatureInfo.SignElement, signatureInfo.SignAtribute, certificado, comments, digest);

            // Adiciona a assinatura no documento e retorna o xml assinado no parametro signedXml
            var element = xmlDoc.ImportNode(xmlSignature, true);

            xmlDoc.DocumentElement.AppendChild(element);
            signedXml = xmlDoc.AsString();

            return(DFeSignature.Load(xmlSignature.OuterXml));
        }
Esempio n. 9
0
 /// <summary>
 /// Assina o xml.
 /// </summary>
 /// <param name="certificado">The certificado.</param>
 /// <param name="comments">if set to <c>true</c> [comments].</param>
 /// <param name="digest">The digest.</param>
 /// <param name="options">The options.</param>
 protected void AssinarDocumento(X509Certificate2 certificado, DFeSaveOptions options, bool comments, SignDigest digest)
 {
     Signature = XmlSigning.AssinarDocumento(this, certificado, comments, digest, options, out var xml);
     Xml       = xml;
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="nSeqEvento"></param>
        /// <param name="chave"></param>
        /// <param name="cnpj"></param>
        /// <param name="evento"></param>
        /// <returns></returns>
        public RecepcaoEventoResposta RecepcaoEvento(int nSeqEvento, string chave, string cnpj, IEventoCTe evento)
        {
            Guard.Against <ArgumentNullException>(chave.IsEmpty(), nameof(chave));
            Guard.Against <ArgumentNullException>(cnpj.IsEmpty(), nameof(cnpj));
            Guard.Against <ArgumentNullException>(nSeqEvento < 0, nameof(nSeqEvento));
            Guard.Against <ArgumentNullException>(evento == null, nameof(evento));

            lock (serviceLock)
            {
                const DFeSaveOptions saveOptions = DFeSaveOptions.DisableFormatting |
                                                   DFeSaveOptions.OmitDeclaration;

                CTeTipoEvento tipo;
                string        xmlEvento;
                var           date   = DateTimeOffset.Now;
                var           versao = Configuracoes.Geral.VersaoDFe.GetDescription();
                switch (evento)
                {
                case CTeEvCancCTe evtCTe:
                    xmlEvento = evtCTe.GetXml(saveOptions);
                    tipo      = CTeTipoEvento.Cancelamento;
                    GravarEvento(xmlEvento, $"{chave}-can-eve.xml", tipo, date.DateTime, cnpj);
                    ValidateMessage(xmlEvento, SchemaCTe.EvCancCTe);
                    break;

                case CTeEvCCeCTe evtCTe:
                    xmlEvento = evtCTe.GetXml(saveOptions);
                    tipo      = CTeTipoEvento.CartaCorrecao;
                    GravarEvento(xmlEvento, $"{chave}-cce-eve.xml", tipo, date.DateTime, cnpj);
                    ValidateMessage(xmlEvento, SchemaCTe.EvCCeCTe);
                    break;

                case CTeEvEPEC evtCTe:
                    xmlEvento = evtCTe.GetXml(saveOptions);
                    tipo      = CTeTipoEvento.EPEC;
                    GravarEvento(xmlEvento, $"{chave}-ped-epec.xml", tipo, date.DateTime, cnpj);
                    ValidateMessage(xmlEvento, SchemaCTe.EvEPECCTe);
                    break;

                case CTeEvRegMultimodal evtCTe:
                    xmlEvento = evtCTe.GetXml(saveOptions);
                    tipo      = CTeTipoEvento.RegistroMultiModal;
                    GravarEvento(xmlEvento, $"{chave}-rmulti-eve.xml", tipo, date.DateTime, cnpj);
                    ValidateMessage(xmlEvento, SchemaCTe.EvRegMultimodal);
                    break;

                case CTeEvPrestDesacordo evtCTe:
                    xmlEvento = evtCTe.GetXml(saveOptions);
                    tipo      = CTeTipoEvento.PrestacaoServicoDesacordo;
                    GravarEvento(xmlEvento, $"{chave}-desa-eve.xml", tipo, date.DateTime, cnpj);
                    ValidateMessage(xmlEvento, SchemaCTe.EvPrestDesacordo);
                    break;

                default:
                    throw new ArgumentException("O evento informado é desconhecido ou não está implementado.");
                }

                var data = Configuracoes.Geral.VersaoDFe == CTeVersao.v200
                    ? date.ToString("yyyy-MM-ddTHH:mm:dd")
                    : date.ToString("yyyy-MM-ddTHH:mm:sszzz");

                var idEvento = $"ID{tipo.GetDFeValue()}{chave}{nSeqEvento:D2}";

                var request = new StringBuilder();
                request.Append($"<eventoCTe xmlns=\"http://www.portalfiscal.inf.br/cte\" versao=\"{versao}\">");
                request.Append($"<infEvento Id=\"{idEvento}\">");
                request.Append($"<cOrgao>{Configuracoes.WebServices.UF.GetDFeValue()}</cOrgao>");
                request.Append($"<tpAmb>{Configuracoes.WebServices.Ambiente.GetDFeValue()}</tpAmb>");
                request.Append($"<CNPJ>{cnpj}</CNPJ>");
                request.Append($"<chCTe>{chave}</chCTe>");
                request.Append($"<dhEvento>{data}</dhEvento>");
                request.Append($"<tpEvento>{tipo.GetDFeValue()}</tpEvento>");
                request.Append($"<nSeqEvento>{nSeqEvento}</nSeqEvento>");
                request.Append($"<detEvento versaoEvento=\"{versao}\">");
                request.Append(xmlEvento.Trim());
                request.Append("</detEvento>");
                request.Append("</infEvento>");
                request.Append("</eventoCTe>");

                var dadosMsg = request.ToString();
                dadosMsg = XmlSigning.AssinarXml(dadosMsg, "eventoCTe", "infEvento", ClientCredentials.ClientCertificate.Certificate);
                ValidateMessage(dadosMsg);

                var doc = new XmlDocument();
                doc.LoadXml(dadosMsg);

                var inValue = new RecepcaoEventoRequest(DefineHeader(), doc);
                var retVal  = Channel.RecepcaoEvento(inValue);

                var retorno = new RecepcaoEventoResposta(dadosMsg, retVal.Result.OuterXml, EnvelopeSoap, RetornoWS);
                GravarEvento(retVal.Result.OuterXml, $"{idEvento.OnlyNumbers()}-procEventoCTe.xml", tipo, date.DateTime, cnpj);
                return(retorno);
            }
        }