CREATE OR REPLACE
PROCEDURE GERA_DADOS_FINANCEIRO(P_CDFILIAL   IN FILIAL.CDFILIAL%TYPE,
                                                  P_NRLANCTONF IN NOTAFISCAL.NRLANCTONF%TYPE,
                                                  P_CDFILIPROC IN FILIAL.CDFILIAL%TYPE,
                                                  P_IDOPERACAO IN VARCHAR2,
                                                  P_RESULTADO OUT VARCHAR2)
AS
   /*CONTADOR GENERICO*/
   V_COUNT NUMBER;
   V_ROW_COUNT NUMBER;
   V_QTCONTA NUMBER;
   V_RESULTADO NUMBER;
   /*SEQUENCIAL*/
   V_SEQUENCIAL NUMBER;
   /*### VARIAVEIS PARA OS DADOS DA NOTA FISCAL ###*/
   V_CDEMPRESA     NOTAFISCAL.CDEMPRESA%TYPE;
   V_VRNOTAFISC    NOTAFISCAL.VRNOTAFISC%TYPE;
   V_ORIGDESTNF    NOTAFISCAL.IDORIGDESTNF%TYPE;
   V_IDDOCFINANC   NOTAFISCAL.IDDOCFINANC%TYPE;
   V_ENTRSAIDOP    NOTAFISCAL.IDENTRSAIDOP%TYPE;
   V_CDFILIRECE    NOTAFISCAL.CDFILIRECE%TYPE;
   V_CDFILIEMIT    NOTAFISCAL.CDFILIEMIT%TYPE;
   V_CDFILIEMIRECE NOTAFISCAL.CDFILIEMIT%TYPE;
   V_DTEMISSAO     NOTAFISCAL.DTEMISSAO%TYPE;
   V_DTENTRSAID    NOTAFISCAL.DTENTRSAID%TYPE;
   V_CDTIPOOPER    NOTAFISCAL.CDTIPOOPER%TYPE;
   V_CDFORNECED    NOTAFISCAL.CDFORNECED%TYPE;
   V_CDCLIENTE     NOTAFISCAL.CDCLIENTE%TYPE;
   V_CLIEFORN      NOTAFISCAL.CDFORNECED%TYPE;
   V_IDSISTEMA     NOTAFISCAL.IDSISTEMA%TYPE;
   V_CDINSESTA     NOTAFISCAL.CDINSCESTAST%TYPE;
   V_IDSTATUS      NOTAFISCAL.IDSTATUS%TYPE;
   V_NRLANCCONT    NOTAFISCAL.NRLANCTBDOC%TYPE;
   /*UTILIZACAO E GERACAO DE VENCIMENTO*/
   V_IDGERAVENC    TIPOOPERAC.IDGERAVENC%TYPE;
   V_IDUTILVENC    TIPOOPERAC.IDUTILVENC%TYPE;
   /*TOTAL DE IMPOSTO RETIDO*/
   V_VRIMPORETI NUMBER;
   /*### VARIAVEIS PARA GERACAO DE VENCIMENTOS ###*/
   /*DADOS DO VENCIMENTO*/
   V_VRVENCIMENTO NUMBER;
   /*VALOR ACUMULADO DE VENCIMENTOS*/
   V_VRVENCACUM NUMBER;
   /*VALOR DO IMPOSTO REFERENTE AO VENCIMENTO*/
   V_VRIMPOSTO NUMBER;
   /*### VARIAVEIS PARA GERACAO DE BOLETO ###*/
   /*VALOR PERCENTUAL DE MORA*/
   V_VRPERMORA NUMBER;
   /*VALOR PERCENTUAL DE MULTA*/
   V_VRPERMULTA NUMBER;
   /*TIPO DE BAIXA A PAGAR*/
   V_CDTPBAIXAPAG TIPOBAIXAPAG.CDTPBAIXAPAG%TYPE;
   /*TIPO DE BAIXA A RECEBER*/
   V_CDTPBAIXAREC TIPOBAIXAREC.CDTPBAIXAREC%TYPE;
   /*TIPO DO TIPO DE BAIXA*/
   V_IDBAIXAUTIL VARCHAR2(1);
   /*CONTA CORRENTE*/
   V_CDREDUCONT CONTCORR.CDREDUCONT%TYPE;
   /*TIPO DE CONTA A PAGAR*/
   V_CDTPCTPAGAR TIPOCTPAGAR.CDTPCTPAGAR%TYPE;
   /*TIPO DE CONTA A PAGAR DA AF*/
   V_TPCONTAPAG_AF VARCHAR2(6);
   /*COUNT OS TIPO DE CONTAS DA AF RELACIONADA DA NF */
   V_COUNTTPCONTA_AF  NUMBER;
   /*COUNT DAS AFS  RELACIONADAS A nf*/
   V_COUNTAUTOFORN_AF NUMBER;
   /*TIPO DE CONTA A RECEBER*/
   V_CDTPCTRECEB TIPOCTRECEBER.CDTPCTRECEB%TYPE;
   /*CLASSIFICACAO FINANCEIRA*/
   V_CDCLASSFINA CLASSFINANC.CDCLASSFINA%TYPE;
   /*FILIAL DO BOLETO*/
   V_CDFILIBOL VARCHAR2(4);
   /*NUMERO DO BOLETO*/
   V_NRLANBOL VARCHAR2(20);
   /*DATA DE VENCIMENTO DO BOLETO*/
   V_DTBOLETO DATE;
   /*CONTA CORRENTE DO FORNECEDOR (PREFERENCIAL)*/
   V_CDBANCFORN CCORFORN.CDBANCFORN%TYPE;
   V_CDAGENFORN CCORFORN.CDAGENFORN%TYPE;
   V_CDCCORFORN CCORFORN.CDCCORFORN%TYPE;
   /*IDENTIFICADOR DE BOLETO REAL*/
   V_IDBPAGREAL VARCHAR2(1);
   /*IDENTIFICADOR PARA CONSIDERAR AJUSTE DE BONIFICACAO*/
   V_IDCONDESBONFORN VARCHAR2(1);
   /*IDENTIFICADOR PARA AJUSTE DA DIFERENCA ENTRE VALOR DO ITEM AF X NF*/
   V_IDGERAAJUSTEAFNF VARCHAR2(1);
   /*CHAVE DO BOLETO JA EXISTENTE (PARA AGRUPAMENTO DE BOLETOS)*/
   V_CDFILIBOLFORN BOLETPAGAR.CDFILIAL%TYPE;
   V_NRLANBOLFORN BOLETPAGAR.NRLANBOLPAG%TYPE;
   /*CHAVE DA AF*/
   V_CDFILLANC AUTOFORNE.CDFILLANC%TYPE;
   V_CDFILDEST AUTOFORNE.CDFILDEST%TYPE;
   V_NRAUTOFORN AUTOFORNE.NRAUTOFORN%TYPE;
   /*CHAVE DO PEDIDO*/
   V_CDFILPEDIDO VARCHAR2(4);
   V_NRPEDIDO    VARCHAR2(10);
   /*DESCRICAO DO TIPO DE CONTA*/
   V_DESCRICAO   VARCHAR2(400);
   /*DESCRICAO DA CONTA A RECEBER*/
   V_DSCONTAREC VARCHAR2(400);
   V_DESCHOSTING VARCHAR2(400);
   /*DATA DE VENCIMENTO DA CONTA A RECEBER*/
   V_DTVENREC DATE;
   /*VALOR DA CONTA A RECEBER*/
   V_VRCONTREC NUMBER;
   /*SEQUENCIAL DA CONTA A RECEBER*/
   V_NRSEQVENREC VARCHAR2(2);
   /*TIPO DE CONTA RECEBER*/
   V_CDTPCTREC CONTARECEBER.CDTPCTRECEB%TYPE;
   /*TIPO DE CONTA PARAMETRIZADO PARA CONTA DE SUBST. TRIBUTARIA*/
   V_TPCTSUBTRIB PARAMFILIAL.CDTPCTRECEB%TYPE;
   /* PEGA ULTIMO FILIAL E CENTRO DE CUSTO DO RATEIO */
   V_RATEIO_CDCENTCUSNF CENTCUST.CDCENTCUST%TYPE;
   V_RATEIO_CDFILICCUST FILIAL.CDFILIAL%TYPE;
   /*Identificador de feriado bancario  */
   V_IDCOFERIBANC PARAMGERAL.IDCOFERIBANC%TYPE;
   /*valor dos produtos da nota que na gera venvimento*/
   V_VRPRODUTOSEMFIN   FLOAT;
   /*identifica se a descricao da conta a pagar foi informada no lancamento da nf, isto para que ao cancelar a aprovacao a descricao nao seja apagada*/
   V_IDDSCONTANFPAG    VARCHAR2(1);
   V_NRLANCTONFDARF    VARCHAR2(20);
   V_IDGERCNTPAGIMP    VARCHAR2(1);
   V_NRLANBOLDARF      VARCHAR2(20);
	V_IDTPCONTATRABVEN  VARCHAR2(1);
   V_CDTIPOOPERDARF    TIPOOPERAC.CDTIPOOPER%TYPE;
   /*IDENTIFICA O TIPO DE CONTA A PAGAR QUE SERA GERADA PARA OS IMPOSTOS RETIDOS (REAL OU PREVISTA)*/
   V_IDSTATUSRETGUIA   VARCHAR2(1);
	V_IDANTECIPAVENC VARCHAR2(1);
   V_NRNOTAFISCDARF    VARCHAR2(20);
   /*DATA DE VENCIMENTO DA CONTA GERADA PARA OS IMPOSTOS RETIDOS, DE ACORDO COM A PARAMETRIZACAO*/
   V_DTVENCGUIA        DATE;
   /*identifica se tem algum tipo de conta na rateionf diferente contapagar, quer dizer que foi informado no venc da nota*/
   V_TIPOCTDIFE        VARCHAR2(1);
   V_CDTPCTRAT TIPOCTPAGAR.CDTPCTPAGAR%TYPE;
   V_RATPROD           VARCHAR2(1);
   /*INFORMACOES DO PIX*/
   V_IDCHAVEPIX     CHAVEPIX.IDCHAVEPIX%TYPE;
   V_CDCHAVEPIX     CHAVEPIX.CDCHAVEPIX%TYPE;
   V_DSCHAVEPIX     CHAVEPIX.DSCHAVEPIX%TYPE;
   /*ENVIA BOLETO ANTERIOR A NOTA*/
   V_IDENVBOLANTNOTA   CLIENTE.IDENVBOLANTNOTA%TYPE;
   /*NUMERO DE LANCAMENTO DA CONTA PREVISTA*/
   V_NRLANCTONFAUX NOTAFISCAL.NRLANCTONF%TYPE;
   /*VERIFICA SE A ROTINA FOI GERADA PELA SANGRIA DE DESPESA*/
   V_COUNTDOCSANGRIA  NUMBER;

   V_CDOPERADOR     OPERADOR.CDOPERADOR%TYPE;
   /*TIPO DE CONTA A PAGAR POR SEQUENCIAL DO ITEM DA NOTA, PARA GRAVAR O TIPO DE CONTA NA TABELA DE RATEIO, AO GERAR O RATEIO*/
   CURSOR C_TP_CONTA_RATEIO_PAG(P_CDFILIAL VARCHAR2,
                              P_NRLANCTONF VARCHAR2)
   IS
      SELECT PROD.CDTPCTPAGAR, PROD.CDFILIAL, PROD.NRLANCTONF, PROD.NRSEQITPROD
        FROM TIPOCTPAGAR TP,
             (SELECT P3.CDPRODUTO, P4.CDARVPROD, P4.CDTPCTPAGAR,
                     I.NRSEQITPROD, I.CDFILIAL, I.NRLANCTONF
               FROM ITEMPRODUTO I, PRODUTO P3, PRODUTO P4
              WHERE I.CDFILIAL = P_CDFILIAL
                AND I.NRLANCTONF = P_NRLANCTONF
                AND I.CDPRODUTO = P3.CDPRODUTO
                AND (INSTR(P3.CDARVPROD,NVL(RTRIM(P4.CDARVPROD),P3.CDARVPROD)) = 1)
                AND P4.CDTPCTPAGAR IS NOT NULL
                AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
                                      FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
                                     WHERE IT.CDFILIAL = I.CDFILIAL
                                       AND IT.NRLANCTONF = I.NRLANCTONF
                                       AND IT.CDPRODUTO = I.CDPRODUTO
                                       AND IT.CDPRODUTO = P.CDPRODUTO
                                       AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
                                       AND P1.CDTPCTPAGAR IS NOT NULL)
                AND NOT EXISTS (SELECT 1
                                  FROM NOTAFISCAL NF, TPOPERCFOP T
                                 WHERE NF.CDFILIAL     = P_CDFILIAL
                                   AND NF.NRLANCTONF   = P_NRLANCTONF
                                   AND NF.CDFILIAL     = I.CDFILIAL
                                   AND NF.NRLANCTONF   = I.NRLANCTONF
                                   AND I.CDFISOPEITEM  = T.CDFISCOPER
                                   AND NF.IDENTRSAIDOP = T.IDENTRSAIDOP
                                   AND NF.CDTIPOOPER   = T.CDTIPOOPER
                                   AND T.IDCOMPOEVENC  = 'N')

              ORDER BY P3.CDARVPROD) PROD
       WHERE PROD.CDTPCTPAGAR = TP.CDTPCTPAGAR;

   RECORD_TPCONTARATPAG C_TP_CONTA_RATEIO_PAG%ROWTYPE;

   /*TIPO DE CONTA A RECEBER POR SEQUENCIAL DO ITEM DA NOTA, PARA GRAVAR O TIPO DE CONTA NA TABELA DE RATEIO, AO GERAR O RATEIO*/
   CURSOR C_TP_CONTA_RATEIO_REC(P_CDFILIAL VARCHAR2,
                              P_NRLANCTONF VARCHAR2)
  IS
      SELECT CDTPCTRECEB, CDFILIAL, NRLANCTONF, NRSEQITPROD
        FROM
        (
        SELECT PROD.CDTPCTRECEB AS CDTPCTRECEB, PROD.CDFILIAL, PROD.NRLANCTONF, PROD.NRSEQITPROD
			 FROM TIPOCTRECEBER TP,
					(SELECT P3.CDPRODUTO, P4.CDARVPROD, P4.CDTPCTRECEB,
                       I.NRSEQITPROD, I.CDFILIAL, I.NRLANCTONF
					   FROM ITEMPRODUTO I, PRODUTO P3, PRODUTO P4
					  WHERE I.CDFILIAL = P_CDFILIAL
					 	 AND I.NRLANCTONF = P_NRLANCTONF
						 AND I.CDPRODUTO = P3.CDPRODUTO
						 AND (INSTR(P3.CDARVPROD,NVL(RTRIM(P4.CDARVPROD),P3.CDARVPROD)) = 1)
						 AND P4.CDTPCTRECEB IS NOT NULL
						 AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
													  FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
													 WHERE IT.CDFILIAL = I.CDFILIAL
													   AND IT.NRLANCTONF = I.NRLANCTONF
													   AND IT.CDPRODUTO = I.CDPRODUTO
													   AND IT.CDPRODUTO = P.CDPRODUTO
													  AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
													   AND P1.CDTPCTRECEB IS NOT NULL
													)
						AND NOT EXISTS (SELECT 1
												FROM NOTAFISCAL NF, TPOPERCFOP T
											  WHERE NF.CDFILIAL     = P_CDFILIAL
												 AND NF.NRLANCTONF   = P_NRLANCTONF
												 AND NF.CDFILIAL     = I.CDFILIAL
												 AND NF.NRLANCTONF   = I.NRLANCTONF
												 AND I.CDFISOPEITEM  = T.CDFISCOPER
												 AND NF.IDENTRSAIDOP = T.IDENTRSAIDOP
												 AND NF.CDTIPOOPER   = T.CDTIPOOPER
												 AND T.IDCOMPOEVENC  = 'N')
					   ORDER BY P3.CDARVPROD) PROD
			WHERE PROD.CDTPCTRECEB = TP.CDTPCTRECEB
			UNION
			SELECT PROD.CDTPCTRECEB, PROD.CDFILIAL, PROD.NRLANCTONF, PROD.NRSEQITPROD
			  FROM (SELECT I.VRBRUTITEM, NVL(P.CDTPCTRECEB,TI.CDTPCTRECEB) AS CDTPCTRECEB,
                        I.CDFILIAL, I.NRLANCTONF, I.NRSEQITPROD
						 FROM ITEMPRODUTO I, PRODUTO P, TIPOCTRECEBER TP, TIPOCTRECEBER TC, NOTAFISCAL N, TIPOOPERAC TI
						WHERE I.CDFILIAL = P_CDFILIAL
						  AND I.NRLANCTONF = P_NRLANCTONF
						  AND I.CDPRODUTO = P.CDPRODUTO
						  AND P.CDTPCTRECEB = TP.CDTPCTRECEB(+)
                    AND I.CDFILIAL = N.CDFILIAL
						  AND I.NRLANCTONF = N.NRLANCTONF
                    AND N.IDENTRSAIDOP = TI.IDENTRSAIDOP
                    AND N.CDTIPOOPER   = TI.CDTIPOOPER
                    AND TC.CDTPCTRECEB = TI.CDTPCTRECEB
						  AND NOT EXISTS (SELECT 1
												  FROM PRODUTO PR
												 WHERE P.CDARVPROD LIKE PR.CDARVPROD||'%'
													AND PR.CDTPCTRECEB IS NOT NULL))PROD
			);

   RECORD_TPCONTARATREC C_TP_CONTA_RATEIO_REC%ROWTYPE;

   /*TIPO DE CONTA A PAGAR POR PRODUTO*/
   CURSOR C_TP_CONTA_PROD_PAG(P_CDFILIAL VARCHAR2,
                              P_NRLANCTONF VARCHAR2)
   IS
      SELECT PROD.CDTPCTPAGAR, TP.CDCLASSFINA, TP.DSDEFACTPAG, SUM(PROD.VRBRUTITEM) AS VRBRUTITEM, COUNT(*) OVER() AS NROREGS
        FROM TIPOCTPAGAR TP,
             (SELECT P3.CDPRODUTO, P4.CDARVPROD, P4.CDTPCTPAGAR,
                    ROUND(I.VRBRUTITEM,2) AS VRBRUTITEM
               FROM ITEMPRODUTO I, PRODUTO P3, PRODUTO P4
              WHERE I.CDFILIAL = P_CDFILIAL
                AND I.NRLANCTONF = P_NRLANCTONF
                AND I.CDPRODUTO = P3.CDPRODUTO
                AND (INSTR(P3.CDARVPROD,NVL(RTRIM(P4.CDARVPROD),P3.CDARVPROD)) = 1)
                AND P4.CDTPCTPAGAR IS NOT NULL
                AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
                                      FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
                                     WHERE IT.CDFILIAL = I.CDFILIAL
                                       AND IT.NRLANCTONF = I.NRLANCTONF
                                       AND IT.CDPRODUTO = I.CDPRODUTO
                                       AND IT.CDPRODUTO = P.CDPRODUTO
                                       AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
                                       AND P1.CDTPCTPAGAR IS NOT NULL)
                AND NOT EXISTS (SELECT 1
                                  FROM NOTAFISCAL NF, TPOPERCFOP T
                                 WHERE NF.CDFILIAL     = P_CDFILIAL
                                   AND NF.NRLANCTONF   = P_NRLANCTONF
                                   AND NF.CDFILIAL     = I.CDFILIAL
                                   AND NF.NRLANCTONF   = I.NRLANCTONF
                                   AND I.CDFISOPEITEM  = T.CDFISCOPER
                                   AND NF.IDENTRSAIDOP = T.IDENTRSAIDOP
                                   AND NF.CDTIPOOPER   = T.CDTIPOOPER
                                   AND T.IDCOMPOEVENC  = 'N')

              ORDER BY P3.CDARVPROD) PROD
       WHERE PROD.CDTPCTPAGAR = TP.CDTPCTPAGAR
      GROUP BY PROD.CDTPCTPAGAR, TP.CDCLASSFINA, TP.DSDEFACTPAG;

   RECORD_TPCONTAPRODPAG C_TP_CONTA_PROD_PAG%ROWTYPE;

   /*TIPO DE CONTA A RECEBER POR PRODUTO*/
   CURSOR C_TP_CONTA_PROD_REC(P_CDFILIAL VARCHAR2,
                              P_NRLANCTONF VARCHAR2)
  IS
      SELECT CDTPCTRECEB, CDCLASSFINA,  DSDEFACTREC, SUM(VRBRUTITEM) VRBRUTITEM, COUNT(*) OVER() AS NROREGS
        FROM
        (
        SELECT PROD.CDTPCTRECEB AS CDTPCTRECEB, TP.CDCLASSFINA,  TP.DSDEFACTREC, SUM(PROD.VRBRUTITEM) AS VRBRUTITEM, COUNT(*) OVER() AS NROREGS
			 FROM TIPOCTRECEBER TP,
					(SELECT P3.CDPRODUTO, P4.CDARVPROD, P4.CDTPCTRECEB, ROUND(I.VRBRUTITEM,2) AS VRBRUTITEM
					   FROM ITEMPRODUTO I, PRODUTO P3, PRODUTO P4
					  WHERE I.CDFILIAL = P_CDFILIAL
					 	 AND I.NRLANCTONF = P_NRLANCTONF
						 AND I.CDPRODUTO = P3.CDPRODUTO
						 AND (INSTR(P3.CDARVPROD,NVL(RTRIM(P4.CDARVPROD),P3.CDARVPROD)) = 1)
						 AND P4.CDTPCTRECEB IS NOT NULL
						 AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
													  FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
													 WHERE IT.CDFILIAL = I.CDFILIAL
													   AND IT.NRLANCTONF = I.NRLANCTONF
													   AND IT.CDPRODUTO = I.CDPRODUTO
													   AND IT.CDPRODUTO = P.CDPRODUTO
													  AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
													   AND P1.CDTPCTRECEB IS NOT NULL
													)
						AND NOT EXISTS (SELECT 1
												FROM NOTAFISCAL NF, TPOPERCFOP T
											  WHERE NF.CDFILIAL     = P_CDFILIAL
												 AND NF.NRLANCTONF   = P_NRLANCTONF
												 AND NF.CDFILIAL     = I.CDFILIAL
												 AND NF.NRLANCTONF   = I.NRLANCTONF
												 AND I.CDFISOPEITEM  = T.CDFISCOPER
												 AND NF.IDENTRSAIDOP = T.IDENTRSAIDOP
												 AND NF.CDTIPOOPER   = T.CDTIPOOPER
												 AND T.IDCOMPOEVENC  = 'N')
					   ORDER BY P3.CDARVPROD) PROD
			WHERE PROD.CDTPCTRECEB = TP.CDTPCTRECEB
			GROUP BY PROD.CDTPCTRECEB, TP.CDCLASSFINA, TP.DSDEFACTREC, PROD.CDPRODUTO
			UNION
			SELECT PROD.CDTPCTRECEB, CDCLASSFINA, DSDEFACTREC, SUM(PROD.VRBRUTITEM) AS VRBRUTITEM, COUNT(*) OVER() AS NROREGS
			  FROM (SELECT I.VRBRUTITEM, NVL(P.CDTPCTRECEB,TI.CDTPCTRECEB) AS CDTPCTRECEB ,
                    NVL(TP.DSDEFACTREC,TC.DSDEFACTREC) AS DSDEFACTREC, NVL(TP.CDCLASSFINA,TC.CDCLASSFINA) AS CDCLASSFINA
						 FROM ITEMPRODUTO I, PRODUTO P, TIPOCTRECEBER TP, TIPOCTRECEBER TC, NOTAFISCAL N, TIPOOPERAC TI
						WHERE I.CDFILIAL = P_CDFILIAL
						  AND I.NRLANCTONF = P_NRLANCTONF
						  AND I.CDPRODUTO = P.CDPRODUTO
						  AND P.CDTPCTRECEB = TP.CDTPCTRECEB(+)
                    AND I.CDFILIAL = N.CDFILIAL
						  AND I.NRLANCTONF = N.NRLANCTONF
                    AND N.IDENTRSAIDOP = TI.IDENTRSAIDOP
                    AND N.CDTIPOOPER   = TI.CDTIPOOPER
                    AND TC.CDTPCTRECEB = TI.CDTPCTRECEB
						  AND NOT EXISTS (SELECT 1
												  FROM PRODUTO PR
												 WHERE P.CDARVPROD LIKE PR.CDARVPROD||'%'
													AND PR.CDTPCTRECEB IS NOT NULL))PROD
              GROUP BY CDTPCTRECEB, CDCLASSFINA,  DSDEFACTREC
			)
		GROUP BY CDTPCTRECEB, CDCLASSFINA,  DSDEFACTREC, NROREGS;

   RECORD_TPCONTAPRODREC C_TP_CONTA_PROD_REC%ROWTYPE;

   /*DADOS DA EMPRESA*/
   CURSOR C_PARAM_EMPRESA(P_CDEMPRESA VARCHAR2)
   IS
      SELECT E.VRPEMOREMPR, E.VRPEMULEMPR, PE.CDTPBAIXAPAG, PE.CDTPBAIXAREC,
             PE.CDREDUCONTPAG
        FROM EMPRESA E, PARAMEMPRESA PE
       WHERE E.CDEMPRESA = P_CDEMPRESA
         AND E.CDEMPRESA = PE.CDEMPRESA(+);
   RECORD_PARAM_EMPRESA C_PARAM_EMPRESA%ROWTYPE;

   /*DADOS DA FILIAL*/
   CURSOR C_PARAM_FILIAL(P_CDFILIRECE VARCHAR2)
   IS
       SELECT CDTPBAIXAPAG, CDTPBAIXAREC, CDREDUCONTPAG, NVL(IDCONDESBONFORN,'S') IDCONDESBONFORN
         FROM PARAMFILIAL
        WHERE CDFILIAL = P_CDFILIRECE;
   RECORD_PARAM_FILIAL C_PARAM_FILIAL%ROWTYPE;

   /*DADOS DO FORNECEDOR*/
   CURSOR C_FORNECEDOR(P_CDFORNECED VARCHAR2)
   IS
      SELECT F.CDFORNECED,F.IDAGRUBOLFOR, C.CDBANCFORN, C.CDAGENFORN,
             C.CDCCORFORN, C.IDCCORFORNPREF, F.CDTPBAIXAPAG, F.CDTPCTPAGAR,
             F.IDGERAAJUSTEAFNF
        FROM FORNECEDOR F,
             (SELECT CDFORNECED, CDBANCFORN, CDAGENFORN, CDCCORFORN, IDCCORFORNPREF
                FROM CCORFORN
               WHERE IDCCORFORNPREF = 'S'
                 AND CDFORNECED = P_CDFORNECED) C
       WHERE (F.CDFORNECED   = P_CDFORNECED)
         AND (F.CDFORNECED   = C.CDFORNECED(+));
   RECORD_FORNECEDOR C_FORNECEDOR%ROWTYPE;
   
   /*DADOS DO PIX DO FORNECEDOR*/
   CURSOR C_FORPIX(P_CDFORNECED VARCHAR2)
   IS
      SELECT F.CDFORNECED, C.CDCHAVEPIX, C.DSCHAVEPIX,
             C.IDCHAVEPIX, C.IDCHAVEPIXPREF
        FROM FORNECEDOR F,
             (SELECT CDFORNECED, IDCHAVEPIX, CDCHAVEPIX, DSCHAVEPIX, IDCHAVEPIXPREF
                FROM CHAVEPIX
               WHERE IDCHAVEPIXPREF = 'S'
                 AND CDFORNECED = P_CDFORNECED) C
       WHERE (F.CDFORNECED   = P_CDFORNECED)
         AND (F.CDFORNECED   = C.CDFORNECED);
   RECORD_FORPIX C_FORPIX%ROWTYPE;




   /*DADOS DO CLIENTE*/
   CURSOR C_CLIENTE(P_CDCLIENTE VARCHAR2)
   IS
      SELECT VRPEMORBCLI, VRPEMULBCLI
        FROM CLIENTE
       WHERE CDCLIENTE = P_CDCLIENTE;
   RECORD_CLIENTE C_CLIENTE%ROWTYPE;

   /*DADOS DO TIPO DE OPERACAO*/
   CURSOR C_TIPOOPER (P_CDTIPOOPER VARCHAR2,
                      P_IDENTRSAIDOP VARCHAR2)
   IS
      SELECT CDTPCTPAGAR, CDTPCTRECEB, IDGERAVENC, IDUTILVENC, CDHISTPADR
        FROM TIPOOPERAC
       WHERE CDTIPOOPER = P_CDTIPOOPER
         AND IDUTILOPER <> 'N'
         AND IDENTRSAIDOP = P_IDENTRSAIDOP;
   RECORD_TIPOOPER C_TIPOOPER%ROWTYPE;

   /*DADOS DAS CONTAS A PAGAR*/
   CURSOR C_CONTAPAGAR (P_CDFILIAL VARCHAR2,
                        P_NRLANCTONF VARCHAR2)
   IS
      SELECT CP.CDFILIAL, CP.NRLANCTONF, CP.NRSEQVENPAG, CP.NRPARCELAPAG,
             CP.QTDIASVENPAG, CP.DTORIGVENPAG, CP.VRORIGPAG, CP.CDTPCTPAGAR,
             CP.DTATUAVENPAG, CP.VRATUAPAG, CP.IDSTATPAG, CP.NRLANBOLPAG,
             CP.CDFILIBPAG, CP.CDCLASSFINA, CP.DTMOVFLUXO, CP.IDMOVFLUXO,
             CP.CDFIMOVFLPAG, CP.CDEMPRESA, CP.DSCONTAPAG, CP.CDBARRAPAG, CP.DSLINHBARPAG,
             TCP.IDTPCTPAGAR
        FROM CONTAPAGAR CP, TIPOCTPAGAR TCP
       WHERE CP.CDFILIAL = P_CDFILIAL
         AND CP.NRLANCTONF = P_NRLANCTONF
         AND NVL(CP.CDTPCTPAGAR,NVL(RECORD_TIPOOPER.CDTPCTPAGAR,RECORD_FORNECEDOR.CDTPCTPAGAR)) = TCP.CDTPCTPAGAR
       ORDER BY CP.CDFILIAL, CP.NRLANCTONF, CP.NRSEQVENPAG, CP.DTATUAVENPAG;
   RECORD_CONTAPAGAR C_CONTAPAGAR%ROWTYPE;

   /*DADOS DAS CONTAS A PAGAR PARA GERACAO DOS VENCIMENTOS SEGUNDO
     PARAMETRIZACAO DE TIPO DE CONTA POR PRODUTO*/
   CURSOR C_CTPAGAGRUP (P_CDFILIAL VARCHAR2,
                        P_NRLANCTONF VARCHAR2)
   IS

      SELECT CDFILIAL, NRLANCTONF, NRPARCELAPAG,
             QTDIASVENPAG, DTORIGVENPAG, SUM(VRORIGPAG) AS VRORIGPAG,
             DSCONTAPAG, DTATUAVENPAG, SUM(VRATUAPAG) AS VRATUAPAG,
             IDSTATPAG, CDCLASSFINA, CT.VRATUAPAGTOT,
             IMPRET.VRTOTIMPONF, IT.CDBARRAPAG, IT.DSLINHBARPAG
        FROM CONTAPAGAR IT,
             (SELECT SUM(VRATUAPAG) AS VRATUAPAGTOT
                FROM CONTAPAGAR
               WHERE CDFILIAL = P_CDFILIAL
                 AND NRLANCTONF = P_NRLANCTONF) CT,
             (SELECT SUM(A.VRIMPOSTONF) AS VRTOTIMPONF
                FROM IMPOSTONF A, IMPOSTO B
               WHERE A.CDFILIAL   = P_CDFILIAL
                 AND A.NRLANCTONF = P_NRLANCTONF
                 AND A.CDFISCALNF = '1'
                 AND B.IDTRATIMPO = 'R'
                 AND B.IDDESCRFONTE = 'R'
                 AND A.CDIMPOSTO  = B.CDIMPOSTO) IMPRET
       WHERE IT.CDFILIAL = P_CDFILIAL
         AND IT.NRLANCTONF = P_NRLANCTONF
       GROUP BY CDFILIAL, NRLANCTONF, NRPARCELAPAG,
                QTDIASVENPAG, DTORIGVENPAG, DSCONTAPAG,
                DTATUAVENPAG, IDSTATPAG, CDCLASSFINA,
                CT.VRATUAPAGTOT, IMPRET.VRTOTIMPONF, IT.CDBARRAPAG, IT.DSLINHBARPAG
       ORDER BY DTORIGVENPAG;

   RECORD_CTPAGAGRUP C_CTPAGAGRUP%ROWTYPE;

	CURSOR C_CTRECAGRUP (P_CDFILIAL VARCHAR2,
                        P_NRLANCTONF VARCHAR2)
   IS

	SELECT CDFILIAL, NRLANCTONF, NRPARCELAREC,
             QTDIASVENREC, DTORIGVENREC, SUM(VRORIGREC) AS VRORIGREC,
             DSCONTAREC, DTATUAVENREC, SUM(VRATUAREC) AS VRATUAREC,
             IDSTATREC, CDCLASSFINA, CT.VRATUARECTOT,
             IMPRET.VRTOTIMPONF, IDCONTAIMPOSTO
	  FROM CONTARECEBER IT,
			 (SELECT SUM(VRATUAREC) AS VRATUARECTOT
				 FROM CONTARECEBER
				WHERE CDFILIAL = P_CDFILIAL
				  AND NRLANCTONF = P_NRLANCTONF) CT,
			 (SELECT SUM(A.VRIMPOSTONF) AS VRTOTIMPONF
				 FROM IMPOSTONF A, IMPOSTO B
				WHERE A.CDFILIAL   = P_CDFILIAL
				  AND A.NRLANCTONF = P_NRLANCTONF
              AND A.CDFISCALNF = '1'
				  AND B.IDTRATIMPO = 'R'
				  AND B.IDDESCRFONTE = 'R'
				  AND A.CDIMPOSTO  = B.CDIMPOSTO) IMPRET
	 WHERE IT.CDFILIAL = P_CDFILIAL
		AND IT.NRLANCTONF = P_NRLANCTONF
	 GROUP BY CDFILIAL, NRLANCTONF, NRPARCELAREC,
				 QTDIASVENREC, DTORIGVENREC, DSCONTAREC,
				 DTATUAVENREC, IDSTATREC, CDCLASSFINA,
				 CT.VRATUARECTOT, IMPRET.VRTOTIMPONF, IDCONTAIMPOSTO
	 ORDER BY IDCONTAIMPOSTO DESC, DTORIGVENREC;

	RECORD_CTRECAGRUP C_CTRECAGRUP%ROWTYPE;

   /*GERA AJUSTES DE BONIFICACAO NAS CONTAS DO FORNECEDOR*/
   PROCEDURE GERA_AJUSTE_BONI_PAG(P_CDFORNECED VARCHAR2,
                                  P_CDFILIAL VARCHAR2,
                                  P_NRLANCTONF VARCHAR2,
                                  P_IDCONDESBONFORN VARCHAR2)
   IS
      V_VRDESCBONI NUMBER;
      V_FATOR NUMBER;
      /*DADOS DA PARAMETRIZACAO DO FORNECEDOR PARA AJUSTE DE BONIFICACAO*/
      CURSOR C_AJ_FORN IS
         SELECT F.CDAJUCTPAG, F.VRPEDESCFORN, F.IDTPDESCFORN, F.DTINIVRPDESC, T.IDAJUCTPAG
           FROM FORNECEDOR F, TIPOAJPAGAR T
          WHERE (T.CDAJUCTPAG   = F.CDAJUCTPAG)
            AND (F.CDFORNECED = P_CDFORNECED)
            AND (F.VRPEDESCFORN IS NOT NULL)
            AND F.IDTPDESCFORN = 'B';
      RECORD_AJ_FORN C_AJ_FORN%ROWTYPE;
      /*DADOS DAS CONTAS A PAGAR*/
      CURSOR C_CONTAPAGAR(P_CDFILIAL VARCHAR2,
                          P_NRLANCTONF VARCHAR2)
      IS
         SELECT CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, CDTPCTPAGAR,
                DTATUAVENPAG, VRATUAPAG, IDSTATPAG, NRLANBOLPAG,
                CDFILIBPAG, CDCLASSFINA, DTMOVFLUXO, IDMOVFLUXO,
                CDFIMOVFLPAG, CDEMPRESA, DSCONTAPAG
           FROM CONTAPAGAR
          WHERE CDFILIAL = P_CDFILIAL
            AND NRLANCTONF = P_NRLANCTONF
          ORDER BY CDFILIAL, NRLANCTONF, DTATUAVENPAG;
      RECORD_CONTAPAGAR C_CONTAPAGAR%ROWTYPE;
   BEGIN
      /*CONFERE SE CONSISTE O DESCONTO DE BONIFICACAO*/
      IF P_IDCONDESBONFORN = 'S' THEN
         /*BUSCA INFORMACOES DO FORNECEDOR*/
         OPEN C_AJ_FORN;
         FETCH C_AJ_FORN INTO RECORD_AJ_FORN;
         /*BUSCA AS CONTAS A PAGAR*/
         OPEN C_CONTAPAGAR(P_CDFILIAL, P_NRLANCTONF);
         /*CONFERE SE O FORNECEDOR UTILIZA DESCONTO DE BONIFICACAO*/
         IF C_AJ_FORN%FOUND THEN
            IF RECORD_AJ_FORN.IDAJUCTPAG = 'D' THEN
               V_FATOR := -1;
            ELSE
               V_FATOR := 1;
            END IF;
            LOOP
               FETCH C_CONTAPAGAR INTO RECORD_CONTAPAGAR;
               EXIT WHEN C_CONTAPAGAR%NOTFOUND;
               /*VERIFICA SE O VENCIMENTO DA CONTA ESTA SUPERIOR A DATA INICIAL PARA DESCONT*/
               IF (RECORD_CONTAPAGAR.DTATUAVENPAG >= RECORD_AJ_FORN.DTINIVRPDESC) OR (RECORD_AJ_FORN.DTINIVRPDESC IS NULL) THEN
                  V_VRDESCBONI := ROUND((RECORD_CONTAPAGAR.VRATUAPAG * RECORD_AJ_FORN.VRPEDESCFORN)/100, 2);
                  /*ATUALIZA FLUXO DE CAIXA DO AJUSTE*/
                  ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                                          RECORD_CONTAPAGAR.CDFIMOVFLPAG,
                                          RECORD_CONTAPAGAR.DTATUAVENPAG,
                                          'E',
                                          RECORD_CONTAPAGAR.CDCLASSFINA,
                                          0,
                                          V_VRDESCBONI * V_FATOR);
                  /*INSERE O AJUSTE*/
                  INSERT INTO AJCTPAGAR
                        (CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG, DTAJUSTEPAG, CDAJUCTPAG,
                         DSAJUSTEPAG, VRAJUSTEPAG, CDCLASSFINA, CDEMMFAJCNTP, CDFIMFAJCNTP,
                         DTMOVFLUXO, IDMOVFLUXO, CDECTBAJPAG, NRLCTBAJPAG)
                  VALUES
                        (RECORD_CONTAPAGAR.CDFILIAL, RECORD_CONTAPAGAR.NRLANCTONF, RECORD_CONTAPAGAR.NRSEQVENPAG, RECORD_CONTAPAGAR.NRPARCELAPAG, RECORD_CONTAPAGAR.DTATUAVENPAG, RECORD_AJ_FORN.CDAJUCTPAG,
                         'Ajuste', ROUND(V_VRDESCBONI, 2), RECORD_CONTAPAGAR.CDCLASSFINA, V_CDEMPRESA, RECORD_CONTAPAGAR.CDFIMOVFLPAG,
                         RECORD_CONTAPAGAR.DTATUAVENPAG, 'E', '', '');
                  /*ATUALIZA O VALOR DA CONTA COM O AJUSTE GERADO*/
                  UPDATE CONTAPAGAR
                     SET VRATUAPAG = ROUND(VRATUAPAG + (V_VRDESCBONI * V_FATOR), 2)
                   WHERE CDFILIAL = RECORD_CONTAPAGAR.CDFILIAL
                     AND NRLANCTONF = RECORD_CONTAPAGAR.NRLANCTONF
                     AND NRSEQVENPAG = RECORD_CONTAPAGAR.NRSEQVENPAG
                     AND NRPARCELAPAG = RECORD_CONTAPAGAR.NRPARCELAPAG;
                  /*ATUALIZA O VALOR DO BOLETO COM O AJUSTE GERADO*/
                  UPDATE BOLETPAGAR
                     SET VRFINALBPAG = ROUND(VRFINALBPAG + (V_VRDESCBONI * V_FATOR), 2),
                         VRBOLPAG = ROUND(VRBOLPAG + (V_VRDESCBONI * V_FATOR), 2)
                   WHERE CDFILIAL = RECORD_CONTAPAGAR.CDFILIBPAG
                     AND NRLANBOLPAG = RECORD_CONTAPAGAR.NRLANBOLPAG;
               END IF;
            END LOOP;
         END IF;
         CLOSE C_AJ_FORN;
         CLOSE C_CONTAPAGAR;
      END IF;
   END;

   /*GERA AJUSTES DAS DIFERENCAS DOS ITENS DA AF x NF NAS CONTAS DO FORNECEDOR*/
   PROCEDURE GERA_AJUSTE_AF_NF(P_CDFORNECED VARCHAR2,
                               P_CDFILIAL VARCHAR2,
                               P_NRLANCTONF VARCHAR2,
                               P_IDGERAAJUSTEAFNF VARCHAR2)
   IS
      V_VRDESCAFNF    NUMBER;
      V_VRPARDESCAFNF NUMBER;
      V_TOTALPAGAR    NUMBER;
      V_FATOR         NUMBER;
      /*DADOS DA PARAMETRIZACAO DO FORNECEDOR PARA AJUSTE DE BONIFICACAO*/
      CURSOR C_AJ_FORN_AF_NF IS
         SELECT F.CDAJCTPAGDIFAFNF, T.IDAJUCTPAG
           FROM FORNECEDOR F, TIPOAJPAGAR T
          WHERE (T.CDAJUCTPAG   = F.CDAJCTPAGDIFAFNF)
            AND (F.CDFORNECED = P_CDFORNECED);
      RECORD_AJ_FORN_AF_NF C_AJ_FORN_AF_NF%ROWTYPE;
      /*DADOS DAS CONTAS A PAGAR*/
      CURSOR C_CONTAPAGAR_AF_NF(P_CDFILIAL VARCHAR2,
                                P_NRLANCTONF VARCHAR2)
      IS
         SELECT CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, CDTPCTPAGAR,
                DTATUAVENPAG, VRATUAPAG, IDSTATPAG, NRLANBOLPAG,
                CDFILIBPAG, CDCLASSFINA, DTMOVFLUXO, IDMOVFLUXO,
                CDFIMOVFLPAG, CDEMPRESA, DSCONTAPAG
           FROM CONTAPAGAR
          WHERE CDFILIAL = P_CDFILIAL
            AND NRLANCTONF = P_NRLANCTONF
          ORDER BY CDFILIAL, NRLANCTONF, DTATUAVENPAG;
      RECORD_CONTAPAGAR_AF_NF C_CONTAPAGAR_AF_NF%ROWTYPE;
   BEGIN
      /*CONFERE SE CONSISTE O DIFERENCA AF x NF*/
      IF (P_IDGERAAJUSTEAFNF = 'S') THEN
         /*BUSCA O VALOR TOTAL DA DIFERENCA DOS ITENS AF x NF*/
         BEGIN
            SELECT ROUND(SUM(VRDIFITAFNF),2) AS VRDIFITAFNF
              INTO V_VRDESCAFNF
              FROM DIFAFNF
             WHERE CDFILIAL   = P_CDFILIAL
               AND NRLANCTONF = P_NRLANCTONF;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VRDESCAFNF := 0;
         END;

         BEGIN
            SELECT SUM(VRATUAPAG)
              INTO V_TOTALPAGAR
              FROM CONTAPAGAR
             WHERE CDFILIAL = P_CDFILIAL
               AND NRLANCTONF = P_NRLANCTONF;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_TOTALPAGAR := 0;
         END;

         IF ((V_VRDESCAFNF > 0) AND (V_TOTALPAGAR > 0)) THEN
            /*BUSCA INFORMACOES DO FORNECEDOR*/
            OPEN C_AJ_FORN_AF_NF;
            FETCH C_AJ_FORN_AF_NF INTO RECORD_AJ_FORN_AF_NF;
            /*BUSCA AS CONTAS A PAGAR*/
            OPEN C_CONTAPAGAR_AF_NF(P_CDFILIAL, P_NRLANCTONF);

            IF C_AJ_FORN_AF_NF%FOUND THEN
               IF RECORD_AJ_FORN_AF_NF.IDAJUCTPAG = 'D' THEN
                  V_FATOR := -1;
               ELSE
                  V_FATOR := 1;
               END IF;
               LOOP
                  FETCH C_CONTAPAGAR_AF_NF INTO RECORD_CONTAPAGAR_AF_NF;
                  EXIT WHEN C_CONTAPAGAR_AF_NF%NOTFOUND;

                  V_VRPARDESCAFNF := ROUND(((V_VRDESCAFNF / V_TOTALPAGAR) * (RECORD_CONTAPAGAR_AF_NF.VRATUAPAG)), 2);
                  
                  /*ATUALIZA FLUXO DE CAIXA DO AJUSTE*/
                  ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                                          RECORD_CONTAPAGAR_AF_NF.CDFIMOVFLPAG,
                                          RECORD_CONTAPAGAR_AF_NF.DTATUAVENPAG,
                                          'E',
                                          RECORD_CONTAPAGAR_AF_NF.CDCLASSFINA,
                                          0,
                                          V_VRPARDESCAFNF * V_FATOR);
                  /*INSERE O AJUSTE*/
                  INSERT INTO AJCTPAGAR
                        (CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG, DTAJUSTEPAG, CDAJUCTPAG,
                         DSAJUSTEPAG, VRAJUSTEPAG, CDCLASSFINA, CDEMMFAJCNTP, CDFIMFAJCNTP,
                         DTMOVFLUXO, IDMOVFLUXO, CDECTBAJPAG, NRLCTBAJPAG)
                  VALUES
                        (RECORD_CONTAPAGAR_AF_NF.CDFILIAL, RECORD_CONTAPAGAR_AF_NF.NRLANCTONF, RECORD_CONTAPAGAR_AF_NF.NRSEQVENPAG, RECORD_CONTAPAGAR_AF_NF.NRPARCELAPAG, RECORD_CONTAPAGAR_AF_NF.DTATUAVENPAG, RECORD_AJ_FORN_AF_NF.CDAJCTPAGDIFAFNF,
                         'Ajuste', ROUND(V_VRPARDESCAFNF, 2), RECORD_CONTAPAGAR_AF_NF.CDCLASSFINA, V_CDEMPRESA, RECORD_CONTAPAGAR_AF_NF.CDFIMOVFLPAG,
                         RECORD_CONTAPAGAR_AF_NF.DTATUAVENPAG, 'E', '', '');
                  /*ATUALIZA O VALOR DA CONTA COM O AJUSTE GERADO*/
                  UPDATE CONTAPAGAR
                     SET VRATUAPAG = ROUND(VRATUAPAG + (V_VRPARDESCAFNF * V_FATOR), 2)
                   WHERE CDFILIAL = RECORD_CONTAPAGAR_AF_NF.CDFILIAL
                     AND NRLANCTONF = RECORD_CONTAPAGAR_AF_NF.NRLANCTONF
                     AND NRSEQVENPAG = RECORD_CONTAPAGAR_AF_NF.NRSEQVENPAG
                     AND NRPARCELAPAG = RECORD_CONTAPAGAR_AF_NF.NRPARCELAPAG;
                  /*ATUALIZA O VALOR DO BOLETO COM O AJUSTE GERADO*/
                  UPDATE BOLETPAGAR
                     SET VRFINALBPAG = ROUND(VRFINALBPAG + (V_VRPARDESCAFNF * V_FATOR), 2),
                         VRBOLPAG = ROUND(VRBOLPAG + (V_VRPARDESCAFNF * V_FATOR), 2)
                   WHERE CDFILIAL = RECORD_CONTAPAGAR_AF_NF.CDFILIBPAG
                     AND NRLANBOLPAG = RECORD_CONTAPAGAR_AF_NF.NRLANBOLPAG;
               END LOOP;
            END IF;
            CLOSE C_AJ_FORN_AF_NF;
            CLOSE C_CONTAPAGAR_AF_NF;
         END IF;
      END IF;
   END;
   /*GERA AJUSTES DE BONIFICACAO NAS CONTAS DO CLIENTE*/
   PROCEDURE GERA_AJUSTE_BONI_REC(P_CDCLIENTE VARCHAR2,
                                  P_CDFILIAL VARCHAR2,
                                  P_NRLANCTONF VARCHAR2)
   IS
      V_VRDESCBONI NUMBER;
      V_FATOR NUMBER;
      /*DADOS DA PARAMETRIZACAO DO CLIENTE PARA AJUSTE DE BONIFICACAO*/
      CURSOR C_AJ_CLI IS
         SELECT F.CDAJUCTREC, F.VRPEDESCCLIE, F.IDTPDESCCLIE, T.IDAJUCTREC
           FROM CLIENTE F, TIPOAJRECEBER T
          WHERE (T.CDAJUCTREC  = F.CDAJUCTREC)
            AND (F.CDCLIENTE   = P_CDCLIENTE)
            AND (F.VRPEDESCCLIE IS NOT NULL)
            AND F.IDTPDESCCLIE = 'B';
      RECORD_AJ_CLI C_AJ_CLI%ROWTYPE;
      /*DADOS DAS CONTAS A RECEBER*/
      CURSOR C_CONTARECEBER(P_CDFILIAL VARCHAR2,
                            P_NRLANCTONF VARCHAR2)
      IS
        SELECT CDFILIAL, NRLANCTONF, NRSEQVENREC, NRPARCELAREC,
                QTDIASVENREC, DTORIGVENREC, VRORIGREC,CDTPCTRECEB ,
                DTATUAVENREC, VRATUAREC, IDSTATREC, NRLANBOLREC,
                CDFILIBOLREC, CDCLASSFINA, DTMOVFLUXO, IDMOVFLUXO,
                CDFIMOVFLREC, CDEMPRESA, DSCONTAREC
           FROM CONTARECEBER
          WHERE CDFILIAL = P_CDFILIAL
            AND NRLANCTONF = P_NRLANCTONF
          ORDER BY CDFILIAL, NRLANCTONF, DTATUAVENREC;
      RECORD_CONTARECEBER C_CONTARECEBER%ROWTYPE;
   BEGIN
         /*BUSCA INFORMACOES DO CLIENTE*/
         OPEN C_AJ_CLI;
         FETCH C_AJ_CLI INTO RECORD_AJ_CLI;
         /*BUSCA AS CONTAS A PAGAR*/
         OPEN C_CONTARECEBER(P_CDFILIAL, P_NRLANCTONF);
         /*CONFERE SE O FORNECEDOR UTILIZA DESCONTO DE BONIFICACAO*/
         IF C_AJ_CLI%FOUND THEN
            IF RECORD_AJ_CLI.IDAJUCTREC = 'D' THEN
               V_FATOR := -1;
            ELSE
               V_FATOR := 1;
            END IF;
            LOOP
               FETCH C_CONTARECEBER INTO RECORD_CONTARECEBER;
               EXIT WHEN C_CONTARECEBER%NOTFOUND;
               /*VERIFICA SE O VENCIMENTO DA CONTA ESTA SUPERIOR A DATA INICIAL PARA DESCONT*/
               --IF (RECORD_CONTARECEBER.DTATUAVENPAG >= RECORD_AJ_FORN.DTINIVRPDESC) OR (RECORD_AJ_FORN.DTINIVRPDESC IS NULL) THEN
                  V_VRDESCBONI := ROUND((RECORD_CONTARECEBER.VRATUAREC * RECORD_AJ_CLI.VRPEDESCCLIE)/100, 2);
                  /*ATUALIZA FLUXO DE CAIXA DO AJUSTE*/
                  ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                                          RECORD_CONTARECEBER.CDFIMOVFLREC,
                                          RECORD_CONTARECEBER.DTATUAVENREC,
                                          'E',
                                          RECORD_CONTARECEBER.CDCLASSFINA,
                                          0,
                                          V_VRDESCBONI * V_FATOR);
                  /*INSERE O AJUSTE*/
                  INSERT INTO AJCTRECEBER
                        (CDFILIAL, NRLANCTONF, NRSEQVENREC, NRPARCELAREC, DTAJUSTEREC, CDAJUCTREC,
                         DSAJUSTEREC, VRAJUSTEREC, CDCLASSFINA, CDEMMFAJCNTR, CDFIMFAJCNTR,
                         DTMOVFLUXO, IDMOVFLUXO, CDECTBAJREC, NRLCTBAJREC)
                  VALUES
                        (RECORD_CONTARECEBER.CDFILIAL, RECORD_CONTARECEBER.NRLANCTONF, RECORD_CONTARECEBER.NRSEQVENREC, RECORD_CONTARECEBER.NRPARCELAREC, RECORD_CONTARECEBER.DTATUAVENREC, RECORD_AJ_CLI.CDAJUCTREC,
                         'Ajuste', ROUND(V_VRDESCBONI, 2), RECORD_CONTARECEBER.CDCLASSFINA, V_CDEMPRESA, RECORD_CONTARECEBER.CDFIMOVFLREC,
                         RECORD_CONTARECEBER.DTATUAVENREC, 'E', '', '');
                  /*ATUALIZA O VALOR DA CONTA COM O AJUSTE GERADO*/
                  UPDATE CONTARECEBER
                     SET VRATUAREC = ROUND(VRATUAREC + (V_VRDESCBONI * V_FATOR), 2)
                   WHERE CDFILIAL = RECORD_CONTARECEBER.CDFILIAL
                     AND NRLANCTONF = RECORD_CONTARECEBER.NRLANCTONF
                     AND NRSEQVENREC = RECORD_CONTARECEBER.NRSEQVENREC
                     AND NRPARCELAREC = RECORD_CONTARECEBER.NRPARCELAREC;
                  /*ATUALIZA O VALOR DO BOLETO COM O AJUSTE GERADO*/
                  UPDATE BOLETRECEBER
                     SET VRFINALBREC = ROUND(VRFINALBREC + (V_VRDESCBONI * V_FATOR), 2),
                         VRBOLREC = ROUND(VRBOLREC + (V_VRDESCBONI * V_FATOR), 2)
                   WHERE CDFILIAL = RECORD_CONTARECEBER.CDFILIBOLREC
                     AND NRLANBOLREC = RECORD_CONTARECEBER.NRLANBOLREC;
               --END IF;
            END LOOP;
         CLOSE C_AJ_CLI;
         CLOSE C_CONTARECEBER;
      END IF;
   END;

   /*MONTA HISTORICO PADRAO
   P_CODIGO:
   0 - DESCRICAO DE CONTAS A PAGAR
   1 - DESCRICAO DE CONTAS A RECEBER*/
   PROCEDURE MONTA_HISTORICO(P_DESCRICAO OUT VARCHAR2,
                             P_CDFILIAL IN VARCHAR2,
                             P_NRLANCTONF IN VARCHAR2,
                             P_CDHISTPADR IN VARCHAR2,
                             P_CODIGO IN VARCHAR2,
                             P_CDTPCONTA IN TIPOCTRECEBER.CDTPCTRECEB%TYPE,
                             P_DSCONTA IN VARCHAR2)
   IS
      V_DSHISTPADR VARCHAR2(2000);
      V_DSTPCONTA  VARCHAR2(40);
      V_DSPRODEMIS ITEMPRODUTO.DSPRODEMIS%TYPE;
      V_DSTPCTRECEB TIPOCTRECEBER.DSTPCTRECEB%TYPE;
      V_DTINIPERTAXA NOTAFISCAL.DTENTRSAID%TYPE;
      V_DTFIMPERTAXA NOTAFISCAL.DTENTRSAID%TYPE;
      CURSOR C_NOTAFISCAL(P_CDFILIAL VARCHAR2,
                          P_NRLANCTONF VARCHAR2)
      IS
         SELECT NF.CDFILIAL,    NF.NRLANCTONF, NF.NRNOTAFISC,
                C.NRINSJURCLIE, C.IDTPIJURCLIE,
                C.NMFANTCLIE,   C.NMRAZSOCCLIE,
                F.NRINSJURFORN, F.IDTPIJURFORN,
                F.NMFANTFORN,   F.NMRAZSOCFORN,
                NF.DTEMISSAO, NF.DTENTRSAID,
                NF.CDSERIEENTR, F.CDAJUCTPAG,
                NF.IDTPIJURNF, NF.NRINSJURNF,
                (SELECT MAX(N.NRNOTAFISC)
                   FROM ITEMNOTAFISC I, NOTAFISCAL N
                  WHERE I.CDFILIAL = P_CDFILIAL AND
                        I.NRLANCTONF = P_NRLANCTONF AND
                        I.CDFILIALIT = N.CDFILIAL AND
                        I.NRLANCTONFIT = N.NRLANCTONF) AS NRNOTAFISCRELAC
           FROM NOTAFISCAL NF, CLIENTE C, FORNECEDOR F
          WHERE CDFILIAL      = P_CDFILIAL     AND
                NRLANCTONF    = P_NRLANCTONF   AND
                NF.CDCLIENTE  = C.CDCLIENTE(+) AND
                NF.CDFORNECED = F.CDFORNECED(+);
      RECORD_NOTAFISCAL C_NOTAFISCAL%ROWTYPE;
   BEGIN
      /*BUSCA AS INFORMACOES DA NOTA FISCAL*/
      OPEN C_NOTAFISCAL(P_CDFILIAL, P_NRLANCTONF);
      FETCH C_NOTAFISCAL INTO RECORD_NOTAFISCAL;
      SELECT MAX(DSTPCTPAGAR)
        INTO V_DSTPCONTA
        FROM TIPOCTPAGAR
       WHERE CDTPCTPAGAR = P_CDTPCONTA;

      /*DESCRICAO PARA CONTA A PAGAR*/
      IF P_CODIGO = '0' THEN
         V_DSHISTPADR := P_DSCONTA;
         IF V_DSHISTPADR IS NULL THEN

            IF NOT (RECORD_NOTAFISCAL.NRNOTAFISC IS NULL) AND NOT (RECORD_NOTAFISCAL.CDSERIEENTR IS NULL) THEN
               V_DSHISTPADR := 'NF: '||RECORD_NOTAFISCAL.NRINSJURNF||' '||RECORD_NOTAFISCAL.NRNOTAFISC||' - '||RECORD_NOTAFISCAL.CDSERIEENTR;
            ELSE
               V_DSHISTPADR := 'NF: '||RECORD_NOTAFISCAL.NRINSJURNF||' Seq: '||P_NRLANCTONF;
            END IF;
         END IF;
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DCP]', P_DSCONTA);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[TCP]', V_DSTPCONTA);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[TAP]', RECORD_NOTAFISCAL.CDAJUCTPAG);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DAP]', ' ');
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DOCO]', RECORD_NOTAFISCAL.NRNOTAFISCRELAC);
      /*DESCRICAO PARA CONTA A RECEBER*/
      ELSE
         /*BUSCA A DESCRICAO PADRAO DO HISTORICO*/
         BEGIN
            SELECT DSHISTPADR
              INTO V_DSHISTPADR
              FROM HISTPADR
             WHERE CDHISTPADR = P_CDHISTPADR;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_DSHISTPADR := NULL;
         END;
         /*BUSCA DESCRICAO DO ITEM DE PRODUTO*/
         BEGIN
            SELECT MAX(DSPRODEMIS)
              INTO V_DSPRODEMIS
              FROM ITEMPRODUTO
             WHERE CDFILIAL   = P_CDFILIAL AND
                   NRLANCTONF = P_NRLANCTONF;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_DSPRODEMIS := NULL;
         END;

         /*SUBSTITUICAO DOS MNEUMONICOS PELOS VALORES CORRESPONDENTES*/
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DOC]', RECORD_NOTAFISCAL.NRNOTAFISC);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[FIL]', RECORD_NOTAFISCAL.CDFILIAL);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[SEQ]', RECORD_NOTAFISCAL.NRLANCTONF);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[CLI]', RECORD_NOTAFISCAL.NRINSJURCLIE);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[NFC]', RECORD_NOTAFISCAL.NMFANTCLIE);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[RSC]', RECORD_NOTAFISCAL.NMRAZSOCCLIE);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[FOR]', RECORD_NOTAFISCAL.NRINSJURFORN);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[NFF]', RECORD_NOTAFISCAL.NMFANTFORN);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[NMPR]', V_DSPRODEMIS);
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DTEM-MA]', TO_CHAR(RECORD_NOTAFISCAL.DTEMISSAO, 'MM/YYYY'));
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DTES-MA]', TO_CHAR(RECORD_NOTAFISCAL.DTENTRSAID, 'MM/YYYY'));
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DTEM]', TO_CHAR(RECORD_NOTAFISCAL.DTEMISSAO, 'DD/MM/YYYY'));
         V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DTES]', TO_CHAR(RECORD_NOTAFISCAL.DTENTRSAID,'DD/MM/YYYY'));

         /*VERIFICA SE A NF CORRESPONDE A APURACAO DO ROYALT/MARKETING DO SISTEMA VND*/
         V_DTINIPERTAXA := NULL;
         V_DTFIMPERTAXA := NULL;
         BEGIN
            SELECT DTINIPERTAXA, DTFIMPERTAXA
              INTO V_DTINIPERTAXA, V_DTFIMPERTAXA
              FROM MOVTOFRANQUIA
             WHERE CDFILIALNF        = P_CDFILIAL    AND
                   ((NRLANCTONFROYA  = P_NRLANCTONF) OR
                    (NRLANCTONFMARK  = P_NRLANCTONF));
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_DTINIPERTAXA := NULL;
               V_DTFIMPERTAXA := NULL;
         END;

         /*CASO A NF SEJA REFERENTE A ROYALT/MARKETING, E GERADA A DESCRICAO DA CONTA DE ACORDO COM O MNEUMONICO DE ROYALT, DESDE QUE ESTEJA PARAMETRIZADO*/
         IF V_DTINIPERTAXA IS NOT NULL THEN
            /*BUSCA DESCRICAO DO TIPO DE CONTA A RECEBER*/
            BEGIN
               SELECT DSTPCTRECEB
                 INTO V_DSTPCTRECEB
                 FROM TIPOCTRECEBER
                WHERE CDTPCTRECEB = P_CDTPCONTA;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_DSTPCTRECEB := NULL;
            END;

            V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DSTPREC]', V_DSTPCTRECEB);
            V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DTIROYMA]', TO_CHAR(V_DTINIPERTAXA,'MON')||TO_CHAR(V_DTINIPERTAXA,'/YYYY'));
            V_DSHISTPADR := REPLACE(V_DSHISTPADR, '[DTFROYMA]', TO_CHAR(V_DTFIMPERTAXA,'MON')||TO_CHAR(V_DTFIMPERTAXA,'/YYYY'));
         END IF;

      END IF;
      P_DESCRICAO  := SUBSTR(V_DSHISTPADR, 1, 200);
      IF C_NOTAFISCAL%ISOPEN THEN
         CLOSE C_NOTAFISCAL;
      END IF;
   END;

   /*VERIFICA SE O CENTRO DE CUSTO ESTA RELACIONADO A FILIAL*/
   FUNCTION VD_CENTCUSTFIL(P_CDFILIAL IN VARCHAR2,
                           P_CDCENTCUST IN VARCHAR2) RETURN BOOLEAN
   IS
      V_COUNT NUMBER;
   BEGIN
      SELECT COUNT(*)
        INTO V_COUNT
        FROM CENTCUSTFIL
       WHERE CDFILIAL = P_CDFILIAL
         AND P_CDCENTCUST = P_CDCENTCUST;
      IF V_COUNT = 0 THEN
         RETURN(FALSE);
      ELSE
         RETURN(TRUE);
      END IF;
   END;

   /*GERA RATEIO FINANCEIRO PARA AS CONTAS A PAGAR RELACIONADAS A NOTA FISCAL*/
   PROCEDURE GERA_RATEIO_PAG(P_CDEMPRESA IN VARCHAR2,
                             P_CDFILIORIG IN VARCHAR2,
                             P_CDFILIAL IN VARCHAR2,
                             P_NRLANCTONF IN VARCHAR2,
                             P_NRLANCCONT IN VARCHAR2)

   IS
      V_NRPARCELA NUMBER;
      V_VRPARCELA NUMBER;
      V_VRACUMULADO NUMBER;
      V_CDFILIAL VARCHAR2(4);
      V_CDFILIRAT VARCHAR2(4);
      V_CDCENTCUST VARCHAR2(4);
   BEGIN
     /*APAGA, CASO EXISTA, OS RATEIOS DA CONTA A PAGAR DA NOTA FISCAL*/
      DELETE FROM RATCTPAGAR
       WHERE CDFILIAL = P_CDFILIAL
         AND NRLANCTONF = P_NRLANCTONF;

     /*PEGA O TIPO DE CONTA PARAMETRIZADO PARA CADAS PRODUTO DA NOTA E GRAVA NA TABELA RATEIONF*/
      OPEN C_TP_CONTA_RATEIO_PAG(P_CDFILIAL, P_NRLANCTONF);
      LOOP
          FETCH C_TP_CONTA_RATEIO_PAG INTO RECORD_TPCONTARATPAG;
          EXIT WHEN C_TP_CONTA_RATEIO_PAG%NOTFOUND;

         UPDATE RATEIONF
            SET CDTPCTPAGAR = RECORD_TPCONTARATPAG.CDTPCTPAGAR
          WHERE CDFILIAL    = RECORD_TPCONTARATPAG.CDFILIAL
            AND NRLANCTONF  = RECORD_TPCONTARATPAG.NRLANCTONF
            AND NRSEQITPROD = RECORD_TPCONTARATPAG.NRSEQITPROD;
      END LOOP;
      CLOSE C_TP_CONTA_RATEIO_PAG;


      FOR C_CTPAGRAT IN (SELECT DISTINCT CDTPCTPAGAR
                         FROM CONTAPAGAR
                        WHERE CDFILIAL = P_CDFILIAL
                          AND NRLANCTONF = P_NRLANCTONF) LOOP
         BEGIN
            SELECT MAX(CDTPCTPAGAR)
             INTO V_CDTPCTRAT
             FROM RATEIONF
            WHERE CDFILIAL    = P_CDFILIAL
              AND NRLANCTONF  = P_NRLANCTONF
              AND CDTPCTPAGAR = C_CTPAGRAT.CDTPCTPAGAR;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDTPCTRAT := NULL;
         END;

         IF (V_CDTPCTRAT IS NULL) THEN
            V_TIPOCTDIFE := 'S';
         END IF;

      END LOOP;

      /*BUSCA AS CONTAS RELACIONADAS A NOTA FISCAL E INSERE RATEIO PARA CADA UMA DELAS*/
      FOR C_CTPAG IN (SELECT CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG, CDTPCTPAGAR, VRATUAPAG
                        FROM CONTAPAGAR
                       WHERE CDFILIAL = P_CDFILIAL
                         AND NRLANCTONF = P_NRLANCTONF) LOOP
         SELECT COUNT(*)
           INTO V_NRPARCELA
           FROM RATEIONF
          WHERE CDFILIAL = P_CDFILIAL
            AND NRLANCTONF = P_NRLANCTONF;

         V_VRPARCELA := 0;
         V_VRACUMULADO := 0;
         V_COUNT := 0;

         IF V_NRPARCELA > 0 THEN
            FOR C_RATEIO IN (SELECT RT.CDFILIAL, RT.NRLANCTONF, RT.CDFILICCUST, RT.CDCENTCUSNF, ((SUM(RT.VRRATENF) * 100) / DECODE(VRTOTAL, 0, 1, VRTOTAL))  AS VRPERCENTUAL
                               FROM RATEIONF RT, (SELECT SUM(VRRATENF) AS VRTOTAL
                                                    FROM RATEIONF
                                                   WHERE CDFILIAL = P_CDFILIAL
                                                     AND NRLANCTONF = P_NRLANCTONF
                                                     AND ((NVL(CDTPCTPAGAR,C_CTPAG.CDTPCTPAGAR) = C_CTPAG.CDTPCTPAGAR) OR V_TIPOCTDIFE = 'S'))
                              WHERE RT.CDFILIAL = P_CDFILIAL
                                AND RT.NRLANCTONF = P_NRLANCTONF
                                AND ((NVL(RT.CDTPCTPAGAR,C_CTPAG.CDTPCTPAGAR) = C_CTPAG.CDTPCTPAGAR) OR V_TIPOCTDIFE = 'S')
                             GROUP BY RT.CDFILIAL, RT.NRLANCTONF, RT.CDFILICCUST, RT.CDCENTCUSNF, VRTOTAL) LOOP

               V_VRPARCELA := ROUND(((C_CTPAG.VRATUAPAG * C_RATEIO.VRPERCENTUAL) / 100), 2);

               V_VRACUMULADO := ROUND(V_VRACUMULADO + V_VRPARCELA, 2);

               INSERT INTO RATCTPAGAR
                  (CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                   CDCENTCUST, CDFIRATCTPAG, VRRATCCCTPAG)
               VALUES
                  (C_CTPAG.CDFILIAL, C_CTPAG.NRLANCTONF, C_CTPAG.NRSEQVENPAG, C_CTPAG.NRPARCELAPAG,
                   C_RATEIO.CDCENTCUSNF, C_RATEIO.CDFILICCUST, V_VRPARCELA);

               V_RATEIO_CDCENTCUSNF := C_RATEIO.CDCENTCUSNF;
               V_RATEIO_CDFILICCUST := C_RATEIO.CDFILICCUST;
            END LOOP;

            IF V_VRACUMULADO <> C_CTPAG.VRATUAPAG THEN
               V_VRACUMULADO := C_CTPAG.VRATUAPAG - V_VRACUMULADO;
               UPDATE RATCTPAGAR
                  SET VRRATCCCTPAG = VRRATCCCTPAG + V_VRACUMULADO
                WHERE CDFILIAL = C_CTPAG.CDFILIAL
                  AND NRLANCTONF = C_CTPAG.NRLANCTONF
                  AND NRSEQVENPAG = C_CTPAG.NRSEQVENPAG
                  AND NRPARCELAPAG = C_CTPAG.NRPARCELAPAG
                  AND CDCENTCUST = V_RATEIO_CDCENTCUSNF
                  AND CDFIRATCTPAG = V_RATEIO_CDFILICCUST;
            END IF;

         ELSE
            V_RATPROD := 'N';
            /*BUSCA OS PRODUTOS DA NOTA FISCAL*/
            FOR C_PROD_CONTA IN (SELECT P3.CDPRODUTO, P4.CDARVPROD, P4.CDRATEIO,
                                        ROUND(I.VRBRUTITEM,2) AS VRBRUTITEM
                                   FROM ITEMPRODUTO I, PRODUTO P3, PRODUTO P4
                                  WHERE I.CDFILIAL   =   C_CTPAG.CDFILIAL
                                    AND I.NRLANCTONF = C_CTPAG.NRLANCTONF
                                    AND I.CDPRODUTO = P3.CDPRODUTO
                                    AND (INSTR(P3.CDARVPROD,NVL(RTRIM(P4.CDARVPROD),P3.CDARVPROD)) = 1)
                                    AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
                                                          FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
                                                         WHERE IT.CDFILIAL = I.CDFILIAL
                                                           AND IT.NRLANCTONF = I.NRLANCTONF
                                                           AND IT.CDPRODUTO = I.CDPRODUTO
                                                           AND IT.CDPRODUTO = P.CDPRODUTO
                                                           AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1))) LOOP

               IF C_PROD_CONTA.CDRATEIO IS NOT NULL THEN
                  /*BUSCA PADRAO DE RATEIO DO PRODUTO*/
                  FOR C_PADRAT IN (SELECT CDFILIAL AS CDFILICCUST, CDCENTCUST AS CDCENTCUSNF, (VRRATEIO/100) AS VRRATEIO
                                     FROM ITEMRATEIO
                                    WHERE CDRATEIO = C_PROD_CONTA.CDRATEIO) LOOP
                     V_RATPROD := 'S';
                     V_VRPARCELA := ROUND((C_PROD_CONTA.VRBRUTITEM * C_PADRAT.VRRATEIO),2);
                     V_VRACUMULADO := V_VRACUMULADO + V_VRPARCELA;

                     BEGIN
                        SELECT CDFILIAL
                          INTO V_CDFILIRAT
                          FROM RATCTPAGAR
                         WHERE CDFILIAL     = C_CTPAG.CDFILIAL
                           AND NRLANCTONF   = C_CTPAG.NRLANCTONF
                           AND NRSEQVENPAG  = C_CTPAG.NRSEQVENPAG
                           AND NRPARCELAPAG = C_CTPAG.NRPARCELAPAG
                           AND CDCENTCUST  = C_PADRAT.CDCENTCUSNF
                           AND CDFIRATCTPAG = C_PADRAT.CDFILICCUST;
                     EXCEPTION WHEN NO_DATA_FOUND THEN
                           V_CDFILIRAT := NULL;

                     END;
                     IF V_CDFILIRAT IS NULL THEN
                        INSERT INTO RATCTPAGAR
                            (CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                             CDCENTCUST, CDFIRATCTPAG, VRRATCCCTPAG)
                         VALUES
                            (C_CTPAG.CDFILIAL, C_CTPAG.NRLANCTONF, C_CTPAG.NRSEQVENPAG, C_CTPAG.NRPARCELAPAG,
                             C_PADRAT.CDCENTCUSNF, C_PADRAT.CDFILICCUST, V_VRPARCELA);

                        V_RATEIO_CDCENTCUSNF := C_PADRAT.CDCENTCUSNF;
                        V_RATEIO_CDFILICCUST := C_PADRAT.CDFILICCUST;
                     ELSE
                         UPDATE  RATCTPAGAR
                            SET  VRRATCCCTPAG = VRRATCCCTPAG +  V_VRPARCELA
                          WHERE CDFILIAL     = C_CTPAG.CDFILIAL
                            AND NRLANCTONF   = C_CTPAG.NRLANCTONF
                            AND NRSEQVENPAG  = C_CTPAG.NRSEQVENPAG
                            AND NRPARCELAPAG = C_CTPAG.NRPARCELAPAG
                            AND CDCENTCUST  = C_PADRAT.CDCENTCUSNF
                            AND CDFIRATCTPAG = C_PADRAT.CDFILICCUST;
                     END IF;

                  END LOOP;
               ELSE
                  /*BUSCA O CENTRO DE CUSTO DA FILIAL. SE NAO PARAMETRIZADO, PEGA O DA EMPRESA*/
                  BEGIN
                     SELECT MAX(CDFILIAL) AS CDFILIAL, MAX(CDCENTCUST) AS CDCENTCUST
                       INTO V_CDFILIAL, V_CDCENTCUST
                       FROM
                       (SELECT F.CDFILIAL, NVL(F.CDCENTCUST, E.CDCENTCUST) AS CDCENTCUST
                         FROM FILIAL F, EMPRESA E
                        WHERE F.CDFILIAL   = P_CDFILIORIG AND
                              E.CDEMPRESA  = P_CDEMPRESA  AND
                              F.CDEMPRESA  = E.CDEMPRESA
                        UNION
                       SELECT F.CDFILIAL, NVL(F.CDCENTCUST, E.CDCENTCUST) AS CDCENTCUST
                         FROM FILIAL F, EMPRESA E, EMPRCNTRFIL EC
                        WHERE EC.CDFILIAL   = P_CDFILIORIG AND
                              EC.CDEMPRESA  = P_CDEMPRESA  AND
                              E.CDEMPRESA   = EC.CDEMPRESA AND
                              F.CDFILIAL = EC.CDFILIAL);
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_CDFILIAL := NULL;
                        V_CDCENTCUST := NULL;
                  END;
                  V_VRPARCELA := C_PROD_CONTA.VRBRUTITEM;
                  V_VRACUMULADO := ROUND(V_VRACUMULADO + V_VRPARCELA, 2);
                  IF NOT (V_CDFILIAL IS NULL) AND NOT (V_CDCENTCUST IS NULL) THEN
                     IF VD_CENTCUSTFIL(V_CDFILIAL, V_CDCENTCUST) THEN
                        BEGIN
                           SELECT CDFILIAL
                             INTO V_CDFILIRAT
                             FROM RATCTPAGAR
                            WHERE CDFILIAL     = C_CTPAG.CDFILIAL
                              AND NRLANCTONF   = C_CTPAG.NRLANCTONF
                              AND NRSEQVENPAG  = C_CTPAG.NRSEQVENPAG
                              AND NRPARCELAPAG = C_CTPAG.NRPARCELAPAG
                              AND CDCENTCUST   = V_CDCENTCUST
                              AND CDFIRATCTPAG = V_CDFILIAL;
                        EXCEPTION WHEN NO_DATA_FOUND THEN
                              V_CDFILIRAT := NULL;

                        END;
                        IF V_CDFILIRAT IS NULL THEN
                           INSERT INTO RATCTPAGAR
                               (CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                                CDCENTCUST, CDFIRATCTPAG, VRRATCCCTPAG)
                            VALUES
                               (C_CTPAG.CDFILIAL, C_CTPAG.NRLANCTONF, C_CTPAG.NRSEQVENPAG, C_CTPAG.NRPARCELAPAG,
                                V_CDCENTCUST, V_CDFILIAL, V_VRPARCELA);

                           V_RATEIO_CDCENTCUSNF := V_CDCENTCUST;
                           V_RATEIO_CDFILICCUST := V_CDFILIAL;
                        ELSE
                            UPDATE  RATCTPAGAR
                               SET  VRRATCCCTPAG = VRRATCCCTPAG +  V_VRPARCELA
                             WHERE CDFILIAL     = C_CTPAG.CDFILIAL
                               AND NRLANCTONF   = C_CTPAG.NRLANCTONF
                               AND NRSEQVENPAG  = C_CTPAG.NRSEQVENPAG
                               AND NRPARCELAPAG = C_CTPAG.NRPARCELAPAG
                               AND CDCENTCUST   = V_CDCENTCUST
                               AND CDFIRATCTPAG = V_CDFILIAL;
                        END IF;
                     ELSE
                        /*CENTRO DE CUSTO (CDCENTCUST) NAO CADASTRADO PARA A FILIAL (CDFILIAL)*/
                        P_RESULTADO := 'NOT_CENTCUSTFIL_' || V_CDCENTCUST || V_CDFILIAL;
                        RETURN;
                     END IF;
                  END IF;
               END IF;
               IF V_VRACUMULADO <> C_PROD_CONTA.VRBRUTITEM THEN
                  V_VRACUMULADO := C_PROD_CONTA.VRBRUTITEM - V_VRACUMULADO;
                  UPDATE RATCTPAGAR
                     SET VRRATCCCTPAG = VRRATCCCTPAG + V_VRACUMULADO
                   WHERE CDFILIAL = C_CTPAG.CDFILIAL
                     AND NRLANCTONF = C_CTPAG.NRLANCTONF
                     AND NRSEQVENPAG = C_CTPAG.NRSEQVENPAG
                     AND NRPARCELAPAG = C_CTPAG.NRPARCELAPAG
                     AND CDCENTCUST = V_RATEIO_CDCENTCUSNF
                     AND CDFIRATCTPAG = V_RATEIO_CDFILICCUST;
               END IF;
            END LOOP;
            SELECT COUNT(*)
              INTO V_NRPARCELA
              FROM RATTPCTP
             WHERE CDTPCTPAGAR = C_CTPAG.CDTPCTPAGAR;
            IF (V_NRPARCELA = 0 AND V_RATPROD = 'N' )THEN

               /*BUSCA INFORMACOES DO PARAMETRO PARA CENTRO DE CUSTO*/
               FOR C_RATTPCTP IN (SELECT CDTPCTPAGAR, CDCENTCUST,
                                         DECODE(CDFIRATTPCTP,'----', P_CDFILIORIG, CDFIRATTPCTP) AS CDFIRATTPCTP,
                                         CDFILIAL, (VRPERATTPCTP/100) AS VRPERATTPCTP
                                    FROM RATTPCTP
                                   WHERE CDTPCTPAGAR = C_CTPAG.CDTPCTPAGAR) LOOP
                  V_VRPARCELA := ROUND((C_CTPAG.VRATUAPAG * C_RATTPCTP.VRPERATTPCTP),2);
                  V_VRACUMULADO := V_VRACUMULADO + V_VRPARCELA;
                  IF V_COUNT = V_NRPARCELA  THEN
                     V_VRPARCELA := V_VRPARCELA + ROUND(C_CTPAG.VRATUAPAG - V_VRACUMULADO,2);
                  END IF;
                  IF NOT (C_RATTPCTP.CDFIRATTPCTP IS NULL) AND NOT (C_RATTPCTP.CDCENTCUST IS NULL) THEN
                     IF VD_CENTCUSTFIL(C_RATTPCTP.CDFIRATTPCTP, C_RATTPCTP.CDCENTCUST) THEN
                        /*INSERE RATEIO PARA A CONTA A PAGAR*/
                        INSERT INTO RATCTPAGAR
                           (CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                            CDCENTCUST, CDFIRATCTPAG, VRRATCCCTPAG)
                        VALUES
                           (C_CTPAG.CDFILIAL, C_CTPAG.NRLANCTONF, C_CTPAG.NRSEQVENPAG, C_CTPAG.NRPARCELAPAG,
                            C_RATTPCTP.CDCENTCUST, C_RATTPCTP.CDFIRATTPCTP, V_VRPARCELA);
                     ELSE
                        /*CENTRO DE CUSTO (CDCENTCUST) NAO CADASTRADO PARA A FILIAL (CDFILIAL)*/
                        P_RESULTADO := 'NOT_CENTCUSTFIL_' || C_RATTPCTP.CDCENTCUST || C_RATTPCTP.CDFIRATTPCTP;
                        RETURN;
                     END IF;
                  END IF;
                  V_COUNT := V_COUNT + 1;
               END LOOP;
            ELSE
               IF V_RATPROD = 'N' THEN
                  /*BUSCA O CENTRO DE CUSTO DA FILIAL. SE NAO PARAMETRIZADO, PEGA O DA EMPRESA*/
                  BEGIN
                     SELECT MAX(CDFILIAL) AS CDFILIAL, MAX(CDCENTCUST) AS CDCENTCUST
                       INTO V_CDFILIAL, V_CDCENTCUST
                       FROM
                       (SELECT F.CDFILIAL, NVL(F.CDCENTCUST, E.CDCENTCUST) AS CDCENTCUST
                         FROM FILIAL F, EMPRESA E
                        WHERE F.CDFILIAL   = P_CDFILIORIG AND
                              E.CDEMPRESA  = P_CDEMPRESA  AND
                              F.CDEMPRESA  = E.CDEMPRESA
                        UNION
                       SELECT F.CDFILIAL, NVL(F.CDCENTCUST, E.CDCENTCUST) AS CDCENTCUST
                         FROM FILIAL F, EMPRESA E, EMPRCNTRFIL EC
                        WHERE EC.CDFILIAL   = P_CDFILIORIG AND
                              EC.CDEMPRESA  = P_CDEMPRESA  AND
                              E.CDEMPRESA   = EC.CDEMPRESA AND
                              F.CDFILIAL = EC.CDFILIAL);
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_CDFILIAL := NULL;
                        V_CDCENTCUST := NULL;
                  END;
                  V_VRPARCELA := C_CTPAG.VRATUAPAG;
                  IF NOT (V_CDFILIAL IS NULL) AND NOT (V_CDCENTCUST IS NULL) THEN
                     IF VD_CENTCUSTFIL(V_CDFILIAL, V_CDCENTCUST) THEN
                        BEGIN
                           SELECT CDFILIAL
                             INTO V_CDFILIRAT
                             FROM RATCTPAGAR
                            WHERE CDFILIAL     = C_CTPAG.CDFILIAL
                              AND NRLANCTONF   = C_CTPAG.NRLANCTONF
                              AND NRSEQVENPAG  = C_CTPAG.NRSEQVENPAG
                              AND NRPARCELAPAG = C_CTPAG.NRPARCELAPAG
                              AND CDCENTCUST   = V_CDCENTCUST
                              AND CDFIRATCTPAG = V_CDFILIAL;
                        EXCEPTION WHEN NO_DATA_FOUND THEN
                              V_CDFILIRAT := NULL;

                        END;
                        IF V_CDFILIRAT IS NULL THEN
                           /*INSERE RATEIO DA CONTA A PAGAR*/
                           INSERT INTO RATCTPAGAR
                                (CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                                 CDCENTCUST, CDFIRATCTPAG, VRRATCCCTPAG)
                             VALUES
                                (C_CTPAG.CDFILIAL, C_CTPAG.NRLANCTONF, C_CTPAG.NRSEQVENPAG, C_CTPAG.NRPARCELAPAG,
                                V_CDCENTCUST, V_CDFILIAL, V_VRPARCELA);

                           V_RATEIO_CDCENTCUSNF := V_CDCENTCUST;
                           V_RATEIO_CDFILICCUST := V_CDFILIAL;
                        ELSE
                            UPDATE  RATCTPAGAR
                               SET  VRRATCCCTPAG = VRRATCCCTPAG +  V_VRPARCELA
                             WHERE CDFILIAL     = C_CTPAG.CDFILIAL
                               AND NRLANCTONF   = C_CTPAG.NRLANCTONF
                               AND NRSEQVENPAG  = C_CTPAG.NRSEQVENPAG
                               AND NRPARCELAPAG = C_CTPAG.NRPARCELAPAG
                               AND CDCENTCUST   = V_CDCENTCUST
                               AND CDFIRATCTPAG = V_CDFILIAL;
                        END IF;
                     ELSE
                        /*CENTRO DE CUSTO (CDCENTCUST) NAO CADASTRADO PARA A FILIAL (CDFILIAL)*/
                        P_RESULTADO := 'NOT_CENTCUSTFIL_' || V_CDCENTCUST || V_CDFILIAL;
                        RETURN;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END IF;
     END LOOP;
   END;

   /*GERA RATEIO FINANCEIRO PARA AS CONTAS A RECEBER RELACIONADAS A NOTA FISCAL*/
   PROCEDURE GERA_RATEIO_REC(P_CDEMPRESA IN VARCHAR2,
                             P_CDFILIORIG IN VARCHAR2,
                             P_CDFILIAL IN VARCHAR2,
                             P_NRLANCTONF IN VARCHAR2,
                             P_NRLANCCONT IN VARCHAR2)

    IS
      V_COUNT NUMBER;
      V_NRPARCELA NUMBER;
      V_VRPARCELA NUMBER;
      V_VRACUMULADO NUMBER;
      V_CDFILIAL VARCHAR2(4);
      V_CDCENTCUST VARCHAR2(4);
      V_IDCENTCUSTCLI VARCHAR2(01);
      V_CDFILIRAT   VARCHAR2(4);
   BEGIN
     /*APAGA, CASO EXISTA, OS RATEIOS DA CONTA A PAGAR DA NOTA FISCAL*/
      DELETE FROM RATCTRECEBER
       WHERE CDFILIAL = P_CDFILIAL
         AND NRLANCTONF = P_NRLANCTONF;
     SELECT IDCENTCUSCLIFOR
       INTO V_IDCENTCUSTCLI
       FROM PARAMGERAL;
     IF V_IDCENTCUSTCLI = 'S' THEN

        SELECT CDCENTCUSTCLI, CDFILIEMIT
          INTO V_CDCENTCUST , V_CDFILIRAT
          FROM CLIENTE C , NOTAFISCAL N
         WHERE C.CDCLIENTE  = N.CDCLIENTE
           AND N.CDFILIAL   = P_CDFILIAL
           AND N.NRLANCTONF = P_NRLANCTONF;
     END IF;
     /*PEGA O TIPO DE CONTA PARAMETRIZADO PARA CADAS PRODUTO DA NOTA E GRAVA NA TABELA RATEIONF*/
      OPEN C_TP_CONTA_RATEIO_REC(P_CDFILIAL, P_NRLANCTONF);
      LOOP
          FETCH C_TP_CONTA_RATEIO_REC INTO RECORD_TPCONTARATREC;
          EXIT WHEN C_TP_CONTA_RATEIO_REC%NOTFOUND;

         UPDATE RATEIONF
            SET CDTPCTRECEB = RECORD_TPCONTARATREC.CDTPCTRECEB
          WHERE CDFILIAL    = RECORD_TPCONTARATREC.CDFILIAL
            AND NRLANCTONF  = RECORD_TPCONTARATREC.NRLANCTONF
            AND NRSEQITPROD = RECORD_TPCONTARATREC.NRSEQITPROD;
      END LOOP;
      CLOSE C_TP_CONTA_RATEIO_REC;

      FOR C_CTRECRAT IN (SELECT DISTINCT CDTPCTRECEB
                         FROM CONTARECEBER
                        WHERE CDFILIAL = P_CDFILIAL
                          AND NRLANCTONF = P_NRLANCTONF) LOOP
         BEGIN
            SELECT MAX(CDTPCTRECEB)
             INTO V_CDTPCTRAT
             FROM RATEIONF
            WHERE CDFILIAL    = P_CDFILIAL
              AND NRLANCTONF  = P_NRLANCTONF
              AND CDTPCTRECEB = C_CTRECRAT.CDTPCTRECEB;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDTPCTRAT := NULL;
         END;

         IF (V_CDTPCTRAT IS NULL) THEN
            V_TIPOCTDIFE := 'S';
         END IF;

      END LOOP;


      /*BUSCA AS CONTAS RELACIONADAS A NOTA FISCAL E INSERE RATEIO PARA CADA UMA DELAS*/
      FOR C_CTREC IN (SELECT CDFILIAL, NRLANCTONF, NRSEQVENREC, NRPARCELAREC, VRATUAREC, CDTPCTRECEB
                        FROM CONTARECEBER
                       WHERE CDFILIAL = P_CDFILIAL
                         AND NRLANCTONF = P_NRLANCTONF) LOOP

         SELECT COUNT(*)
           INTO V_NRPARCELA
           FROM RATEIONF
          WHERE CDFILIAL = P_CDFILIAL
            AND NRLANCTONF = P_NRLANCTONF;

         V_VRPARCELA := 0;
         V_VRACUMULADO := 0;
         V_COUNT := 0;
         IF (V_CDCENTCUST IS NOT NULL AND V_CDFILIRAT IS NOT NULL) THEN
             INSERT INTO RATCTRECEBER
                     (CDFILIAL, NRLANCTONF, NRSEQVENREC, NRPARCELAREC,
                      CDCENTCUST, CDFIRATCTREC, VRRATCCCTREC)
               VALUES
                  (C_CTREC.CDFILIAL, C_CTREC.NRLANCTONF, C_CTREC.NRSEQVENREC, C_CTREC.NRPARCELAREC,
                   V_CDCENTCUST, V_CDFILIRAT, C_CTREC.VRATUAREC);
         ELSIF V_NRPARCELA > 0 THEN
            FOR C_RATEIO IN (SELECT RT.CDFILIAL, RT.NRLANCTONF, RT.CDFILICCUST, RT.CDCENTCUSNF, ((SUM(RT.VRRATENF) * 100) / DECODE(VRTOTAL, 0, 1, VRTOTAL))  AS VRPERCENTUAL
                               FROM RATEIONF RT, (SELECT SUM(VRRATENF) AS VRTOTAL
                                                    FROM RATEIONF
                                                   WHERE CDFILIAL = P_CDFILIAL
                                                     AND NRLANCTONF = P_NRLANCTONF
                                                     AND ((NVL(CDTPCTRECEB,C_CTREC.CDTPCTRECEB) = C_CTREC.CDTPCTRECEB) OR V_TIPOCTDIFE = 'S'))
                              WHERE RT.CDFILIAL = P_CDFILIAL
                                AND RT.NRLANCTONF = P_NRLANCTONF
                                AND ((NVL(RT.CDTPCTRECEB,C_CTREC.CDTPCTRECEB) = C_CTREC.CDTPCTRECEB) OR V_TIPOCTDIFE = 'S')
                             GROUP BY RT.CDFILIAL, RT.NRLANCTONF, RT.CDFILICCUST, RT.CDCENTCUSNF, VRTOTAL) LOOP

               V_VRPARCELA := ROUND(((C_CTREC.VRATUAREC * C_RATEIO.VRPERCENTUAL) / 100), 2);

               V_VRACUMULADO := ROUND(V_VRACUMULADO + V_VRPARCELA, 2);

               INSERT INTO RATCTRECEBER
                     (CDFILIAL, NRLANCTONF, NRSEQVENREC, NRPARCELAREC,
                      CDCENTCUST, CDFIRATCTREC, VRRATCCCTREC)
               VALUES
                  (C_CTREC.CDFILIAL, C_CTREC.NRLANCTONF, C_CTREC.NRSEQVENREC, C_CTREC.NRPARCELAREC,
                   C_RATEIO.CDCENTCUSNF, C_RATEIO.CDFILICCUST, V_VRPARCELA);

               V_RATEIO_CDCENTCUSNF := C_RATEIO.CDCENTCUSNF;
               V_RATEIO_CDFILICCUST := C_RATEIO.CDFILICCUST;
            END LOOP;

            IF V_VRACUMULADO <> C_CTREC.VRATUAREC THEN
               V_VRACUMULADO := C_CTREC.VRATUAREC - V_VRACUMULADO;
               UPDATE RATCTRECEBER
                  SET VRRATCCCTREC = VRRATCCCTREC + V_VRACUMULADO
                WHERE CDFILIAL = C_CTREC.CDFILIAL
                  AND NRLANCTONF = C_CTREC.NRLANCTONF
                  AND NRSEQVENREC = C_CTREC.NRSEQVENREC
                  AND NRPARCELAREC = C_CTREC.NRPARCELAREC
                  AND CDCENTCUST = V_RATEIO_CDCENTCUSNF
                  AND CDFIRATCTREC = V_RATEIO_CDFILICCUST;
            END IF;

         ELSE

            SELECT COUNT(*)
              INTO V_NRPARCELA
              FROM RATTPCTR
             WHERE CDTPCTRECEB = C_CTREC.CDTPCTRECEB;

            IF V_NRPARCELA > 0 THEN
               /*BUSCA INFORMAAAES DO PARAMETRO PARA CENTRO DE CUSTO*/
               FOR C_RATTPCTR IN (SELECT CDTPCTRECEB, CDCENTCUST,
                                         DECODE(CDFIRATTPCTR,'----', P_CDFILIORIG, CDFIRATTPCTR) AS CDFIRATTPCTR,
                                         CDFILIAL, (VRPERATTPCTR/100) AS VRPERATTPCTR
                                    FROM RATTPCTR
                                   WHERE CDTPCTRECEB = C_CTREC.CDTPCTRECEB) LOOP
                  V_VRPARCELA := ROUND(C_CTREC.VRATUAREC * C_RATTPCTR.VRPERATTPCTR,2);
                  V_VRACUMULADO := V_VRACUMULADO + V_VRPARCELA;
                  IF V_COUNT = V_NRPARCELA  THEN
                     V_VRPARCELA := V_VRPARCELA + ROUND(C_CTREC.VRATUAREC - V_VRACUMULADO,2);
                  END IF;
                  IF NOT (C_RATTPCTR.CDFIRATTPCTR IS NULL) AND NOT (C_RATTPCTR.CDCENTCUST IS NULL) THEN
                     IF VD_CENTCUSTFIL(C_RATTPCTR.CDFIRATTPCTR, C_RATTPCTR.CDCENTCUST) THEN
                        /*INSERE RATEIO PARA A CONTA A PAGAR*/
                        INSERT INTO RATCTRECEBER
                           (CDFILIAL, NRLANCTONF, NRSEQVENREC, NRPARCELAREC,
                            CDCENTCUST, CDFIRATCTREC, VRRATCCCTREC)
                        VALUES
                           (C_CTREC.CDFILIAL, C_CTREC.NRLANCTONF, C_CTREC.NRSEQVENREC, C_CTREC.NRPARCELAREC,
                            C_RATTPCTR.CDCENTCUST, C_RATTPCTR.CDFIRATTPCTR, V_VRPARCELA);
                     ELSE
                        /*CENTRO DE CUSTO (CDCENTCUST) NAFO CADASTRADO PARA A FILIAL (CDFILIAL)*/
                        P_RESULTADO := 'NOT_CENTCUSTFIL_' || C_RATTPCTR.CDCENTCUST || C_RATTPCTR.CDFIRATTPCTR;
                        RETURN;
                     END IF;
                  END IF;
                  V_COUNT := V_COUNT + 1;
               END LOOP;
            ELSE
               /*BUSCA O CENTRO DE CUSTO DA FILIAL. SE NAFO PARAMETRIZADO, PEGA O DA EMPRESA*/
               BEGIN
                  SELECT MAX(CDFILIAL) AS CDFILIAL, MAX(CDCENTCUST) AS CDCENTCUST
                    INTO V_CDFILIAL, V_CDCENTCUST
                    FROM
                    (SELECT F.CDFILIAL, NVL(F.CDCENTCUST, E.CDCENTCUST) AS CDCENTCUST
                      FROM FILIAL F, EMPRESA E
                     WHERE F.CDFILIAL   = P_CDFILIORIG AND
                           E.CDEMPRESA  = P_CDEMPRESA  AND
                           F.CDEMPRESA  = E.CDEMPRESA
                     UNION
                    SELECT F.CDFILIAL, NVL(F.CDCENTCUST, E.CDCENTCUST) AS CDCENTCUST
                      FROM FILIAL F, EMPRESA E, EMPRCNTRFIL EC
                     WHERE EC.CDFILIAL   = P_CDFILIORIG AND
                           EC.CDEMPRESA  = P_CDEMPRESA  AND
                           E.CDEMPRESA   = EC.CDEMPRESA AND
                           F.CDFILIAL = EC.CDFILIAL);
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CDFILIAL := NULL;
                     V_CDCENTCUST := NULL;
               END;
               V_VRPARCELA := C_CTREC.VRATUAREC;
               IF NOT (V_CDFILIAL IS NULL) AND NOT (V_CDCENTCUST IS NULL) THEN
                  IF VD_CENTCUSTFIL(V_CDFILIAL, V_CDCENTCUST) THEN
                     /*INSERE RATEIO DA CONTA A PAGAR*/
                     INSERT INTO RATCTRECEBER
                          (CDFILIAL, NRLANCTONF, NRSEQVENREC, NRPARCELAREC,
                           CDCENTCUST, CDFIRATCTREC, VRRATCCCTREC)
                       VALUES
                          (C_CTREC.CDFILIAL, C_CTREC.NRLANCTONF, C_CTREC.NRSEQVENREC, C_CTREC.NRPARCELAREC,
                           V_CDCENTCUST, V_CDFILIAL, V_VRPARCELA);
                  ELSE
                     /*CENTRO DE CUSTO (CDCENTCUST) NAFO CADASTRADO PARA A FILIAL (CDFILIAL)*/
                     P_RESULTADO := 'NOT_CENTCUSTFIL_' || V_CDCENTCUST || V_CDFILIAL;
                     RETURN;
                  END IF;
               END IF;
            END IF;
         END IF;
     END LOOP;
   END;

   /*VERIFICA NOTA FISCAL RELACIONADA A AF*/
   PROCEDURE VERI_NF_RELAC_AF(P_CDFILIAL VARCHAR2,
                              P_NRLANCTONF VARCHAR2)
   IS
      V_CDFILLANC VARCHAR2(4);
      V_NRLANCTONF VARCHAR2(10);
   BEGIN
      V_CDFILLANC := NULL;
      V_NRLANCTONF := NULL;
      /*VERIFICA A RELACAO ENTRE A NOTA FISCAL E A AF*/
      BEGIN
         SELECT I.CDFILLANC, I.NRLANCTONF
           INTO V_CDFILLANC, V_NRLANCTONF
           FROM NFRELACAF NR, ITEMAUTF I
          WHERE NR.CDFILIAL = P_CDFILIAL AND
                NR.NRLANCTONF = P_NRLANCTONF AND
                NR.CDFILLANC = I.CDFILLANC AND
                NR.CDFILDEST = I.CDFILDEST AND
                NR.NRAUTOFORN = I.NRAUTOFORN;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDFILLANC := NULL;
            V_NRLANCTONF := NULL;
      END;
      /*APAGA OS AJUSTES DA CONTA RELACIONADA A NOTA FISCAL*/
      DELETE FROM AJCTPAGAR
       WHERE (CDFILIAL = V_CDFILLANC) AND
             (NRLANCTONF = V_NRLANCTONF);
   END;

BEGIN
   V_IDDSCONTANFPAG := 'N';

   P_RESULTADO := '';
   /*BUSCA INFORMACOES DA NOTA FISCAL PARA GERACAO DOS DADOS*/
   BEGIN
      SELECT CDEMPRESA, VRNOTAFISC, NVL(IDORIGDESTNF,'C'), IDENTRSAIDOP, NVL(CDFILIRECE, CDFILIAL),
             NVL(CDFILIEMIT, CDFILIAL), CDFORNECED, CDCLIENTE, DTEMISSAO, DTENTRSAID,
             IDDOCFINANC,IDSISTEMA, CDINSCESTAST,  CDTIPOOPER, IDSTATUS, NRLANCTBDOC,
             CDOPERACTPG
        INTO V_CDEMPRESA, V_VRNOTAFISC, V_ORIGDESTNF, V_ENTRSAIDOP, V_CDFILIRECE,
             V_CDFILIEMIT, V_CDFORNECED, V_CDCLIENTE, V_DTEMISSAO, V_DTENTRSAID,
             V_IDDOCFINANC, V_IDSISTEMA, V_CDINSESTA, V_CDTIPOOPER, V_IDSTATUS, V_NRLANCCONT,
             V_CDOPERADOR
        FROM NOTAFISCAL
       WHERE CDFILIAL = P_CDFILIAL
         AND NRLANCTONF = P_NRLANCTONF;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         P_RESULTADO := 'NF_NOT_EXIST'; /*NOTA FISCAL INFORMADA NAO EXISTE*/
         RETURN;
   END;

   /*INFORMACOES SOBRE O TIPO DE OPERACAO*/
   OPEN C_TIPOOPER(V_CDTIPOOPER, V_ENTRSAIDOP);
   FETCH C_TIPOOPER INTO RECORD_TIPOOPER;

   /* VERIFICA OS IMPOSTOS RETIDOS*/
   BEGIN
      SELECT NVL(SUM(VRIMPOSTONF), 0)
        INTO V_VRIMPORETI
        FROM IMPOSTONF INF, IMPOSTO I
       WHERE INF.CDFILIAL   = P_CDFILIAL
         AND INF.NRLANCTONF = P_NRLANCTONF
         AND INF.CDFISCALNF = '1'
         AND INF.CDIMPOSTO  = I.CDIMPOSTO
         AND I.IDDESCRFONTE = 'R'
         AND I.IDTRATIMPO   = 'R';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_VRIMPORETI := 0;
   END;

   BEGIN
      SELECT CDTIPOOPERPREPAG
        INTO V_CDTIPOOPERDARF
        FROM PARAMFISCAL
       WHERE CDPARFISCAL = '1';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDTIPOOPERDARF := NULL;
   END;

   FOR C_NOTAFIS IN (SELECT CDFILIRECE, CDEMPRESA, CDINSCESTA, CDINSCMUNI, DTEMISSAO, DTENTRSAID, CDSERIEENTR
                       FROM NOTAFISCAL
                      WHERE CDFILIAL   = P_CDFILIAL
                        AND NRLANCTONF = P_NRLANCTONF
                        AND IDENTRSAIDOP = 'E')LOOP

      FOR C_REDARF IN (SELECT NVL(SUM(VRIMPOSTONF), 0) AS VRIMPORETI,
                              I.CDIMPOSTONFE, IM.SGIMPOSTONFE, MAX(I.CDFORNECED) AS CDFORNECED,
                              MAX(FO.NRINSJURFORN) AS NRINSJURFORN, MAX(FO.IDTPIJURFORN) AS IDTPIJURFORN,
                              MAX(T.CDTPCTPAGAR) AS CDTPCTPAGAR, MAX(T.CDCLASSFINA) AS CDCLASSFINA,
                              MAX(I.IDCONTAPAGGUIA) AS IDCONTAPAGGUIA, MAX(NVL(I.NRDIAVENCGUIA,0)) AS NRDIAVENCGUIA
                         FROM IMPOSTONF INF, IMPOSTO I, FORNECEDOR FO, TIPOCTPAGAR T, IMPOSTONFE IM
                        WHERE INF.CDFILIAL     = P_CDFILIAL
                          AND INF.NRLANCTONF   = P_NRLANCTONF
                          AND INF.CDIMPOSTO    = I.CDIMPOSTO
                          AND INF.CDFISCALNF   = '1'
                          AND I.IDDESCRFONTE   = 'R'
                          AND I.IDTRATIMPO     = 'R'
                          AND I.IDGERCNTPAGIMP = 'S'
                          AND I.CDFORNECED     = FO.CDFORNECED
                          AND T.CDTPCTPAGAR    = I.CDTPCTPAGAR
                          AND I.CDIMPOSTONFE   = IM.CDIMPOSTONFE
                        GROUP BY I.CDIMPOSTONFE, IM.SGIMPOSTONFE)LOOP

         IF (C_REDARF.VRIMPORETI > 0) THEN
            /*VERIFICA OS PARAMETROS PARA GERAR A CONTA REAL OU PREVISTA E BUSCAR A DATA DE VENCIMENTO*/
            IF C_REDARF.IDCONTAPAGGUIA = 'R' THEN
               V_IDSTATUSRETGUIA := 'A';
               NOVO_CODIGO_NT('NRNOTAFISCPAG', V_NRNOTAFISCDARF);
               V_NRNOTAFISCDARF := SUBSTR(V_NRNOTAFISCDARF,14,7);
            ELSE
               V_IDSTATUSRETGUIA := 'V';
            END IF;
            V_DTVENCGUIA := GERA_DTVENCGUIAIMP(C_NOTAFIS.DTEMISSAO, C_NOTAFIS.CDFILIRECE, C_REDARF.NRDIAVENCGUIA);

            /*INSERE A NOTAFISCAL DA CONTA PREVISTA*/
            NOVO_CODIGO_NT('LANCNF/FILIAL' || P_CDFILIAL,V_NRLANCTONFDARF);
            V_NRLANCTONFDARF := SUBSTR(V_NRLANCTONFDARF,11,10);

            INSERT INTO NOTAFISCAL
               (CDFILIAL,     NRLANCTONF,   CDEMPRESA,    CDINSCESTA,   CDINSCMUNI,
                CDFILIRECE,   IDBLOQUEADO,  IDDOCFISCAL,  IDDOCFINANC,  NRNOTAFISC,
                DTEMISSAO,    DTENTRSAID,   VRPRODUTOS,   VRNOTAFISC,   IDENTRSAIDOP,
                CDTIPOOPER,   CDSERIE,      IDDOCCONTAB,  IDSTATUS,     IDDOCFATUR,
                IDDOCFISCENT, IDDOCFISCSAI, IDDOCESTOQUE, IDSISTEMA,    IDORIGDESTNF,
                DTEXPORTACAO, CDFORNECED,   IDTPIJURNF,   NRINSJURNF,   DTLANCAMENNF,
                CDSERIEENTR)
            VALUES
               (P_CDFILIAL, V_NRLANCTONFDARF, C_NOTAFIS.CDEMPRESA, C_NOTAFIS.CDINSCESTA, C_NOTAFIS.CDINSCMUNI,
                C_NOTAFIS.CDFILIRECE, 'S', 'S', 'N', DECODE(V_IDSTATUSRETGUIA,'A',V_NRNOTAFISCDARF,NULL),
                C_NOTAFIS.DTEMISSAO, C_NOTAFIS.DTENTRSAID, C_REDARF.VRIMPORETI, C_REDARF.VRIMPORETI,'E',
                NVL(V_CDTIPOOPERDARF,'01'), NULL, 'N',V_IDSTATUSRETGUIA,'N',
                'N', 'N', 'N', DECODE(V_IDSTATUSRETGUIA,'A','PAG','TMP'), 'F',
                C_NOTAFIS.DTEMISSAO, C_REDARF.CDFORNECED, C_REDARF.IDTPIJURFORN, C_REDARF.NRINSJURFORN,SYSDATE,
                DECODE(V_IDSTATUSRETGUIA,'A',C_NOTAFIS.CDSERIEENTR,NULL));

            IF C_REDARF.CDIMPOSTONFE IN ('41','42') THEN
               /*INSERE OS DADOS PARA GERAR A CONTA PREVISTA NA TABELA UTILIZADA NA GUIA DA PREVIDENCIA SOCIAL*/
               INSERT INTO ITEMNOTAGPS
                  (CDFILIAL, NRLANCTONF, NRSEQITNOTA, CDFILIALGPS, NRLANCTONFGPS, VRMULTAGUIA, VROUTRENTGUIA)
               VALUES
                  (P_CDFILIAL, P_NRLANCTONF, '001', P_CDFILIAL, V_NRLANCTONFDARF, 0, 0);
               /*ATUALIZA A DATA DE VENCIMENTO DA GUIA NA NOTA FISCAL ORIGINAL*/
               UPDATE NOTAFISCAL
                  SET DTVENCDOCUAR = V_DTVENCGUIA
                WHERE CDFILIAL     = P_CDFILIAL
                  AND NRLANCTONF   = P_NRLANCTONF;
            ELSE
               /*INSERE OS DADOS PARA GERAR A CONTA PREVISTA NA TABELA UTILIZADA NA GUIA DARF*/
               INSERT INTO GUIAPAGDOC
                  (CDFILIAL, NRLANCTONF, CDIMPOSTO, VRMULTAGUIA, VRJUROGUIA, DTVENCGUIA,  NRLANCTONFDARF, DSHISTGUIAPAGDOC)
               VALUES
                  (P_CDFILIAL, P_NRLANCTONF, C_REDARF.CDIMPOSTONFE, 0, 0, V_DTVENCGUIA, V_NRLANCTONFDARF, NULL);
            END IF;

            /*INSERE O BOLETO DA CONTA PREVISA DA DARF*/
            NOVO_CODIGO_NT('BOLETPAGAR' || P_CDFILIAL, V_NRLANBOLDARF, 1);
            V_NRLANBOLDARF := SUBSTR(V_NRLANBOLDARF, 11, 10);
            INSERT INTO BOLETPAGAR
               (CDFILIAL,    NRLANBOLPAG, CDFORNECED, CDEMPRESA,
                VRBOLPAG,    VRMULTABPAG, VRFINALBPAG,
                DTVENBOLPAG, IDHABIBPAG, IDBPAGREAL,
                IDSTATBPAG, CDTPBAIXAPAG, NRPARCBOLPAG,
                CDBARRAPAG, DSLINHBARPAG, CDRECEITAGUIA)
            VALUES
               (P_CDFILIAL, V_NRLANBOLDARF, C_REDARF.CDFORNECED, C_NOTAFIS.CDEMPRESA,
                C_REDARF.VRIMPORETI, 0, C_REDARF.VRIMPORETI,
                V_DTVENCGUIA, 'N', 'N', 'A',NULL, '00', NULL, NULL, NULL);

            ATUALIZA_FLUXO_DE_CAIXA(C_NOTAFIS.CDEMPRESA,
                                    C_NOTAFIS.CDFILIRECE,
                                    V_DTVENCGUIA,
                                    'E',
                                    C_REDARF.CDCLASSFINA,
                                    C_REDARF.VRIMPORETI,
                                    0);

            /*INSERE A CONTA A PAGAR DO IMPOSTO*/
            INSERT INTO CONTAPAGAR
               (CDFILIAL, NRLANCTONF, NRSEQVENPAG, QTDIASVENPAG, DTORIGVENPAG,
                VRORIGPAG, VRATUAPAG, IDSTATPAG, DSCONTAPAG, DTATUAVENPAG,
                CDFILIBPAG, NRLANBOLPAG, CDEMPRESA, CDCLASSFINA, CDTPCTPAGAR,
                CDFIMOVFLPAG, DTMOVFLUXO, IDMOVFLUXO, NRPARCELAPAG)
            VALUES
               (P_CDFILIAL, V_NRLANCTONFDARF, '00', 1 , V_DTVENCGUIA,
                C_REDARF.VRIMPORETI, C_REDARF.VRIMPORETI, 'A', 'GUIA DE RECOLHIMENTO'||DECODE(V_IDSTATUSRETGUIA,'V',' PREVISTA', '')|| ' - '||C_REDARF.CDIMPOSTONFE||' - '||C_REDARF.SGIMPOSTONFE, V_DTVENCGUIA,
                P_CDFILIAL, V_NRLANBOLDARF, C_NOTAFIS.CDEMPRESA, C_REDARF.CDCLASSFINA,
                C_REDARF.CDTPCTPAGAR, C_NOTAFIS.CDFILIRECE, V_DTVENCGUIA, 'E', '00');

            /*GERA RATEIO DAS CONTAS A PAGAR DO IMPOSTO*/
            GERA_RATEIO_PAG(C_NOTAFIS.CDEMPRESA,
                            C_NOTAFIS.CDFILIRECE,
                            P_CDFILIAL,
                            V_NRLANCTONFDARF,
                            '');
         END IF;
      END LOOP;
   END LOOP;

   BEGIN
      SELECT SUM(IP.VRBRUTITEM)
        INTO V_VRPRODUTOSEMFIN
        FROM ITEMPRODUTO IP, NOTAFISCAL NF, TPOPERCFOP T
       WHERE NF.CDFILIAL     = P_CDFILIAL
         AND NF.NRLANCTONF   = P_NRLANCTONF
         AND NF.CDFILIAL     = IP.CDFILIAL
         AND NF.NRLANCTONF   = IP.NRLANCTONF
         AND NF.IDENTRSAIDOP = T.IDENTRSAIDOP
         AND NF.CDTIPOOPER   = T.CDTIPOOPER
         AND IP.CDFISOPEITEM = T.CDFISCOPER
         AND T.IDCOMPOEVENC  = 'N';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_VRPRODUTOSEMFIN := 0;
   END;

   IF (V_VRPRODUTOSEMFIN IS NULL) THEN
      V_VRPRODUTOSEMFIN := 0;
   END IF;

   /*CONSIDERA IMPOSTOS RETIDOS PARA GERACAO DAS CONTAS*/
   V_VRNOTAFISC := ROUND(V_VRNOTAFISC - V_VRIMPORETI - V_VRPRODUTOSEMFIN,2);

   IF V_CDTIPOOPER = '05' THEN
      BEGIN
         /*DETERMINA O VALOR REAL DA NOTA FISCAL CONSIDERANDO OS ENCARGOS*/
         SELECT (A.VRLIQUIDO + B.VRSOMAENCA - C.VRMENOENCA)
           INTO V_VRNOTAFISC
           FROM (SELECT NVL(SUM(N.VRNOTAFISC),0) AS VRLIQUIDO
                 FROM NOTAFISCAL N, ITEMNOTAFISC I
                 WHERE I.CDFILIAL   = P_CDFILIAL   AND
                       I.NRLANCTONF = P_NRLANCTONF AND
                       N.CDFILIAL   = I.CDFILIALIT  AND
                       N.NRLANCTONF = I.NRLANCTONFIT) A,
                (SELECT NVL(SUM(VRITEMENCA),0) AS VRSOMAENCA
                   FROM ITEMENCARGO, ENCARGO
                  WHERE ITEMENCARGO.CDFILIAL   = P_CDFILIAL AND
                        ITEMENCARGO.NRLANCTONF = P_NRLANCTONF AND
                        ITEMENCARGO.CDENCARGO  = ENCARGO.CDENCARGO AND
                        IDENCARGO = 'A') B,
                (SELECT NVL(SUM(VRITEMENCA),0) AS VRMENOENCA
                   FROM ITEMENCARGO, ENCARGO
                  WHERE ITEMENCARGO.CDFILIAL   = P_CDFILIAL AND
                        ITEMENCARGO.NRLANCTONF = P_NRLANCTONF AND
                        ITEMENCARGO.CDENCARGO  = ENCARGO.CDENCARGO AND
                        IDENCARGO = 'D') C;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_VRNOTAFISC := 0;
      END;
   END IF;

   V_CDFILLANC := NULL;
   V_CDFILDEST := NULL;
   V_NRAUTOFORN := NULL;
   V_CDFILPEDIDO := NULL;
   V_NRPEDIDO := NULL;
   /*PARA GERACAO DE VENCIMENTOS AUTOMATICAMENTE O VALOR NAO PODE SER ZERO E O TIPO DE OPERACAO
   DEVE ESTAR DEVIDAMENTE PARAMETRIZADO. NAO HA GERACAO DE CONTAS PARA NOTAS FISCAIS ORIGINADAS
   DOS SISTEMAS FINANCEIROS*/
   IF (V_VRNOTAFISC > 0) AND
      (V_IDDOCFINANC <> 'L') THEN
      IF V_ENTRSAIDOP = 'E' THEN
         V_CLIEFORN := V_CDFORNECED;
         V_CDFILIEMIRECE := V_CDFILIRECE;
         /*VERIFICA SE A NOTA FISCAL E RELACIONADA A UMA AF*/
         BEGIN
            SELECT MAX(CDFILLANC), MAX(CDFILDEST), MAX(NRAUTOFORN)
              INTO V_CDFILLANC, V_CDFILDEST, V_NRAUTOFORN
              FROM
                 NFRELACAF
              WHERE
                 (CDFILIAL = P_CDFILIAL) AND
                 (NRLANCTONF = P_NRLANCTONF)
              ORDER BY
                 NRAUTOFORN;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDFILLANC := NULL;
               V_CDFILDEST := NULL;
               V_NRAUTOFORN := NULL;
         END;
         /*DETERMINA SE A GERACAO DE VENCIMENTOS SERA FEITA CONFORME
         A FORMA DE PAGAMENTO DA AF */
         IF NOT (V_NRAUTOFORN IS NULL) THEN
            V_ENTRSAIDOP := 'A';
         END IF;
         /*OPERACAO DE LANCAMENTO DE NOTA FISCAL*/
         IF P_IDOPERACAO = 'L' THEN
            IF (RECORD_TIPOOPER.IDUTILVENC <> 'N') OR
               (RECORD_TIPOOPER.IDGERAVENC <> 'N') THEN
               /*CRIA OS VENCIMENTOS SEGUNDO A FORMA DE PAGAMENTO*/
               CRIA_VENCIMENTO(P_CDFILIAL,
                               P_NRLANCTONF,
                               V_ENTRSAIDOP,
                               V_VRNOTAFISC,
                               V_DTEMISSAO,
                               V_DTENTRSAID,
                               V_CLIEFORN,
                               V_CDFILIEMIRECE,
                               V_ORIGDESTNF,
                               V_CDFILLANC,
                               V_CDFILDEST,
                               V_NRAUTOFORN,
                               V_CDFILPEDIDO,
                               V_NRPEDIDO);
               /*INSERE A CONTA A PAGAR DE ACORDO COM OS VENCIMENTOS GERADOS*/
               /*TRAB_VENCIMENTO : TABELA TEMPORARIA PREENCHIDA PELA CRIA_VENCIMENTO*/
               FOR C_ITEMTRAB IN (SELECT DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC
                                    FROM TRAB_VENCIMENTO
                                   WHERE CDFILIALVENC = P_CDFILIAL
                                     AND NRLANCTONFVENC = P_NRLANCTONF
                                   ORDER BY NRSEQVENC) LOOP
                   /*INSERE OS VENCIMENTOS GERADOS NA TABELA DE CONTAS A PAGAR*/
                   INSERT INTO CONTAPAGAR
                      (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                      NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                      IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG)
                   VALUES
                      (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, NULL, SUBSTR(C_ITEMTRAB.NRSEQVENC, LENGTH(C_ITEMTRAB.NRSEQVENC) -1, 2),  '00', C_ITEMTRAB.QTDIASVENC,
                      C_ITEMTRAB.DTVENCIMENTO, ROUND(C_ITEMTRAB.VRVENCIMENTO, 2), C_ITEMTRAB.DTVENCIMENTO , ROUND(C_ITEMTRAB.VRVENCIMENTO, 2), 'A', NULL, NULL, NULL);
               END LOOP;
            END IF;
         /*OPERACAO DE TRANSFERENCIA DE NOTA FISCAL ELETRONICA*/
         ELSIF P_IDOPERACAO = 'T' THEN
            /*VERIFICA SE AS CONTAS DO DOCUMENTO NAO POSSUEM TIPO DE CONTA INFORMADO*/
            SELECT COUNT(*) INTO V_COUNT
              FROM CONTAPAGAR
             WHERE CDFILIAL = P_CDFILIAL
               AND NRLANCTONF = P_NRLANCTONF
               AND CDTPCTPAGAR IS NOT NULL;
            /*SE AS CONTAS EXISTENTES NAO POSSUIREM TIPO DE CONTA*/
            IF (V_COUNT = 0) THEN

					REGERA_RATEIONF(P_CDFILIAL, P_NRLANCTONF);				
               /*VERIFICA SE A NOTA VEM DE UMA AF QUE POSSUI TIPO DE CONTA A PAGAR PARAMETRIZADO
               --OBS: RETITRADO POIS ESTAVA GERANDO PROBLEMAS NO CLIENTE MASSA ALIMENTACAO
                ROTINA INCLUIDA NOVAMENTE POIS E USADA PELOS CLIENTES NSGROUP E NUTRISAUDE*/
               BEGIN
                  SELECT MAX(T.CDTPCTPAGAR)
                    INTO V_TPCONTAPAG_AF
                    FROM TIPOCTPAGAR T, AUTOFORNE A, NFRELACAF N
                   WHERE N.CDFILIAL    = P_CDFILIAL   AND
                         N.NRLANCTONF  = P_NRLANCTONF AND
                         A.CDFILDEST   = N.CDFILDEST   AND
                         A.CDFILLANC   = N.CDFILLANC   AND
                         A.NRAUTOFORN  = N.NRAUTOFORN  AND
                         A.CDTPCTPAGAR = T.CDTPCTPAGAR;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_TPCONTAPAG_AF := NULL;
               END;

               SELECT COUNT(DISTINCT T.CDTPCTPAGAR), COUNT(DISTINCT A.NRAUTOFORN)
                 INTO V_COUNTTPCONTA_AF, V_COUNTAUTOFORN_AF
                 FROM TIPOCTPAGAR T, AUTOFORNE A, NFRELACAF N
                WHERE N.CDFILIAL    = P_CDFILIAL   AND
                      N.NRLANCTONF  = P_NRLANCTONF AND
                      A.CDFILDEST   = N.CDFILDEST   AND
                      A.CDFILLANC   = N.CDFILLANC   AND
                      A.NRAUTOFORN  = N.NRAUTOFORN  AND
                      A.CDTPCTPAGAR = T.CDTPCTPAGAR(+);


               SELECT COUNT(*)
                 INTO V_COUNT
                 FROM CONTAPAGAR
                WHERE CDFILIAL = P_CDFILIAL
                  AND NRLANCTONF = P_NRLANCTONF;
               /*SE NAO EXISTEM CONTAS A PAGAR PARA O DOCUMENTO*/
               IF (V_COUNT = 0) THEN
                  /*CRIA OS VENCIMENTOS DE ACORDO COM A FORMA DE PAGAMENTO*/
                  CRIA_VENCIMENTO(P_CDFILIAL,
                                  P_NRLANCTONF,
                                  V_ENTRSAIDOP,
                                  V_VRNOTAFISC,
                                  V_DTEMISSAO,
                                  V_DTENTRSAID,
                                  V_CLIEFORN,
                                  V_CDFILIEMIRECE,
                                  V_ORIGDESTNF,
                                  V_CDFILLANC,
                                  V_CDFILDEST,
                                  V_NRAUTOFORN,
                                  V_CDFILPEDIDO,
                                  V_NRPEDIDO);
                  V_SEQUENCIAL := 1;
                  /*APAGA AS CONTAS A PAGAR RELACIONADAS A NOTAFISCAL*/
                  DELETE FROM CONTAPAGAR
                  WHERE CDFILIAL = P_CDFILIAL
                    AND NRLANCTONF = P_NRLANCTONF;
                  /*PESQUISA OS VENCIMENTOS GERADOS*/
                  FOR C_VENCIMENTOS IN (SELECT DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC
                                          FROM TRAB_VENCIMENTO
                                         WHERE CDFILIALVENC  = P_CDFILIAL
                                           AND NRLANCTONFVENC = P_NRLANCTONF
                                         ORDER BY NRSEQVENC) LOOP

                     V_VRVENCACUM := 0;
                     V_COUNT := 1;
                     /*SE NAO TIVER TIPO DE CONTA PARAMETRIZADA NA AF  OU TIVER UMA AF COM TIPO DE CONTA E OUTRA SEM TIPO DE CONTA RELACIONADA A NOTA*/
                     IF ((V_TPCONTAPAG_AF IS NULL) OR
                        (V_COUNTTPCONTA_AF > 1)  OR
                        (V_COUNTAUTOFORN_AF <> V_COUNTTPCONTA_AF)) THEN
                        /*BUSCA PARAMETRIZACAO DE TIPO DE CONTA POR PRODUTO DA NOTA*/
                        OPEN C_TP_CONTA_PROD_PAG(P_CDFILIAL, P_NRLANCTONF);
                        LOOP
                            FETCH C_TP_CONTA_PROD_PAG INTO RECORD_TPCONTAPRODPAG;
                            EXIT WHEN C_TP_CONTA_PROD_PAG%NOTFOUND;
                            V_ROW_COUNT := RECORD_TPCONTAPRODPAG.NROREGS;
                            V_VRIMPORETI := 0;
                                 SELECT SUM(A.VRIMPOSTOIT) AS VRTOTIMPONF
                                   INTO V_VRIMPORETI
                                   FROM ITEMPROIMPOS A, IMPOSTO B, ITEMPRODUTO I, PRODUTO P, PRODUTO P4
                                  WHERE A.CDFILIAL   = P_CDFILIAL
                                    AND A.NRLANCTONF = P_NRLANCTONF
                                    AND A.CDFISCALIT = '1'
                                    AND B.IDTRATIMPO = 'R'
                                    AND B.IDDESCRFONTE = 'R'
                                    AND A.CDIMPOSTO  = B.CDIMPOSTO
                                    AND A.CDFILIAL   = I.CDFILIAL
                                    AND A.NRLANCTONF = I.NRLANCTONF
                                    AND A.NRSEQITPROD = I.NRSEQITPROD
                                    AND I.CDPRODUTO = P.CDPRODUTO
                                    AND P4.CDTPCTPAGAR = RECORD_TPCONTAPRODPAG.CDTPCTPAGAR
                                    AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
                                                         FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
                                                        WHERE IT.CDFILIAL = I.CDFILIAL
                                                          AND IT.NRLANCTONF = I.NRLANCTONF
                                                          AND IT.CDPRODUTO = I.CDPRODUTO
                                                          AND IT.CDPRODUTO = P.CDPRODUTO
                                                          AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
                                                          AND P1.CDTPCTPAGAR IS NOT NULL) ;

                            /*CALCULO DO VALOR DO VENCIMENTO PARA O TIPO DE CONTA, PROPORCIONALMENTE AO VENCIMENTO JA GERADO E AO VALOR BRUTO DO ITEM*/
                            V_VRVENCIMENTO := ROUND(RECORD_TPCONTAPRODPAG.VRBRUTITEM * (C_VENCIMENTOS.VRVENCIMENTO/V_VRNOTAFISC), 2);
                            /* Apos buscar o valor do imposto retido por tipo de conta o rateio nao e mais necessario
                            V_VRIMPOSTO := ROUND(nvl(V_VRIMPORETI,0) * (V_VRVENCIMENTO/(V_VRNOTAFISC + nvl(V_VRIMPORETI,0))), 2);  */
                            /*VALOR DO VENCIMENTO JA CONSIDERANDO O VALOR DO IMPOSTO*/
                            V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO - nvl(V_VRIMPORETI,0), 2);
                            /*VALOR ACUMULATIVO DO VENCIMENTO*/
                            V_VRVENCACUM := ROUND(V_VRVENCACUM + V_VRVENCIMENTO, 2);
                            /*VERIFICA SE AINDA EXITE VALOR DO VENCIMENTO ORIGINAL A SER INSERIDO*/
                            IF (V_COUNT = V_ROW_COUNT) THEN
                               V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO + ROUND(C_VENCIMENTOS.VRVENCIMENTO - V_VRVENCACUM, 2), 2);
                            END IF;
                            /*INCLUI AS CONTA A PAGAR*/
                            INSERT INTO CONTAPAGAR
                               (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                                NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                                IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG)
                            VALUES
                               (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, RECORD_TPCONTAPRODPAG.CDTPCTPAGAR, LPAD(TO_CHAR(V_SEQUENCIAL),2,'0'),  '00', C_VENCIMENTOS.QTDIASVENC,
                                C_VENCIMENTOS.DTVENCIMENTO, ROUND(V_VRVENCIMENTO, 2), C_VENCIMENTOS.DTVENCIMENTO , ROUND(V_VRVENCIMENTO, 2), 'A', NULL, NULL, NULL);

                            V_COUNT := V_COUNT + 1;
                            V_SEQUENCIAL := V_SEQUENCIAL + 1;
                        END LOOP;
                        CLOSE C_TP_CONTA_PROD_PAG;
                     END IF;

                     IF V_COUNT = 1 THEN
                        /*INCLUI AS CONTA A PAGAR*/
                        INSERT INTO CONTAPAGAR
                           (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                            NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                            IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG)
                        VALUES
                           (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, V_TPCONTAPAG_AF, SUBSTR(C_VENCIMENTOS.NRSEQVENC, LENGTH(C_VENCIMENTOS.NRSEQVENC) - 1, 2),  '00', C_VENCIMENTOS.QTDIASVENC,
                            C_VENCIMENTOS.DTVENCIMENTO, ROUND(C_VENCIMENTOS.VRVENCIMENTO, 2), C_VENCIMENTOS.DTVENCIMENTO , ROUND(C_VENCIMENTOS.VRVENCIMENTO, 2), 'A', NULL, NULL, NULL);
                     END IF;
                  END LOOP;
               /*SE O DOCUMENTO POSSUI CONTAS A PAGAR JA INFORMADAS*/
               ELSE
                  /*BUSCA AS CONTAS A PAGAR DO DOCUMENTO*/
                  OPEN C_CTPAGAGRUP(P_CDFILIAL, P_NRLANCTONF);
                  V_SEQUENCIAL := 1;
                  /*APAGA AS CONTAS A PAGAR PARA REGERACAO*/
                  DELETE FROM CONTAPAGAR
                    WHERE CDFILIAL = P_CDFILIAL
                      AND NRLANCTONF = P_NRLANCTONF;
                  LOOP
                     FETCH C_CTPAGAGRUP INTO RECORD_CTPAGAGRUP;
                     EXIT WHEN C_CTPAGAGRUP%NOTFOUND;
                     /*BUSCA PARAMETRIZACAO DE TIPO DE CONTA POR PRODUTO DA NOTA*/
                     OPEN C_TP_CONTA_PROD_PAG(P_CDFILIAL, P_NRLANCTONF);

                     V_VRVENCACUM := 0;
                     V_COUNT := 1;

                     IF V_TPCONTAPAG_AF IS NULL THEN
                        LOOP
                            FETCH C_TP_CONTA_PROD_PAG INTO RECORD_TPCONTAPRODPAG;
                            EXIT WHEN C_TP_CONTA_PROD_PAG%NOTFOUND;
                                 V_VRIMPORETI := 0;
                                 SELECT SUM(A.VRIMPOSTOIT) AS VRTOTIMPONF
                                   INTO V_VRIMPORETI
                                   FROM ITEMPROIMPOS A, IMPOSTO B, ITEMPRODUTO I, PRODUTO P, PRODUTO P4
                                  WHERE A.CDFILIAL   = P_CDFILIAL
                                    AND A.NRLANCTONF = P_NRLANCTONF
                                    AND A.CDFISCALIT = '1'
                                    AND B.IDTRATIMPO = 'R'
                                    AND B.IDDESCRFONTE = 'R'
                                    AND A.CDIMPOSTO  = B.CDIMPOSTO
                                    AND A.CDFILIAL   = I.CDFILIAL
                                    AND A.NRLANCTONF = I.NRLANCTONF
                                    AND A.NRSEQITPROD = I.NRSEQITPROD
                                    AND I.CDPRODUTO = P.CDPRODUTO
                                    AND P4.CDTPCTPAGAR = RECORD_TPCONTAPRODPAG.CDTPCTPAGAR
                                    AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
                                                         FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
                                                        WHERE IT.CDFILIAL = I.CDFILIAL
                                                          AND IT.NRLANCTONF = I.NRLANCTONF
                                                          AND IT.CDPRODUTO = I.CDPRODUTO
                                                          AND IT.CDPRODUTO = P.CDPRODUTO
                                                          AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
                                                          AND P1.CDTPCTPAGAR IS NOT NULL) ;

                            V_ROW_COUNT := RECORD_TPCONTAPRODPAG.NROREGS;
                            /*CALCULO DO VALOR DO VENCIMENTO PARA O TIPO DE CONTA, PROPORCIONALMENTE AO VENCIMENTO JA GERADO E AO VALOR BRUTO DO ITEM*/
                            V_VRVENCIMENTO := ROUND(RECORD_TPCONTAPRODPAG.VRBRUTITEM * (RECORD_CTPAGAGRUP.VRATUAPAG/V_VRNOTAFISC), 2);
                            /*CALCULO DO VALOR PROPORCIONAL DO IMPOSTO PARA O VALOR DE VENCIMENTO INFORMADO*/
                            /* Apos buscar o valor do imposto retido por tipo de conta o rateio nao e mais necessario
                            V_VRIMPOSTO := ROUND(nvl(V_VRIMPORETI,0) * (V_VRVENCIMENTO/(V_VRNOTAFISC + nvl(V_VRIMPORETI,0))), 2);  */
                            /*VALOR DO VENCIMENTO JA CONSIDERANDO O VALOR DO IMPOSTO*/
                            V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO - nvl(V_VRIMPORETI,0), 2);
                            /*VALOR ACUMULATIVO DO VENCIMENTO*/
                            V_VRVENCACUM := ROUND(V_VRVENCACUM + V_VRVENCIMENTO, 2);
                            /*VERIFICA SE AINDA EXITE VALOR DO VENCIMENTO ORIGINAL A SER INSERIDO*/
                            IF (V_COUNT = V_ROW_COUNT) THEN
                               V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO + ROUND(RECORD_CTPAGAGRUP.VRATUAPAG - V_VRVENCACUM, 2), 2);
                            END IF;
                            /*INCLUI AS CONTA A PAGAR*/
                            INSERT INTO CONTAPAGAR
                               (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                                NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                                IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG)
                            VALUES
                               (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, RECORD_TPCONTAPRODPAG.CDTPCTPAGAR, LPAD(TO_CHAR(V_SEQUENCIAL),2,'0'),  '00', RECORD_CTPAGAGRUP.QTDIASVENPAG,
                                RECORD_CTPAGAGRUP.DTATUAVENPAG, ROUND(V_VRVENCIMENTO, 2), RECORD_CTPAGAGRUP.DTATUAVENPAG , ROUND(V_VRVENCIMENTO, 2), 'A', RECORD_CTPAGAGRUP.DSCONTAPAG, NULL, NULL);
                            V_COUNT := V_COUNT + 1;
                            V_SEQUENCIAL := V_SEQUENCIAL + 1;
                        END LOOP;
                     END IF;
                     IF V_COUNT = 1 THEN
                        /*INCLUI AS CONTA A PAGAR*/
                        INSERT INTO CONTAPAGAR
                           (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                            NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                            IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG)
                        VALUES
                           (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, V_TPCONTAPAG_AF, LPAD(TO_CHAR(V_SEQUENCIAL),2,'0'),  '00', RECORD_CTPAGAGRUP.QTDIASVENPAG,
                            RECORD_CTPAGAGRUP.DTATUAVENPAG, ROUND(RECORD_CTPAGAGRUP.VRATUAPAG,2), RECORD_CTPAGAGRUP.DTATUAVENPAG , ROUND(RECORD_CTPAGAGRUP.VRATUAPAG, 2), 'A', RECORD_CTPAGAGRUP.DSCONTAPAG, NULL, NULL);
                        V_SEQUENCIAL := V_SEQUENCIAL + 1;
                     END IF;
                     CLOSE C_TP_CONTA_PROD_PAG;
                  END LOOP;
                  CLOSE C_CTPAGAGRUP;
               END IF;
            END IF;
         /*OPERACAO DE APROVACAO DE NOTA FISCAL*/
         ELSIF P_IDOPERACAO = 'A' THEN
            /*VERIFICA SE AS CONTAS DO DOCUMENTO NAO POSSUEM TIPO DE CONTA INFORMADO*/
            SELECT COUNT(*) INTO V_COUNT
              FROM CONTAPAGAR
             WHERE CDFILIAL = P_CDFILIAL
               AND NRLANCTONF = P_NRLANCTONF
               AND CDTPCTPAGAR IS NOT NULL;
            /*SE AS CONTAS EXISTENTES NAO POSSUIREM TIPO DE CONTA*/
            IF (V_COUNT = 0) THEN
               REGERA_RATEIONF(P_CDFILIAL, P_NRLANCTONF);
               /*VERIFICA SE A NOTA VEM DE UMA AF QUE POSSUI TIPO DE CONTA A PAGAR PARAMETRIZADO
               --OBS: RETITRADO POIS ESTAVA GERANDO PROBLEMAS NO CLIENTE MASSA ALIMENTACAO
                ROTINA INCLUIDA NOVAMENTE POIS E USADA PELOS CLIENTES NSGROUP E NUTRISAUDE*/

               BEGIN
                  SELECT MAX(T.CDTPCTPAGAR)
                    INTO V_TPCONTAPAG_AF
                    FROM TIPOCTPAGAR T, AUTOFORNE A, NFRELACAF N
                   WHERE N.CDFILIAL    = P_CDFILIAL   AND
                         N.NRLANCTONF  = P_NRLANCTONF AND
                         A.CDFILDEST   = N.CDFILDEST   AND
                         A.CDFILLANC   = N.CDFILLANC   AND
                         A.NRAUTOFORN  = N.NRAUTOFORN  AND
                         A.CDTPCTPAGAR = T.CDTPCTPAGAR;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_TPCONTAPAG_AF := NULL;
               END;

               SELECT COUNT(DISTINCT T.CDTPCTPAGAR), COUNT(DISTINCT A.NRAUTOFORN)
                 INTO V_COUNTTPCONTA_AF, V_COUNTAUTOFORN_AF
                 FROM TIPOCTPAGAR T, AUTOFORNE A, NFRELACAF N
                WHERE N.CDFILIAL    = P_CDFILIAL   AND
                      N.NRLANCTONF  = P_NRLANCTONF AND
                      A.CDFILDEST   = N.CDFILDEST   AND
                      A.CDFILLANC   = N.CDFILLANC   AND
                      A.NRAUTOFORN  = N.NRAUTOFORN  AND
                      A.CDTPCTPAGAR = T.CDTPCTPAGAR(+);

               SELECT COUNT(*)
                 INTO V_COUNT
                 FROM CONTAPAGAR
                WHERE CDFILIAL = P_CDFILIAL
                  AND NRLANCTONF = P_NRLANCTONF;
               /*SE NAO EXISTEM CONTAS A PAGAR PARA O DOCUMENTO*/
               IF (V_COUNT = 0) THEN
                  /*CRIA OS VENCIMENTOS DE ACORDO COM A FORMA DE PAGAMENTO*/
                  CRIA_VENCIMENTO(P_CDFILIAL,
                                  P_NRLANCTONF,
                                  V_ENTRSAIDOP,
                                  V_VRNOTAFISC,
                                  V_DTEMISSAO,
                                  V_DTENTRSAID,
                                  V_CLIEFORN,
                                  V_CDFILIEMIRECE,
                                  V_ORIGDESTNF,
                                  V_CDFILLANC,
                                  V_CDFILDEST,
                                  V_NRAUTOFORN,
                                  V_CDFILPEDIDO,
                                  V_NRPEDIDO);
                  V_SEQUENCIAL := 1;
                  /*APAGA AS CONTAS A PAGAR RELACIONADAS A NOTAFISCAL*/
                  DELETE FROM CONTAPAGAR
                  WHERE CDFILIAL = P_CDFILIAL
                    AND NRLANCTONF = P_NRLANCTONF;
                  /*PESQUISA OS VENCIMENTOS GERADOS*/
                  FOR C_VENCIMENTOS IN (SELECT DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC
                                          FROM TRAB_VENCIMENTO
                                         WHERE CDFILIALVENC  = P_CDFILIAL
                                           AND NRLANCTONFVENC = P_NRLANCTONF
                                         ORDER BY NRSEQVENC) LOOP

                     V_VRVENCACUM := 0;
                     V_COUNT := 1;
                     /*SE NAO TIVER TIPO DE CONTA PARAMETRIZADA NA AF  OU TIVER UMA AF COM TIPO DE CONTA E OUTRA SEM TIPO DE CONTA RELACIONADA A NOTA*/
                     IF ((V_TPCONTAPAG_AF IS NULL) OR
                        (V_COUNTTPCONTA_AF > 1)  OR
                        (V_COUNTAUTOFORN_AF <> V_COUNTTPCONTA_AF)) THEN
                        /*BUSCA PARAMETRIZACAO DE TIPO DE CONTA POR PRODUTO DA NOTA*/
                        OPEN C_TP_CONTA_PROD_PAG(P_CDFILIAL, P_NRLANCTONF);
                        LOOP
                            FETCH C_TP_CONTA_PROD_PAG INTO RECORD_TPCONTAPRODPAG;
                            EXIT WHEN C_TP_CONTA_PROD_PAG%NOTFOUND;
                            V_ROW_COUNT := RECORD_TPCONTAPRODPAG.NROREGS;
                                V_VRIMPORETI := 0;
                                SELECT SUM(A.VRIMPOSTOIT) AS VRTOTIMPONF
                                   INTO V_VRIMPORETI
                                   FROM ITEMPROIMPOS A, IMPOSTO B, ITEMPRODUTO I, PRODUTO P, PRODUTO P4
                                  WHERE A.CDFILIAL   = P_CDFILIAL
                                    AND A.NRLANCTONF = P_NRLANCTONF
                                    AND A.CDFISCALIT = '1'
                                    AND B.IDTRATIMPO = 'R'
                                    AND B.IDDESCRFONTE = 'R'
                                    AND A.CDIMPOSTO  = B.CDIMPOSTO
                                    AND A.CDFILIAL   = I.CDFILIAL
                                    AND A.NRLANCTONF = I.NRLANCTONF
                                    AND A.NRSEQITPROD = I.NRSEQITPROD
                                    AND I.CDPRODUTO = P.CDPRODUTO
                                    AND P4.CDTPCTPAGAR = RECORD_TPCONTAPRODPAG.CDTPCTPAGAR
                                    AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
                                                         FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
                                                        WHERE IT.CDFILIAL = I.CDFILIAL
                                                          AND IT.NRLANCTONF = I.NRLANCTONF
                                                          AND IT.CDPRODUTO = I.CDPRODUTO
                                                          AND IT.CDPRODUTO = P.CDPRODUTO
                                                          AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
                                                          AND P1.CDTPCTPAGAR IS NOT NULL) ;

                            /*CALCULO DO VALOR DO VENCIMENTO PARA O TIPO DE CONTA, PROPORCIONALMENTE AO VENCIMENTO JA GERADO E AO VALOR BRUTO DO ITEM*/
                            V_VRVENCIMENTO := ROUND(RECORD_TPCONTAPRODPAG.VRBRUTITEM * (C_VENCIMENTOS.VRVENCIMENTO/V_VRNOTAFISC), 2);
                            /*CALCULO DO VALOR PROPORCIONAL DO IMPOSTO PARA O VALOR DE VENCIMENTO INFORMADO*/
                              /* Apos buscar o valor do imposto retido por tipo de conta o rateio nao e mais necessario
                            V_VRIMPOSTO := ROUND(nvl(V_VRIMPORETI,0) * (V_VRVENCIMENTO/(V_VRNOTAFISC + nvl(V_VRIMPORETI,0))), 2);  */
                            /*VALOR DO VENCIMENTO JA CONSIDERANDO O VALOR DO IMPOSTO*/
                            V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO - nvl(V_VRIMPORETI,0), 2);
                            /*VALOR ACUMULATIVO DO VENCIMENTO*/
                            V_VRVENCACUM := ROUND(V_VRVENCACUM + V_VRVENCIMENTO, 2);
                            /*VERIFICA SE AINDA EXITE VALOR DO VENCIMENTO ORIGINAL A SER INSERIDO*/
                            IF (V_COUNT = V_ROW_COUNT) THEN
                               V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO + ROUND(C_VENCIMENTOS.VRVENCIMENTO - V_VRVENCACUM, 2), 2);
                            END IF;
                            /*INCLUI AS CONTA A PAGAR*/
                            INSERT INTO CONTAPAGAR
                               (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                                NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                                IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG)
                            VALUES
                               (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, RECORD_TPCONTAPRODPAG.CDTPCTPAGAR, LPAD(TO_CHAR(V_SEQUENCIAL),2,'0'),  '00', C_VENCIMENTOS.QTDIASVENC,
                                C_VENCIMENTOS.DTVENCIMENTO, ROUND(V_VRVENCIMENTO, 2), C_VENCIMENTOS.DTVENCIMENTO , ROUND(V_VRVENCIMENTO, 2), 'A', NULL, NULL, NULL);

                            V_COUNT := V_COUNT + 1;
                            V_SEQUENCIAL := V_SEQUENCIAL + 1;
                        END LOOP;
                        CLOSE C_TP_CONTA_PROD_PAG;
                     END IF;

                     IF V_COUNT = 1 THEN
                        /*INCLUI AS CONTA A PAGAR*/
                        INSERT INTO CONTAPAGAR
                           (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                            NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                            IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG)
                        VALUES
                           (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, V_TPCONTAPAG_AF, SUBSTR(C_VENCIMENTOS.NRSEQVENC, LENGTH(C_VENCIMENTOS.NRSEQVENC) - 1, 2),  '00', C_VENCIMENTOS.QTDIASVENC,
                            C_VENCIMENTOS.DTVENCIMENTO, ROUND(C_VENCIMENTOS.VRVENCIMENTO, 2), C_VENCIMENTOS.DTVENCIMENTO , ROUND(C_VENCIMENTOS.VRVENCIMENTO, 2), 'A', NULL, NULL, NULL);
                     END IF;
                  END LOOP;
               /*SE O DOCUMENTO POSSUI CONTAS A PAGAR JA INFORMADAS*/
               ELSE
                  /*BUSCA AS CONTAS A PAGAR DO DOCUMENTO*/
                  OPEN C_CTPAGAGRUP(P_CDFILIAL, P_NRLANCTONF);
                  V_SEQUENCIAL := 1;
                  /*APAGA AS CONTAS A PAGAR PARA REGERACAO*/
                  DELETE FROM CONTAPAGAR
                    WHERE CDFILIAL = P_CDFILIAL
                      AND NRLANCTONF = P_NRLANCTONF;
                  LOOP
                     FETCH C_CTPAGAGRUP INTO RECORD_CTPAGAGRUP;
                     EXIT WHEN C_CTPAGAGRUP%NOTFOUND;
                     /*BUSCA PARAMETRIZACAO DE TIPO DE CONTA POR PRODUTO DA NOTA*/
                     OPEN C_TP_CONTA_PROD_PAG(P_CDFILIAL, P_NRLANCTONF);
                     V_VRVENCACUM := 0;
                     V_COUNT := 1;

                     IF (V_TPCONTAPAG_AF IS NULL OR
                        V_COUNTTPCONTA_AF > 1) THEN
                        LOOP
                            FETCH C_TP_CONTA_PROD_PAG INTO RECORD_TPCONTAPRODPAG;
                            EXIT WHEN C_TP_CONTA_PROD_PAG%NOTFOUND;
                            V_ROW_COUNT := RECORD_TPCONTAPRODPAG.NROREGS;
                            V_VRIMPORETI := 0;
                                 SELECT SUM(A.VRIMPOSTOIT) AS VRTOTIMPONF
                                   INTO V_VRIMPORETI
                                   FROM ITEMPROIMPOS A, IMPOSTO B, ITEMPRODUTO I, PRODUTO P, PRODUTO P4
                                  WHERE A.CDFILIAL   = P_CDFILIAL
                                    AND A.NRLANCTONF = P_NRLANCTONF
                                    AND A.CDFISCALIT = '1'
                                    AND B.IDTRATIMPO = 'R'
                                    AND B.IDDESCRFONTE = 'R'
                                    AND A.CDIMPOSTO  = B.CDIMPOSTO
                                    AND A.CDFILIAL   = I.CDFILIAL
                                    AND A.NRLANCTONF = I.NRLANCTONF
                                    AND A.NRSEQITPROD = I.NRSEQITPROD
                                    AND I.CDPRODUTO = P.CDPRODUTO
                                    AND P4.CDTPCTPAGAR = RECORD_TPCONTAPRODPAG.CDTPCTPAGAR
                                    AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
                                                         FROM ITEMPRODUTO IT,  PRODUTO P, PRODUTO P1
                                                        WHERE IT.CDFILIAL = I.CDFILIAL
                                                          AND IT.NRLANCTONF = I.NRLANCTONF
                                                          AND IT.CDPRODUTO = I.CDPRODUTO
                                                          AND IT.CDPRODUTO = P.CDPRODUTO
                                                          AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
                                                          AND P1.CDTPCTPAGAR IS NOT NULL) ;

                            /*CALCULO DO VALOR DO VENCIMENTO PARA O TIPO DE CONTA, PROPORCIONALMENTE AO VENCIMENTO JA GERADO E AO VALOR BRUTO DO ITEM*/
                            V_VRVENCIMENTO := ROUND(RECORD_TPCONTAPRODPAG.VRBRUTITEM * (RECORD_CTPAGAGRUP.VRATUAPAG/V_VRNOTAFISC), 2);
                            /*CALCULO DO VALOR PROPORCIONAL DO IMPOSTO PARA O VALOR DE VENCIMENTO INFORMADO*/
                           /* Apos buscar o valor do imposto retido por tipo de conta o rateio nao e mais necessario
                            V_VRIMPOSTO := ROUND(nvl(V_VRIMPORETI,0) * (V_VRVENCIMENTO/(V_VRNOTAFISC + nvl(V_VRIMPORETI,0))), 2);  */
                            /*VALOR DO VENCIMENTO JA CONSIDERANDO O VALOR DO IMPOSTO*/
                            V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO - nvl(V_VRIMPORETI,0), 2);
                            /*VALOR ACUMULATIVO DO VENCIMENTO*/
                            V_VRVENCACUM := ROUND(V_VRVENCACUM + V_VRVENCIMENTO, 2);
                            /*VERIFICA SE AINDA EXITE VALOR DO VENCIMENTO ORIGINAL A SER INSERIDO*/
                            IF (V_COUNT = V_ROW_COUNT) THEN
                               V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO + ROUND(RECORD_CTPAGAGRUP.VRATUAPAG - V_VRVENCACUM, 2), 2);
                            END IF;
                            /*INCLUI AS CONTA A PAGAR*/
                            INSERT INTO CONTAPAGAR
                               (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                                NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                                IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG,
                                CDBARRAPAG, DSLINHBARPAG)
                            VALUES
                               (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, RECORD_TPCONTAPRODPAG.CDTPCTPAGAR, LPAD(TO_CHAR(V_SEQUENCIAL),2,'0'),  '00', RECORD_CTPAGAGRUP.QTDIASVENPAG,
                                RECORD_CTPAGAGRUP.DTATUAVENPAG, ROUND(V_VRVENCIMENTO, 2), RECORD_CTPAGAGRUP.DTATUAVENPAG , ROUND(V_VRVENCIMENTO, 2), 'A', RECORD_CTPAGAGRUP.DSCONTAPAG, NULL, NULL,
                                RECORD_CTPAGAGRUP.CDBARRAPAG, RECORD_CTPAGAGRUP.DSLINHBARPAG);

                            V_COUNT := V_COUNT + 1;
                            V_SEQUENCIAL := V_SEQUENCIAL + 1;
                        END LOOP;
                     END IF;
                     IF V_COUNT = 1 THEN
                        /*INCLUI AS CONTA A PAGAR*/
                        INSERT INTO CONTAPAGAR
                           (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTPAGAR, NRSEQVENPAG,
                            NRPARCELAPAG, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, DTATUAVENPAG, VRATUAPAG,
                            IDSTATPAG, DSCONTAPAG, CDFILIBPAG, NRLANBOLPAG,
                            CDBARRAPAG, DSLINHBARPAG)
                        VALUES
                           (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, V_TPCONTAPAG_AF, LPAD(TO_CHAR(V_SEQUENCIAL),2,'0'),  '00', RECORD_CTPAGAGRUP.QTDIASVENPAG,
                            RECORD_CTPAGAGRUP.DTATUAVENPAG, ROUND(RECORD_CTPAGAGRUP.VRATUAPAG, 2), RECORD_CTPAGAGRUP.DTATUAVENPAG , ROUND(RECORD_CTPAGAGRUP.VRATUAPAG, 2), 'A', RECORD_CTPAGAGRUP.DSCONTAPAG, NULL, NULL,
                            RECORD_CTPAGAGRUP.CDBARRAPAG, RECORD_CTPAGAGRUP.DSLINHBARPAG);
                        V_SEQUENCIAL := V_SEQUENCIAL + 1;
                     END IF;
                     CLOSE C_TP_CONTA_PROD_PAG;
                  END LOOP;
                  CLOSE C_CTPAGAGRUP;
               END IF;
            END IF;

            /*ATUALIZACAO DAS CONTAS A PAGAR RELACIONADAS A AUTORIZACAO DE FORNECIMENTO*/
            FOR C_NOTA IN (SELECT CDFILIALIT, NRLANCTONFIT
                             FROM ITEMNOTAFISC
                            WHERE CDFILIAL = P_CDFILIAL
                              AND NRLANCTONF = P_NRLANCTONF) LOOP

               AJUSTE_CONTAPAGAR_NF(C_NOTA.CDFILIALIT,
                                    C_NOTA.NRLANCTONFIT,
                                   'A');

            END LOOP;
            /*VERIFICA SE EXISTE CONTA PREVISTA PARA AF*/
            BEGIN
               SELECT MAX(NRLANCTONF)
                 INTO V_NRLANCTONFAUX
                 FROM ITEMAUTF
                WHERE CDFILLANC  =  V_CDFILLANC
                  AND CDFILDEST  =  V_CDFILDEST
                  AND NRAUTOFORN =  V_NRAUTOFORN;
            EXCEPTION
                 WHEN NO_DATA_FOUND THEN
                 V_NRLANCTONFAUX := NULL;
            END;
            IF V_NRLANCTONFAUX IS NOT NULL THEN

              AJUSTE_CONTAPAGAR_NF(P_CDFILIAL,
                                   P_NRLANCTONF,
                                   'A');
            END IF;
            /*BUSCA PARAMETRIZACAO DO FORNECEDOR*/
            OPEN C_FORNECEDOR(V_CDFORNECED);
            FETCH C_FORNECEDOR INTO RECORD_FORNECEDOR;

            /*BUSCA AS CONTAS A PAGAR DO DOCUMENTO*/
            OPEN C_CONTAPAGAR(P_CDFILIAL, P_NRLANCTONF);
            FETCH C_CONTAPAGAR INTO RECORD_CONTAPAGAR;
            IF C_CONTAPAGAR%FOUND THEN
               /*BUSCA PARAMETRIZACAO DA EMPRESA*/
               OPEN C_PARAM_EMPRESA(V_CDEMPRESA);
               FETCH C_PARAM_EMPRESA INTO RECORD_PARAM_EMPRESA;
               /*BUSCA PARAMETRIZACAO DA FILIAL*/
               OPEN C_PARAM_FILIAL(V_CDFILIRECE);
               FETCH C_PARAM_FILIAL INTO RECORD_PARAM_FILIAL;
               OPEN C_FORPIX (V_CDFORNECED);
               FETCH C_FORPIX INTO RECORD_FORPIX;
               V_IDCHAVEPIX := RECORD_FORPIX.IDCHAVEPIX;
               V_CDCHAVEPIX := RECORD_FORPIX.CDCHAVEPIX;
               V_DSCHAVEPIX := RECORD_FORPIX.DSCHAVEPIX;

               /*VERIFICA PARAMETRIZACAO DE TIPO DE BAIXA*/
               IF RECORD_FORNECEDOR.CDTPBAIXAPAG IS NULL THEN
                  IF RECORD_PARAM_FILIAL.CDTPBAIXAPAG IS NULL THEN
                     V_CDTPBAIXAPAG := RECORD_PARAM_EMPRESA.CDTPBAIXAPAG;
                  ELSE
                     V_CDTPBAIXAPAG := RECORD_PARAM_FILIAL.CDTPBAIXAPAG;
                  END IF;
               ELSE
                  V_CDTPBAIXAPAG := RECORD_FORNECEDOR.CDTPBAIXAPAG;
               END IF;

               /*VERIFICA PARAMETRIZACAO DE CONTA CORRENTE*/
               IF RECORD_PARAM_FILIAL.CDREDUCONTPAG IS NULL THEN
                  V_CDREDUCONT := RECORD_PARAM_EMPRESA.CDREDUCONTPAG;
               ELSE
                  V_CDREDUCONT := RECORD_PARAM_FILIAL.CDREDUCONTPAG;
               END IF;
               /*VERIFICA CONTA CORRENTE PREFERENCIAL DO FORNECEDOR*/
               BEGIN
                  SELECT IDBAIXAUTILP INTO V_IDBAIXAUTIL
                    FROM  TIPOBAIXAPAG
                   WHERE CDTPBAIXAPAG = V_CDTPBAIXAPAG;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_IDBAIXAUTIL := NULL;
               END;
               /*SE FOR BOLETO BANCARIO, A CONTA CORRENTE E RETIRADA DA LINHA DIGITAVEL*/
               IF V_IDBAIXAUTIL = 'B' THEN
                  V_CDBANCFORN := NULL;
                  V_CDAGENFORN := NULL;
                  V_CDCCORFORN := NULL;
               ELSE
                  V_CDBANCFORN := RECORD_FORNECEDOR.CDBANCFORN;
                  V_CDAGENFORN := RECORD_FORNECEDOR.CDAGENFORN;
                  V_CDCCORFORN := RECORD_FORNECEDOR.CDCCORFORN;
               END IF;
               /*CONSIDERA AJUSTE DE BONIFICACAO*/
               V_IDCONDESBONFORN := RECORD_PARAM_FILIAL.IDCONDESBONFORN;
               /*CONSIDERA AJUSTE DA DIFERENCA ENTRE VALOR DO ITEM AF X NF*/
               V_IDGERAAJUSTEAFNF := RECORD_FORNECEDOR.IDGERAAJUSTEAFNF;
               /*VERIFICA CADA CONTA A PAGAR, INSERINDO UM BOLETO E LIGANDO-A A ELE*/
               LOOP
                  /*VERIFICA TIPO DE CONTA DA CONTA A PAGAR*/
                   IF RECORD_CONTAPAGAR.CDTPCTPAGAR IS NULL THEN
                      V_CDTPCTPAGAR := RECORD_TIPOOPER.CDTPCTPAGAR;
                      IF V_CDTPCTPAGAR IS NULL THEN
                         V_CDTPCTPAGAR := RECORD_FORNECEDOR.CDTPCTPAGAR;
                      END IF;
                   ELSE
                      V_CDTPCTPAGAR := RECORD_CONTAPAGAR.CDTPCTPAGAR;
                   END IF;
                   /*VERIFICA CLASSIFICACAO FINANCEIRA*/
                   BEGIN
                      SELECT CDCLASSFINA INTO V_CDCLASSFINA
                        FROM TIPOCTPAGAR
                       WHERE CDTPCTPAGAR = V_CDTPCTPAGAR;
                   EXCEPTION
                      WHEN NO_DATA_FOUND THEN
                         V_CDCLASSFINA := NULL;
                   END;

                   /*VERIFICA SE O VALOR DO VENCIMENTO NAO SUPERA O VALOR ORCADO*/
                   ORCAMENTO_OK(V_CDEMPRESA,
                                V_CDFILIRECE,
                                v_CDCLASSFINA,
                                RECORD_CONTAPAGAR.DTATUAVENPAG,
                                RECORD_CONTAPAGAR.VRORIGPAG,
                                V_RESULTADO);

                   IF V_RESULTADO = 0 THEN
                     P_RESULTADO := 'CNT_SUP_VRORC'; /*CONTA A PAGAR SUPERA O VALOR ORCADO*/
                     RETURN;
                   END IF;

                   /*verifica se ja existe um boleto para a nota fiscal com a mesma data */
                   BEGIN
                      SELECT MAX(BP.CDFILIAL), MAX(BP.NRLANBOLPAG)
                        INTO V_CDFILIBOL, V_NRLANBOL
                        FROM CONTAPAGAR CP, BOLETPAGAR BP, TIPOCTPAGAR TCP
                       WHERE CP.CDFILIAL = RECORD_CONTAPAGAR.CDFILIAL
                         AND CP.NRLANCTONF = RECORD_CONTAPAGAR.NRLANCTONF
                         AND CP.CDFILIBPAG = BP.CDFILIAL
                         AND CP.NRLANBOLPAG = BP.NRLANBOLPAG
                         AND BP.DTVENBOLPAG = RECORD_CONTAPAGAR.DTATUAVENPAG
                         AND CP.CDTPCTPAGAR = TCP.CDTPCTPAGAR
                         AND TCP.IDTPCTPAGAR = RECORD_CONTAPAGAR.IDTPCTPAGAR;
                   EXCEPTION
                   WHEN NO_DATA_FOUND THEN
                      V_CDFILIBOL := NULL;
                      V_NRLANBOL := NULL;
                   END;


                   IF (V_CDFILIBOL IS NULL) AND (V_NRLANBOL IS NULL) THEN
                      /*BUSCA O NUMERO DO PROXIMO BOLETO*/
                      /*NOVO_CODIGO_NT : PROCEDIMENTO DE BUSCA DO NOVO SEQUENCIAL QUE CONFIRMA
                      NO BANCO DE DADOS APENAS A ALTERACAO NO SEQUENCIAL, UTILIZANDO-SE DE UMA
                      TRANSACAO AUTONOMA (INDEPENDENTE) DA TRANSACAO PRINCIPAL*/
                      V_CDFILIBOL := P_CDFILIPROC;
                      NOVO_CODIGO_NT('BOLETPAGAR'||P_CDFILIPROC, V_NRLANBOL, 1);
                      V_NRLANBOL := SUBSTR(V_NRLANBOL, LENGTH(V_NRLANBOL) - 9, 10);

                      /*Considera Feriado Bancario*/
                      SELECT MAX(IDCOFERIBANC)
                        INTO V_IDCOFERIBANC
                        FROM PARAMGERAL;

                     /*VERIFICA FERIADO BANCARIO CALENDARIO DA FILIAL DE RECEBIMENTO DA UNIDADE*/
                     IF V_IDCOFERIBANC = 'S' THEN

								BEGIN 
								   SELECT NVL(IDTRATVENCDIANUTIL,'0')
									  INTO V_IDANTECIPAVENC
									  FROM TIPOCTPAGAR
									 WHERE CDTPCTPAGAR = V_CDTPCTPAGAR;
								EXCEPTION
								WHEN NO_DATA_FOUND THEN
								   V_IDANTECIPAVENC := NULL;
								END;

                        IF  V_IDANTECIPAVENC = '1' THEN 
                           FOR C_FERIBC IN (SELECT DTFERIBANC
                                              FROM FERIBANC
                                             WHERE CDFILIAL = V_CDFILIRECE
                                               AND DTFERIBANC <= RECORD_CONTAPAGAR.DTATUAVENPAG
                                               ORDER BY DTFERIBANC DESC) LOOP

                              /*Coloca a data do boleto em um dia util*/
                                IF C_FERIBC.DTFERIBANC = RECORD_CONTAPAGAR.DTATUAVENPAG THEN
                                   RECORD_CONTAPAGAR.DTATUAVENPAG := RECORD_CONTAPAGAR.DTATUAVENPAG - 1;
                                ELSE
                                   EXIT;
                                END IF; 
                              END LOOP;                                    
                        ELSE                          
                           FOR C_FERIBC IN (SELECT DTFERIBANC
                                              FROM FERIBANC
                                             WHERE CDFILIAL = V_CDFILIRECE
                                               AND DTFERIBANC >= RECORD_CONTAPAGAR.DTATUAVENPAG
                                               ORDER BY DTFERIBANC) LOOP

                              /*Coloca a data do boleto em um dia util*/
                              IF C_FERIBC.DTFERIBANC = RECORD_CONTAPAGAR.DTATUAVENPAG THEN
                                 RECORD_CONTAPAGAR.DTATUAVENPAG := RECORD_CONTAPAGAR.DTATUAVENPAG + 1;
                              ELSE
                                 EXIT;
                              END IF;
                           END LOOP;
                        END IF;
                     END IF;

                      INSERT INTO BOLETPAGAR
                             (CDFILIAL, NRLANBOLPAG, CDFORNECED,  CDEMPRESA,
                             VRBOLPAG, VRFINALBPAG, DTVENBOLPAG, IDHABIBPAG,
                             IDSTATBPAG,  VRPEMULBPAG, VRMULTABPAG,
                             VRPEMORBPAG, VRMORDIABPAG, CDTPBAIXAPAG, CDREDUCONT,
                             CDBANCBOLP, CDAGENBOLP, CDCCORBOLP, IDSITUCNABP, IDBPAGREAL, NRPARCBOLPAG,
                             CDBARRAPAG, DSLINHBARPAG, IDCHAVEPIX, CHAVEPIX, DSCHAVEPIX)
                      VALUES (V_CDFILIBOL, V_NRLANBOL, V_CDFORNECED,  V_CDEMPRESA,
                             0, 0, RECORD_CONTAPAGAR.DTATUAVENPAG, 'N', 'A',
                             0, 0, 0, 0, V_CDTPBAIXAPAG, V_CDREDUCONT,
                             V_CDBANCFORN, V_CDAGENFORN, V_CDCCORFORN, '00', 'N', '00',
                             RECORD_CONTAPAGAR.CDBARRAPAG, RECORD_CONTAPAGAR.DSLINHBARPAG, V_IDCHAVEPIX, V_CDCHAVEPIX, V_DSCHAVEPIX);
                   END IF;

                  /*ATUALIZA FLUXO DE CAIXA DO AJUSTE*/
                  ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                                          V_CDFILIRECE,
                                          RECORD_CONTAPAGAR.DTATUAVENPAG,
                                          'E',
                                          V_CDCLASSFINA,
                                          0,
                                          RECORD_CONTAPAGAR.VRORIGPAG);
                   /*MONTA A DESCRICAO DA CONTA A PAGAR*/

                   IF RECORD_CONTAPAGAR.DSCONTAPAG IS NULL THEN
                      V_IDDSCONTANFPAG := 'N';
                   ELSE
                      V_IDDSCONTANFPAG := 'S';
                   END IF;

                   MONTA_HISTORICO(V_DESCRICAO, P_CDFILIAL, P_NRLANCTONF, '', '0', V_CDTPCTPAGAR, RECORD_CONTAPAGAR.DSCONTAPAG);
                   /*ATUALIZA A CONTA A PAGAR, LIGANDO O BOLETO*/
                   UPDATE CONTAPAGAR
                      SET CDFILIBPAG = V_CDFILIBOL,
                          NRLANBOLPAG = V_NRLANBOL,
                          CDTPCTPAGAR = V_CDTPCTPAGAR,
                          CDEMPRESA = V_CDEMPRESA,
                          CDFIMOVFLPAG = V_CDFILIRECE,
                          CDCLASSFINA = V_CDCLASSFINA,
                          DTMOVFLUXO = RECORD_CONTAPAGAR.DTATUAVENPAG,
                          DTATUAVENPAG = RECORD_CONTAPAGAR.DTATUAVENPAG,
                          IDMOVFLUXO = 'E',
                          DSCONTAPAG = V_DESCRICAO,
                          IDDSCONTANF = V_IDDSCONTANFPAG
                     WHERE CDFILIAL = RECORD_CONTAPAGAR.CDFILIAL
                       AND NRLANCTONF = RECORD_CONTAPAGAR.NRLANCTONF
                       AND NRSEQVENPAG = RECORD_CONTAPAGAR.NRSEQVENPAG
                       AND NRPARCELAPAG = RECORD_CONTAPAGAR.NRPARCELAPAG;

                   /*ATUALIZA O VALOR DO BOLETO*/
                   UPDATE BOLETPAGAR
                      SET VRBOLPAG = (SELECT ROUND(SUM(VRATUAPAG),2)
                                        FROM CONTAPAGAR
                                       WHERE CDFILIBPAG  = V_CDFILIBOL
                                         AND NRLANBOLPAG = V_NRLANBOL),
                          VRFINALBPAG = (SELECT ROUND(SUM(VRATUAPAG),2)
                                           FROM CONTAPAGAR
                                          WHERE CDFILIBPAG  = V_CDFILIBOL
                                            AND NRLANBOLPAG = V_NRLANBOL),
                          IDBPAGREAL = 'N'
                    WHERE CDFILIAL = V_CDFILIBOL
                      AND NRLANBOLPAG = SUBSTR(V_NRLANBOL, LENGTH(V_NRLANBOL) - 9, 10);

                    FETCH C_CONTAPAGAR INTO RECORD_CONTAPAGAR;
                    EXIT WHEN C_CONTAPAGAR%NOTFOUND;
               END LOOP;
               CLOSE C_PARAM_EMPRESA;
               CLOSE C_PARAM_FILIAL;
               CLOSE C_FORNECEDOR;
               CLOSE C_FORPIX;
               /*CLOSE C_CLIENTE;*/
            END IF;
            CLOSE C_CONTAPAGAR;
            /*GERA AJUSTES RETIDOS NA FONTE*/
            GERA_AJUSTE_BOLIMP(P_CDFILIAL,
                               P_NRLANCTONF,
                               V_CDFILIRECE);
                               
            /*INCLUI OS AJUSTES DE AF X NF*/
            GERA_AJUSTE_AF_NF (V_CDFORNECED,
                               P_CDFILIAL,
                               P_NRLANCTONF,
                               V_IDGERAAJUSTEAFNF);

            /*INCLUI OS AJUSTES DE BONIFICACAO DO FORNECEDOR*/
            GERA_AJUSTE_BONI_PAG(V_CDFORNECED,
                                 P_CDFILIAL,
                                 P_NRLANCTONF,
                                 V_IDCONDESBONFORN);

            /*GERA RATEIO DAS CONTAS A PAGAR*/
            GERA_RATEIO_PAG(V_CDEMPRESA,
                            V_CDFILIRECE,
                            P_CDFILIAL,
                            P_NRLANCTONF,
                            V_NRLANCCONT);
            /*GERAR BAIXAS REFERENTE A SANGRIA DE DESPESAS*/
            BEGIN
               SELECT COUNT(*), D.CDREDUCONT, D.CDTPBAIXAPAG
                 INTO V_COUNTDOCSANGRIA , V_CDREDUCONT, V_CDTPBAIXAPAG
                 FROM DOCSANGRIA D, CONTAPAGAR CP, BOLETPAGAR BP
                WHERE D.CDFILIALNF = P_CDFILIAL
                  AND D.NRLANCTONF = P_NRLANCTONF
                  AND D.CDREDUCONT IS NOT NULL
                  AND D.CDTPBAIXAPAG IS NOT NULL
                  AND CP.CDFILIAL = D.CDFILIALNF
                  AND CP.NRLANCTONF = D.NRLANCTONF
                  AND CP.CDFILIBPAG = BP.CDFILIAL
                  AND CP.NRLANBOLPAG = BP.NRLANBOLPAG
                GROUP BY D.CDREDUCONT, D.CDTPBAIXAPAG;
            EXCEPTION
                 WHEN NO_DATA_FOUND THEN
                V_COUNTDOCSANGRIA := 0;
                V_CDREDUCONT   := NULL;
                V_CDTPBAIXAPAG := NULL;
            END;
             IF V_COUNTDOCSANGRIA <> 0 THEN
               GERA_BAIXA('E', V_CDEMPRESA, P_CDFILIAL,
                         V_NRLANBOL, P_CDFILIAL, TRUNC(SYSDATE),
                         V_CDREDUCONT, V_CDTPBAIXAPAG, V_CDOPERADOR, 'N');

             END IF;            
         ELSE
            P_RESULTADO := 'INV_TP_OP'; /*TIPO DE OPERACAO INFORMADA INVALIDA*/
            RETURN;
         END IF;
      ELSIF V_ENTRSAIDOP = 'S' THEN
         V_CLIEFORN := V_CDCLIENTE;
         V_CDFILIEMIRECE := V_CDFILIEMIT;
         /*VERIFICA SE A NOTA FISCAL E DE PEDIDO*/
         IF V_IDSISTEMA = 'EXP' THEN
            BEGIN
               SELECT DISTINCT MAX(CDFILIALPED), MAX(NRPEDIDO)
                 INTO V_CDFILPEDIDO, V_NRPEDIDO
                 FROM ITEMPRODUTO
                WHERE (CDFILIAL = P_CDFILIAL)  AND
                      (NRLANCTONF = P_NRLANCTONF)  AND
                      (CDFILIALPED IS NOT NULL);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDFILPEDIDO := NULL;
                  V_NRPEDIDO := NULL;
            END;
            IF NOT (V_NRPEDIDO IS NULL) THEN
               V_ENTRSAIDOP := 'P';
            END IF;
         END IF;
         /*OPERACAO DE LANCAMENTO DE NOTA FISCAL*/
         IF P_IDOPERACAO = 'L' THEN
            IF (RECORD_TIPOOPER.IDUTILVENC <> 'N') OR
               (RECORD_TIPOOPER.IDGERAVENC <> 'N') THEN
               /*GERA OS VENCIMENTOS SEGUNDO FORMA DE PAGAMENTO*/
               CRIA_VENCIMENTO(P_CDFILIAL,
                               P_NRLANCTONF,
                               V_ENTRSAIDOP,
                               V_VRNOTAFISC,
                               V_DTEMISSAO,
                               V_DTENTRSAID,
                               V_CLIEFORN,
                               V_CDFILIEMIRECE,
                               V_ORIGDESTNF,
                               V_CDFILLANC,
                               V_CDFILDEST,
                               V_NRAUTOFORN,
                               V_CDFILPEDIDO,
                               V_NRPEDIDO);
               /*INSERE A CONTA A RECEBER DE ACORDO COM OS VENCIMENTOS GERADOS*/
               /*TRAB_VENCIMENTO : TABELA TEMPORARIA PREENCHIDA PELA CRIA_VENCIMENTO*/
               FOR C_ITEMTRAB IN (SELECT DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC, IDTPCONTATRABVEN
                                    FROM TRAB_VENCIMENTO
                                   WHERE CDFILIALVENC = P_CDFILIAL
                                     AND NRLANCTONFVENC = P_NRLANCTONF
                                   ORDER BY NRSEQVENC) LOOP


                  /*VERIFICA SE A NOTA FOI GERADO PELO SISTEMA SM E REFERENTE A HOSTING*/
                  /*CASO SEJA, A DESCRICAO DA CONTA SERA FIXA HOSTING REF. MM/YYYY*/
                   BEGIN
                     SELECT 'Manutencao Ref.'||TO_CHAR(FCT_VENCPREVCONT.DTINICOMPET,'MM/YYYY')||' - Hosting'
                       INTO V_DESCHOSTING
                       FROM FCT_APURACAO, FCT_VENCPREVCONT
                       WHERE FCT_APURACAO.NRLANCTONF = P_NRLANCTONF
                         AND FCT_APURACAO.CDFILIAL = P_CDFILIAL
                         AND FCT_APURACAO.NRGRUPOFATURA = 3
                         AND FCT_APURACAO.NRAPURACAO = FCT_VENCPREVCONT.NRAPURACAO;
                   EXCEPTION
                      WHEN NO_DATA_FOUND THEN
                         V_DESCHOSTING := NULL;
                   END;

                   /*INSERE OS VENCIMENTOS NA TABELA DE CONTAS A RECEBER*/
                   INSERT INTO CONTARECEBER (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTRECEB, NRSEQVENREC,
                                            NRPARCELAREC, QTDIASVENREC, DTORIGVENREC, VRORIGREC, DTATUAVENREC, VRATUAREC,
                                            IDSTATREC, DSCONTAREC, CDFILIBOLREC, NRLANBOLREC, IDCONTAIMPOSTO)
                   VALUES (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, NULL, SUBSTR(C_ITEMTRAB.NRSEQVENC, LENGTH(C_ITEMTRAB.NRSEQVENC) -1, 2), '00', C_ITEMTRAB.QTDIASVENC, C_ITEMTRAB.DTVENCIMENTO,
                           C_ITEMTRAB.VRVENCIMENTO, C_ITEMTRAB.DTVENCIMENTO, C_ITEMTRAB.VRVENCIMENTO, 'A', V_DESCHOSTING, NULL, NULL, C_ITEMTRAB.IDTPCONTATRABVEN);
               END LOOP;
            END IF;
         /*OPERACAO DE TRANSFERENCIA DE NOTA FISCAL ELETRONICA*/
         ELSIF P_IDOPERACAO = 'T' THEN
            /*REGERA VENCIMENTOS SEGUNDO FORMA DE PAGAMENTO*/
            CRIA_VENCIMENTO(P_CDFILIAL,
                            P_NRLANCTONF,
                            V_ENTRSAIDOP,
                            V_VRNOTAFISC,
                            V_DTEMISSAO,
                            V_DTENTRSAID,
                            V_CLIEFORN,
                            V_CDFILIEMIRECE,
                            V_ORIGDESTNF,
                            V_CDFILLANC,
                            V_CDFILDEST,
                            V_NRAUTOFORN,
                            V_CDFILPEDIDO,
                            V_NRPEDIDO);

            /*BUSCA TIPO DE CONTA PARA SUBST. TRUBUTARIA*/
            BEGIN
               SELECT MAX(I.CDTPCTRECEB)
                 INTO V_TPCTSUBTRIB
                 FROM IMPOSNFTOT IT, IMPOSTO I
                WHERE IT.CDFILIAL = P_CDFILIAL
                  AND IT.NRLANCTONF = P_NRLANCTONF
                  AND IT.CDIMPOSTO= I.CDIMPOSTO
                  AND I.IDTRATIMPO = 'A'
                  AND I.IDGERAPARCFIN = 'S';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_TPCTSUBTRIB := NULL;
            END;

            /*VERIFICA SE O DOCUMENTO POSSUI CONTAS A RECEBER*/
            SELECT COUNT(*)
              INTO V_QTCONTA
              FROM CONTARECEBER
             WHERE CDFILIAL = P_CDFILIAL
               AND NRLANCTONF = P_NRLANCTONF;
            /*BUSCA OS VENCIMENTOS GERADOS PELA CRIA_VENCIMENTO*/
            FOR C_ITEMTRAB IN (SELECT DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC, IDTPCONTATRABVEN
                                 FROM TRAB_VENCIMENTO
                                WHERE CDFILIALVENC = P_CDFILIAL
                                  AND NRLANCTONFVENC = P_NRLANCTONF
                                ORDER BY NRSEQVENC ) LOOP
               BEGIN
                  /*VERIFICA SE O VENCIMENTO JA INCLUIDO PARA A NOTA FISCAL POSSUI DESCRICAO OU DATA PREENCHIDA*/
                  SELECT MAX(NRSEQVENREC), MAX(DSCONTAREC), MAX(DTORIGVENREC), MAX(ROUND(VRATUAREC, 2))
                    INTO V_NRSEQVENREC, V_DSCONTAREC, V_DTVENREC, V_VRCONTREC
                    FROM CONTARECEBER
                   WHERE CDFILIAL = P_CDFILIAL
                     AND NRLANCTONF = P_NRLANCTONF
                     AND NRSEQVENREC = SUBSTR(C_ITEMTRAB.NRSEQVENC, LENGTH(C_ITEMTRAB.NRSEQVENC) - 1, 2)
                     AND NRPARCELAREC = '00';
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_NRSEQVENREC := NULL;
                     V_DSCONTAREC := NULL;
                     V_DTVENREC := NULL;
                     V_VRCONTREC := NULL;
               END;
               /*VERIFICA SE E NECESSARIO INCLUIR OU ATUALIZAR O VENCIMENTO*/
               IF (V_QTCONTA = 0) OR NOT (V_NRSEQVENREC IS NULL) THEN
                  /*VERIFICA SE O VENCIMENTO JA FOI PREENCHIDO NA CONTA*/
                  IF V_DTVENREC IS NULL THEN
                     V_DTVENREC := C_ITEMTRAB.DTVENCIMENTO;
                  END IF;

                  IF (V_QTCONTA = 0) THEN
                     V_VRCONTREC := C_ITEMTRAB.VRVENCIMENTO;
                  END IF;

                  /*SE O DOCUMENTO NAO POSSUIR CONTAS, INSERE VENCIMENTO GERADO*/
                  IF V_QTCONTA = 0 THEN
                     /*INSERE A CONTA A RECEBER*/
                     INSERT INTO CONTARECEBER (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTRECEB, NRSEQVENREC,
                                               NRPARCELAREC, QTDIASVENREC, DTORIGVENREC, VRORIGREC, DTATUAVENREC, VRATUAREC,
                                               IDSTATREC, DSCONTAREC, CDFILIBOLREC, NRLANBOLREC, IDCONTAIMPOSTO)
                     VALUES (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, NULL, SUBSTR(C_ITEMTRAB.NRSEQVENC, LENGTH(C_ITEMTRAB.NRSEQVENC) -1, 2), '00',
                             C_ITEMTRAB.QTDIASVENC, V_DTVENREC, V_VRCONTREC, V_DTVENREC,
                             V_VRCONTREC, 'A', NULL, NULL, NULL, C_ITEMTRAB.IDTPCONTATRABVEN);
                  /*SE O DOCUMENTO POSSUIR CONTAS E FOI ENCONTRADA A CONTA COM O SEQUENCIAL EM QUESTAO,
                  ATUALIZA A CONTA A RECEBER COM O VENCIMENTO CALCULADO*/
                  ELSIF NOT (V_NRSEQVENREC IS NULL) THEN
                     UPDATE CONTARECEBER
                        SET DTORIGVENREC = V_DTVENREC,
                            DTATUAVENREC = V_DTVENREC,
                            CDTPCTRECEB = V_CDTPCTREC
                      WHERE CDFILIAL = P_CDFILIAL
                        AND NRLANCTONF = P_NRLANCTONF
                        AND NRSEQVENREC = V_NRSEQVENREC;
                  END IF;
               END IF;
            END LOOP;
         /*OPERACAO DE APROVACAO DA NOTA FISCAL*/
         ELSIF P_IDOPERACAO = 'A' THEN
			   SELECT COUNT(*)
				  INTO V_COUNT
				  FROM CONTARECEBER
				 WHERE CDFILIAL = P_CDFILIAL
					AND NRLANCTONF = P_NRLANCTONF;
            SELECT MAX(NVL(CL.IDENVBOLANTNOTA,'N'))
              INTO V_IDENVBOLANTNOTA
              FROM BOLETRECEBER BO, CONTARECEBER CR , CLIENTE CL
             WHERE CR.CDFILIAL     = P_CDFILIAL
               AND CR.NRLANCTONF   = P_NRLANCTONF
               AND CR.CDFILIBOLREC = BO.CDFILIAL
               AND CR.NRLANBOLREC  = BO.NRLANBOLREC
               AND BO.CDCLIENTE    = CL.CDCLIENTE;
          IF NVL(V_IDENVBOLANTNOTA,'N') = 'N' THEN
				CRIA_VENCIMENTO(P_CDFILIAL,
							 P_NRLANCTONF,
							 V_ENTRSAIDOP,
							 V_VRNOTAFISC,
							 V_DTEMISSAO,
							 V_DTENTRSAID,
							 V_CLIEFORN,
							 V_CDFILIEMIRECE,
							 V_ORIGDESTNF,
							 V_CDFILLANC,
							 V_CDFILDEST,
							 V_NRAUTOFORN,
							 V_CDFILPEDIDO,
							 V_NRPEDIDO);
          END IF;
					BEGIN
						/*BUSCA TIPO DE CONTA PARA SUBST. TRUBUTARIA*/
						SELECT MAX(I.CDTPCTRECEB)
						  INTO V_TPCTSUBTRIB
						  FROM IMPOSNFTOT IT, IMPOSTO I
						 WHERE IT.CDFILIAL = P_CDFILIAL
							AND IT.NRLANCTONF = P_NRLANCTONF
							AND IT.CDIMPOSTO= I.CDIMPOSTO
							AND I.IDTRATIMPO = 'A'
							AND I.IDGERAPARCFIN = 'S';
					EXCEPTION
						WHEN NO_DATA_FOUND THEN
							V_TPCTSUBTRIB := NULL;
					END;

				 /*SE NAFO EXISTEM CONTAS A RECEBER PARA O DOCUMENTO*/
				IF (V_COUNT = 0) THEN
					V_SEQUENCIAL := 1;

					/*BUSCA OS VENCIMENTOS GERADOS PELA CRIA_VENCIMENTO*/
					FOR C_ITEMTRAB IN (SELECT DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC, IDTPCONTATRABVEN
												FROM TRAB_VENCIMENTO
											  WHERE CDFILIALVENC = P_CDFILIAL
												 AND NRLANCTONFVENC = P_NRLANCTONF
											  ORDER BY NRSEQVENC ) LOOP

						V_VRVENCACUM := 0;
						V_COUNT := 1;
						/*BUSCA PARAMETRIZAAAFO DE TIPO DE CONTA POR PRODUTO*/
						OPEN C_TP_CONTA_PROD_REC(P_CDFILIAL, P_NRLANCTONF);
						LOOP
							FETCH C_TP_CONTA_PROD_REC INTO RECORD_TPCONTAPRODREC;
							EXIT WHEN C_TP_CONTA_PROD_REC%NOTFOUND;
							V_ROW_COUNT := RECORD_TPCONTAPRODREC.NROREGS;
					  	   /*CA?LCULO DO VALOR DO VENCIMENTO PARA O TIPO DE CONTA, PROPORCIONALMENTE AO VENCIMENTO JA? GERADO E AO VALOR BRUTO DO ITEM*/
						   V_VRVENCIMENTO := ROUND(RECORD_TPCONTAPRODREC.VRBRUTITEM * (C_ITEMTRAB.VRVENCIMENTO/V_VRNOTAFISC), 2);
						   /*CA?LCULO DO VALOR PROPORCIONAL DO IMPOSTO PARA O VALOR DE VENCIMENTO INFORMADO*/
						   V_VRIMPOSTO := ROUND(V_VRIMPORETI * (V_VRVENCIMENTO/(V_VRNOTAFISC + V_VRIMPORETI)), 2);
						   /*VALOR DO VENCIMENTO JA? CONSIDERANDO O VALOR DO IMPOSTO*/
						   V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO - V_VRIMPOSTO, 2);
						   /*VALOR ACUMULATIVO DO VENCIMENTO*/
						   V_VRVENCACUM := ROUND(V_VRVENCACUM + V_VRVENCIMENTO, 2);

							V_CDTPCTRECEB := RECORD_TPCONTAPRODREC.CDTPCTRECEB;

							IF V_CDTPCTRECEB IS NULL THEN
								/*TIPO DE CONTA PARAMETRIZADO NO TIPO DE OPERAAAFO*/
								V_CDTPCTRECEB := RECORD_TIPOOPER.CDTPCTRECEB;
							END IF;

                    /*VERIFICA SE A NOTA FOI GERADO PELO SISTEMA SM E REFERENTE A HOSTING*/
                    /*CASO SEJA, A DESCRICAO DA CONTA SERA FIXA HOSTING REF. MM/YYYY*/
                     BEGIN
                       SELECT 'Manutencao Ref.'||TO_CHAR(FCT_VENCPREVCONT.DTINICOMPET,'MM/YYYY')||' - Hosting'
                         INTO V_DSCONTAREC
                         FROM FCT_APURACAO, FCT_VENCPREVCONT
                         WHERE FCT_APURACAO.NRLANCTONF = P_NRLANCTONF
                           AND FCT_APURACAO.CDFILIAL = P_CDFILIAL
                           AND FCT_APURACAO.NRGRUPOFATURA = 3
                           AND FCT_APURACAO.NRAPURACAO = FCT_VENCPREVCONT.NRAPURACAO;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_DSCONTAREC := NULL;
                     END;

                     IF V_DSCONTAREC IS NULL THEN
                        /*PEGA A DESCRICAO DO PRODUTO PARA EMISSAO QDO A NOTA DO FAS E LANCADA MANUALMENTE*/
                        BEGIN
                           SELECT MAX(DSPRODEMIS)
                             INTO V_DSCONTAREC
                             FROM NOTAFISCAL N, ITEMPRODUTO I
                            WHERE N.IDSISTEMA = 'FAS'
                              AND N.CDFILIAL = I.CDFILIAL
                              AND N.NRLANCTONF = I.NRLANCTONF
                              AND N.CDFILIAL = P_CDFILIAL
                              AND N.NRLANCTONF = P_NRLANCTONF
                              AND NOT EXISTS (SELECT 1
                                                FROM APURFATUFAS A
                                                WHERE A.CDFILIAL = N.CDFILIAL
                                                  AND A.NRLANCTONF = N.NRLANCTONF);
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_DSCONTAREC := NULL;
                        END;
                     END IF;

						   IF V_DSCONTAREC IS NULL THEN
								/*MONTA HISTA"RICO PARA A CONTA*/
								MONTA_HISTORICO(V_DESCRICAO, P_CDFILIAL, P_NRLANCTONF, RECORD_TIPOOPER.CDHISTPADR, '1', '', '');
						   ELSE
							   V_DESCRICAO := V_DSCONTAREC;
						   END IF;

						   IF (V_COUNT = V_ROW_COUNT) THEN
							   V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO + ROUND(C_ITEMTRAB.VRVENCIMENTO - V_VRVENCACUM, 2), 2);
						   END IF;

							IF (C_ITEMTRAB.IDTPCONTATRABVEN = 'S') AND (V_TPCTSUBTRIB IS NOT NULL) THEN
								V_CDTPCTRECEB := V_TPCTSUBTRIB;
					      END IF;

							INSERT INTO CONTARECEBER (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTRECEB, NRSEQVENREC,
															  NRPARCELAREC, QTDIASVENREC, DTORIGVENREC, VRORIGREC, DTATUAVENREC, VRATUAREC,
															  IDSTATREC, DSCONTAREC, CDFILIBOLREC, NRLANBOLREC, IDCONTAIMPOSTO)
							VALUES (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, V_CDTPCTRECEB, LPAD(TO_CHAR(V_SEQUENCIAL),2,'0'), '00',
									  C_ITEMTRAB.QTDIASVENC, C_ITEMTRAB.DTVENCIMENTO, V_VRVENCIMENTO, C_ITEMTRAB.DTVENCIMENTO,
									  V_VRVENCIMENTO, 'A', V_DESCRICAO, NULL, NULL, C_ITEMTRAB.IDTPCONTATRABVEN);

							V_COUNT := V_COUNT + 1;
							V_SEQUENCIAL := V_SEQUENCIAL + 1;
						END LOOP;
						CLOSE C_TP_CONTA_PROD_REC;
						IF (V_COUNT > 0) THEN
							/*NOVO_CODIGO_NT : PROCEDIMENTO DE BUSCA DO NOVO SEQUENCIAL QUE CONFIRMA
							NO BANCO DE DADOS APENAS A ALTERAAAFO NO SEQUENCIAL, UTILIZANDO-SE DE UMA
							TRANSAAAFO AUTA"NOMA (INDEPENDENTE) DA TRANSAAAFO PRINCIPAL*/
							NOVO_CODIGO_NT('BOLETRECEBER'||P_CDFILIPROC, V_NRLANBOL, V_SEQUENCIAL - 1); /*BUSCA O NAsMERO DO PRA"XIMO BOLETO*/
							V_NRLANBOL := SUBSTR(V_NRLANBOL, LENGTH(V_NRLANBOL) - 9, 10);
							/*GERAAAFO DOS BOLETOS A RECEBER*/
							GERA_BOLETOS(P_CDFILIAL, P_NRLANCTONF, P_CDFILIPROC, V_NRLANBOL, V_CDTPCTRECEB, NULL, NULL, NULL);
                     GERA_AJUSTE_BONI_REC(V_CLIEFORN,
                                          P_CDFILIAL,
                                          P_NRLANCTONF);
							/*GERA RATEIO DAS CONTAS A RECEBER*/
							GERA_RATEIO_REC(V_CDEMPRESA,
										 V_CDFILIEMIT,
										 P_CDFILIAL,
										 P_NRLANCTONF,
										 V_NRLANCCONT);
						END IF;
					END LOOP;
				ELSIF NVL(V_IDENVBOLANTNOTA,'N') = 'N' THEN
				   /*BUSCA AS CONTAS A RECEBER DO DOCUMENTO*/
					OPEN C_CTRECAGRUP(P_CDFILIAL, P_NRLANCTONF);
					V_SEQUENCIAL := 1;
					/*APAGA AS CONTAS A RECEBER PARA REGERAAAFO*/
					DELETE
					  FROM CONTARECEBER
					 WHERE CDFILIAL = P_CDFILIAL
						AND NRLANCTONF = P_NRLANCTONF;
				   LOOP
						FETCH C_CTRECAGRUP INTO RECORD_CTRECAGRUP;
						EXIT WHEN C_CTRECAGRUP%NOTFOUND;
						/*BUSCA PARAMETRIZAAAFO DE TIPO DE CONTA POR PRODUTO DA NOTA*/
						OPEN C_TP_CONTA_PROD_REC(P_CDFILIAL, P_NRLANCTONF);
						V_VRVENCACUM := 0;
						V_COUNT := 1;
					 	LOOP
						   FETCH C_TP_CONTA_PROD_REC INTO RECORD_TPCONTAPRODREC;
							EXIT WHEN C_TP_CONTA_PROD_REC%NOTFOUND;
					  	   V_ROW_COUNT := RECORD_TPCONTAPRODREC.NROREGS;
						   /*CA?LCULO DO VALOR DO VENCIMENTO PARA O TIPO DE CONTA, PROPORCIONALMENTE AO VENCIMENTO JA? GERADO E AO VALOR BRUTO DO ITEM*/
						   V_VRVENCIMENTO := ROUND(RECORD_TPCONTAPRODREC.VRBRUTITEM * (RECORD_CTRECAGRUP.VRATUAREC/V_VRNOTAFISC), 2);
						   /*CA?LCULO DO VALOR PROPORCIONAL DO IMPOSTO PARA O VALOR DE VENCIMENTO INFORMADO*/
						   V_VRIMPOSTO := ROUND(V_VRIMPORETI * (V_VRVENCIMENTO/(V_VRNOTAFISC + V_VRIMPORETI)), 2);
						   /*VALOR DO VENCIMENTO JA? CONSIDERANDO O VALOR DO IMPOSTO*/
						   V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO - V_VRIMPOSTO, 2);
						   /*VALOR ACUMULATIVO DO VENCIMENTO*/
						   V_VRVENCACUM := ROUND(V_VRVENCACUM + V_VRVENCIMENTO, 2);

						   V_CDTPCTRECEB := RECORD_TPCONTAPRODREC.CDTPCTRECEB;

						   IF V_CDTPCTRECEB IS NULL THEN
								/*TIPO DE CONTA PARAMETRIZADO NO TIPO DE OPERAAAFO*/
								V_CDTPCTRECEB := RECORD_TIPOOPER.CDTPCTRECEB;
							END IF;

							IF (V_COUNT = V_ROW_COUNT) THEN
								V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO + ROUND(RECORD_CTRECAGRUP.VRATUAREC - V_VRVENCACUM, 2), 2);
							END IF;

							V_DTVENREC := RECORD_CTRECAGRUP.DTATUAVENREC;
							IF V_DTVENREC IS NULL THEN
								BEGIN
									SELECT DTVENCIMENTO
									  INTO V_DTVENREC
									  FROM TRAB_VENCIMENTO
									 WHERE CDFILIALVENC = P_CDFILIAL
										AND NRLANCTONFVENC = P_NRLANCTONF
										AND NRSEQVENC = LPAD(V_SEQUENCIAL,5,'0');
								EXCEPTION
									WHEN NO_DATA_FOUND THEN
									V_DTVENREC := NULL;
								END;
							END IF;

							--Verifica se a conta e referente a imposto
							IF V_TPCTSUBTRIB IS NOT NULL THEN
								BEGIN
									SELECT IDTPCONTATRABVEN
									  INTO V_IDTPCONTATRABVEN
									  FROM TRAB_VENCIMENTO
									 WHERE CDFILIALVENC = P_CDFILIAL
										AND NRLANCTONFVENC = P_NRLANCTONF
										AND NRSEQVENC = LPAD(V_SEQUENCIAL,5,'0');
								EXCEPTION
									WHEN NO_DATA_FOUND THEN
										V_IDTPCONTATRABVEN := NULL;
								END;
								IF (V_IDTPCONTATRABVEN = 'S') THEN
									V_CDTPCTRECEB := V_TPCTSUBTRIB;
								END IF;
							END IF;

                    /*VERIFICA SE A NOTA FOI GERADO PELO SISTEMA SM E REFERENTE A HOSTING*/
                    /*CASO SEJA, A DESCRICAO DA CONTA SERA FIXA HOSTING REF. MM/YYYY*/
                     BEGIN
                       SELECT 'Manutencao Ref.'||TO_CHAR(FCT_VENCPREVCONT.DTINICOMPET,'MM/YYYY')||' - Hosting'
                         INTO V_DSCONTAREC
                         FROM FCT_APURACAO, FCT_VENCPREVCONT
                         WHERE FCT_APURACAO.NRLANCTONF = P_NRLANCTONF
                           AND FCT_APURACAO.CDFILIAL = P_CDFILIAL
                           AND FCT_APURACAO.NRGRUPOFATURA = 3
                           AND FCT_APURACAO.NRAPURACAO = FCT_VENCPREVCONT.NRAPURACAO;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_DSCONTAREC := NULL;
                     END;

                     IF V_DSCONTAREC IS NULL THEN
                        /*PEGA A DESCRICAO DO PRODUTO PARA EMISSAO QDO A NOTA DO FAS E LANCADA MANUALMENTE*/
                        BEGIN
                           SELECT MAX(DSPRODEMIS)
                             INTO V_DSCONTAREC
                             FROM NOTAFISCAL N, ITEMPRODUTO I
                            WHERE N.IDSISTEMA = 'FAS'
                              AND N.CDFILIAL = I.CDFILIAL
                              AND N.NRLANCTONF = I.NRLANCTONF
                              AND N.CDFILIAL = P_CDFILIAL
                              AND N.NRLANCTONF = P_NRLANCTONF
                              AND NOT EXISTS (SELECT 1
                                                FROM APURFATUFAS A
                                                WHERE A.CDFILIAL = N.CDFILIAL
                                                  AND A.NRLANCTONF = N.NRLANCTONF);
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_DSCONTAREC := NULL;
                        END;
                     END IF;

                     IF V_DSCONTAREC IS NULL THEN
							V_DSCONTAREC := RECORD_CTRECAGRUP.DSCONTAREC;
                     END IF;

							IF V_DSCONTAREC IS NULL THEN
								/*MONTA HISTA"RICO PARA A CONTA*/
								MONTA_HISTORICO(V_DESCRICAO, P_CDFILIAL, P_NRLANCTONF,
													 RECORD_TIPOOPER.CDHISTPADR, '1', V_CDTPCTRECEB, '');
						    ELSE
								V_DESCRICAO := V_DSCONTAREC;
						    END IF;

							/*INCLUI AS CONTA A RECEBER*/
							INSERT INTO CONTARECEBER
							  (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTRECEB, NRSEQVENREC,
							   NRPARCELAREC, QTDIASVENREC, DTORIGVENREC, VRORIGREC, DTATUAVENREC, VRATUAREC,
							   IDSTATREC, DSCONTAREC, CDFILIBOLREC, NRLANBOLREC, IDCONTAIMPOSTO)
							VALUES
							  (P_CDFILIAL, P_NRLANCTONF, NULL, NULL, V_CDTPCTRECEB, LPAD(TO_CHAR(V_SEQUENCIAL),2,'0'),  '00', RECORD_CTRECAGRUP.QTDIASVENREC,
							   V_DTVENREC, ROUND(V_VRVENCIMENTO, 2), V_DTVENREC , ROUND(V_VRVENCIMENTO, 2), 'A', V_DESCRICAO, NULL, NULL,RECORD_CTRECAGRUP.IDCONTAIMPOSTO);

							V_COUNT := V_COUNT + 1;
							V_SEQUENCIAL := V_SEQUENCIAL + 1;

						END LOOP;
					   CLOSE C_TP_CONTA_PROD_REC;
					END LOOP;
					IF V_QTCONTA > V_COUNT THEN
                 V_COUNT := V_QTCONTA;
				   END IF;
				   IF (V_COUNT > 0) THEN
						 /*NOVO_CODIGO_NT : PROCEDIMENTO DE BUSCA DO NOVO SEQUENCIAL QUE CONFIRMA
						 NO BANCO DE DADOS APENAS A ALTERAAAFO NO SEQUENCIAL, UTILIZANDO-SE DE UMA
						 TRANSAAAFO AUTA"NOMA (INDEPENDENTE) DA TRANSAAAFO PRINCIPAL*/
						 NOVO_CODIGO_NT('BOLETRECEBER'||P_CDFILIPROC, V_NRLANBOL, V_SEQUENCIAL - 1); /*BUSCA O NAsMERO DO PRA"XIMO BOLETO*/
						 V_NRLANBOL := SUBSTR(V_NRLANBOL, LENGTH(V_NRLANBOL) - 9, 10);
						 /*GERAAAFO DOS BOLETOS A RECEBER*/
						 GERA_BOLETOS(P_CDFILIAL, P_NRLANCTONF, P_CDFILIPROC, V_NRLANBOL, V_CDTPCTRECEB, NULL, NULL, NULL);
                    /*INCLUI OS AJUSTES DE BONIFICACAO DO CLIENTE*/
                   GERA_AJUSTE_BONI_REC(V_CLIEFORN,
                                        P_CDFILIAL,
                                        P_NRLANCTONF);
						 /*GERA RATEIO DAS CONTAS A RECEBER*/
						 GERA_RATEIO_REC(V_CDEMPRESA,
											  V_CDFILIEMIT,
											  P_CDFILIAL,
											  P_NRLANCTONF,
											  V_NRLANCCONT);

               
				   END IF;
				END IF;
         ELSE
            P_RESULTADO := 'INV_TP_OP'; /*TIPO DE OPERACAO INFORMADA INVALIDA*/
            RETURN;
         END IF;
      END IF;
      /*APAGA OS REGISTROS CRIADOS NA TABELA AUXILIAR TRAB_VENCIMENTO*/
      DELETE FROM TRAB_VENCIMENTO
       WHERE CDFILIALVENC = P_CDFILIAL
         AND NRLANCTONFVENC = P_NRLANCTONF;
   END IF;
   CLOSE C_TIPOOPER;
END;
/