Closed klutzer closed 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:
- 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();
- 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 .
Como vc guarda o xml assinado da nota hoje?
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.
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.
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.
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..
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.
esses dias andei lendo sobre versionamento: http://semver.org/ Gostei dessa abordagem
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
Acho que apesar da quebra, voto a favor da primeira opção.
Concordo.. @fincatto o que acha?
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 .
"Como vc guarda o xml assinado da nota hoje?"
Esse é o motivo.
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 .
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 .
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 .
@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..
PR #150 atualizado com a implementação de composição na classe NFLoteEnvioRetornoDados
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 .
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 .
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...
@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..
Para esclarecer, a classe NFNotaProcessada
possui 3 atributos:
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();
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:
- versao: versão da nota
- nota: Campo "NFe" no xml, equivalente à nota assinada
- 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 .
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:
- versao: versão da nota
- nota: Campo "NFe" no xml, equivalente à nota assinada
- 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 .
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.
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 .
Quais possibilidades?
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
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..
Feito merge do codigo, programado para liberar sob a versão 1.3.0 (pois houve uma pequena quebra de compatibilidade.
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?
@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.
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:
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!