wmixvideo / nfe

Nota Fiscal Eletrônica em Java.
Apache License 2.0
657 stars 379 forks source link

Recuperar as notas assinadas após o envio do lote #153

Closed klutzer closed 8 years ago

klutzer commented 8 years ago

Olá pessoal!

Estava discutindo com o @fincatto a possibilidade de podermos pegar o objeto NFLoteEnvio assinado como um possível retorno do método enviaLote(), e chegamos em duas alternativas possíveis para tornar isso viável: Hoje o retorno do enviaLote() é um objeto NFLoteEnvioRetorno, que é documentado pela Sefaz e seria interessante manter o mesmo sem alterações (a não ser que estas venham do próprio XML). Portanto, ambas as alternativas envolvem a criação de uma classe NFLoteEnvioRetornoAssinado, que seria retornada no enviaLote(). As alternativas:

  1. Usar composição: Fazer a classe CONTER um objeto NFLoteEnvioRetorno e um outro NFLoteEnvio, que seria o objeto após passar pela assinatura do XML:
NFLoteEnvioRetornoAssinado retAssinado = facade.enviaLote(lote);
NFLoteEnvioRetorno ret = retAssinado.getRetorno(); //objeto de retorno do envio
NFLoteEnvio loteAssinado = retAssinado.getLoteAssinado();
  1. Usar generalização: Fazer a classe HERDAR de NFLoteEnvioRetorno, contendo apenas o NFLoteEnvio assinado:
NFLoteEnvioRetornoAssinado ret = facade.enviaLote(lote); //objeto de retorno do envio
NFLoteEnvio loteAssinado = ret.getLoteAssinado();

Pessoalmente vou com a primeira alternativa, pois prefiro sempre utilizar composição ao invés de herança, quando possível, pra não quebrar futuras generalizações e deixar as duas classes "livres". Mas enfim, o que acham?

Abraço!

waldandrade commented 8 years ago

.. eu não consegui entender. Como assim "NFLoteEnvio assinado"? O Lote assinado significa alguma coisa? tem alguma finalidade na sua arquitetura?

Na minha arquitetura, o Lote serve apenas para o envio. E a nota recuperada é a única coisa que tem algum significado depois do envio.

Importante deixarmos a discussão clara, pois creio que em alguns pontos cada um trabalha de uma forma diferente. Em 30/05/2016 12:23, "Érico Knapp Lutzer" notifications@github.com escreveu:

Olá pessoal!

Estava discutindo com o @fincatto https://github.com/fincatto a possibilidade de podermos pegar o objeto NFLoteEnvio assinado como um possível retorno do método enviaLote(), e chegamos em duas alternativas possíveis para tornar isso viável: Hoje o retorno do enviaLote() é um objeto NFLoteEnvioRetorno, que é documentado pela Sefaz e seria interessante manter o mesmo sem alterações (a não ser que estas venham do próprio XML). Portanto, ambas as alternativas envolvem a criação de uma classe NFLoteEnvioRetornoAssinado, que seria retornada no enviaLote(). As alternativas:

  1. Usar composição: Fazer a classe CONTER um objeto NFLoteEnvioRetorno e um outro NFLoteEnvio, que seria o objeto após passar pela assinatura do XML:

NFLoteEnvioRetornoAssinado retAssinado = facade.enviaLote(lote); NFLoteEnvioRetorno ret = retAssinado.getRetorno(); //objeto de retorno do envio NFLoteEnvio loteAssinado = retAssinado.getLoteAssinado();

  1. Usar generalização: Fazer a classe HERDAR de NFLoteEnvioRetorno, contendo apenas o NFLoteEnvio assinado:

NFLoteEnvioRetornoAssinado ret = facade.enviaLote(lote); //objeto de retorno do envio NFLoteEnvio loteAssinado = ret.getLoteAssinado();

Pessoalmente vou com a primeira alternativa, pois prefiro sempre utilizar composição ao invés de herança, quando possível, pra não quebrar futuras generalizações e deixar as duas classes "livres". Mas enfim, o que acham?

Abraço!

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153, or mute the thread https://github.com/notifications/unsubscribe/ALSmmY1yPf9SpSWka45RCRwemqtn6SG-ks5qGwDsgaJpZM4Ip4ah .

klutzer commented 8 years ago

Como vc guarda o xml assinado da nota hoje?

jefperito commented 8 years ago

Prefiro a composição, porém com uma ressalva, não gostei muito do nome de "NFLoteEnvioRetornoAssinado", acho que "NFLoteEnvioRetorno" fica mais claro e nele conter os métodos getLoteAssinado e getRetorno.

klutzer commented 8 years ago

Mas a NFLoteEnvioRetorno já existe (é o que voltaria em getRetorno(), que atualmente é diretamente o retorno do enviaLote()).

As alternativas são justamente pra não modificar essa classe já existente.

jefperito commented 8 years ago

hmmm... querendo ou não da primeira forma já quebraria a retrocompatibilidade, pois mudaria a assinatura do método. Aquele nome foi uma sugestão, talvez seguindo um pouco o padrao dos webservices da fazenda, "NFLoteEnvioRetornoDados" por exemplo.

klutzer commented 8 years ago

Pode ser NFLoteEnvioRetornoDados sim.

Pois é, esse é o impasse: ou fizemos da forma que concordamos que seja, em termos de design, a melhor, ou damos prioridade pra retrocompatibilidade e utilizamos herança..

jefperito commented 8 years ago

uhum, esse é o problema de open source :( fica ruim ao começar a lançar diversas versões que há quebra da API, o usuário terá retrabalho diversas vezes ao atualizar a versão da biblioteca.

jefperito commented 8 years ago

esses dias andei lendo sobre versionamento: http://semver.org/ Gostei dessa abordagem

klutzer commented 8 years ago

Aham, muitos (se não a maioria) dos frameworks e bibliotecas utilizam essa abordagem (AngularJS, JQuery, GWT, Maven..). Eu até achava que o projeto já utilizava esse esquema hehe..

Mas enfim, o que sugere? Se utilizarmos herança não quebramos ninguém.. Porém às vezes nada que o README não possa resolver, como foi o caso da última modificação nos KeyStores configurados na NFeConfig

jefperito commented 8 years ago

Acho que apesar da quebra, voto a favor da primeira opção.

klutzer commented 8 years ago

Concordo.. @fincatto o que acha?

waldandrade commented 8 years ago

Ainda não entendi a necessidade de pegar o Lote Assinado como retorno. O importante nâo seria pegar o Lote com o Protocolo, para gerar o XML da nota com o protocolo?... a parte da assinatura não é descartada na geração do danfe?

Continuo não entendendo onde se encaixa a assinatura na arquitetura, depois do envio.

Se vc envia o Lote... ele é assinado antes do envio, apenas para enviar.... quando retorna... existe alguma necessidade de ter o Lote assinado? Em 30/05/2016 14:40, "Érico Knapp Lutzer" notifications@github.com escreveu:

Aham, muitos (se não a maioria) dos frameworks e bibliotecas utilizam essa abordagem (AngularJS, JQuery, GWT, Maven..). Eu até achava que o projeto já utilizava esse esquema hehe..

Mas enfim, o que sugere? Se utilizarmos herança não quebramos ninguém.. Porém às vezes nada que o README não possa resolver, como foi o caso da última modificação nos KeyStores configurados na NFeConfig

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222532733, or mute the thread https://github.com/notifications/unsubscribe/ALSmmT8wfSTF1Wt1Nk_RuZ91pUzlzWh4ks5qGyD-gaJpZM4Ip4ah .

klutzer commented 8 years ago

"Como vc guarda o xml assinado da nota hoje?"

Esse é o motivo.

waldandrade commented 8 years ago

Hoje eu recupero o Lote com o Protocolo, para pegar o protocolo e colocar na nota. Mas a assinatura não tem importãncia. Se a classe de retorno retornar o protocolo já seria suficiente.

No entanto, a questão ai é se no método assícrono de envio é possível obter o protocolo (ou o Lote com o protocolo)... ou o fato de ser assíncrono já pressupõe que vou fazer duas chamadas mesmo para recuperar essa informação.

Pelo que li na documentação é isso.

Caso eu esteja certo, apenas seria necessário, criar um método de envio síncrono que obtem ao invés da resposta normal, a resposta que vc citou. Em 30/05/2016 14:57, "Érico Knapp Lutzer" notifications@github.com escreveu:

"Como vc guarda o xml assinado da nota hoje?"

Esse é o motivo.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222534756, or mute the thread https://github.com/notifications/unsubscribe/ALSmmdEYfGbVre34lRyCK2ZnNNTGknKOks5qGyUagaJpZM4Ip4ah .

fincatto commented 8 years ago

Também gostei mais da primeira opção. Prefiro sempre composição à herança. O que o Érico está propondo, com essa mudança, é uma forma fácil de se guardar as notas assinadas. Como vocês estão fazendo isso?

On Mon, May 30, 2016 at 2:57 PM, Érico Knapp Lutzer < notifications@github.com> wrote:

"Como vc guarda o xml assinado da nota hoje?"

Esse é o motivo.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222534756, or mute the thread https://github.com/notifications/unsubscribe/AADj8FR2XdN_M6tGi7mFqnCXx0G-CwI2ks5qGyUWgaJpZM4Ip4ah .

waldandrade commented 8 years ago

Me confundi quando ele falou "assinado".

É possível capturar já na chamada, o Lote com o protocolo, mesmo sendo a chamada assíncrona? Em 30/05/2016 15:20, "Diego Fincatto" notifications@github.com escreveu:

Também gostei mais da primeira opção. Prefiro sempre composição à herança. O que o Érico está propondo, com essa mudança, é uma forma fácil de se guardar as notas assinadas. Como vocês estão fazendo isso?

On Mon, May 30, 2016 at 2:57 PM, Érico Knapp Lutzer < notifications@github.com> wrote:

"Como vc guarda o xml assinado da nota hoje?"

Esse é o motivo.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222534756, or mute the thread < https://github.com/notifications/unsubscribe/AADj8FR2XdN_M6tGi7mFqnCXx0G-CwI2ks5qGyUWgaJpZM4Ip4ah

.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222537304, or mute the thread https://github.com/notifications/unsubscribe/ALSmmVWIQwO30XA-9RnxTeTAXV1WPFRnks5qGypagaJpZM4Ip4ah .

klutzer commented 8 years ago

@waldandrade O detalhe é que o processo de assinatura é interno, e atualmente é "perdido" no momento do envio. Com essa solução, o lote, juntamente com todas as notas já assinadas, estaria no próprio objeto de retorno, que, caso fosse bem sucedido, poderia ser armazenado sem necessidade de nenhuma outra consulta, pois o método de envio já faz tudo o que tem que fazer, apenas não armazena este estado para quem o chamou.

Assim, futuramente outros objetos úteis ao retorno poderiam ser populados nesta chamada, sem que o processo de envio em si seja modificado..

klutzer commented 8 years ago

PR #150 atualizado com a implementação de composição na classe NFLoteEnvioRetornoDados

waldandrade commented 8 years ago

Eu entendi...

No caso, vamos lá...

Você insere as notas em um lote, envia, no processo de envio, o lote é assinado e enviado. (A assinatura só serve para o envio)

Você recebe um código, para posteriormente reaver o lote ... e poder tirar da resposta o protocolo, que vai indicar que a nota foi processada.

Você quer armazenar o lote, assinado ... que estará sem o protocolo. E terá que resgatar o protocolo, que vem junto com o XML da nota. E pelo que vi da API, quando vc carrega o XML no Lote, a assinatura não apenas se perde, como nâo tem utilidade.

Depois do envio, o lote assinado, sem o protocolo, nâo tem finalidade.

Posso estar totalmente equivocado, e se estiver mil perdões.

Mas acho importante eu levantar essa duvida aqui antes que os amigos coloquem as mãos na massa.

PR #150 https://github.com/wmixvideo/nfe/pull/150 atualizado com a implementação de composição na classe NFLoteEnvioRetornoDados

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222541961, or mute the thread https://github.com/notifications/unsubscribe/ALSmmRCL-Xj4pDVBEsE4uL8ahZSZx37fks5qGzTWgaJpZM4Ip4ah .

waldandrade commented 8 years ago

Corrigindo...

O protocolo vem no Lote... pelo processo da API. Em 30/05/2016 17:41, "Waldney Andrade" waldney.andrade@gmail.com escreveu:

Eu entendi...

No caso, vamos lá...

Você insere as notas em um lote, envia, no processo de envio, o lote é assinado e enviado. (A assinatura só serve para o envio)

Você recebe um código, para posteriormente reaver o lote ... e poder tirar da resposta o protocolo, que vai indicar que a nota foi processada.

Você quer armazenar o lote, assinado ... que estará sem o protocolo. E terá que resgatar o protocolo, que vem junto com o XML da nota. E pelo que vi da API, quando vc carrega o XML no Lote, a assinatura não apenas se perde, como nâo tem utilidade.

Depois do envio, o lote assinado, sem o protocolo, nâo tem finalidade.

Posso estar totalmente equivocado, e se estiver mil perdões.

Mas acho importante eu levantar essa duvida aqui antes que os amigos coloquem as mãos na massa.

PR #150 https://github.com/wmixvideo/nfe/pull/150 atualizado com a implementação de composição na classe NFLoteEnvioRetornoDados

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222541961, or mute the thread https://github.com/notifications/unsubscribe/ALSmmRCL-Xj4pDVBEsE4uL8ahZSZx37fks5qGzTWgaJpZM4Ip4ah .

jefperito commented 8 years ago

Isso, o governo nos obriga a guardar as notas fiscais eletrônica por 5 anos, se eu não me engano, tem que estar assinadas...

klutzer commented 8 years ago

@waldandrade E tem outra, qual é o XML que você envia pro cliente? Pois mesmo que você tenha o protocolo, você não tem mais a nota completa assinada, pois ela não é retornada na consulta do lote..

klutzer commented 8 years ago

Para esclarecer, a classe NFNotaProcessada possui 3 atributos:

  1. versao: versão da nota
  2. nota: Campo "NFe" no xml, equivalente à nota assinada
  3. protocolo: Campo "protNFe" no xml, sendo este o protocolo que você se refere, que só existe após a consulta do envio do lote.

Ou seja, o xml que temos que armazenar e que é enviado ao cliente quando solicitado seria a serialização desse objeto..

NFNotaProcessada nfeProc = new NFNotaProcessada();
nfeProc.setXXX(...); //set dos 3 campos mencionados acima
String xml = nfeProc.toString();
waldandrade commented 8 years ago

Exatamente...

Acho que estamos quase em um consenso.

Vi aqui que realmente é obrigatório guardar a nota assinada, e com a autorização.

Caso, vocês consigam mesmo pegar essa autorização já durante o processo de envio, é um boa... e com certeza vai me ser útil.

Ai vem minha dúvida... que talvez não tenha sido entendida tb.

A) Se a API envia o Lote, e temos que guardar a Nota assinada. Como o retorno do Lote Assinado vai nos ajudar? (No caso, a assinatura do Lote não é a mesma da assinatura da Nota)

B) Nâo seria o envio assíncrono um método feito exatamente para que o resgate do XML da Nota seja feito em um segundo momento? Como se pretende fazer esse resgate do XML? Em 31/05/2016 11:43, "Érico Knapp Lutzer" notifications@github.com escreveu:

Para esclarecer, a classe NFNotaProcessada possui 3 atributos:

  1. versao: versão da nota
  2. nota: Campo "NFe" no xml, equivalente à nota assinada
  3. protocolo: Campo "protNFe" no xml, sendo este o protocolo que você se refere, que só existe após a consulta do envio do lote.

Ou seja, o xml que temos que armazenar e que é enviado ao cliente quando solicitado é o parse desse objeto..

NFNotaProcessada nfeProc = new NFNotaProcessada(); nfeProc.setXXX(...); //set dos 3 campos mencionados acima String xml = nfeProc.toString();

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222710505, or mute the thread https://github.com/notifications/unsubscribe/ALSmmZn5vb3WI0HH2V71SCP3Tu-Rr2lzks5qHEkQgaJpZM4Ip4ah .

waldandrade commented 8 years ago

Confesso que nunca me preocupei com a assinatura das notas que armazeno. Por exemplo, por várias vezes para contornar problemas no emissor que utilizava, baixava um xml do sefaz e simplesmente armazenava, sem se preocupar com a assinatura.

Mas no caso, como nós enviamos um Lote e temos que armazenar as notas, levanto ai pra os amigos essa questão. Em 31/05/2016 13:36, "Waldney Andrade" waldney.andrade@gmail.com escreveu:

Exatamente...

Acho que estamos quase em um consenso.

Vi aqui que realmente é obrigatório guardar a nota assinada, e com a autorização.

Caso, vocês consigam mesmo pegar essa autorização já durante o processo de envio, é um boa... e com certeza vai me ser útil.

Ai vem minha dúvida... que talvez não tenha sido entendida tb.

A) Se a API envia o Lote, e temos que guardar a Nota assinada. Como o retorno do Lote Assinado vai nos ajudar? (No caso, a assinatura do Lote não é a mesma da assinatura da Nota)

B) Nâo seria o envio assíncrono um método feito exatamente para que o resgate do XML da Nota seja feito em um segundo momento? Como se pretende fazer esse resgate do XML? Em 31/05/2016 11:43, "Érico Knapp Lutzer" notifications@github.com escreveu:

Para esclarecer, a classe NFNotaProcessada possui 3 atributos:

  1. versao: versão da nota
  2. nota: Campo "NFe" no xml, equivalente à nota assinada
  3. protocolo: Campo "protNFe" no xml, sendo este o protocolo que você se refere, que só existe após a consulta do envio do lote.

Ou seja, o xml que temos que armazenar e que é enviado ao cliente quando solicitado é o parse desse objeto..

NFNotaProcessada nfeProc = new NFNotaProcessada(); nfeProc.setXXX(...); //set dos 3 campos mencionados acima String xml = nfeProc.toString();

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222710505, or mute the thread https://github.com/notifications/unsubscribe/ALSmmZn5vb3WI0HH2V71SCP3Tu-Rr2lzks5qHEkQgaJpZM4Ip4ah .

klutzer commented 8 years ago

A) A assinatura do lote nada mais é do que a assinatura de todas as notas dentro dele.. Se vc tem um lote assinado, vc tem as notas assinadas também

B) O resgate do XML seria feito no envio, vc guarda esse XML, faz a consulta do lote, pega o protocolo e cria a nota processada com a junção desses dois..

NFLoteEnvioRetornoDados retEnvio = facade.enviaLote(lote);
//Imaginando que tenho apenas uma nota no lote, pra facilitar a demonstração..
NFNota notaAssinada = retEnvio.getLoteAssinado().getNotas().get(0);

NFLoteConsultaRetorno ret = facade.consultaLote(retEnvio.getRetorno().getInfoRecebimento().getRecibo());
NFProtocolo prot = ret.getProtocolos().get(0);

//Agora é o que postei antes...
NFNotaProcessada notaProcessada = new NFNotaProcessada();
notaProcessada.setNota(notaAssinada);
notaProcessada.setProtocolo(prot);
notaProcessada.setVersao(new BigDecimal(3.1));
String xml = notaProcessada.toString();

Lembrando que o PR #150 já torna isso possível.

waldandrade commented 8 years ago

Agora entendi.... só acho que deve ser deixado as duas possibilidades ai em aberto.

Boa sorte ai Em 31/05/2016 13:55, "Érico Knapp Lutzer" notifications@github.com escreveu:

A) A assinatura do lote nada mais é do que a assinatura de todas as notas dentro dele.. Se vc tem um lote assinado, vc tem as notas assinadas também

B) O resgate do XML seria feito no envio, vc guarda esse XML, faz a consulta do lote, pega o protocolo e cria a nota processada com a junção desses dois..

NFLoteEnvioRetornoDados retEnvio = facade.enviaLote(lote);//Imaginando que tenho apenas uma nota no lote, pra facilitar a demonstração..NFNota notaAssinada = retEnvio.getLoteAssinado().getNotas().get(0); NFLoteConsultaRetorno ret = facade.consultaLote(retEnvio.getRetorno().getInfoRecebimento().getRecibo());NFProtocolo prot = ret.getProtocolos().get(0); //Agora é o que postei antes...NFNotaProcessada notaProcessada = new NFNotaProcessada(); notaProcessada.setNota(notaAssinada); notaProcessada.setProtocolo(prot); notaProcessada.setVersao(new BigDecimal(3.1));String xml = notaProcessada.toString();

Lembrando que o PR #150 https://github.com/wmixvideo/nfe/pull/150 já torna isso possível.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222750954, or mute the thread https://github.com/notifications/unsubscribe/ALSmmYvXrKaw7BqQxpkRiTw-z10lIFvyks5qHGgQgaJpZM4Ip4ah .

klutzer commented 8 years ago

Quais possibilidades?

waldandrade commented 8 years ago

Acredito que você terá que fazer uma junção dos dois métodos, no entanto, continuará fazendo duas requisições a do envio e a da consulta, no mesmo método. Existe a possibilidade de erro depois do envio.

Mas vou acompanhar o processo o máximo possível.

2016-05-31 14:24 GMT-03:00 Érico Knapp Lutzer notifications@github.com:

Quais possibilidades?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/153#issuecomment-222759092, or mute the thread https://github.com/notifications/unsubscribe/ALSmmX-dM8MMFmr1fYkfxaQbmIHviVqxks5qHG7qgaJpZM4Ip4ah .

Waldney Souza de Andrade compengi engenharia & sistemas waldney.andrade@gmail.com waldney.andrade@gmail.com

+55(84)8894-3405 +55(84)9447-7354

klutzer commented 8 years ago

Mas esse controle fica a cargo de cada um.. As chamadas são assíncronas, cada um faz os tratamentos que julgar necessário.

No meu caso entre uma chamada e outra eu faço um update no banco.. No seu caso o tratamento pode ser outro..

fincatto commented 8 years ago

Feito merge do codigo, programado para liberar sob a versão 1.3.0 (pois houve uma pequena quebra de compatibilidade.

waldandrade commented 8 years ago

Atualizei minha biblioteca e vi que no envio já recebo agora a nota processada. Anteriormente eu utilizava o protocolo para recuperar o xml, agora como faz, essa nota já é a recuperada?

klutzer commented 8 years ago

@waldandrade dê uma olhada mais pra cima nesse tópico que é explicado passo a passo:

A) A assinatura do lote nada mais é do que a assinatura de todas as notas dentro dele.. Se vc tem um lote assinado, vc tem as notas assinadas também

B) O resgate do XML seria feito no envio, vc guarda esse XML, faz a consulta do lote, pega o protocolo e cria a nota processada com a junção desses dois..

NFLoteEnvioRetornoDados retEnvio = facade.enviaLote(lote);
//Imaginando que tenho apenas uma nota no lote, pra facilitar a demonstração..
NFNota notaAssinada = retEnvio.getLoteAssinado().getNotas().get(0);

NFLoteConsultaRetorno ret = facade.consultaLote(retEnvio.getRetorno().getInfoRecebimento().getRecibo());
NFProtocolo prot = ret.getProtocolos().get(0);

//Agora é o que postei antes...
NFNotaProcessada notaProcessada = new NFNotaProcessada();
notaProcessada.setNota(notaAssinada);
notaProcessada.setProtocolo(prot);
notaProcessada.setVersao(new BigDecimal(3.1));
String xml = notaProcessada.toString();

Lembrando que o PR #150 já torna isso possível.