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

Cada semana não pode parar a nossa série aqui no blog de boas práticas de arquivos fiscais com ACBr, e hoje estarei mostrando como gerar e enviar a NF-e.

Depois de muito conteúdo e muito código chegamos o que muito de vocês estavam esperando. 

Baseado mais ou menos no que já fizemos na classe que faz o Invoker.

...
   TModelFiscalNFeInvoker.New
      .Add(TModelFiscalNFeCommandGeral.New(Self))
      .Add(TModelFiscalNFeCommandIde.New(Self))
      .Add(TModelFiscalNFeCommandEmit.New(Self))
      .Add(TModelFiscalNFeCommandDest.New(Self))
      .Add(TModelFiscalNFeCommandProd.New(Self))
      .Add(TModelFiscalNFeCommandTotal.New(self))
      .Add(TModelFiscalNFeCommandTransp.New(Self))
      .Add(TModelFiscalNfeCommandTranspVol.New(Self))
      .Add(TModelFiscalNfeCommandCobrFat.New(Self))
      .Add(TModelFiscalNfeCommandCobrDup.New(Self))
      .Add(TModelFiscalNfeCommandInfAdic.New(Self))
      .Add(TModelFiscalNfeCommandInfAdicObsComp.New(Self))
      .Add(TModelFiscalNfeCommandInfAdicObsFisco.New(Self))
      .Add(TModelFiscalNfeCommandExporta.New(Self))
      .Add(TModelFiscalNfeCommandCompra.New(Self))
      .Add(TModelFiscalNfeCommandPagamento.New(Self))
      .Add(TModelFiscalNfeCommandGerarNFe.New(Self))
   .Execute;
...

E vamos fazer um teste, vamos pegar a classe TModelFiscalNFe, e na view iremos no evento OnClick do nosso botão.

...
procedure TForm2.Button1Click(Sender: TObject);
begin
   TModelFiscalNFe.New.Gerar;
end;
...

Pela lógica ao executar esse comando irá bater no método Gerar, mostrado no código anterior.

Dessa forma ao executarmos o nosso projeto ele irá passar pelo Invoker e logo em seguida irá passar em cada comando que criamos.

Agora está pronto a ação de gerar a nota fiscal.

Mas vamos dizer que depois de gerar a nota fiscal é preciso enviar a NF-e?

Então para que possamos enviar é necessário criar mais um comando para enviar a NF-e.

Type
   TModelFiscalNfeCommandEnviarNFe = class(TInterfacedObject, iCommand)
   private
      FParent : iModelFiscalNfe;
   public
      constructor Create(Parent : iModelFiscalNfe);
      destructor Destroy; override;
      class function New(Parent : iModelFiscalNfe) : iCommand;
      function Execute : iCommand;
   end;

implementation

uses
   pcnConversaoNFe, pcnConversao;

{ TModelFiscalNfeCommandEnviarNFe }

constructor TModelFiscalNfeCommandEnviarNFe.Create(Parent : iModelFiscalNfe);
begin
   FParent := Parent;
end;

destructor TModelFiscalNfeCommandEnviarNFe.Destroy;
begin
   inherited;
end;

function TModelFiscalNfeCommandEnviarNFe.Execute: iCommand;
begin
   Result := Self;
   FParent.Component._this.Enviar(1, True);
end;

class function TModelFiscalNfeCommandEnviarNFe.New(Parent : iModelFiscalNfe) : iCommand;
begin
   Result := Self.Create(Parent);
end;

Observe que no comando de EnviarNFe no método Execute chamamos o Enviar, nele passamos o Lote e passamos True para imprimir a nota.

Observe a imagem acima de como é os paramentos que é solicitado pelo método Enviar.

Aí vamos pegar esse comando que acabamos de criar de adicionar no nosso Invoker, logo após do comando de gerar nota.

...
   TModelFiscalNFeInvoker.New
      .Add(TModelFiscalNFeCommandGeral.New(Self))
      .Add(TModelFiscalNFeCommandIde.New(Self))
      .Add(TModelFiscalNFeCommandEmit.New(Self))
      .Add(TModelFiscalNFeCommandDest.New(Self))
      .Add(TModelFiscalNFeCommandProd.New(Self))
      .Add(TModelFiscalNFeCommandTotal.New(self))
      .Add(TModelFiscalNFeCommandTransp.New(Self))
      .Add(TModelFiscalNfeCommandTranspVol.New(Self))
      .Add(TModelFiscalNfeCommandCobrFat.New(Self))
      .Add(TModelFiscalNfeCommandCobrDup.New(Self))
      .Add(TModelFiscalNfeCommandInfAdic.New(Self))
      .Add(TModelFiscalNfeCommandInfAdicObsComp.New(Self))
      .Add(TModelFiscalNfeCommandInfAdicObsFisco.New(Self))
      .Add(TModelFiscalNfeCommandExporta.New(Self))
      .Add(TModelFiscalNfeCommandCompra.New(Self))
      .Add(TModelFiscalNfeCommandPagamento.New(Self))
      .Add(TModelFiscalNfeCommandGerarNFe.New(Self))
      .Add(TModelFiscalNfeCommandEnviarNFe.New(Self))
   .Execute;
...

Após executar nosso projeto…

Nossa nota é gerada e impressa com os dados já preenchidos, e claro em ambiente de homologação.

Viu agora estamos gerando a nota e imprimindo perfeitamente, tudo seguindo os padrões de boas práticas, tudo nos seus devidos lugares.

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