ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Calculo de Imposto em Nota Fiscal de Saída

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Automação Comercial
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Borland_Linuxer
Moderador
Moderador


Registrado: Terça-Feira, 11 de Outubro de 2005
Mensagens: 4252
Localização: Manaus - Am

MensagemEnviada: Seg Jun 28, 2010 1:26 am    Assunto: Calculo de Imposto em Nota Fiscal de Saída Responder com Citação

Ola Caros colegas do fórum todos ja passamos onde ainda passamos pelo trabalho de apredendizagem da parte fiscal e tributaria para implementar em nossos sistemas esses calculos.

Bom estou com algumas duvidas sobre quais as diferenças que existe num calculo de icms por exemplo como a empresa e optante pelo simples nacional e de lucro real ou presumido.

Então eu comercei a criar uma unit para calculo de imposto de ICMS Normal e ST por enquanto.

E espero que os amigos colaborem com sugestões ou ate mesmo implementações.

Eu estou usando como base para calculo do icms o CST do produto.

Abraçcos
_________________
Abraços

Sérgio Guedes
www.lsisistemas.com.br
www.scvarejo.com.br - Projetos para parceiros e desenvolvedores
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
Borland_Linuxer
Moderador
Moderador


Registrado: Terça-Feira, 11 de Outubro de 2005
Mensagens: 4252
Localização: Manaus - Am

MensagemEnviada: Seg Jun 28, 2010 1:28 am    Assunto: Responder com Citação

Citação:
Código da Unit, quem sabe não sai ate um demo num furuto rsrs


abraços

Código:
unit UclKernel_Calcula_Impostos;

interface

uses
  SysUtils, IniFiles, SqlExpr;

type
  TKernel_Calcula_Impostos = class
  private
    FBaseIcms_Nota: currency;
    FValorIcmsST_Nota: currency;
    FReducaoIcmsST_Nota: currency;
    FBaseIcms_Item: currency;
    FValorIcmsST_Item: currency;
    FReducaoIcmsST_Item: currency;
    FValorIcms_Nota: currency;
    FReducaoIcms_Nota: currency;
    FReducaoIcms_Item: currency;
    FBaseIcmsST_Nota: currency;
    FBaseIcmsST_Item: currency;
    FAliquotaIcms_Item: currency;
    FCST_Item: string;
    FDesconto_Item: currency;
    FValorUnitario_Item: currency;
    FQuantidade_Item: currency;
    FValorBruto_Item: currency;
    FValorLiquido_Item: currency;
    FCodigo_Produto_Item: integer;
    FCodigoNF_Nota: integer;
    FSimples_Nacional: Boolean;
    FValorIcms_Item: currency;
  public
    // Dados dos Itens
    property BaseIcms_Item: currency read FBaseIcms_Item write FBaseIcms_Item;
    property ValorIcms_Item: currency read FValorIcms_Item write FValorIcms_Item;
    property BaseIcmsST_Item: currency read FBaseIcmsST_Item write FBaseIcmsST_Item;
    property ValorIcmsST_Item: currency read FValorIcmsST_Item write FValorIcmsST_Item;
    property ReducaoIcms_Item: currency read FReducaoIcms_Item write FReducaoIcms_Item;
    property ReducaoIcmsST_Item: currency read FReducaoIcmsST_Item write FReducaoIcmsST_Item;
    property ValorUnitario_Item: currency read FValorUnitario_Item write FValorUnitario_Item;
    property AliquotaIcms_Item: currency read FAliquotaIcms_Item write FAliquotaIcms_Item;
    property Quantidade_Item: currency read FQuantidade_Item write FQuantidade_Item;
    property Desconto_Item: currency read FDesconto_Item write FDesconto_Item;
    property ValorBruto_Item: currency read FValorBruto_Item write FValorBruto_Item;
    property ValorLiquido_Item: currency read FValorLiquido_Item write FValorLiquido_Item;
    property Codigo_Produto_Item: integer read FCodigo_Produto_Item write FCodigo_Produto_Item;
    property CST_Item: string read FCST_Item write FCST_Item;

    // Dados da Nota
    property BaseIcms_Nota: currency read FBaseIcms_Nota write FBaseIcms_Nota;
    property ValorIcms_Nota: currency read FValorIcms_Nota write FValorIcms_Nota;
    property BaseIcmsST_Nota: currency read FBaseIcmsST_Nota write FBaseIcmsST_Nota;
    property ValorIcmsST_Nota: currency read FValorIcmsST_Nota write FValorIcmsST_Nota;
    property ReducaoIcms_Nota: currency read FReducaoIcms_Nota write FReducaoIcms_Nota;
    property ReducaoIcmsST_Nota: currency read FReducaoIcmsST_Nota write FReducaoIcmsST_Nota;
    property CodigoNF_Nota: integer read FCodigoNF_Nota write FCodigoNF_Nota;

    // Variaveis para Calculo do ICMS
    {Se o cliente for optante pelo simples nacional, o icms e zero}
    property Simples_Nacional: Boolean read FSimples_Nacional write FSimples_Nacional;

    //Nacional - Tributada integralmente
    procedure Calcula_Icms_CST_000();
    { Nacional - Tributada e com cobrança do ICMS por substituição
       tributária}
    procedure Calcula_Icms_CST_010();
    //Nacional - Com redução de base de cálculo
    procedure Calcula_Icms_CST_020();
    {Nacional - Isenta ou não tributada e com cobrança do ICMS por
     substituição tributária   }
    procedure Calcula_Icms_CST_030();
    //Nacional - Isenta
    procedure Calcula_Icms_CST_040();
    //Nacional - Não tributada
    procedure Calcula_Icms_CST_041();
    //Nacional - Suspensão
    procedure Calcula_Icms_CST_050();
    //Nacional - Diferimento
    procedure Calcula_Icms_CST_051();
    //Nacional - ICMS cobrado anteriormente por substituição
    procedure Calcula_Icms_CST_060();
    {Nacional - Com redução de base de cálculo e cobrança do ICMS por
      substituição tributária}
    procedure Calcula_Icms_CST_070();
    //Nacional - Outros
    procedure Calcula_Icms_CST_090();

    procedure Totaliza_Imposto;
    procedure Limpa_Variaveis;

    Constructor Create();
    Destructor Destroy();
  end;


implementation

uses UDBFuncoes, UKernel_DB;

{ TKernel_Calcula_Impostos }

{
  Nacional - Tributada integralmente
  {Neste caso é só mesmo valor do produto com o % de imposto da operação fiscal.
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_000;
begin
  {ICMS Normal }
  BaseIcms_Item := ValorLiquido_Item;
  ValorIcms_Item := (BaseIcms_Item * (AliquotaIcms_Item / 100));
  {ICMS por ST }
  BaseIcmsST_Item := 0;
  ValorIcmsST_Item := 0;
  // Atualiza Total
  Totaliza_Imposto;
end;

{
  Tributada e com cobrança do ICMS por substituição
    tributária
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_010;
begin
  {ICMS Normal }
  BaseIcms_Item :=  ValorLiquido_Item;
  ValorIcms_Item := (BaseIcms_Item  * (AliquotaIcms_Item / 100));
  {ICMS por ST }
  BaseIcmsST_Item := (ValorBruto_Item + (ValorBruto_Item*ReducaoIcmsST_Item/100));
  ValorIcmsST_Item := (BaseIcmsST_Item * (AliquotaIcms_Item / 100));
  // Atualiza Total
  Totaliza_Imposto;
end;

{
  Com redução de base de cálculo
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_020;
begin
  {ICMS Normal }
  BaseIcms_Item :=  (ValorLiquido_Item - (ValorLiquido_Item*ReducaoIcms_Item/100));
  ValorIcms_Item := (BaseIcms_Item  * (AliquotaIcms_Item / 100));
  {ICMS por ST }
  BaseIcmsST_Item := 0;
  ValorIcmsST_Item := 0;

   // Atualiza Total
  Totaliza_Imposto;
end;

{
Isenta ou não tributada e com cobrança do ICMS por
  substituição tributária
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_030;
begin
  {ICMS Normal }
  BaseIcms_Item := 0;
  ValorIcms_Item := 0;
  {ICMS por ST }
  BaseIcmsST_Item := (ValorBruto_Item + (ValorBruto_Item*ReducaoIcmsST_Item/100));
  ValorIcmsST_Item := (BaseIcmsST_Item * (AliquotaIcms_Item / 100));

   // Atualiza Total
  Totaliza_Imposto;
end;

{
Isenta
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_040;
begin
   {ICMS Normal }
  BaseIcms_Item := 0;
  ValorIcms_Item := 0;
  {ICMS por ST }
  BaseIcmsST_Item :=  0;
  ValorIcmsST_Item :=  0;

   // Atualiza Total
  Totaliza_Imposto;
end;

{
Não tributada
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_041;
begin
  {ICMS Normal }
  BaseIcms_Item := 0;
  ValorIcms_Item := 0;
  {ICMS por ST }
  BaseIcmsST_Item :=  0;
  ValorIcmsST_Item :=  0;

   // Atualiza Total
  Totaliza_Imposto;
end;

{
Suspensão
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_050;
begin
  {ICMS Normal }
  BaseIcms_Item := 0;
  ValorIcms_Item := 0;
  {ICMS por ST }
  BaseIcmsST_Item :=  0;
  ValorIcmsST_Item :=  0;

   // Atualiza Total
  Totaliza_Imposto;
end;

{
  Diferimento
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_051;
begin
  {ICMS Normal }
  BaseIcms_Item :=  (ValorLiquido_Item - (ValorLiquido_Item*ReducaoIcms_Item/100));
  ValorIcms_Item := (BaseIcms_Item  * (AliquotaIcms_Item / 100));
  {ICMS por ST }
  BaseIcmsST_Item := 0;
  ValorIcmsST_Item := 0;

   // Atualiza Total
  Totaliza_Imposto;
end;

{
  ICMS cobrado anteriormente por substituição tributária
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_060;
begin
  {ICMS Normal }
  BaseIcms_Item := 0;
  ValorIcms_Item := 0;
  {ICMS por ST }
  BaseIcmsST_Item := (ValorBruto_Item + (ValorBruto_Item*ReducaoIcmsST_Item/100));
  ValorIcmsST_Item := (BaseIcmsST_Item * (AliquotaIcms_Item / 100));

   // Atualiza Total
  Totaliza_Imposto;
end;

{
  Com redução de base de cálculo e cobrança do ICMS por substituição tributária
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_070;
begin
  {ICMS Normal }
  BaseIcms_Item :=  (ValorLiquido_Item - (ValorLiquido_Item*ReducaoIcms_Item/100));
  ValorIcms_Item := (BaseIcms_Item  * (AliquotaIcms_Item / 100));
  {ICMS por ST }
  BaseIcmsST_Item := (ValorBruto_Item + (ValorBruto_Item*ReducaoIcmsST_Item/100));
  ValorIcmsST_Item := (BaseIcmsST_Item * (AliquotaIcms_Item / 100));
  // Atualiza Total
  Totaliza_Imposto;
end;

{
  Outras
}
procedure TKernel_Calcula_Impostos.Calcula_Icms_CST_090;
begin
  {ICMS Normal }
  BaseIcms_Item :=  (ValorLiquido_Item - (ValorLiquido_Item*ReducaoIcms_Item/100));
  ValorIcms_Item := (BaseIcms_Item  * (AliquotaIcms_Item / 100));
  {ICMS por ST }
  BaseIcmsST_Item := (ValorBruto_Item + (ValorBruto_Item*ReducaoIcmsST_Item/100));
  ValorIcmsST_Item := (BaseIcmsST_Item * (AliquotaIcms_Item / 100));
  // Atualiza Total
  Totaliza_Imposto;
end;

constructor TKernel_Calcula_Impostos.Create;
begin
  Limpa_Variaveis;
end;

destructor TKernel_Calcula_Impostos.Destroy;
begin

end;


procedure TKernel_Calcula_Impostos.Limpa_Variaveis;
begin
  BaseIcms_Item := 0;
  ValorIcms_Item := 0;
  BaseIcms_Nota := 0;
  BaseIcms_Nota := 0;

  Codigo_Produto_Item := 0;
  CST_Item := '000';
  AliquotaIcms_Item := 0;
  Quantidade_Item := 0;
  Desconto_Item := 0;
  ValorUnitario_Item := 0;
  ValorBruto_Item := 0;
  ValorLiquido_Item := 0;
  // Redução de icms do item
  ReducaoIcms_Item := 0;
  ReducaoIcmsST_Item := 0;
end;

procedure TKernel_Calcula_Impostos.Totaliza_Imposto;
begin
  // Grava no produto Impostos referentes ao icms normal
  GravaImpostoItem(BaseIcms_Item , ValorIcms_Item, BaseIcmsST_Item,
   ValorIcmsST_Item,Codigo_Produto_Item,  CodigoNF_Nota );

  // Atualiza a nota
  GravaImpostoNota(BaseIcms_Nota,ValorIcms_Nota, BaseIcmsST_Nota,
   ValorIcmsST_Nota, CodigoNF_Nota );

  // Total ICMS Normal
  BaseIcms_Nota := BaseIcms_Nota + BaseIcms_Item;
  ValorIcms_Nota := ValorIcms_Nota  + ValorIcms_Item;

  // Total ICMS por ST
  BaseIcmsST_Nota := BaseIcmsST_Nota + BaseIcmsST_Item;
  ValorIcmsST_Nota := ValorIcmsST_Nota  + ValorIcmsST_Item;
end;

end.

_________________
Abraços

Sérgio Guedes
www.lsisistemas.com.br
www.scvarejo.com.br - Projetos para parceiros e desenvolvedores
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
Borland_Linuxer
Moderador
Moderador


Registrado: Terça-Feira, 11 de Outubro de 2005
Mensagens: 4252
Localização: Manaus - Am

MensagemEnviada: Seg Jun 28, 2010 1:30 am    Assunto: Responder com Citação

Exemplo de uso dessa classe.

Código:

 // venda para dentro do estado, utiliza calculo de reducao base calculo
    if Kernel_Consulta_Inteiro('EMPRESA','CODESTADO','WHERE CODEMP='+ IntToStr(Kernel_Terminal.int_filial)) =
    Kernel_Consulta_Inteiro('CLIENTE','CODESTADO','WHERE CODCLI='+ IntToStr(cdsCadBaseCODCLI.asinteger)) then
    begin
      Kernel_Calcula_Impostos.Limpa_Variaveis;

      // Lista todos os itens da Nota fiscal
      cdsLstItensPedido.close;
      cdsLstItensPedido.Params[0].AsInteger := cdsCadBaseCODMOV.asinteger;
      cdsLstItensPedido.Open;

      if not cdsLstItensPedido.IsEmpty then
      begin
        while not cdsLstItensPedido.Eof do
        begin
          Kernel_Calcula_Impostos.Codigo_Produto_Item := cdsLstItensPedidoCODPROD.AsInteger;
          Kernel_Calcula_Impostos.CodigoNF_Nota := cdsCadBaseCODMOV.AsInteger;
          Kernel_Calcula_Impostos.CST_Item := cdsLstItensPedidoCST.AsString;
          Kernel_Calcula_Impostos.AliquotaIcms_Item := cdsLstItensPedidoICMSMOV.AsCurrency;
          Kernel_Calcula_Impostos.Quantidade_Item := cdsLstItensPedidoQTDMOV.AsFloat;
          Kernel_Calcula_Impostos.Desconto_Item := cdsLstItensPedidoVLDESCMOV.AsFloat;
          Kernel_Calcula_Impostos.ValorUnitario_Item := cdsLstItensPedidoPRVENDAMOV.AsFloat;
          Kernel_Calcula_Impostos.ValorBruto_Item := cdsLstItensPedidoVALORBRUTOITM.AsFloat;
          Kernel_Calcula_Impostos.ValorLiquido_Item := cdsLstItensPedidoSUBTOTALMOV.AsFloat;
          // Redução de icms do item
          Kernel_Calcula_Impostos.ReducaoIcms_Item := cdsLstItensPedidoREDUCAOICMS.AsCurrency;
          Kernel_Calcula_Impostos.ReducaoIcmsST_Item := cdsLstItensPedidoREDUCAOICMSST.AsCurrency;

          case AnsiIndexStr(UpperCase(Kernel_Calcula_Impostos.CST_Item),
            ['000', '010','020','030','040','041','050','051','060','070','090']) of
            0 : Kernel_Calcula_Impostos.Calcula_Icms_CST_000;
            1 : Kernel_Calcula_Impostos.Calcula_Icms_CST_010;
            2 : Kernel_Calcula_Impostos.Calcula_Icms_CST_020;
            3 : Kernel_Calcula_Impostos.Calcula_Icms_CST_030;
            4 : Kernel_Calcula_Impostos.Calcula_Icms_CST_040;
            5 : Kernel_Calcula_Impostos.Calcula_Icms_CST_041;
            6 : Kernel_Calcula_Impostos.Calcula_Icms_CST_050;
            7 : Kernel_Calcula_Impostos.Calcula_Icms_CST_051;
            8 : Kernel_Calcula_Impostos.Calcula_Icms_CST_060;
            9 : Kernel_Calcula_Impostos.Calcula_Icms_CST_070;
            10 : Kernel_Calcula_Impostos.Calcula_Icms_CST_090;
          end;

          cdsLstItensPedido.Next;// proximo produto
        end;
      end;
    end
   else // venda para fora do estado, simplismente calcula o icms fora do estado
    begin

      cdsLstItensPedido.Next;// proximo produto
    end;

    // Preenche os campos valor base calculo e valor icms da tela ...............
    if Kernel_Consulta_string('EMPRESA','OPTANTE_SIMPLES','WHERE CODEMP='+ IntToStr(Kernel_Terminal.int_filial)) = 'T' then
    begin
      cdsCadBaseBASE_ICMS.AsCurrency := 0;
      cdsCadBaseVALOR_ICMS.AsCurrency := 0;

      cdsCadBaseBASE_ICMSST.AsCurrency := 0;
      cdsCadBaseVALOR_ICMSST.AsCurrency := 0;
    end
   else
    begin
      cdsCadBaseBASE_ICMS.AsCurrency := Kernel_Calcula_Impostos.BaseIcms_Nota;
      cdsCadBaseVALOR_ICMS.AsCurrency := Kernel_Calcula_Impostos.ValorIcms_Nota;

      cdsCadBaseBASE_ICMSST.AsCurrency := Kernel_Calcula_Impostos.BaseIcmsST_Nota;
      cdsCadBaseVALOR_ICMSST.AsCurrency := Kernel_Calcula_Impostos.ValorIcmsST_Nota;
    end;


Espero a sugestão de todos.

abraços
_________________
Abraços

Sérgio Guedes
www.lsisistemas.com.br
www.scvarejo.com.br - Projetos para parceiros e desenvolvedores
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
flexsystems
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2007
Mensagens: 234
Localização: Caxias do Sul

MensagemEnviada: Sex Set 17, 2010 7:48 am    Assunto: Responder com Citação

Dae pessoal,
seguindo a idéia do fiz uma classe e coloquei o meu conhecimento e o conhecimento que vc passou aqui nesse tópico. Espero que ajude ao pessoal. Gostaria de ver o pessoal interagindo nessa classe para quem sabe que ela seja colocada no ACBR. Não sem como fazer isso então se alguém souber esteja a vontade.

obrigado!

Código:

unit UClsCalcNF;

interface

uses
  contnrs,
  Classes;

const
        //                                AC AL AM AP BA CE DF ES GO MA MT MS MG PA PB PR PE PI RN RS RJ RO RR SC SP SE TO

  cAliquotaAC: array[0..26] of Integer = (17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaAL: array[0..26] of Integer = (12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaAM: array[0..26] of Integer = (12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaAP: array[0..26] of Integer = (12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaBA: array[0..26] of Integer = (12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaCE: array[0..26] of Integer = (12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaDF: array[0..26] of Integer = (12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaES: array[0..26] of Integer = (12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaGO: array[0..26] of Integer = (12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaMA: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaMT: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaMS: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaMG: array[0..26] of Integer = (07,07,07,07,07,07,07,07,07,07,07,07,18,07,07,12,07,07,07,12,12,07,07,12,12,07,07);
  cAliquotaPA: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaPB: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12,12,12);
  cAliquotaPR: array[0..26] of Integer = (07,07,07,07,07,07,07,07,07,07,07,07,12,07,07,18,07,07,07,12,12,07,07,12,12,07,07);
  cAliquotaPE: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12,12);
  cAliquotaPI: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12,12);
  cAliquotaRN: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,17,12,12,12,12,12,12,12,12);
  cAliquotaRS: array[0..26] of Integer = (07,07,07,07,07,07,07,07,07,07,07,07,12,07,07,12,07,07,07,17,12,07,07,12,12,07,07);
  cAliquotaRJ: array[0..26] of Integer = (07,07,07,07,07,07,07,07,07,07,07,07,12,07,07,12,07,07,07,12,18,07,07,12,12,07,07);
  cAliquotaRO: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,17,12,12,12,12,12);
  cAliquotaRR: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,17,12,12,12,12);
  cAliquotaSC: array[0..26] of Integer = (07,07,07,07,07,07,07,07,07,07,07,07,12,07,07,12,07,07,07,12,12,07,07,17,12,07,07);
  cAliquotaSP: array[0..26] of Integer = (07,07,07,07,07,07,07,07,07,07,07,07,12,07,07,12,07,07,07,12,12,07,07,12,18,07,07);
  cAliquotaSE: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,17,12);
  cAliquotaTO: array[0..26] of Integer = (12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,17);

type
  TClassTributaria = (
    cst00, // Tributada integralmente
    cst10, // Tributada e com cobrança do ICMS por substituição tributária
    cst20, // Com redução de base de cálculo
    cst30, // Isenta ou não tributada e com cobrança do ICMS por substituição tributária
    cst40, // Isenta
    cst41, // Não tributada
    cst50, // Suspensão
    cst51, // Diferimento
    cst60, // ICMS cobrado anteriormente por substituição tributária
    cst70, // Com redução de base de cálculo e cobrança do ICMS por substituição tributária
    cst90  // Outras
    );

  TNotaFiscal = class;
 
  TEstados = class
  private
    {private declarations}
  protected
    {protected declarations}
  public
    {public declarations}
    class function CodEstado(const pEstado: String): SmallInt;
    class function CodIBGEEstado(const pEstado: String): SmallInt;
    class function AliquotaInterEstadual(const pEstadoOrigem: String; const pEstadoDestino: String): Double; overload;
    class function AliquotaInterEstadual(const pEstadoOrigem: String): Double; overload;
  end;

  TPessoaFisJur = class(TComponent)
  private
    {private declarations}
    FNomeRazaoSocial: String;
    FEstado: String;
  protected
    {protected declarations}
  public
    {public declarations}
    constructor Create(AOwner: TComponent); override;
    procedure Assign(const pPessoaFisJur: TPessoaFisJur); reintroduce;
    procedure Inicializar;

    property NomeRazaoSocial: String read FNomeRazaoSocial write FNomeRazaoSocial;
    property Estado: String read FEstado write FEstado;
  end;

  TDuplicataNF = class(TComponent)
  private
    {private declarations}
  protected
    {protected declarations}
  public
    {public declarations}
    constructor Create(AOwner: TComponent); override;

    procedure Assign(const pDuplicataNF: TDuplicataNF); reintroduce;
    procedure Inicializar; virtual;
  end;

  TDuplicatasNF = class(TObjectList)
  protected
    {protected declarations}
    function GetDuplicataNF(Index: Integer): TDuplicataNF;
    procedure SetDuplicataNF(Index: Integer; ADuplicataNF: TDuplicataNF);
  public
    {public declarations}
    function Add(ANotaFiscal: TNotaFiscal; ADuplicataNF: TDuplicataNF): Integer;
    function Remove(ADuplicataNF: TDuplicataNF): Integer;
    function IndexOf(ADuplicataNF: TDuplicataNF): Integer;
    procedure Insert(Index: Integer; ADuplicataNF: TDuplicataNF);
    property Items[Index: Integer]: TDuplicataNF read GetDuplicataNF write SetDuplicataNF; default;
  end;

  TItemNF = class(TComponent)
  private
    {private declarations}
    FCodProduto: String;
    FValorUnitario: Currency;
    FValorDesconto: Currency;
    FQuantidade: Double;
    FDescProduto: String;
    FItem: Integer;
    FClassFiscal: String;
    FAliqIPI: Double;
    FAliqMVA: Double;
    FPeso: Double;
    FClassTributaria: TClassTributaria;
    FReducaoICMS: Double;
    procedure SetCodProduto(const Value: String);
    procedure SetDescProduto(const Value: String);
    procedure SetQuantidade(const Value: Double);
    procedure SetValorDesconto(const Value: Currency);
    procedure SetValorUnitario(const Value: Currency);
    procedure SetItem(const Value: Integer);
    procedure SetClassFiscal(const Value: String);
    procedure SetAliqIPI(const Value: Double);
    procedure SetAliqMVA(const Value: Double);
    procedure SetPeso(const Value: Double);
    procedure SetClassTributaria(const Value: TClassTributaria);
    procedure SetReducaoICMS(const Value: Double);

    function GetBC_ICMS_ST: Currency;
    function GetBC_ICMS_OP: Currency;
    function GetBC_IPI: Currency;

    function GetVL_DESPAC_PROP: Currency;
    function GetVL_FRETE_PROP: Currency;
    function GetVL_SEGUR_PROP: Currency;

    function GetPC_PROP_NF: Double;

    function GetVL_TOTAL_BRT: Currency;
    function GetVL_ICMS_OP: Currency;
    function GetVL_IPI: Currency;
    function GetVL_MVA: Currency;
    function GetVL_ICMS_ST: Currency;
    function GetVL_TOTAL_LIQ: Currency;
  protected
    {protected declarations}
    function NotaFiscal: TNotaFiscal;
  public
    {public declarations}
    constructor Create(AOwner: TComponent); override;

    procedure Assign(const pItemNF: TItemNF); reintroduce;
    procedure Inicializar; virtual;

    property Item: Integer read FItem write SetItem;
    property CodProduto: String read FCodProduto write SetCodProduto;
    property DescProduto: String read FDescProduto write SetDescProduto;
    property Quantidade: Double read FQuantidade write SetQuantidade;
    property ValorUnitario: Currency read FValorUnitario write SetValorUnitario;
    property ValorDesconto: Currency read FValorDesconto write SetValorDesconto;
    property ClassFiscal: String read FClassFiscal write SetClassFiscal;
    property AliqIPI: Double read FAliqIPI write SetAliqIPI;
    property AliqMVA: Double read FAliqMVA write SetAliqMVA;
    property Peso: Double read FPeso write SetPeso;
    property ClassTributaria: TClassTributaria read FClassTributaria write SetClassTributaria;
    property ReducaoICMS: Double read FReducaoICMS write SetReducaoICMS;

    property VL_TOTAL_LIQ: Currency read GetVL_TOTAL_LIQ;
    property VL_TOTAL_BRT: Currency read GetVL_TOTAL_BRT;
    property BC_ICMS_OP: Currency read GetBC_ICMS_OP;
    property BC_ICMS_ST: Currency read GetBC_ICMS_ST;
    property VL_ICMS_OP: Currency read GetVL_ICMS_OP;
    property VL_ICMS_ST: Currency read GetVL_ICMS_ST;
    property BC_IPI: Currency read GetBC_IPI;
    property VL_IPI: Currency read GetVL_IPI;
    property VL_FRETE_PROP: Currency read GetVL_FRETE_PROP;
    property VL_SEGUR_PROP: Currency read GetVL_SEGUR_PROP;
    property VL_DESPAC_PROP: Currency read GetVL_DESPAC_PROP;
    property PC_PROP_NF: Double read GetPC_PROP_NF;
    property VL_MVA: Currency read GetVL_MVA;
  end;

  TEmitenteNF = class(TPessoaFisJur)
  private
    {private declarations}
  protected
    {protected declarations}
  public
    {public declarations}
  end;

  TDestinatarioNF = class(TPessoaFisJur)
  private
    {private declarations}
  protected
    {protected declarations}
  public
    {public declarations}
  end;

  TTransporteNF = class(TPessoaFisJur)
  private
    {private declarations}
  protected
    {protected declarations}
  public
    {public declarations}
  end;

  TItensNF = class(TObjectList)
  protected
    {protected declarations}
    function GetItemNF(Index: Integer): TItemNF;
    procedure SetItemNF(Index: Integer; AItemNF: TItemNF);
  public
    {public declarations}
    function Add(ANotaFiscal: TNotaFiscal; AItemNF: TItemNF): Integer;
    function Remove(AItemNF: TItemNF): Integer;
    function IndexOf(AItemNF: TItemNF): Integer;
    procedure Insert(Index: Integer; AItemNF: TItemNF);
    property Items[Index: Integer]: TItemNF read GetItemNF write SetItemNF; default;
  end;

  TValoresNF = class(TComponent)
  private
    {private declarations}
    FVL_SEGURO: Currency;
    FVL_FRETE: Currency;
    FVL_DESPACESS: Currency;
    function GetVL_TOTAL_PROD: Currency;
    function GetVL_TOTAL_NF: Currency;
    function GetBS_ICMS: Currency;
    function GetVL_ICMS: Currency;
    function GetBS_ICMS_ST: Currency;
    function GetVL_ICMS_ST: Currency;
  protected
    {protected declarations}
    function NotaFiscal: TNotaFiscal;
  public
    {public declarations}
    constructor Create(AOwner: TComponent); override;

    procedure Assign(const pValoresNF: TValoresNF); reintroduce;
    procedure Inicializar; virtual;

    property VL_FRETE: Currency read FVL_FRETE write FVL_FRETE;
    property VL_SEGURO: Currency read FVL_SEGURO write FVL_SEGURO;
    property VL_DESPACESS: Currency read FVL_DESPACESS write FVL_DESPACESS;
    property VL_TOTAL_PROD: Currency read GetVL_TOTAL_PROD;
    property VL_TOTAL_NF: Currency read GetVL_TOTAL_NF;
    property BS_ICMS: Currency read GetBS_ICMS;
    property VL_ICMS: Currency read GetVL_ICMS;
    property BS_ICMS_ST: Currency read GetBS_ICMS_ST;
    property VL_ICMS_ST: Currency read GetVL_ICMS_ST;
  end;

  TNotaFiscal = class(TComponent)
  private
    {private declarations}
    FItensNF: TItensNF;
    FDuplicatasNF: TDuplicatasNF;
    FDestinatarioNF: TDestinatarioNF;
    FEmitenteNF: TEmitenteNF;
    FTransporteNF: TTransporteNF;
    FValoresNF: TValoresNF;
    FObservacoes: TStrings;
    procedure SetObservacoes(const Value: TStrings);
    function GetPeso: Double;
    function GetNroItens: Integer;
  public
    {public declarations}
    constructor Create(AOwner: TComponent); override;
    procedure Inicializar;

    property EmitenteNF: TEmitenteNF read FEmitenteNF write FEmitenteNF;
    property DestinatarioNF: TDestinatarioNF read FDestinatarioNF write FDestinatarioNF;
    property TransporteNF: TTransporteNF read FTransporteNF write FTransporteNF;
    property ItensNF: TItensNF read FItensNF write FItensNF;
    property DuplicatasNF: TDuplicatasNF read FDuplicatasNF write FDuplicatasNF;
    property ValoresNF: TValoresNF read FValoresNF write FValoresNF;
    property Observacoes: TStrings read FObservacoes write SetObservacoes;
    property Peso: Double read GetPeso;
    property NroItens: Integer read GetNroItens;
  end;

  TFuncoes = class
    class function Percentual(const pPercentual: Double; const pValor: Currency): Currency;
    class function RetornaPercentual(const pValorTotal: Currency; const pValor: Currency): Currency;
  end;

implementation

uses
  dialogs,
  SysUtils;

{ TNotaFiscal }


constructor TNotaFiscal.Create(AOwner: TComponent);
begin
  inherited;
  FObservacoes := TStringList.Create;
  ItensNF := TItensNF.Create;
  DuplicatasNF := TDuplicatasNF.Create;
  EmitenteNF := TEmitenteNF.Create(Self);
  DestinatarioNF := TDestinatarioNF.Create(Self);
  TransporteNF := TTransporteNF.Create(Self);
  ValoresNF := TValoresNF.Create(Self);
end;

function TNotaFiscal.GetNroItens: Integer;
begin
  Result := FItensNF.Count;
end;

function TNotaFiscal.GetPeso: Double;
var
  lItens: SmallInt;
begin
  Result := 0;

  for lItens := 0 to ItensNF.Count -1 do
    Result := Result + ItensNF[lItens].Peso;
end;

procedure TNotaFiscal.Inicializar;
begin
  EmitenteNF.Inicializar;
  DestinatarioNF.Inicializar;
  TransporteNF.Inicializar;
  ValoresNF.Inicializar;
  ItensNF.Clear;
  DuplicatasNF.Clear;
  Observacoes.Clear;
end;

procedure TNotaFiscal.SetObservacoes(const Value: TStrings);
begin
  FObservacoes := Value;
end;

{ TItensNF }

function TItensNF.Add(ANotaFiscal: TNotaFiscal; AItemNF: TItemNF): Integer;
var
  lNovoItemNF: TItemNF;
begin
  lNovoItemNF := TItemNF.Create(ANotaFiscal);
  lNovoItemNF.Assign(AItemNF);
  Result := inherited Add(lNovoItemNF);
end;

function TItensNF.GetItemNF(Index: Integer): TItemNF;
begin
  Result := inherited Items[Index] as TItemNF;
end;

function TItensNF.IndexOf(AItemNF: TItemNF): Integer;
begin
  Result := inherited IndexOf(AItemNF);
end;

procedure TItensNF.Insert(Index: Integer; AItemNF: TItemNF);
begin
  inherited Insert(Index, AItemNF);
end;

function TItensNF.Remove(AItemNF: TItemNF): Integer;
begin
  Result := inherited Remove(AItemNF);
end;

procedure TItensNF.SetItemNF(Index: Integer; AItemNF: TItemNF);
begin
  Items[Index] := AItemNF;
end;

{ TDuplicatasNF }

function TDuplicatasNF.Add(ANotaFiscal: TNotaFiscal; ADuplicataNF: TDuplicataNF): Integer;
var
  lNovaDuplicataNF: TDuplicataNF;
begin
  lNovaDuplicataNF := TDuplicataNF.Create(ANotaFiscal);
  lNovaDuplicataNF.Assign(ADuplicataNF);
  Result := inherited Add(lNovaDuplicataNF);
end;

function TDuplicatasNF.GetDuplicataNF(Index: Integer): TDuplicataNF;
begin
  Result := inherited Items[Index] as TDuplicataNF;
end;

function TDuplicatasNF.IndexOf(ADuplicataNF: TDuplicataNF): Integer;
begin
  Result := inherited IndexOf(ADuplicataNF);
end;

procedure TDuplicatasNF.Insert(Index: Integer; ADuplicataNF: TDuplicataNF);
begin
  inherited Insert(Index, ADuplicataNF);
end;

function TDuplicatasNF.Remove(ADuplicataNF: TDuplicataNF): Integer;
begin
  Result := inherited Remove(ADuplicataNF);
end;

procedure TDuplicatasNF.SetDuplicataNF(Index: Integer; ADuplicataNF: TDuplicataNF);
begin
  Items[Index] := ADuplicataNF;
end;

{ TItemNF }

procedure TItemNF.Assign(const pItemNF: TItemNF);
begin
  Inicializar;

  CodProduto := pItemNF.CodProduto;
  ValorUnitario := pItemNF.ValorUnitario;
  ValorDesconto := pItemNF.ValorDesconto;
  Quantidade := pItemNF.Quantidade;
  DescProduto := pItemNF.DescProduto;
  Item := pItemNF.Item;
  ClassFiscal := pItemNF.ClassFiscal;
  AliqIPI := pItemNF.AliqIPI;
  AliqMVA := pItemNF.AliqMVA;
  Peso := pItemNF.Peso;
  ClassTributaria := pItemNF.ClassTributaria;
  ReducaoICMS := pItemNF.ReducaoICMS;
end;

constructor TItemNF.Create(AOwner: TComponent);
begin
  inherited;
  Inicializar;
end;

function TItemNF.GetBC_ICMS_OP: Currency;
begin
  if ClassTributaria in [cst30, cst40, cst41, cst50, cst60] then
    Result := 0
  else
  begin
    Result := VL_TOTAL_BRT + VL_FRETE_PROP + VL_SEGUR_PROP + VL_DESPAC_PROP;

    if ClassTributaria in [cst20, cst51, cst70, cst90] then
      Result := (Result - TFuncoes.Percentual(ReducaoICMS, Result));
  end;
end;

function TItemNF.GetBC_ICMS_ST: Currency;
begin
  if ClassTributaria in [cst00, cst20, cst40, cst41, cst50, cst51] then
    Result := 0
  else
    Result := VL_TOTAL_BRT + VL_FRETE_PROP + VL_SEGUR_PROP + VL_DESPAC_PROP + VL_IPI + VL_MVA;
end;

function TItemNF.GetBC_IPI: Currency;
begin
  Result := VL_TOTAL_BRT + VL_FRETE_PROP + VL_SEGUR_PROP + VL_DESPAC_PROP;
end;

function TItemNF.GetPC_PROP_NF: Double;
var
  lPart: Double;
begin
  Result := 100;

  if NotaFiscal.NroItens > 1 then
  begin
    lPart := TFuncoes.RetornaPercentual(NotaFiscal.ValoresNF.VL_TOTAL_PROD, VL_TOTAL_BRT);
    Result := TFuncoes.Percentual(lPart, Result);
  end;
end;

function TItemNF.GetVL_IPI: Currency;
begin
  Result := TFuncoes.Percentual(AliqIPI, BC_IPI);
end;

function TItemNF.GetVL_MVA: Currency;
begin
  Result := VL_TOTAL_BRT + VL_FRETE_PROP + VL_SEGUR_PROP + VL_DESPAC_PROP + VL_IPI;
  Result := TFuncoes.Percentual(AliqMVA, Result);
end;

function TItemNF.GetVL_DESPAC_PROP: Currency;
begin
  Result := TFuncoes.Percentual(PC_PROP_NF, NotaFiscal.ValoresNF.VL_DESPACESS);
end;

function TItemNF.GetVL_FRETE_PROP: Currency;
begin
  Result := TFuncoes.Percentual(PC_PROP_NF, NotaFiscal.ValoresNF.VL_FRETE);
end;

function TItemNF.GetVL_SEGUR_PROP: Currency;
begin
  Result := TFuncoes.Percentual(PC_PROP_NF, NotaFiscal.ValoresNF.VL_SEGURO);
end;

function TItemNF.GetVL_TOTAL_BRT: Currency;
begin
  Result := Quantidade * ValorUnitario;
end;

function TItemNF.GetVL_ICMS_OP: Currency;
var
  lAliq: Double;
begin
  if ClassTributaria in [cst30, cst40, cst41, cst50, cst60] then
    Result := 0
  else
  begin
    lAliq := TEstados.AliquotaInterEstadual(NotaFiscal.EmitenteNF.Estado, NotaFiscal.DestinatarioNF.Estado);
    Result := TFuncoes.Percentual(lAliq, BC_ICMS_OP);
  end;
end;

procedure TItemNF.Inicializar;
begin
  Item := 0;
  CodProduto := EmptyStr;
  DescProduto := EmptyStr;
  Quantidade := 0;
  ValorUnitario := 0;
  ValorDesconto := 0;
  ClassFiscal := EmptyStr;
  AliqIPI := 0;
  Peso := 0;
  AliqMVA := 0;
  ClassTributaria := cst00;
end;

function TItemNF.NotaFiscal: TNotaFiscal;
begin
  Result := (Owner as TNotaFiscal);
end;

procedure TItemNF.SetAliqIPI(const Value: Double);
begin
  FAliqIPI := Value;
end;

procedure TItemNF.SetAliqMVA(const Value: Double);
begin
  FAliqMVA := Value;
end;

procedure TItemNF.SetClassFiscal(const Value: String);
begin
  FClassFiscal := Value;
end;

procedure TItemNF.SetCodProduto(const Value: String);
begin
  FCodProduto := Value;
end;

procedure TItemNF.SetDescProduto(const Value: String);
begin
  FDescProduto := Value;
end;

procedure TItemNF.SetItem(const Value: Integer);
begin
  FItem := Value;
end;

procedure TItemNF.SetPeso(const Value: Double);
begin
  FPeso := Value;
end;

procedure TItemNF.SetQuantidade(const Value: Double);
begin
  FQuantidade := Value;
end;

procedure TItemNF.SetValorDesconto(const Value: Currency);
begin
  FValorDesconto := Value;
end;

procedure TItemNF.SetValorUnitario(const Value: Currency);
begin
  FValorUnitario := Value;
end;

function TItemNF.GetVL_ICMS_ST: Currency;
var
  lAliq: Double;
begin
  if ClassTributaria in [cst00, cst20, cst40, cst41, cst50, cst51] then
    Result := 0
  else
  begin
    lAliq := TEstados.AliquotaInterEstadual(NotaFiscal.EmitenteNF.Estado);
    Result := TFuncoes.Percentual(lAliq, BC_ICMS_ST);
    Result := Result - VL_ICMS_OP;
  end;
end;

function TItemNF.GetVL_TOTAL_LIQ: Currency;
begin
  Result := VL_TOTAL_BRT + VL_IPI + VL_FRETE_PROP + VL_SEGUR_PROP + VL_DESPAC_PROP + VL_ICMS_ST;
end;

procedure TItemNF.SetClassTributaria(const Value: TClassTributaria);
begin
  FClassTributaria := Value;
end;

procedure TItemNF.SetReducaoICMS(const Value: Double);
begin
  FReducaoICMS := Value;
end;

{ TDuplicataNF }

procedure TDuplicataNF.Assign(const pDuplicataNF: TDuplicataNF);
begin

end;

constructor TDuplicataNF.Create(AOwner: TComponent);
begin
  inherited;
  Inicializar;
end;

procedure TDuplicataNF.Inicializar;
begin

end;

{ TPessoaFisJur }

procedure TPessoaFisJur.Assign(const pPessoaFisJur: TPessoaFisJur);
begin
  Inicializar;
  NomeRazaoSocial := pPessoaFisJur.NomeRazaoSocial;
  Estado := pPessoaFisJur.Estado;
end;

constructor TPessoaFisJur.Create(AOwner: TComponent);
begin
  inherited;
  Inicializar;
end;

procedure TPessoaFisJur.Inicializar;
begin
  NomeRazaoSocial := EmptyStr;
  Estado := EmptyStr;
end;

{ TValoresNF }

procedure TValoresNF.Assign(const pValoresNF: TValoresNF);
begin

end;

constructor TValoresNF.Create(AOwner: TComponent);
begin
  inherited;
  Inicializar;
end;

function TValoresNF.GetBS_ICMS: Currency;
var
  lItens: SmallInt;
begin
  Result := 0;

  for lItens := 0 to NotaFiscal.ItensNF.Count -1 do
    Result := Result + NotaFiscal.ItensNF[lItens].BC_ICMS_OP;
end;

function TValoresNF.GetVL_TOTAL_NF: Currency;
var
  lItens: SmallInt;
begin
  Result := 0;

  for lItens := 0 to NotaFiscal.ItensNF.Count -1 do
    Result := Result + NotaFiscal.ItensNF[lItens].VL_TOTAL_LIQ;
end;

function TValoresNF.GetVL_TOTAL_PROD: Currency;
var
  lItens: SmallInt;
begin
  Result := 0;

  for lItens := 0 to NotaFiscal.ItensNF.Count -1 do
    Result := Result + NotaFiscal.ItensNF[lItens].VL_TOTAL_BRT;
end;

function TValoresNF.GetVL_ICMS: Currency;
var
  lItens: SmallInt;
begin
  Result := 0;

  for lItens := 0 to NotaFiscal.ItensNF.Count -1 do
    Result := Result + NotaFiscal.ItensNF[lItens].VL_ICMS_OP;
end;

procedure TValoresNF.Inicializar;
begin
  VL_FRETE := 0;
  VL_SEGURO := 0;
  VL_DESPACESS := 0;
end;

function TValoresNF.NotaFiscal: TNotaFiscal;
begin
  Result := (Owner as TNotaFiscal);
end;

function TValoresNF.GetBS_ICMS_ST: Currency;
var
  lItens: SmallInt;
begin
  Result := 0;

  for lItens := 0 to NotaFiscal.ItensNF.Count -1 do
    Result := Result + NotaFiscal.ItensNF[lItens].BC_ICMS_ST;
end;

function TValoresNF.GetVL_ICMS_ST: Currency;
var
  lItens: SmallInt;
begin
  Result := 0;

  for lItens := 0 to NotaFiscal.ItensNF.Count -1 do
    Result := Result + NotaFiscal.ItensNF[lItens].VL_ICMS_ST;
end;

{ TEstados }

class function TEstados.AliquotaInterEstadual(const pEstadoOrigem, pEstadoDestino: String): Double;
var
  lEstadoDestino: SmallInt;
begin
  lEstadoDestino := TEstados.CodEstado(pEstadoDestino);

  if pEstadoOrigem = 'AC' then Result := cAliquotaAC[lEstadoDestino] else
  if pEstadoOrigem = 'AL' then Result := cAliquotaAL[lEstadoDestino] else
  if pEstadoOrigem = 'AM' then Result := cAliquotaAM[lEstadoDestino] else
  if pEstadoOrigem = 'AP' then Result := cAliquotaAP[lEstadoDestino] else
  if pEstadoOrigem = 'BA' then Result := cAliquotaBA[lEstadoDestino] else
  if pEstadoOrigem = 'CE' then Result := cAliquotaCE[lEstadoDestino] else
  if pEstadoOrigem = 'DF' then Result := cAliquotaDF[lEstadoDestino] else
  if pEstadoOrigem = 'ES' then Result := cAliquotaES[lEstadoDestino] else
  if pEstadoOrigem = 'GO' then Result := cAliquotaGO[lEstadoDestino] else
  if pEstadoOrigem = 'MA' then Result := cAliquotaMA[lEstadoDestino] else
  if pEstadoOrigem = 'MT' then Result := cAliquotaMT[lEstadoDestino] else
  if pEstadoOrigem = 'MS' then Result := cAliquotaMS[lEstadoDestino] else
  if pEstadoOrigem = 'MG' then Result := cAliquotaMG[lEstadoDestino] else
  if pEstadoOrigem = 'PA' then Result := cAliquotaPA[lEstadoDestino] else
  if pEstadoOrigem = 'PB' then Result := cAliquotaPB[lEstadoDestino] else
  if pEstadoOrigem = 'PR' then Result := cAliquotaPR[lEstadoDestino] else
  if pEstadoOrigem = 'PE' then Result := cAliquotaPE[lEstadoDestino] else
  if pEstadoOrigem = 'PI' then Result := cAliquotaPI[lEstadoDestino] else
  if pEstadoOrigem = 'RN' then Result := cAliquotaRN[lEstadoDestino] else
  if pEstadoOrigem = 'RS' then Result := cAliquotaRS[lEstadoDestino] else
  if pEstadoOrigem = 'RJ' then Result := cAliquotaRJ[lEstadoDestino] else
  if pEstadoOrigem = 'RO' then Result := cAliquotaRO[lEstadoDestino] else
  if pEstadoOrigem = 'RR' then Result := cAliquotaRR[lEstadoDestino] else
  if pEstadoOrigem = 'SC' then Result := cAliquotaSC[lEstadoDestino] else
  if pEstadoOrigem = 'SP' then Result := cAliquotaSP[lEstadoDestino] else
  if pEstadoOrigem = 'SE' then Result := cAliquotaSE[lEstadoDestino] else
  if pEstadoOrigem = 'TO' then Result := cAliquotaTO[lEstadoDestino] else Result := 0;
end;

class function TEstados.AliquotaInterEstadual(const pEstadoOrigem: String): Double;
begin
  Result := AliquotaInterEstadual(pEstadoOrigem, pEstadoOrigem);
end;

class function TEstados.CodEstado(const pEstado: String): SmallInt;
begin
  if pEstado = 'AC' then Result := 00 else
  if pEstado = 'AL' then Result := 01 else
  if pEstado = 'AM' then Result := 02 else
  if pEstado = 'AP' then Result := 03 else
  if pEstado = 'BA' then Result := 04 else
  if pEstado = 'CE' then Result := 05 else
  if pEstado = 'DF' then Result := 06 else
  if pEstado = 'ES' then Result := 07 else
  if pEstado = 'GO' then Result := 08 else
  if pEstado = 'MA' then Result := 09 else
  if pEstado = 'MT' then Result := 10 else
  if pEstado = 'MS' then Result := 11 else
  if pEstado = 'MG' then Result := 12 else
  if pEstado = 'PA' then Result := 13 else
  if pEstado = 'PB' then Result := 14 else
  if pEstado = 'PR' then Result := 15 else
  if pEstado = 'PE' then Result := 16 else
  if pEstado = 'PI' then Result := 17 else
  if pEstado = 'RN' then Result := 18 else
  if pEstado = 'RS' then Result := 19 else
  if pEstado = 'RJ' then Result := 20 else
  if pEstado = 'RO' then Result := 21 else
  if pEstado = 'RR' then Result := 22 else
  if pEstado = 'SC' then Result := 23 else
  if pEstado = 'SP' then Result := 24 else
  if pEstado = 'SE' then Result := 25 else
  if pEstado = 'TO' then Result := 26 else Result := 0;
end;

class function TEstados.CodIBGEEstado(const pEstado: String): SmallInt;
begin
  if pEstado = 'RO' then Result := 11 else
  if pEstado = 'AC' then Result := 12 else
  if pEstado = 'AM' then Result := 13 else
  if pEstado = 'RR' then Result := 14 else
  if pEstado = 'PA' then Result := 15 else
  if pEstado = 'AP' then Result := 16 else
  if pEstado = 'TO' then Result := 17 else
  if pEstado = 'MA' then Result := 21 else
  if pEstado = 'PI' then Result := 22 else
  if pEstado = 'CE' then Result := 23 else
  if pEstado = 'RN' then Result := 24 else
  if pEstado = 'PB' then Result := 25 else
  if pEstado = 'PE' then Result := 26 else
  if pEstado = 'AL' then Result := 27 else
  if pEstado = 'SE' then Result := 28 else
  if pEstado = 'BA' then Result := 29 else
  if pEstado = 'MG' then Result := 31 else
  if pEstado = 'ES' then Result := 32 else
  if pEstado = 'RJ' then Result := 33 else
  if pEstado = 'SP' then Result := 35 else
  if pEstado = 'PR' then Result := 41 else
  if pEstado = 'SC' then Result := 42 else
  if pEstado = 'RS' then Result := 43 else
  if pEstado = 'MS' then Result := 50 else
  if pEstado = 'MT' then Result := 51 else
  if pEstado = 'GO' then Result := 52 else
  if pEstado = 'DF' then Result := 53 else Result := 0;
end;

{ TFuncoes }

class function TFuncoes.Percentual(const pPercentual: Double; const pValor: Currency): Currency;
begin
  Result := 0;

  if pValor > 0 then
    Result := (pValor * pPercentual) / 100;
end;

class function TFuncoes.RetornaPercentual(const pValorTotal, pValor: Currency): Currency;
begin
  Result := 0;

  if pValorTotal > 0 then
    Result := ((pValor / pValorTotal) * 100);
end;

end.

_________________
Edvilson V. G. Chaves

- Pesquise bem antes de postar.

- Qdo postar pense muito bem onde seria o melhor resultado.

e-mail: suporte@flexvendasweb.com.br
Site: www.flexvendasweb.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário
flexsystems
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2007
Mensagens: 234
Localização: Caxias do Sul

MensagemEnviada: Sex Set 17, 2010 10:21 am    Assunto: Responder com Citação

segue exemplo de uso:

Código:

var
  lItemNF: TItemNF;
//  lDuplicataNF: TDuplicataNF;
begin
  FNotaFiscal := TNotaFiscal.Create(Self);
  try
    lItemNF := TItemNF.Create(FNotaFiscal);
//    lDuplicataNF := TDuplicataNF.Create(FNotaFiscal);

    FNotaFiscal.Inicializar;
    FNotaFiscal.ValoresNF.VL_FRETE := 20.00;
    FNotaFiscal.ValoresNF.VL_SEGURO := 12.00;

    FNotaFiscal.EmitenteNF.NomeRazaoSocial := 'Empresa Industrial Alpha Ltda';
    FNotaFiscal.EmitenteNF.Estado := 'MG';

    FNotaFiscal.DestinatarioNF.NomeRazaoSocial := 'Empresa Atacadista Betha Ltda';
    FNotaFiscal.DestinatarioNF.Estado := 'ES';

    FNotaFiscal.Observacoes.Add('operação sujeita ao regime de Substituição Tributária nos termos do Convênio ICMS nº 85/1993.');

    lItemNF.Inicializar;
    lItemNF.Item := 2;
    lItemNF.CodProduto := 'PR01';
    lItemNF.DescProduto := 'PNEUS NOVOS PARA AUTOMOVEL';
    lItemNF.ClassFiscal := '4011.10.00';
    lItemNF.AliqMVA := 42.00;
    lItemNF.AliqIPI := 20;
    lItemNF.Quantidade := 300;
    lItemNF.ValorUnitario := 40.00;
    lItemNF.Peso := 50.00;
    lItemNF.ClassTributaria := cst10;
    lItemNF.ReducaoICMS := 0;
    FNotaFiscal.ItensNF.Add(FNotaFiscal, lItemNF);

    ShowMessage(
      'VL_FRETE     ---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.VL_FRETE) + #13#10 +
      'VL_SEGURO    ---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.VL_SEGURO) + #13#10 +
      'VL_DESPACESS ---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.VL_DESPACESS) + #13#10 +
      'VL_TOTAL_PROD---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.VL_TOTAL_PROD) + #13#10 +
      'VL_TOTAL_NF  ---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.VL_TOTAL_NF) + #13#10 +
      'BS_ICMS      ---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.BS_ICMS) + #13#10 +
      'VL_ICMS      ---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.VL_ICMS) + #13#10 +
      'BS_ICMS_ST   ---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.BS_ICMS_ST) + #13#10 +
      'VL_ICMS_ST   ---> ' + FormatCurr('###,###,##0.00', FNotaFiscal.ValoresNF.VL_ICMS_ST)
    );
  finally
    FreeAndNil(FNotaFiscal);
  end;

_________________
Edvilson V. G. Chaves

- Pesquise bem antes de postar.

- Qdo postar pense muito bem onde seria o melhor resultado.

e-mail: suporte@flexvendasweb.com.br
Site: www.flexvendasweb.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário
CMontrezol
Novato
Novato


Registrado: Sexta-Feira, 29 de Abril de 2011
Mensagens: 1

MensagemEnviada: Sex Abr 29, 2011 3:51 pm    Assunto: Re: Calculo de Imposto em Nota Fiscal de Saída Responder com Citação

Oi.... boa tarde.

procurando na web me deparei com essa unit postada neste forum.
Estou migrando um sistema de clipper para delphi.. e as rotinas de
de calculos da Nota Fiscal estão me deixando louco .
Gostaria de saber se esta unit UclKernel_Calcula_Impostos teve alguma evolução....
sem mais aguardo por um retorno


Borland_Linuxer escreveu:
Ola Caros colegas do fórum todos ja passamos onde ainda passamos pelo trabalho de apredendizagem da parte fiscal e tributaria para implementar em nossos sistemas esses calculos.

Bom estou com algumas duvidas sobre quais as diferenças que existe num calculo de icms por exemplo como a empresa e optante pelo simples nacional e de lucro real ou presumido.

Então eu comercei a criar uma unit para calculo de imposto de ICMS Normal e ST por enquanto.

E espero que os amigos colaborem com sugestões ou ate mesmo implementações.

Eu estou usando como base para calculo do icms o CST do produto.

Abraçcos
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renatoricci23
Novato
Novato


Registrado: Sexta-Feira, 13 de Mai de 2011
Mensagens: 1

MensagemEnviada: Sex Mai 13, 2011 10:07 am    Assunto: Re: Calculo de Imposto em Nota Fiscal de Saída Responder com Citação

Também estou na espera..

Obrigado,

T+

CMontrezol escreveu:
Oi.... boa tarde.

procurando na web me deparei com essa unit postada neste forum.
Estou migrando um sistema de clipper para delphi.. e as rotinas de
de calculos da Nota Fiscal estão me deixando louco .
Gostaria de saber se esta unit UclKernel_Calcula_Impostos teve alguma evolução....
sem mais aguardo por um retorno


Borland_Linuxer escreveu:
Ola Caros colegas do fórum todos ja passamos onde ainda passamos pelo trabalho de apredendizagem da parte fiscal e tributaria para implementar em nossos sistemas esses calculos.

Bom estou com algumas duvidas sobre quais as diferenças que existe num calculo de icms por exemplo como a empresa e optante pelo simples nacional e de lucro real ou presumido.

Então eu comercei a criar uma unit para calculo de imposto de ICMS Normal e ST por enquanto.

E espero que os amigos colaborem com sugestões ou ate mesmo implementações.

Eu estou usando como base para calculo do icms o CST do produto.

Abraçcos
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
flexsystems
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2007
Mensagens: 234
Localização: Caxias do Sul

MensagemEnviada: Ter Dez 20, 2011 11:01 am    Assunto: Responder com Citação

Olá Pessoal,

Vou avançar essa rotina de cálculo novamente, preciso de ajuda. Alguém conseguiu algo???
_________________
Edvilson V. G. Chaves

- Pesquise bem antes de postar.

- Qdo postar pense muito bem onde seria o melhor resultado.

e-mail: suporte@flexvendasweb.com.br
Site: www.flexvendasweb.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário
Borland_Linuxer
Moderador
Moderador


Registrado: Terça-Feira, 11 de Outubro de 2005
Mensagens: 4252
Localização: Manaus - Am

MensagemEnviada: Qua Dez 28, 2011 10:00 pm    Assunto: Responder com Citação

Está tendo continuação no seguinte link:

http://www.djsystem.com.br/acbr/forum/viewtopic.php?f=8&t=4271&start=10

Abraços
_________________
Abraços

Sérgio Guedes
www.lsisistemas.com.br
www.scvarejo.com.br - Projetos para parceiros e desenvolvedores
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Automação Comercial Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB