Gerar duplicatas a partir de datas pré-definidas
07/12/2005
0
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
É 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
Curtir tópico
+ 0
Responder
Posts
08/12/2005
Emerson Nascimento
crie um procedure mais ou menos assim:
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:
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á:
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á:
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...
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;
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;
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
Clique aqui para fazer login e interagir na Comunidade :)