
CREATE OR REPLACE PROCEDURE GERA_BAIXA_ASSINA(P_DTULTATU DATE)
AS
V_NRMOVBANC     VARCHAR2(20);
V_NRRECIBO      VARCHAR2(20);
V_NRBAIXA       VARCHAR2(20);
V_NRLANCTONF    VARCHAR2(20);
V_NRSEQVENBOL   VARCHAR2(20);
V_NRPARCELABOL  VARCHAR2(20);
V_CDOPERADOR    VARCHAR2(12);
V_VRORIGBOL     FLOAT;
V_CDFILIBOL     VARCHAR2(04);
V_CDCLASSFINA   VARCHAR2(10);
V_CDEMPRESA     VARCHAR2(02);
V_CDFIMOVFL     VARCHAR2(04);
V_DTMOVFLUXO    DATE;
V_IDMOVFLUXO    VARCHAR2(01);
V_CDHISTPADR    LANCCONT.CDHISTPADR%TYPE;
V_DSHISTPADR    HISTPADR.DSHISTPADR%TYPE;
V_DTSALDO       DATE;
V_VRATUAL       SDOCCORR.VRSDOCCORR%TYPE;
V_NRLANCCTB     VARCHAR2(20);
V_COUNTERROCTB  NUMBER;
V_DSBAIXA       VARCHAR2(200);
BEGIN
   FOR C_BOL IN (SELECT BR.CDFILIAL, BR.NRLANBOLREC,
                        BR.VRFINALBREC, BR.CDREDUCONT,
                        BR.CDEMPRESA, BR.CDTPBAIXAREC,
                        BO.CDNSUTEF, BO.NRAUTORIZAPIX
                  FROM BOLETRECASSINA BO, BOLETRECEBER BR
                 WHERE BO.CDFILIAL = BR.CDFILIAL
                   AND BO.NRLANBOLREC = BR.NRLANBOLREC
                   AND TRUNC(BO.DTULTATU) = TRUNC(TO_DATE(P_DTULTATU))
                   AND BO.IDSTATUS = 'B'
                   AND BR.IDSTATBREC <> 'B'
                   AND BR.NRBAIXAREC IS NULL) LOOP


      NOVO_CODIGO_NT('MOVBANCARIO' || C_BOL.CDREDUCONT, V_NRMOVBANC);
      V_NRMOVBANC := SUBSTR(V_NRMOVBANC, 11, 10);
      NOVO_CODIGO_NT('NRRECIBOREC', V_NRRECIBO);
      V_NRRECIBO := SUBSTR(V_NRRECIBO, 11, 10);
      NOVO_CODIGO_NT('BAIXARECEBIDA' || C_BOL.CDFILIAL, V_NRBAIXA);
      V_NRBAIXA := SUBSTR(V_NRBAIXA, 11, 10);

      SELECT MAX(T.CDHISTPADR), MAX(H.DSHISTPADR)
        INTO V_CDHISTPADR, V_DSHISTPADR
        FROM TIPOBAIXAREC T, HISTPADR H
       WHERE T.CDTPBAIXAREC = C_BOL.CDTPBAIXAREC
         AND T.CDHISTPADR   = H.CDHISTPADR;

      SELECT CR.NRLANCTONF, CR.NRSEQVENREC, CR.NRPARCELAREC,
             CR.VRORIGREC, CR.CDFILIBOLREC, CR.CDCLASSFINA,
             CR.CDEMPRESA, CR.CDFIMOVFLREC, CR.DTMOVFLUXO, CR.IDMOVFLUXO
        INTO V_NRLANCTONF, V_NRSEQVENBOL, V_NRPARCELABOL,
             V_VRORIGBOL, V_CDFILIBOL, V_CDCLASSFINA,
             V_CDEMPRESA, V_CDFIMOVFL, V_DTMOVFLUXO, V_IDMOVFLUXO
        FROM NOTAFISCAL NF, CONTARECEBER CR
       WHERE (CR.CDFILIBOLREC = C_BOL.CDFILIAL)
         AND (CR.NRLANBOLREC  = C_BOL.NRLANBOLREC)
         AND (NF.CDFILIAL     = CR.CDFILIAL)
         AND (NF.NRLANCTONF   = CR.NRLANCTONF)
         AND (NF.CDEMPRESA    = CR.CDEMPRESA)
         AND (NF.CDEMPRESA    = C_BOL.CDEMPRESA);


         ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                              V_CDFIMOVFL,
                              V_DTMOVFLUXO,
                              V_IDMOVFLUXO,
                              V_CDCLASSFINA,
                              V_VRORIGBOL * -1,
                              0);

         ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                              V_CDFIMOVFL,
                              TRUNC(P_DTULTATU),
                              'R',
                              V_CDCLASSFINA,
                              V_VRORIGBOL,
                              0);
    /*Atualiza a conta com os dados do recebibento*/
      UPDATE CONTARECEBER
         SET IDMOVFLUXO = 'R',
             IDSTATREC  = 'B',
             DTMOVFLUXO = TRUNC(P_DTULTATU)
       WHERE CDFILIAL     = C_BOL.CDFILIAL
         AND NRLANCTONF   = V_NRLANCTONF
         AND NRSEQVENREC  = V_NRSEQVENBOL
         AND NRPARCELAREC = V_NRPARCELABOL;
      IF C_BOL.NRAUTORIZAPIX IS NOT NULL THEN
          V_DSBAIXA :=  'Baixa Realizada Automaticamente Pagamento Via-Pix Autorização: '||C_BOL.NRAUTORIZAPIX;

      ELSIF C_BOL.CDNSUTEF IS NOT NULL THEN
          V_DSBAIXA :=  'Baixa Realizada Automaticamente Pagamento NSU: '||C_BOL.CDNSUTEF;
      ELSE
           V_DSBAIXA :=  'Baixa Automatica Pagamento App';
      END IF;
      INSERT INTO MOVBANCARIO
         (CDREDUCONT, NRMOVBANC, DTMOVBANC, IDMOVBANC,
          NRDOCMBANC, DSHISMBANC, VRMOVBANC, IDORIGMBANC)
      VALUES
         (C_BOL.CDREDUCONT, V_NRMOVBANC, TRUNC(P_DTULTATU), 'C',
          '', 'Baixa Automatica Pagamento App', C_BOL.VRFINALBREC, 'R');
      INSERT INTO BAIXARECEBIDA
             (CDEMPRESA, NRMOVBANC, NRBAIXAREC, NRRECIBOREC,
              IDSTATUSBREC, CDFILIAL, DTBAIXAREC, VRBAIXAREC,
              CDREDUCONT, CDTPBAIXAREC, CDOPERADOR, DTLANCBAIXAR,
              DSBAIXAREC, IDBAIXAAUTOCUPOM)
          VALUES
             (V_CDEMPRESA, V_NRMOVBANC, V_NRBAIXA, V_NRRECIBO,
              'E',  C_BOL.CDFILIAL, TRUNC(P_DTULTATU), C_BOL.VRFINALBREC,
              C_BOL.CDREDUCONT, C_BOL.CDTPBAIXAREC, V_CDOPERADOR, SYSDATE,
              V_DSBAIXA, 'N');
          UPDATE BOLETRECEBER
             SET IDSTATBREC   = 'B',
                 NRBAIXAREC   = V_NRBAIXA,
                 CDTPBAIXAREC = C_BOL.CDTPBAIXAREC,
                 CDFILIBAIREC = C_BOL.CDFILIAL,
                 DTLIQBOLREC  = TRUNC(P_DTULTATU)
           WHERE (CDFILIAL    = C_BOL.CDFILIAL)
             AND (NRLANBOLREC = C_BOL.NRLANBOLREC);


      CTB_REC_BAIXA(V_CDEMPRESA,  C_BOL.CDFILIAL, C_BOL.CDFILIAL, V_NRBAIXA, V_NRLANCCTB);
      IF SUBSTR(V_NRLANCCTB,1,1) = 'N' THEN   
        V_NRLANCCTB := SUBSTR(V_NRLANCCTB,2,12);
      END IF;  
      SELECT COUNT(*)
        INTO V_COUNTERROCTB
        FROM ERROCTBTEMP
       WHERE CDEMPRESA     = V_CDEMPRESA
         AND NRLANCCTBTEMP = V_NRLANCCTB;
      IF V_COUNTERROCTB <> 0 THEN
     
        ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                            V_CDFIMOVFL,
                            TRUNC(P_DTULTATU),
                            'R',
                            V_CDCLASSFINA,
                            V_VRORIGBOL * -1,
                            0);
        ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                        V_CDFIMOVFL,
                        TRUNC(P_DTULTATU),
                        'P',
                        V_CDCLASSFINA,
                        V_VRORIGBOL,
                        0);

         UPDATE CONTARECEBER
            SET IDMOVFLUXO = 'P',
                IDSTATREC  = 'P',
                DTMOVFLUXO = TRUNC(P_DTULTATU)
          WHERE CDFILIAL     = C_BOL.CDFILIAL
            AND NRLANCTONF   = V_NRLANCTONF
            AND NRSEQVENREC  = V_NRSEQVENBOL
            AND NRPARCELAREC = V_NRPARCELABOL;
          UPDATE BOLETRECEBER
             SET IDSTATBREC   = 'P',
                 NRBAIXAREC   = V_NRBAIXA,
                 CDTPBAIXAREC = C_BOL.CDTPBAIXAREC,
                 CDFILIBAIREC = C_BOL.CDFILIAL,
                 DTLIQBOLREC  = TRUNC(P_DTULTATU)
           WHERE (CDFILIAL    = C_BOL.CDFILIAL)
             AND (NRLANBOLREC = C_BOL.NRLANBOLREC);

         UPDATE BAIXARECEBIDA
            SET IDSTATUSBREC = 'P' ,
                NRMOVBANC   = NULL
          WHERE NRBAIXAREC   = V_NRBAIXA
            AND CDEMPRESA    = V_CDEMPRESA;
         DELETE FROM MOVBANCARIO
          WHERE  NRMOVBANC = V_NRMOVBANC
            AND CDREDUCONT = C_BOL.CDREDUCONT;
      ELSE
         UPDATE BOLETRECEBER
            SET IDSTATBREC   = 'B',
                NRBAIXAREC   = V_NRBAIXA,
                CDTPBAIXAREC = C_BOL.CDTPBAIXAREC,
                CDFILIBAIREC = C_BOL.CDFILIAL,
                DTLIQBOLREC  = TRUNC(P_DTULTATU)
          WHERE (CDFILIAL    = C_BOL.CDFILIAL)
            AND (NRLANBOLREC = C_BOL.NRLANBOLREC);
         /*Atualiza saldo da conta corrente*/
         SELECT MAX(DTSDOCCORR)
           INTO V_DTSALDO
           FROM SDOCCORR
          WHERE CDREDUCONT = C_BOL.CDREDUCONT
            AND DTSDOCCORR <= TRUNC(P_DTULTATU);

         SELECT MAX(VRSDOCCORR)
           INTO V_VRATUAL
           FROM SDOCCORR
          WHERE CDREDUCONT = C_BOL.CDREDUCONT
            AND DTSDOCCORR = V_DTSALDO;

         V_VRATUAL := NVL(V_VRATUAL,0) + C_BOL.VRFINALBREC;

         IF TRUNC(P_DTULTATU) =  V_DTSALDO THEN
            UPDATE SDOCCORR
               SET VRSDOCCORR = V_VRATUAL,
                   VRSDOIMPLA = NULL
             WHERE CDREDUCONT = C_BOL.CDREDUCONT
               AND DTSDOCCORR = V_DTSALDO;
         ELSE
            INSERT INTO SDOCCORR
               (CDREDUCONT, DTSDOCCORR, VRSDOCCORR, VRSDOIMPLA)
            VALUES
               (C_BOL.CDREDUCONT, TRUNC(P_DTULTATU), V_VRATUAL, NULL);
         END IF;

      END IF;
   END LOOP;
   COMMIT;
   EXCEPTION WHEN OTHERS THEN
    ROLLBACK;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('ATUALIZACAO_ESTRUTURA_BD','6.49.xxx') END
/