Stored Procedure

Firebird

22/05/2012

Pessoal estou com um pequeno problema, tenho um sistema de controle bancario e contas a pagar e receber. No lancamentos de contas a receber quando vou efetuar a baixa do lancamento tenho uma SP que executa esta baixa, porem, meu cliente quer que a baixa possa ser feita nao so pelo valor total, mas podendo ser baixado parcialmente. Acontece que na minha SP quando faz baixa indepedente se for total ou parcial, ja marca o registro como baixado. Vou colocar a SP e se puderem me ajudar esse problema ficarei grato.

CREATE PROCEDURE SP_CTARECEBER_MOVTO (
    nfilial integer,
    ncodigo integer,
    ncliente varchar(30),
    acao char(1),
    chk_caixa char(1),
    chk_banco char(1))
returns (
    valorpago double precision)
as
begin

/* ----------------------------------------------------------------------- */

  /* BAIXAR */
  If (ACAO=B) then
  Begin
     /* BAIXAR DOCUMENTO */
     UPDATE cta_receber  SET
        /* Quitado=[S]sim */
        cta_receber.quitado        = S,
        /* Saldo restante */
        cta_receber.saldo_restante = (cta_receber.valor - cta_receber.valor_pago),
        cta_receber.valor_pago = coalesce(cta_receber.valor_pago,0) +
                                 coalesce(cta_receber.acrescimo,0) +
                                 coalesce(cta_receber.despesas,0) -
                                 coalesce(cta_receber.desconto,0)

     WHERE
        cta_receber.FILIAL=:nFILIAL
        AND
        cta_receber.CODIGO=:nCODIGO
        AND
        cta_receber.CLIENTE=:nCLIENTE;


     /* verificar se no parametro do sistema está definido que toda baixa
        contas a receber deve lançar no caixa */
     /*select CAIXA_CTARECEBER from parametros
     where
        filial=:nfilial
     into :CHK_CAIXA;*/
   
     if (CHK_CAIXA=S) then
     Begin

           insert into ctrl_caixa (codigo, filial,      documento,  departamento,
                                   PLN_CONTA_CLASSE,
                                   pln_conta,   dc,         data, historico,
                                   vlr_credito, vlr_debito, FORMA_PAGTO, efetivado)
           values (
           (select max(codigo)+1        from ctrl_caixa      where filial=:nfilial),
           :nfilial,
           CTR-||(select CODIGO       from cta_receber     where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           (select CODIGO               from departamentos   where filial=:nfilial),
           (select P_CONTA_CTARECEBER0  from parametros      where filial=:nfilial),
           (select P_CONTA_CTARECEBER   from parametros      where filial=:nfilial),
           CREDITO,
           (select DATA_PAGTO           from cta_receber     where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           TITULO BAIXADO ||(select historico from cta_receber where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           (select valor_pago           from cta_receber     where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           0,
           (select fpagto               from cta_receber     where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           N
           );


     end -- If (CHK_CAIXA=S) Then (...)



     /* verificar se no parametro do sistema está definido que toda baixa
        contas a receber deve lançar no movimento bancário */
     /*select CAIXA_BANCO from parametros
     where
        filial=:nfilial
     into :CHK_BANCO;*/
   
     if (CHK_BANCO=S) then
     Begin

           insert into CTRL_BANCARIO (codigo,
                                      filial,
                                      documento,
                                      CTA_CORRENTE,
                                      DEPARTAMENTO,
                                      PLN_CONTA_CLASSE,
                                      PLN_CONTA,
                                      DC,
                                      DATA,
                                      HISTORICO,
                                      VLR_CREDITO,
                                      VLR_DEBITO)
           values (
           (select max(codigo)+1        from ctrl_bancario   where filial=:nfilial),
           :nfilial,
           CTR-||(select CODIGO       from cta_receber     where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           (select conta_c              from cta_receber     where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           (select codigo               from departamentos   where filial=:nfilial),
           (select P_CONTA_CTARECEBER0  from parametros      where filial=:nfilial),
           (select P_CONTA_CTARECEBER   from parametros      where filial=:nfilial),
           CREDITO,
           (select DATA_PAGTO           from cta_receber     where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           TITULO BAIXADO ||(select historico from cta_receber where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           (select valor_pago           from cta_receber     where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE),
           0
           );

     end  -- If (CHK_BANCO=S) Then (...)

  end  -- If ACAO=BAIXAR) Then (...)


  /* ------------------------------------------------------------------ */

  /* ESTORNAR */
  If (ACAO=E) then
  Begin

     /* BAIXAR DOCUMENTO */
     UPDATE cta_receber  SET
        /* Quitado=[S]sim */
        cta_receber.quitado        = N,
        cta_receber.data_pagto     = NULL,
        cta_receber.valor_pago     = 0,
        cta_receber.saldo_restante = 0,
        cta_receber.desconto       = 0,
        cta_receber.acrescimo      = 0,
        cta_receber.despesas       = 0,
        cta_receber.historico      = NULL,
        cta_receber.conta_c        = NULL

     WHERE
        cta_receber.FILIAL=:nfilial
        AND
        cta_receber.CODIGO=:nCODIGO
        AND
        cta_receber.CLIENTE=:nCLIENTE;
  

     /* EXCLUIR LANÇAMENTO DO SALDO CAIXA */
     DELETE FROM ctrl_caixa_saldo
     WHERE
        FILIAL=:nFILIAL
     AND
        CODIGO=(select CODIGO       from ctrl_caixa where filial=:nfilial and
                                    DOCUMENTO=CTR-||(select CODIGO from cta_receber where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE));


     /* EXCLUIR LANÇAMENTO DO CONTROLE DE CAIXA */
     DELETE FROM ctrl_caixa
     WHERE
        FILIAL=:nFILIAL
     AND
        DOCUMENTO=CTR-||(select CODIGO       from cta_receber where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE);


     /* EXCLUIR LANÇAMENTO DO SALDO BANCARIO */
     DELETE FROM ctrl_bancario_saldo
     WHERE
        FILIAL=:nFILIAL
     AND
        CODIGO=(select CODIGO       from ctrl_bancario where filial=:nfilial and
                                    DOCUMENTO=CTR-||(select CODIGO from cta_receber where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE));

     /* EXCLUIR LANÇAMENTO DO CONTROLE BANCARIO */
     DELETE FROM ctrl_bancario
     WHERE
        FILIAL=:nFILIAL
     AND
        DOCUMENTO=CTR-||(select CODIGO       from cta_receber where filial=:nfilial and codigo=:nCODIGO and CLIENTE=:nCLIENTE);


  End  -- If ACAO=ESTORNAR) Then (...)



Fico no aguardo.


Att
Iramar Junior

Iramar Junior

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

22/05/2012

Cara, confesso que não li teu código, mas com base no questão que você levantou, eu sugiro o seguinte: ter opções de marcação na tabela das contas que são baixadas, ou seja, ter um campo que permita não só valores para BAIXADO ou NÃO BAXIADO, mas também valores parciais como: B=Baixado; N=Não baixado; P=Parcialmente baixado;

Bom, não sei se é esse o problema, mas essa é minha opinião sobre sua colocação.

Boa sorte.
GOSTEI 0
Iramar Junior

Iramar Junior

22/05/2012

Ja tenho um campo que seta para S=Quitado N=Nao quitado

Cara, confesso que não li teu código, mas com base no questão que você levantou, eu sugiro o seguinte: ter opções de marcação na tabela das contas que são baixadas, ou seja, ter um campo que permita não só valores para BAIXADO ou NÃO BAXIADO, mas também valores parciais como: B=Baixado; N=Não baixado; P=Parcialmente baixado;

Bom, não sei se é esse o problema, mas essa é minha opinião sobre sua colocação.

Boa sorte.
GOSTEI 0
William

William

22/05/2012

Na realidade se já existe esse campo, então vc só acrescenta mais uma condição P = Parcialmente Quitado, como o colega Joel já explicou.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

22/05/2012

você precisa também guardar o saldo do titulo e/ou gerar uma movimentação bancária com o valor pago (data, motivo, banco, etc).
assim, ao efetuar uma nova baixa, o sistema já poderia sugerir como valor a baixar o saldo atual do título.
GOSTEI 0
POSTAR