create or replace PROCEDURE FCT_CALCITEM_VENCIMENTO
  (P_NRORG IN NUMBER,
   P_NRSEQOPERATRAB IN NUMBER,
   P_NRITEM IN NUMBER)
AS
   V_IDFORMAPGTO VARCHAR2(1);
   V_NRPARCPGTO NUMBER;
   V_IDTIPODTPGT VARCHAR2(4);
   V_SEQUENCIAL NUMBER;
   V_VRPARCVENC NUMBER;
   V_NRPARCELAS NUMBER;
   V_VRPARCAUXI NUMBER;
   V_INDIAS NUMBER;
   V_INGUARDANRDIAS NUMBER;
   V_DTVENCIMENTO DATE;
   V_DTBASE DATE;
   V_VRPAGTO NUMBER;
   V_BOCONSFERIBANC VARCHAR2(10);
   V_IDTPPERIODO VARCHAR2(1);
   V_CDFORMPGTO VARCHAR2(2);
   V_IDVALORPARCELAS VARCHAR2(30);
   P_QTDIAS NUMBER;
   V_DTFINALPREV DATE;
   V_QTDIASPREV NUMBER;
   V_NRVENCPREVCONT NUMBER;
   V_VRVENCPARC  FLOAT;
   V_VRVENCPARC2 FLOAT;
   V_DTINICOMP DATE;
   V_DTFINCOMP DATE;
   V_IDQTDIASCOMPCON VARCHAR2(1);
   V_NRQTDIASCOMPCON NUMBER;
   V_IDTPCOMPETCONT VARCHAR2(1);
   V_NRDIACOMPETCONT NUMBER;
   V_DTVENCIMENTOANT DATE;
   V_DTEMISS DATE;
   V_ULTIMOREG VARCHAR2(1);
   V_CANCINC VARCHAR2(1);
   V_PERIODO NUMBER;
   V_DTINIFATCOMPT DATE;
   V_NRSEQTRABVENCPREV NUMBER;
   V_DTINCREMENT DATE;
   V_CDCLIENTE VARCHAR2(21);

   V_PASSOU BOOLEAN;
   V_DTINICOMPET_ATUAL DATE;
   V_DTFINCOMPET_ATUAL DATE;
   V_DIAVENCPARC NUMBER;
   V_ULTIMODIAMES NUMBER;
   V_QTDIASPERIODO NUMBER;

FUNCTION DIAPGTO
     (P_DTBASE IN DATE,
      P_IDTPPERIODO IN VARCHAR2,
      P_CDFORMPGTO IN VARCHAR2)
   RETURN DATE IS
      V_DTVENCIMENTO DATE;
   BEGIN
      V_DTVENCIMENTO := P_DTBASE;
      IF P_IDTPPERIODO = 'M' THEN
         V_DTVENCIMENTO := UTIL_CRIAVENCIMENTO.DIAMES(P_CDFORMPGTO, P_DTBASE);
      ELSIF P_IDTPPERIODO = 'S' THEN
         V_DTVENCIMENTO := UTIL_CRIAVENCIMENTO.DIASEMANA(P_CDFORMPGTO, P_DTBASE);
      ELSE
         V_DTVENCIMENTO := UTIL_CRIAVENCIMENTO.DIASEMANAMES(P_CDFORMPGTO, P_DTBASE);
      END IF;
      RETURN V_DTVENCIMENTO;
   END;

BEGIN

   FOR C_ITENS IN (SELECT ITEM.NRITEMOCONTRATO,
                          ITEM.QTITEMCONTRATO,
                          ITEM.CDTPMEDIDASERV,
                          ITEM.QTMEDIDACONTR,
                          ITEM.VRUNITITEMCONT,
                          ITEM.VRTOTITEMCONT,
                          DECODE(PFATIT.NRPARCFATURA, NULL, DECODE(PFAT.NRPARCFATURA, NULL, CONT.NRPARCNEGOCIO, PFAT.NRPARCFATURA), PFATIT.NRPARCFATURA) AS NRPARCNEGOCIO,
                          NVL(PFATIT.NRGRUPOFATURA, PFAT.NRGRUPOFATURA) AS NRGRUPOFATURA,
                          NVL(ITEM.IDFATURACONTR, CONT.IDFATURACONTR) AS IDFATURACONTR,
                          NVL(ITEM.CDMODPGTO, CONT.CDMODPGTO) AS CDMODPGTO,
                          NVL(DTINIVIGENCONT, DTINICIOCONTRATO) AS DTINICIOCONTRATO,
                          NVL(DTFINVIGENCONT, DTFIMCONTRATO) AS DTFIMCONTRATO,
                          ITEM.NRORG,
                          DECODE(ITEM.IDUNIDTEMPOSERV, 'MES', ITEM.QTTEMPOSERV * 30, ITEM.QTTEMPOSERV) AS QTDIAS,
                          NVL(CONT.CDFILIALFATURA,CONT.CDFILIALORCA) AS CDFILIAL,
                          CONT.IDQTDIASCOMPCON,
                          CONT.NRQTDIASCOMPCON,
                          CONT.IDTPCOMPETCONT,
                          CONT.NRDIACOMPETCONT,
                          CONT.IDTPDTEMISSNF,
                          CONT.NRDIADTEMISSNF,
                          CONT.IDTPDTVENC,
                          CONT.NRDIAVENPARCFAT,
                          CONT.IDTPFATUINCOMP,
                          NVL(ITEM.DTINICFATCONTR, CONT.DTINICFATCONTR) AS DTINICFATCONTR,
                          ITEM.NRSEQCONTRATO,
                          NVL(ITEM.QTPARCELASFATU, CONT.QTPARCELASFATU) AS QTPARCELASFATU,
                          NVL(ITEM.NRDIAVENCPARCELASFATU, CONT.NRDIAVENCPARCELASFATU) AS NRDIAVENCPARCELASFATU
                     FROM FCT_ITEMCONTRATO ITEM
                    INNER JOIN FCT_CONTRATO CONT
                       ON ITEM.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                      AND ITEM.NRORG         = CONT.NRORG
                    INNER JOIN FCT_PARAMFATCONT PFAT
                       ON CONT.NRSEQCONTRATO = PFAT.NRSEQCONTRATO
                      AND CONT.NRORG         = PFAT.NRORG
                     LEFT JOIN FCT_PARAMFATITCONT PFATIT
                       ON ITEM.NRITEMOCONTRATO = PFATIT.NRITEMOCONTRATO
                      AND ITEM.NRORG           = PFATIT.NRORG
                    WHERE PFATIT.NRSEQFATUITCONT = P_NRITEM
                      AND ITEM.NRORG             = P_NRORG
                      AND ITEM.IDADICCOBRCONT    = 'N') LOOP
     
      IF C_ITENS.DTINICFATCONTR IS NULL THEN
        V_DTINIFATCOMPT := C_ITENS.DTINICIOCONTRATO;
      ELSE
        V_DTINIFATCOMPT := C_ITENS.DTINICFATCONTR;
      END IF;

      IF (C_ITENS.IDFATURACONTR = 'A' AND C_ITENS.IDTPDTVENC <> '5') THEN
      
          V_DTFINALPREV := C_ITENS.DTFIMCONTRATO;
          IF C_ITENS.IDQTDIASCOMPCON = 1 THEN /* Mês */

               V_ULTIMOREG := 'N';
               V_CANCINC := 'N';
               V_VRVENCPARC2 := 0;

               FOR C_DATA IN (SELECT DISTINCT DTMES AS DTINICOMPET, LAST_DAY(DTMES) AS DTFINCOMPET
                                FROM DATA
                              WHERE DTDATA BETWEEN TO_CHAR(V_DTINIFATCOMPT, 'DD/MM/YYYY') 
                                 AND TO_CHAR(V_DTFINALPREV, 'DD/MM/YYYY') 
                              ORDER BY DTINICOMPET) LOOP 

                  IF (C_ITENS.IDTPCOMPETCONT = 1) THEN
                        IF TO_CHAR(V_DTINIFATCOMPT,'MM/YYYY') = TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY') THEN
                           V_DTINICOMP := TO_DATE(TO_CHAR(V_DTINIFATCOMPT,'DD')||TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY'));
                           V_DTFINCOMP := V_DTINICOMP+30;
                        ELSE
                           V_DTINICOMP := V_DTFINCOMP+1;
                           V_DTFINCOMP := V_DTINICOMP+30;
                        END IF;
                        IF V_DTFINALPREV <= V_DTFINCOMP THEN
                           V_DTFINCOMP := V_DTFINALPREV;
                           V_ULTIMOREG := 'S';
                        END IF;
                  END IF;
                  IF (C_ITENS.IDTPCOMPETCONT = 2) THEN

                         IF TO_CHAR(V_DTINIFATCOMPT,'MM/YYYY') = TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY') THEN
                            V_DTINICOMP := TO_DATE(TO_CHAR(V_DTINIFATCOMPT,'DD')||TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY'));
                         ELSE
                            V_DTINICOMP := C_DATA.DTINICOMPET;
                         END IF;

                         IF TO_CHAR(V_DTFINALPREV,'MM/YYYY') = TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY') THEN
                            V_DTFINCOMP := TO_DATE(TO_CHAR(V_DTFINALPREV,'DD')||TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY'));
                            V_ULTIMOREG := 'S';
                         ELSE
                            V_DTFINCOMP := C_DATA.DTFINCOMPET;
                         END IF;
                  END IF;

                  IF (C_ITENS.IDTPCOMPETCONT = 3) THEN
                        IF TO_CHAR(V_DTINIFATCOMPT,'MM/YYYY') = TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY') THEN
                           V_DTINICOMP := TO_DATE(TO_CHAR(V_DTINIFATCOMPT,'DD')||TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY'));
                           IF TO_CHAR(V_DTINIFATCOMPT,'DD') < C_ITENS.NRDIACOMPETCONT THEN
                              V_DTFINCOMP := TO_DATE(C_ITENS.NRDIACOMPETCONT||TO_CHAR(C_DATA.DTINICOMPET,'MM/YYYY'));
                           ELSE
                              V_DTFINCOMP := TO_DATE(C_ITENS.NRDIACOMPETCONT||TO_CHAR(ADD_MONTHS(C_DATA.DTINICOMPET,1),'MM/YYYY'));
                           END IF;
                        ELSE
                           V_DTINICOMP :=  V_DTFINCOMP+1;
                           V_DTFINCOMP := ADD_MONTHS(V_DTFINCOMP,1);
                        END IF;
                        IF TO_CHAR(V_DTFINALPREV,'MM/YYYY') = TO_CHAR(V_DTFINCOMP,'MM/YYYY') THEN
                           V_DTFINCOMP := TO_DATE(TO_CHAR(V_DTFINALPREV,'DD')||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                           V_ULTIMOREG := 'S';
                        END IF;

                  END IF;


                  V_PERIODO := TO_CHAR(LAST_DAY(V_DTINICOMP),'DD') - 1;
                  
                  IF(TO_CHAR(V_DTFINCOMP, 'DD/MM/YYYY') = TO_CHAR(V_DTINICOMP, 'DD/MM/YYYY')) THEN
                     V_QTDIASPERIODO := 1;
                  ELSE 
                     V_QTDIASPERIODO := V_DTFINCOMP - V_DTINICOMP;
                  END IF;
                  
                  /* ROTINA PARA CALCULAR OS VALORES DE VENCIMENTO PARA PERÍODOS INCOMPLETOS */
                  IF V_QTDIASPERIODO < V_PERIODO THEN
                     /* 1 - Faz o cálculo da fatura proporcional aos dias calculados */
                     IF C_ITENS.IDTPFATUINCOMP = '1' THEN
                        V_VRVENCPARC := ((C_ITENS.VRTOTITEMCONT/30) * V_QTDIASPERIODO);
                     /* 2 - Faz o cálculo do valor do serviço integral mesmo quando existirem períodos incompletos */
                     ELSIF C_ITENS.IDTPFATUINCOMP = '2' THEN
                        V_VRVENCPARC := C_ITENS.VRTOTITEMCONT;
                     /* 3 - Faz o cálculo dos valores proporcionais em uma fatura com valores completos */
                     ELSE
                        V_VRVENCPARC2 := ((C_ITENS.VRTOTITEMCONT/30) * V_QTDIASPERIODO);
                     END IF;
                  ELSE
                     V_VRVENCPARC  := C_ITENS.VRTOTITEMCONT+V_VRVENCPARC2;

                     V_VRVENCPARC2 := 0;
                  END IF;

                  /*====== CALCULA EMISSÃO =======*/
                  IF (C_ITENS.IDTPDTEMISSNF IS NOT NULL) THEN
                     
                     /*1 - Prox. Dia X da Dt.Final Competencia */
                     IF (C_ITENS.IDTPDTEMISSNF = 1) THEN
                        IF TO_CHAR(V_DTFINCOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                           V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                        ELSE
                           V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,1),'MM/YYYY'));
                        END IF;
                     
                     /*2 - Prox. Dia X da Dt.Inicial Competencia */
                     ELSIF (C_ITENS.IDTPDTEMISSNF = 2) THEN
                        IF TO_CHAR(V_DTINICOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                           V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                        ELSE
                           V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,1),'MM/YYYY'));
                        END IF;
                     
                     /* 3 -Dia x ant. a dt.Final Compet */
                     ELSIF (C_ITENS.IDTPDTEMISSNF = 3) THEN
                        IF TO_CHAR(V_DTFINCOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                           V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                        ELSE
                           V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,-1),'MM/YYYY'));
                        END IF;
                     
                     /* 4 -Dia x ant. a dt.Inicial Compet */
                     ELSIF (C_ITENS.IDTPDTEMISSNF = 4) THEN
                        IF TO_CHAR(V_DTINICOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                           V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                        ELSE
                           V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,-1),'MM/YYYY'));
                        END IF;
                     
                     /* 5 - qt.dias prox dt.Final Compet */
                     ELSIF (C_ITENS.IDTPDTEMISSNF = 5) THEN
                        V_DTEMISS := V_DTFINCOMP + C_ITENS.NRDIADTEMISSNF;
                     
                     /* 6 - qt.dias prox dt.Inical Compet */
                     ELSIF (C_ITENS.IDTPDTEMISSNF = 6) THEN
                        V_DTEMISS := V_DTINICOMP + C_ITENS.NRDIADTEMISSNF;
                     
                     /* 7 - qt dias anterior dt.Final Compet */
                     ELSIF (C_ITENS.IDTPDTEMISSNF = 7) THEN
                        V_DTEMISS := V_DTFINCOMP - C_ITENS.NRDIADTEMISSNF;
                     
                      /* 8 - qt dias anterior dt.Inicial Compet */
                     ELSIF (C_ITENS.IDTPDTEMISSNF = 8) THEN
                        V_DTEMISS := V_DTINICOMP - C_ITENS.NRDIADTEMISSNF;
                     
                     /* 9 - Data Atual*/
                     ELSIF (C_ITENS.IDTPDTEMISSNF = 9) THEN
                        V_DTEMISS := V_DTFINCOMP;
                     END IF;
                     
                  END IF;


                  /*====== CALCULA DATA DE VENCIMENTO ======*/
                     
                  /* 1 - Qt.dias Anterior dt.emissao NF */
                  IF (C_ITENS.IDTPDTVENC = 1) THEN
                    V_DTVENCIMENTO := V_DTEMISS - C_ITENS.NRDIAVENPARCFAT;
                  
                  /* 2 - Qt.dias Prox dt.emissao NF  */
                  ELSIF (C_ITENS.IDTPDTVENC = 2) THEN
                     V_DTVENCIMENTO := V_DTEMISS + C_ITENS.NRDIAVENPARCFAT;
                  
                  /* 3 -Prox. Dia X da Dt. Emissão NF */
                  ELSIF (C_ITENS.IDTPDTVENC = 3) THEN
                     IF TO_CHAR(V_DTEMISS,'DD') < C_ITENS.NRDIAVENPARCFAT THEN
                        V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                     ELSE
                        V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,1),'MM/YYYY'));
                     END IF;
                  
                  /* 4 - Dia X Anterior da Dt. Emissão NF  */
                  ELSIF (C_ITENS.IDTPDTVENC = 4) THEN
                     IF TO_CHAR(V_DTEMISS,'DD') < C_ITENS.NRDIAVENPARCFAT THEN
                        V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,-1),'MM/YYYY'));
                     ELSE
                        V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                      END IF;
                  END IF;

                  NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
                  INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                                IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                                DTVENCIMENTO, DTEMISSAO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                                QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                      VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                               C_ITENS.IDFATURACONTR, null, (V_DTFINCOMP-V_DTINICOMP), V_DTINICOMP, V_DTFINCOMP,
                               V_DTVENCIMENTO, V_DTEMISS, V_VRVENCPARC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                               C_ITENS.QTMEDIDACONTR, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);


               END LOOP;
          ELSE  /* IDQTDIASCOMPCON = 2 > QT dias parametrizado no NRQTDIASCOMPCON */
            V_VRVENCPARC2 := 0;
            V_ULTIMOREG := 'N';
            V_CANCINC := 'N';
            V_DTINICOMP := NULL;
            V_DTFINCOMP := V_DTINIFATCOMPT;

            IF V_DTFINCOMP = V_DTFINALPREV THEN 
                V_DTINICOMP := V_DTINIFATCOMPT;
                V_PERIODO   := C_ITENS.NRQTDIASCOMPCON;

                V_QTDIASPERIODO := 1;
                V_VRVENCPARC    := C_ITENS.VRTOTITEMCONT;

                /*====== CALCULA EMISSÃO =======*/
                IF C_ITENS.IDTPDTEMISSNF IS NOT NULL THEN
                    IF C_ITENS.IDTPDTEMISSNF = 1 THEN
                      IF TO_CHAR(V_DTFINCOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                      ELSE
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,1),'MM/YYYY'));
                      END IF;
                    END IF;
                    IF C_ITENS.IDTPDTEMISSNF = 2 THEN
                      IF TO_CHAR(V_DTINICOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                      ELSE
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,1),'MM/YYYY'));
                      END IF;
                    END IF;
                    IF C_ITENS.IDTPDTEMISSNF = 3 THEN
                      IF TO_CHAR(V_DTFINCOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                      ELSE
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,-1),'MM/YYYY'));
                      END IF;
                    END IF;
                    IF C_ITENS.IDTPDTEMISSNF = 4 THEN
                      IF TO_CHAR(V_DTINICOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                      ELSE
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,-1),'MM/YYYY'));
                      END IF;
                    END IF;

                    IF C_ITENS.IDTPDTEMISSNF = 5 THEN
                       V_DTEMISS := V_DTFINCOMP + C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    IF C_ITENS.IDTPDTEMISSNF = 6 THEN
                       V_DTEMISS := V_DTINICOMP + C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    IF C_ITENS.IDTPDTEMISSNF = 7 THEN
                       V_DTEMISS := V_DTFINCOMP - C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    IF C_ITENS.IDTPDTEMISSNF = 8 THEN
                       V_DTEMISS := V_DTINICOMP - C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    IF C_ITENS.IDTPDTEMISSNF = 9 THEN
                       V_DTEMISS := V_DTFINCOMP;
                    END IF;
                 END IF;

                 /*====== CALCULA DATA DE VENCIMENTO ======*/
                 IF C_ITENS.IDTPDTVENC <> 5 THEN
                    IF C_ITENS.IDTPDTVENC = 1 THEN
                      V_DTVENCIMENTO := V_DTEMISS - C_ITENS.NRDIAVENPARCFAT;
                    END IF;
                    IF C_ITENS.IDTPDTVENC = 2 THEN
                       V_DTVENCIMENTO := V_DTEMISS + C_ITENS.NRDIAVENPARCFAT;
                    END IF;
                    IF C_ITENS.IDTPDTVENC = 3 THEN
                        IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                        ELSE
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,1),'MM/YYYY'));
                        END IF;
                    END IF;
                    IF C_ITENS.IDTPDTVENC = 4 THEN
                        IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                        ELSE
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,-1),'MM/YYYY'));
                        END IF;
                    END IF;
                 END IF;

                 NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
                 INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                              IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                              DTVENCIMENTO, DTEMISSAO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                              QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                    VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                             C_ITENS.IDFATURACONTR, null, (V_DTFINCOMP-V_DTINICOMP), V_DTINICOMP, V_DTFINCOMP,
                             V_DTVENCIMENTO, V_DTEMISS, V_VRVENCPARC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                             C_ITENS.QTMEDIDACONTR, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);
            ELSE 
              WHILE V_DTFINCOMP < V_DTFINALPREV LOOP
                 IF V_DTINICOMP IS NULL THEN
                    V_DTINICOMP := V_DTINIFATCOMPT;
                    V_DTFINCOMP := V_DTINIFATCOMPT + C_ITENS.NRQTDIASCOMPCON;
                 ELSE
                    V_DTINICOMP := V_DTFINCOMP+1;
                    V_DTFINCOMP := V_DTINICOMP + C_ITENS.NRQTDIASCOMPCON;
                 END IF;
                  IF V_DTFINCOMP > V_DTFINALPREV THEN
                    V_DTFINCOMP := V_DTFINALPREV;
                    V_ULTIMOREG := 'S';
                  END IF;

                  V_PERIODO := C_ITENS.NRQTDIASCOMPCON;

                  IF(TO_CHAR(V_DTFINCOMP, 'DD/MM/YYYY') = TO_CHAR(V_DTINICOMP, 'DD/MM/YYYY')) THEN
                    V_QTDIASPERIODO := 1;
                  ELSE 
                    V_QTDIASPERIODO := V_DTFINCOMP - V_DTINICOMP;
                  END IF;
                 
                 /* ROTINA PARA CALCULAR OS VALORES DE VENCIMENTO PARA PERÍODOS INCOMPLETOS */
                 IF V_QTDIASPERIODO < V_PERIODO THEN
                    /* 1 - Faz o cálculo da fatura proporcional aos dias calculados */
                    IF C_ITENS.IDTPFATUINCOMP = '1' THEN
                       V_VRVENCPARC := ((C_ITENS.VRTOTITEMCONT/30) * V_QTDIASPERIODO);
                    /* 2 - Faz o cálculo do valor do serviço integral mesmo quando existirem períodos incompletos */
                    ELSIF C_ITENS.IDTPFATUINCOMP = '2' THEN
                       V_VRVENCPARC := C_ITENS.VRTOTITEMCONT;
                    /* 3 - Faz o cálculo dos valores proporcionais em uma fatura com valores completos */
                    ELSE
                       V_VRVENCPARC2 := ((C_ITENS.VRTOTITEMCONT/30) * V_QTDIASPERIODO);

                    END IF;
                 ELSE
                    V_VRVENCPARC  := C_ITENS.VRTOTITEMCONT+V_VRVENCPARC2;

                    V_VRVENCPARC2 := 0;
                 END IF;

                 /*====== CALCULA EMISSÃO =======*/
                 IF C_ITENS.IDTPDTEMISSNF IS NOT NULL THEN
                    /*1 - Prox. Dia X da Dt.Final Competencia */
                    IF C_ITENS.IDTPDTEMISSNF = 1 THEN
                       IF TO_CHAR(V_DTFINCOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                       ELSE
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /*2 - Prox. Dia X da Dt.Inicial Competencia */
                    IF C_ITENS.IDTPDTEMISSNF = 2 THEN
                       IF TO_CHAR(V_DTINICOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                       ELSE
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /* 3 -Dia x ant. a dt.Final Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 3 THEN
                       IF TO_CHAR(V_DTFINCOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                       ELSE
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,-1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /* 4 -Dia x ant. a dt.Inicial Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 4 THEN
                       IF TO_CHAR(V_DTINICOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                       ELSE
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,-1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /* 5 - qt.dias prox dt.Final Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 5 THEN
                       V_DTEMISS := V_DTFINCOMP + C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    /* 6 - qt.dias prox dt.Inical Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 6 THEN
                       V_DTEMISS := V_DTINICOMP + C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    /* 7 - qt dias anterior dt.Final Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 7 THEN
                       V_DTEMISS := V_DTFINCOMP - C_ITENS.NRDIADTEMISSNF;
                    END IF;
                     /* 8 - qt dias anterior dt.Inicial Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 8 THEN
                       V_DTEMISS := V_DTINICOMP - C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    /* 9 - Data Atual*/
                    IF C_ITENS.IDTPDTEMISSNF = 9 THEN
                       V_DTEMISS := V_DTFINCOMP;
                    END IF;
                 END IF;

                 /*====== CALCULA DATA DE VENCIMENTO ======*/
                 IF C_ITENS.IDTPDTVENC <> 5 THEN
                    /* 1 - Qt.dias Anterior dt.emissao NF */
                    IF C_ITENS.IDTPDTVENC = 1 THEN
                      V_DTVENCIMENTO := V_DTEMISS - C_ITENS.NRDIAVENPARCFAT;
                    END IF;
                    /* 2 - Qt.dias Prox dt.emissao NF  */
                    IF C_ITENS.IDTPDTVENC = 2 THEN
                       V_DTVENCIMENTO := V_DTEMISS + C_ITENS.NRDIAVENPARCFAT;
                    END IF;
                    /* 3 -Prox. Dia X da Dt. Emissão NF */
                    IF C_ITENS.IDTPDTVENC = 3 THEN
                       IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                       ELSE
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /* 4 - Dia X Anterior da Dt. Emissão NF  */
                    IF C_ITENS.IDTPDTVENC = 4 THEN
                       IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                       ELSE
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,-1),'MM/YYYY'));
                       END IF;
                    END IF;
                 END IF;
                 NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
                 INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                              IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                              DTVENCIMENTO, DTEMISSAO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                              QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                    VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                             C_ITENS.IDFATURACONTR, null, (V_DTFINCOMP-V_DTINICOMP), V_DTINICOMP, V_DTFINCOMP,
                             V_DTVENCIMENTO, V_DTEMISS, V_VRVENCPARC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                             C_ITENS.QTMEDIDACONTR, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);

              END LOOP;
            END IF;
         END IF;
      ELSIF (C_ITENS.IDFATURACONTR = 'X' AND C_ITENS.IDTPDTVENC <> '5') THEN

         V_DTFINALPREV := C_ITENS.DTFIMCONTRATO;
         
          IF (C_ITENS.IDQTDIASCOMPCON = 1) THEN /* Mês */

               V_ULTIMOREG := 'N';
               V_CANCINC := 'N';
               V_VRVENCPARC2 := 0;

               V_PASSOU := TRUE;

               BEGIN
                  SELECT MAX(DTINICOMPET)
                    INTO V_DTINICOMPET_ATUAL
                    FROM FCT_VENCPREVCONT
                   WHERE NRSEQCONTRATO = C_ITENS.NRSEQCONTRATO
                     AND NRORG         = P_NRORG;
               EXCEPTION WHEN NO_DATA_FOUND THEN
                  V_DTINICOMPET_ATUAL := NULL;
               END;

               FOR C_DATA IN (SELECT DISTINCT DTMES AS DTINICOMPET, LAST_DAY(DTMES) AS DTFINCOMPET
                                FROM DATA
                              WHERE DTDATA BETWEEN TO_CHAR(V_DTINIFATCOMPT, 'DD/MM/YYYY') 
                                 AND TO_CHAR(V_DTFINALPREV, 'DD/MM/YYYY') 
                              ORDER BY DTINICOMPET) LOOP

                  IF ((V_DTINICOMPET_ATUAL IS NULL) OR (TO_CHAR(C_DATA.DTINICOMPET, 'YYYYMM') > TO_CHAR(V_DTINICOMPET_ATUAL, 'YYYYMM'))) THEN
                      V_DTINICOMPET_ATUAL := C_DATA.DTINICOMPET;
                      V_DTFINCOMPET_ATUAL := C_DATA.DTFINCOMPET;
                      V_PASSOU := FALSE;
                      EXIT;
                  END IF;
               END LOOP; -- C_DATA

               IF (V_PASSOU = FALSE) THEN
               
                   -- 1 = Dias corridos
                   IF (C_ITENS.IDTPCOMPETCONT = 1) THEN

                      -- Primeira parcela
                      IF (TO_CHAR(V_DTINIFATCOMPT, 'MM/YYYY') = TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY')) THEN
                         V_DTINICOMP := TO_DATE(TO_CHAR(V_DTINIFATCOMPT, 'DD') || TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY'));
                         V_DTFINCOMP := V_DTFINCOMPET_ATUAL;
                      ELSE
                         V_DTINICOMP := V_DTINICOMPET_ATUAL;
                         V_DTFINCOMP := V_DTFINCOMPET_ATUAL;
                      END IF;
                   
                   -- 2 = Último dia do mês
                   ELSIF (C_ITENS.IDTPCOMPETCONT = 2) THEN

                      -- Primeira parcela
                      IF (TO_CHAR(V_DTINIFATCOMPT, 'MM/YYYY') = TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY')) THEN
                        V_DTINICOMP := TO_DATE(TO_CHAR(V_DTINIFATCOMPT, 'DD') || TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY'));
                      ELSE
                         V_DTINICOMP := V_DTINICOMPET_ATUAL;
                      END IF;

                      IF TO_CHAR(V_DTFINALPREV, 'MM/YYYY') = TO_CHAR(V_DTFINCOMPET_ATUAL,'MM/YYYY') THEN
                         V_DTFINCOMP := TO_DATE(TO_CHAR(V_DTFINALPREV, 'DD') || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'));
                      ELSE
                         V_DTFINCOMP := V_DTFINCOMPET_ATUAL;
                      END IF;

                   -- 3 = Até o dia parametrizado
                   ELSIF (C_ITENS.IDTPCOMPETCONT = 3) THEN
                      
                      -- Primeira parcela               
                      IF (TO_CHAR(V_DTINIFATCOMPT, 'MM/YYYY') = TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY')) THEN

                         V_DTINICOMP := TO_DATE(TO_CHAR(V_DTINIFATCOMPT, 'DD') || TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY'));
                         
                         IF (TO_CHAR(V_DTINIFATCOMPT, 'DD') < C_ITENS.NRDIACOMPETCONT) THEN
                            V_DTFINCOMP := TO_DATE(C_ITENS.NRDIACOMPETCONT || TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY'));
                         ELSE
                            V_DTFINCOMP := TO_DATE(C_ITENS.NRDIACOMPETCONT || TO_CHAR(ADD_MONTHS(V_DTINICOMPET_ATUAL, 1), 'MM/YYYY'));
                         END IF;

                      ELSE
                         V_DTINICOMP := V_DTINICOMPET_ATUAL;
                         V_DTFINCOMP := V_DTFINCOMPET_ATUAL;
                      END IF;

                      -- Última parcela
                      IF (TO_CHAR(V_DTFINALPREV,'MM/YYYY') = TO_CHAR(V_DTFINCOMP,'MM/YYYY')) THEN
                         V_DTFINCOMP := TO_DATE(TO_CHAR(V_DTFINALPREV, 'DD') || TO_CHAR(V_DTFINCOMP, 'MM/YYYY'));
                      END IF;

                   END IF; -- Tipo de fechamento da competência (IDTPCOMPETCONT)
               
                V_PERIODO := TO_CHAR(LAST_DAY(V_DTINICOMP),'DD') - 1;

                -- ROTINA PARA CALCULAR OS VALORES DE VENCIMENTO PARA PERÍODOS INCOMPLETOS
                /*IF V_DTFINCOMP - V_DTINICOMP < V_PERIODO THEN
                   
                   -- 1 - Faz o cálculo da fatura proporcional aos dias calculados
                   IF C_ITENS.IDTPFATUINCOMP = '1' THEN
                      V_VRVENCPARC := ((C_ITENS.VRTOTITEMCONT/30) * (V_DTFINCOMP - V_DTINICOMP));
                   
                   -- 2 - Faz o cálculo do valor do serviço integral mesmo quando existirem períodos incompletos
                   ELSIF C_ITENS.IDTPFATUINCOMP = '2' THEN
                      V_VRVENCPARC := C_ITENS.VRTOTITEMCONT;
                   
                   -- 3 - Faz o cálculo dos valores proporcionais em uma fatura com valores completos
                   ELSE
                      V_VRVENCPARC2 := ((C_ITENS.VRTOTITEMCONT/30) * (V_DTFINCOMP - V_DTINICOMP));
                   END IF;
                ELSE
                   V_VRVENCPARC  := C_ITENS.VRTOTITEMCONT+V_VRVENCPARC2;

                   V_VRVENCPARC2 := 0;
                END IF;*/

                V_VRVENCPARC := 0;

                /*====== CALCULA EMISSÃO =======*/
                IF C_ITENS.IDTPDTEMISSNF IS NOT NULL THEN
                   -- 1 - Prox. Dia X da Dt.Final Competencia 
                   IF (C_ITENS.IDTPDTEMISSNF = 1) THEN
                      IF TO_CHAR(V_DTFINCOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                         V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                      ELSE
                         V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,1),'MM/YYYY'));
                      END IF;
                   
                   -- 2 - Prox. Dia X da Dt.Inicial Competencia 
                   ELSIF (C_ITENS.IDTPDTEMISSNF = 2) THEN
                      IF TO_CHAR(V_DTINICOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                         V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                      ELSE
                         V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,1),'MM/YYYY'));
                      END IF;
                   
                   -- 3 -Dia x ant. a dt.Final Compet 
                   ELSIF (C_ITENS.IDTPDTEMISSNF = 3) THEN
                      IF TO_CHAR(V_DTFINCOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                         V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                      ELSE
                         V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,-1),'MM/YYYY'));
                      END IF;
                   
                   -- 4 -Dia x ant. a dt.Inicial Compet 
                   ELSIF (C_ITENS.IDTPDTEMISSNF = 4) THEN
                      IF TO_CHAR(V_DTINICOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                         V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                      ELSE
                         V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,-1),'MM/YYYY'));
                      END IF;
                   
                   -- 5 - qt.dias prox dt.Final Compet 
                   ELSIF (C_ITENS.IDTPDTEMISSNF = 5) THEN
                      V_DTEMISS := V_DTFINCOMP + C_ITENS.NRDIADTEMISSNF;
                   
                   -- 6 - qt.dias prox dt.Inical Compet 
                   ELSIF (C_ITENS.IDTPDTEMISSNF = 6) THEN
                      V_DTEMISS := V_DTINICOMP + C_ITENS.NRDIADTEMISSNF;
                   
                   -- 7 - qt dias anterior dt.Final Compet 
                   ELSIF (C_ITENS.IDTPDTEMISSNF = 7) THEN
                      V_DTEMISS := V_DTFINCOMP - C_ITENS.NRDIADTEMISSNF;
                   
                    -- 8 - qt dias anterior dt.Inicial Compet 
                   ELSIF (C_ITENS.IDTPDTEMISSNF = 8) THEN
                      V_DTEMISS := V_DTINICOMP - C_ITENS.NRDIADTEMISSNF;
                   
                   -- 9 - Data Atual
                   ELSIF (C_ITENS.IDTPDTEMISSNF = 9) THEN
                      V_DTEMISS := V_DTFINCOMP;
                   END IF;
                END IF;

                /*====== CALCULA DATA DE VENCIMENTO ======*/

                /* 1 - Qt.dias Anterior dt.emissao NF */
                IF (C_ITENS.IDTPDTVENC = 1) THEN
                  V_DTVENCIMENTO := V_DTEMISS - C_ITENS.NRDIAVENPARCFAT;
                
                /* 2 - Qt.dias Prox dt.emissao NF  */
                ELSIF (C_ITENS.IDTPDTVENC = 2) THEN
                   V_DTVENCIMENTO := V_DTEMISS + C_ITENS.NRDIAVENPARCFAT;
                
                /* 3 -Prox. Dia X da Dt. Emissão NF */
                ELSIF (C_ITENS.IDTPDTVENC = 3) THEN
                   IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                      V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                   ELSE
                      V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,1),'MM/YYYY'));
                   END IF;
                
                /* 4 - Dia X Anterior da Dt. Emissão NF  */
                ELSIF (C_ITENS.IDTPDTVENC = 4) THEN
                   IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                      V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                   ELSE
                      V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,-1),'MM/YYYY'));
                    END IF;
                END IF;

                NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
                INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                              IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                              DTVENCIMENTO, DTEMISSAO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                              QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                    VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                             C_ITENS.IDFATURACONTR, null, (V_DTFINCOMP-V_DTINICOMP), V_DTINICOMP, V_DTFINCOMP,
                             V_DTVENCIMENTO, V_DTEMISS, V_VRVENCPARC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                             C_ITENS.QTMEDIDACONTR, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);

               END IF; -- V_PASSOU = FALSE

          ELSE -- IDQTDIASCOMPCON = 2 > QT dias parametrizado no NRQTDIASCOMPCON

            V_VRVENCPARC2 := 0;
            V_ULTIMOREG := 'N';
            V_CANCINC := 'N';
            V_DTINICOMP := NULL;
            V_DTFINCOMP := V_DTINIFATCOMPT;

            IF V_DTFINCOMP = V_DTFINALPREV THEN 
                V_DTINICOMP := V_DTINIFATCOMPT;
                V_PERIODO   := C_ITENS.NRQTDIASCOMPCON;

                V_QTDIASPERIODO := 1;
                V_VRVENCPARC    := C_ITENS.VRTOTITEMCONT;
               
               /*====== CALCULA EMISSÃO =======*/
               IF C_ITENS.IDTPDTEMISSNF IS NOT NULL THEN
                  /*1 - Prox. Dia X da Dt.Final Competencia */
                  IF C_ITENS.IDTPDTEMISSNF = 1 THEN
                     IF TO_CHAR(V_DTFINCOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                     ELSE
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,1),'MM/YYYY'));
                     END IF;
                  END IF;
                  /*2 - Prox. Dia X da Dt.Inicial Competencia */
                  IF C_ITENS.IDTPDTEMISSNF = 2 THEN
                     IF TO_CHAR(V_DTINICOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                     ELSE
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,1),'MM/YYYY'));
                     END IF;
                  END IF;
                  /* 3 -Dia x ant. a dt.Final Compet */
                  IF C_ITENS.IDTPDTEMISSNF = 3 THEN
                     IF TO_CHAR(V_DTFINCOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                     ELSE
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,-1),'MM/YYYY'));
                     END IF;
                  END IF;
                  /* 4 -Dia x ant. a dt.Inicial Compet */
                  IF C_ITENS.IDTPDTEMISSNF = 4 THEN
                     IF TO_CHAR(V_DTINICOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                     ELSE
                        V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,-1),'MM/YYYY'));
                     END IF;
                  END IF;
                  /* 5 - qt.dias prox dt.Final Compet */
                  IF C_ITENS.IDTPDTEMISSNF = 5 THEN
                     V_DTEMISS := V_DTFINCOMP + C_ITENS.NRDIADTEMISSNF;
                  END IF;
                  /* 6 - qt.dias prox dt.Inical Compet */
                  IF C_ITENS.IDTPDTEMISSNF = 6 THEN
                     V_DTEMISS := V_DTINICOMP + C_ITENS.NRDIADTEMISSNF;
                  END IF;
                  /* 7 - qt dias anterior dt.Final Compet */
                  IF C_ITENS.IDTPDTEMISSNF = 7 THEN
                     V_DTEMISS := V_DTFINCOMP - C_ITENS.NRDIADTEMISSNF;
                  END IF;
                   /* 8 - qt dias anterior dt.Inicial Compet */
                  IF C_ITENS.IDTPDTEMISSNF = 8 THEN
                     V_DTEMISS := V_DTINICOMP - C_ITENS.NRDIADTEMISSNF;
                  END IF;
                  /* 9 - Data Atual*/
                  IF C_ITENS.IDTPDTEMISSNF = 9 THEN
                     V_DTEMISS := V_DTFINCOMP;
                  END IF;
               END IF;

               /*====== CALCULA DATA DE VENCIMENTO ======*/
               IF C_ITENS.IDTPDTVENC <> 5 THEN
                  /* 1 - Qt.dias Anterior dt.emissao NF */
                  IF C_ITENS.IDTPDTVENC = 1 THEN
                    V_DTVENCIMENTO := V_DTEMISS - C_ITENS.NRDIAVENPARCFAT;
                  END IF;
                  /* 2 - Qt.dias Prox dt.emissao NF  */
                  IF C_ITENS.IDTPDTVENC = 2 THEN
                     V_DTVENCIMENTO := V_DTEMISS + C_ITENS.NRDIAVENPARCFAT;
                  END IF;
                  /* 3 -Prox. Dia X da Dt. Emissão NF */
                  IF C_ITENS.IDTPDTVENC = 3 THEN
                     IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                        V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                     ELSE
                        V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,1),'MM/YYYY'));
                     END IF;
                  END IF;
                  /* 4 - Dia X Anterior da Dt. Emissão NF  */
                  IF C_ITENS.IDTPDTVENC = 4 THEN
                     IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                        V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                     ELSE
                        V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,-1),'MM/YYYY'));
                     END IF;
                  END IF;
               END IF;
               
               NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
               INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                            IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                            DTVENCIMENTO, DTEMISSAO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                            QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                  VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                           C_ITENS.IDFATURACONTR, null, (V_DTFINCOMP-V_DTINICOMP), V_DTINICOMP, V_DTFINCOMP,
                           V_DTVENCIMENTO, V_DTEMISS, V_VRVENCPARC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                           C_ITENS.QTMEDIDACONTR, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);
            ELSE 
              WHILE V_DTFINCOMP < V_DTFINALPREV LOOP
                 IF V_DTINICOMP IS NULL THEN
                    V_DTINICOMP := V_DTINIFATCOMPT;
                    V_DTFINCOMP := V_DTINIFATCOMPT + C_ITENS.NRQTDIASCOMPCON;
                 ELSE
                    V_DTINICOMP := V_DTFINCOMP+1;
                    V_DTFINCOMP := V_DTINICOMP + C_ITENS.NRQTDIASCOMPCON;
                 END IF;
                 IF V_DTFINCOMP > V_DTFINALPREV THEN
                    V_DTFINCOMP := V_DTFINALPREV;
                    V_ULTIMOREG := 'S';
                 END IF;

                   V_PERIODO := C_ITENS.NRQTDIASCOMPCON;
                 
                 IF(TO_CHAR(V_DTFINCOMP, 'DD/MM/YYYY') = TO_CHAR(V_DTINICOMP, 'DD/MM/YYYY')) THEN
                    V_QTDIASPERIODO := 1;
                 ELSE 
                    V_QTDIASPERIODO := V_DTFINCOMP - V_DTINICOMP;
                 END IF;
                 
                 /* ROTINA PARA CALCULAR OS VALORES DE VENCIMENTO PARA PERÍODOS INCOMPLETOS */
                 IF V_QTDIASPERIODO < V_PERIODO THEN
                    /* 1 - Faz o cálculo da fatura proporcional aos dias calculados */
                    IF C_ITENS.IDTPFATUINCOMP = '1' THEN
                       V_VRVENCPARC := ((C_ITENS.VRTOTITEMCONT/30) * V_QTDIASPERIODO);
                    /* 2 - Faz o cálculo do valor do serviço integral mesmo quando existirem períodos incompletos */
                    ELSIF C_ITENS.IDTPFATUINCOMP = '2' THEN
                       V_VRVENCPARC := C_ITENS.VRTOTITEMCONT;
                    /* 3 - Faz o cálculo dos valores proporcionais em uma fatura com valores completos */
                    ELSE
                       V_VRVENCPARC2 := ((C_ITENS.VRTOTITEMCONT/30) * V_QTDIASPERIODO);

                    END IF;
                 ELSE
                    V_VRVENCPARC  := C_ITENS.VRTOTITEMCONT+V_VRVENCPARC2;

                    V_VRVENCPARC2 := 0;
                 END IF;

                 /*====== CALCULA EMISSÃO =======*/
                 IF C_ITENS.IDTPDTEMISSNF IS NOT NULL THEN
                    /*1 - Prox. Dia X da Dt.Final Competencia */
                    IF C_ITENS.IDTPDTEMISSNF = 1 THEN
                       IF TO_CHAR(V_DTFINCOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                       ELSE
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /*2 - Prox. Dia X da Dt.Inicial Competencia */
                    IF C_ITENS.IDTPDTEMISSNF = 2 THEN
                       IF TO_CHAR(V_DTINICOMP,'DD') <  C_ITENS.NRDIADTEMISSNF THEN
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                       ELSE
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /* 3 -Dia x ant. a dt.Final Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 3 THEN
                       IF TO_CHAR(V_DTFINCOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTFINCOMP,'MM/YYYY'));
                       ELSE
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTFINCOMP,-1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /* 4 -Dia x ant. a dt.Inicial Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 4 THEN
                       IF TO_CHAR(V_DTINICOMP,'DD') > C_ITENS.NRDIADTEMISSNF THEN
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(V_DTINICOMP,'MM/YYYY'));
                       ELSE
                          V_DTEMISS := TO_DATE(TO_CHAR(C_ITENS.NRDIADTEMISSNF)||'/'||TO_CHAR(ADD_MONTHS(V_DTINICOMP,-1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /* 5 - qt.dias prox dt.Final Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 5 THEN
                       V_DTEMISS := V_DTFINCOMP + C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    /* 6 - qt.dias prox dt.Inical Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 6 THEN
                       V_DTEMISS := V_DTINICOMP + C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    /* 7 - qt dias anterior dt.Final Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 7 THEN
                       V_DTEMISS := V_DTFINCOMP - C_ITENS.NRDIADTEMISSNF;
                    END IF;
                     /* 8 - qt dias anterior dt.Inicial Compet */
                    IF C_ITENS.IDTPDTEMISSNF = 8 THEN
                       V_DTEMISS := V_DTINICOMP - C_ITENS.NRDIADTEMISSNF;
                    END IF;
                    /* 9 - Data Atual*/
                    IF C_ITENS.IDTPDTEMISSNF = 9 THEN
                       V_DTEMISS := V_DTFINCOMP;
                    END IF;
                 END IF;

                 /*====== CALCULA DATA DE VENCIMENTO ======*/
                 IF C_ITENS.IDTPDTVENC <> 5 THEN
                    /* 1 - Qt.dias Anterior dt.emissao NF */
                    IF C_ITENS.IDTPDTVENC = 1 THEN
                      V_DTVENCIMENTO := V_DTEMISS - C_ITENS.NRDIAVENPARCFAT;
                    END IF;
                    /* 2 - Qt.dias Prox dt.emissao NF  */
                    IF C_ITENS.IDTPDTVENC = 2 THEN
                       V_DTVENCIMENTO := V_DTEMISS + C_ITENS.NRDIAVENPARCFAT;
                    END IF;
                    /* 3 -Prox. Dia X da Dt. Emissão NF */
                    IF C_ITENS.IDTPDTVENC = 3 THEN
                       IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                       ELSE
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,1),'MM/YYYY'));
                       END IF;
                    END IF;
                    /* 4 - Dia X Anterior da Dt. Emissão NF  */
                    IF C_ITENS.IDTPDTVENC = 4 THEN
                       IF TO_CHAR(V_DTEMISS,'DD') <  C_ITENS.NRDIAVENPARCFAT THEN
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(V_DTEMISS,'MM/YYYY'));
                       ELSE
                          V_DTVENCIMENTO := TO_DATE(TO_CHAR(C_ITENS.NRDIAVENPARCFAT)||'/'||TO_CHAR(ADD_MONTHS(V_DTEMISS,-1),'MM/YYYY'));
                       END IF;
                    END IF;
                 END IF;
                 NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
                 INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                              IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                              DTVENCIMENTO, DTEMISSAO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                              QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                    VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                             C_ITENS.IDFATURACONTR, null, (V_DTFINCOMP-V_DTINICOMP), V_DTINICOMP, V_DTFINCOMP,
                             V_DTVENCIMENTO, V_DTEMISS, V_VRVENCPARC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                             C_ITENS.QTMEDIDACONTR, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);

            END LOOP;

          END IF;               
      END IF;   
      ELSIF (C_ITENS.IDFATURACONTR = 'P' AND C_ITENS.IDTPDTVENC <> '5') THEN
      
          V_DIAVENCPARC := C_ITENS.NRDIAVENCPARCELASFATU;
          V_ULTIMODIAMES := EXTRACT(DAY FROM (LAST_DAY(V_DTINIFATCOMPT)));
          
          IF (V_DIAVENCPARC > V_ULTIMODIAMES) THEN
              V_DIAVENCPARC := V_ULTIMODIAMES;
          END IF;

          V_DTVENCIMENTO := TRUNC(TO_DATE(V_DIAVENCPARC || TO_CHAR(V_DTINIFATCOMPT, '/MM/YYYY'), 'DD/MM/YYYY'));
          IF (TRUNC(V_DTINIFATCOMPT) - V_DTVENCIMENTO > 0) THEN
              V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
          END IF;

          V_NRPARCELAS := C_ITENS.QTPARCELASFATU;
          V_VRPARCVENC := TRUNC(C_ITENS.VRTOTITEMCONT / V_NRPARCELAS, 2);
          V_SEQUENCIAL := 1;

          WHILE (V_SEQUENCIAL <= V_NRPARCELAS) LOOP

              IF (V_SEQUENCIAL = V_NRPARCELAS) THEN
                  
                  IF ((V_VRPARCVENC * V_SEQUENCIAL) < C_ITENS.VRTOTITEMCONT) THEN
                      V_VRPARCVENC := C_ITENS.VRTOTITEMCONT - (V_VRPARCVENC * (V_SEQUENCIAL - 1));
                  END IF;

              END IF;

              NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);

              INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                  IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                  DTVENCIMENTO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                  QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
              VALUES (V_NRSEQTRABVENCPREV, P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                  C_ITENS.IDFATURACONTR, C_ITENS.CDMODPGTO, NVL(TRUNC(C_ITENS.DTFIMCONTRATO-V_DTINIFATCOMPT),0), V_DTINIFATCOMPT, C_ITENS.DTFIMCONTRATO,
                  V_DTVENCIMENTO, V_VRPARCVENC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                  (C_ITENS.QTMEDIDACONTR/V_NRPARCELAS), C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);

              V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);

              V_DIAVENCPARC := C_ITENS.NRDIAVENCPARCELASFATU;
              V_ULTIMODIAMES := EXTRACT(DAY FROM (LAST_DAY(V_DTVENCIMENTO)));
              
              IF (V_DIAVENCPARC > V_ULTIMODIAMES) THEN
                  V_DIAVENCPARC := V_ULTIMODIAMES;
              END IF;

              V_DTVENCIMENTO := TRUNC(TO_DATE(V_DIAVENCPARC || TO_CHAR(V_DTVENCIMENTO, '/MM/YYYY'), 'DD/MM/YYYY'));

              V_SEQUENCIAL := V_SEQUENCIAL + 1;
          END LOOP;

      ELSE

         /* Pegar o Cliente para o caso de ser um Item de Apuração de Faturamento com o tipo de vencimento "Forma de pagamento do cliente" */
         BEGIN
           SELECT CDCLIENTE
             INTO V_CDCLIENTE
             FROM PARCNEGOCIO PCN, CLIENTE CLI
            WHERE PCN.NRPARCNEGOCIO = C_ITENS.NRPARCNEGOCIO
              AND CLI.NRPARCNEGOCIO = PCN.NRPARCNEGOCIO;
         EXCEPTION
           WHEN NO_DATA_FOUND THEN BEGIN
              V_CDCLIENTE := NULL;
           END;
         END;
         
         
         V_INDIAS := 0;
         FCT_CALC_MODPAG (P_NRORG,
                         V_DTINIFATCOMPT,
                         C_ITENS.CDFILIAL,
                         C_ITENS.CDMODPGTO,
                         V_CDCLIENTE,
                         C_ITENS.IDFATURACONTR,
                         V_INGUARDANRDIAS,
                         V_DTBASE,
                         V_IDFORMAPGTO,
                         V_IDTIPODTPGT,
                         V_IDTPPERIODO,
                         V_NRPARCELAS,
                         V_NRPARCPGTO,
                         V_CDFORMPGTO,
                         V_IDVALORPARCELAS,
                         V_BOCONSFERIBANC);
         V_DTVENCIMENTO := V_DTBASE;
         V_VRPAGTO := ROUND(C_ITENS.VRTOTITEMCONT, 2);
        
         IF V_IDFORMAPGTO IS NULL THEN
            V_NRPARCELAS := 1;
             NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
             INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                          IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                          DTVENCIMENTO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                          QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                         C_ITENS.IDFATURACONTR, C_ITENS.CDMODPGTO, NVL(TRUNC(V_DTVENCIMENTO-V_DTINIFATCOMPT),0), V_DTINIFATCOMPT, C_ITENS.DTFIMCONTRATO,
                         V_DTVENCIMENTO, V_VRVENCPARC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                         C_ITENS.QTMEDIDACONTR, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);


         ELSIF (V_IDFORMAPGTO = 'F') THEN
            V_DTVENCIMENTO := V_DTBASE + V_INGUARDANRDIAS;
            V_DTVENCIMENTOANT := V_DTBASE;
            V_VRPARCVENC := ROUND(V_VRPAGTO / V_NRPARCPGTO, 2);
            V_SEQUENCIAL := 1;
            V_NRPARCELAS := V_NRPARCPGTO;   
           
            WHILE V_SEQUENCIAL <= V_NRPARCELAS LOOP
               IF V_SEQUENCIAL = V_NRPARCELAS THEN
                  V_VRPARCVENC := V_VRPARCVENC + ROUND(V_VRPAGTO - (V_VRPARCVENC * V_NRPARCPGTO), 2);
               END IF;
               /*INSERÇÃO DOS NA TABELA DE INTENS DO VENCIMENTO*/

               NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
               INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                            IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                            DTVENCIMENTO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                            QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                  VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                           C_ITENS.IDFATURACONTR, C_ITENS.CDMODPGTO, NVL(TRUNC(C_ITENS.DTFIMCONTRATO-V_DTINIFATCOMPT),0), V_DTINIFATCOMPT, C_ITENS.DTFIMCONTRATO,
                           V_DTVENCIMENTO, V_VRPARCVENC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                           (C_ITENS.QTMEDIDACONTR/V_NRPARCELAS), C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);


               V_DTVENCIMENTOANT := V_DTVENCIMENTO;
               IF NOT (V_DTVENCIMENTO IS NULL) THEN
                  V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
               END IF;
               V_SEQUENCIAL := V_SEQUENCIAL + 1;
            END LOOP;
           
         ELSE
            V_SEQUENCIAL := 1;
            V_VRPARCAUXI := 0;
            FOR C_PARC IN (SELECT NRDIASPGTO, VRPERCPGTO
                             FROM (SELECT NVL(NRDIASMODPGTO, 0) AS NRDIASPGTO, NVL(VRPERCMODPGTO, 100) VRPERCPGTO
                                     FROM PRAZOMODPGTO
                                    WHERE CDMODPGTO = C_ITENS.CDMODPGTO
                                      AND C_ITENS.IDFATURACONTR = 'O'
                                   UNION ALL 
                                   SELECT NVL(NRDIASPGTOCL, 0) AS NRDIASPGTO, NVL(VRPERCPGTOCL, 100) VRPERCPGTO
                                     FROM PRAZOPGTCLIE
                                    WHERE CDCLIENTE = V_CDCLIENTE
                                      AND C_ITENS.IDFATURACONTR = 'A')) LOOP

                  V_VRPARCVENC := ROUND((V_VRPAGTO * (C_PARC.VRPERCPGTO / 100)), 2);
                  V_VRPARCAUXI := V_VRPARCAUXI + V_VRPARCVENC;
                  IF V_SEQUENCIAL = V_NRPARCELAS THEN
                     V_VRPARCVENC := V_VRPARCVENC + ROUND((V_VRPAGTO - V_VRPARCAUXI), 2);
                  END IF;
                  IF C_PARC.NRDIASPGTO = 0 THEN
                     V_INDIAS := V_INGUARDANRDIAS + 1;
                  ELSE
                     V_INDIAS := V_INGUARDANRDIAS + C_PARC.NRDIASPGTO;
                  END IF;
                  IF NOT V_DTBASE IS NULL THEN
                     V_DTVENCIMENTO := V_DTBASE + V_INDIAS;
                  END IF;
                  IF (V_BOCONSFERIBANC = 'TRUE') THEN
                     FCT_CONSISTE_FERI_BANC(C_ITENS.CDFILIAL,
                                        V_DTVENCIMENTO,
                                        V_DTVENCIMENTO,
                                        V_IDTIPODTPGT,
                                        V_DTINIFATCOMPT);
                  END IF;
                  IF NOT (V_DTVENCIMENTO IS NULL) THEN
                     V_DTVENCIMENTO := DIAPGTO(V_DTVENCIMENTO,
                                               V_IDTPPERIODO,
                                               V_CDFORMPGTO);
                  END IF;
                  NOVO_CODIGO_NT('NRSEQTRABVENCPREV', V_NRSEQTRABVENCPREV, 1, P_NRORG);
                  INSERT INTO TRAB_ITVENCPREV (NRSEQTRABVENCPREV,NRSEQOPERATRAB, NRITEMOCONTRATO,
                                IDFATURACONTR, CDMODPGTO, QTDIASVENCIMENTO, DTINICOMPET, DTFINCOMPET,
                                DTVENCIMENTO, VRVENCIMENTO, QTITEMCONTRATO, CDTPMEDIDASERV,
                                QTMEDIDACONTR, VRUNITITEMCONT, VRTOTITEMCONT, NRGRUPOFATURA, NRORG, NRPARCNEGOCIO)
                      VALUES   (V_NRSEQTRABVENCPREV,P_NRSEQOPERATRAB, C_ITENS.NRITEMOCONTRATO,
                               C_ITENS.IDFATURACONTR, C_ITENS.CDMODPGTO, NVL(TRUNC(C_ITENS.DTFIMCONTRATO-V_DTINIFATCOMPT),0), V_DTINIFATCOMPT, C_ITENS.DTFIMCONTRATO,
                               V_DTVENCIMENTO, V_VRPARCVENC, C_ITENS.QTITEMCONTRATO, C_ITENS.CDTPMEDIDASERV,
                               C_ITENS.QTMEDIDACONTR, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT, C_ITENS.NRGRUPOFATURA, P_NRORG, C_ITENS.NRPARCNEGOCIO);

            END LOOP;
         END IF;
      END IF;
   END LOOP;
END;