CREATE OR REPLACE PROCEDURE FCT_FATURA_CONTRATO
  (P_NRORG IN NUMBER,
   P_NRSEQCONTRATO IN VARCHAR2,
   P_NRPARCNEGOCIO IN VARCHAR2,
   P_CDOPERINCLUSAO IN FCT_APURACAO.CDOPERINCLUSAO%TYPE,
   P_DATAINI IN DATE,
   P_DATAFIN IN DATE,
   P_NRVENCPREVCONT IN VARCHAR2,
   P_NRGRUPOFATURA IN VARCHAR2,
   P_NRRATEIOITEMVENC IN VARCHAR2 DEFAULT NULL,
   P_RETORNO OUT VARCHAR2,
   P_RETORNOERRO OUT VARCHAR2)

AS
   V_NRAPURACAO      VARCHAR2(20);
   V_VRVENCIMENTO    FLOAT;
   V_EMPRESA         VARCHAR2(02);
   V_GRFATUR         NUMBER;
   V_TPOPERFAT       VARCHAR2(02);
   V_TPSERIENF       VARCHAR2(05);
   V_PRODFAT         VARCHAR2(30);
   V_NMITEMCONTRATO  VARCHAR2(60);
   V_NMPRODFAT       VARCHAR2(50);
   V_NRLANCTONF      VARCHAR2(10);
   V_CDCLIENTE       VARCHAR2(21);
   V_PRXLANCESTQ     VARCHAR2(10);
   V_TPORCA          NUMBER;
   VD_SERIE          VARCHAR2(05);
   V_RETORN          VARCHAR2(05);
   V_TESTAPUR        VARCHAR2(30);
   V_TESTAPUR2       VARCHAR2(30);
   V_APURA           FLOAT;
   V_DTEMISS         DATE;
   V_TPEMISSNF       VARCHAR2(01);
   V_DIAEMISSNF      VARCHAR2(02);
   V_DADOADIC        VARCHAR2(03);
   V_VENCIMENTO      DATE;
   V_DTINIREFFAT     DATE;
   V_DTFINREFFAT     DATE;
   V_NFCRIADA        VARCHAR2(3600);
   V_MEDPREVISTA     INTEGER;
   V_QTPRODNOTA      INTEGER;
   V_TESTAITEM       INTEGER;
   V_NRSEQIRPROD     VARCHAR2(4);
   V_FILIAL          VARCHAR2(4);
   V_VRCONTITEM      FLOAT;
   V_VRBRUTITEM      FLOAT;
   V_VRPERCRATEIO    FLOAT;
   V_VRRATEIO        FLOAT;
   V_COUNTRATEIO     INTEGER;
   V_VRNOTAFISC      FLOAT;
   V_VRFALTAFATURAR  FLOAT;
   V_IDSITUVENCPREV  CHAR(1);
   V_DSSERVORCANF    VARCHAR2(4000);
   V_PARCELAS        VARCHAR2(30);
   V_NRLANCTONF_EXISTE NOTAFISCAL.NRLANCTONF%TYPE;
BEGIN

   V_NFCRIADA := NULL;
   /* Realiza a busca dos dados do Faturamento */
   FOR C_APUR IN (SELECT DISTINCT CT.NRSEQCONTRATO, NVL(VP.NRPARCNEGOCIO, CT.NRPARCNEGOCIO) AS NRPARCNEGOCIO,
                         DECODE(FPI.CDFILIALFATURA, NULL, DECODE(FPF.CDFILIALFATURA, NULL, CT.CDFILIALORCA, FPF.CDFILIALFATURA), FPI.CDFILIALFATURA) AS FILIALFAT,
                         VP.VRFALTAFATURAR AS VRAPUR, VP.DTINICOMPET, VP.DTFINCOMPET, TRUNC(VP.DTVENCIMENTO) AS DTVENCIMENTO, VP.NRGRUPOFATURA, VP.CDMODPGTO,
                         VP.NRVENCPREVCONT, NULL AS NRMEDICAOAPU, CT.NRSEQMODCONTRA, CT.IDTPDTEMISSNF, CT.NRDIADTEMISSNF, CT.NRCONTRATOFCT, CT.DSOBSERVACAOCONT, VP.NRAGRUPFATUR,
                         FPF.IDGERANFPARC, CT.IDBLOQSEMMEDIC, VP.NRAPURACAO
                    FROM FCT_CONTRATO CT, FCT_VENCPREVCONT VP, FCT_PARAMFATCONT FPF, FCT_ITVENCPREVCONT ITV, FCT_PARAMFATITCONT FPI
                   WHERE (CT.NRORG = P_NRORG)
                     AND ((INSTR(P_NRSEQCONTRATO, '_' || TO_CHAR(CT.NRSEQCONTRATO) || '_') > 0) OR (P_NRSEQCONTRATO IS NULL))
                     AND ((INSTR(P_NRPARCNEGOCIO, '_' || TO_CHAR(NVL(VP.NRPARCNEGOCIO, CT.NRPARCNEGOCIO)) || '_') > 0) OR (P_NRPARCNEGOCIO IS NULL))
                     AND (CT.IDSITUACAOCONTRATO = 'A')
                     AND (VP.NRORG = CT.NRORG)
                     AND (VP.NRSEQCONTRATO = CT.NRSEQCONTRATO)
                     AND ((INSTR(P_NRVENCPREVCONT, '_' || TO_CHAR(VP.NRVENCPREVCONT) || '_') > 0) OR (P_NRVENCPREVCONT IS NULL))
                     AND ((TRUNC(VP.DTINICOMPET) >= TRUNC(P_DATAINI)) OR (P_DATAINI IS NULL))
                     AND ((TRUNC(VP.DTFINCOMPET) <= TRUNC(P_DATAFIN)) OR (P_DATAFIN IS NULL))
                     AND (VP.IDFATURACONTR = 'A' OR VP.IDFATURACONTR = 'X')
                     AND (ITV.NRVENCPREVCONT = VP.NRVENCPREVCONT)
                     AND (ITV.NRSEQCONTRATO = VP.NRSEQCONTRATO)
                     AND (ITV.NRORG = VP.NRORG)
                     AND (CT.NRSEQCONTRATO = FPF.NRSEQCONTRATO)
                     AND (CT.NRORG = FPF.NRORG)
                     AND (FPI.NRSEQCONTRATO = ITV.NRSEQCONTRATO)
                     AND (FPI.NRORG = ITV.NRORG)
                     AND (FPI.NRITEMOCONTRATO = ITV.NRITEMOCONTRATO)
                     AND (VP.IDSITUVENCPREV <> 'F')
                  UNION ALL
                  SELECT CT.NRSEQCONTRATO, CT.NRPARCNEGOCIO, DECODE(FPI.CDFILIALFATURA, NULL, DECODE(FPF.CDFILIALFATURA, NULL, CT.CDFILIALORCA, FPF.CDFILIALFATURA), FPI.CDFILIALFATURA) AS FILIALFAT,
                         SUM(MD.VRTOTITEMCONTMED) AS VRAPUR, MD.DTINICOMPET, MD.DTFINCOMPET, TRUNC(MD.DTVENCIMENTO) AS DTVENCIMENTO, FPF.NRGRUPOFATURA, IT.CDMODPGTO,
                         NULL AS NRVENCPREVCONT, MD.NRMEDICAOAPU, CT.NRSEQMODCONTRA, CT.IDTPDTEMISSNF, CT.NRDIADTEMISSNF, CT.NRCONTRATOFCT, CT.DSOBSERVACAOCONT, NULL AS NRAGRUPFATUR,
                         FPF.IDGERANFPARC, CT.IDBLOQSEMMEDIC, MD.NRAPURACAO
                    FROM FCT_CONTRATO CT,  FCT_MEDICAOAPU MD, FCT_ITEMCONTRATO IT, FCT_PARAMFATCONT FPF, FCT_PARAMFATITCONT FPI
                   WHERE (MD.NRORG = P_NRORG)
                     AND ((INSTR(P_NRSEQCONTRATO, '_' || TO_CHAR(MD.NRSEQCONTRATO) || '_') > 0)  OR (P_NRSEQCONTRATO IS NULL))
                     AND ((INSTR(P_NRPARCNEGOCIO, '_' || TO_CHAR(CT.NRPARCNEGOCIO) || '_') > 0)  OR (P_NRPARCNEGOCIO IS NULL))
                     AND (CT.IDSITUACAOCONTRATO = 'A')
                     AND (MD.NRORG = CT.NRORG)
                     AND (MD.NRSEQCONTRATO = CT.NRSEQCONTRATO)
                     AND ((INSTR(P_NRVENCPREVCONT, '_' || TO_CHAR(MD.NRMEDICAOAPU) || '_') > 0) OR (P_NRVENCPREVCONT IS NULL))
                     AND (MD.NRVENCPREVCONT IS NULL)
                     AND (IT.NRSEQCONTRATO = CT.NRSEQCONTRATO)
                     AND ((TRUNC(MD.DTINICOMPET) >= TRUNC(P_DATAINI)) OR (P_DATAINI IS NULL))
                     AND ((TRUNC(MD.DTFINCOMPET) <= TRUNC(P_DATAFIN)) OR (P_DATAFIN IS NULL))
                     AND MD.NRITEMOCONTRATO = FPI.NRITEMOCONTRATO(+)
                     AND (MD.IDTPMEDIAPU = 'E')
                     AND (CT.NRSEQCONTRATO = FPF.NRSEQCONTRATO)
                     AND (CT.NRORG = FPF.NRORG)
                  GROUP BY CT.NRSEQCONTRATO, CT.NRPARCNEGOCIO, DECODE(FPI.CDFILIALFATURA, NULL, DECODE(FPF.CDFILIALFATURA, NULL, CT.CDFILIALORCA, FPF.CDFILIALFATURA), FPI.CDFILIALFATURA),
                         MD.DTINICOMPET, MD.DTFINCOMPET, MD.DTVENCIMENTO, FPF.NRGRUPOFATURA, IT.CDMODPGTO,
                         MD.NRMEDICAOAPU, CT.NRSEQMODCONTRA, CT.IDTPDTEMISSNF, CT.NRDIADTEMISSNF, CT.NRCONTRATOFCT, CT.DSOBSERVACAOCONT, FPF.IDGERANFPARC, CT.IDBLOQSEMMEDIC, MD.NRAPURACAO
                  ORDER BY DTINICOMPET) LOOP

      /*Preenche Filial*/
      V_FILIAL := C_APUR.FILIALFAT;

      /* Recebe empresa para faturamento */
       BEGIN
          SELECT CDEMPRESA
            INTO V_EMPRESA
            FROM FILIAL
           WHERE CDFILIAL = C_APUR.FILIALFAT
             AND NRORG = P_NRORG;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
             V_EMPRESA := NULL;
       END;

       /* Recebe dados do grupo de faturamento */
       BEGIN
          SELECT CDTIPOOPERFATURA, CDSERIENF, CDPRODUTOVENDA, NMPRODUTO
            INTO V_TPOPERFAT, V_TPSERIENF, V_PRODFAT, V_NMPRODFAT
            FROM FCT_GRUPOFATURA GRP, PRODUTO PRO
           WHERE GRP.NRGRUPOFATURA = C_APUR.NRGRUPOFATURA
             AND GRP.NRORG = P_NRORG
             AND PRO.CDPRODUTO(+) = GRP.CDPRODUTOVENDA;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN BEGIN
             V_TPOPERFAT := NULL;
             V_TPSERIENF := NULL;
             V_PRODFAT := NULL;
             V_NMPRODFAT := NULL;
          END;
       END;

       /* Recebe codigo do cliente */

       BEGIN
         SELECT CL.CDCLIENTE
           INTO V_CDCLIENTE
           FROM PARCNEGOCIO PN, CLIENTE CL
          WHERE PN.NRPARCNEGOCIO = C_APUR.NRPARCNEGOCIO
            AND PN.NRORG = P_NRORG
            AND CL.NRPARCNEGOCIO = PN.NRPARCNEGOCIO
            AND CL.NRORG = PN.NRORG
            AND ROWNUM = 1
            ORDER BY CL.DTULTATU DESC;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
             V_CDCLIENTE := NULL;
       END;

       /* Recebe Tipo do OrÃƒÂ§amento */
       BEGIN
          SELECT RF.NRTIPOORCAMENTO
            INTO V_TPORCA
            FROM FCT_ORCAMENTO OC, FCT_REFEORCACONT RF
           WHERE RF.NRORG = P_NRORG
             AND RF.NRSEQCONTRATO = C_APUR.NRSEQCONTRATO
             AND OC.NRORG = RF.NRORG
             AND OC.NRSEQORCAMENTO = RF.NRSEQORCAMENTO;
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_TPORCA := NULL;
       END;

       /* Se o tipo da data de saÃƒÂ­da esviter vazio, pega do Modelo de contrato*/
       IF C_APUR.IDTPDTEMISSNF IS NULL THEN
          BEGIN
             SELECT TO_CHAR(IDTPDTEMISSNF)
               INTO V_TPEMISSNF
               FROM FCT_MODELOCONTRATO
              WHERE NRSEQMODCONTRA = C_APUR.NRSEQMODCONTRA
                AND NRORG = P_NRORG;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_TPEMISSNF := NULL;
          END;
       ELSE
          V_TPEMISSNF := TO_CHAR(C_APUR.IDTPDTEMISSNF);
       END IF;

        /* Se o dia para a data de saÃƒÂ­da esviter vazio, pega do Modelo de contrato*/
       IF C_APUR.NRDIADTEMISSNF IS NULL THEN
          BEGIN
             SELECT TO_CHAR(NRDIADTEMISSNF)
               INTO V_DIAEMISSNF
               FROM FCT_MODELOCONTRATO
              WHERE NRSEQMODCONTRA = C_APUR.NRSEQMODCONTRA
                AND NRORG = P_NRORG;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_DIAEMISSNF := NULL;
          END;
       ELSE
          V_DIAEMISSNF := TO_CHAR(C_APUR.NRDIADTEMISSNF);
       END IF;

       /* ----- Recebe a data de saÃƒÂ­da da NF ----- */

       /* 1 - Proximo Dia X da Dt. final da Competencia */
       IF (V_TPEMISSNF = '1') THEN
          IF TO_NUMBER(TO_CHAR(C_APUR.DTFINCOMPET,'DD')) > V_DIAEMISSNF THEN
             V_DTEMISS := TO_DATE(V_DIAEMISSNF||TO_CHAR(ADD_MONTHS(C_APUR.DTFINCOMPET,1),'/MM/YYYY'));
          ELSE
             V_DTEMISS := TO_DATE(V_DIAEMISSNF||TO_CHAR(C_APUR.DTFINCOMPET,'/MM/YYYY'));
          END IF;

       /* 2 - Proximo Dia X da Dt. Inicial da Competencia */
       ELSIF (V_TPEMISSNF = '2') THEN
          IF TO_NUMBER(TO_CHAR(C_APUR.DTINICOMPET,'DD')) > V_DIAEMISSNF THEN
             V_DTEMISS := TO_DATE(V_DIAEMISSNF||TO_CHAR(ADD_MONTHS(C_APUR.DTINICOMPET,1),'/MM/YYYY'));
          ELSE
             V_DTEMISS := TO_DATE(V_DIAEMISSNF||TO_CHAR(C_APUR.DTINICOMPET,'/MM/YYYY'));
          END IF;

       /* 3 -Dia X Anterior a  Dt. final da Competencia */
       ELSIF (V_TPEMISSNF = '3') THEN
          IF TO_NUMBER(TO_CHAR(C_APUR.DTFINCOMPET,'DD')) > V_DIAEMISSNF THEN
             V_DTEMISS := TO_DATE(V_DIAEMISSNF||TO_CHAR(C_APUR.DTFINCOMPET,'/MM/YYYY'));
          ELSE
             V_DTEMISS := TO_DATE(V_DIAEMISSNF||TO_CHAR(ADD_MONTHS(C_APUR.DTFINCOMPET,-1),'/MM/YYYY'));
          END IF;

       /* 4 -Dia X Anterior a Dt. Inicial da Competencia */
       ELSIF (V_TPEMISSNF = '4') THEN
          IF TO_NUMBER(TO_CHAR(C_APUR.DTINICOMPET,'DD')) > V_DIAEMISSNF THEN
             V_DTEMISS := TO_DATE(V_DIAEMISSNF||TO_CHAR(C_APUR.DTINICOMPET,'/MM/YYYY'));
          ELSE
             V_DTEMISS := TO_DATE(V_DIAEMISSNF||TO_CHAR(ADD_MONTHS(C_APUR.DTINICOMPET,-1),'/MM/YYYY'));
          END IF;

       /* 5 - Quantidade dias a partir da data final de competencia */
       ELSIF (V_TPEMISSNF = '5') THEN
          V_DTEMISS := C_APUR.DTFINCOMPET+V_DIAEMISSNF;

       /* 6 - Quantidade dias a partir da data inicial de competencia */
       ELSIF (V_TPEMISSNF = '6') THEN
          V_DTEMISS := C_APUR.DTINICOMPET+V_DIAEMISSNF;

       /* 7 - Quantidade dias anterior da data final de competencia */
       ELSIF (V_TPEMISSNF = '7') THEN
          V_DTEMISS := C_APUR.DTFINCOMPET-V_DIAEMISSNF;

       /* 8 - Quantidade dias anterior da data inicial de competencia */
       ELSIF (V_TPEMISSNF = '8') THEN
          V_DTEMISS := C_APUR.DTINICOMPET-V_DIAEMISSNF;

       /* 9 - Considera para Data Emissao da NF a data de execucao do Faturamento */
       ELSIF (V_TPEMISSNF = '9') THEN
          V_DTEMISS := TRUNC(SYSDATE);

       END IF;

       /* Verifica se existe itens para agrupar */

       IF (C_APUR.NRAGRUPFATUR IS NOT NULL) THEN
           BEGIN
                 SELECT MAX(AP.NRLANCTONF), MIN(NF.DTINIREFEFAT), MAX(NF.DTFINREFEFAT)
                  INTO  V_NRLANCTONF, V_DTINIREFFAT, V_DTFINREFFAT
                  FROM FCT_VENCPREVCONT VP, FCT_APURACAO AP, NOTAFISCAL NF
                 WHERE VP.NRSEQCONTRATO = AP.NRSEQCONTRATO
                   AND VP.NRAPURACAO    = AP.NRAPURACAO
                   AND VP.NRAGRUPFATUR  = C_APUR.NRAGRUPFATUR
                   AND AP.NRLANCTONF    = NF.NRLANCTONF
                   AND NF.CDFILIAL      = C_APUR.FILIALFAT
                   AND VP.NRSEQCONTRATO = C_APUR.NRSEQCONTRATO
                   AND VP.NRORG = P_NRORG;
           EXCEPTION
              WHEN NO_DATA_FOUND THEN
                 V_NRAPURACAO := NULL;
                 V_NRLANCTONF := NULL;
           END;

       ELSIF (C_APUR.NRAPURACAO IS NOT NULL) THEN
          BEGIN
              SELECT NF.NRLANCTONF,
                     NF.DTINIREFEFAT,
                     NF.DTFINREFEFAT
                INTO V_NRLANCTONF_EXISTE,
                     V_DTINIREFFAT,
                     V_DTFINREFFAT
                FROM NOTAFISCAL NF
               INNER JOIN FCT_APURACAO APU
                  ON NF.CDFILIAL   = APU.CDFILIAL
                 AND NF.NRLANCTONF = APU.NRLANCTONF
               WHERE APU.NRORG      = P_NRORG
                 AND APU.NRAPURACAO = C_APUR.NRAPURACAO
                 AND NF.IDSTATUS    = 'P';
           EXCEPTION WHEN NO_DATA_FOUND THEN
               V_NRLANCTONF_EXISTE := NULL;
           END;

           IF (V_NRLANCTONF_EXISTE IS NOT NULL) THEN
               V_NRLANCTONF := V_NRLANCTONF_EXISTE;
               V_NRAPURACAO := C_APUR.NRAPURACAO;
           END IF;

       ELSE
           V_NRAPURACAO := NULL;
           V_NRLANCTONF := NULL;
       END IF;


       IF (V_NRLANCTONF IS NULL) THEN

         /* Geracao do CORPO da nota fiscal da apuracao*/
         GERA_NOTAFISCAL_CORPO(C_APUR.FILIALFAT, C_APUR.FILIALFAT, V_EMPRESA, V_TPOPERFAT, V_TPSERIENF, V_CDCLIENTE, V_DTEMISS,'DFS',V_NRLANCTONF, V_PRXLANCESTQ);

         IF (V_NRLANCTONF IS NOT NULL) THEN
            FCT_PREENCHE_DADOS_NF(P_NRORG, C_APUR.FILIALFAT, V_NRLANCTONF, C_APUR.NRVENCPREVCONT,C_APUR.NRMEDICAOAPU, P_CDOPERINCLUSAO);
         END IF;

       ELSE

          IF(V_DTINIREFFAT > C_APUR.DTINICOMPET) THEN
             V_DTINIREFFAT := C_APUR.DTINICOMPET;
          END IF;

          IF(V_DTFINREFFAT > C_APUR.DTFINCOMPET) THEN
             V_DTFINREFFAT := C_APUR.DTFINCOMPET;
          END IF;
          UPDATE NOTAFISCAL
             SET DTINIREFEFAT = V_DTINIREFFAT,
                 DTFINREFEFAT = V_DTFINREFFAT
           WHERE NRLANCTONF   = V_NRLANCTONF
             AND CDFILIAL     = C_APUR.FILIALFAT;
       END IF;

       V_NFCRIADA := V_NFCRIADA||'_'||V_NRLANCTONF||'_';

       V_MEDPREVISTA := 1;
       IF(C_APUR.IDBLOQSEMMEDIC = 'S') THEN
              SELECT COUNT(*)
               INTO V_MEDPREVISTA
               FROM FCT_MEDICAOAPU
              WHERE IDTPMEDIAPU = 'P'
                AND NRVENCPREVCONT = C_APUR.NRVENCPREVCONT
                AND NRSEQCONTRATO = C_APUR.NRSEQCONTRATO;
       END IF;

       /* Insercao dos itens na nota fical */
       FOR C_ITENS IN (
          SELECT 1 AS QTITEMCONTRATO,
                      ROUND(DECODE(SUM(RAT.VRRATEADO), NULL, FITV.VRVENCIMENTO, SUM(RAT.VRRATEADO)), 2) AS VRUNITITEMCONT,
                      DECODE(FPI.CDPRODFATURA, NULL, DECODE(PFC.CDPRODFATURA, NULL, DECODE(IT.CDSERVORCA, NULL, IT.CDPRODUTO, SV.CDPRODFATSERV), PFC.CDPRODFATURA), FPI.CDPRODFATURA) AS PROD,
                      P.NMPRODUTO,
                      IT.IDBLOQSEMMEDIC,
                      RAT.NRITEMOCONTRATO,
                      FITV.NRITVENCPREVCONT,
                      DECODE(SUM(RAT.VRRATEADO), NULL, 'N', 'S') AS IDRATEADO
                  FROM FCT_ITVENCPREVCONT FITV
                 INNER JOIN FCT_ITEMCONTRATO IT
                    ON FITV.NRSEQCONTRATO = IT.NRSEQCONTRATO
                   AND FITV.NRITEMOCONTRATO = IT.NRITEMOCONTRATO
                  LEFT JOIN FCT_SERVICOORCA SV
                    ON IT.CDSERVORCA = SV.CDSERVORCA
                  AND IT.NRORG      = SV.NRORG
                  LEFT JOIN FCT_PARAMFATITCONT FPI
                    ON IT.NRITEMOCONTRATO = FPI.NRITEMOCONTRATO
                   AND IT.NRORG = FPI.NRORG
                 INNER JOIN FCT_PARAMFATCONT PFC
                    ON FITV.NRSEQCONTRATO = PFC.NRSEQCONTRATO
                 INNER JOIN PRODUTO P
                    ON DECODE(FPI.CDPRODFATURA, NULL, DECODE(PFC.CDPRODFATURA, NULL, DECODE(IT.CDSERVORCA, NULL, IT.CDPRODUTO, SV.CDPRODFATSERV) ,PFC.CDPRODFATURA), FPI.CDPRODFATURA) = P.CDPRODUTO
                  LEFT JOIN FCT_RATEIOITVENCIMENTO RAT
                    ON FITV.NRVENCPREVCONT = RAT.NRVENCPREVCONT
                   AND FITV.NRITVENCPREVCONT  = RAT.NRITVENCPREVCONT
                   AND FITV.NRSEQCONTRATO  = RAT.NRSEQCONTRATO
                   AND FITV.NRORG          = RAT.NRORG
                   AND RAT.IDSITUVENCRATEIO <> 'F'
                  LEFT JOIN FCT_MEDICAOAPU MED
                    ON FITV.NRVENCPREVCONT  = MED.NRVENCPREVCONT
                   AND FITV.NRITEMOCONTRATO = MED.NRITEMOCONTRATO
                   AND FITV.NRORG 			= MED.NRORG
                   AND MED.IDTPMEDIAPU 	    = 'P'
                 WHERE FITV.NRVENCPREVCONT = C_APUR.NRVENCPREVCONT
                   AND FITV.NRSEQCONTRATO = C_APUR.NRSEQCONTRATO
                   AND FITV.IDFATURACONTR IN ('A', 'X')
                   AND FITV.NRORG = P_NRORG
                 GROUP BY FITV.VRVENCIMENTO,
                          DECODE(FPI.CDPRODFATURA, NULL, DECODE(PFC.CDPRODFATURA, NULL, DECODE(IT.CDSERVORCA, NULL, IT.CDPRODUTO, SV.CDPRODFATSERV), PFC.CDPRODFATURA), FPI.CDPRODFATURA),
                          P.NMPRODUTO,
                          IT.IDBLOQSEMMEDIC,
                          RAT.NRITEMOCONTRATO,
                          FITV.NRITVENCPREVCONT
                UNION ALL
                SELECT 1 AS QTITEMCONTRATO,
                       MD.VRTOTITEMCONTMED AS VRUNITITEMCONT,
                       NVL(TO_CHAR(SERV.CDPRODFATSERV), MD.CDPRODUTO) AS PROD,
                       'MEDICAO EXTRA - ' || NVL(SERV.NMSERVORCA, PROD.NMPRODUTO) AS NMPRODUTO,
                       'N' AS IDBLOQSEMMEDIC,
                       NULL AS NRITEMOCONTRATO,
                       NULL NRITVENCPREVCONT,
                       'N' AS IDRATEADO
                  FROM FCT_MEDICAOAPU MD
                  LEFT JOIN FCT_SERVICOORCA SERV
                    ON MD.CDSERVORCA = SERV.CDSERVORCA
                   AND MD.NRORG      = SERV.NRORG
                  LEFT JOIN PRODUTO PROD
                    ON MD.CDPRODUTO = PROD.CDPRODUTO
                   AND MD.NRORG     = PROD.NRORG
                 WHERE MD.NRSEQCONTRATO = C_APUR.NRSEQCONTRATO
                   AND MD.NRMEDICAOAPU  = C_APUR.NRMEDICAOAPU
                   AND MD.NRORG 		= P_NRORG
                   AND MD.IDTPMEDIAPU   = 'E'

       ) LOOP

          /* VERIFICA SE A MEDICAO É OBRIGATORIA PARA O VENCIMENTO E SE EXISTE MEDICAO PARA O VENICMENTO */

          --IF (V_MEDPREVISTA > 0) THEN
             SELECT COUNT(*)
               INTO V_QTPRODNOTA
               FROM ITEMPRODUTO
              WHERE NRLANCTONF = V_NRLANCTONF
                AND CDFILIAL = C_APUR.FILIALFAT
                AND CDPRODUTO = C_ITENS.PROD;

             IF (V_QTPRODNOTA = 0) THEN

                -- RAISE_APPLICATION_ERROR(-20010,'FILIAL -> '||C_APUR.FILIALFAT||'  NOTA -> '||V_NRLANCTONF||' PRODUTO -> '||C_ITENS.PROD||'  QUATIDADE -> '||C_ITENS.QTITEMCONTRATO||' VALOR -> '||C_ITENS.VRUNITITEMCONT);
                GERA_NOTAFISCAL_PRODUTO(C_APUR.FILIALFAT, V_NRLANCTONF, C_ITENS.PROD, C_ITENS.PROD, C_ITENS.NMPRODUTO, C_ITENS.QTITEMCONTRATO, C_ITENS.VRUNITITEMCONT);
             ELSE
                UPDATE ITEMPRODUTO
                   SET VRUNITITEM = VRUNITITEM + C_ITENS.VRUNITITEMCONT,
                       VRTOTAITEM = VRTOTAITEM + C_ITENS.VRUNITITEMCONT
                 WHERE NRLANCTONF = V_NRLANCTONF
                   AND CDFILIAL   = C_APUR.FILIALFAT
                   AND CDPRODUTO  = C_ITENS.PROD;

             END IF;
          --END IF;

          /*Caso o item tenha rateio, serao criados os rateios na Nota Fiscal*/
          IF (C_ITENS.IDRATEADO = 'S') THEN

             FOR C_RATEIO IN (
                 SELECT NRRATEIOITEMVENC, NRITVENCPREVCONT, NRVENCPREVCONT, NRSEQCONTRATO, NRITEMOCONTRATO,
                        NRESTRUTURAM, CDCENTCUST, VRRATEADO
                   FROM FCT_RATEIOITVENCIMENTO RAT
                  WHERE RAT.NRVENCPREVCONT   = C_APUR.NRVENCPREVCONT
                    AND RAT.NRSEQCONTRATO    = C_APUR.NRSEQCONTRATO
                    AND RAT.NRITVENCPREVCONT = C_ITENS.NRITVENCPREVCONT
                    AND RAT.IDSITUVENCRATEIO <> 'F'
                    AND ((INSTR(P_NRRATEIOITEMVENC, '_' || TO_CHAR(RAT.NRRATEIOITEMVENC) || '_') > 0) OR P_NRRATEIOITEMVENC IS NULL)
             ) LOOP
                   /* Busca o nEumero do item na Nota Fiscal */
                   SELECT NRSEQITPROD
                     INTO V_NRSEQIRPROD
                     FROM ITEMPRODUTO
                     WHERE NRLANCTONF = V_NRLANCTONF
                     AND CDFILIAL = C_APUR.FILIALFAT
                     AND CDPRODUTO = C_ITENS.PROD;

                    SELECT COUNT(*)
                      INTO V_COUNTRATEIO
                      FROM RATEIONF
                     WHERE NRLANCTONF = V_NRLANCTONF
                       AND CDFILIAL = C_APUR.FILIALFAT
                       AND NRSEQITPROD = V_NRSEQIRPROD
                       AND CDFILICCUST = C_APUR.FILIALFAT
                       AND CDCENTCUSNF = C_RATEIO.CDCENTCUST
                       AND NRORG = P_NRORG;

                   IF  V_COUNTRATEIO = 0 THEN

                       INSERT INTO RATEIONF(CDFILIAL, NRLANCTONF, NRSEQITPROD, CDFILICCUST, CDCENTCUSNF,
                                           VRRATENF, NRORG, DTINCLUSAO, IDATIVO)
                                   VALUES(C_APUR.FILIALFAT, V_NRLANCTONF, V_NRSEQIRPROD, C_APUR.FILIALFAT, C_RATEIO.CDCENTCUST,
                                          C_RATEIO.VRRATEADO, P_NRORG, SYSDATE, 'S');
                   ELSE

                       UPDATE RATEIONF
                          SET VRRATENF = VRRATENF + C_RATEIO.VRRATEADO
                        WHERE NRLANCTONF = V_NRLANCTONF
                          AND CDFILIAL = C_APUR.FILIALFAT
                          AND NRSEQITPROD = V_NRSEQIRPROD
                          AND CDFILICCUST = C_APUR.FILIALFAT
                          AND CDCENTCUSNF = C_RATEIO.CDCENTCUST
                          AND NRORG = P_NRORG;

                   END IF;

             END LOOP;
          END IF;
       END LOOP;

       /* ====== Abaixo ele testa se a nota fiscal possui algum item, se ela nao possuir ele deleta a nota fiscal e ignora o resto da rotina.
                 Se ela possuir, ele continua a rotina normalmente. */
       SELECT COUNT(*)
        INTO V_TESTAITEM
        FROM ITEMPRODUTO
       WHERE NRLANCTONF = V_NRLANCTONF
         AND CDFILIAL = C_APUR.FILIALFAT
         AND NRORG = P_NRORG;

       IF V_TESTAITEM = 0 THEN
          DELETE FROM NOTAFISCAL
           WHERE NRLANCTONF = V_NRLANCTONF
             AND CDFILIAL = C_APUR.FILIALFAT
             AND NRORG = P_NRORG;
       ELSE
          /* UPDATA DATAS DE COMPETENCIA DE FATURAMENTO NA NF */
          UPDATE NOTAFISCAL
             SET DTINIREFEFAT = C_APUR.DTINICOMPET,
                 DTFINREFEFAT = C_APUR.DTFINCOMPET
           WHERE NRLANCTONF   = V_NRLANCTONF
             AND CDFILIAL     = C_APUR.FILIALFAT;

         /* Gera apuracao do contrato */
          IF (V_NRAPURACAO IS NULL) THEN

              NOVO_CODIGO('FCT_APURACAO', V_NRAPURACAO, 1, P_NRORG);
              V_NRAPURACAO := SUBSTR(V_NRAPURACAO, 11, 10);

              INSERT INTO FCT_APURACAO
                    (NRAPURACAO, NRSEQCONTRATO, NRTIPOORCAMENTO,
                     NRPARCNEGOCIO, CDMODPGTO, NRGRUPOFATURA,
                     CDEMPRESA, CDFILIAL, NRLANCTONF,
                     IDSITUACAOAPURACAO, VRAPURACAO, VRAPURACAOORIGINAL,
                     DSALTERACAO, CDAGRUPANF, NRORG,
                     DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
              VALUES
                    (V_NRAPURACAO, C_APUR.NRSEQCONTRATO, V_TPORCA,
                     C_APUR.NRPARCNEGOCIO, C_APUR.CDMODPGTO, C_APUR.NRGRUPOFATURA,
                     V_EMPRESA, C_APUR.FILIALFAT, V_NRLANCTONF,
                     'FATURADA', C_APUR.VRAPUR, C_APUR.VRAPUR,
                     NULL, NULL, P_NRORG,
                     SYSDATE, P_NRORG, P_CDOPERINCLUSAO);
          END IF;

          /* Atualiza a tabela de rateios */
          IF (P_NRRATEIOITEMVENC IS NOT NULL) THEN

              UPDATE FCT_RATEIOITVENCIMENTO
                 SET NRAPURACAO       = V_NRAPURACAO,
                     IDSITUVENCRATEIO = 'F'
               WHERE NRORG          = P_NRORG
                 AND NRVENCPREVCONT = C_APUR.NRVENCPREVCONT
                 AND NRSEQCONTRATO  = C_APUR.NRSEQCONTRATO
                 AND NRAPURACAO     IS NULL
                 AND (INSTR(P_NRRATEIOITEMVENC, '_' || TO_CHAR(NRRATEIOITEMVENC) || '_') > 0);

          ELSE

              /* Atualiza tabela de Previsao de Vencimento */
              IF (C_APUR.NRVENCPREVCONT IS NOT NULL) THEN
                  UPDATE FCT_VENCPREVCONT
                    SET NRAPURACAO     = V_NRAPURACAO
                  WHERE NRORG          = P_NRORG
                    AND NRSEQCONTRATO  = C_APUR.NRSEQCONTRATO
                    AND NRVENCPREVCONT = C_APUR.NRVENCPREVCONT;

                  UPDATE FCT_RATEIOITVENCIMENTO
                     SET NRAPURACAO       = V_NRAPURACAO,
                         IDSITUVENCRATEIO = 'F'
                   WHERE NRORG            = P_NRORG
                     AND NRSEQCONTRATO    = C_APUR.NRSEQCONTRATO
                     AND NRVENCPREVCONT   = C_APUR.NRVENCPREVCONT
                     AND NRAPURACAO       IS NULL
                     AND IDSITUVENCRATEIO <> 'F';
              ELSE
                UPDATE FCT_MEDICAOAPU
                    SET NRAPURACAO = V_NRAPURACAO
                  WHERE NRORG      = P_NRORG
                    AND NRSEQCONTRATO = C_APUR.NRSEQCONTRATO
                    AND NRMEDICAOAPU  = C_APUR.NRMEDICAOAPU;

              END IF;

          END IF;
             /*Contrato*/
             IF C_APUR.NRCONTRATOFCT IS NOT NULL THEN
                SELECT MAX(NRDADOADIC)
                  INTO V_DADOADIC
                  FROM DADOSADIC
                 WHERE (CDFILIAL   = C_APUR.FILIALFAT) AND
                       (NRLANCTONF = V_NRLANCTONF);
                IF V_DADOADIC IS NULL THEN
                   V_DADOADIC := '001';
                ELSE
                   V_DADOADIC := V_DADOADIC+1;
                END IF;

                INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                  VALUES(C_APUR.FILIALFAT, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'Contrato: '||C_APUR.NRCONTRATOFCT);
             END IF;

             /*Vencimento*/
             IF C_APUR.DTVENCIMENTO IS NOT NULL THEN
                SELECT MAX(NRDADOADIC)
                  INTO V_DADOADIC
                  FROM DADOSADIC
                 WHERE (CDFILIAL   = C_APUR.FILIALFAT) AND
                       (NRLANCTONF = V_NRLANCTONF);
                IF V_DADOADIC IS NULL THEN
                   V_DADOADIC := '001';
                ELSE
                   V_DADOADIC := V_DADOADIC+1;
                END IF;

                BEGIN
                   SELECT DTATUAVENREC
                     INTO V_VENCIMENTO
                     FROM CONTARECEBER
                    WHERE NRLANCTONF = V_NRLANCTONF
                      AND CDFILIAL = C_APUR.FILIALFAT;
                EXCEPTION
                   WHEN NO_DATA_FOUND THEN
                       V_VENCIMENTO := C_APUR.DTVENCIMENTO;
                END;

                INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                  VALUES(C_APUR.FILIALFAT, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'Vencimento: '||TO_CHAR(V_VENCIMENTO,'DD/MM/YYYY'));
              END IF;

              /*PerÃƒÂ­odo*/
              IF C_APUR.DTINICOMPET IS NOT NULL THEN
                 SELECT MAX(NRDADOADIC)
                   INTO V_DADOADIC
                   FROM DADOSADIC
                  WHERE (CDFILIAL   = C_APUR.FILIALFAT) AND
                        (NRLANCTONF = V_NRLANCTONF);

                 IF V_DADOADIC IS NULL THEN
                    V_DADOADIC := '001';
                 ELSE
                    V_DADOADIC := V_DADOADIC+1;
                 END IF;

                 INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                   VALUES(C_APUR.FILIALFAT, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'PerÃƒÂ­odo: '||TO_CHAR(C_APUR.DTINICOMPET,'DD/MM/YYYY')||' - '||TO_CHAR(C_APUR.DTFINCOMPET,'DD/MM/YYYY'));
              END IF;

              /*Observacoes*/
              IF C_APUR.DSOBSERVACAOCONT IS NOT NULL THEN
                 SELECT MAX(NRDADOADIC)
                   INTO V_DADOADIC
                   FROM DADOSADIC
                  WHERE (CDFILIAL   = C_APUR.FILIALFAT) AND
                        (NRLANCTONF = V_NRLANCTONF);

                 IF V_DADOADIC IS NULL THEN
                    V_DADOADIC := '001';
                 ELSE
                    V_DADOADIC := V_DADOADIC+1;
                 END IF;

                 INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                   VALUES(C_APUR.FILIALFAT, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), C_APUR.DSOBSERVACAOCONT);
              END IF;
       END IF;
    END LOOP;

    V_TESTAPUR2 := 'A';
    V_NRLANCTONF := NULL;
    FOR C_APURO IN (SELECT DISTINCT CT.NRSEQCONTRATO, CT.NRPARCNEGOCIO, DECODE(FPF.CDFILIALFATURA, NULL, CDFILIALORCA, FPF.CDFILIALFATURA) AS FILIALFAT,
                           NVL(MD.VRTOTITEMCONTMED, VP.VRVENCIMENTO) AS VRAPUR, NVL(MD.DTINICOMPET, VP.DTINICOMPET) AS DTINICOMPET, NVL(MD.DTFINCOMPET, VP.DTFINCOMPET) AS DTFINCOMPET, VP.NRGRUPOFATURA, VP.CDMODPGTO,
                           VP.NRVENCPREVCONT  AS VENCMEDAPU, TRUNC(NVL(MD.DTVENCIMENTO, VP.DTVENCIMENTO)) AS DTVENCIMENTO, CT.NRCONTRATOFCT, CT.DSOBSERVACAOCONT, VP.NRAGRUPFATUR, FPF.IDGERANFPARC,
                           CT.IDBLOQSEMMEDIC, MD.NRMEDICAOAPU
                      FROM FCT_CONTRATO CT, FCT_VENCPREVCONT VP, FCT_PARAMFATCONT FPF, FCT_MEDICAOAPU MD
                     WHERE (CT.NRORG = P_NRORG)
                       AND ((INSTR(P_NRSEQCONTRATO, '_' || TO_CHAR(CT.NRSEQCONTRATO) || '_') > 0) OR (P_NRSEQCONTRATO IS NULL))
                       AND ((INSTR(P_NRPARCNEGOCIO, '_' || TO_CHAR(CT.NRPARCNEGOCIO) || '_') > 0) OR (P_NRPARCNEGOCIO IS NULL))
                       AND (CT.IDSITUACAOCONTRATO = 'A')
                       AND (VP.NRSEQCONTRATO = CT.NRSEQCONTRATO)
                       AND ((INSTR(P_NRVENCPREVCONT, '_' || TO_CHAR(VP.NRVENCPREVCONT) || '_') > 0) OR (P_NRVENCPREVCONT IS NULL))
                       AND ((TRUNC(VP.DTINICOMPET) >= TRUNC(P_DATAINI)) OR (P_DATAINI IS NULL))
                       AND ((TRUNC(VP.DTFINCOMPET) <= TRUNC(P_DATAFIN)) OR (P_DATAFIN IS NULL))
                       AND (VP.IDFATURACONTR IN ('O', 'P'))
                       AND CT.NRSEQCONTRATO = FPF.NRSEQCONTRATO
                       AND VP.IDSITUVENCPREV <> 'F'
                       AND VP.NRVENCPREVCONT = MD.NRVENCPREVCONT(+)
                       AND MD.NRITVENCPREVCONT(+) IS NULL
                       AND FPF.IDGERANFPARC = 'S'
                    UNION ALL
                    SELECT CT.NRSEQCONTRATO, CT.NRPARCNEGOCIO, DECODE(FPF.CDFILIALFATURA, NULL, CDFILIALORCA, FPF.CDFILIALFATURA) AS FILIALFAT,
                           SUM(NVL(MD.VRTOTITEMCONTMED, VP.VRVENCIMENTO)) AS VRAPUR, NVL(MD.DTINICOMPET, VP.DTINICOMPET) AS DTINICOMPET, NVL(MD.DTFINCOMPET, VP.DTFINCOMPET) AS DTFINCOMPET, VP.NRGRUPOFATURA, VP.CDMODPGTO,
                           0  AS VENCMEDAPU, MIN(TRUNC(NVL(MD.DTVENCIMENTO, VP.DTVENCIMENTO))) AS DTVENCIMENTO , CT.NRCONTRATOFCT, CT.DSOBSERVACAOCONT, VP.NRAGRUPFATUR, FPF.IDGERANFPARC,
                           CT.IDBLOQSEMMEDIC, MD.NRMEDICAOAPU
                      FROM FCT_CONTRATO CT, FCT_VENCPREVCONT VP, FCT_PARAMFATCONT FPF, FCT_MEDICAOAPU MD
                     WHERE (CT.NRORG = P_NRORG)
                       AND ((INSTR(P_NRSEQCONTRATO, '_' || TO_CHAR(CT.NRSEQCONTRATO) || '_') > 0) OR (P_NRSEQCONTRATO IS NULL))
                       AND ((INSTR(P_NRPARCNEGOCIO, '_' || TO_CHAR(CT.NRPARCNEGOCIO) || '_') > 0) OR (P_NRPARCNEGOCIO IS NULL))
                       AND (CT.IDSITUACAOCONTRATO = 'A')
                       AND (VP.NRSEQCONTRATO = CT.NRSEQCONTRATO)
                       AND ((INSTR(P_NRVENCPREVCONT, '_' || TO_CHAR(VP.NRVENCPREVCONT) || '_') > 0) OR (P_NRVENCPREVCONT IS NULL))
                       AND ((TRUNC(VP.DTINICOMPET) >= TRUNC(P_DATAINI)) OR (P_DATAINI IS NULL))
                       AND ((TRUNC(VP.DTFINCOMPET) <= TRUNC(P_DATAFIN)) OR (P_DATAFIN IS NULL))
                       AND (VP.IDFATURACONTR IN ('O', 'P'))
                       AND CT.NRSEQCONTRATO = FPF.NRSEQCONTRATO
                       AND VP.IDSITUVENCPREV <> 'F'
                       AND VP.NRVENCPREVCONT = MD.NRVENCPREVCONT(+)
                       AND MD.NRITVENCPREVCONT(+) IS NULL
                       AND FPF.IDGERANFPARC = 'N'
                  GROUP BY CT.NRSEQCONTRATO, CT.NRPARCNEGOCIO, DECODE(FPF.CDFILIALFATURA, NULL, CDFILIALORCA, FPF.CDFILIALFATURA),
                           NVL(MD.DTINICOMPET, VP.DTINICOMPET), NVL(MD.DTFINCOMPET, VP.DTFINCOMPET), VP.NRGRUPOFATURA, VP.CDMODPGTO,
                           CT.NRCONTRATOFCT, CT.DSOBSERVACAOCONT, VP.NRAGRUPFATUR, FPF.IDGERANFPARC,
                           CT.IDBLOQSEMMEDIC, MD.NRMEDICAOAPU ) LOOP


       /*Preenche Filial*/
        V_FILIAL := C_APURO.FILIALFAT;

       /* Recebe empresa para faturamento */
       BEGIN
          SELECT CDEMPRESA
            INTO V_EMPRESA
            FROM FILIAL
           WHERE CDFILIAL = C_APURO.FILIALFAT;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
             V_EMPRESA := NULL;
       END;

       /* Recebe dados do grupo de faturamento */
       BEGIN
          SELECT CDTIPOOPERFATURA, CDSERIENF, CDPRODUTOVENDA, NMPRODUTO
            INTO V_TPOPERFAT, V_TPSERIENF, V_PRODFAT, V_NMPRODFAT
            FROM FCT_GRUPOFATURA GRP, PRODUTO PRO
           WHERE GRP.NRGRUPOFATURA = C_APURO.NRGRUPOFATURA
             AND GRP.NRORG = P_NRORG
             AND PRO.CDPRODUTO(+) = GRP.CDPRODUTOVENDA;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN BEGIN
             V_TPOPERFAT := NULL;
             V_TPSERIENF := NULL;
             V_PRODFAT := NULL;
             V_NMPRODFAT := NULL;
          END;
       END;

       /* Recebe codigo do cliente */
       BEGIN
         SELECT CL.CDCLIENTE
           INTO V_CDCLIENTE
           FROM PARCNEGOCIO PN, CLIENTE CL
          WHERE PN.NRPARCNEGOCIO = C_APURO.NRPARCNEGOCIO
            AND PN.NRORG = P_NRORG
            AND CL.NRPARCNEGOCIO = PN.NRPARCNEGOCIO
            AND CL.NRORG = PN.NRORG;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
             V_CDCLIENTE := NULL;
       END;

       /* Recebe Tipo do Orcamento */
       BEGIN
          SELECT RF.NRTIPOORCAMENTO
            INTO V_TPORCA
            FROM FCT_ORCAMENTO OC, FCT_REFEORCACONT RF
           WHERE RF.NRORG = P_NRORG
             AND RF.NRSEQCONTRATO = C_APURO.NRSEQCONTRATO
             AND OC.NRORG = RF.NRORG
             AND OC.NRSEQORCAMENTO = RF.NRSEQORCAMENTO;
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_TPORCA := NULL;
       END;

       GERA_NOTAFISCAL_CORPO(C_APURO.FILIALFAT, C_APURO.FILIALFAT, V_EMPRESA, V_TPOPERFAT, V_TPSERIENF, V_CDCLIENTE, TRUNC(SYSDATE),'DFS',V_NRLANCTONF, V_PRXLANCESTQ);

       IF (V_NRLANCTONF IS NOT NULL) THEN
         FCT_PREENCHE_DADOS_NF(P_NRORG, C_APURO.FILIALFAT, V_NRLANCTONF, C_APURO.VENCMEDAPU, C_APURO.NRMEDICAOAPU, P_CDOPERINCLUSAO);
       END IF;

       V_NFCRIADA := V_NFCRIADA||'_'||V_NRLANCTONF||'_';

       V_MEDPREVISTA := 1;


      V_APURA := 0;
      FOR C_ITENSO IN (SELECT 1 AS QTITEMCONTRATO, NVL(MD.VRTOTITEMCONTMED,FITV.VRVENCIMENTO) AS VRUNITITEMCONT, NVL(MD.VRTOTITEMCONTMED,FITV.VRTOTITEMCONT) AS VRTOTITEMCONT,
                              DECODE(FPI.CDPRODFATURA,NULL,DECODE(PFC.CDPRODFATURA,NULL, DECODE(IT.CDSERVORCA, NULL, IT.CDPRODUTO, SV.CDPRODFATSERV), PFC.CDPRODFATURA), FPI.CDPRODFATURA) PROD,
                              P.NMPRODUTO, IT.IDBLOQSEMMEDIC, IT.NRITEMOCONTRATO
                         FROM FCT_VENCPREVCONT VP, FCT_ITEMCONTRATO IT, FCT_SERVICOORCA SV,
                              PRODUTO P, FCT_ITVENCPREVCONT FITV, FCT_PARAMFATITCONT FPI, FCT_PARAMFATCONT PFC, FCT_MEDICAOAPU MD
                        WHERE (VP.NRORG = P_NRORG)
                          AND (VP.NRVENCPREVCONT = C_APURO.VENCMEDAPU)
                          AND (VP.NRSEQCONTRATO = C_APURO.NRSEQCONTRATO)
                          AND (VP.IDFATURACONTR IN ('O', 'P'))
                          AND (VP.CDMODPGTO = C_APURO.CDMODPGTO OR VP.CDMODPGTO IS NULL)
                          AND (IT.NRORG = VP.NRORG)
                          AND (IT.NRSEQCONTRATO = VP.NRSEQCONTRATO)
                          AND (SV.CDSERVORCA(+) = IT.CDSERVORCA)
                          AND (SV.NRORG(+) = IT.NRORG)
                          AND ((IT.CDMODPGTO = VP.CDMODPGTO) OR (IT.CDMODPGTO IS NULL))
                          AND (DECODE(FPI.CDPRODFATURA, NULL, DECODE(PFC.CDPRODFATURA, NULL, DECODE(IT.CDSERVORCA, NULL, IT.CDPRODUTO, SV.CDPRODFATSERV),PFC.CDPRODFATURA), FPI.CDPRODFATURA) = P.CDPRODUTO)
                          AND (VP.NRSEQCONTRATO   = PFC.NRSEQCONTRATO)
                          AND (IT.NRITEMOCONTRATO = FITV.NRITEMOCONTRATO)
                          AND (VP.NRVENCPREVCONT  = FITV.NRVENCPREVCONT)
                          AND (IT.NRITEMOCONTRATO = FPI.NRITEMOCONTRATO(+))
                          AND (IT.NRORG = FPI.NRORG(+))
                          AND (FITV.NRITVENCPREVCONT = MD.NRITVENCPREVCONT(+))
                          AND (MD.IDTPMEDIAPU(+) = 'P')
                          AND (C_APURO.NRMEDICAOAPU IS NULL)
                          AND (C_APURO.IDGERANFPARC = 'S')
                          AND NOT EXISTS (SELECT 1 FROM FCT_MEDICAOAPU SMD
                                           WHERE SMD.NRVENCPREVCONT = VP.NRVENCPREVCONT
                                             AND SMD.NRITVENCPREVCONT IS NULL
                                             AND SMD.IDTPMEDIAPU = 'P'
                                             AND SMD.NRORG = P_NRORG)
                      UNION ALL
                      SELECT 1 AS QTITEMCONTRATO, SUM(NVL(MD.VRTOTITEMCONTMED,FITV.VRVENCIMENTO)) AS VRUNITITEMCONT, SUM(NVL(MD.VRTOTITEMCONTMED,FITV.VRTOTITEMCONT)) AS VRTOTITEMCONT,
                              DECODE(FPI.CDPRODFATURA,NULL,DECODE(PFC.CDPRODFATURA,NULL, DECODE(IT.CDSERVORCA, NULL, IT.CDPRODUTO, SV.CDPRODFATSERV), PFC.CDPRODFATURA), FPI.CDPRODFATURA) PROD,
                              P.NMPRODUTO, IT.IDBLOQSEMMEDIC, IT.NRITEMOCONTRATO
                         FROM FCT_VENCPREVCONT VP, FCT_ITEMCONTRATO IT, FCT_SERVICOORCA SV,
                              PRODUTO P, FCT_ITVENCPREVCONT FITV, FCT_PARAMFATITCONT FPI, FCT_PARAMFATCONT PFC, FCT_MEDICAOAPU MD
                        WHERE (VP.NRORG = P_NRORG)
                          AND (VP.NRSEQCONTRATO = C_APURO.NRSEQCONTRATO)
                          AND (VP.IDFATURACONTR IN ('O', 'P'))
                          AND (VP.CDMODPGTO = C_APURO.CDMODPGTO)
                          AND (IT.NRORG = VP.NRORG)
                          AND (IT.NRSEQCONTRATO = VP.NRSEQCONTRATO)
                          AND (SV.CDSERVORCA(+) = IT.CDSERVORCA)
                          AND (SV.NRORG(+) = IT.NRORG)
                          AND ((IT.CDMODPGTO = VP.CDMODPGTO) OR (IT.CDMODPGTO IS NULL))
                          AND (DECODE(FPI.CDPRODFATURA, NULL, DECODE(PFC.CDPRODFATURA, NULL, DECODE(IT.CDSERVORCA, NULL, IT.CDPRODUTO, SV.CDPRODFATSERV),PFC.CDPRODFATURA), FPI.CDPRODFATURA) = P.CDPRODUTO)
                          AND (VP.NRSEQCONTRATO   = PFC.NRSEQCONTRATO)
                          AND (IT.NRITEMOCONTRATO = FITV.NRITEMOCONTRATO)
                          AND (VP.NRVENCPREVCONT  = FITV.NRVENCPREVCONT)
                          AND (IT.NRITEMOCONTRATO = FPI.NRITEMOCONTRATO(+))
                          AND (IT.NRORG = FPI.NRORG(+))
                          AND (FITV.NRITVENCPREVCONT = MD.NRITVENCPREVCONT(+))
                          AND (MD.IDTPMEDIAPU(+) = 'P')
                          AND (C_APURO.NRMEDICAOAPU IS NULL)
                          AND (C_APURO.IDGERANFPARC = 'N')
                          AND NOT EXISTS (SELECT 1 FROM FCT_MEDICAOAPU SMD
                                           WHERE SMD.NRVENCPREVCONT = VP.NRVENCPREVCONT
                                             AND SMD.NRITVENCPREVCONT IS NULL
                                             AND SMD.IDTPMEDIAPU = 'P'
                                             AND SMD.NRORG = P_NRORG)
                      GROUP BY  DECODE(FPI.CDPRODFATURA,NULL,DECODE(PFC.CDPRODFATURA,NULL, DECODE(IT.CDSERVORCA, NULL, IT.CDPRODUTO, SV.CDPRODFATSERV), PFC.CDPRODFATURA), FPI.CDPRODFATURA),
                                P.NMPRODUTO, IT.IDBLOQSEMMEDIC, IT.NRITEMOCONTRATO
                      UNION ALL
                      SELECT 1 AS QTITEMCONTRATO, C_APURO.VRAPUR AS VRUNITITEMCONT, C_APURO.VRAPUR AS VRTOTITEMCONT,
                             PF.CDPRODFATURA AS PROD, P.NMPRODUTO,
                             'N' AS IDBLOQSEMMEDIC, NULL AS NRITEMOCONTRATO
                        FROM FCT_PARAMFATCONT PF, PRODUTO P
                       WHERE PF.CDPRODFATURA = P.CDPRODUTO
                         AND C_APURO.NRMEDICAOAPU IS NOT NULL
                         AND PF.NRSEQCONTRATO = C_APURO.NRSEQCONTRATO
                         AND PF.NRORG = P_NRORG
                      ) LOOP

          /* VERIFICA SE A MEDIÃƒ.Ãƒ.O Ãƒ. OBRIGATÃƒ.RIA PARA O VENCIMENTO E SE EXISTE MEDIÃƒ.Ãƒ.O PARA O VENICMENTO */

         IF (V_MEDPREVISTA > 0) THEN
             SELECT COUNT(*)
               INTO V_QTPRODNOTA
               FROM ITEMPRODUTO
              WHERE NRLANCTONF = V_NRLANCTONF
                AND CDFILIAL = C_APURO.FILIALFAT
                AND CDPRODUTO = C_ITENSO.PROD;

             IF V_QTPRODNOTA = 0 THEN

                GERA_NOTAFISCAL_PRODUTO(C_APURO.FILIALFAT, V_NRLANCTONF, C_ITENSO.PROD, C_ITENSO.PROD, C_ITENSO.NMPRODUTO, C_ITENSO.QTITEMCONTRATO, C_ITENSO.VRUNITITEMCONT);
             ELSE
                UPDATE ITEMPRODUTO
                   SET VRUNITITEM = VRUNITITEM+C_ITENSO.VRUNITITEMCONT,
                       VRTOTAITEM = VRTOTAITEM+C_ITENSO.VRUNITITEMCONT
                 WHERE NRLANCTONF = V_NRLANCTONF
                   AND CDFILIAL = C_APURO.FILIALFAT
                   AND CDPRODUTO = C_ITENSO.PROD;
             END IF;
         END IF;

         V_APURA := V_APURA + C_ITENSO.VRTOTITEMCONT;
      END LOOP;

      /* ====== Abaixo ele testa se a nota fiscal possui algum item, se ela nÃƒÂ£o possuir ele deleta a nota fiscal e ignora o resto da rotina.
                Se ela possuir, ele continua a rotina normalmente. */
      SELECT COUNT(*)
        INTO V_TESTAITEM
        FROM ITEMPRODUTO
       WHERE NRLANCTONF = V_NRLANCTONF
         AND CDFILIAL = C_APURO.FILIALFAT
         AND NRORG = P_NRORG;

      IF V_TESTAITEM = 0 THEN
         DELETE
           FROM NOTAFISCAL
          WHERE NRLANCTONF = V_NRLANCTONF
            AND CDFILIAL = C_APURO.FILIALFAT
            AND NRORG = P_NRORG;
      ELSE
         UPDATE NOTAFISCAL
            SET DTINIREFEFAT = C_APURO.DTINICOMPET,
                DTFINREFEFAT = C_APURO.DTFINCOMPET
          WHERE NRLANCTONF   = V_NRLANCTONF
            AND CDFILIAL     = C_APURO.FILIALFAT;

         V_TESTAPUR2 := V_TESTAPUR;

         /*Gera apuracao do contrato*/
         NOVO_CODIGO('FCT_APURACAO', V_NRAPURACAO, 1, P_NRORG);
         V_NRAPURACAO := SUBSTR(V_NRAPURACAO, 11, 10);

         INSERT INTO FCT_APURACAO
              (NRAPURACAO, NRSEQCONTRATO, NRTIPOORCAMENTO,
               NRPARCNEGOCIO, CDMODPGTO, NRGRUPOFATURA,
               CDEMPRESA, CDFILIAL, NRLANCTONF,
               IDSITUACAOAPURACAO, VRAPURACAO, VRAPURACAOORIGINAL,
               DSALTERACAO, CDAGRUPANF, NRORG,
               DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
           VALUES
              (V_NRAPURACAO, C_APURO.NRSEQCONTRATO, V_TPORCA,
               C_APURO.NRPARCNEGOCIO, C_APURO.CDMODPGTO, C_APURO.NRGRUPOFATURA,
               V_EMPRESA, C_APURO.FILIALFAT, V_NRLANCTONF,
               'FATURADA', V_APURA, V_APURA,
               NULL, NULL, P_NRORG,
               SYSDATE, P_NRORG, P_CDOPERINCLUSAO);

         IF  C_APURO.IDGERANFPARC = 'S' THEN
            /* Atualiza tabela de Previsao de Vencimento */
            UPDATE FCT_VENCPREVCONT
               SET NRAPURACAO = V_NRAPURACAO,
                   IDSITUVENCPREV = 'F'
             WHERE NRORG = P_NRORG
               AND NRSEQCONTRATO = C_APURO.NRSEQCONTRATO
               AND NRVENCPREVCONT = C_APURO.VENCMEDAPU;

         ELSE
            FOR C_APURC IN (SELECT NRVENCPREVCONT
                              FROM FCT_VENCPREVCONT
                             WHERE (IDFATURACONTR = 'O')
                               AND (CDMODPGTO = C_APURO.CDMODPGTO)
                               AND (NRGRUPOFATURA = C_APURO.NRGRUPOFATURA)) LOOP


               /* Atualiza tabela de Previsao de Vencimento */
               UPDATE FCT_VENCPREVCONT
                  SET NRAPURACAO = V_NRAPURACAO,
                      IDSITUVENCPREV = 'F'
                WHERE NRORG = P_NRORG
                  AND NRSEQCONTRATO = C_APURO.NRSEQCONTRATO
                  AND NRVENCPREVCONT = C_APURC.NRVENCPREVCONT;

            END LOOP;
         END IF;

         /* ======== INSERE OS DADOS ADICIONAIS NA NF ======== */
         /*Contrato*/
         IF C_APURO.NRCONTRATOFCT IS NOT NULL THEN
            SELECT MAX(NRDADOADIC)
              INTO V_DADOADIC
              FROM DADOSADIC
             WHERE (CDFILIAL   = C_APURO.FILIALFAT) AND
                   (NRLANCTONF = V_NRLANCTONF);

            IF V_DADOADIC IS NULL THEN
               V_DADOADIC := '001';
            ELSE
               V_DADOADIC := V_DADOADIC+1;
            END IF;

            INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
               VALUES(C_APURO.FILIALFAT, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'Contrato: '||C_APURO.NRCONTRATOFCT);
         END IF;

         /*PerÃƒÂ­odo*/
         IF C_APURO.DTINICOMPET IS NOT NULL THEN
            SELECT MAX(NRDADOADIC)
              INTO V_DADOADIC
              FROM DADOSADIC
             WHERE (CDFILIAL   = C_APURO.FILIALFAT) AND
                   (NRLANCTONF = V_NRLANCTONF);

            IF V_DADOADIC IS NULL THEN
               V_DADOADIC := '001';
            ELSE
               V_DADOADIC := V_DADOADIC+1;
            END IF;

            INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
              VALUES(C_APURO.FILIALFAT, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'PerÃƒÂ­odo: '||TO_CHAR(C_APURO.DTINICOMPET,'DD/MM/YYYY')||' - '||TO_CHAR(C_APURO.DTFINCOMPET, 'DD/MM/YYYY'));
         END IF;

         /*Vencimento*/
         IF C_APURO.IDGERANFPARC = 'S' THEN
            IF C_APURO.DTVENCIMENTO IS NOT NULL THEN
               SELECT MAX(NRDADOADIC)
                 INTO V_DADOADIC
                 FROM DADOSADIC
                WHERE (CDFILIAL   = C_APURO.FILIALFAT) AND
                      (NRLANCTONF = V_NRLANCTONF);
               IF V_DADOADIC IS NULL THEN
                  V_DADOADIC := '001';
               ELSE
                  V_DADOADIC := V_DADOADIC+1;
               END IF;

               BEGIN
                  SELECT DTATUAVENREC
                    INTO V_VENCIMENTO
                    FROM CONTARECEBER
                   WHERE NRLANCTONF = V_NRLANCTONF
                     AND CDFILIAL = C_APURO.FILIALFAT;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_VENCIMENTO := C_APURO.DTVENCIMENTO;
               END;

               INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                 VALUES(C_APURO.FILIALFAT, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'Vencimento: '||TO_CHAR(V_VENCIMENTO,'DD/MM/YYYY'));
            END IF;
         END IF;

         /*Unidade*/
         IF C_APURO.DSOBSERVACAOCONT IS NOT NULL THEN
            SELECT MAX(NRDADOADIC)
              INTO V_DADOADIC
              FROM DADOSADIC
             WHERE (CDFILIAL   = C_APURO.FILIALFAT) AND
                   (NRLANCTONF = V_NRLANCTONF);
             IF V_DADOADIC IS NULL THEN
                V_DADOADIC := '001';
             ELSE
                V_DADOADIC := V_DADOADIC+1;
             END IF;

             INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
               VALUES(C_APURO.FILIALFAT, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), C_APURO.DSOBSERVACAOCONT);
         END IF;
      END IF;
   END LOOP;

   FOR C_NFFECHAMENTO IN (SELECT DISTINCT NRSEQCONTRATO, NRLANCTONF, CDFILIAL, NRVENCPREVCONT, DSREFERENCIANOTA
                            FROM FCT_DADOSNF
                           WHERE (INSTR('_'||P_NRSEQCONTRATO||'_', '_'||TO_CHAR(NRSEQCONTRATO)||'_')>0)
                             AND (INSTR('_'||V_NFCRIADA||'_', '_'||NRLANCTONF||'_')>0)
                             AND NRORG = P_NRORG) LOOP

      GERA_NOTAFISCAL_FECHAMENTO(C_NFFECHAMENTO.CDFILIAL, C_NFFECHAMENTO.NRLANCTONF);


      SELECT VRNOTAFISC
        INTO V_VRNOTAFISC
        FROM NOTAFISCAL
       WHERE NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
         AND CDFILIAL = C_NFFECHAMENTO.CDFILIAL
         AND NRORG = P_NRORG;

      BEGIN
        SELECT VRVENCIMENTO, VRFALTAFATURAR
          INTO V_VRVENCIMENTO, V_VRFALTAFATURAR
          FROM FCT_VENCPREVCONT
         WHERE NRVENCPREVCONT = C_NFFECHAMENTO.NRVENCPREVCONT
           AND NRORG          = P_NRORG;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          V_VRVENCIMENTO := NULL;
          V_VRFALTAFATURAR := NULL;
      END;

      IF(V_VRFALTAFATURAR IS NOT NULL) THEN
        V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO, 2);
        V_VRFALTAFATURAR := ROUND(V_VRFALTAFATURAR, 2);

        IF (V_VRNOTAFISC = V_VRVENCIMENTO) THEN
            V_IDSITUVENCPREV := 'F';

            UPDATE FCT_VENCPREVCONT
               SET IDSITUVENCPREV = V_IDSITUVENCPREV,
                   VRFATURADO     = V_VRNOTAFISC,
                   VRFALTAFATURAR = 0
             WHERE NRVENCPREVCONT = C_NFFECHAMENTO.NRVENCPREVCONT
               AND NRORG          = P_NRORG;
        ELSE
            IF (V_VRNOTAFISC = V_VRFALTAFATURAR) THEN
                V_IDSITUVENCPREV := 'F';
            ELSE
                V_IDSITUVENCPREV := 'I';
            END IF;

            UPDATE FCT_VENCPREVCONT
               SET IDSITUVENCPREV = V_IDSITUVENCPREV,
                   VRFATURADO     = VRFATURADO + V_VRNOTAFISC,
                   VRFALTAFATURAR = VRFALTAFATURAR - V_VRNOTAFISC
             WHERE NRVENCPREVCONT = C_NFFECHAMENTO.NRVENCPREVCONT
               AND NRORG          = P_NRORG;
        END IF;

        IF (V_IDSITUVENCPREV = 'F') THEN
            UPDATE FCT_RATEIOITVENCIMENTO
               SET IDSITUVENCRATEIO = 'F'
             WHERE NRVENCPREVCONT = C_NFFECHAMENTO.NRVENCPREVCONT
               AND NRORG          = P_NRORG;
        END IF;
      END IF;

      UPDATE FCT_APURACAO
         SET VRAPURACAO         = V_VRNOTAFISC,
             VRAPURACAOORIGINAL = V_VRNOTAFISC
       WHERE NRAPURACAO = V_NRAPURACAO
         AND NRORG      = P_NRORG;

       /* UPDATA VALORES DO RATEIO PARA CONSIDER O VALOR CONTÃBIL DO ITEM DA NF (ITEMPRODUTO.VRCONTITEM) */

       FOR C_UPDRATEIO IN (SELECT NRSEQITPROD, VRRATENF, CDFILICCUST, CDCENTCUSNF
                        FROM RATEIONF RAT
                       WHERE (RAT.NRLANCTONF =  C_NFFECHAMENTO.NRLANCTONF)
                         AND (RAT.CDFILIAL = C_NFFECHAMENTO.CDFILIAL)
                         AND (NRORG = P_NRORG)) LOOP

           -- Busca valores do item
           SELECT VRCONTITEM, VRBRUTITEM
             INTO V_VRCONTITEM, V_VRBRUTITEM
             FROM ITEMPRODUTO
             WHERE NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
             AND CDFILIAL = C_NFFECHAMENTO.CDFILIAL
             AND NRSEQITPROD = C_UPDRATEIO.NRSEQITPROD
             AND NRORG = P_NRORG;


           SELECT (C_UPDRATEIO.VRRATENF*100)/ V_VRBRUTITEM
             INTO V_VRPERCRATEIO
             FROM DUAL;

           IF V_VRPERCRATEIO = 100 THEN

              V_VRRATEIO := V_VRCONTITEM;

           ELSE

              V_VRRATEIO := (V_VRCONTITEM * V_VRPERCRATEIO)/100;

           END IF;

           UPDATE RATEIONF
              SET VRRATENF = V_VRRATEIO
            WHERE CDFILIAL = C_NFFECHAMENTO.CDFILIAL
              AND NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
              AND CDFILICCUST = C_UPDRATEIO.CDFILICCUST
              AND CDCENTCUSNF = C_UPDRATEIO.CDCENTCUSNF
              AND NRSEQITPROD = C_UPDRATEIO.NRSEQITPROD
              AND NRORG = P_NRORG;

       END LOOP;

       /* atualiza a descrição do item da NF de acordo com a referencia da FCT_DADOSNF*/
       IF C_NFFECHAMENTO.DSREFERENCIANOTA IS NOT NULL THEN

          UPDATE ITEMPRODUTO
            SET DSPRODEMIS = C_NFFECHAMENTO.DSREFERENCIANOTA
          WHERE NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
            AND CDFILIAL = C_NFFECHAMENTO.CDFILIAL
            AND NRORG = P_NRORG;

       END IF;

      /* atualiza a descrição do item da NF de acordo com a parametrização do serviço, SIM, ELA SUBSTITUI A DO FCT_DADOSNF*/
      FOR C_ITENSVENC IN (SELECT NRITVENCPREVCONT, NRITEMOCONTRATO
                            FROM FCT_ITVENCPREVCONT
                            WHERE NRVENCPREVCONT = C_NFFECHAMENTO.NRVENCPREVCONT
                              AND NRORG          = P_NRORG) LOOP

           V_DSSERVORCANF := NULL;

          FOR C_SERVICOS IN (SELECT ORC.NRORCAMENTO,
                                    CONT.NRCONTRATOFCT,
                                    PARC.NMPRINCIPALPARC,
                                    PARCELATOT.QTPARCELASTOT,
                                    NVL(PARCELA.QTPARCELAS, 0) AS QTPARCELAS,
                                    SERVORCA.CDPRODFATSERV,
                                    SERVORCA.DSSERVORCANF
                              FROM FCT_CONTRATO CONT
                              INNER JOIN PARCNEGOCIO PARC
                                ON PARC.NRPARCNEGOCIO = CONT.NRPARCNEGOCIO
                                AND PARC.NRORG = CONT.NRORG
                                LEFT JOIN (SELECT FCT_VENCPREVCONT.NRSEQCONTRATO,
                                                  FCT_VENCPREVCONT.NRORG,
                                                  COUNT(FCT_VENCPREVCONT.NRVENCPREVCONT) AS QTPARCELASTOT
                                            FROM FCT_VENCPREVCONT
                                            JOIN FCT_ITVENCPREVCONT
                                              ON FCT_ITVENCPREVCONT.NRVENCPREVCONT = FCT_VENCPREVCONT.NRVENCPREVCONT
                                            AND FCT_ITVENCPREVCONT.NRORG = FCT_VENCPREVCONT.NRORG
                                            AND FCT_ITVENCPREVCONT.NRITEMOCONTRATO = C_ITENSVENC.NRITEMOCONTRATO
                                            WHERE FCT_VENCPREVCONT.NRSEQCONTRATO = C_NFFECHAMENTO.NRSEQCONTRATO
                                              AND FCT_VENCPREVCONT.NRORG = P_NRORG
                                            GROUP BY FCT_VENCPREVCONT.NRSEQCONTRATO,
                                                    FCT_VENCPREVCONT.NRORG) PARCELATOT
                                ON PARCELATOT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                                AND PARCELATOT.NRORG = CONT.NRORG
                                LEFT JOIN (SELECT FCT_VENCPREVCONT.NRSEQCONTRATO,
                                                  FCT_VENCPREVCONT.NRORG,
                                                  COUNT(FCT_VENCPREVCONT.NRVENCPREVCONT) AS QTPARCELAS
                                            FROM FCT_VENCPREVCONT
                                            JOIN FCT_ITVENCPREVCONT
                                              ON FCT_ITVENCPREVCONT.NRVENCPREVCONT = FCT_VENCPREVCONT.NRVENCPREVCONT
                                            AND FCT_ITVENCPREVCONT.NRORG = FCT_VENCPREVCONT.NRORG
                                            AND FCT_ITVENCPREVCONT.NRITEMOCONTRATO = C_ITENSVENC.NRITEMOCONTRATO
                                            WHERE FCT_VENCPREVCONT.NRSEQCONTRATO = C_NFFECHAMENTO.NRSEQCONTRATO
                                              AND FCT_VENCPREVCONT.NRORG = P_NRORG
                                              AND FCT_VENCPREVCONT.IDSITUVENCPREV = 'F'
                                            GROUP BY FCT_VENCPREVCONT.NRSEQCONTRATO,
                                                    FCT_VENCPREVCONT.NRORG) PARCELA
                                ON PARCELA.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                                AND PARCELA.NRORG = CONT.NRORG
                                LEFT JOIN FCT_REFEORCACONT RELACCONTPROP
                                ON RELACCONTPROP.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                                AND RELACCONTPROP.NRORG = CONT.NRORG
                                LEFT JOIN FCT_ORCAMENTO ORC
                                ON RELACCONTPROP.NRSEQORCAMENTO = ORC.NRSEQORCAMENTO
                                AND RELACCONTPROP.NRORG = ORC.NRORG
                                INNER JOIN FCT_ITEMCONTRATO ITEMCONT
                                ON ITEMCONT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                                AND ITEMCONT.NRITEMOCONTRATO = C_ITENSVENC.NRITEMOCONTRATO
                                AND ITEMCONT.NRORG = CONT.NRORG
                                INNER JOIN FCT_SERVICOORCA SERVORCA
                                ON SERVORCA.CDSERVORCA = ITEMCONT.CDSERVORCA
                                AND SERVORCA.NRORG = ITEMCONT.NRORG
                              WHERE CONT.NRSEQCONTRATO = C_NFFECHAMENTO.NRSEQCONTRATO
                                AND CONT.NRORG = P_NRORG
                                AND SERVORCA.DSSERVORCANF IS NOT NULL) LOOP

              V_DSSERVORCANF := C_SERVICOS.DSSERVORCANF;
              V_PARCELAS := C_SERVICOS.QTPARCELAS||'/'||C_SERVICOS.QTPARCELASTOT;
              /*Mnemônicos: [CODPROP] - Código Proposta | [CODCONT] - Código Contrato | [PARCEIRO] - Parceiro de Negócio | [PARCELA] - Parcelas*/

              V_DSSERVORCANF := REPLACE(V_DSSERVORCANF,'[CODPROP]', NVL(C_SERVICOS.NRORCAMENTO, ''));
              V_DSSERVORCANF := REPLACE(V_DSSERVORCANF,'[CODCONT]', NVL(C_SERVICOS.NRCONTRATOFCT, ''));
              V_DSSERVORCANF := REPLACE(V_DSSERVORCANF,'[PARCEIRO]', NVL(C_SERVICOS.NMPRINCIPALPARC, ''));
              V_DSSERVORCANF := REPLACE(V_DSSERVORCANF,'[PARCELA]', NVL(V_PARCELAS, ''));

              UPDATE ITEMPRODUTO
                SET DSPRODEMIS = V_DSSERVORCANF
              WHERE NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
                AND CDFILIAL = C_NFFECHAMENTO.CDFILIAL
                AND CDPRODUTO = C_SERVICOS.CDPRODFATSERV
                AND NRORG = P_NRORG;

          END LOOP;
      END LOOP;


       --Comentado no dia 23/12/2015 devido a geraÃƒÂ§ÃƒÂ£o duplicada de contas a receber.
       --FCT_CRIA_VENCIMENTO(C_NFFECHAMENTO.CDFILIAL, C_NFFECHAMENTO.NRLANCTONF, P_NRORG);

   END LOOP;
   P_RETORNO := 'SUCESS';
   P_RETORNOERRO := 'Processo realizado com sucesso.';

 EXCEPTION
   -- Caso dê algum erro no faturamento, serão deletadas as notas fiscais para não ficar lixo na base de dados. --
   WHEN OTHERS THEN BEGIN
      IF V_NFCRIADA IS NOT NULL THEN -- Verifica se tem NF criada --
         IF  V_NRAPURACAO IS NULL THEN -- Verifica se a NF criada já foi vinculadaà apuração. No caso, se ja foi gravada a "ITEMPRODUTO" e a "FCT_APURACAO" --
            FOR C_EXCEPTION IN (SELECT DISTINCT NRLANCTONF, CDFILIAL
                                  FROM NOTAFISCAL
                                 WHERE (INSTR('_'||V_NFCRIADA||'_', '_'||NRLANCTONF||'_')>0)
                                   AND (CDFILIAL = V_FILIAL)
                                   AND NRORG = P_NRORG) LOOP

               --  Caso exista rateio para nota, deleta o rateio --
               DELETE FROM RATEIONF
                     WHERE NRORG = P_NRORG
                       AND NRLANCTONF = C_EXCEPTION.NRLANCTONF
                       AND CDFILIAL = C_EXCEPTION.CDFILIAL;

              -- Deleta a NF ---
               DELETA_NF(C_EXCEPTION.CDFILIAL,C_EXCEPTION.NRLANCTONF);

               --  ALTERA O STATUS DO VENCIMEMNTO PARA "CANCELADO" --
               FOR C_UPDVENC IN (SELECT NRAPURACAO
                                   FROM FCT_APURACAO
                                  WHERE NRLANCTONF = C_EXCEPTION.NRLANCTONF
                                    AND CDFILIAL = C_EXCEPTION.CDFILIAL
                                    AND NRORG = P_NRORG)LOOP

                UPDATE FCT_VENCPREVCONT
                   SET IDSITUVENCPREV = 'C'
                 WHERE NRORG = P_NRORG
                   AND NRAPURACAO = C_UPDVENC.NRAPURACAO;

               END LOOP;

           END LOOP;

         ELSE

            FCT_CANC_FATURA_CONTRATO (P_NRORG, P_NRSEQCONTRATO, P_CDOPERINCLUSAO, P_DATAINI, P_DATAFIN, P_NRVENCPREVCONT);

         END IF;
      END IF;

      P_RETORNO := 'ERROR';
      P_RETORNOERRO := 'Operação bloqueada. Ocorreram erros na realização do processo.';
   END;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('FCT_FATURA_CONTRATO','6.25.xxx'); END;
/