Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migração de NFe para .net Standard (.netCore + .netFramework) #1001

Closed
5 tasks done
danilobreda opened this issue Jul 10, 2019 · 33 comments
Closed
5 tasks done

Migração de NFe para .net Standard (.netCore + .netFramework) #1001

danilobreda opened this issue Jul 10, 2019 · 33 comments

Comments

@danilobreda
Copy link
Contributor

danilobreda commented Jul 10, 2019

Como levantado anteriormente com @robertorp a ideia é migrar a parte de NFe para .net standard 2.0, permitindo a utilização em .net framework e dotnet core.
É interessante levantar ideia que foram implementadas na migração do CTe, que hoje suporta .net core e .net framework juntos.

Objetivo:

  • Permitir que o modulo de NFe funcione em .Net Core em multiplataforma;
  • Manter o funcionamento dos módulos atuais em .NetFramework;
  • Não gerar Breaking Changes para os usuários atuais (Compatibilidade com a assinatura de método anterior).

Problemas Levantados para discussão:

  • Nos projetos de Demo do Nfe, hoje o .net Core não suporta windows forms ou wpf, por isso é necessário fazer um console application em .net core, integrando todas as funcionalidades (assim como foi feito no CTe)
  • No CTe foram criados SharedProjects que são referenciados tanto em projetos .net framework como .net standard, esse será o caminho atual para a maioria dos projetos a serem migrados.
  • O Projeto WSDL é o único impossibilitado de ser migrado para o .net standard, por conta da descontinuação do System.Web e suporte a WCF. O Projeto CTe tem suas classes implementadas manualmente, e talvez esse seja o caminho. Também existe o projeto oficial da microsoft de wcf
  • Como fica o código antigo do projeto Wsdl do NFe? Manteremos 2 versões (novo e antigo)?
  • Utilização do OpenFastReport que suporta multiplataformas, para impressão do Danfe. DANFe usando FastReport OpenSource #981

Projeto de migração atualmente se encontra em danilobreda/DFe.NET (branch nfecoreport)

@marcosgerene
Copy link
Contributor

marcosgerene commented Jul 10, 2019

@danilobreda

Hoje o .net Core não suporta windows forms ou wpf, por isso é necessário fazer um console application em .net core, integrando todas as funcionalidades (assim como foi feito no CTe)

Está falando do Demo?


Como fica o código antigo do projeto Wsdl do NFe? Manteremos 2 versões (novo e antigo)?

Podemos ter algo como "deprecated" por uns 30-90 dias e depois remover o código antigo, não vejo motivo para manter os dois códigos.


Utilização do OpenFastReport que suporta multiplataformas, para impressão do Danfe. #981

FastReports/FastReport#79 (comment)

@marcosgerene : Has a forecast for this?
@fediachov: This feature will be available for implementation after release of .NET CORE 3.0

O FastReports open source não oferece (ainda) direct print, só para o .net core 3.0, não é viável principalmente para a NFCe...

... agora, ativando o modo gambiarra... algo assim: https://stackoverflow.com/questions/17448465/send-pdf-file-to-a-printer-print-pdf pode até ser que amenize, mas... não sei a viabilidade disso... aliás, nem sei se isso é possível em .net core...

@danilobreda
Copy link
Contributor Author

danilobreda commented Jul 11, 2019

@marcosgerene

Está falando do Demo?

Sim, já adicionei mais informações ao texto original. Vai ficar igual ao projeto de CTe.

O FastReports open source não oferece (ainda) direct print, só para o .net core 3.0, não é viável principalmente para a NFCe...

Pensei em não mexer os projects do danfe atuais, que estão funcionando. Apenas criar um novo projeto para Danfe em .net core (pois o processo será para retornar um html ou pdf para o usuário), usando o OpenFastReport.
Tenho também a ideia de criar um sharedProject para os projetos do Danfe para reaproveitamento de código, se necessário.

@marcosgerene
Copy link
Contributor

@danilobreda

Pensei em não mexer os projects do danfe atuais, que estão funcionando. Apenas criar um novo projeto para Danfe em .net core (pois o processo será para retornar um html ou pdf para o usuário), usando o OpenFastReport.
Tenho também a ideia de criar um sharedProject para os projetos do Danfe para reaproveitamento de código, se necessário.

Entendi seu ponto, bem interessante.

@robertorp
Copy link
Contributor

@danilobreda

Hoje o .net Core não suporta windows forms ou wpf, por isso é necessário fazer um console application em .net core, integrando todas as funcionalidades (assim como foi feito no CTe)

Está falando do Demo?

Como fica o código antigo do projeto Wsdl do NFe? Manteremos 2 versões (novo e antigo)?

Podemos ter algo como "deprecated" por uns 30-90 dias e depois remover o código antigo, não vejo motivo para manter os dois códigos.

Utilização do OpenFastReport que suporta multiplataformas, para impressão do Danfe. #981

FastReports/FastReport#79 (comment)

@marcosgerene : Has a forecast for this?
@fediachov: This feature will be available for implementation after release of .NET CORE 3.0

O FastReports open source não oferece (ainda) direct print, só para o .net core 3.0, não é viável principalmente para a NFCe...

... agora, ativando o modo gambiarra... algo assim: https://stackoverflow.com/questions/17448465/send-pdf-file-to-a-printer-print-pdf pode até ser que amenize, mas... não sei a viabilidade disso... aliás, nem sei se isso é possível em .net core...

Não tem necessidade de deletar nada do projeto, não tem necessidade de depreciar.
Se precisar fazer isso e porque estão adicionando ou modificando as coisas existentes.
Nesse ponto ta de boa, nada altera nos fontes, a unica coisa que altera são as classes WSDL que fazem a comunicação com a sefaz, basta re-escrever todas elas usando o mesmo padrão do CT-e
o resto já e compatível bastando apenas criar projetos shareds.

@marcosgerene
Copy link
Contributor

In @robertorp we trust! kkk

@bruno-alencar
Copy link
Contributor

@danilobreda Temos uma opção que talvez te ajude nesta questão. https://github.com/nfe/DFe.NET

@danilobreda
Copy link
Contributor Author

danilobreda commented Jul 16, 2019

@marcosgerene @robertorp A impressão do Danfe deu certo, porem a parte da impressão tive que mudar algumas coisas(Regex, linq, environment.newline) dos scripts de impressão dentro do .frx do FastReport. A saída foi converter esses métodos em métodos manuais.
Issue levantada: FastReports/FastReport#101

Lembrando que o projeto do .netframework não foi alterado, estou dando cntrl-c cntrl-v nesses frx's para o projeto em .net core.

Os retornos de geração do Danfe estou fazendo por HTML, PDF e IMAGEM PNG (todos esses em retorno do tipo array por enquanto), acham que devo fazer diferente? Retornar um File, Image?

@marcosgerene
Copy link
Contributor

@danilobreda

Os retornos de geração do Danfe estou fazendo por HTML, PDF e IMAGEM PNG (todos esses em retorno do tipo array por enquanto), acham que devo fazer diferente? Retornar um File, Image?

Qual é o retorno "natural" do FastReports (File, Image, byte[], ...) ?

This was referenced Jul 18, 2019
@danilobreda
Copy link
Contributor Author

danilobreda commented Jul 22, 2019

@marcosgerene Os retornos hoje do .net framework do Danfe(NFe.Danfe.Fast) são esses da classe DanfeBase:
Visualizar (nao suportado)
ExibirDesign (nao suportado)
Imprimir (nao suportado)

ExportarPdf (passando o caminho do pdf)
ExportarPdf(recebendo em stream)

O que estou fazendo hoje é gerando 3 tipos de arquivos(pdf, html e png) e retornando eles em bytes.
Pois acredito que na maioria das vezes o sistema web faz qualquer coisa com os bytes (retorno do GET, salva em algum lugar como azure blob ou Amazon s3, etc)

public byte[] ExportarPdf()
public byte[] ExportarHtml()
public byte[] ExportarPng()

Acho que é interessante retorno de stream...o que acha?

Vale lembrar que esse projeto (NFe.Danfe.Fast.Standard) é separado do NFe.Danfe.Fast. E utiliza o fast report opensource.

@danilobreda
Copy link
Contributor Author

danilobreda commented Jul 23, 2019

A migração a partir de agora está apenas "mão na massa", toda parte da arquitetura já foi definida para a conversão de todas as operações de NFe.
Uma coisa que me chamou a atenção foi que os XMLs gerados(baseados no código .net core do CTe) contem elementos diferentes de cabeçalho do xml atual(.net framework).

.net Framework (antigo):

POST https://homologacao.nfe.fazenda.sp.gov.br/ws/nfestatusservico4.asmx HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.portalfiscal.inf.br/nfe/wsdl/NFeStatusServico4/nfeStatusServicoNF"
Host: homologacao.nfe.fazenda.sp.gov.br

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NFeStatusServico4"><consStatServ versao="4.00" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>2</tpAmb><cUF>35</cUF><xServ>STATUS</xServ></consStatServ></nfeDadosMsg></soap:Body></soap:Envelope>

.net Standard (novo):

POST https://homologacao.nfe.fazenda.sp.gov.br/ws/nfestatusservico4.asmx HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.portalfiscal.inf.br/nfe/wsdl/NFeStatusServico4/nfeStatusServicoNF"
Host: homologacao.nfe.fazenda.sp.gov.br

<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"><soap12:Body><nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NFeStatusServico4"><consStatServ versao="4.00" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>2</tpAmb><cUF>35</cUF><xServ>STATUS</xServ></consStatServ></nfeDadosMsg></soap12:Body></soap12:Envelope>

Diferenças:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
para
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Entre outras...

Essas definições estão corretas?

EDIT:

Verificadas em homologação e estão corretas! 👍

@danilobreda
Copy link
Contributor Author

Migração esta completa para as versões de NFe 4.0, e algumas da 3.1. Os que não foram migrados(maioria 1.0 e 2.0) são por conta da não possibilidade de Teste, porem são minimamente utilizados.

Todo os projects que está em .netFramework não foram alterados, salvos ortografias e conversões de arquivos ".cs" de unicode para utf8.

Foram criados varios projects e shared projects, como principais: NFe.Danfe.Fast.Standard e NFe.Wsdl.Standard nos quais contem código com suporte para .net standard/core.

Acredito que haverá mais contribuições, isso é apenas um começo para que fique 💯% !

Segue Pull Request para analise...

@marcosgerene
Copy link
Contributor

@danilobreda EXCELENTE, parabéns pela iniciativa!

@Braytiner
Copy link

É possível utilizar em um projeto Asp Net Core MVC hospedado em um servidor linux?

@danilobreda
Copy link
Contributor Author

danilobreda commented Sep 12, 2019

É possível utilizar em um projeto Asp Net Core MVC hospedado em um servidor linux?

@Braytiner será possível sim, no momento estou utilizando em um servidor Ubuntu (docker) + asp net core mvc para testes... e funciona perfeitamente. Existem alguns detalhes porem serão colocados na documetação do projeto!

O Pull Request está já em analise e bem próximo de ser aprovado e disponibilizado.

@Braytiner
Copy link

Show de bola! Assim que estiver disponível vou começar a utilizar.

@viniciusverasdossantos
Copy link
Contributor

Baixei os fontes aqui danilo. Muito bom.
Tem um probleminha quando habilita remover acentos. Ele remove os acentos depois de assinar..ai da erro de assinatura.

@danilobreda
Copy link
Contributor Author

@viniciusverasdossantos poderia me mostrar qual o erro de assinatura? Pois aqui habilitei o remove acento e funciona tranquilamente. O problema pode ser outra coisa.

@viniciusverasdossantos
Copy link
Contributor

viniciusverasdossantos commented Sep 17, 2019

Camarada...segue o print da sua demo https://www.screencast.com/t/2c5oyl3Nbz
Nao vi forma de funcionar a nao ser removendo os acentos antes do metodo de envio...dentro do metodo ele remove acento de um nfe assinado.

@danilobreda
Copy link
Contributor Author

Camarada...segue o print da sua demo https://www.screencast.com/t/2c5oyl3Nbz
Nao vi forma de funcionar a nao ser removendo os acentos antes do metodo de envio...dentro do metodo ele remove acento de um nfe assinado.

@viniciusverasdossantos
Opa obrigado pelo retorno, realmente o código esta incorreto, o nfe.Valida() não deveria estar ali. Pois ele precisa apenas validar dentro do NFeAutorizacao! O que já acontece!
Obrigado pelo feedback!

@robertorp
Copy link
Contributor

A remoção de acento acontece em dois pontos.

1- Antes da assinatura
2- Antes do envio para garantir isso a integridade da assinatura

Motivo?

Quando você converte o objeto NFe para um XML string o objeto NFe tem acentos..

1- E feito uma conversão do objeto NFe para XML string antes da assinatura ou seja.. e removido os acentos todos, é assinado o documento. é Preenchido o objeto de NFe com a assinatura em forma de objeto também.

2- Antes de enviar para o WSDL o objeto NFe é convertido juntamente com a assinatura para XML string o que ocorre aí? a assinatura está inválida! pois após a conversão o XML string está com acentos novamente! aí e feito a remoção dos assentos novamente do XML string garantindo a assinatura.

Ou seja.. a remoção de acentos acontece em duas etapas

1- Quando assina o documento
2- Antes de enviar para o WSDL

@danilobreda
Copy link
Contributor Author

@robertorp como ficou a questão do danfe? Tentei acessar as classes pelo nuget gerado e não obtive sucesso :(

@robertorp
Copy link
Contributor

O danfe não coloquei no nuget, isso é um caso a parte que deve ser analisado detalhadamente, o danfe em fastreport do fastreport pago nunca foi colocado no nuget pelo simples fato de ser pago.
Agora esse danfe nf-e do fastreport open source é outra história, capaz que podemos publicar né? mas sera que podemos mesmo? Preciso da certeza disso.

@danilobreda
Copy link
Contributor Author

@robertorp
Acredito que podemos sim, ele terá apenas um referencia ao nuget do fastreport opensource. Como fazer isso não faço ideia, nunca criei pacotes nugets. Acredito que ele faça isso de forma automática.
Seria legal ser um pacote separado? Eu acho que seria bacana.

@danilobreda
Copy link
Contributor Author

Ele esta em licença MIT, é tranquilo... https://github.com/FastReports/FastReport/blob/master/LICENSE.md

@viniciusverasdossantos
Copy link
Contributor

@danilobreda vi que o ConsultarDistribuicaoDFe não esta implementado no Standard. Posso tentar fazer...so gostaria de saber se não foi feito por algum motivo especifico.

@danilobreda
Copy link
Contributor Author

@danilobreda vi que o ConsultarDistribuicaoDFe não esta implementado no Standard. Posso tentar fazer...so gostaria de saber se não foi feito por algum motivo especifico.

Não consegui fazer pois não soube implementar, pior que tentei, li manual e tudo, infelizmente não obtive sucesso... Será de grande ajuda sua contribuição :D

@viniciusverasdossantos
Copy link
Contributor

@danilobreda , consegui fazer. Vou fazer o pull request.

@marcosgerene
Copy link
Contributor

@danilobreda
Uma dúvida:

Eu tenho a versão Desktop do FastReports e meu sistema é winforms... posso continuar usando as minhas dlls? Como devo proceder?

@danilobreda
Copy link
Contributor Author

@marcosgerene A ideia é continuar utilizando tranquilamente o da versão do .net framework... até porque foram projetos separados criados, com final .Standard... esses foram os criados para .net core.
Os anteriores não foram alterados! apenas ocorreram algumas modificações em refactoring.

@danilobreda
Copy link
Contributor Author

danilobreda commented Sep 22, 2019

Vou testar o novo nuget com no projeto da empresa onde trabalho... que utiliza o NFe em .net core... e ai sim vou finalizar essa issue.

@viniciusverasdossantos
Copy link
Contributor

A remoção de acento acontece em dois pontos.

1- Antes da assinatura
2- Antes do envio para garantir isso a integridade da assinatura

Motivo?

Quando você converte o objeto NFe para um XML string o objeto NFe tem acentos..

1- E feito uma conversão do objeto NFe para XML string antes da assinatura ou seja.. e removido os acentos todos, é assinado o documento. é Preenchido o objeto de NFe com a assinatura em forma de objeto também.

2- Antes de enviar para o WSDL o objeto NFe é convertido juntamente com a assinatura para XML string o que ocorre aí? a assinatura está inválida! pois após a conversão o XML string está com acentos novamente! aí e feito a remoção dos assentos novamente do XML string garantindo a assinatura.

Ou seja.. a remoção de acentos acontece em duas etapas

1- Quando assina o documento
2- Antes de enviar para o WSDL

Descobri o problema então. O segundo metodo ObterAssinatura dentro do metodo Assina em ExtNFe esta sempre passando false. ignorando as configs. Vou fazer o pull request.

@marcosgerene
Copy link
Contributor

@danilobreda

@marcosgerene A ideia é continuar utilizando tranquilamente o da versão do .net framework... até porque foram projetos separados criados, com final .Standard... esses foram os criados para .net core.
Os anteriores não foram alterados! apenas ocorreram algumas modificações em refactoring

Excelente!

@danilobreda
Copy link
Contributor Author

Os Nugets funcionaram perfeitamente...
Estou fechando a Issue, qualquer dúvidas e comentários, tratar em novas issues.
Obrigado a todos pela ajuda. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants