 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
flexsystems Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2007 Mensagens: 234 Localização: Caxias do Sul
|
Enviada: Ter Dez 20, 2011 11:15 am Assunto: NOVA CLASSE PARA CALCULO IMPOSTOS+TRIBUTOS |
|
|
Olá Pessoal!
Vou disponibilizar aqui minha classe para calculo de impotos e tributos na nota fiscal. Sim, sei perfeitamente que exige muito e que são vários pontos, mas se um dia alguém começar e dar seguimento poderemos colocar ela pra funcionar!
Segue então o código completo da primeira classe que fiz com a ajuda do nosso companheiro Sergio Guedes.
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 |
|
 |
flexsystems Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2007 Mensagens: 234 Localização: Caxias do Sul
|
Enviada: Ter Dez 20, 2011 11:18 am Assunto: |
|
|
Segue abaixo o exemplo para 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 |
|
 |
Ghost_Rider Colaborador

Registrado: Segunda-Feira, 6 de Outubro de 2003 Mensagens: 4437
|
Enviada: Ter Dez 20, 2011 3:30 pm Assunto: |
|
|
Cara, uma pergunta, dei uma olhada por cima da sua unit, pode ser que vc ja tenha implementado nela o que vou perguntar, mas, e quando um produto é vendido com uma forma de calculo para dentro do estado e de outra para fora, como os produtos da cesta basica, voce ja esta tratando ??? |
|
Voltar ao Topo |
|
 |
flexsystems Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2007 Mensagens: 234 Localização: Caxias do Sul
|
Enviada: Ter Dez 20, 2011 3:46 pm Assunto: |
|
|
Está tudo baseado no estado do emitente e do destinatário além claro do CST do item. Não sei se respondi tua pergunta?
Procedimentos:
1. Criamos a Nota Fiscal (Classe TNotaFiscal)
2. Adiciona-se os valores como frete, acessórias, etc... na nota fiscal
(NotaFiscal.ValoresNF)
3. Emitente e destinatário da TNotaFiscal (Aqui quero colocar algumas propriedades que serão utilizadas para o cálculo nos itens como por exemplo CRT, CNAE, CSOSN...e o que mais for necessário). Hoje ele só etá tratando o estado para o cálculo do ICMS (mal e porcamente).
4. Adicionar os items com a classe TItemNF e ir passando as alíquotas conforme o possível cadastro que você tiver (ICMS, IPI, PIS, COFINS...ETC...)
Feito isso é só ir pegando os valores disponíveis na TNota_Fiscal que estão disponíveis e a gente pode ir criando.
Sei lá o pessoal fala que é complicado mas se trabalharmos juntos poderiamos fazer À ROTINA de cálculo tipo ACBr, e quem sabe colocar no ACBr como ACBrCalcNFe hein???
Dá uma olhada no segundo post que coloquei que esse faz bem o que vc tá dizendo... _________________ 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 |
|
 |
Ghost_Rider Colaborador

Registrado: Segunda-Feira, 6 de Outubro de 2003 Mensagens: 4437
|
Enviada: Ter Dez 20, 2011 4:08 pm Assunto: |
|
|
É, responder não respondeu...rsrsrsrs...mas a ideia é boa, mas, acredito que tenha situações maiores e mais especificas que essa, mas a idéia é boa sim... |
|
Voltar ao Topo |
|
 |
CENTURYINF Membro Junior

Registrado: Sexta-Feira, 19 de Fevereiro de 2010 Mensagens: 364
|
Enviada: Ter Jan 24, 2012 12:04 am Assunto: |
|
|
Ola
Acredito que a ideia e a boa vontade e interessante,
pena que nossos governantes não tem uma metodologia identica para todos os estados. Problemas como simpes nacional , subst. Tributaria, Ipi, Trib. de Icms, que variam de empresas, de produtos, de estados....
um mesmo produto de detrminada empresa, sofre alteraçoes de estado para estado,
de pessoa fisica p/ juridica... e muitas outras complicações, o que torna a nos programadores, dificuldades para utilizarmos funções padronizadas, tendo que sempre dar aquele jeitinho brasileiro...
mas é realmente uma ideia para se estudar.. |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|