Fala ai Radizeiros e Radizeiras tudo bem com vocês?
Se você enxerga cada alteração de demanda regulatória do governo como problema e acha que a rotina com SPEED, NF-e e SINTEGRA nunca terminam.
A cada alteração nessas rotinas é um problema atrás do outro, é chamados a trás de chamados.
Neste post irei te mostrar agora, pode ser a solução de um grande problema que você como desenvolvedor ou dono de software house, pode estar vivendo.
Neste post estarei mostrando como usar as boas práticas da programação usando o componente ACBrNFe, onde iremos reduzir o acoplamento e deixando nosso código mais coeso e de fácil manutenção e novas implementações.
Esse post é o primeiro da série de boas práticas para geração de arquivos fiscais com o ACBr.
Creio que muitos de vocês utilizam esse maravilhoso componente que facilita muito nossas implementações e mantendo-nos atualizados para as normas fiscais, que sofrem constante alterações.
Com essas alterações ou até mesmo manutenções em seus códigos usando esse componente, quando você está totalmente acoplado sabe a dor de cabeça que você tem, procurar e tentar resolver alguns problemas que acontecem no seu dia dia na programação, clientes ligando que não conseguiu gerar uma NF-e, ligando que o cálculo do imposto estão errado, e por aí vai.
Então resolvi criar uma série de posts que irei abordar a criação da geração de arquivos fiscais usando o componente ACBrNFe com as boas práticas da programação.
Vamos lá?
Vamos criar um projeto VCL novo no Delphi.
Para salvar esse projeto devemos seguir o padrão das boas práticas, então já vamos criar uma pasta chamada View, onde iremos salvar os nossos formulários.
Esse UNit2.pas é o nosso formulário que é criado automaticamente pelo Delphi.
Ao salvarmos nosso projeto iremos definir as nomenclaturas que deve seguir esse padrão [Nome do projeto].[a cama onde está].[seu nome].pas
Veja que estamos salvando nossa formulário principal na View, e a nomenclatura é autoexplicativa.
Observe a organização básica que foi criada para nós.
Agora o que iremos fazer é olhar o Demo de NF-e que acompanha o ACBr, para que possamos levar as regras de negócio para dentro do nosso projeto.
Nós iremos refatorar essa parte de “Criar e enviar” do ACBrNFe.
Todo código contido nesse botão iremos refatorar usando os padrões do clean code e as boas práticas, fazendo assim facilitando a implementação e manutenção futuras.
Para a criação e geração da NF-e em nosso projeto é necessário o componente do ACBr, e o da impressão do DANF para o FortesReport.
Os componentes são ACBrNFe e o ACBrNFeDANFeRL, nós iremos colocar esses caras dentro do nosso projeto, sendo que não iremos colocá-lo dentro do formulário, nós devemos colocar eles dentro da nossa estrutura MVC que vai permitir que nosso código fique mais maleável.
Dentro dessa nossa estrutura nós iremos colocar esse componentes dentro da camada Model, tudo que se comunica com o mundo externo, por exemplo, o componente do ACBrNFe faz comunicação com o servidor da nota fiscal eletrônica, ele gerar um arquivo XML na máquina, e envia um e-mail, são comunicações com coisas externas ao nosso software, o que fica externo ao nosso software como, comunicação com o banco de dados, geração de arquivos de log, tudo externo ao nosso software, tudo que é externo ao nosso software tem que ficar dentro da nossa camada Model.
Então o que iremos fazer?
Em nosso projeto e iremos criar um DataModule, nós podemos trabalhar criando manualmente o nosso componente ou agente pode ainda assim aproveitar a parte RAD do Delphi sem perder as boas práticas, mas aí tem alguns detalhes que devemos fazer para que isso aconteça.
Seguindo o padrão da nomenclatura, nós iremos salvar esse nosso DataModel dentro da camada Model, porque ele se comunica com o mundo externo, agora dentro do Model eu posso ter, Model para trabalhar com o banco de dados, Model para NFe, Model para SPED, eu posso ter várias comunicações diferentes dentro do meu Model, neste post iremos tratar de NFe, agora já temos a nossa estrutura e iremos salvar esse nosso DataModel para o nosso ACBr.
Nossa estrutura para o ACBr irá estar dentro da camada Model > Fiscal > NFe > Componentes > ACBr, chegamos a esse nível de organização, para que possamos separar cada regra na sua camada específica, observe como ficou nossa estrutura e claro, a nomenclatura do DataModule.
Observe que está tudo separado bonitinho aonde iremos colocar o nosso componente, e no final você vai ver que isso nos ajuda, seguindo essas nomenclaturas que estou mostrando para vocês aqui, quando mandarmos o Model / View do Delphi gerar a documentação do nosso software, ele irá gerar essa documentação já organizadas.
Como falei dentro desse nosso DataModule iremos colocar os componentes do ACBr para geração da NFe.
Tudo que agente precisa do ACBr está agora em nosso DataModule, toda configuração que iremos precisar que fazer irá acontecer dentro desse nosso DataModule.
Só que agora antes de qualquer implementação, nosso DataModule deve herdar de uma interface, e ai vem alguns conceitos de programação um pouco mais avançados.
Para tal iremos criar uma nova Unit, uma observação, que ao meu ver é o único ponto que o ACBr peca, porque ele não é orientado a interface, ele é orientado a objeto somente, e as boas práticas dizem que temos que programar para uma interface e não para uma classe concreta, e o ACBr é todo baseado em classes concretas, isso dificulta muito que possamos reduzir o acoplamento dentro do nosso código, ainda mais quando trabalhamos com NFe, onde são muitos campos, isso trás uma certa dificuldade para nós.
Se o ACBr fosse interfaceado seria fantástico, mas podemos dar um jeitinho para facilitar nossa vida.
Nessa nossa Unit iremos declarar nossas interfaces.
Observe que salvamos nossa unit em componentes, porque todos os nossos componentes irão implementar essa mesma interface.
type iModelFiscalNFeCompoentes<T> = interface ['{A652704B-022A-4467-B881-C791F95D62D8}'] end;
Essa é a interface que iremos trabalhar, o meu DataModule de ACBr precisa implementar essa nossa interface, eu to usando o TecnoSpeed, então nosso DataModule do TecnoSpeed irá implementar essa interface.
Isso irá fazer com que o nosso código fica mais suscetível a mudanças, todos os componentes irão implementar os métodos que nós teremos nessa interface.
E por enquanto nós iremos ter um método genérico chamado _This.
type iModelFiscalNFeCompoentes<T> = interface ['{A652704B-022A-4467-B881-C791F95D62D8}'] function _This : T; end;
Nossa interface e o seu método são genéricos, eu não sei quem é esse generic, por exemplo, se eu for trabalhar com ACBr, quando o ACBr for implementar essa interface, o genérico será o componente do ACBr, se for trabalhar com TecnoSpeed, ele irá implementar o componente do TecnoSpeed.
Mas como posso fazer isso?
Lembra do nosso DataModule do ACBr?
Ele irá implementar essa nossa interface, observe o código abaixo.
type TdmACBrNFe = class(TDataModule, iModelFiscalNFeCompoentes<TACBrNFe>) ACBrNFe1: TACBrNFe; ACBrNFeDANFeRL1: TACBrNFeDANFeRL; private { Private declarations } public function _This : TACBrNFe; end; ... function TdmACBrNFe._This: TACBrNFe; begin Result := ACBrNFe1; end;
Observe que o genérico dessa nossa interface recebeu o componente do ACBrNFe, e o método que foi implementado da interface retorna o nosso componente do ACBrNfe.
Uma coisa que devemos fazer pois quando criamos o DataModule ele é criado automaticamente junto com o projeto, e não queremos mais que ele seja criado automaticamente, e sim gerenciado por nós mesmo.
Fazendo assim tiramos ele do autocreate.
Viu como vamos melhorando todo nosso código para implementação do ACBrNFe, esse é apenas o primeiro post da nossa série de Boas práticas para geração de arquivos fiscais com ACBr, este post foi extraído de um dos meus treinamentos que ensino todas as técnicas de boas práticas com clean code para geração de arquivos fiscais.
Com as técnicas aplicadas nesse treinamento, alem de aprender a aplicar na criação e emissão da NF-e, você pode também aplicar facilmente para o SPED e o SINTEGRA, ou seja, o que é problema para você hoje, depois desse treinamento você irá enxergar como oportunidade.
CLIQUE AQUI PARA SABER MAIS SOBRE O TREINAMENTO BOAS PRÁTICAS PARA GERAÇÃO DE ARQUIVOS DISCAIS COM ACBr