Pagamento Parcial de Contas a Receber

Delphi

17/09/2017

Boa noite!!!

Gostaria de saber como faço para efetuar a baixa de um pagamento parcial de um contas a receber!Quando eu clico no check pagamento parcial e digito o valor a ser pago, o sistema baixa todas as parcelas SELECIONADAS deixando o valor residual para a última selecionada ( ou seja a de vencimento maior), igual na imagem, o valor total da conta era de 8640,00 e o valor de pagamento parcial foi informado de 8000,00 assim gerando um pagamento residual no valor de 640,00, não estou conseguindo fazer isso, segue abaixo meu código e o link da imagem da tela

FOTO DA TELA BAIXA PARCIAL




procedure TFrmBaixaPrazo.BtnBaixarClick(Sender: TObject);
var
  ValorTotal: Real;
  x: Real;

begin

    CdsBaixaPrazo.Filter := 'SELECIONADO = ' + QuotedStr('S'); // filtra os registros selecionados
    CdsBaixaPrazo.Filtered := True; // ativa o filtro
    CdsBaixaPrazo.First; // posiciona o cursor no primeiro registro

    //while not CdsBaixaPrazo.Eof do
      //begin

            ValorTotal := StrToCurr(RetirarPonto(EdtValorSelecionado.Text));
            while not CdsBaixaPrazo.Eof do
            begin

              // Se a variável estiver zerada,
              // significa que todas as deduções de cálculo já foram feitas (pagamentos integrais e parciais)
              if ValorTotal = 0 then
              begin
                Break;
              end;

               // Se "Valor Selecionado" for MAIOR que o valor da parcela, quita a parcela
              if ValorTotal < CdsBaixaPrazo.FieldByName('VALORTOTAL').AsFloat then
              begin

                // Deduz o valor da parcela do "Valor Selecionado"
                // Por exemplo: 3.000,00 - 2.000,00 = 1.000,00 restantes para deduzir
                  CdsBaixaPrazo.FieldByName('VALORTOTAL').AsFloat := CdsBaixaPrazo.FieldByName('ValorParcela').AsFloat - ValorTotal;

                // Altera a parcela para quitada
                CdsBaixaPrazo.Edit;

                CdsBaixaPrazo.FieldByName('SITUACAOPAGAMENTO').AsString := 'PAGO';
                CdsBaixaPrazo.FieldByName('DATAPAGAMENTO').AsDateTime := Now;
                CdsBaixaPrazo.FieldByName('VALORTOTAL').AsFloat := 0;
                CdsBaixaPrazo.Post;

                // Move para a próxima parcela
                CdsBaixaPrazo.Next;
                CdsBaixaPrazo.ApplyUpdates(0);                
                Continue;
              end;

              // Se "Valor Selecionado" for MENOR que o valor da parcela, então é pagamento parcial
              if ValorTotal > CdsBaixaPrazo.FieldByName('VALORTOTAL').AsFloat then
              begin
                // Altera a parcela para parcial
                CdsBaixaPrazo.Edit;
                CdsBaixaPrazo.FieldByName('SituacaoPagamento').AsString := 'PARCIAL';
                CdsBaixaPrazo.FieldByName('Historico').AsString := 'PARCIAL';

                // Cálculo parcial
                // Por exemplo: 2.000,00 - 1.000,00 = 1.000,00
                CdsBaixaPrazo.FieldByName('VALORTOTAL').AsFloat := CdsBaixaPrazo.FieldByName('ValorParcela').AsFloat - ValorTotal;

                // Zera a variável, já que após o pagamento parcial, não vai sobrar mais nada
                ValorTotal := 0;

                CdsBaixaPrazo.Post;

                // Move para a próxima parcela
                CdsBaixaPrazo.Next;
                CdsBaixaPrazo.ApplyUpdates(0);
                Continue;
              end;
            end;
     // end;


end;
Bruno Henrique

Bruno Henrique

Curtidas 0

Respostas

Felipe Morais

Felipe Morais

17/09/2017

Bom dia, Bruno

Se entendi bem, ao fazer o pagamento parcial as parcelas ficam quitadas, e a última receberia o valor a ser pago de 640,00, é isso? Se sim, acho que uma das formas de implementar a sua solução seria setando as duas como "pago" e a terceira receberia o valor residual.

As 3 parcelas mostradas na imagem possuem identificador único? Se sim, mapeie a última parcela e atribua o valor residual.
GOSTEI 0
Bruno Henrique

Bruno Henrique

17/09/2017

Moraissan, boa tarde!!!Grato por responder!!!

É isso mesmo que você intendeu que eu quero fazer, mais é isso que eu não estou conseguindo fazer colocar as duas primeiras como paga e lançar o valor residual de R$ 640,00 para a última parcela.

Como fazeria ?Tem algum exemplo?
GOSTEI 0
Felipe Morais

Felipe Morais

17/09/2017

Bruno, em primeiro lugar, se eu quiser manipular dados de um registro, eu primeiro identificaria estes registros com uma chave única (ID incremental, pro exemplo). Definiria um campo com o número da parcela (NumParcela INT), e percorreria estas parcelas. A última parcela (o campo máximo de NumParcela) teria seu valor original alterado para o residual (isto é, de 2880 para 640) e as demais parcelas eu setaria como "quitado" (outro campo do registro a ser definido).

Pense na definição da tabela de parcelas mais ou menos assim (usei o SQL Server pra construir a tabela):

CREATE TABLE TB_Parcelas (
  IDParcela     INT NOT NULL PRIMARY KEY IDENTITY,
  IDConta        INT NOT NULL,
  NumParcela SMALLINT NOT NULL,
  Valor             DECIMAL(5, 4),
  Quitado        BIT NOT NULL DEFAULT 0
  
  FOREIGN KEY (IDConta) REFERENCES TB_Conta(IDConta)
)


Veja que o campo "IDConta" seria uma chave estrangeira para a conta à qual estas parcelas se referem. Para cada parcela criada o campo "Quitado" é zero, e somente após pagamento, este campo é setado para 1.

Assim, percorra sua tabela quitando as demais contas (Quitado = 1) e altere o campo "Valor" da última parcela para o valor residual, no seu caso 640,00.

Espero ter ajudado.

Abraços.
GOSTEI 0
POSTAR