Fala ai Radizeiros e Radizeiras, tudo bem com vocês?

Quantas vezes você teve que resolver problemas dentro do seu software que tem sido constante?

Principalmente quando se fala nas rotinas fiscais, a cada alteração do governo, é aquela correria no setor de desenvolvimento, o suporte abrindo chamados constantes com erros nas gerações fiscais.

Quando não se trabalha da forma devida dentro do seu software sempre será assim, uma dor para o seu desenvolvimento.

Trabalhar com as boas práticas é algo de extrema importância, é o que constantemente tenho falado, e para lhe ajudar criei uma serie de posts aqui no blog onde venho falado de como aplicar as boas práticas nas geração de arquivos fiscais, estou aqui pra lhe mostrar que você pode sim tornar sua dor no desenvolvimento em um prazer.

Então vamos lá?

Hoje estarei mostrando como podemos encapsular os métodos do componente que criamos, componente esse que é a classe que faz a abstração do ACBr.

Se você observar o demo que acompanha o componente do ACBr, antes de gerar a nota, ele limpa as notas fiscais.

...
ACBrNFe1.NotasFiscais.Clear;
ACBrNFe1.Configuracoes.Geral.ModeloDF := moNFe;
ACBrNFe1.Configuracoes.Geral.VersaoDF := TpcnVersaoDF(cbVersaoDF.ItemIndex);
GerarNFe(vAux);
...

Então continuando com o post anterior, iremos adicionar o método de limpar notas fiscais dentro do método Gerar da nossa classe mãe.

...
FComponente._This.NotasFiscais.Clear;
...

Se você não viu os posts anterior acesse aqui, para dar seguimento a esse nossa série e ficar por dentro de tudo que está acontecendo na geração de arquivos fiscais usando as boas práticas.

Se você observar o código do Demo do ACBr ele manda limpar as notas fiscais, logo em seguida preenche as configurações, e ao entrarmos no método GerarNFe, você poderá observar que ele manda adicionar a nota fiscal.

...
NotaF := ACBrNFe1.NotasFiscais.Add;
...

E observando esse adicionar nota fiscal veremos que ele está retornando o próprio objeto de nota fiscal.

Ai que está uma situação que iremos precisar tratar.

Observando o código do método GerarNFe do demo do ACBr, você encontrará uma variável do tipo NotaFiscal, ela é criada e a partir daí ela começa a ser preenchida.

...
Var NotaF: NotaFiscal;
...
    NotaF := ACBrNFe1.NotasFiscais.Add;
    NotaF.NFe.Ide.cNF    := StrToInt(NumNFe); //Caso não seja preenchido será gerado um número aleatório pelo componente
    NotaF.NFe.Ide.natOp  := 'VENDA PRODUCAO DO ESTAB.';
    NotaF.NFe.Ide.indPag := ipVista;
...

Se eu simplesmente chamar o Add nota fiscal dentro da nossa classe mãe, ele vai adicionar a nota, mas irei ter que criar um acoplamento para poder salvar dentro de uma variável e por aí vai, eu não quero isso, por este motivo iremos tratar diretamente dentro da nossa classe de componente.

Vamos em nossa classe de Interfaces de componentes, observe no código abaixo que nossa interface de componente só tem o método _This, iremos agora adicionar mais dois métodos dentro dessa nossa interface, que será o AddNotaFiscal, que irá criar uma nova nota fiscal, que retorna a própria nota fiscal, e o método NotaFiscal.

iModelFiscalNFeCompoentes<T> = interface
    ['{A652704B-022A-4467-B881-C791F95D62D8}']
    function _This : T;
    function AddNotaFiscal : NotaFiscal;
    function NotaFiscal : NotaFiscal;
end;

Vamos adicionar esse dois métodos em nosso DataModule que implementa essa nossa interface de componente.

Nesse nosso DataModule que trata o componente de ACBrNFe, iremos implementar os métodos adicionados, mas primeiro criamos uma variável privada chamada FNotaFiscal do tipo NotaFiscal, no método AddNotaIFiscal, que acabamos de criar, iremos passar para essa variável o método Add da nota fiscal, e no retorno do método passamos essa nossa variável, pois o seu retorno está esperando o tipo NotaFiscal, e quando eu quisermos retornar a nota atual, a que estou trabalhando, basta chamar o método NotaFiscal e não mais o Add, como é visto no Demo do ACBr.

...
FNotaFiscal : NotaFiscal;
...
function TdmACBrNFe.AddNotaFiscal: NotaFiscal;
begin
    FNotaFiscal := ACBrNFe1.NotasFiscais.Add;
    Result := FNotaFiscal;
end;
...
function TdmACBrNFe.NotaFiscal: NotaFiscal;
begin
  Result := FNotaFiscal;
end;

Dessa forma, esse gerenciamento da variável que no Demo do ACBr cria, fica dentro do componente, eu não vejo mais ele, a nossa classe mãe não pode ver isso mais, agora na hora de trabalhar na classe mãe, após limpar as notas fiscais iremos adicionar as notas fiscal.

...
FComponente._This.NotasFiscais.Clear;
FComponente.AddNotaFiscal;
...

Fazendo assim ele já cria lá dentro para nós a nova nota fiscal.

Agora já temos uma nota fiscal criada pronta para trabalharmos.

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