Gerar duplicatas a partir de datas pré-definidas

07/12/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


Mvicente

Respostas

08/12/2005

Emerson

crie um procedure mais ou menos assim:

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&93;,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

[b:7f4abb27a0]a sintaxe para a procedure é:[/b:7f4abb27a0]
ParcelarVenda( 1560.2, ´28/35/42 dias´);

atenção nessa parte do código. ela é muito importante:
    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á:
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 [i:7f4abb27a0]if i = (dias.Count-1)[/i:7f4abb27a0] para [i:7f4abb27a0]if i = [b:7f4abb27a0]0[/b:7f4abb27a0] [/i:7f4abb27a0]. fazendo essa alteração o resultado será:
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...


Responder Citar