CREATE OR REPLACE PROCEDURE GRAVA_BAIXA_IMPOSTO(P_CDFILIAL   IN FILIAL.CDFILIAL%TYPE DEFAULT NULL,
                                                P_NRBAIXA    IN BAIXARECEBIDA.NRBAIXAREC%TYPE DEFAULT NULL,
                                                P_CDREDUCONT IN MOVDEBBANC.CDREDUCONT%TYPE DEFAULT NULL,
                                                P_NRMOVIDEBI IN MOVDEBBANC.NRMOVIDEBI%TYPE DEFAULT NULL,
                                                P_IDOPERACAO IN VARCHAR2)
AS
   V_VALORPROP   FLOAT;
   V_VALORPROPBC FLOAT;
   V_NOVOCODIGO  VARCHAR2(20);
   V_VRCONTA     FLOAT;
   V_VRBOLETO    FLOAT;
BEGIN
   /*BAIXA RECEBIDA*/
   IF P_IDOPERACAO = 'R' THEN
      FOR C_BOLETOS IN (SELECT IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT AS CDFISCALNF, IM.VRALIQITEM AS VRALIQNF,
                               ROUND(SUM(IM.VRCONTITIMP),2) AS VRCONTABIL, ROUND(SUM(IM.VRBASECALCIT),2) AS VRBASECALC, NF.VRNOTAFISC, CR.VRORIGREC AS VRORIGREC,
                               BR.DTBAIXAREC, BO.NRLANBOLREC, BR.CDFILIAL AS CDFILIBAIXA, BR.NRBAIXAREC, IM.CDFISCOPERIT AS CDFISCOPERNF,
                               IM.CDSITUTRIBITNFE, BO.CDFILIAL AS CDFILIBOLREC, IM.CDTPCREDPICOITE, IM.CDNATUREC
                          FROM NOTAFISCAL NF, ITEMPROIMPOS IM, CONTARECEBER CR, BAIXARECEBIDA BR, BOLETRECEBER BO
                         WHERE BR.CDFILIAL     = P_CDFILIAL
                           AND BR.NRBAIXAREC   = P_NRBAIXA
                           AND BR.IDSTATUSBREC = 'E'
                           AND BR.CDFILIAL     = BO.CDFILIBAIREC
                           AND BR.NRBAIXAREC   = BO.NRBAIXAREC
                           AND BO.CDFILIAL     = CR.CDFILIBOLREC
                           AND BO.NRLANBOLREC  = CR.NRLANBOLREC
                           AND NF.CDFILIAL     = CR.CDFILIAL
                           AND NF.NRLANCTONF   = CR.NRLANCTONF
                           AND IM.CDFILIAL     = CR.CDFILIAL
                           AND IM.NRLANCTONF   = CR.NRLANCTONF
                           AND IM.NRITPROIMPOS = '1'
                         GROUP BY IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT, IM.VRALIQITEM,
                               NF.VRNOTAFISC, BR.DTBAIXAREC, BO.NRLANBOLREC, BR.CDFILIAL, CR.VRORIGREC,
                               BR.NRBAIXAREC, IM.CDFISCOPERIT, IM.CDSITUTRIBITNFE, BO.CDFILIAL, IM.CDTPCREDPICOITE, IM.CDNATUREC
                         UNION
                        SELECT IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT AS CDFISCALNF, IM.VRALIQITEM AS VRALIQNF,
                               ROUND(SUM(IM.VRCONTITIMP),2) AS VRCONTABIL, ROUND(SUM(IM.VRBASECALCIT),2) AS VRBASECALC, NF.VRNOTAFISC, DV.VRDEVOLUCAOREC AS VRORIGREC,
                               BR.DTBAIXAREC, BO.NRLANBOLREC, BR.CDFILIAL AS CDFILIBAIXA, BR.NRBAIXAREC, IM.CDFISCOPERIT AS CDFISCOPERNF,
                               IM.CDSITUTRIBITNFE, BO.CDFILIAL AS CDFILIBOLREC, CDTPCREDPICOITE , IM.CDNATUREC
                          FROM NOTAFISCAL NF, ITEMPROIMPOS IM, DEVOLUCAOREC DV, BAIXARECEBIDA BR, BOLETRECEBER BO
                         WHERE BR.CDFILIAL     = P_CDFILIAL
                           AND BR.NRBAIXAREC   = P_NRBAIXA
                           AND BR.IDSTATUSBREC = 'E'
                           AND BR.CDFILIAL     = BO.CDFILIBAIREC
                           AND BR.NRBAIXAREC   = BO.NRBAIXAREC
                           AND BO.CDFILIAL     = DV.CDFILIBOLREC
                           AND BO.NRLANBOLREC  = DV.NRLANBOLREC
                           AND NF.CDFILIAL     = DV.CDFILIAL
                           AND NF.NRLANCTONF   = DV.NRLANCTONF
                           AND IM.CDFILIAL     = DV.CDFILIAL
                           AND IM.NRLANCTONF   = DV.NRLANCTONF
                           AND IM.NRITPROIMPOS = '1'
                         GROUP BY IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT, IM.VRALIQITEM,
                               NF.VRNOTAFISC, BR.DTBAIXAREC, BO.NRLANBOLREC, BR.CDFILIAL, DV.VRDEVOLUCAOREC,
                               BR.NRBAIXAREC, IM.CDFISCOPERIT, IM.CDSITUTRIBITNFE, BO.CDFILIAL, IM.CDTPCREDPICOITE, IM.CDNATUREC
                         UNION
                        /*SELECT PARA CONSIDERAR AS VENDAS POR RECEBIMENTO NO REGIME DE CAIXA*/
                         SELECT NF.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT AS CDFISCALNF, IM.VRALIQIT AS VRALIQNF,
                               ROUND(SUM(IM.VRPRODUTO),2) AS VRCONTABIL, ROUND(SUM(DECODE(IM.CDFISCALIT,'1',IM.VRPRODUTO,0)),2) AS VRBASECALC, NF.VRNOTAFISC, CR.VRORIGREC AS VRORIGREC,
                               BR.DTBAIXAREC, BO.NRLANBOLREC, BR.CDFILIAL AS CDFILIBAIXA, BR.NRBAIXAREC, IM.CDFISCOPERSN AS CDFISCOPERNF,
                               IM.CDSITUTRIBNFE AS CDSITUTRIBITNFE, BO.CDFILIAL AS CDFILIBOLREC, IM.CDTPCRPICOSTNFE AS CDTPCREDPICOITE, IM.CDNATUREC
                          FROM NOTAFISCAL NF, ITEMVENOUTIMPOSCX IM, CONTARECEBER CR, BAIXARECEBIDA BR, BOLETRECEBER BO
                         WHERE BR.CDFILIAL     = P_CDFILIAL
                           AND BR.NRBAIXAREC   = P_NRBAIXA
                           AND BR.IDSTATUSBREC = 'E'
                           AND BR.CDFILIAL     = BO.CDFILIBAIREC
                           AND BR.NRBAIXAREC   = BO.NRBAIXAREC
                           AND BO.CDFILIAL     = CR.CDFILIBOLREC
                           AND BO.NRLANBOLREC  = CR.NRLANBOLREC
                           AND NF.CDFILIAL     = CR.CDFILIAL
                           AND NF.NRLANCTONF   = CR.NRLANCTONF
                           AND IM.CDFILIALNF    = CR.CDFILIAL
                           AND IM.NRLANCTONF   = CR.NRLANCTONF
                         GROUP BY NF.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT, IM.VRALIQIT,
                               NF.VRNOTAFISC, BR.DTBAIXAREC, BO.NRLANBOLREC, BR.CDFILIAL, CR.VRORIGREC,
                               BR.NRBAIXAREC, IM.CDFISCOPERSN, IM.CDSITUTRIBNFE, BO.CDFILIAL, IM.CDTPCRPICOSTNFE, IM.CDNATUREC
                         ORDER BY CDFILIAL, NRLANCTONF, CDIMPOSTO) LOOP

         /*BUSCA O VALOR TOTAL DAS CONTAS REFERENTES A ESSA NF, PARA COMPARAR COM O VALOR DA NOTA FISCAL*/
         BEGIN
			   SELECT SUM(VRORIGREC)
			     INTO V_VRCONTA
              FROM (SELECT CR.VRORIGREC AS VRORIGREC
                      FROM CONTARECEBER CR
                     WHERE CR.CDFILIAL   = C_BOLETOS.CDFILIAL
                       AND CR.NRLANCTONF = C_BOLETOS.NRLANCTONF
                     UNION ALL
                    SELECT DV.VRDEVOLUCAOREC AS VRORIGREC
                      FROM DEVOLUCAOREC DV
                     WHERE DV.CDFILIAL   = C_BOLETOS.CDFILIAL
                       AND DV.NRLANCTONF = C_BOLETOS.NRLANCTONF);
		   EXCEPTION
		      WHEN NO_DATA_FOUND THEN
			      V_VRCONTA := 0;
         END;

         /*NO CASO DE IMPOSTO RETIDO NA FONTE PARAMETRIZADO PARA RETER NO DOCUMENTO, O VRORIGREC FICA DIFERENTE DO VALOR DA NOTA,
           GERANDO BASE DE CALCULO MENOR */
         IF (V_VRCONTA <> C_BOLETOS.VRNOTAFISC) AND (V_VRCONTA > 0) THEN
            V_VRBOLETO := (C_BOLETOS.VRNOTAFISC * C_BOLETOS.VRORIGREC)/V_VRCONTA;
         ELSE
            V_VRBOLETO := C_BOLETOS.VRORIGREC;
         END IF;

         /*CALCULA O VALOR CONTABIL PROPORCIONAL AO VALOR RECEBIDO*/
         IF C_BOLETOS.VRNOTAFISC = V_VRBOLETO THEN
            V_VALORPROP := C_BOLETOS.VRCONTABIL;
         ELSE
            IF C_BOLETOS.VRNOTAFISC > 0 THEN
               V_VALORPROP := (((C_BOLETOS.VRCONTABIL * 100)/C_BOLETOS.VRNOTAFISC)/100)*V_VRBOLETO;
            ELSE
               V_VALORPROP := 0;
            END IF;
         END IF;

         /*CALCULA O VALOR DA BASE DE CALCULO PROPORCIONAL AO VALOR RECEBIDO*/
         IF C_BOLETOS.VRBASECALC = C_BOLETOS.VRCONTABIL THEN
            V_VALORPROPBC := V_VALORPROP;
         ELSE
            IF C_BOLETOS.VRCONTABIL > 0 THEN
               V_VALORPROPBC := (((C_BOLETOS.VRBASECALC * 100)/C_BOLETOS.VRCONTABIL)/100)*V_VALORPROP;
            ELSE
               V_VALORPROPBC := 0;
            END IF;
         END IF;

         NOVO_CODIGO_NT('IMPBAIXAREC', V_NOVOCODIGO);
         V_NOVOCODIGO := SUBSTR(V_NOVOCODIGO,11,10);

         INSERT INTO IMPBAIXAREC
            (NRSEQUENCIAL, CDFILIBAIXA, NRBAIXAREC, CDFILIAL, NRLANCTONF,
             NRLANBOLREC, CDFILIBOLREC, CDIMPOSTO, CDFISCALNF, NRSEQUMAPAPU, VRORIGREC,
             DTBAIXAREC, VRPROPREC, VRPROPRECBC, VRALIQNF, CDFISCOPERNF,
             CDSITUTRIBITNFE, CDTPCREDPICOITE, CDNATUREC)
         VALUES
            (V_NOVOCODIGO, C_BOLETOS.CDFILIBAIXA, C_BOLETOS.NRBAIXAREC, C_BOLETOS.CDFILIAL, C_BOLETOS.NRLANCTONF,
             C_BOLETOS.NRLANBOLREC, C_BOLETOS.CDFILIBOLREC, C_BOLETOS.CDIMPOSTO, C_BOLETOS.CDFISCALNF, NULL, V_VRBOLETO,
             C_BOLETOS.DTBAIXAREC, V_VALORPROP, V_VALORPROPBC, C_BOLETOS.VRALIQNF, C_BOLETOS.CDFISCOPERNF,
             C_BOLETOS.CDSITUTRIBITNFE, C_BOLETOS.CDTPCREDPICOITE, C_BOLETOS.CDNATUREC);
      END LOOP;
   END IF;

   /*DEVOLUCAO - DEBITO EM CONTA (BCO - PROCEDURE E EXECUTADA PELA TELA BCO11100*/
   IF P_IDOPERACAO = 'D' THEN
      FOR C_BOLETOS IN (SELECT IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT AS CDFISCALNF, IM.VRALIQITEM AS VRALIQNF,
                               SUM(IM.VRCONTITIMP) AS VRCONTABIL,  SUM(IM.VRBASECALCIT) AS VRBASECALC, NF.VRNOTAFISC,
                               DV.VRDEVOLUCAOREC AS VRORIGREC, MV.DTMOVIDEBI AS DTBAIXAREC, DV.CDFILIAL AS CDFILIBAIXA,
                               IM.CDFISCOPERIT AS CDFISCOPERNF, IM.CDSITUTRIBITNFE, MV.CDREDUCONT, MV.NRMOVIDEBI,
                               IM.CDTPCREDPICOITE, IM.CDNATUREC
                          FROM NOTAFISCAL NF, ITEMPROIMPOS IM, DEVOLUCAOREC DV, MOVDEBBANC MV
                         WHERE DV.CDREDUCONT   = P_CDREDUCONT
                           AND DV.NRMOVIDEBI   = P_NRMOVIDEBI
                           AND MV.CDREDUCONT   = DV.CDREDUCONT
                           AND MV.NRMOVIDEBI   = DV.NRMOVIDEBI
                           AND NF.CDFILIAL     = DV.CDFILIAL
                           AND NF.NRLANCTONF   = DV.NRLANCTONF
                           AND IM.CDFILIAL     = NF.CDFILIAL
                           AND IM.NRLANCTONF   = NF.NRLANCTONF
                           AND IM.NRITPROIMPOS = '1'
                         GROUP BY IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT, IM.VRALIQITEM,
                               NF.VRNOTAFISC, MV.DTMOVIDEBI, DV.CDFILIAL, DV.VRDEVOLUCAOREC,
                               IM.CDFISCOPERIT, IM.CDSITUTRIBITNFE, MV.CDREDUCONT, MV.NRMOVIDEBI,
                               IM.CDTPCREDPICOITE, IM.CDNATUREC
                         ORDER BY CDFILIAL, NRLANCTONF, CDIMPOSTO) LOOP

         /*BUSCA O VALOR TOTAL DAS CONTAS REFERENTES A ESSA NF, PARA COMPARAR COM O VALOR DA NOTA FISCAL*/
         BEGIN
			   SELECT SUM(VRORIGREC)
			     INTO V_VRCONTA
              FROM (SELECT DV.VRDEVOLUCAOREC AS VRORIGREC
                      FROM DEVOLUCAOREC DV
                     WHERE DV.CDFILIAL   = C_BOLETOS.CDFILIAL
                       AND DV.NRLANCTONF = C_BOLETOS.NRLANCTONF);
		   EXCEPTION
		      WHEN NO_DATA_FOUND THEN
			      V_VRCONTA := 0;
         END;

         /*NO CASO DE IMPOSTO RETIDO NA FONTE PARAMETRIZADO PARA RETER NO DOCUMENTO, O VRORIGREC FICA DIFERENTE DO VALOR DA NOTA,
           GERANDO BASE DE CALCULO MENOR */
         IF (V_VRCONTA <> C_BOLETOS.VRNOTAFISC) AND (V_VRCONTA > 0) THEN
            V_VRBOLETO := (C_BOLETOS.VRNOTAFISC * C_BOLETOS.VRORIGREC)/V_VRCONTA;
         ELSE
            V_VRBOLETO := C_BOLETOS.VRORIGREC;
         END IF;

         /*CALCULA O VALOR CONTABIL PROPORCIONAL AO VALOR RECEBIDO*/
         IF C_BOLETOS.VRNOTAFISC = V_VRBOLETO THEN
            V_VALORPROP := C_BOLETOS.VRCONTABIL;
         ELSE
            IF C_BOLETOS.VRNOTAFISC > 0 THEN
               V_VALORPROP := (((C_BOLETOS.VRCONTABIL * 100)/C_BOLETOS.VRNOTAFISC)/100)*V_VRBOLETO;
            ELSE
               V_VALORPROP := 0;
            END IF;
         END IF;

         /*CALCULA O VALOR DA BASE DE CALCULO PROPORCIONAL AO VALOR RECEBIDO*/
         IF C_BOLETOS.VRBASECALC = C_BOLETOS.VRCONTABIL THEN
            V_VALORPROPBC := V_VALORPROP;
         ELSE
            IF C_BOLETOS.VRCONTABIL > 0 THEN
               V_VALORPROPBC := (((C_BOLETOS.VRBASECALC * 100)/C_BOLETOS.VRCONTABIL)/100)*V_VALORPROP;
            ELSE
               V_VALORPROPBC := 0;
            END IF;
         END IF;

         NOVO_CODIGO_NT('IMPBAIXAREC', V_NOVOCODIGO);
         V_NOVOCODIGO := SUBSTR(V_NOVOCODIGO,11,10);

         INSERT INTO IMPBAIXAREC
            (NRSEQUENCIAL, CDFILIBAIXA, NRBAIXAREC, CDFILIAL, NRLANCTONF, NRLANBOLREC, CDFILIBOLREC,
             CDIMPOSTO, CDFISCALNF, NRSEQUMAPAPU, VRORIGREC, DTBAIXAREC, VRPROPREC, VRPROPRECBC,
             VRALIQNF, CDFISCOPERNF, CDSITUTRIBITNFE, CDREDUCONT, NRMOVIDEBI,
             CDTPCREDPICOITE, CDNATUREC)
         VALUES
            (V_NOVOCODIGO, C_BOLETOS.CDFILIBAIXA, NULL, C_BOLETOS.CDFILIAL, C_BOLETOS.NRLANCTONF, NULL, NULL,
             C_BOLETOS.CDIMPOSTO, C_BOLETOS.CDFISCALNF, NULL, V_VRBOLETO, C_BOLETOS.DTBAIXAREC, V_VALORPROP, V_VALORPROPBC,
             C_BOLETOS.VRALIQNF, C_BOLETOS.CDFISCOPERNF, C_BOLETOS.CDSITUTRIBITNFE, C_BOLETOS.CDREDUCONT, C_BOLETOS.NRMOVIDEBI,
             C_BOLETOS.CDTPCREDPICOITE, C_BOLETOS.CDNATUREC);
      END LOOP;
   END IF;

   /*BAIXA PAGAMENTO*/
   IF P_IDOPERACAO = 'P' THEN
      FOR C_BOLETOS IN (SELECT IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT AS CDFISCALNF, IM.VRALIQITEM AS VRALIQNF,
                               SUM(IM.VRCONTITIMP) AS VRCONTABIL, SUM(IM.VRBASECALCIT) AS VRBASECALC, NF.VRNOTAFISC,
                               CR.VRORIGPAG AS VRORIGREC, BR.DTBAIXAPAG AS DTBAIXAREC, BO.NRLANBOLPAG, BR.CDFILIAL AS CDFILIBAIXAPAG,
                               BR.NRBAIXAPAG, IM.CDFISCOPERIT AS CDFISCOPERNF, IM.CDSITUTRIBITNFE, BO.CDFILIAL AS CDFILIBOLPAG,
                               IM.CDTPCREDPICOITE, IM.CDNATUREC
                          FROM NOTAFISCAL NF, ITEMPROIMPOS IM, CONTAPAGAR CR, BAIXAPAGA BR, BOLETPAGAR BO
                         WHERE BR.CDFILIAL     = P_CDFILIAL
                           AND BR.NRBAIXAPAG   = P_NRBAIXA
                           AND BR.IDSTATUSBPAG = 'E'
                           AND BR.CDFILIAL     = BO.CDFILIBAIPAG
                           AND BR.NRBAIXAPAG   = BO.NRBAIXAPAG
                           AND BO.CDFILIAL     = CR.CDFILIBPAG
                           AND BO.NRLANBOLPAG  = CR.NRLANBOLPAG
                           AND NF.CDFILIAL     = CR.CDFILIAL
                           AND NF.NRLANCTONF   = CR.NRLANCTONF
                           AND IM.CDFILIAL     = CR.CDFILIAL
                           AND IM.NRLANCTONF   = CR.NRLANCTONF
                           AND IM.NRITPROIMPOS = '1'
                         GROUP BY IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT, IM.VRALIQITEM, NF.VRNOTAFISC,
                               BR.DTBAIXAPAG, BO.NRLANBOLPAG, BR.CDFILIAL, CR.VRORIGPAG, BR.NRBAIXAPAG, IM.CDFISCOPERIT,
                               IM.CDSITUTRIBITNFE, BO.CDFILIAL, IM.CDTPCREDPICOITE, IM.CDNATUREC
                         UNION
                        SELECT IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT AS CDFISCALNF, IM.VRALIQITEM AS VRALIQNF,
                               SUM(IM.VRCONTITIMP) AS VRCONTABIL, SUM(IM.VRBASECALCIT) AS VRBASECALC, NF.VRNOTAFISC,
                               DV.VRDEVOLUCAOPAG AS VRORIGREC, BR.DTBAIXAPAG AS DTBAIXAREC, BO.NRLANBOLPAG, BR.CDFILIAL AS CDFILIBAIXAPAG,
                               BR.NRBAIXAPAG, IM.CDFISCOPERIT AS CDFISCOPERNF, IM.CDSITUTRIBITNFE, BO.CDFILIAL AS CDFILIBOLPAG,
                               IM.CDTPCREDPICOITE, IM.CDNATUREC
                          FROM NOTAFISCAL NF, ITEMPROIMPOS IM, DEVOLUCAOPAG DV, BAIXAPAGA BR, BOLETPAGAR BO
                         WHERE BR.CDFILIAL     = P_CDFILIAL
                           AND BR.NRBAIXAPAG   = P_NRBAIXA
                           AND BR.IDSTATUSBPAG = 'E'
                           AND BR.CDFILIAL     = BO.CDFILIBAIPAG
                           AND BR.NRBAIXAPAG   = BO.NRBAIXAPAG
                           AND BO.CDFILIAL     = DV.CDFILIBOLPAG
                           AND BO.NRLANBOLPAG  = DV.NRLANBOLPAG
                           AND NF.CDFILIAL     = DV.CDFILIAL
                           AND NF.NRLANCTONF   = DV.NRLANCTONF
                           AND IM.CDFILIAL     = DV.CDFILIAL
                           AND IM.NRLANCTONF   = DV.NRLANCTONF
                           AND IM.NRITPROIMPOS = '1'
                         GROUP BY IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT, IM.VRALIQITEM, NF.VRNOTAFISC,
                               BR.DTBAIXAPAG, BO.NRLANBOLPAG, BR.CDFILIAL, DV.VRDEVOLUCAOPAG, BR.NRBAIXAPAG, IM.CDFISCOPERIT,
                               IM.CDSITUTRIBITNFE, BO.CDFILIAL, IM.CDTPCREDPICOITE, IM.CDNATUREC
                         ORDER BY CDFILIAL, NRLANCTONF, CDIMPOSTO, VRORIGREC) LOOP

         /*BUSCA O VALOR TOTAL DAS CONTAS REFERENTES A ESSA NF, PARA COMPARAR COM O VALOR DA NOTA FISCAL*/
         BEGIN
			   SELECT SUM(VRORIGPAG)
			     INTO V_VRCONTA
              FROM (SELECT CR.VRORIGPAG AS VRORIGPAG
                      FROM CONTAPAGAR CR
                     WHERE CR.CDFILIAL   = C_BOLETOS.CDFILIAL
                       AND CR.NRLANCTONF = C_BOLETOS.NRLANCTONF
                     UNION ALL
                    SELECT DV.VRDEVOLUCAOPAG AS VRORIGPAG
                      FROM DEVOLUCAOPAG DV
                     WHERE DV.CDFILIAL   = C_BOLETOS.CDFILIAL
                       AND DV.NRLANCTONF = C_BOLETOS.NRLANCTONF);
		   EXCEPTION
		      WHEN NO_DATA_FOUND THEN
			      V_VRCONTA := 0;
         END;

         /*NO CASO DE IMPOSTO RETIDO NA FONTE PARAMETRIZADO PARA RETER NO DOCUMENTO, O VRORIGREC FICA DIFERENTE DO VALOR DA NOTA,
           GERANDO BASE DE CALCULO MENOR */
         IF (V_VRCONTA <> C_BOLETOS.VRNOTAFISC) AND (V_VRCONTA > 0) THEN
            V_VRBOLETO := (C_BOLETOS.VRNOTAFISC * C_BOLETOS.VRORIGREC)/V_VRCONTA;
         ELSE
            V_VRBOLETO := C_BOLETOS.VRORIGREC;
         END IF;

         /*CALCULA O VALOR CONTABIL PROPORCIONAL AO VALOR RECEBIDO*/
         IF C_BOLETOS.VRNOTAFISC = V_VRBOLETO THEN
            V_VALORPROP := C_BOLETOS.VRCONTABIL;
         ELSE
            IF C_BOLETOS.VRNOTAFISC > 0 THEN
               V_VALORPROP := (((C_BOLETOS.VRCONTABIL * 100)/C_BOLETOS.VRNOTAFISC)/100)*V_VRBOLETO;
            ELSE
               V_VALORPROP := 0;
            END IF;
         END IF;

         /*CALCULA O VALOR DA BASE DE CALCULO PROPORCIONAL AO VALOR RECEBIDO*/
         IF C_BOLETOS.VRBASECALC = C_BOLETOS.VRCONTABIL THEN
            V_VALORPROPBC := V_VALORPROP;
         ELSE
            IF C_BOLETOS.VRCONTABIL > 0 THEN
               V_VALORPROPBC := (((C_BOLETOS.VRBASECALC * 100)/C_BOLETOS.VRCONTABIL)/100)*V_VALORPROP;
            ELSE
               V_VALORPROPBC := 0;
            END IF;
         END IF;

         NOVO_CODIGO_NT('IMPBAIXAREC', V_NOVOCODIGO);
         V_NOVOCODIGO := SUBSTR(V_NOVOCODIGO,11,10);

         INSERT INTO IMPBAIXAREC
            (NRSEQUENCIAL, CDFILIBAIXAPAG, NRBAIXAPAG, CDFILIAL, NRLANCTONF,
             NRLANBOLPAG, CDFILIBOLPAG, CDIMPOSTO, CDFISCALNF, NRSEQUMAPAPU, VRORIGREC,
             DTBAIXAREC, VRPROPREC, VRPROPRECBC, VRALIQNF, CDFISCOPERNF,
             CDSITUTRIBITNFE, CDTPCREDPICOITE, CDNATUREC)
         VALUES
            (V_NOVOCODIGO, C_BOLETOS.CDFILIBAIXAPAG, C_BOLETOS.NRBAIXAPAG, C_BOLETOS.CDFILIAL, C_BOLETOS.NRLANCTONF,
             C_BOLETOS.NRLANBOLPAG, C_BOLETOS.CDFILIBOLPAG, C_BOLETOS.CDIMPOSTO, C_BOLETOS.CDFISCALNF, NULL, V_VRBOLETO,
             C_BOLETOS.DTBAIXAREC, V_VALORPROP, V_VALORPROPBC, C_BOLETOS.VRALIQNF, C_BOLETOS.CDFISCOPERNF,
             C_BOLETOS.CDSITUTRIBITNFE, C_BOLETOS.CDTPCREDPICOITE, C_BOLETOS.CDNATUREC);
      END LOOP;
   END IF;

   /*DEVOLUCAO - CREDITO EM CONTA (BCO - PROCEDURE E EXECUTADA PELA TELA BCO11100*/
   IF P_IDOPERACAO = 'C' THEN
      FOR C_BOLETOS IN (SELECT IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT AS CDFISCALNF, IM.VRALIQITEM AS VRALIQNF,
                               SUM(IM.VRCONTITIMP) AS VRCONTABIL,  SUM(IM.VRBASECALCIT) AS VRBASECALC, NF.VRNOTAFISC,
                               DV.VRDEVOLUCAOPAG AS VRORIGREC, MV.DTMOVICRED AS DTBAIXAREC, DV.CDFILIAL AS CDFILIBAIXAPAG,
                               IM.CDFISCOPERIT AS CDFISCOPERNF, IM.CDSITUTRIBITNFE, MV.CDREDUCONT, MV.NRMOVICRED,
                               IM.CDTPCREDPICOITE, IM.CDNATUREC
                          FROM NOTAFISCAL NF, ITEMPROIMPOS IM, DEVOLUCAOPAG DV, MOVCREDBANC MV
                         WHERE DV.CDREDUCONT   = P_CDREDUCONT
                           AND DV.NRMOVICRED   = P_NRMOVIDEBI
                           AND MV.CDREDUCONT   = DV.CDREDUCONT
                           AND MV.NRMOVICRED   = DV.NRMOVICRED
                           AND NF.CDFILIAL     = DV.CDFILIAL
                           AND NF.NRLANCTONF   = DV.NRLANCTONF
                           AND IM.CDFILIAL     = NF.CDFILIAL
                           AND IM.NRLANCTONF   = NF.NRLANCTONF
                           AND IM.NRITPROIMPOS = '1'
                         GROUP BY IM.CDFILIAL, IM.NRLANCTONF, IM.CDIMPOSTO, IM.CDFISCALIT, IM.VRALIQITEM,
                               NF.VRNOTAFISC, DV.VRDEVOLUCAOPAG, MV.DTMOVICRED, DV.CDFILIAL, IM.CDFISCOPERIT,
                               IM.CDSITUTRIBITNFE, MV.CDREDUCONT, MV.NRMOVICRED, IM.CDTPCREDPICOITE, IM.CDNATUREC
                         ORDER BY CDFILIAL, NRLANCTONF, CDIMPOSTO) LOOP

         /*BUSCA O VALOR TOTAL DAS CONTAS REFERENTES A ESSA NF, PARA COMPARAR COM O VALOR DA NOTA FISCAL*/
         BEGIN
			   SELECT SUM(VRORIGPAG)
			     INTO V_VRCONTA
              FROM (SELECT DV.VRDEVOLUCAOPAG AS VRORIGPAG
                      FROM DEVOLUCAOPAG DV
                     WHERE DV.CDFILIAL   = C_BOLETOS.CDFILIAL
                       AND DV.NRLANCTONF = C_BOLETOS.NRLANCTONF);
		   EXCEPTION
		      WHEN NO_DATA_FOUND THEN
			      V_VRCONTA := 0;
         END;

         /*NO CASO DE IMPOSTO RETIDO NA FONTE PARAMETRIZADO PARA RETER NO DOCUMENTO, O VRORIGREC FICA DIFERENTE DO VALOR DA NOTA,
           GERANDO BASE DE CALCULO MENOR */
         IF (V_VRCONTA <> C_BOLETOS.VRNOTAFISC) AND (V_VRCONTA > 0) THEN
            V_VRBOLETO := (C_BOLETOS.VRNOTAFISC * C_BOLETOS.VRORIGREC)/V_VRCONTA;
         ELSE
            V_VRBOLETO := C_BOLETOS.VRORIGREC;
         END IF;

         /*CALCULA O VALOR CONTABIL PROPORCIONAL AO VALOR RECEBIDO*/
         IF C_BOLETOS.VRNOTAFISC = V_VRBOLETO THEN
            V_VALORPROP := C_BOLETOS.VRCONTABIL;
         ELSE
            IF C_BOLETOS.VRNOTAFISC > 0 THEN
               V_VALORPROP := (((C_BOLETOS.VRCONTABIL * 100)/C_BOLETOS.VRNOTAFISC)/100)*V_VRBOLETO;
            ELSE
               V_VALORPROP := 0;
            END IF;
         END IF;

         /*CALCULA O VALOR DA BASE DE CALCULO PROPORCIONAL AO VALOR RECEBIDO*/
         IF C_BOLETOS.VRBASECALC = C_BOLETOS.VRCONTABIL THEN
            V_VALORPROPBC := V_VALORPROP;
         ELSE
            IF C_BOLETOS.VRCONTABIL > 0 THEN
               V_VALORPROPBC := (((C_BOLETOS.VRBASECALC * 100)/C_BOLETOS.VRCONTABIL)/100)*V_VALORPROP;
            ELSE
               V_VALORPROPBC := 0;
            END IF;
         END IF;

         NOVO_CODIGO_NT('IMPBAIXAREC', V_NOVOCODIGO);
         V_NOVOCODIGO := SUBSTR(V_NOVOCODIGO,11,10);

         INSERT INTO IMPBAIXAREC
            (NRSEQUENCIAL, CDFILIBAIXAPAG, NRBAIXAPAG, CDFILIAL, NRLANCTONF, NRLANBOLPAG, CDFILIBOLPAG,
             CDIMPOSTO, CDFISCALNF, NRSEQUMAPAPU, VRORIGREC, DTBAIXAREC, VRPROPREC, VRPROPRECBC,
             VRALIQNF, CDFISCOPERNF, CDSITUTRIBITNFE, CDREDUCONTPAG,
             NRMOVIDEBI, CDTPCREDPICOITE, CDNATUREC)
         VALUES
            (V_NOVOCODIGO, C_BOLETOS.CDFILIBAIXAPAG, NULL, C_BOLETOS.CDFILIAL, C_BOLETOS.NRLANCTONF, NULL, NULL,
             C_BOLETOS.CDIMPOSTO, C_BOLETOS.CDFISCALNF, NULL, V_VRBOLETO, C_BOLETOS.DTBAIXAREC, V_VALORPROP, V_VALORPROPBC,
             C_BOLETOS.VRALIQNF, C_BOLETOS.CDFISCOPERNF, C_BOLETOS.CDSITUTRIBITNFE, C_BOLETOS.CDREDUCONT,
             C_BOLETOS.NRMOVICRED, C_BOLETOS.CDTPCREDPICOITE, C_BOLETOS.CDNATUREC);
      END LOOP;
   END IF;
END;
/