/// <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(); } }
/// <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()); } }
/// <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()); } } }
/// <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); }
/// <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); }
/// <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); } } }
/// <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); }
/// <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)); }
/// <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); } }