Post: Acionando o Visitor para Regras Fiscais Simples e Normal

Alessandro Medeiros

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

Você que tem acompanhado nossa série de boas práticas de arquivos fiscais, lembra que especializamos as classes fiscais, e no post de hoje não poderia faltar a continuidade é claro…rsrs

E nesse post iremos utilizar o padrão de projeto Visitor, já visto em outros posts aqui da nossa série, para as regras fiscais para os regimes Simples e Normal, você verá o como é fácil quando temos toda nossa estrutura bem organizada e seguindo as boas práticas.

E o que iremos fazer é dizer para ele o quem é que faz a regra fiscal, isso que iremos fazer poderia ser feito pelo controller, pode ser feito por qualquer lugar, mas o ideal é fazer isso no controller, mas a princípio não iremos criar o controller.

Como não vou criar o controller, vamos em nosso comando de produto e no seu create iremos declarar o Accept passando o visitante para ele.

…
constructor TModelFiscalNFeCommandProd.Create(Parent : iModelFiscalNFe);
begin
  FParent := Parent;
  Self.Accept(TModelFiscalNFeRegrasFiscaisICMSRegimeNormal.New);
end;
…
function TModelFiscalNFeCommandProd.Execute: iCommand;
begin
…
   FVisitor.Visit(FParent).ProdutoImpostoICMS;
end;

Lembrando que isso era pra ser chamado no controller, onde é ele que irá chavear isso qual é a regra fiscal.

Mas no código acima quando eu crio o comando de produto já estou definindo quem irá tratar a regra fiscal é o meu regime normal e quando chega no método executar na parte do imposto do ICMS irá passar para o visitante.

Agora ao executar o projeto você terá a nota emitida no regime normal, como já foi feita no post anterior.

Agora iremos criar uma nova classe para tratar o Simples Nacional, Blog.Model.Fiscal.NFe.RegrasFiscais.ICMS.Simples.

type
  TModelFiscalNFeRegrasFiscaisICMSSimples = class (TInterfacedObject, iModelNFeRegras, iVisitor)
    private
      FParent : iModelFiscalNFe;
    public
      constructor Create;
      destructor Destroy; override;
      class function New : iVisitor;
      function ProdutoImpostoICMS : iModelNFeRegras;
      function Visit(Value : iModelFiscalNFe) : iModelNFeRegras;
  end;

implementation

uses
  pcnConversao;

{ TModelFiscalNFeRegrasFiscaisICMSSimples }

constructor TModelFiscalNFeRegrasFiscaisICMSSimples.Create;
begin

end;

destructor TModelFiscalNFeRegrasFiscaisICMSSimples.Destroy;
begin

  inherited;
end;

class function TModelFiscalNFeRegrasFiscaisICMSSimples.New: iVisitor;
begin
  Result := Self.Create
end;

function TModelFiscalNFeRegrasFiscaisICMSSimples.ProdutoImpostoICMS: iModelNFeRegras;
begin
  Result := Self;
  FParent.Component.Produto.Imposto.vTotTrib := 0;
  FParent.Component.Produto.Imposto.ICMS.CST          := cst00;
  FParent.Component.Produto.Imposto.ICMS.orig    := oeNacional;
  FParent.Component.Produto.Imposto.ICMS.modBC   := dbiValorOperacao;
  FParent.Component.Produto.Imposto.ICMS.vBC     := 100;
  FParent.Component.Produto.Imposto.ICMS.pICMS   := 18;
  FParent.Component.Produto.Imposto.ICMS.vICMS   := 18;
  FParent.Component.Produto.Imposto.ICMS.modBCST := dbisMargemValorAgregado;
  FParent.Component.Produto.Imposto.ICMS.pMVAST  := 0;
  FParent.Component.Produto.Imposto.ICMS.pRedBCST:= 0;
  FParent.Component.Produto.Imposto.ICMS.vBCST   := 0;
  FParent.Component.Produto.Imposto.ICMS.pICMSST := 0;
  FParent.Component.Produto.Imposto.ICMS.vICMSST := 0;
  FParent.Component.Produto.Imposto.ICMS.pRedBC  := 0;
end;

function TModelFiscalNFeRegrasFiscaisICMSSimples.Visit(
  Value: iModelFiscalNFe): iModelNFeRegras;
begin
  Result := Self;
  FParent := Value;
end;

Se você observar a nossa classe do Simples, ele implementa as mesmas as mesmas regras fiscais e tem o padrão visitante, idêntica a nossa classe do Regime Normal, e no método ProdutoImpostoICMS tem o calculo do imposto, onde você faria o cálculo para o Simples.

Agora basta ir create do comando de Produto, e alterar o regime para essa classe que acabamos de criar.

…
constructor TModelFiscalNFeCommandProd.Create(Parent : iModelFiscalNFe);
begin
  FParent := Parent;
  Self.Accept(TModelFiscalNFeRegrasFiscaisICMSSimples.New);
end;
…
function TModelFiscalNFeCommandProd.Execute: iCommand;
begin
…
   FVisitor.Visit(FParent).ProdutoImpostoICMS;
end;

Fazendo desta forma quem irá tratar agora o ICMS do produto é a nossa classe de regras do Simples Nacional.

Quando você trabalha usando esse padrões as coisas ficam mais fácil, viu como com apenas um comando já tratamos o regime fiscal das NF-e, coisa que para muitos é dor de cabeça, agora é algo bem mais simples e bonito de se trabalhar.

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





Faça sua busca

CATEGORIAS

POSTS RECENTES

E caso você tem interesse de conhecer mais sobre Acionando o Visitor para Regras Fiscais Simples e Normal, acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI
Você não terá só conteúdos relacionados ao Acionando o Visitor para Regras Fiscais Simples e Normal, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.
Gostou?
Compartilhe:

Embarque no foguete com milhares de devs para aprender desenvolvimento, evoluir de forma contínua e se manter relevante no mercado.

Dúvidas
Cadastre-se em nossa lista

Para ter acesso em primeira mão, a tudo que acontece na Academia do Código, basta se cadastrar em nossa lista

Grupo Thulio Bittencourt | Academia do Código

#FaçaPartedaHistória

Copyright © 2024 – Todos os direitos reservados