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 TO_CHAR(V_DTFINCOMP, 'DD/MM/YYYY') = TO_CHAR(V_DTFINALPREV, 'DD/MM/YYYY') 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 TO_CHAR(V_DTFINCOMP, 'DD/MM/YYYY') = TO_CHAR(V_DTFINALPREV, 'DD/MM/YYYY') 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') 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;
/
CREATE OR REPLACE PROCEDURE GERA_CONTRATO (
  P_NRORG              IN NUMBER,
  P_NRSEQORCAMENTO     IN NUMBER,
  P_NRSEQCONTRATO      OUT NUMBER)
AS
  V_NRSEQMODCONTRATO NUMBER;
  V_NRSEQCONTRATO    VARCHAR2(30);
  V_NRSEQFATUCONTR   VARCHAR2(30);
  V_NRSEQFATUITCONT  VARCHAR2(30);
  V_NRITSEQCONTRATO  VARCHAR2(30);
  V_NRCONTRATOFCT    VARCHAR2(50);
  V_DTINICIOCONT     DATE;
  V_DTFINCONT        DATE;
  V_DTPADREAJCONT    DATE;
  V_NRITEMOCONTRATO  VARCHAR2(10);
  V_NRSEQREFEORCCONT VARCHAR2(20);
  V_PRAZO            NUMBER;
  V_NRSEQREAJUSTE    NUMBER;
  V_NRSEQINDCONTR    NUMBER;
  V_NRSEQCONTDOC     NUMBER;
  V_SOMAVALOR        VARCHAR2(3);
  V_NRRELACESTRUTCONT NUMBER;
  /* = PARAMETROS DE FORMACAO DE PREO DOS ITENS = */
  V_NRRELACFORMACAOCONT FCT_RELACFORMACAOCONT.NRRELACFORMACAOCONT%TYPE;
  V_NRFORMPRECOSERVICO  FCT_RELACFORMACAOPROP.NRFORMPRECOSERVICO%TYPE;
  /* == PARAMETROS DE FATURAMENTO (ESCOPO) == */
  V_CDPRODFATURA          FCT_PARAMFATESCOPO.CDPRODFATURA%TYPE;
  V_CDFILIALFATURA        VARCHAR2(4);
  V_NRGRUPOFATURA         NUMBER;
  V_NRPARCFATURA          NUMBER;
  V_IDFATURACONTR         CHAR(1);
  V_CDMODPGTO             VARCHAR2(5);
  V_IDQTDIASCOMPCON       VARCHAR2(1);
  V_NRQTDIASCOMPCON       NUMBER;
  V_IDTPCOMPETCONT        VARCHAR2(1);
  V_NRDIACOMPETCONT       NUMBER;
  V_IDTPFATUINCOMP        VARCHAR2(1);
  V_IDTPDTEMISSNF         VARCHAR2(1);
  V_NRDIADTEMISSNF        NUMBER;
  V_IDTPDTVENC            VARCHAR2(1);
  V_NRDIATPDTVENC         NUMBER;
  V_IDSOMAFATUCONT        VARCHAR2(1);
  V_IDSOMAITGRUPFAT       VARCHAR2(1);
  V_IDGERANFPARC          VARCHAR2(1);
  V_IDBLOQVRMEDIC         VARCHAR2(1);
  V_IDGERARATEIO          VARCHAR2(1);
  V_QTPARCELASFATU        NUMBER;
  V_NRDIAVENCPARCELASFATU NUMBER;
  V_IDAPURAAPONTAMENTO    CHAR(1);
  /* == PARAMETROS DE FATURAMENTO (SERVICO ESCOPO) == */
  V_CDPRODFATURA_IT          VARCHAR2(10);
  V_CDFILIALFATURA_IT        VARCHAR2(4);
  V_NRGRUPOFATURA_IT         NUMBER;
  V_NRPARCFATURA_IT          NUMBER;
  V_IDFATURACONTR_IT         CHAR(1);
  V_CDMODPGTO_IT             VARCHAR2(5);
  V_IDBLOQVRITMEDIC_IT       VARCHAR2(1);
  V_QTPARCELASFATU_IT        NUMBER;
  V_NRDIAVENCPARCELASFATU_IT NUMBER;
  /* == PARAMETROS DE FATURAMENTO (NOVO) == */
  V_NRPARAMFATCON             VARCHAR2(30);
  V_NRCAPAPARAMFATCON         VARCHAR2(30);
  V_NRGRUPOFATURA_FNOVO       NUMBER;
  V_CDPRODFATURA_FNOVO        VARCHAR2(10);
  V_CDFILIALFATURA_FNOVO      VARCHAR2(4);
  V_NRPARCFATURA_FNOVO        NUMBER;
  V_IDTPFATURA_FNOVO          CHAR(1);
  V_QTPARCELASFATU_FNOVO      NUMBER;
  V_IDTPCALCPARCINC_FNOVO     CHAR(1);
  V_IDGERARATEIO_FNOVO        CHAR(1);
  V_IDAPURAAPONTAMENTO_FNOVO  CHAR(1);
  V_NRPARAMFATITCON          VARCHAR2(30);
  V_NRGRUPOFATURA_ITFATNOVO  NUMBER;
  V_CDPRODFATURA_ITFATNOVO   VARCHAR2(10);
  V_CDFILIALFATURA_ITFATNOVO VARCHAR2(4);
  V_NRPARCFATURA_ITFATNOVO   NUMBER;
  V_IDTPFATURA_ITFATNOVO     CHAR(1);
  V_QTPARCELASFATU_ITFATNOVO NUMBER;
  V_ITPROPOSTA  NUMBER;
  V_ITESCOPO  NUMBER;
  V_NRITESCOPOPROPOSTA_FAT NUMBER;
  V_VAL_PARC_ESC NUMBER;
  /* == PARAMETROS DE NEGOCIACAO DE VALORES == */
  V_NRNEGOCIACAOCONTRATO         VARCHAR2(20);
  V_NRITEMOCONTRATO_NEGO         NUMBER;
  V_NRITNEGOCIACAOCONTRATO       VARCHAR2(20);
  V_NRPARCELANEGOCONT            VARCHAR2(20);
  V_NRDESCPERIODONEGOCONT        VARCHAR2(20);
  V_NRCOMPETENCIANEGOCONT        VARCHAR2(20);
BEGIN
  V_NRCONTRATOFCT := 1;
  FOR C_ORCAMENTO IN (
       SELECT NVL(O.NRTIPOORCAMENTO, ESC.NRTIPOORCAMENTO) AS NRTIPOORCAMENTO,
             O.NRSEQORCAMENTO,
             NVL(O.CDFILIAL, ESC.CDFILIAL) AS CDFILIAL,
             O.NRORCAMENTO,
             O.NRVERSAOORCAMENTO,
             ORCAMOD.NRSEQMODCONTRA AS NRSEQMODCONTRATO,
             O.NRPARCNEGOCIO,
             O.QTDIASCONTRATO,
             O.DTREFORCAMENTO,
             ORCAMOD.IDUTILIZAHIERSERV,
             O.CDOPERRESPONSAVEL,
             O.DSREFERENCIAORCA
        FROM FCT_ORCAMENTO O
        INNER JOIN FCT_RELACESCOPOPROPOSTA ESC
          ON O.NRSEQORCAMENTO = ESC.NRSEQORCAMENTO
         AND O.NRORG          = ESC.NRORG
        LEFT JOIN FCT_TIPOORCAMENTO TP
          ON NVL(O.NRTIPOORCAMENTO, ESC.NRTIPOORCAMENTO) = TP.NRTIPOORCAMENTO
         AND O.NRORG                                     = TP.NRORG
        LEFT JOIN FCT_ORCAMENTOMODELO ORCAMOD
          ON O.NRORCAMENTOMODELO = ORCAMOD.NRORCAMENTOMODELO
         AND O.NRORG             = ORCAMOD.NRORG
       WHERE O.NRORG             = P_NRORG
         AND O.NRSEQORCAMENTO    = P_NRSEQORCAMENTO) LOOP
      V_NRSEQMODCONTRATO := C_ORCAMENTO.NRSEQMODCONTRATO;
      IF V_NRSEQMODCONTRATO IS NULL THEN
          BEGIN
            SELECT NRSEQMODCONTRATO
              INTO V_NRSEQMODCONTRATO
              FROM FCT_PARAMETROGERAL;
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
              V_NRSEQMODCONTRATO := NULL;
          END;
      END IF;
        FOR C_MODELOCONTRATO IN (
          SELECT MC.NRDIAVENPARCFAT, DECODE(MC.NRDIASVIGCONT, NULL, 0, MC.NRDIASVIGCONT) AS NRDIASVIGCONT,
                 MC.DTPADREAJCONT, MC.NRDIASPRORGCONT, MC.QTPOSTOTRABCONT, MC.VRPERCMULTQBCONT,
                 MC.CDTPINDFINCON, MC.IDPERVALFINCON, MC.CDINDFINCONT, MC.IDQTDIASCOMPCON,
                 MC.IDTPCOMPETCONT, MC.IDTPFATUINCOMP,MC.IDTPDTEMISSNF,MC.IDTPDTVENC,
                 MC.NRQTDIASCOMPCON, MC.NRDIACOMPETCONT, MC.NRDIADTEMISSNF, MC.IDSOMAFATUCONT,
                 MC.IDFATURACONTR, MC.CDMODPGTO, MC.QTPARCELASFATU, MC.NRDIAVENCPARCELASFATU, MC.DTINICFATCONTR,
                 NVL(MC.IDSITUACAOCONTRATO, 'P') AS IDSITUACAOCONTRATO, PARAM.NRGRUPOFATURA,
                 PARAM.IDSOMAFATUCONT AS IDSOMAFATUCONTFATU, PARAM.IDSOMAITGRUPFAT, PARAM.IDGERANFPARC,
                 PARAM.IDBLOQVRMEDIC, PARAM.IDGERARATEIO, PARAM.IDAPURAAPONTAMENTO
            FROM FCT_MODELOCONTRATO MC
            LEFT JOIN FCT_PARAMFATMODCONT PARAM
              ON MC.NRSEQMODCONTRA = PARAM.NRSEQMODCONTRA
             AND MC.NRORG = PARAM.NRORG
           WHERE MC.NRSEQMODCONTRA = V_NRSEQMODCONTRATO
             AND MC.NRORG          = P_NRORG
             AND ROWNUM            = 1
             AND MC.IDATIVO        = 'S') LOOP
          IF C_ORCAMENTO.NRTIPOORCAMENTO IS NOT NULL THEN
            BEGIN
              SELECT CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA, NRPARCFATURA, IDFATURACONTR, CDMODPGTO,
                     IDQTDIASCOMPCON, NRQTDIASCOMPCON, IDTPCOMPETCONT,NRDIACOMPETCONT, IDTPFATUINCOMP,
                     IDTPDTEMISSNF, NRDIADTEMISSNF, IDTPDTVENC, NRDIATPDTVENC,IDSOMAFATUCONT, IDSOMAITGRUPFAT,
                     IDGERANFPARC, IDBLOQVRMEDIC, IDGERARATEIO, QTPARCELASFATU, NRDIAVENCPARCELASFATU, IDAPURAAPONTAMENTO
                 INTO
                     V_CDPRODFATURA, V_CDFILIALFATURA, V_NRGRUPOFATURA, V_NRPARCFATURA, V_IDFATURACONTR, V_CDMODPGTO,
                     V_IDQTDIASCOMPCON, V_NRQTDIASCOMPCON, V_IDTPCOMPETCONT, V_NRDIACOMPETCONT, V_IDTPFATUINCOMP,
                     V_IDTPDTEMISSNF, V_NRDIADTEMISSNF, V_IDTPDTVENC, V_NRDIATPDTVENC, V_IDSOMAFATUCONT, V_IDSOMAITGRUPFAT,
                     V_IDGERANFPARC, V_IDBLOQVRMEDIC, V_IDGERARATEIO, V_QTPARCELASFATU, V_NRDIAVENCPARCELASFATU, V_IDAPURAAPONTAMENTO
                FROM FCT_PARAMFATESCOPO
               WHERE NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                 AND NRORG = P_NRORG;
            EXCEPTION
              WHEN NO_DATA_FOUND THEN BEGIN
                V_CDPRODFATURA          :=  NULL;
                V_CDFILIALFATURA        :=  NULL;
                V_NRGRUPOFATURA         :=  C_MODELOCONTRATO.NRGRUPOFATURA;
                V_NRPARCFATURA          :=  NULL;
                V_IDFATURACONTR         :=  C_MODELOCONTRATO.IDFATURACONTR;
                V_CDMODPGTO             :=  C_MODELOCONTRATO.CDMODPGTO;
                V_IDQTDIASCOMPCON       :=  C_MODELOCONTRATO.IDQTDIASCOMPCON;
                V_NRQTDIASCOMPCON       :=  C_MODELOCONTRATO.NRQTDIASCOMPCON;
                V_IDTPCOMPETCONT        :=  C_MODELOCONTRATO.IDTPCOMPETCONT;
                V_NRDIACOMPETCONT       :=  C_MODELOCONTRATO.NRDIACOMPETCONT;
                V_IDTPFATUINCOMP        :=  C_MODELOCONTRATO.IDTPFATUINCOMP;
                V_IDTPDTEMISSNF         :=  C_MODELOCONTRATO.IDTPDTEMISSNF;
                V_NRDIADTEMISSNF        :=  C_MODELOCONTRATO.NRDIADTEMISSNF;
                V_IDTPDTVENC            :=  C_MODELOCONTRATO.IDTPDTVENC;
                V_NRDIATPDTVENC         :=  C_MODELOCONTRATO.NRDIAVENPARCFAT;
                V_IDSOMAFATUCONT        :=  C_MODELOCONTRATO.IDSOMAFATUCONTFATU;
                V_IDSOMAITGRUPFAT       :=  C_MODELOCONTRATO.IDSOMAITGRUPFAT;
                V_IDGERANFPARC          :=  C_MODELOCONTRATO.IDGERANFPARC;
                V_IDBLOQVRMEDIC         :=  C_MODELOCONTRATO.IDBLOQVRMEDIC;
                V_IDGERARATEIO          :=  C_MODELOCONTRATO.IDGERARATEIO;
                V_QTPARCELASFATU        :=  C_MODELOCONTRATO.QTPARCELASFATU;
                V_NRDIAVENCPARCELASFATU :=  C_MODELOCONTRATO.NRDIAVENCPARCELASFATU;
                V_IDAPURAAPONTAMENTO    :=  C_MODELOCONTRATO.IDAPURAAPONTAMENTO;
              END;
            END;
          ELSE
                V_CDPRODFATURA          :=  NULL;
                V_CDFILIALFATURA        :=  NULL;
                V_NRGRUPOFATURA         :=  C_MODELOCONTRATO.NRGRUPOFATURA;
                V_NRPARCFATURA          :=  NULL;
                V_IDFATURACONTR         :=  C_MODELOCONTRATO.IDFATURACONTR;
                V_CDMODPGTO             :=  C_MODELOCONTRATO.CDMODPGTO;
                V_IDQTDIASCOMPCON       :=  C_MODELOCONTRATO.IDQTDIASCOMPCON;
                V_NRQTDIASCOMPCON       :=  C_MODELOCONTRATO.NRQTDIASCOMPCON;
                V_IDTPCOMPETCONT        :=  C_MODELOCONTRATO.IDTPCOMPETCONT;
                V_NRDIACOMPETCONT       :=  C_MODELOCONTRATO.NRDIACOMPETCONT;
                V_IDTPFATUINCOMP        :=  C_MODELOCONTRATO.IDTPFATUINCOMP;
                V_IDTPDTEMISSNF         :=  C_MODELOCONTRATO.IDTPDTEMISSNF;
                V_NRDIADTEMISSNF        :=  C_MODELOCONTRATO.NRDIADTEMISSNF;
                V_IDTPDTVENC            :=  C_MODELOCONTRATO.IDTPDTVENC;
                V_NRDIATPDTVENC         :=  C_MODELOCONTRATO.NRDIAVENPARCFAT;
                V_IDSOMAFATUCONT        :=  C_MODELOCONTRATO.IDSOMAFATUCONTFATU;
                V_IDSOMAITGRUPFAT       :=  C_MODELOCONTRATO.IDSOMAITGRUPFAT;
                V_IDGERANFPARC          :=  C_MODELOCONTRATO.IDGERANFPARC;
                V_IDBLOQVRMEDIC         :=  C_MODELOCONTRATO.IDBLOQVRMEDIC;
                V_IDGERARATEIO          :=  C_MODELOCONTRATO.IDGERARATEIO;
                V_QTPARCELASFATU        :=  C_MODELOCONTRATO.QTPARCELASFATU;
                V_NRDIAVENCPARCELASFATU :=  C_MODELOCONTRATO.NRDIAVENCPARCELASFATU;
                V_IDAPURAAPONTAMENTO    :=  C_MODELOCONTRATO.IDAPURAAPONTAMENTO;
          END IF;
          NOVO_CODIGO_NT('FCT_CONTRATO', V_NRSEQCONTRATO,1);
          V_DTINICIOCONT := SYSDATE;
          IF C_ORCAMENTO.QTDIASCONTRATO IS NOT NULL THEN
             V_DTFINCONT    := V_DTINICIOCONT+TO_NUMBER(C_ORCAMENTO.QTDIASCONTRATO);
             V_PRAZO := C_ORCAMENTO.QTDIASCONTRATO;
          ELSE
             V_DTFINCONT    := V_DTINICIOCONT+TO_NUMBER(C_MODELOCONTRATO.NRDIASVIGCONT);
             V_PRAZO := C_MODELOCONTRATO.NRDIASVIGCONT;
          END IF;
          IF C_MODELOCONTRATO.DTPADREAJCONT IS NOT NULL THEN
             V_DTPADREAJCONT := (TO_DATE('01/'||C_MODELOCONTRATO.DTPADREAJCONT||TO_CHAR(V_DTINICIOCONT,'/YYYY')))+365;
          END IF;
          INSERT INTO FCT_CONTRATO
             (NRSEQCONTRATO,IDTPCONTRATO,CDFILIALORCA,NRVERSAOCONTRATO,NRCONTRATOFCT,NRSEQMODCONTRA,
              NRPARCNEGOCIO,DSREFERENCIACONT,DTINICIOCONTRATO,DTFIMCONTRATO,NRDIASPRAZOCONT,
              IDSITUACAOCONTRATO,NRDIAVENPARCFAT,CDTPINDFINCON,CDINDFINCONT,IDPERVALFINCON,
              DTPADREAJCONT,NRDIASPRORGCONT,QTPOSTOTRABCONT,IDORIGCONTRATO,IDQTDIASCOMPCON,
              IDTPCOMPETCONT,IDTPFATUINCOMP,IDTPDTEMISSNF,IDTPDTVENC,NRQTDIASCOMPCON,
              NRDIACOMPETCONT,NRDIADTEMISSNF, IDSOMAFATUCONT, IDFATURACONTR, CDMODPGTO, DTINICFATCONTR,
              NRORG, QTPARCELASFATU, NRDIAVENCPARCELASFATU, CDOPERRESPONSAVEL)
          VALUES
             (V_NRSEQCONTRATO, 'S', C_ORCAMENTO.CDFILIAL, 1, V_NRSEQCONTRATO, V_NRSEQMODCONTRATO,
             C_ORCAMENTO.NRPARCNEGOCIO, C_ORCAMENTO.DSREFERENCIAORCA, V_DTINICIOCONT, V_DTFINCONT, V_PRAZO,
             C_MODELOCONTRATO.IDSITUACAOCONTRATO, V_NRDIATPDTVENC, C_MODELOCONTRATO.CDTPINDFINCON, C_MODELOCONTRATO.CDINDFINCONT,
             C_MODELOCONTRATO.IDPERVALFINCON, V_DTPADREAJCONT, C_MODELOCONTRATO.NRDIASPRORGCONT, C_MODELOCONTRATO.QTPOSTOTRABCONT, 'G',
             V_IDQTDIASCOMPCON, V_IDTPCOMPETCONT, V_IDTPFATUINCOMP,
             V_IDTPDTEMISSNF, V_IDTPDTVENC, V_NRQTDIASCOMPCON,
             V_NRDIACOMPETCONT, V_NRDIADTEMISSNF, V_IDSOMAFATUCONT,
             V_IDFATURACONTR, V_CDMODPGTO, C_MODELOCONTRATO.DTINICFATCONTR,
             P_NRORG, V_QTPARCELASFATU, V_NRDIAVENCPARCELASFATU, C_ORCAMENTO.CDOPERRESPONSAVEL);
          NOVO_CODIGO_NT('NRSEQFATUCONTR', V_NRSEQFATUCONTR,1);
          INSERT INTO FCT_PARAMFATCONT (NRSEQFATUCONTR, NRSEQCONTRATO, CDPRODFATURA, CDFILIALFATURA,
                                        NRPARCFATURA, NRGRUPOFATURA, IDSOMAITGRUPFAT, IDSOMAFATUCONT,
                                        IDGERANFPARC, IDBLOQVRMEDIC, IDGERARATEIO, IDAPURAAPONTAMENTO, NRORG)
                           VALUES(V_NRSEQFATUCONTR, V_NRSEQCONTRATO, V_CDPRODFATURA, V_CDFILIALFATURA,
                                  V_NRPARCFATURA, V_NRGRUPOFATURA, V_IDSOMAITGRUPFAT, V_IDSOMAFATUCONT,
                                  V_IDGERANFPARC, V_IDBLOQVRMEDIC, V_IDGERARATEIO, V_IDAPURAAPONTAMENTO, P_NRORG);
          CRIA_MNEMONICO(P_NRORG,'C',V_NRSEQCONTRATO,V_NRCONTRATOFCT);
          UPDATE FCT_CONTRATO
             SET NRCONTRATOFCT = V_NRCONTRATOFCT
           WHERE NRORG         = P_NRORG
             AND NRSEQCONTRATO = V_NRSEQCONTRATO;
         /* Parãmetros de Faturamento novo */
          FOR C_PARAMFATNOVO IN (SELECT NRCAPAPARAMFATMODCON, NRSEQMODCONTRA, NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA,
                                     IDTPFATURA, QTPARCELASFATU, IDTPCALCPARCINC, IDGERARATEIO, IDAPURAAPONTAMENTO, IDATIVO, NRORG
                                FROM FCT_CAPAPARAMFATMODCON
                               WHERE NRSEQMODCONTRA = V_NRSEQMODCONTRATO
                                 AND NRORG = P_NRORG) LOOP
            IF C_ORCAMENTO.NRTIPOORCAMENTO IS NOT NULL THEN
                BEGIN
                    SELECT NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA, IDTPFATURA,
                           QTPARCELASFATU, IDTPCALCPARCINC, IDGERARATEIO, IDAPURAAPONTAMENTO
                      INTO V_NRGRUPOFATURA_FNOVO, V_CDPRODFATURA_FNOVO, V_CDFILIALFATURA_FNOVO, V_NRPARCFATURA_FNOVO, V_IDTPFATURA_FNOVO,
                           V_QTPARCELASFATU_FNOVO, V_IDTPCALCPARCINC_FNOVO, V_IDGERARATEIO_FNOVO, V_IDAPURAAPONTAMENTO_FNOVO
                      FROM FCT_CAPAPARAMFATESC
                     WHERE NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                       AND NRORG = P_NRORG;
                 EXCEPTION
                    WHEN NO_DATA_FOUND THEN BEGIN
                        V_NRGRUPOFATURA_FNOVO      :=  C_PARAMFATNOVO.NRGRUPOFATURA;
                        V_CDPRODFATURA_FNOVO       :=  C_PARAMFATNOVO.CDPRODFATURA;
                        V_CDFILIALFATURA_FNOVO     :=  C_PARAMFATNOVO.CDFILIALFATURA;
                        V_NRPARCFATURA_FNOVO       :=  C_PARAMFATNOVO.NRPARCFATURA;
                        V_IDTPFATURA_FNOVO         :=  C_PARAMFATNOVO.IDTPFATURA;
                        V_QTPARCELASFATU_FNOVO     :=  C_PARAMFATNOVO.QTPARCELASFATU;
                        V_IDTPCALCPARCINC_FNOVO    :=  C_PARAMFATNOVO.IDTPCALCPARCINC;
                        V_IDGERARATEIO_FNOVO       :=  C_PARAMFATNOVO.IDGERARATEIO;
                        V_IDAPURAAPONTAMENTO_FNOVO :=  C_PARAMFATNOVO.IDAPURAAPONTAMENTO;
                    END;
                END;
                V_VAL_PARC_ESC := 0;
                FOR C_PARC_ESC IN (SELECT NRPARAMFATESC, NRTIPOORCAMENTO, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                          QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO, NRORG
                                     FROM FCT_PARAMFATESC
                                    WHERE NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                                      AND NRORG = P_NRORG) LOOP
                    NOVO_CODIGO_NT('FCT_PARAMFATCON', V_NRPARAMFATCON,1);
                    INSERT INTO FCT_PARAMFATCON (NRPARAMFATCON, NRSEQCONTRATO, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                                 QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO,
                                                 NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                           VALUES (V_NRPARAMFATCON, V_NRSEQCONTRATO, C_PARC_ESC.NRDIACOMPETINI, C_PARC_ESC.NRDIACOMPETFIN, C_PARC_ESC.IDMESCOMPETINI, C_PARC_ESC.IDMESCOMPETFIN,
                                   C_PARC_ESC.QTDIASAPURACAO, C_PARC_ESC.IDTPCALCVENC, C_PARC_ESC.NRDIACALCVENC, C_PARC_ESC.IDMESCALCVENC, C_PARC_ESC.QTDIASFATUVENC, 'S',
                                   P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);
                     V_VAL_PARC_ESC := V_VAL_PARC_ESC+1;
                END LOOP;
                IF (V_VAL_PARC_ESC = 0) THEN
                    FOR C_PARC_MODC IN (SELECT NRPARAMFATMODCON, NRSEQMODCONTRA, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                               QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO, NRORG
                                          FROM FCT_PARAMFATMODCON
                                         WHERE NRSEQMODCONTRA = C_PARAMFATNOVO.NRSEQMODCONTRA
                                           AND NRORG = P_NRORG) LOOP
                            NOVO_CODIGO_NT('FCT_PARAMFATCON', V_NRPARAMFATCON,1);
                            INSERT INTO FCT_PARAMFATCON (NRPARAMFATCON, NRSEQCONTRATO, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                                         QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO,
                                                         NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                                   VALUES (V_NRPARAMFATCON, V_NRSEQCONTRATO, C_PARC_MODC.NRDIACOMPETINI, C_PARC_MODC.NRDIACOMPETFIN, C_PARC_MODC.IDMESCOMPETINI, C_PARC_MODC.IDMESCOMPETFIN,
                                           C_PARC_MODC.QTDIASAPURACAO, C_PARC_MODC.IDTPCALCVENC, C_PARC_MODC.NRDIACALCVENC, C_PARC_MODC.IDMESCALCVENC, C_PARC_MODC.QTDIASFATUVENC, 'S',
                                           P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);
                    END LOOP;
                END IF;
            ELSE
                V_NRGRUPOFATURA_FNOVO      :=  C_PARAMFATNOVO.NRGRUPOFATURA;
                V_CDPRODFATURA_FNOVO       :=  C_PARAMFATNOVO.CDPRODFATURA;
                V_CDFILIALFATURA_FNOVO     :=  C_PARAMFATNOVO.CDFILIALFATURA;
                V_NRPARCFATURA_FNOVO       :=  C_PARAMFATNOVO.NRPARCFATURA;
                V_IDTPFATURA_FNOVO         :=  C_PARAMFATNOVO.IDTPFATURA;
                V_QTPARCELASFATU_FNOVO     :=  C_PARAMFATNOVO.QTPARCELASFATU;
                V_IDTPCALCPARCINC_FNOVO    :=  C_PARAMFATNOVO.IDTPCALCPARCINC;
                V_IDGERARATEIO_FNOVO       :=  C_PARAMFATNOVO.IDGERARATEIO;
                V_IDAPURAAPONTAMENTO_FNOVO :=  C_PARAMFATNOVO.IDAPURAAPONTAMENTO;
                FOR C_PARC_MODC IN (SELECT NRPARAMFATMODCON, NRSEQMODCONTRA, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                           QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO, NRORG
                                      FROM FCT_PARAMFATMODCON
                                     WHERE NRSEQMODCONTRA = C_PARAMFATNOVO.NRSEQMODCONTRA
                                       AND NRORG = P_NRORG) LOOP
                        NOVO_CODIGO_NT('FCT_PARAMFATCON', V_NRPARAMFATCON,1);
                        INSERT INTO FCT_PARAMFATCON (NRPARAMFATCON, NRSEQCONTRATO, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                                     QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO,
                                                     NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                               VALUES (V_NRPARAMFATCON, V_NRSEQCONTRATO, C_PARC_MODC.NRDIACOMPETINI, C_PARC_MODC.NRDIACOMPETFIN, C_PARC_MODC.IDMESCOMPETINI, C_PARC_MODC.IDMESCOMPETFIN,
                                       C_PARC_MODC.QTDIASAPURACAO, C_PARC_MODC.IDTPCALCVENC, C_PARC_MODC.NRDIACALCVENC, C_PARC_MODC.IDMESCALCVENC, C_PARC_MODC.QTDIASFATUVENC, 'S',
                                       P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);
                END LOOP;
            END IF;
            NOVO_CODIGO_NT('FCT_CAPAPARAMFATCON', V_NRCAPAPARAMFATCON,1);
            INSERT INTO FCT_CAPAPARAMFATCON(NRCAPAPARAMFATCON, NRSEQCONTRATO, NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA, IDTPFATURA,
                                QTPARCELASFATU, IDTPCALCPARCINC, IDGERARATEIO, IDAPURAAPONTAMENTO, IDATIVO, NRORG, DTINCLUSAO,
                                NRORGINCLUSAO, CDOPERINCLUSAO)
                   VALUES(V_NRCAPAPARAMFATCON, V_NRSEQCONTRATO, V_NRGRUPOFATURA_FNOVO, V_CDPRODFATURA_FNOVO, V_CDFILIALFATURA_FNOVO, V_NRPARCFATURA_FNOVO, V_IDTPFATURA_FNOVO,
                          V_QTPARCELASFATU_FNOVO, V_IDTPCALCPARCINC_FNOVO, V_IDGERARATEIO_FNOVO, V_IDAPURAAPONTAMENTO_FNOVO, 'S', P_NRORG, SYSDATE,
                          P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);
          END LOOP;
          FOR C_LOCAL IN (SELECT NRESTRUTURAM
                            FROM FCT_RELACESTRUTURAPROP
                           WHERE NRSEQORCAMENTO   = P_NRSEQORCAMENTO
                             AND NRORG            = P_NRORG
                             AND IDRELACESTRUTURA = 'PROPOSTA')
        LOOP
            NOVO_CODIGO_NT('NRRELACESTRUTCONT', V_NRRELACESTRUTCONT, 1);
            INSERT INTO FCT_RELACESTRUTURACONT (
                NRRELACESTRUTCONT,  NRESTRUTURAM,      NRSEQCONTRATO,
                NRITEMOCONTRATO,    IDRELACESTRUTURA,  VRITEMRATEIO,
                NRORG,              VRPERCRATEIO,      DTINCLUSAO
            )
            VALUES (
                V_NRRELACESTRUTCONT,  C_LOCAL.NRESTRUTURAM,  V_NRSEQCONTRATO,
                NULL,                 'CONTRATO',            NULL,
                P_NRORG,              NULL,                  SYSDATE
            );
        END LOOP;
          FOR C_ITEM IN (
              SELECT IT.CDPRECBASESERV, IT.CDSERVORCA, IT.CDPRODUTO, IT.SGUNIDADE,
                     IT.CDTPMEDIDASERV, IT.QTMEDIDAORCA, IT.IDFATURAORCA, IT.CDMODPGTO,
                     IT.NRGRUPOFATURA, IT.IDUNIDTEMPOLOCACAO, IT.QTITEMORCAMENTO,
                     IT.QTTEMPOLOCACAO,IT.NMITEMORCAMENTO, VRUNITITEMORCA, VRTOTALITEMORCA,
                     IT.DTINICFATORC, IT.IDMULTMEDVRTOT, IT.IDADICITEMORC, IT.IDADICCOBRITEMORC, IT.NRITEMORCAMENTO,
                     IT.QTPARCELASFATU, IT.NRDIAVENCPARCELASFATU, IT.NRTIPOORCAMENTO,
                     IT.VRPERCDESCORCA, IT.IDTPDESCORCA
                FROM FCT_ITEMORCAMENTO IT
               WHERE IT.NRORG          = P_NRORG
                 AND IT.NRSEQORCAMENTO = P_NRSEQORCAMENTO
                 AND IT.IDELEMENTO IS NULL
                 AND (IT.NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO OR IT.NRTIPOORCAMENTO IS NULL)) LOOP
              IF C_ITEM.NRTIPOORCAMENTO IS NOT NULL THEN
                BEGIN
                  SELECT FCT_PARAMFATSRVESCO.CDPRODFATURA, FCT_PARAMFATSRVESCO.CDFILIALFATURA,  FCT_PARAMFATSRVESCO.NRGRUPOFATURA,
                         FCT_PARAMFATSRVESCO.NRPARCFATURA, FCT_PARAMFATSRVESCO.IDFATURACONTR, FCT_PARAMFATSRVESCO.CDMODPGTO,
                         FCT_PARAMFATSRVESCO.IDBLOQVRITMEDIC, FCT_PARAMFATSRVESCO.QTPARCELASFATU, FCT_PARAMFATSRVESCO.NRDIAVENCPARCELASFATU
                    INTO V_CDPRODFATURA_IT, V_CDFILIALFATURA_IT, V_NRGRUPOFATURA_IT,
                         V_NRPARCFATURA_IT, V_IDFATURACONTR_IT, V_CDMODPGTO_IT,
                         V_IDBLOQVRITMEDIC_IT, V_QTPARCELASFATU_IT, V_NRDIAVENCPARCELASFATU_IT
                    FROM FCT_PARAMFATSRVESCO
                   LEFT JOIN FCT_ITESCOPOPROPOSTA
                     ON FCT_PARAMFATSRVESCO.NRITESCOPOPROPOSTA = FCT_ITESCOPOPROPOSTA.NRITESCOPOPROPOSTA
                    AND FCT_PARAMFATSRVESCO.NRTIPOORCAMENTO = FCT_ITESCOPOPROPOSTA.NRTIPOORCAMENTO
                    AND FCT_PARAMFATSRVESCO.NRORG = FCT_ITESCOPOPROPOSTA.NRORG
                  WHERE FCT_PARAMFATSRVESCO.NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                    AND FCT_ITESCOPOPROPOSTA.CDSERVORCA = C_ITEM.CDSERVORCA
                    AND FCT_PARAMFATSRVESCO.NRORG = P_NRORG;
                EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                      V_CDPRODFATURA_IT :=  NULL;
                      V_CDFILIALFATURA_IT := NULL;
                      V_NRGRUPOFATURA_IT :=  C_ITEM.NRGRUPOFATURA;
                      V_NRPARCFATURA_IT :=  NULL;
                      V_IDFATURACONTR_IT := C_ITEM.IDFATURAORCA;
                      V_CDMODPGTO_IT := C_ITEM.CDMODPGTO;
                      V_IDBLOQVRITMEDIC_IT := 'N';
                      V_QTPARCELASFATU_IT := C_ITEM.CDMODPGTO;
                      V_NRDIAVENCPARCELASFATU_IT :=  C_ITEM.CDMODPGTO;
                  END;
                END;
              ELSE
                V_CDPRODFATURA_IT := NULL;
                V_CDFILIALFATURA_IT := NULL;
                V_NRGRUPOFATURA_IT := C_ITEM.NRGRUPOFATURA;
                V_NRPARCFATURA_IT := NULL;
                V_IDFATURACONTR_IT := C_ITEM.IDFATURAORCA;
                V_CDMODPGTO_IT := C_ITEM.CDMODPGTO;
                V_IDBLOQVRITMEDIC_IT := 'N';
                V_QTPARCELASFATU_IT := C_ITEM.CDMODPGTO;
                V_NRDIAVENCPARCELASFATU_IT :=  C_ITEM.CDMODPGTO;
              END IF;
             IF V_IDFATURACONTR_IT = 'O' THEN
                 V_QTPARCELASFATU_IT := NULL;
                 V_NRDIAVENCPARCELASFATU_IT := NULL;
              END IF;
              IF V_IDFATURACONTR_IT = 'P' THEN
                 V_CDMODPGTO_IT := NULL;
              END IF;
               IF ((V_IDFATURACONTR_IT = 'A') OR (V_IDFATURACONTR_IT = 'X')) THEN
                 V_QTPARCELASFATU_IT := NULL;
                 V_NRDIAVENCPARCELASFATU_IT := NULL;
                 V_CDMODPGTO_IT := NULL;
              END IF;
              NOVO_CODIGO_NT('FCT_ITEMCONTRATO', V_NRITSEQCONTRATO, 1);
              INSERT INTO FCT_ITEMCONTRATO
                  (NRORG,NRITEMOCONTRATO, NRSEQCONTRATO,
                   CDPRODUTO,CDSERVORCA,SGUNIDADE,NMITEMCONTRATO,
                   QTITEMCONTRATO,CDTPMEDIDASERV,QTMEDIDACONTR, IDFATURACONTR,
                   CDMODPGTO,NRGRUPOFATURA,IDUNIDTEMPOSERV,QTTEMPOSERV,IDITEMATIVO,
                   VRUNITITEMCONT,VRTOTITEMCONT, DTINICFATCONTR, IDMULTMEDVRTOT,
                   IDADICITEMCONT, IDADICCOBRCONT,IDFATURAITEM,
                   QTPARCELASFATU, NRDIAVENCPARCELASFATU,
                   VRDESCONTO, IDTPDESCONTO, NRITEMORCAMENTO)
              VALUES
                (P_NRORG, V_NRITSEQCONTRATO, V_NRSEQCONTRATO,
                 C_ITEM.CDPRODUTO, C_ITEM.CDSERVORCA, C_ITEM.SGUNIDADE, C_ITEM.NMITEMORCAMENTO,
                 C_ITEM.QTITEMORCAMENTO, C_ITEM.CDTPMEDIDASERV, C_ITEM.QTMEDIDAORCA, V_IDFATURACONTR_IT,
                 V_CDMODPGTO_IT, V_NRGRUPOFATURA_IT, C_ITEM.IDUNIDTEMPOLOCACAO, C_ITEM.QTTEMPOLOCACAO, 'S',
                 C_ITEM.VRUNITITEMORCA, C_ITEM.VRTOTALITEMORCA, C_ITEM.DTINICFATORC, C_ITEM.IDMULTMEDVRTOT,
                 C_ITEM.IDADICITEMORC, C_ITEM.IDADICCOBRITEMORC, NVL(V_SOMAVALOR,'SIM'),
                 C_ITEM.QTPARCELASFATU, C_ITEM.NRDIAVENCPARCELASFATU,
                 C_ITEM.VRPERCDESCORCA, DECODE(C_ITEM.IDTPDESCORCA, 'N', 'S', C_ITEM.IDTPDESCORCA), C_ITEM.NRITEMORCAMENTO);
                BEGIN
                    SELECT NRFORMPRECOSERVICO
                    INTO V_NRFORMPRECOSERVICO
                    FROM FCT_RELACFORMACAOPROP FORMPROP
                    WHERE FORMPROP.NRORG          = P_NRORG
                     AND FORMPROP.NRSEQORCAMENTO  = P_NRSEQORCAMENTO
                     AND FORMPROP.NRITEMORCAMENTO = C_ITEM.NRITEMORCAMENTO;
               EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                        BEGIN
                            V_NRFORMPRECOSERVICO := NULL;
                        END;
               END;
                IF V_NRFORMPRECOSERVICO IS NOT NULL THEN
                    NOVO_CODIGO_NT('FCT_RELACFORMACAOCONT', V_NRRELACFORMACAOCONT, 1, P_NRORG);
                    INSERT INTO FCT_RELACFORMACAOCONT
                        (NRRELACFORMACAOCONT, NRFORMPRECOSERVICO, NRSEQCONTRATO,
                            NRITEMOCONTRATO, NRORG, IDATIVO, DTINCLUSAO, DTULTATU,
                            NRORGINCLUSAO, NRORGULTATU, CDOPERULTATU,
                            NRREAJUSCONTFORMPREC)
                    VALUES (V_NRRELACFORMACAOCONT, V_NRFORMPRECOSERVICO, V_NRSEQCONTRATO,
                            V_NRITSEQCONTRATO, P_NRORG, 'S', SYSDATE, NULL,
                            P_NRORG, NULL, NULL, NULL);
                END IF;
                FOR C_RATEIO IN (SELECT NRESTRUTURAM, VRITEMRATEIO, VRPERCRATEIO
                                   FROM FCT_RELACESTRUTURAPROP
                                  WHERE NRSEQORCAMENTO   = P_NRSEQORCAMENTO
                                    AND NRORG            = P_NRORG
                                    AND NRITEMORCAMENTO  = C_ITEM.NRITEMORCAMENTO
                                    AND IDRELACESTRUTURA = 'RATEIO')
                LOOP
                    NOVO_CODIGO_NT('NRRELACESTRUTCONT', V_NRRELACESTRUTCONT,1);
                    INSERT INTO FCT_RELACESTRUTURACONT (
                        NRRELACESTRUTCONT,  NRESTRUTURAM,      NRSEQCONTRATO,
                        NRITEMOCONTRATO,    IDRELACESTRUTURA,  VRITEMRATEIO,
                        NRORG,              VRPERCRATEIO,      DTINCLUSAO
                    )
                    VALUES (
                        V_NRRELACESTRUTCONT,  C_RATEIO.NRESTRUTURAM,  V_NRSEQCONTRATO,
                        V_NRITSEQCONTRATO,    'RATEIO',               C_RATEIO.VRITEMRATEIO,
                        P_NRORG,              C_RATEIO.VRPERCRATEIO,  SYSDATE
                    );
                END LOOP;
                NOVO_CODIGO_NT('NRSEQFATUITCONT', V_NRSEQFATUITCONT,1);
                 INSERT INTO FCT_PARAMFATITCONT (NRSEQFATUITCONT, NRITEMOCONTRATO, NRSEQCONTRATO, CDPRODFATURA,
                              CDFILIALFATURA, NRGRUPOFATURA, NRPARCFATURA, IDBLOQVRITMEDIC,
                              NRORG, IDATIVO, DTINCLUSAO)
                           VALUES(V_NRSEQFATUITCONT, V_NRITSEQCONTRATO, V_NRSEQCONTRATO, V_CDPRODFATURA_IT,
                                  V_CDFILIALFATURA_IT, V_NRGRUPOFATURA_IT, V_NRPARCFATURA_IT, V_IDBLOQVRITMEDIC_IT,
                                  P_NRORG, 'S', SYSDATE);
                 /* Faturamento Novo */
                   SELECT COUNT (*) ITPROPOSTA
                     INTO V_ITPROPOSTA
                     FROM FCT_PARAMFATITPROP
                    WHERE NRITEMORCAMENTO = C_ITEM.NRITEMORCAMENTO
                      AND NRSEQORCAMENTO = P_NRSEQORCAMENTO
                      AND NRORG = P_NRORG;
                   IF (V_ITPROPOSTA > 0) THEN
                      SELECT NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA,
                             NRPARCFATURA, IDTPFATURA, QTPARCELASFATU
                        INTO V_NRGRUPOFATURA_ITFATNOVO, V_CDPRODFATURA_ITFATNOVO, V_CDFILIALFATURA_ITFATNOVO,
                             V_NRPARCFATURA_ITFATNOVO, V_IDTPFATURA_ITFATNOVO, V_QTPARCELASFATU_ITFATNOVO
                        FROM FCT_PARAMFATITPROP
                       WHERE NRITEMORCAMENTO = C_ITEM.NRITEMORCAMENTO
                         AND NRSEQORCAMENTO = P_NRSEQORCAMENTO
                         AND NRORG = P_NRORG;
                        NOVO_CODIGO_NT('FCT_PARAMFATITCON', V_NRPARAMFATITCON,1);
                        INSERT INTO FCT_PARAMFATITCON (NRPARAMFATITCON, NRITEMOCONTRATO, NRSEQCONTRATO, NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA,
                                                       IDTPFATURA, QTPARCELASFATU, IDATIVO, NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                               VALUES (V_NRPARAMFATITCON, V_NRITSEQCONTRATO, V_NRSEQCONTRATO, V_NRGRUPOFATURA_ITFATNOVO, V_CDPRODFATURA_ITFATNOVO, V_CDFILIALFATURA_ITFATNOVO, V_NRPARCFATURA_ITFATNOVO,
                                       V_IDTPFATURA_ITFATNOVO, V_QTPARCELASFATU_ITFATNOVO, 'S', P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);
                   ELSE
                       BEGIN
                           SELECT FCT_ITESCOPOPROPOSTA.NRITESCOPOPROPOSTA
                            INTO  V_NRITESCOPOPROPOSTA_FAT
                            FROM FCT_PARAMFATITESC
                            JOIN FCT_ITESCOPOPROPOSTA
                              ON FCT_ITESCOPOPROPOSTA.NRITESCOPOPROPOSTA = FCT_PARAMFATITESC.NRITESCOPOPROPOSTA
                             AND FCT_ITESCOPOPROPOSTA.NRORG = FCT_PARAMFATITESC.NRORG
                           WHERE FCT_ITESCOPOPROPOSTA.NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                             AND FCT_ITESCOPOPROPOSTA.CDSERVORCA = C_ITEM.CDSERVORCA
                             AND FCT_ITESCOPOPROPOSTA.NRORG = P_NRORG;
                        EXCEPTION
                            WHEN NO_DATA_FOUND THEN BEGIN
                                V_NRITESCOPOPROPOSTA_FAT := NULL;
                            END;
                       END;
                       IF (V_NRITESCOPOPROPOSTA_FAT IS NOT NULL) THEN
                           SELECT NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA,
                                  NRPARCFATURA, IDTPFATURA, QTPARCELASFATU
                             INTO V_NRGRUPOFATURA_ITFATNOVO, V_CDPRODFATURA_ITFATNOVO, V_CDFILIALFATURA_ITFATNOVO,
                                  V_NRPARCFATURA_ITFATNOVO, V_IDTPFATURA_ITFATNOVO, V_QTPARCELASFATU_ITFATNOVO
                             FROM FCT_PARAMFATITESC
                            WHERE NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                              AND NRITESCOPOPROPOSTA = V_NRITESCOPOPROPOSTA_FAT
                              AND NRORG = P_NRORG;
                              NOVO_CODIGO_NT('FCT_PARAMFATITCON', V_NRPARAMFATITCON,1);
                              INSERT INTO FCT_PARAMFATITCON (NRPARAMFATITCON, NRITEMOCONTRATO, NRSEQCONTRATO, NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA,
                                                             IDTPFATURA, QTPARCELASFATU, IDATIVO, NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                                     VALUES (V_NRPARAMFATITCON, V_NRITSEQCONTRATO, V_NRSEQCONTRATO, V_NRGRUPOFATURA_ITFATNOVO, V_CDPRODFATURA_ITFATNOVO, V_CDFILIALFATURA_ITFATNOVO, V_NRPARCFATURA_ITFATNOVO,
                                               V_IDTPFATURA_ITFATNOVO, V_QTPARCELASFATU_ITFATNOVO, 'S', P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);
                       END IF;
                   END IF;
          END LOOP;
          FOR C_REAJUSTE IN (SELECT NRSEQMODREAJUS, NMMODREAJUSCONTR, IDTPREAJUSTE,
                                   IDTPMESREAJUSTE, NRQTDREAJUSTE, NRORG, IDATIVO
                              FROM FCT_MODREAJUSTCONTR
                             WHERE NRSEQMODCONTRA = V_NRSEQMODCONTRATO) LOOP
               NOVO_CODIGO_NT('NRSEQREAJUS', V_NRSEQREAJUSTE,1);
                INSERT INTO FCT_REAJUSTCONTR
                      (NRSEQCONTRATO,NRSEQREAJUS, NMREAJUSCONTR,
                       IDTPREAJUSTE, IDTPMESREAJUSTE,NRQTDREAJUSTE,
                       IDATIVO, DTINCLUSAO)
                    VALUES
                      (V_NRSEQCONTRATO,V_NRSEQREAJUSTE, C_REAJUSTE.NMMODREAJUSCONTR,
                       C_REAJUSTE.IDTPREAJUSTE, C_REAJUSTE.IDTPMESREAJUSTE, C_REAJUSTE.NRQTDREAJUSTE,
                       'S',SYSDATE);
             FOR C_INDICE IN(SELECT CDTPINDICE, IDPERVALOR, CDINDICE, VRPERCINDCONTR, NRORG
                           FROM FCT_MODINDCONTR
                          WHERE NRSEQMODREAJUS = C_REAJUSTE.NRSEQMODREAJUS )LOOP
                NOVO_CODIGO_NT('NRSEQINDCONTR', V_NRSEQINDCONTR,1);
                INSERT INTO FCT_INDICECONTR
                      (NRSEQINDCONTR,NRSEQREAJUS, NRSEQCONTRATO,
                       CDTPINDICE, IDPERVALOR, CDINDICE, VRPERCINDCONTR,
                       IDATIVO, DTINCLUSAO)
                    VALUES
                      (V_NRSEQINDCONTR,V_NRSEQREAJUSTE, V_NRSEQCONTRATO,
                       C_INDICE.CDTPINDICE, C_INDICE.IDPERVALOR, C_INDICE.CDINDICE,
                       C_INDICE.VRPERCINDCONTR, 'S',SYSDATE);
             END LOOP;
          END LOOP;
         FOR C_CONTRATODOC IN (
            SELECT FCT_MODELODOC.NRSEQMODDOCFCT,
                   FCT_MODELODOC.NRMODELODOCFCT,
                   FCT_MODELODOC.IDIDIOMA,
                   FCT_MODELODOC.TXMODELODOCORCA,
                   FCT_MODELODOC.NRORG,
                   FCT_MODELODOC.NMARQUIVO,
                   FCT_MODELODOC.DSCAMINHOARQ,
                   FCT_MODELODOC.DSTIPO,
                   FCT_MODELODOC.VRTAMANHO,
                   MODCONT.IDSITUACAOCONTRATO
               FROM FCT_MODELODOC
               INNER JOIN (SELECT DISTINCT NRSEQMODDOCFCT, IDSITUACAOCONTRATO, NRORG
                             FROM FCT_MODELODOCCONTR
                            WHERE NRORG = P_NRORG
                              AND NRSEQMODCONTRA IN (SELECT TP.NRSEQMODCONTRATO
                                                       FROM FCT_TIPOORCAMENTO TP
                                                       INNER JOIN FCT_RELACESCOPOPROPOSTA REL
                                                       ON TP.NRTIPOORCAMENTO = REL.NRTIPOORCAMENTO
                                                       AND TP.NRORG           = REL.NRORG
                                                     WHERE REL.NRSEQORCAMENTO = C_ORCAMENTO.NRSEQORCAMENTO
                                                       AND REL.NRORG          = P_NRORG)
                              AND (IDSITUACAOCONTRATO = 'P'
                                    OR (IDSITUACAOCONTRATO IS NULL AND (SELECT COUNT(DOC.NRSEQMODDOCFCT)
                                        FROM FCT_MODELODOCCONTR DOC
                                        WHERE DOC.IDSITUACAOCONTRATO = 'P'
                                          AND DOC.NRSEQMODDOCFCT = FCT_MODELODOCCONTR.NRSEQMODDOCFCT) = 0))) MODCONT
             ON FCT_MODELODOC.NRORG = MODCONT.NRORG
             AND FCT_MODELODOC.NRSEQMODDOCFCT = MODCONT.NRSEQMODDOCFCT
             WHERE FCT_MODELODOC.NRORG = P_NRORG
         ) LOOP
             NOVO_CODIGO_NT('NRSEQCONTDOC', V_NRSEQCONTDOC,1);
             INSERT INTO FCT_CONTRATODOC (
                NRSEQCONTDOC,   NRSEQCONTRATO,    NRSEQMODDOCFCT,
                IDIDIOMA,       TXMODELODOCORCA,  NRORG,
                IDATIVO,        DTINCLUSAO,       NMARQUIVO,
                DSCAMINHOARQ,   DSTIPO,           VRTAMANHO,
                IDSITUACAOCONTRATO
             )
             VALUES (
                V_NRSEQCONTDOC,             V_NRSEQCONTRATO,                C_CONTRATODOC.NRSEQMODDOCFCT,
                C_CONTRATODOC.IDIDIOMA,     C_CONTRATODOC.TXMODELODOCORCA,  P_NRORG,
                'S',                        SYSDATE,                        C_CONTRATODOC.NMARQUIVO,
                C_CONTRATODOC.DSCAMINHOARQ, C_CONTRATODOC.DSTIPO,           C_CONTRATODOC.VRTAMANHO,
                C_CONTRATODOC.IDSITUACAOCONTRATO
             );
         END LOOP;
         FOR C_NEGOCIACAO IN (
             SELECT NRNEGOCIACAOPROPOSTA,
                    NRTIPOORCAMENTO,
                    IDTPFATURA,
                    CDFILIALFATURA,
                    NRPARCFATURA,
                    CDTIPOOPERFATURA,
                    CDSERIENF,
                    CDEMPRESA,
                    CDINSCESTA,
                    CDINSCMUNI,
                    VRTOTITEM,
                    VRPERCDESCITEM,
                    VRDESCITEM,
                    VRTOTITEMCOMDESC,
                    IDATIVO
               FROM FCT_NEGOCIACAOPROPOSTA
              WHERE NRSEQORCAMENTO  = P_NRSEQORCAMENTO
                AND NRORG           = P_NRORG
                AND NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
         ) LOOP
             NOVO_CODIGO_NT('FCT_NEGOCIACAOCONTRATO', V_NRNEGOCIACAOCONTRATO, 1, P_NRORG);
             INSERT INTO FCT_NEGOCIACAOCONTRATO (
                 NRNEGOCIACAOCONTRATO,   NRSEQCONTRATO,        NRTIPOORCAMENTO,
                 IDTPFATURA,             CDFILIALFATURA,       NRPARCFATURA,
                 CDTIPOOPERFATURA,       CDSERIENF,            CDEMPRESA,
                 CDINSCESTA,             CDINSCMUNI,           VRTOTITEM,
                 VRPERCDESCITEM,         VRDESCITEM,           VRTOTITEMCOMDESC,
                 IDATIVO,                NRORG,                DTINCLUSAO,
                 NRORGINCLUSAO,          NRNEGOCIACAOPROPOSTA
             )
             VALUES (
                 V_NRNEGOCIACAOCONTRATO,        V_NRSEQCONTRATO,                   C_NEGOCIACAO.NRTIPOORCAMENTO,
                 C_NEGOCIACAO.IDTPFATURA,       C_NEGOCIACAO.CDFILIALFATURA,       C_NEGOCIACAO.NRPARCFATURA,
                 C_NEGOCIACAO.CDTIPOOPERFATURA, C_NEGOCIACAO.CDSERIENF,            C_NEGOCIACAO.CDEMPRESA,
                 C_NEGOCIACAO.CDINSCESTA,       C_NEGOCIACAO.CDINSCMUNI,           C_NEGOCIACAO.VRTOTITEM,
                 C_NEGOCIACAO.VRPERCDESCITEM,   C_NEGOCIACAO.VRDESCITEM,           C_NEGOCIACAO.VRTOTITEMCOMDESC,
                 C_NEGOCIACAO.IDATIVO,          P_NRORG,                           SYSDATE,
                 P_NRORG,                       C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
             );
             FOR C_ITNEGOCIACAO IN (
                 SELECT NRITNEGOCIACAOPROPOSTA,
                        NRITEMORCAMENTO,
                        NRITEMORCAMENTOPAI,
                        VRTOTITEM,
                        VRPERCDESCITEM,
                        VRDESCITEM,
                        VRTOTITEMCOMDESC,
                        CDSERVORCA,
                        CDPRODFATURA,
                        NRPARCFATURA,
                        IDATIVO
                   FROM FCT_ITNEGOCIACAOPROPOSTA
                  WHERE NRNEGOCIACAOPROPOSTA = C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
                    AND NRORG                = P_NRORG
             ) LOOP
                 BEGIN
                     SELECT NRITEMOCONTRATO
                       INTO V_NRITEMOCONTRATO_NEGO
                       FROM FCT_ITEMCONTRATO
                      WHERE NRSEQCONTRATO   = V_NRSEQCONTRATO
                        AND NRITEMORCAMENTO = C_ITNEGOCIACAO.NRITEMORCAMENTO
                        AND NRORG           = P_NRORG;
                 EXCEPTION WHEN NO_DATA_FOUND THEN
                     V_NRITEMOCONTRATO_NEGO := NULL;
                 END;
                 NOVO_CODIGO_NT('FCT_ITNEGOCIACAOCONTRATO', V_NRITNEGOCIACAOCONTRATO, 1, P_NRORG);
                 INSERT INTO FCT_ITNEGOCIACAOCONTRATO (
                     NRITNEGOCIACAOCONTRATO, NRNEGOCIACAOCONTRATO,   NRITEMOCONTRATO,
                     NRITEMORCAMENTO,        NRITEMORCAMENTOPAI,     VRTOTITEM,
                     VRPERCDESCITEM,         VRDESCITEM,             VRTOTITEMCOMDESC,
                     CDSERVORCA,             CDPRODFATURA,           NRPARCFATURA,
                     IDATIVO,                NRORG,                  DTINCLUSAO,
                     NRORGINCLUSAO,          NRITNEGOCIACAOPROPOSTA
                 )
                 VALUES (
                     V_NRITNEGOCIACAOCONTRATO,        V_NRNEGOCIACAOCONTRATO,                V_NRITEMOCONTRATO_NEGO,
                     C_ITNEGOCIACAO.NRITEMORCAMENTO,  C_ITNEGOCIACAO.NRITEMORCAMENTOPAI,     C_ITNEGOCIACAO.VRTOTITEM,
                     C_ITNEGOCIACAO.VRPERCDESCITEM,   C_ITNEGOCIACAO.VRDESCITEM,             C_ITNEGOCIACAO.VRTOTITEMCOMDESC,
                     C_ITNEGOCIACAO.CDSERVORCA,       C_ITNEGOCIACAO.CDPRODFATURA,           C_ITNEGOCIACAO.NRPARCFATURA,
                     C_ITNEGOCIACAO.IDATIVO,          P_NRORG,                               SYSDATE,
                     P_NRORG,                         C_ITNEGOCIACAO.NRITNEGOCIACAOPROPOSTA
                 );
             END LOOP; --C_ITNEGOCIACAO
             FOR C_PARCELA_NEGO IN (
                 SELECT NRPARCELANEGOPROP,
                        QTDIASFATURAMENTO,
                        NRDIAVENCIMENTO,
                        VRPARCELA,
                        IDATIVO
                   FROM FCT_PARCELANEGOPROP
                  WHERE NRNEGOCIACAOPROPOSTA = C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
                    AND NRORG                = P_NRORG
             ) LOOP
                 NOVO_CODIGO_NT('FCT_PARCELANEGOCONT', V_NRPARCELANEGOCONT, 1, P_NRORG);
                 INSERT INTO FCT_PARCELANEGOCONT (
                     NRPARCELANEGOCONT, NRNEGOCIACAOCONTRATO, QTDIASFATURAMENTO,
                     NRDIAVENCIMENTO,   VRPARCELA,            IDATIVO,
                     NRORG,             DTINCLUSAO,           NRORGINCLUSAO,
                     NRPARCELANEGOPROP
                 )
                 VALUES (
                     V_NRPARCELANEGOCONT,              V_NRNEGOCIACAOCONTRATO,   C_PARCELA_NEGO.QTDIASFATURAMENTO,
                     C_PARCELA_NEGO.NRDIAVENCIMENTO,   C_PARCELA_NEGO.VRPARCELA, C_PARCELA_NEGO.IDATIVO,
                     P_NRORG,                          SYSDATE,                  P_NRORG,
                     C_PARCELA_NEGO.NRPARCELANEGOPROP
                 );
             END LOOP; --C_PARCELA_NEGO
             FOR C_DESCPERIODO_NEGO IN (
                 SELECT NRDESCPERIODONEGOPROP,
                        VRPERCDESCITEM,
                        VRDESCITEM,
                        VRTOTITEMCOMDESC,
                        QTMESESDESC,
                        DTFINALVALIDADEDESC,
                        IDATIVO
                   FROM FCT_DESCPERIODONEGOPROP
                  WHERE NRNEGOCIACAOPROPOSTA = C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
                    AND NRORG                = P_NRORG
             ) LOOP
                 NOVO_CODIGO_NT('FCT_DESCPERIODONEGOCONT', V_NRDESCPERIODONEGOCONT, 1, P_NRORG);
                 INSERT INTO FCT_DESCPERIODONEGOCONT (
                     NRDESCPERIODONEGOCONT, NRNEGOCIACAOCONTRATO, VRPERCDESCITEM,
                     VRDESCITEM,            VRTOTITEMCOMDESC,     QTMESESDESC,
                     DTFINALVALIDADEDESC,   IDATIVO,              NRORG,
                     DTINCLUSAO,            NRORGINCLUSAO,        NRDESCPERIODONEGOPROP
                 )
                 VALUES (
                     V_NRDESCPERIODONEGOCONT,                V_NRNEGOCIACAOCONTRATO,              C_DESCPERIODO_NEGO.VRPERCDESCITEM,
                     C_DESCPERIODO_NEGO.VRDESCITEM,          C_DESCPERIODO_NEGO.VRTOTITEMCOMDESC, C_DESCPERIODO_NEGO.QTMESESDESC,
                     C_DESCPERIODO_NEGO.DTFINALVALIDADEDESC, C_DESCPERIODO_NEGO.IDATIVO,          P_NRORG,
                     SYSDATE,                                P_NRORG,                             C_DESCPERIODO_NEGO.NRDESCPERIODONEGOPROP
                 );
             END LOOP; --C_DESCPERIODO_NEGO
             FOR C_COMPET IN (
                 SELECT NRDIACOMPETINI,
                        NRDIACOMPETFIN,
                        IDMESCOMPETINI,
                        IDMESCOMPETFIN,
                        QTDIASAPURACAO,
                        IDTPCALCVENC,
                        NRDIACALCVENC,
                        IDMESCALCVENC,
                        QTDIASFATUVENC,
                        IDATIVO
                   FROM FCT_COMPETENCIANEGOPROP
                  WHERE NRNEGOCIACAOPROPOSTA = C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
                    AND NRORG                = P_NRORG
             ) LOOP
                 NOVO_CODIGO_NT('FCT_COMPETENCIANEGOCONT', V_NRCOMPETENCIANEGOCONT, 1, P_NRORG);
                 INSERT INTO FCT_COMPETENCIANEGOCONT (
                     NRCOMPETENCIANEGOCONT, NRNEGOCIACAOCONTRATO, NRDIACOMPETINI,
                     NRDIACOMPETFIN,        IDMESCOMPETINI,       IDMESCOMPETFIN,
                     QTDIASAPURACAO,        IDTPCALCVENC,         NRDIACALCVENC,
                     IDMESCALCVENC,         QTDIASFATUVENC,       IDATIVO,
                     NRORG,                 DTINCLUSAO,           NRORGINCLUSAO
                 )
                 VALUES (
                     V_NRCOMPETENCIANEGOCONT, V_NRNEGOCIACAOCONTRATO,  C_COMPET.NRDIACOMPETINI,
                     C_COMPET.NRDIACOMPETFIN, C_COMPET.IDMESCOMPETINI, C_COMPET.IDMESCOMPETFIN,
                     C_COMPET.QTDIASAPURACAO, C_COMPET.IDTPCALCVENC,   C_COMPET.NRDIACALCVENC,
                     C_COMPET.IDMESCALCVENC,  C_COMPET.QTDIASFATUVENC, C_COMPET.IDATIVO,
                     P_NRORG,                 SYSDATE,                 P_NRORG
                 );
             END LOOP; --C_COMPET
         END LOOP; --C_NEGOCIACAO
      END LOOP;
      IF V_NRSEQMODCONTRATO IS NOT NULL THEN
          NOVO_CODIGO_NT('FCT_REFEORCACONT', V_NRSEQREFEORCCONT,1);
          INSERT INTO FCT_REFEORCACONT
            (NRSEQREFEORCCONT, NRSEQORCAMENTO, NRSEQCONTRATO, IDCONTRATIVO, NRORG, DTINCLUSAO, NRTIPOORCAMENTO)
          VALUES
            (V_NRSEQREFEORCCONT, P_NRSEQORCAMENTO, V_NRSEQCONTRATO,'A', P_NRORG, SYSDATE, C_ORCAMENTO.NRTIPOORCAMENTO);
      END IF;
  END LOOP;
  P_NRSEQCONTRATO := V_NRSEQCONTRATO;
END;
/
CREATE OR REPLACE PROCEDURE FCT_ENCERRA_CONTRATO (
    P_NRSEQCONTRATO    IN INTEGER,
    P_OPERADOR      IN VARCHAR2,
    P_NRORG         IN INTEGER)
AS
BEGIN
/* 1 - Encerra o Contrato */
   UPDATE FCT_CONTRATO
   SET IDSITUACAOCONTRATO = 'E',
       DTRECISAOCONTR = SYSDATE,
       DTULTATU = SYSDATE,
       NRORGULTATU = P_NRORG,
       CDOPERULTATU = P_OPERADOR,
       IDATIVO = 'N'
   WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
     AND NRORG = P_NRORG;
  /* 2 - Deleta as parcelas de faturamento  */
   FCT_CANC_VENCPREV_CONT(P_NRORG, P_NRSEQCONTRATO);
  /* 3 - Inativa a parametrização de faturamento do Contrato */
   UPDATE FCT_PARAMFATCONT
      SET DTULTATU = SYSDATE,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_OPERADOR,
          IDATIVO = 'N'
    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
      AND NRORG = P_NRORG;
  /* 4 - Inativa os itens e Adicionais do Contrato */
   UPDATE FCT_ITEMCONTRATO
      SET DTULTATU = SYSDATE,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_OPERADOR,
          IDATIVO = 'N'
    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
      AND NRORG = P_NRORG;
  /* 5 - Inativa a parametrização de faturamento dos itens do Contrato */
     UPDATE FCT_PARAMFATITCONT
      SET DTULTATU = SYSDATE,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_OPERADOR,
          IDATIVO = 'N'
    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
      AND NRORG = P_NRORG;
  /* 6 - Inativa os documentos do Contrato */
   UPDATE FCT_CONTRATODOC
      SET DTULTATU = SYSDATE,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_OPERADOR,
          IDATIVO = 'N'
    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
      AND NRORG = P_NRORG;
  /* 7 - Inativa as parametrizações de Reajuste do Contrato */
   UPDATE FCT_REAJUSTCONTR
      SET DTULTATU = SYSDATE,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_OPERADOR,
          IDATIVO = 'N'
    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
      AND NRORG = P_NRORG;
  /* 8 - Inativa os indices das parametrizações de Reajuste do Contrato */
   UPDATE FCT_INDICECONTR
      SET DTULTATU = SYSDATE,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_OPERADOR,
          IDATIVO = 'N'
    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
      AND NRORG = P_NRORG;
  /* 9 - manda excluir as parcelas do faturamento novo */
  FCT_EXCLUIR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG);
  /* 10 - Retira o contrato do agrupamento */
  DELETE FROM FCT_RELACAGRUPAMENTOCONT
  WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
    AND NRORG         = P_NRORG;
END;
/
create or replace PROCEDURE FCT_EXCLUIR_PARCELAS_FATURA (
    P_NRSEQCONTRATO IN FCT_CONTRATO.NRSEQCONTRATO%TYPE,
    P_NRORG         IN NUMBER
)
AS
  V_AGRUPAMENTO  FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
  V_VRVENCIMENTO FCT_FATURACONT.VRVENCIMENTO%TYPE;
BEGIN
    -- VERIFICA SE O CONTRATO ESTÁ LIGADO A UM AGRUPAMENTO
    BEGIN
      SELECT NRAGRUPAMENTO
      INTO V_AGRUPAMENTO
      FROM FCT_RELACAGRUPAMENTOCONT
      WHERE NRSEQCONTRATO = P_NRSEQCONTRATO;
    EXCEPTION WHEN NO_DATA_FOUND THEN
      V_AGRUPAMENTO := NULL;
    END;
      FOR C_PARCAGRUP IN(SELECT PARCELA.NRFATURACONT, PARCELA.VRVENCIMENTO, PARCELA.NRORG, CONT.NRMEDICAOFATURA
                          FROM FCT_FATURACONT PARCELA
                          INNER JOIN FCT_RELACAGRUPCONTFAT CONT
                            ON PARCELA.NRFATURACONT = CONT.NRFATURACONT
                            AND PARCELA.NRORG       = CONT.NRORG
                          WHERE CONT.NRSEQCONTRATO = P_NRSEQCONTRATO
                            AND PARCELA.NRORG      = P_NRORG
                            AND IDSITUACAO         = '1'
                            AND CONT.NRMEDICAOFATURA IS NULL) LOOP
        IF(V_AGRUPAMENTO IS NULL) THEN
            DELETE FROM FCT_RELACAGRUPCONTFAT
            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
               AND NRORG        = P_NRORG;
            DELETE FROM FCT_ITFATURACONT
            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
              AND NRORG         = P_NRORG;
            DELETE FROM FCT_FATURACONT
            WHERE NRFATURACONT  = C_PARCAGRUP.NRFATURACONT
              AND NRORG         = P_NRORG;
        ELSE
            SELECT SUM(VRVENCIMENTO)
            INTO V_VRVENCIMENTO
            FROM FCT_ITFATURACONT
            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
              AND NRORG         = P_NRORG
              AND NRFATURACONT  = C_PARCAGRUP.NRFATURACONT;
            DELETE FROM FCT_RELACAGRUPCONTFAT
            WHERE NRFATURACONT   = C_PARCAGRUP.NRFATURACONT
               AND NRORG         = P_NRORG
               AND NRSEQCONTRATO = P_NRSEQCONTRATO;
            DELETE FROM FCT_ITFATURACONT
            WHERE NRFATURACONT  = C_PARCAGRUP.NRFATURACONT
              AND NRORG         = P_NRORG
              AND NRSEQCONTRATO = P_NRSEQCONTRATO
              AND NRAPURACAO      IS NULL;
            IF(C_PARCAGRUP.VRVENCIMENTO - V_VRVENCIMENTO = 0) THEN
              DELETE FROM FCT_FATURACONT
              WHERE NRFATURACONT = C_PARCAGRUP.NRFATURACONT
                AND NRORG        = P_NRORG;
            ELSE
              UPDATE FCT_FATURACONT
              SET VRVENCIMENTO = VRVENCIMENTO - V_VRVENCIMENTO
              WHERE NRFATURACONT = C_PARCAGRUP.NRFATURACONT
              AND NRORG          = C_PARCAGRUP.NRORG;
            END IF;
        END IF;
    END LOOP;
    DELETE FROM FCT_MEDICAOFATURA
     WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
       AND NRORG         = P_NRORG
       AND IDSITUACAO    = '1';
END;
/
create or replace PROCEDURE FCT_GERAR_PARCELAS_FATURA (
    P_NRSEQCONTRATO IN FCT_CONTRATO.NRSEQCONTRATO%TYPE,
    P_NRORG         IN NUMBER,
    P_CDOPERADOR    IN VARCHAR2
)
AS
    V_QTDIASFATURAMENTO_ANT NUMBER;
    V_DTINICOMPET_ATUAL     DATE;
    V_DTFINCOMPET_ATUAL     DATE;
    V_ULTDIAMES             FCT_COMPETENCIANEGOCONT.NRDIACOMPETINI%TYPE;
    V_NRDIASVENCIMENTO      NUMBER;
    V_QTDIASFATUVENC        NUMBER;
    V_DTVENCIMENTO          DATE;
    V_VRDIFERENCA           FLOAT;
    V_VRVENCIMENTOITEM      FLOAT;
    V_SOMA_VRVENCIMENTOITEM FLOAT;
    V_COUNT_ITEM            NUMBER;
    V_PARAM_ESCOPO          FCT_PARAMFATESC%ROWTYPE;
    V_VRTOTITEMCOMDESC      FLOAT;
    V_VRDESCITEM            FLOAT;
    V_VRPERCDESCITEM        FLOAT;
    V_IDSITUACAO            CHAR(1);
    --NOVO CODIGO
    V_NRFATURACONT          VARCHAR2(20);
    V_NRITFATURACONT        VARCHAR2(20);
    V_NRAGRUPCONTFAT        FCT_RELACAGRUPCONTFAT.NRAGRUPCONTFAT%TYPE;
    V_NRITMEDICAOFATURA     FCT_ITMEDICAOFATURA.NRITMEDICAOFATURA%TYPE;
    V_NRMEDICAOFATURA       FCT_MEDICAOFATURA.NRMEDICAOFATURA%TYPE;
    V_NRMEDVARMEDICAOFATURA FCT_MEDVARMEDICAOFATURA.NRMEDVARMEDICAOFATURA%TYPE;
    V_NRSEQORCAMENTO_ORIGEM FCT_ORCAMENTO.NRSEQORCAMENTO%TYPE;
BEGIN
    -- Manda deletar as parcelas e medições no caso de regeração do faturamento
    FCT_EXCLUIR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG);
    FOR C_NEGOCIACAO IN (
        SELECT NEG.NRSEQCONTRATO,
               NEG.NRTIPOORCAMENTO,
               NEG.IDTPFATURA,
               NEG.VRTOTITEMCOMDESC,
               NVL(CONT.DTINIVIGENCONT, CONT.DTINICIOCONTRATO) AS DTINICIOCONTRATO,
               NVL(CONT.DTFINVIGENCONT, CONT.DTFIMCONTRATO) AS DTFIMCONTRATO,
               NEG.NRNEGOCIACAOCONTRATO,
               NEG.CDFILIALFATURA,
               NEG.NRPARCFATURA,
               NEG.CDTIPOOPERFATURA,
               NEG.CDSERIENF,
               NEG.CDEMPRESA,
               NEG.CDINSCESTA,
               NEG.CDINSCMUNI,
               /*NEG.QTPARCELASFATU,
               NEG.QTDIASAPURACAO,
               NEG.IDTPCALCVENC,
               NEG.NRDIACALCVENC,
               NEG.IDMESCALCVENC,
               NEG.QTDIASFATUVENC,*/
               (SELECT COUNT(*)
                  FROM FCT_ITNEGOCIACAOCONTRATO
                 WHERE NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                   AND NRORG                = NEG.NRORG
                   AND NRITEMORCAMENTOPAI   IS NULL) AS QTITEM
          FROM FCT_NEGOCIACAOCONTRATO NEG
         INNER JOIN FCT_CONTRATO CONT
            ON NEG.NRSEQCONTRATO = CONT.NRSEQCONTRATO
           AND NEG.NRORG         = CONT.NRORG
         WHERE NEG.NRSEQCONTRATO = P_NRSEQCONTRATO
           AND NEG.NRORG         = P_NRORG
    ) LOOP
        /*
        IDTPFATURA
        A = Periodico (valor de parcela fixo)
        X = Periodico (Valor Apurado por Medicao)
        P = Parcelamento (Quantidade de Parcelas)
        */
        IF (C_NEGOCIACAO.IDTPFATURA = 'P') THEN
            V_QTDIASFATURAMENTO_ANT := -1;
            FOR C_PARCELAS IN (
                SELECT ROWNUM AS NRPARCELA,
                       PARCELA.*
                  FROM (SELECT PARC.QTDIASFATURAMENTO,
                               PARC.NRDIAVENCIMENTO,
                               PARC.VRPARCELA
                          FROM FCT_PARCELANEGOCONT PARC
                         WHERE PARC.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                           AND PARC.NRORG                = P_NRORG
                         ORDER BY QTDIASFATURAMENTO) PARCELA
            ) LOOP
                V_DTINICOMPET_ATUAL := C_NEGOCIACAO.DTINICIOCONTRATO + V_QTDIASFATURAMENTO_ANT + 1;
                V_DTFINCOMPET_ATUAL := C_NEGOCIACAO.DTINICIOCONTRATO + C_PARCELAS.QTDIASFATURAMENTO;
                SELECT *
                  INTO V_PARAM_ESCOPO
                  FROM FCT_PARAMFATESC
                 WHERE NRTIPOORCAMENTO = C_NEGOCIACAO.NRTIPOORCAMENTO
                   AND NRORG           = P_NRORG;
                --INICIO: calculo da data de vencimento da NF
                IF (C_PARCELAS.NRDIAVENCIMENTO IS NOT NULL) THEN
                    V_NRDIASVENCIMENTO := NULL;
                    V_QTDIASFATUVENC := NULL;
                    V_DTVENCIMENTO := TO_DATE(LPAD(C_PARCELAS.NRDIAVENCIMENTO, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                    IF (V_DTVENCIMENTO < V_DTFINCOMPET_ATUAL) THEN
                        V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
                    END IF;
                    IF (V_PARAM_ESCOPO.IDTPCALCVENC = '1' AND V_PARAM_ESCOPO.QTDIASFATUVENC IS NOT NULL) THEN
                        V_QTDIASFATUVENC := V_PARAM_ESCOPO.QTDIASFATUVENC;
                    END IF;
                ELSE
                    IF (V_PARAM_ESCOPO.IDTPCALCVENC = '1') THEN --dia fixo
                        V_NRDIASVENCIMENTO := NULL;
                        V_QTDIASFATUVENC := V_PARAM_ESCOPO.QTDIASFATUVENC;
                        --data de vencimento para o mes atual
                        V_DTVENCIMENTO := TO_DATE(LPAD(V_PARAM_ESCOPO.NRDIACALCVENC, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                        IF (V_PARAM_ESCOPO.IDMESCALCVENC = '1') THEN --mes anterior
                            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, -1);
                        ELSIF (V_PARAM_ESCOPO.IDMESCALCVENC = '3') THEN --proximo mes
                            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
                        END IF;
                    ELSE --quantidade de dias apos data de emissao
                        V_DTVENCIMENTO := NULL;
                        V_NRDIASVENCIMENTO := C_PARCELAS.NRDIAVENCIMENTO;
                        V_QTDIASFATUVENC := NULL;
                    END IF;
                END IF;
                --FIM: calculo da data de vencimento da NF
                -- Valida se a parcela gerada será paralisada
                BEGIN
                    SELECT '5' AS IDSITUACAO
                    INTO V_IDSITUACAO
                    FROM FCT_PARAMPARALISACAOCONT
                    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                        AND NRORG       = P_NRORG
                        AND DTRETOMADAFATURA > SYSDATE
                        AND (DTINIPARALISACAO BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL
                            OR (DTRETOMADAFATURA BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL))
                    GROUP BY 1;
                EXCEPTION WHEN NO_DATA_FOUND THEN
                    V_IDSITUACAO := '1';
                END;
                NOVO_CODIGO_SC('FCT_FATURACONT', V_NRFATURACONT, 1, P_NRORG);
                INSERT INTO FCT_FATURACONT (
                    NRFATURACONT,
                    NRSEQCONTRATO,
                    CDFILIALFATURA,
                    NRPARCFATURA,
                    CDTIPOOPERFATURA,
                    CDSERIENF,
                    CDEMPRESA,
                    CDINSCESTA,
                    CDINSCMUNI,
                    IDTPFATURA,
                    IDSITUACAO,
                    DTINICOMPET,
                    DTFINCOMPET,
                    DTLIMITEAPU,
                    DTVENCIMENTO,
                    NRDIASVENCIMENTO,
                    QTDIASFATUVENC,
                    VRVENCIMENTO,
                    VRFATURADO,
                    VRFALTAFATURAR,
                    IDFORMAFATURA,
                    DSJUSTIFICATIVA,
                    NRAPURACAO,
                    NRMEDICAOFATURA,
                    IDALTUSUARIO,
                    IDATIVO,
                    NRORG,
                    DTINCLUSAO,
                    NRORGINCLUSAO,
                    CDOPERINCLUSAO
                )
                VALUES (
                    V_NRFATURACONT,
                    NULL,
                    C_NEGOCIACAO.CDFILIALFATURA,
                    C_NEGOCIACAO.NRPARCFATURA,
                    C_NEGOCIACAO.CDTIPOOPERFATURA,
                    C_NEGOCIACAO.CDSERIENF,
                    C_NEGOCIACAO.CDEMPRESA,
                    C_NEGOCIACAO.CDINSCESTA,
                    C_NEGOCIACAO.CDINSCMUNI,
                    C_NEGOCIACAO.IDTPFATURA,
                    V_IDSITUACAO,
                    V_DTINICOMPET_ATUAL,
                    V_DTFINCOMPET_ATUAL,
                    V_DTFINCOMPET_ATUAL + V_PARAM_ESCOPO.QTDIASAPURACAO,
                    V_DTVENCIMENTO,
                    V_NRDIASVENCIMENTO,
                    V_QTDIASFATUVENC,
                    C_PARCELAS.VRPARCELA,
                    0,
                    C_PARCELAS.VRPARCELA,
                    NULL,
                    NULL,
                    NULL,
                    NULL,
                    'N',
                    'S',
                    P_NRORG,
                    SYSDATE,
                    P_NRORG,
                    P_CDOPERADOR
                );
                NOVO_CODIGO_SC('FCT_RELACAGRUPCONTFAT', V_NRAGRUPCONTFAT, 1, P_NRORG);
                INSERT INTO FCT_RELACAGRUPCONTFAT(
                    NRAGRUPCONTFAT,
                    NRFATURACONT,
                    IDPARCAGRUP,
                    NRSEQCONTRATO,
                    NRORG,
                    IDATIVO,
                    DTINCLUSAO,
                    DTULTATU,
                    NRORGINCLUSAO,
                    CDOPERINCLUSAO,
                    NRORGULTATU,
                    CDOPERULTATU,
                    NRMEDICAOFATURA
                ) VALUES (
                    V_NRAGRUPCONTFAT,
                    V_NRFATURACONT,
                    'N',
                    P_NRSEQCONTRATO,
                    P_NRORG,
                    'S',
                    SYSDATE,
                    NULL,
                    P_NRORG,
                    P_CDOPERADOR,
                    NULL,
                    NULL,
                    NULL
                );
                V_VRDIFERENCA    := C_NEGOCIACAO.VRTOTITEMCOMDESC - C_PARCELAS.VRPARCELA;
                V_VRPERCDESCITEM := (V_VRDIFERENCA/C_NEGOCIACAO.VRTOTITEMCOMDESC) * 100;
                FOR C_ITNEGOCIACAO IN (
                    SELECT ITNEG.NRITEMOCONTRATO,
                           ITNEG.VRTOTITEM,
                           ITNEG.CDPRODFATURA
                      FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                     WHERE ITNEG.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                       AND ITNEG.NRORG                = P_NRORG
                       AND ITNEG.NRITEMOCONTRATO IS NOT NULL
                ) LOOP
                    V_VRVENCIMENTOITEM := C_ITNEGOCIACAO.VRTOTITEM - (C_ITNEGOCIACAO.VRTOTITEM * V_VRPERCDESCITEM / 100);
                    NOVO_CODIGO_SC('FCT_ITFATURACONT', V_NRITFATURACONT, 1, P_NRORG);
                    INSERT INTO FCT_ITFATURACONT (
                        NRITFATURACONT,
                        NRFATURACONT,
                        NRSEQCONTRATO,
                        NRITEMOCONTRATO,
                        CDPRODFATURA,
                        IDSITUACAO,
                        VRVENCIMENTO,
                        VRFATURADO,
                        VRFALTAFATURAR,
                        IDFORMAFATURA,
                        DSJUSTIFICATIVA,
                        NRAPURACAO,
                        IDATIVO,
                        NRORG,
                        DTINCLUSAO,
                        NRORGINCLUSAO,
                        CDOPERINCLUSAO
                    )
                    VALUES (
                        V_NRITFATURACONT,
                        V_NRFATURACONT,
                        P_NRSEQCONTRATO,
                        C_ITNEGOCIACAO.NRITEMOCONTRATO,
                        C_ITNEGOCIACAO.CDPRODFATURA,
                        V_IDSITUACAO,
                        V_VRVENCIMENTOITEM,
                        0,
                        V_VRVENCIMENTOITEM,
                        NULL,
                        NULL,
                        NULL,
                        'S',
                        P_NRORG,
                        SYSDATE,
                        P_NRORG,
                        P_CDOPERADOR
                    );
                END LOOP; --C_ITNEGOCIACAO;
                V_QTDIASFATURAMENTO_ANT := C_PARCELAS.QTDIASFATURAMENTO;
            END LOOP; --C_PARCELAS
        ELSE --C_NEGOCIACAO.IDTPFATURA = A ou X
            FOR C_COMPETENCIA IN (
                SELECT NRDIACOMPETINI,
                       NRDIACOMPETFIN,
                       IDMESCOMPETINI,
                       IDMESCOMPETFIN,
                       QTDIASAPURACAO,
                       IDTPCALCVENC,
                       NRDIACALCVENC,
                       IDMESCALCVENC,
                       QTDIASFATUVENC
                  FROM FCT_COMPETENCIANEGOCONT
                 WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                   AND NRORG                = P_NRORG
            ) LOOP
                V_ULTDIAMES := EXTRACT(DAY FROM(LAST_DAY(C_NEGOCIACAO.DTINICIOCONTRATO)));
                IF V_ULTDIAMES < C_COMPETENCIA.NRDIACOMPETINI THEN
                    V_DTINICOMPET_ATUAL := TO_DATE(LPAD(V_ULTDIAMES, 2, '0') || '/' || TO_CHAR(C_NEGOCIACAO.DTINICIOCONTRATO, 'MM/YYYY'), 'DD/MM/YYYY');
                ELSE
                    V_DTINICOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETINI, 2, '0') || '/' || TO_CHAR(C_NEGOCIACAO.DTINICIOCONTRATO, 'MM/YYYY'), 'DD/MM/YYYY');
                END IF;
                IF V_ULTDIAMES < C_COMPETENCIA.NRDIACOMPETFIN THEN
                    V_DTFINCOMPET_ATUAL := TO_DATE(LPAD(V_ULTDIAMES, 2, '0') || '/' || TO_CHAR(C_NEGOCIACAO.DTINICIOCONTRATO, 'MM/YYYY'), 'DD/MM/YYYY');
                ELSE
                    V_DTFINCOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETFIN, 2, '0') || '/' || TO_CHAR(C_NEGOCIACAO.DTINICIOCONTRATO, 'MM/YYYY'), 'DD/MM/YYYY');
                END IF;
                IF (C_COMPETENCIA.IDMESCOMPETINI = '1') THEN
                    V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, -1);
                ELSIF (C_COMPETENCIA.IDMESCOMPETINI = '3') THEN
                    V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, 1);
                END IF;
                IF (C_COMPETENCIA.IDMESCOMPETFIN = '1') THEN
                    V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, -1);
                ELSIF (C_COMPETENCIA.IDMESCOMPETFIN = '3') THEN
                    V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, 1);
                END IF;
                WHILE (V_DTINICOMPET_ATUAL <= C_NEGOCIACAO.DTFIMCONTRATO) LOOP
                    V_DTINICOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETINI, 2, '0') || '/' || TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                    IF (V_DTINICOMPET_ATUAL < C_NEGOCIACAO.DTINICIOCONTRATO) THEN
                        IF (V_DTFINCOMPET_ATUAL < C_NEGOCIACAO.DTINICIOCONTRATO) THEN
                            V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, 1);
                            V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, 1);
                            CONTINUE;
                        ELSE
                            V_DTINICOMPET_ATUAL := C_NEGOCIACAO.DTINICIOCONTRATO;
                        END IF;
                    END IF;
                    IF(V_DTFINCOMPET_ATUAL > C_NEGOCIACAO.DTFIMCONTRATO) THEN
                        V_DTFINCOMPET_ATUAL := C_NEGOCIACAO.DTFIMCONTRATO;
                    END IF;
                    --INICIO: calculo da data de vencimento da NF
                    --dia fixo
                    IF (C_COMPETENCIA.IDTPCALCVENC = '1') THEN
                        V_DTVENCIMENTO := TO_DATE(LPAD(C_COMPETENCIA.NRDIACALCVENC, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                        IF (C_COMPETENCIA.IDMESCALCVENC = '1') THEN --mes anterior
                            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, -1);
                        ELSIF (C_COMPETENCIA.IDMESCALCVENC = '3') THEN --proximo mes
                            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
                        END IF;
                        V_NRDIASVENCIMENTO := NULL;
                        V_QTDIASFATUVENC := C_COMPETENCIA.QTDIASFATUVENC;
                    ELSE --quantidade de dias apos data de emissao
                        V_DTVENCIMENTO := NULL;
                        V_NRDIASVENCIMENTO := C_COMPETENCIA.NRDIACALCVENC;
                        V_QTDIASFATUVENC := NULL;
                    END IF;
                    --FIM: calculo da data de vencimento da NF
                    BEGIN
                        SELECT DESCPER.VRTOTITEMCOMDESC, DESCPER.VRDESCITEM
                          INTO V_VRTOTITEMCOMDESC, V_VRDESCITEM
                          FROM (SELECT VRTOTITEMCOMDESC,
                                       VRPERCDESCITEM,
                                       VRDESCITEM,
                                       QTMESESDESC,
                                       DTFINALVALIDADEDESC
                                  FROM FCT_DESCPERIODONEGOCONT
                                 WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                   AND NRORG                = P_NRORG
                                   AND V_DTINICOMPET_ATUAL  < DTFINALVALIDADEDESC
                                 ORDER BY DTFINALVALIDADEDESC) DESCPER
                         WHERE ROWNUM = 1;
                    EXCEPTION WHEN NO_DATA_FOUND THEN
                        V_VRTOTITEMCOMDESC := C_NEGOCIACAO.VRTOTITEMCOMDESC;
                        V_VRDESCITEM       := 0;
                    END;
                    IF (V_VRTOTITEMCOMDESC > 0) THEN
                        -- Valida se a parcela gerada será paralisada
                        BEGIN
                            SELECT '5' AS IDSITUACAO
                            INTO V_IDSITUACAO
                            FROM FCT_PARAMPARALISACAOCONT
                            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                AND NRORG       = P_NRORG
                                AND DTRETOMADAFATURA > SYSDATE
                                AND (DTINIPARALISACAO BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL
                                    OR (DTRETOMADAFATURA BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL))
                            GROUP BY 1;
                        EXCEPTION WHEN NO_DATA_FOUND THEN
                            V_IDSITUACAO := '1';
                        END;
                        IF (C_NEGOCIACAO.IDTPFATURA = 'A') THEN
                            NOVO_CODIGO_SC('FCT_FATURACONT', V_NRFATURACONT, 1, P_NRORG);
                            INSERT INTO FCT_FATURACONT (
                                NRFATURACONT,
                                NRSEQCONTRATO,
                                CDFILIALFATURA,
                                NRPARCFATURA,
                                CDTIPOOPERFATURA,
                                CDSERIENF,
                                CDEMPRESA,
                                CDINSCESTA,
                                CDINSCMUNI,
                                IDTPFATURA,
                                IDSITUACAO,
                                DTINICOMPET,
                                DTFINCOMPET,
                                DTLIMITEAPU,
                                DTVENCIMENTO,
                                NRDIASVENCIMENTO,
                                QTDIASFATUVENC,
                                VRVENCIMENTO,
                                VRFATURADO,
                                VRFALTAFATURAR,
                                IDFORMAFATURA,
                                DSJUSTIFICATIVA,
                                NRAPURACAO,
                                NRMEDICAOFATURA,
                                IDALTUSUARIO,
                                IDATIVO,
                                NRORG,
                                DTINCLUSAO,
                                NRORGINCLUSAO,
                                CDOPERINCLUSAO
                            )
                            VALUES (
                                V_NRFATURACONT,
                                NULL,
                                C_NEGOCIACAO.CDFILIALFATURA,
                                C_NEGOCIACAO.NRPARCFATURA,
                                C_NEGOCIACAO.CDTIPOOPERFATURA,
                                C_NEGOCIACAO.CDSERIENF,
                                C_NEGOCIACAO.CDEMPRESA,
                                C_NEGOCIACAO.CDINSCESTA,
                                C_NEGOCIACAO.CDINSCMUNI,
                                C_NEGOCIACAO.IDTPFATURA,
                                V_IDSITUACAO,
                                V_DTINICOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL + C_COMPETENCIA.QTDIASAPURACAO,
                                V_DTVENCIMENTO,
                                V_NRDIASVENCIMENTO,
                                V_QTDIASFATUVENC,
                                V_VRTOTITEMCOMDESC,
                                0,
                                V_VRTOTITEMCOMDESC,
                                NULL,
                                NULL,
                                NULL,
                                NULL,
                                'N',
                                'S',
                                P_NRORG,
                                SYSDATE,
                                P_NRORG,
                                P_CDOPERADOR
                            );
                            NOVO_CODIGO_SC('FCT_RELACAGRUPCONTFAT', V_NRAGRUPCONTFAT, 1, P_NRORG);
                            INSERT INTO FCT_RELACAGRUPCONTFAT(
                                NRAGRUPCONTFAT,
                                NRFATURACONT,
                                IDPARCAGRUP,
                                NRSEQCONTRATO,
                                NRORG,
                                IDATIVO,
                                DTINCLUSAO,
                                DTULTATU,
                                NRORGINCLUSAO,
                                CDOPERINCLUSAO,
                                NRORGULTATU,
                                CDOPERULTATU,
                                NRMEDICAOFATURA
                            ) VALUES (
                                V_NRAGRUPCONTFAT,
                                V_NRFATURACONT,
                                'N',
                                P_NRSEQCONTRATO,
                                P_NRORG,
                                'S',
                                SYSDATE,
                                NULL,
                                P_NRORG,
                                P_CDOPERADOR,
                                NULL,
                                NULL,
                                NULL
                            );
                            V_VRPERCDESCITEM := (V_VRDESCITEM/V_VRTOTITEMCOMDESC) * 100;
                            FOR C_ITNEGOCIACAO IN (
                                SELECT ITNEG.NRITEMOCONTRATO,
                                       ITNEG.VRTOTITEM,
                                       ITNEG.CDPRODFATURA
                                  FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                                 WHERE ITNEG.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                   AND ITNEG.NRORG                = P_NRORG
                                   AND ITNEG.NRITEMOCONTRATO IS NOT NULL
                            ) LOOP
                                V_VRVENCIMENTOITEM := C_ITNEGOCIACAO.VRTOTITEM - (C_ITNEGOCIACAO.VRTOTITEM * V_VRPERCDESCITEM/100);
                                NOVO_CODIGO_SC('FCT_ITFATURACONT', V_NRITFATURACONT, 1, P_NRORG);
                                INSERT INTO FCT_ITFATURACONT (
                                    NRITFATURACONT,
                                    NRFATURACONT,
                                    NRSEQCONTRATO,
                                    NRITEMOCONTRATO,
                                    CDPRODFATURA,
                                    IDSITUACAO,
                                    VRVENCIMENTO,
                                    VRFATURADO,
                                    VRFALTAFATURAR,
                                    IDFORMAFATURA,
                                    DSJUSTIFICATIVA,
                                    NRAPURACAO,
                                    IDATIVO,
                                    NRORG,
                                    DTINCLUSAO,
                                    NRORGINCLUSAO,
                                    CDOPERINCLUSAO
                                )
                                VALUES (
                                    V_NRITFATURACONT,
                                    V_NRFATURACONT,
                                    P_NRSEQCONTRATO,
                                    C_ITNEGOCIACAO.NRITEMOCONTRATO,
                                    C_ITNEGOCIACAO.CDPRODFATURA,
                                    V_IDSITUACAO,
                                    V_VRVENCIMENTOITEM,
                                    0,
                                    V_VRVENCIMENTOITEM,
                                    NULL,
                                    NULL,
                                    NULL,
                                    'S',
                                    P_NRORG,
                                    SYSDATE,
                                    P_NRORG,
                                    P_CDOPERADOR
                                );
                            END LOOP; --C_ITNEGOCIACAO
                        ELSE --C_NEGOCIACAO.IDTPFATURA = X
                            NOVO_CODIGO_SC('FCT_MEDICAOFATURA', V_NRMEDICAOFATURA, 1, P_NRORG);
                            INSERT INTO FCT_MEDICAOFATURA (
                                NRMEDICAOFATURA,
                                NRSEQCONTRATO,
                                CDFILIALFATURA,
                                NRPARCFATURA,
                                CDTIPOOPERFATURA,
                                CDSERIENF,
                                CDEMPRESA,
                                CDINSCESTA,
                                CDINSCMUNI,
                                IDSITUACAO,
                                DTINICOMPET,
                                DTFINCOMPET,
                                DTLIMITEAPU,
                                DTVENCIMENTO,
                                NRDIASVENCIMENTO,
                                QTDIASFATUVENC,
                                VRMEDICAO,
                                IDATIVO,
                                NRORG,
                                DTINCLUSAO,
                                NRORGINCLUSAO,
                                CDOPERINCLUSAO
                            )
                            VALUES (
                                V_NRMEDICAOFATURA,
                                P_NRSEQCONTRATO,
                                C_NEGOCIACAO.CDFILIALFATURA,
                                C_NEGOCIACAO.NRPARCFATURA,
                                C_NEGOCIACAO.CDTIPOOPERFATURA,
                                C_NEGOCIACAO.CDSERIENF,
                                C_NEGOCIACAO.CDEMPRESA,
                                C_NEGOCIACAO.CDINSCESTA,
                                C_NEGOCIACAO.CDINSCMUNI,
                                V_IDSITUACAO,
                                V_DTINICOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL + C_COMPETENCIA.QTDIASAPURACAO,
                                V_DTVENCIMENTO,
                                V_NRDIASVENCIMENTO,
                                V_QTDIASFATUVENC,
                                0,
                                'S',
                                P_NRORG,
                                SYSDATE,
                                P_NRORG,
                                P_CDOPERADOR
                            );
                            --Buscar o codigo da proposta que gerou o contrato
                            BEGIN
                                SELECT NRSEQORCAMENTO
                                  INTO V_NRSEQORCAMENTO_ORIGEM
                                  FROM FCT_REFEORCACONT
                                 WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                   AND NRORG         = P_NRORG;
                            EXCEPTION WHEN NO_DATA_FOUND THEN
                                RAISE_APPLICATION_ERROR('-20001', 'CONTRATO_SEM_PROPOSTA');
                            END;
                            V_VRPERCDESCITEM := (V_VRDESCITEM/V_VRTOTITEMCOMDESC) * 100;
                            FOR C_ITNEGOCIACAO IN (
                                SELECT ITNEG.NRITEMOCONTRATO,
                                       ITNEG.VRTOTITEM,
                                       ITNEG.CDPRODFATURA,
                                       ITNEG.CDSERVORCA
                                  FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                                 WHERE ITNEG.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                   AND ITNEG.NRORG                = P_NRORG
                                   AND ITNEG.NRITEMOCONTRATO IS NOT NULL
                            ) LOOP
                                V_VRVENCIMENTOITEM := C_ITNEGOCIACAO.VRTOTITEM - (C_ITNEGOCIACAO.VRTOTITEM * V_VRPERCDESCITEM/100);
                                NOVO_CODIGO_SC('FCT_ITMEDICAOFATURA', V_NRITMEDICAOFATURA, 1, P_NRORG);
                                INSERT INTO FCT_ITMEDICAOFATURA (
                                    NRITMEDICAOFATURA,
                                    NRMEDICAOFATURA,
                                    NRSEQCONTRATO,
                                    NRITEMOCONTRATO,
                                    CDSERVORCA,
                                    CDPRODFATURA,
                                    IDSITUACAO,
                                    VRTOTITEMCONT,
                                    IDATIVO,
                                    NRORG,
                                    DTINCLUSAO,
                                    NRORGINCLUSAO,
                                    CDOPERINCLUSAO,
                                    DTULTATU,
                                    NRORGULTATU,
                                    CDOPERULTATU
                                )
                                VALUES (
                                    V_NRITMEDICAOFATURA,
                                    V_NRMEDICAOFATURA,
                                    P_NRSEQCONTRATO,
                                    C_ITNEGOCIACAO.NRITEMOCONTRATO,
                                    C_ITNEGOCIACAO.CDSERVORCA,
                                    C_ITNEGOCIACAO.CDPRODFATURA,
                                    V_IDSITUACAO,
                                    V_VRVENCIMENTOITEM,
                                    'S',
                                    P_NRORG,
                                    SYSDATE,
                                    P_NRORG,
                                    P_CDOPERADOR,
                                    NULL,
                                    NULL,
                                    NULL
                                );
                                FOR C_MEDIDASIT IN (
                                    SELECT REL.IDELEMENTORAIZ,
                                           REL.CDTPMEDIDAVARIAVEL,
                                           REL.QTMEDIDAVARIAVEL,
                                           NVL(REL.QTFRANQUIA, 0) AS QTFRANQUIA,
                                           VAR.IDMULTIPVARIACAO
                                    FROM FCT_RELACMEDIDAPROPOSTA REL
                                    LEFT JOIN FCT_VARPRECBASESERVORCA VAR
                                        ON REL.NRSEQORCAMENTO      = VAR.NRSEQORCAMENTO
                                        AND REL.CDTPMEDIDAVARIAVEL = VAR.CDTPMEDIDAVARIAVEL
                                        AND REL.NRORG              = VAR.NRORG
                                    WHERE REL.NRSEQORCAMENTO   = V_NRSEQORCAMENTO_ORIGEM
                                        AND REL.NRORG          = P_NRORG
                                        AND VAR.CDSERVORCA     = C_ITNEGOCIACAO.CDSERVORCA
                                        AND REL.QTMEDIDAVARIAVEL BETWEEN VAR.QTMEDIDAINIVARIACAO AND VAR.QTMEDIDAFIMVARIACAO
                                    ORDER BY REL.IDELEMENTORAIZ
                                ) LOOP
                                    NOVO_CODIGO_SC('FCT_MEDVARMEDICAOFATURA', V_NRMEDVARMEDICAOFATURA, 1, P_NRORG);
                                    INSERT INTO FCT_MEDVARMEDICAOFATURA (
                                        NRMEDVARMEDICAOFATURA,
                                        NRMEDICAOFATURA,
                                        IDELEMENTORAIZ,
                                        CDSERVORCA,
                                        CDTPMEDIDAVARIAVEL,
                                        QTMEDIDAVARIAVEL,
                                        QTMEDIDAMEDICAO,
                                        QTFRANQUIA,
                                        IDMULTIPVARIACAO,
                                        IDATIVO,
                                        NRORG,
                                        DTINCLUSAO,
                                        NRORGINCLUSAO,
                                        CDOPERINCLUSAO
                                    )
                                    VALUES (
                                        V_NRMEDVARMEDICAOFATURA,
                                        V_NRMEDICAOFATURA,
                                        C_MEDIDASIT.IDELEMENTORAIZ,
                                        C_ITNEGOCIACAO.CDSERVORCA,
                                        C_MEDIDASIT.CDTPMEDIDAVARIAVEL,
                                        C_MEDIDASIT.QTMEDIDAVARIAVEL,
                                        C_MEDIDASIT.QTMEDIDAVARIAVEL - C_MEDIDASIT.QTFRANQUIA,
                                        C_MEDIDASIT.QTFRANQUIA,
                                        C_MEDIDASIT.IDMULTIPVARIACAO,
                                        'S',
                                        P_NRORG,
                                        SYSDATE,
                                        P_NRORG,
                                        P_CDOPERADOR
                                    );
                                END LOOP;  -- C_MEDIDASIT
                            END LOOP; -- C_ITNEGOCIACAO
                        END IF; --C_NEGOCIACAO.IDTPFATURA = A
                    END IF; --V_VRTOTITEMCOMDESC > 0
                    V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, 1);
                    V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, 1);
                END LOOP; --WHILE
            END LOOP; --C_COMPETENCIA
        END IF; --C_NEGOCIACAO.IDTPFATURA = P
    END LOOP; --C_NEGOCIACAO
END;