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

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

   V_CDHISTPADRCR    HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTPADRCR    LANCLOTE.DSHISTLOTE%TYPE;
   V_CDHISTPADRADI   HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTPADRADI   LANCLOTE.DSHISTLOTE%TYPE;
   V_CDHISTPADRTPB   HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTPADRTPB   LANCLOTE.DSHISTLOTE%TYPE;
   V_CDHISTPADRAJ    HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTPADRAJ    LANCLOTE.DSHISTLOTE%TYPE;

   V_VRLANCPARTBOPAG HISPARTBOLEXPAG.VRLANCPARTBOPAG%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_VRAJBOLPAG      NUMERIC(15,5);
   V_VRRESTORAT      NUMERIC(15,5);
   V_VRAJBOLRAT      NUMERIC(15,5);
   V_VRFATOCONV      NUMERIC(15,5);

BEGIN
   EXCLUI_LANCCONTABIL('10', P_NRLISTA);

   FOR C_BAIXA IN (
   SELECT BP.CDFILIAL, BP.NRBAIXAPAG, BP.CDEMPRESA, BP.NRCHEQUE,
          BP.DTBAIXAPAG, BP.VRBAIXAPAG, BP.DSNOMCHEQUE, BP.CDTPBAIXAPAG,
          CC.CDREDUCONT, CC.CDBANCO, CC.CDAGENCIA, CC.CDCONTCORR, CC.DSCONTCORR,
          CC.CDCONTCTBL, TBP.IDBAIXAUTILP, TBP.NMTPBAIXAPAG, E.CDCENTCUST
     FROM TIPOBAIXAPAG TBP, CONTCORR CC, EMPRESA E, BAIXAPAGA BP, LISTA L
    WHERE L.NRLISTA = P_NRLISTA
      AND BP.CDFILIAL = SUBSTR(L.CDLISTA,1,4)
      AND BP.NRBAIXAPAG = SUBSTR(L.CDLISTA,5,10)
      AND BP.CDTPBAIXAPAG = TBP.CDTPBAIXAPAG
      AND CC.CDREDUCONT = BP.CDREDUCONT
      AND TBP.IDCTBLBXPAG = 'S'
      AND BP.IDSTATUSBPAG = 'E'
      AND BP.CDEMPRESA = E.CDEMPRESA
      AND BP.VRBAIXAPAG <> 0
    ORDER BY BP.CDFILIAL, BP.NRBAIXAPAG) LOOP

      GERA_LOTECONTABIL(C_BAIXA.CDEMPRESA, '10', '', '', C_BAIXA.DTBAIXAPAG, C_BAIXA.CDTPBAIXAPAG, '', V_CDLOTE, V_NRLANCLOTE);
      V_NRLANCLOTE := LPAD(TO_CHAR(TO_NUMBER(V_NRLANCLOTE) + 1), 6, '0');

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

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

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

      IF V_CDHISTPADRTPB IS NULL THEN
         BEGIN
         SELECT H.CDHISTPADR, HP.DSHISTPADR
           INTO V_CDHISTPADRTPB, V_DSHISTPADRTPB
           FROM HISTINTEGRA H ,HISTPADR HP
          WHERE H.CDHISTPADR = HP.CDHISTPADR
            AND CDOPERACAO = 'BAIXAP';
         EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDHISTPADRTPB := NULL;
            V_DSHISTPADRTPB := NULL;
         END;
      END IF;

      IF C_BAIXA.IDBAIXAUTILP IN ('A','M') THEN
         IF V_CDHISTPADRCR IS NULL THEN
            V_CDHISTPADRCR := V_CDHISTPADRTPB;
            V_DSHISTPADRCR := 'Cheque: '||C_BAIXA.NRCHEQUE;
         END IF;
      ELSE
         IF V_CDHISTPADRCR IS NULL THEN
            V_CDHISTPADRCR := V_CDHISTPADRTPB;
            V_DSHISTPADRCR := 'PAGTO: '||C_BAIXA.NMTPBAIXAPAG;
         ELSE
            /*MONTA HISTORICO PADRAO*/
            MONTA_HISTORICO(C_BAIXA.CDFILIAL, C_BAIXA.NRBAIXAPAG, V_CDHISTPADRCR, '', C_BAIXA.DTBAIXAPAG, '10', '', V_DSHISTPADRCR);
         END IF;
      END IF;

      SELECT NVL(SUM(VRLANCPARTBOPAG),0) * (-1)
        INTO V_VRLANCPARTBOPAG
        FROM HISPARTBOLEXPAG
       WHERE CDFILIAL = C_BAIXA.CDFILIAL
         AND NRBAIXAPAG = C_BAIXA.NRBAIXAPAG;

      /*INSERE PARTIDA DE CREDITO*/
      NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, C_BAIXA.CDCONTCTBL, V_CDHISTPADRCR,
                   V_DSHISTPADRCR, ROUND(C_BAIXA.VRBAIXAPAG + V_VRLANCPARTBOPAG,2), 'B', C_BAIXA.CDREDUCONT, '10', C_BAIXA.NRBAIXAPAG, 'N');

      /*INSERE RATEIO*/
      RATEIO_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, C_BAIXA.CDFILIAL,
                     C_BAIXA.CDCENTCUST, ROUND(C_BAIXA.VRBAIXAPAG + V_VRLANCPARTBOPAG,2));

      FOR C_CONTA IN (
      SELECT CP.CDFILIAL, CP.NRLANCTONF, CP.VRATUAPAG, FO.CDFORNECED,
             NF.NRNOTAFISC, NF.DTEMISSAO, TP.IDTPCTPAGAR, TP.DSTPCTPAGAR,
             TP.CDCONTCTBL, TP.IDCTBTPCNTBPAG, FL.CDCENTCUST, NF.CDFILIRECE
        FROM TIPOCTPAGAR TP, CONTAPAGAR  CP, BOLETPAGAR  BO,
             FORNECEDOR  FO, NOTAFISCAL  NF, FILIAL FL
       WHERE TP.CDTPCTPAGAR  = CP.CDTPCTPAGAR
         AND BO.CDFILIBAIPAG = C_BAIXA.CDFILIAL
         AND BO.NRBAIXAPAG = C_BAIXA.NRBAIXAPAG
         AND CP.CDFILIBPAG = BO.CDFILIAL
         AND CP.NRLANBOLPAG = BO.NRLANBOLPAG
         AND NF.CDFORNECED = FO.CDFORNECED
         AND NF.CDFILIAL = CP.CDFILIAL
         AND NF.NRLANCTONF = CP.NRLANCTONF
         AND NF.CDFILIRECE = FL.CDFILIAL
         AND CP.VRATUAPAG <> 0) LOOP

         IF C_CONTA.IDTPCTPAGAR = '2' THEN
            /*MONTA HISTORICO PADRAO*/
            MONTA_HISTORICO(C_CONTA.CDFILIAL, C_CONTA.NRLANCTONF, V_CDHISTPADRADI, C_CONTA.NRNOTAFISC, C_CONTA.DTEMISSAO, '06', '', V_DSHISTPADRADI);

            /*INSERE PARTIDA DE DEBITO*/
            NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, C_CONTA.CDCONTCTBL, V_CDHISTPADRADI,
                         V_DSHISTPADRADI, ROUND(C_CONTA.VRATUAPAG,2) * (-1), 'F', C_CONTA.CDFORNECED, '10', C_BAIXA.NRBAIXAPAG, 'N');

            /*INSERE RATEIO*/
            RATEIO_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, C_CONTA.CDFILIRECE,
                           NVL(C_CONTA.CDCENTCUST,C_BAIXA.CDCENTCUST), ROUND(C_CONTA.VRATUAPAG,2) * (-1));
         ELSE
            IF C_CONTA.IDCTBTPCNTBPAG = 'S' THEN
               V_CDCONTCTBL := C_CONTA.CDCONTCTBL;
            ELSE
               CONTCTBL_FORNECEDOR(C_BAIXA.CDEMPRESA, '', 'E', C_CONTA.CDFILIRECE, C_CONTA.CDFORNECED, V_CDCONTCTBL, V_CDCONTCTBL1, V_CDCONTCTBL2, V_CDHISTPADRAUX);
            END IF;

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

            /*INSERE PARTIDA DE DEBITO*/
            NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, V_CDCONTCTBL, V_CDHISTPADRTPB,
                         V_DSHISTPADRTPB, ROUND(C_CONTA.VRATUAPAG,2) * (-1), 'F', C_CONTA.CDFORNECED, '10', C_BAIXA.NRBAIXAPAG, 'N');

            /*INSERE RATEIO*/
            RATEIO_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, C_CONTA.CDFILIRECE,
                           NVL(C_CONTA.CDCENTCUST,C_BAIXA.CDCENTCUST), ROUND(C_CONTA.VRATUAPAG,2) * (-1));
         END IF;
      END LOOP;

      V_CDCHAVE := 'X';

      FOR C_AJUSTE IN (
      SELECT TA.DSAJUCTPAG, AP.CDAJUCTPAG, AP.VRAJBOLPAG,
             ROUND(AP.VRAJBOLPAG * ROUND(CP.VRATUAPAG/BO.VRBOLPAG, 3), 2) VRAJBOLRAT,
             CP.CDFILIBPAG, BO.NRLANBOLPAG, CP.CDFILIAL, CP.NRLANCTONF, FO.CDFORNECED,
             NF.CDFILIRECE, NF.NRNOTAFISC, TA.IDAJUCTPAG, TA.IDCTBAJCTPAG, NF.CDEMPRESA,
             TA.CDCONTCTBL, FL.CDCENTCUST
        FROM TIPOAJPAGAR TA, AJBOLPAG AP, CONTAPAGAR CP,
             FORNECEDOR FO, NOTAFISCAL NF, FILIAL FL, BOLETPAGAR BO
       WHERE BO.CDFILIBAIPAG = C_BAIXA.CDFILIAL
         AND BO.NRBAIXAPAG = C_BAIXA.NRBAIXAPAG
         AND CP.CDFILIBPAG = BO.CDFILIAL
         AND CP.NRLANBOLPAG = BO.NRLANBOLPAG
         AND TA.CDAJUCTPAG = AP.CDAJUCTPAG
         AND AP.CDFILIAL = CP.CDFILIBPAG
         AND AP.NRLANBOLPAG = CP.NRLANBOLPAG
         AND FO.CDFORNECED = NF.CDFORNECED
         AND NF.CDFILIAL = CP.CDFILIAL
         AND NF.NRLANCTONF = CP.NRLANCTONF
         AND NF.CDFILIRECE = FL.CDFILIAL
       ORDER BY CP.CDFILIBPAG, CP.NRLANBOLPAG, AP.CDAJUCTPAG) LOOP

         IF V_CDCHAVE <> C_AJUSTE.CDFILIBPAG||C_AJUSTE.NRLANBOLPAG||C_AJUSTE.CDAJUCTPAG THEN
            V_VRRESTOAJUS := C_AJUSTE.VRAJBOLPAG;
            V_CDCHAVE := C_AJUSTE.CDFILIBPAG||C_AJUSTE.NRLANBOLPAG||C_AJUSTE.CDAJUCTPAG;

            SELECT COUNT(NRLANCTONF)
              INTO V_NRCOUNT
              FROM CONTAPAGAR
             WHERE CDFILIBPAG = C_AJUSTE.CDFILIBPAG
               AND NRLANBOLPAG = C_AJUSTE.NRLANBOLPAG;

            V_NRPARTIDA := 1;
         END IF;

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

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

         IF C_AJUSTE.IDAJUCTPAG = '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, '06', C_AJUSTE.CDAJUCTPAG, V_DSHISTPADRAJ);

         IF C_AJUSTE.IDCTBAJCTPAG = 'S' THEN
            V_CDCONTCTBL := C_AJUSTE.CDCONTCTBL;
         ELSE
            CONTCTBL_FORNECEDOR(C_BAIXA.CDEMPRESA, '', 'E', C_AJUSTE.CDFILIRECE, C_AJUSTE.CDFORNECED, V_CDCONTCTBL, V_CDCONTCTBL1, V_CDCONTCTBL2, V_CDHISTPADRAUX);
         END IF;

         /*INSERE PARTIDA*/
         NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, V_CDCONTCTBL, V_CDHISTPADRAJ,
                      V_DSHISTPADRAJ, ROUND(V_VRAJBOLPAG * V_VRFATOCONV,2), 'B', C_BAIXA.CDREDUCONT, '10', C_BAIXA.NRBAIXAPAG, 'N');

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

         SELECT COUNT(*)
           INTO V_NRCOUNTRAT
           FROM RATTPAJP
          WHERE CDAJUCTPAG = C_AJUSTE.CDAJUCTPAG;

         IF V_NRCOUNTRAT = 0 THEN
            /*INSERE RATEIO*/
            RATEIO_PARTIDA(C_AJUSTE.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, C_AJUSTE.CDFILIRECE,
                           NVL(C_AJUSTE.CDCENTCUST, C_BAIXA.CDCENTCUST), ROUND(V_VRAJBOLPAG * V_VRFATOCONV,2));
         ELSE
            FOR C_RATEIO IN (
            SELECT CDCENTCUST, CDFIRATTPAJP, CDFILIAL, VRPERATTPAJP
              FROM RATTPAJP
             WHERE CDAJUCTPAG = C_AJUSTE.CDAJUCTPAG) LOOP
               IF V_NRPARTRAT = V_NRCOUNTRAT THEN
                  V_VRRESTORAT := V_VRRESTORAT - ROUND(C_AJUSTE.VRAJBOLRAT * (C_RATEIO.VRPERATTPAJP/100),2);
                  V_VRAJBOLRAT := ROUND(C_AJUSTE.VRAJBOLRAT * (C_RATEIO.VRPERATTPAJP/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.VRPERATTPAJP/100),2);
                  V_VRAJBOLRAT := ROUND(C_AJUSTE.VRAJBOLRAT * (C_RATEIO.VRPERATTPAJP/100),2);
               END IF;

               V_NRPARTRAT := V_NRPARTRAT + 1;

               /*INSERE RATEIO*/
               RATEIO_PARTIDA(C_AJUSTE.CDEMPRESA, V_CDLOTE, C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, NVL(C_RATEIO.CDFILIAL, C_AJUSTE.CDFILIRECE),
                              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, NRBAIXAPAG, NRSEQPARTBOPAG, NRLANCTBESTPAG,
             CDCONTCTBL, CDHISTPADR, DSHISTPARTBOPAG, VRLANCPARTBOPAG,
             IDLANCCOMEBOPAG, CDCONTCOMEBOPAG
        FROM HISPARTBOLEXPAG
       WHERE CDFILIAL = C_BAIXA.CDFILIAL
         AND NRBAIXAPAG = C_BAIXA.NRBAIXAPAG) LOOP

         /*INSERE PARTIDA*/
         NOVA_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE , C_BAIXA.DTBAIXAPAG, V_NRLANCLOTE, C_BAIXA_EXC.CDCONTCTBL, C_BAIXA_EXC.CDHISTPADR,
                      C_BAIXA_EXC.DSHISTPARTBOPAG, C_BAIXA_EXC.VRLANCPARTBOPAG, C_BAIXA_EXC.IDLANCCOMEBOPAG, C_BAIXA_EXC.CDCONTCOMEBOPAG, '10', C_BAIXA.NRBAIXAPAG, 'N');

         FOR C_RATEIO_EXC IN (
         SELECT CDFILIAL, NRBAIXAPAG, NRSEQPARTBOPAG,
                CDFILCENTCUST, CDCENTCUST, VRRATEIOPABOPAG
           FROM HISRAPABOLEXPAG
          WHERE CDFILIAL = C_BAIXA.CDFILIAL
            AND NRBAIXAPAG = C_BAIXA.NRBAIXAPAG) LOOP

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

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


      IF CONFERE_PARTIDA(C_BAIXA.CDEMPRESA, V_CDLOTE, V_NRLANCLOTE, C_BAIXA.DTBAIXAPAG) THEN
         UPDATE BAIXAPAGA
            SET IDSTATUSCTBPAG = 'C'
          WHERE CDFILIAL = C_BAIXA.CDFILIAL
            AND NRBAIXAPAG = C_BAIXA.NRBAIXAPAG;
      ELSE
         UPDATE BAIXAPAGA
            SET IDSTATUSCTBPAG = 'E'
          WHERE CDFILIAL = C_BAIXA.CDFILIAL
            AND NRBAIXAPAG = C_BAIXA.NRBAIXAPAG;
      END IF;

      COMMIT;
   END LOOP;

   DELETE
     FROM LISTA
    WHERE NRLISTA = P_NRLISTA;
END;
/

