Fórum Pagamento Parcial de Contas a Receber #585903

17/09/2017

0

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

Responder

Posts

18/09/2017

Felipe Morais

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.
Responder

Gostei + 0

18/09/2017

Bruno Henrique

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?
Responder

Gostei + 0

18/09/2017

Felipe Morais

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar