CREATE OR REPLACE PROCEDURE CONTABILIZA_REC_BAIXA(
   P_NRLISTA LISTA.NRLISTA%TYPE)

IS
   V_CDLOTE          VARCHAR2(20);
   V_NRLANCLOTE      VARCHAR2(6);

   V_CDHISTPADRDB    HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTPADRDB    LANCLOTE.DSHISTLOTE%TYPE;
   V_CDHISTPADRTPB   HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTPADRTPB   LANCLOTE.DSHISTLOTE%TYPE;
   V_CDHISTPADRAJ    HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTPADRAJ    LANCLOTE.DSHISTLOTE%TYPE;

   V_VRLANCPARTBOREC HISPARTBOLEXREC.VRLANCPARTBOREC%TYPE;
   V_CDCONTCTBL      CONTCTBL.CDCONTCTBL%TYPE;
   V_CDCONTCTBL1     CONTCTBL.CDCONTCTBL%TYPE;
   V_CDCONTCTBL2     CONTCTBL.CDCONTCTBL%TYPE;
   V_CDHISTPADRAUX   HISTPADR.CDHISTPADR%TYPE;

   V_NRPARTIDA       INTEGER;
   V_NRCOUNT         INTEGER;
   V_NRPARTRAT       INTEGER;
   V_NRCOUNTRAT      INTEGER;

   V_CDCHAVE         VARCHAR(16);

   V_VRRESTOAJUS     NUMERIC(15,5);
   V_VRAJBOLREC      NUMERIC(15,5);
   V_VRRESTORAT      NUMERIC(15,5);
   V_VRAJBOLRAT      NUMERIC(15,5);
   V_VRFATOCONV      NUMERIC(15,5);

BEGIN
   EXCLUI_LANCCONTABIL('11', P_NRLISTA);

   FOR C_BAIXA IN (
   SELECT BR.CDFILIAL, BR.NRBAIXAREC, BR.CDEMPRESA,
          BR.DTBAIXAREC, BR.VRBAIXAREC, BR.CDTPBAIXAREC,
          CC.CDREDUCONT, CC.CDBANCO, CC.CDAGENCIA, CC.CDCONTCORR, CC.DSCONTCORR,
          CC.CDCONTCTBL, TBR.NMTPBAIXAREC, E.CDCENTCUST
     FROM TIPOBAIXAREC TBR, CONTCORR CC, EMPRESA E, BAIXARECEBIDA BR, LISTA L
    WHERE L.NRLISTA = P_NRLISTA
      AND BR.CDFILIAL = SUBSTR(L.CDLISTA,1,4)
      AND BR.NRBAIXAREC = SUBSTR(L.CDLISTA,5,10)
      AND BR.CDTPBAIXAREC = TBR.CDTPBAIXAREC
      AND CC.CDREDUCONT = BR.CDREDUCONT
      AND TBR.IDCTBLBXREC = 'S'
      AND BR.IDSTATUSBREC = 'E'
      AND BR.CDEMPRESA = E.CDEMPRESA
      AND BR.VRBAIXAREC <> 0
    ORDER BY BR.CDFILIAL, BR.NRBAIXAREC) LOOP

      GERA_LOTECONTABIL(C_BAIXA.CDEMPRESA, '11', '', '', C_BAIXA.DTBAIXAREC, C_BAIXA.CDTPBAIXAREC, '', V_CDLOTE, V_NRLANCLOTE);
      V_NRLANCLOTE := LPAD(TO_CHAR(TO_NUMBER(V_NRLANCLOTE) + 1), 6, '0');

      BEGIN
      SELECT H.CDHISTPADR, HP.DSHISTPADR
        INTO V_CDHISTPADRDB, V_DSHISTPADRDB
        FROM HISTINTEGRA H ,HISTPADR HP
       WHERE H.CDHISTPADR = HP.CDHISTPADR
         AND CDOPERACAO = 'BXDBRE';
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDHISTPADRDB := NULL;
         V_DSHISTPADRDB := NULL;
      END;

      BEGIN
      SELECT HP.CDHISTPADR, HP.DSHISTPADR
        INTO V_CDHISTPADRTPB, V_DSHISTPADRTPB
        FROM HISTPADR HP, TIPOBAIXAREC TB
       WHERE TB.CDTPBAIXAREC = C_BAIXA.CDTPBAIXAREC
         AND HP.CDHISTPADR = TB.CDHISTPADR;
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDHISTPADRTPB := NULL;
         V_DSHISTPADRTPB := NULL;
      END;

      IF V_CDHISTPADRDB IS NULL THEN
         V_CDHISTPADRDB := V_CDHISTPADRTPB;
         V_DSHISTPADRDB := 'RECEBIMENTO: '||C_BAIXA.NMTPBAIXAREC;
      ELSE
         /*MONTA HISTORICO PADRAO*/
         MONTA_HISTORICO(C_BAIXA.CDFILIAL, C_BAIXA.NRBAIXAREC, V_CDHISTPADRDB, '', C_BAIXA.DTBAIXAREC, '11', '', V_DSHISTPADRDB);
      END IF;

      SELECT NVL(SUM(VRLANCPARTBOREC),0) * (-1)
        INTO V_VRLANCPARTBOREC
        FROM HISPARTBOLEXREC
       WHERE CDFILIAL = C_BAIXA.CDFILIAL
         AND NRBAIXAREC = C_BAIXA.NRBAIXAREC;

      /*INSERE PARTIDA DE DEBITO*/
      NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, C_BAIXA.CDCONTCTBL, V_CDHISTPADRDB,
                   V_DSHISTPADRDB, ROUND(C_BAIXA.VRBAIXAREC + V_VRLANCPARTBOREC,2) * (-1), 'B', C_BAIXA.CDREDUCONT, '11', C_BAIXA.NRBAIXAREC, 'N');

      /*INSERE RATEIO*/
      RATEIO_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, C_BAIXA.CDFILIAL,
                     C_BAIXA.CDCENTCUST, ROUND(C_BAIXA.VRBAIXAREC + V_VRLANCPARTBOREC,2) * (-1));

      FOR C_CONTA IN (
      SELECT CR.CDFILIAL, CR.NRLANCTONF, CR.VRATUAREC, CL.CDCLIENTE,
             NF.NRNOTAFISC, NF.DTEMISSAO, TR.IDTPCTRECEBER, TR.DSTPCTRECEB,
             TR.CDCONTCTBL, FL.CDCENTCUST, NF.CDFILIEMIT
        FROM TIPOCTRECEBER TR, CONTARECEBER  CR, BOLETRECEBER  BO,
             CLIENTE CL, NOTAFISCAL  NF, FILIAL FL
       WHERE TR.CDTPCTRECEB  = CR.CDTPCTRECEB
         AND BO.CDFILIBAIREC = C_BAIXA.CDFILIAL
         AND BO.NRBAIXAREC = C_BAIXA.NRBAIXAREC
         AND CR.CDFILIBOLREC = BO.CDFILIAL
         AND CR.NRLANBOLREC = BO.NRLANBOLREC
         AND NF.CDCLIENTE = CL.CDCLIENTE
         AND NF.CDFILIAL = CR.CDFILIAL
         AND NF.NRLANCTONF = CR.NRLANCTONF
         AND NF.CDFILIEMIT = FL.CDFILIAL
         AND CR.VRATUAREC <> 0) LOOP

         CONTCTBL_CLIENTE(C_BAIXA.CDEMPRESA, '', 'S', C_CONTA.CDFILIEMIT, C_CONTA.CDCLIENTE, V_CDCONTCTBL, V_CDCONTCTBL1, V_CDCONTCTBL2, V_CDHISTPADRAUX);

         /*MONTA HISTORICO PADRAO*/
         MONTA_HISTORICO(C_CONTA.CDFILIAL, C_CONTA.NRLANCTONF, V_CDHISTPADRTPB, C_CONTA.NRNOTAFISC, C_CONTA.DTEMISSAO, '07', '', V_DSHISTPADRTPB);

         /*INSERE PARTIDA DE CREDITO*/
         NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, V_CDCONTCTBL, V_CDHISTPADRTPB,
                      V_DSHISTPADRTPB, ROUND(C_CONTA.VRATUAREC,2), 'C', C_CONTA.CDCLIENTE, '11', C_BAIXA.NRBAIXAREC, 'N');

         /*INSERE RATEIO*/
         RATEIO_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, C_CONTA.CDFILIEMIT,
                        NVL(C_CONTA.CDCENTCUST,C_BAIXA.CDCENTCUST), ROUND(C_CONTA.VRATUAREC,2) * (-1));
      END LOOP;

      V_CDCHAVE := 'X';

      FOR C_AJUSTE IN (
      SELECT TA.DSAJUCTREC, AR.CDAJUCTREC, AR.VRAJBOLREC,
             ROUND(AR.VRAJBOLREC * ROUND(CR.VRATUAREC/BO.VRBOLREC, 3), 2) VRAJBOLRAT,
             CR.CDFILIBOLREC, BO.NRLANBOLREC, CR.CDFILIAL, CR.NRLANCTONF, CL.CDCLIENTE,
             NF.CDFILIEMIT, NF.NRNOTAFISC, TA.IDAJUCTREC, TA.IDCTBAJCTREC, NF.CDEMPRESA,
             TA.CDCONTCTBL, FL.CDCENTCUST
        FROM TIPOAJRECEBER TA, AJBOLREC AR, CONTARECEBER CR,
             CLIENTE CL, NOTAFISCAL NF, FILIAL FL, BOLETRECEBER BO
       WHERE BO.CDFILIBAIREC = C_BAIXA.CDFILIAL
         AND BO.NRBAIXAREC = C_BAIXA.NRBAIXAREC
         AND CR.CDFILIBOLREC = BO.CDFILIAL
         AND CR.NRLANBOLREC = BO.NRLANBOLREC
         AND TA.CDAJUCTREC = AR.CDAJUCTREC
         AND AR.CDFILIAL = CR.CDFILIBOLREC
         AND AR.NRLANBOLREC = CR.NRLANBOLREC
         AND CL.CDCLIENTE = NF.CDCLIENTE
         AND NF.CDFILIAL = CR.CDFILIAL
         AND NF.NRLANCTONF = CR.NRLANCTONF
         AND NF.CDFILIEMIT = FL.CDFILIAL
       ORDER BY CR.CDFILIBOLREC, CR.NRLANBOLREC, AR.CDAJUCTREC) LOOP

         IF V_CDCHAVE <> C_AJUSTE.CDFILIBOLREC||C_AJUSTE.NRLANBOLREC||C_AJUSTE.CDAJUCTREC THEN
            V_VRRESTOAJUS := C_AJUSTE.VRAJBOLREC;
            V_CDCHAVE := C_AJUSTE.CDFILIBOLREC||C_AJUSTE.NRLANBOLREC||C_AJUSTE.CDAJUCTREC;

            SELECT COUNT(NRLANCTONF)
              INTO V_NRCOUNT
              FROM CONTARECEBER
             WHERE CDFILIBOLREC = C_AJUSTE.CDFILIBOLREC
               AND NRLANBOLREC = C_AJUSTE.NRLANBOLREC;

            V_NRPARTIDA := 1;
         END IF;

         IF V_NRCOUNT = 1 THEN
            V_VRAJBOLREC := C_AJUSTE.VRAJBOLREC;
            V_VRRESTOAJUS := 0;
         ELSIF V_NRPARTIDA = V_NRCOUNT THEN
            V_VRAJBOLREC := V_VRRESTOAJUS;
            V_VRRESTOAJUS := 0;
         ELSE
            V_VRRESTOAJUS := V_VRRESTOAJUS - C_AJUSTE.VRAJBOLRAT;
            V_VRAJBOLREC := C_AJUSTE.VRAJBOLRAT;
         END IF;

         BEGIN
         SELECT HP.CDHISTPADR, HP.DSHISTPADR
           INTO V_CDHISTPADRAJ, V_DSHISTPADRAJ
           FROM HISTPADR HP, TIPOAJRECEBER TA
          WHERE TA.CDAJUCTREC = C_AJUSTE.CDAJUCTREC
            AND HP.CDHISTPADR = TA.CDHISTPADR;
         EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDHISTPADRAJ := NULL;
            V_DSHISTPADRAJ := NULL;
         END;

         IF C_AJUSTE.IDAJUCTREC = 'D' THEN
            V_VRFATOCONV := -1;
         ELSE
            V_VRFATOCONV := 1;
         END IF;

         /*MONTA HISTORICO PADRAO*/
         MONTA_HISTORICO(C_AJUSTE.CDFILIAL, C_AJUSTE.NRLANCTONF, V_CDHISTPADRAJ, C_AJUSTE.NRNOTAFISC, NULL, '07', C_AJUSTE.CDAJUCTREC, V_DSHISTPADRAJ);

         IF C_AJUSTE.IDCTBAJCTREC = 'S' THEN
            V_CDCONTCTBL := C_AJUSTE.CDCONTCTBL;
         ELSE
            CONTCTBL_CLIENTE(C_BAIXA.CDEMPRESA, '', 'S', C_AJUSTE.CDFILIEMIT, C_AJUSTE.CDCLIENTE, V_CDCONTCTBL, V_CDCONTCTBL1, V_CDCONTCTBL2, V_CDHISTPADRAUX);
         END IF;

         /*INSERE PARTIDA*/
         NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, V_CDCONTCTBL, V_CDHISTPADRAJ,
                      V_DSHISTPADRAJ, ROUND(V_VRAJBOLREC * V_VRFATOCONV,2), 'B', C_BAIXA.CDREDUCONT, '11', C_BAIXA.NRBAIXAREC, 'N');

         V_NRPARTRAT := 1;
         V_VRRESTORAT := ROUND(V_VRAJBOLREC,2);
         V_VRAJBOLRAT := 0;

         SELECT COUNT(*)
           INTO V_NRCOUNTRAT
           FROM RATTPAJR
          WHERE CDAJUCTREC = C_AJUSTE.CDAJUCTREC;

         IF V_NRCOUNTRAT = 0 THEN
            /*INSERE RATEIO*/
            RATEIO_PARTIDA(C_AJUSTE.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, C_AJUSTE.CDFILIEMIT,
                           NVL(C_AJUSTE.CDCENTCUST, C_BAIXA.CDCENTCUST), ROUND(V_VRAJBOLREC * V_VRFATOCONV,2));
         ELSE
            FOR C_RATEIO IN (
            SELECT CDCENTCUST, CDFIRATTPAJR, CDFILIAL, VRPERATTPAJR
              FROM RATTPAJR
             WHERE CDAJUCTREC = C_AJUSTE.CDAJUCTREC) LOOP
               IF V_NRPARTRAT = V_NRCOUNTRAT THEN
                  V_VRRESTORAT := V_VRRESTORAT - ROUND(C_AJUSTE.VRAJBOLRAT * (C_RATEIO.VRPERATTPAJR/100),2);
                  V_VRAJBOLRAT := ROUND(C_AJUSTE.VRAJBOLRAT * (C_RATEIO.VRPERATTPAJR/100),2);

                  IF V_VRRESTORAT <> 0 THEN
                     V_VRAJBOLRAT := V_VRAJBOLRAT + V_VRRESTORAT;
                  END IF;
               ELSE
                  V_VRRESTORAT := V_VRRESTORAT - ROUND(C_AJUSTE.VRAJBOLRAT * (C_RATEIO.VRPERATTPAJR/100),2);
                  V_VRAJBOLRAT := ROUND(C_AJUSTE.VRAJBOLRAT * (C_RATEIO.VRPERATTPAJR/100),2);
               END IF;

               V_NRPARTRAT := V_NRPARTRAT + 1;

               /*INSERE RATEIO*/
               RATEIO_PARTIDA(C_AJUSTE.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, NVL(C_RATEIO.CDFILIAL, C_AJUSTE.CDFILIEMIT),
                              C_RATEIO.CDCENTCUST, ROUND(V_VRAJBOLRAT * V_VRFATOCONV,2));
            END LOOP;
         END IF;
         V_NRPARTIDA := V_NRPARTIDA + 1;
      END LOOP;

      FOR C_BAIXA_EXC IN (
      SELECT CDFILIAL, NRBAIXAREC, NRSEQPARTBOREC, NRLANCTBESTREC,
             CDCONTCTBL, CDHISTPADR, DSHISTPARTBOREC, VRLANCPARTBOREC,
             IDLANCCOMEBOREC, CDCONTCOMEBOREC
        FROM HISPARTBOLEXREC
       WHERE CDFILIAL = C_BAIXA.CDFILIAL
         AND NRBAIXAREC = C_BAIXA.NRBAIXAREC) LOOP

         /*INSERE PARTIDA*/
         NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, C_BAIXA_EXC.CDCONTCTBL, C_BAIXA_EXC.CDHISTPADR,
                      C_BAIXA_EXC.DSHISTPARTBOREC, C_BAIXA_EXC.VRLANCPARTBOREC, C_BAIXA_EXC.IDLANCCOMEBOREC, C_BAIXA_EXC.CDCONTCOMEBOREC, '11', C_BAIXA.NRBAIXAREC, 'N');

         FOR C_RATEIO_EXC IN (
         SELECT CDFILIAL, NRBAIXAREC, NRSEQPARTBOREC,
                CDFILCENTCUST, CDCENTCUST, VRRATEIOPABOREC
           FROM HISRAPABOLEXREC
          WHERE CDFILIAL = C_BAIXA.CDFILIAL
            AND NRBAIXAREC = C_BAIXA.NRBAIXAREC) LOOP

            /*INSERE RATEIO*/
            RATEIO_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAREC, V_NRLANCLOTE, C_RATEIO_EXC.CDFILCENTCUST,
                           C_RATEIO_EXC.CDCENTCUST, C_RATEIO_EXC.VRRATEIOPABOREC);
         END LOOP;
      END LOOP;

      INSERT INTO RELACBRECLANLOT
         (CDFILIAL, NRBAIXAREC, CDEMPRESA, CDLOTE, NRLANCLOTE, NRSEQLANLOTE)
      VALUES
         (C_BAIXA.CDFILIAL, C_BAIXA.NRBAIXAREC, C_BAIXA.CDEMPRESA, V_CDLOTE, V_NRLANCLOTE, '00001');

      IF CONFERE_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE, V_NRLANCLOTE, C_BAIXA.DTBAIXAREC) THEN
         UPDATE BAIXARECEBIDA
            SET IDSTATUSCTBREC = 'C'
          WHERE CDFILIAL = C_BAIXA.CDFILIAL
            AND NRBAIXAREC = C_BAIXA.NRBAIXAREC;
      ELSE
         UPDATE BAIXARECEBIDA
            SET IDSTATUSCTBREC = 'E'
          WHERE CDFILIAL = C_BAIXA.CDFILIAL
            AND NRBAIXAREC = C_BAIXA.NRBAIXAREC;
      END IF;

      COMMIT;
   END LOOP;

   DELETE
     FROM LISTA
    WHERE NRLISTA = P_NRLISTA;

END;
/

