Array
(
)

Gerar duplicatas a partir de datas pré-definidas

Mvicente
   - 07 dez 2005

Amigos, boa noite!
É o seguinte : Tenho em meu sistema um cadastro de vencimentos, onde o usuário cria datas de vencimento tipo :
A vista
10 dias
28 dias
30 dias
28/35/42 dias
30/40/60 dias e etc...
No cadastro de clientes eu amarro uma dessas datas, ou seja, tenho um loockupcombobox onde o usuário escolhe um tipo de vencimento para o Cliente que esteja cadastrando.
A minha dúvida é : Como faço pra gerar vencimentos de duplicatas, a partir de uma data escolhida, por ex : vamos dizer que tenho um valor de R$1.520,00, e o vencimento escolhido é 28/35/42 dias e quero gerar a respectivas duplicatas de modo que fique assim:
duplicata 1 : 04/01/2006 valor de 506,66
duplicata 2 : 11/01/2006 valor de 506,67
duplicata 3 : 18/01/2006 valor de 506,67
Alguém poderia me ajudar???

Uso Delphi 7 com Firebird 2.0

Qquer ajuda é bem vinda !!!

Marcelo


Emerson
   - 08 dez 2005

crie um procedure mais ou menos assim:

#Código

procedure TForm1.ParcelarVenda(Valor: double; Condicao: string);
var
dias: TStringList;
i: integer;
espaco: shortint;
datavencimento: TDate;
parcela, valorparcela: double;
begin
if AnsiUpperCase( Condicao ) = ´A VISTA´ then
Condicao := ´0´;

espaco := pos(´ ´,condicao);

if espaco > 0
then Condicao := Copy(Condicao,1,espaco-1);

dias := TStringList.Create;
dias.Delimiter := ´/´;
dias.DelimitedText := Condicao;

try
valorparcela := RoundTo(Valor / dias.Count,-2);
except
valorparcela := RoundTo(Valor,-2);
end;

for i := 0 to dias.Count-1 do
begin
// calcula a data de vencvimento e o valor da parcela
datavencimento := date + StrToIntDef( dias[i],0 );
if i = (dias.Count-1)
then parcela := valor - ((dias.Count-1) * valorparcela)
else parcela := valorparcela;

// inclui o registro no dataset
dataset.append;
dataset.fieldbyname(´vencimento´).asdate := datavencimento;
dataset.fieldbyname(´valor´).asdate := parcela;
{demais campos}
dataset.post;
end;

dias.Free;
end;
onde Condicao é o texto da sua condição de pagamento, no formato que você exemplificou:
A vista
10 dias
28 dias
30 dias
28/35/42 dias
30/40/60 dias

a sintaxe para a procedure é:
ParcelarVenda( 1560.2, ´28/35/42 dias´);

atenção nessa parte do código. ela é muito importante:
#Código
if i = (dias.Count-1)
then parcela := valor - ((dias.Count-1) * valorparcela)
else parcela := valorparcela;
esse trecho do código avalia valores ´quebrados´ e põe a diferença na última parcela.
tomando como exemplo o valor R$ 1.560,20 e parcelamento em 3 vezes, o valor de cada parcela será R$ 520,066666666 (dízima) e, depois de aplicado o RoundTo() ficará em R$ 520,07. porém, se cada parcela vale R$ 520,07 o total será R$ 1.560,21, o que, obviamente, está errado.
com a rotina acima ficará:
#Código
1a. parcela = 520,07
2a. parcela = 520,07
3a. parcela = 520,06
Total 1560,20

se quiser colocar a diferença na primeira parcela, basta alterar a condicao de if i = (dias.Count-1) para if i = 0 . fazendo essa alteração o resultado será:#Código
1a. parcela = 520,06
2a. parcela = 520,07
3a. parcela = 520,07
Total 1560,20

obs.: para fazer uso da função RoundTo() é necessário declarar a unit Math na cláusula uses.

espero que esta rotina lhe seja útil...