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,
             NVL(ORCAMOD.NRSEQMODCONTRA, TP.NRSEQMODCONTRATO) AS NRSEQMODCONTRATO,
             O.NRPARCNEGOCIO,
             O.QTDIASCONTRATO,
             O.DTREFORCAMENTO,
             ORCAMOD.IDUTILIZAHIERSERV,
             O.CDOPERRESPONSAVEL
        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, 'REFERENTE A ORC '||C_ORCAMENTO.NRORCAMENTO, 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_GERAR_PARCELAS_APURACAO (
    P_NRSEQCONTRATO   IN VARCHAR2,
    P_NRMEDICAOFATURA IN VARCHAR2,
    P_NRORG           IN NUMBER,
    P_CDOPERADOR      IN VARCHAR2
)
AS
    V_NRFATURACONT       NOVOCODIGO.NRSEQUENCIAL%TYPE;
    V_NRITFATURACONT     NOVOCODIGO.NRSEQUENCIAL%TYPE;
    V_VALIDAAPUR         NUMBER;
    V_AGRUPAMENTO        FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
    V_NRFATURACONTAGRUP  FCT_FATURACONT.NRFATURACONT%TYPE;
    V_DTINICOMPET        FCT_FATURACONT.DTINICOMPET%TYPE;
    V_DTFINCOMPET        FCT_FATURACONT.DTFINCOMPET%TYPE;
    V_VRVENCIMENTO       FCT_FATURACONT.VRVENCIMENTO%TYPE;
    V_TOTALPARCGERADAS   INTEGER;
    V_TOTALPARCELA       INTEGER;
    V_NRAGRUPCONTFAT     FCT_RELACAGRUPCONTFAT.NRAGRUPCONTFAT%TYPE;
    V_IDPARCAGRUP        FCT_RELACAGRUPCONTFAT.IDPARCAGRUP%TYPE;
    V_NRSEQCONTRATO      FCT_CONTRATO.NRSEQCONTRATO%TYPE;
BEGIN
    FOR C_APUR IN (SELECT NRMEDICAOFATURA, NRSEQCONTRATO, CDFILIALFATURA, NRPARCFATURA,
                       CDTIPOOPERFATURA, CDSERIENF, CDEMPRESA, CDINSCESTA, CDINSCMUNI,
                       IDSITUACAO, DTINICOMPET, DTFINCOMPET, DTLIMITEAPU, DTVENCIMENTO,
                       NRDIASVENCIMENTO, QTDIASFATUVENC, VRMEDICAO, IDATIVO, NRORG
                    FROM FCT_MEDICAOFATURA
                    WHERE ((INSTR(P_NRSEQCONTRATO, '_' || TO_CHAR(FCT_MEDICAOFATURA.NRSEQCONTRATO) || '_') > 0) OR (P_NRSEQCONTRATO IS NULL))
                       AND ((INSTR(P_NRMEDICAOFATURA, '_' || TO_CHAR(FCT_MEDICAOFATURA.NRMEDICAOFATURA) || '_') > 0) OR (P_NRMEDICAOFATURA IS NULL))
                       AND NRORG      = P_NRORG
                       AND IDSITUACAO = '3') LOOP
        V_DTINICOMPET   := C_APUR.DTINICOMPET;
        V_DTFINCOMPET   := C_APUR.DTFINCOMPET;
        V_VRVENCIMENTO  := C_APUR.VRMEDICAO;
        V_IDPARCAGRUP   := 'N';
        V_NRSEQCONTRATO := NULL;
        -- VERIFICA SE O CONTRATO ESTÁ LIGADO A UM AGRUPAMENTO
        BEGIN
          SELECT NRAGRUPAMENTO
          INTO V_AGRUPAMENTO
          FROM FCT_RELACAGRUPAMENTOCONT
          WHERE NRSEQCONTRATO = C_APUR.NRSEQCONTRATO;
        EXCEPTION WHEN NO_DATA_FOUND THEN
          V_AGRUPAMENTO := NULL;
        END;
        IF(V_AGRUPAMENTO IS NOT NULL) THEN
            -- VERIFICA SE EXISTEM PARCELAS CRIADAS PARA ELE
            BEGIN
                SELECT DISTINCT PARCELA.NRFATURACONT
                INTO V_NRFATURACONTAGRUP
                FROM FCT_FATURACONT PARCELA
                JOIN FCT_RELACAGRUPCONTFAT RELACFAT
                  ON PARCELA.NRFATURACONT = RELACFAT.NRFATURACONT
                  AND PARCELA.NRORG       = RELACFAT.NRORG
                JOIN FCT_RELACAGRUPAMENTOCONT RELACCONT
                  ON RELACFAT.NRSEQCONTRATO = RELACCONT.NRSEQCONTRATO
                  AND RELACFAT.NRORG        = RELACCONT.NRORG
                JOIN FCT_AGRUPAMENTO AGRUP
                  ON RELACCONT.NRAGRUPAMENTO = AGRUP.NRAGRUPAMENTO
                  AND RELACCONT.NRORG        = AGRUP.NRORG
                WHERE AGRUP.NRAGRUPAMENTO   = V_AGRUPAMENTO
                    AND PARCELA.DTINICOMPET = TO_CHAR(V_DTINICOMPET, 'DD/MM/YYYY')
                    AND PARCELA.DTFINCOMPET = TO_CHAR(V_DTFINCOMPET, 'DD/MM/YYYY')
                    AND IDTPFATURA          = 'X'
                    AND IDSITUACAO          = '1';
            EXCEPTION WHEN NO_DATA_FOUND THEN
              V_NRFATURACONTAGRUP := NULL;
            END;
            IF(V_NRFATURACONTAGRUP IS NULL) THEN
              V_VALIDAAPUR := 0;
            ELSE
                V_VALIDAAPUR     := 1;
                V_NRFATURACONT   := V_NRFATURACONTAGRUP;
                V_IDPARCAGRUP    := 'S';
            END IF;
        ELSE
            BEGIN
                SELECT COUNT(*)
                INTO V_VALIDAAPUR
                FROM FCT_RELACAGRUPCONTFAT RELACFAT
                WHERE RELACFAT.NRMEDICAOFATURA = C_APUR.NRMEDICAOFATURA
                  AND RELACFAT.NRSEQCONTRATO   = C_APUR.NRSEQCONTRATO
                  AND RELACFAT.NRORG           = P_NRORG;
            EXCEPTION WHEN NO_DATA_FOUND THEN
                V_VALIDAAPUR := 0;
            END;
        END IF;
        IF (V_VALIDAAPUR = 0) 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_APUR.CDFILIALFATURA,
                C_APUR.NRPARCFATURA,
                C_APUR.CDTIPOOPERFATURA,
                C_APUR.CDSERIENF,
                C_APUR.CDEMPRESA,
                C_APUR.CDINSCESTA,
                C_APUR.CDINSCMUNI,
                'X',
                '1',
                V_DTINICOMPET,
                V_DTFINCOMPET,
                C_APUR.DTLIMITEAPU,
                C_APUR.DTVENCIMENTO,
                C_APUR.NRDIASVENCIMENTO,
                C_APUR.QTDIASFATUVENC,
                V_VRVENCIMENTO,
                0,
                V_VRVENCIMENTO,
                NULL,
                NULL,
                NULL,
                NULL,
                'N',
                'S',
                P_NRORG,
                SYSDATE,
                P_NRORG,
                P_CDOPERADOR
            );
        ELSE
            IF(V_VALIDAAPUR = 1) THEN
                UPDATE FCT_FATURACONT
                SET VRVENCIMENTO  = VRVENCIMENTO   + V_VRVENCIMENTO,
                   VRFALTAFATURAR = VRFALTAFATURAR + V_VRVENCIMENTO,
                   DTINICOMPET    = V_DTINICOMPET,
                   DTFINCOMPET    = V_DTFINCOMPET
                WHERE NRFATURACONT = V_NRFATURACONT
                  AND NRORG        = P_NRORG;
            END IF;
        END IF;
        UPDATE FCT_MEDICAOFATURA
            SET IDSITUACAO  = '4',
               NRORGULTATU  = P_NRORG,
               DTULTATU     = SYSDATE,
               CDOPERULTATU = P_CDOPERADOR
        WHERE NRMEDICAOFATURA = C_APUR.NRMEDICAOFATURA
            AND NRORG         = P_NRORG;
        NOVO_CODIGO_SC('FCT_RELACAGRUPCONTFAT', V_NRAGRUPCONTFAT, 1, P_NRORG);
        INSERT INTO FCT_RELACAGRUPCONTFAT (
            NRAGRUPCONTFAT,     NRFATURACONT, IDPARCAGRUP,  NRSEQCONTRATO,
            NRORG,              IDATIVO,      DTINCLUSAO,   DTULTATU,
            CDOPERINCLUSAO,     NRORGULTATU,  CDOPERULTATU, NRMEDICAOFATURA,
            NRORGINCLUSAO
        ) VALUES (
            V_NRAGRUPCONTFAT,     V_NRFATURACONT, V_IDPARCAGRUP,       C_APUR.NRSEQCONTRATO,
            C_APUR.NRORG,         'S',            SYSDATE,             NULL,
            P_CDOPERADOR,          NULL,          NULL,                C_APUR.NRMEDICAOFATURA,
            C_APUR.NRORG
        );
        IF (V_IDPARCAGRUP = 'S') THEN
          UPDATE FCT_RELACAGRUPCONTFAT
          SET IDPARCAGRUP = 'S'
          WHERE NRFATURACONT = V_NRFATURACONT
              AND NRORG      = P_NRORG;
        END IF;
        FOR C_ITENS IN (SELECT NRITMEDICAOFATURA, NRMEDICAOFATURA, NRSEQCONTRATO, NRITEMOCONTRATO, CDSERVORCA,
                            CDPRODFATURA, IDSITUACAO, VRTOTITEMCONT, IDATIVO, NRORG
                        FROM FCT_ITMEDICAOFATURA
                        WHERE NRMEDICAOFATURA = C_APUR.NRMEDICAOFATURA
                            AND NRSEQCONTRATO = C_APUR.NRSEQCONTRATO
                            AND NRORG         = P_NRORG) LOOP
            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, C_ITENS.NRSEQCONTRATO, C_ITENS.NRITEMOCONTRATO, C_ITENS.CDPRODFATURA, '1',
                C_ITENS.VRTOTITEMCONT, 0, C_ITENS.VRTOTITEMCONT, NULL, NULL, NULL,
                'S', P_NRORG, SYSDATE, P_NRORG, P_CDOPERADOR
            );
        END LOOP;
    END LOOP;
END;
/
create or replace PROCEDURE FCT_APURAR_FATURAMENTO
  (P_NRORG IN NUMBER,
   P_NRSEQCONTRATO IN VARCHAR2,
   P_NRPARCNEGOCIO IN VARCHAR2,
   P_CDOPERINCLUSAO IN FCT_APURACAO.CDOPERINCLUSAO%TYPE,
   P_DATAINI IN DATE,
   P_DATAFIN IN DATE,
   P_NRFATURACONT IN VARCHAR2,
   P_NRGRUPOFATURA IN VARCHAR2,
   P_NRRATEIOITEMVENC IN VARCHAR2 DEFAULT NULL,
   P_RETORNO OUT VARCHAR2,
   P_RETORNOERRO OUT VARCHAR2)
AS
   V_NRAPURACAO      VARCHAR2(20);
   V_VRVENCIMENTO    FLOAT;
   V_EMPRESA         VARCHAR2(02);
   V_GRFATUR         NUMBER;
   V_TPOPERFAT       VARCHAR2(02);
   V_TPSERIENF       VARCHAR2(05);
   V_PRODFAT         VARCHAR2(30);
   V_NMITEMCONTRATO  VARCHAR2(60);
   V_NMPRODFAT       VARCHAR2(50);
   V_NRLANCTONF      VARCHAR2(10);
   V_CDCLIENTE       VARCHAR2(21);
   V_PRXLANCESTQ     VARCHAR2(10);
   V_TPORCA          NUMBER;
   VD_SERIE          VARCHAR2(05);
   V_RETORN          VARCHAR2(05);
   V_TESTAPUR        VARCHAR2(30);
   V_TESTAPUR2       VARCHAR2(30);
   V_APURA           FLOAT;
   V_DTEMISS         DATE;
   V_TPEMISSNF       VARCHAR2(01);
   V_DIAEMISSNF      VARCHAR2(02);
   V_DADOADIC        VARCHAR2(03);
   V_VENCIMENTO      DATE;
   V_DTINIREFFAT     DATE;
   V_DTFINREFFAT     DATE;
   V_NFCRIADA        VARCHAR2(3600);
   V_MEDPREVISTA     INTEGER;
   V_QTPRODNOTA      INTEGER;
   V_TESTAITEM       INTEGER;
   V_NRSEQIRPROD     VARCHAR2(4);
   V_FILIAL          VARCHAR2(4);
   V_VRCONTITEM      FLOAT;
   V_VRBRUTITEM      FLOAT;
   V_VRPERCRATEIO    FLOAT;
   V_VRRATEIO        FLOAT;
   V_COUNTRATEIO     INTEGER;
   V_VRNOTAFISC      FLOAT;
   V_VRFALTAFATURAR  FLOAT;
   V_IDSITUACAO  CHAR(1);
   V_DSSERVORCANF    VARCHAR2(4000);
   V_PARCELAS        VARCHAR2(30);
   V_NRLANCTONF_EXISTE NOTAFISCAL.NRLANCTONF%TYPE;
   V_IDFATCONTJUNT    FCT_RELACAGRUPAMENTOCONT.IDFATCONTJUNT%TYPE;
   V_NRAPURACAOFATURA FCT_RELACAPURACAOFATURA.NRAPURACAOFATURA%TYPE;
   V_APURACAOCONLUIDA VARCHAR2(1);
   V_CDINSCESTA       VARCHAR2(16);
   V_CDINSCMUNI       VARCHAR2(16);
   V_EXISTE_SERIE     NUMBER;
BEGIN
 /*
    ERROS
    -20001 - SEM_CLIENTE = Cliente para faturamento nao encontrado
    -20002 - FK_SERIENF = Serie de NF nao esta relacionada com a inscricao estadual e municipal da filial informada
    */
   V_NFCRIADA         := NULL;
   V_IDFATCONTJUNT    := NULL;
   V_APURACAOCONLUIDA := NULL;
   /* Realiza a busca dos dados do Faturamento */
   FOR C_APUR IN (SELECT DISTINCT FCT_FATURACONT.NRFATURACONT, IDFATCONTJUNT, DECODE(IDPARCAGRUP, 'N', FCT_CONTRATO.NRCONTRATOFCT, 'AGRUPAMENTO DE CONTRATOS') AS NRCONTRATOFCT, TO_CHAR(FCT_CONTRATO.DSOBSERVACAOCONT) AS DSOBSERVACAOCONT,
                         FCT_FATURACONT.NRGRUPOFATURA, FCT_FATURACONT.CDFILIALFATURA, FCT_FATURACONT.NRPARCFATURA, FCT_FATURACONT.IDTPFATURA,
                         FCT_FATURACONT.IDSITUACAO, FCT_FATURACONT.DTINICOMPET, FCT_FATURACONT.DTFINCOMPET, FCT_FATURACONT.DTLIMITEAPU,
                         FCT_FATURACONT.DTVENCIMENTO, FCT_FATURACONT.NRDIASVENCIMENTO, FCT_FATURACONT.QTDIASFATUVENC,
                         FCT_FATURACONT.CDTIPOOPERFATURA, FCT_FATURACONT.CDSERIENF,
                         NVL((SELECT SUM(VRVENCIMENTO) FROM FCT_ITFATURACONT WHERE NRSEQCONTRATO IN(SELECT NRSEQCONTRATO
                              FROM FCT_RELACAGRUPAMENTOCONT WHERE NRAGRUPAMENTO = AGRUPCONT.NRAGRUPAMENTO
                                AND IDFATCONTJUNT = AGRUPCONT.IDFATCONTJUNT)), FCT_FATURACONT.VRVENCIMENTO) AS VRVENCIMENTO, FCT_FATURACONT.VRFATURADO, FCT_FATURACONT.VRFALTAFATURAR, FCT_FATURACONT.IDFORMAFATURA, TO_CHAR(FCT_FATURACONT.DSJUSTIFICATIVA) AS DSJUSTIFICATIVA,
                         FCT_FATURACONT.NRAPURACAO, FCT_FATURACONT.NRMEDICAOFATURA, FCT_FATURACONT.IDATIVO, FCT_FATURACONT.NRORG
                    FROM FCT_FATURACONT
                    INNER JOIN FCT_RELACAGRUPCONTFAT AGRUPFAT
                      ON AGRUPFAT.NRFATURACONT = FCT_FATURACONT.NRFATURACONT
                      AND AGRUPFAT.NRORG       = FCT_FATURACONT.NRORG
                    LEFT JOIN FCT_RELACAGRUPAMENTOCONT AGRUPCONT
                      ON AGRUPFAT.NRSEQCONTRATO = AGRUPCONT.NRSEQCONTRATO
                      AND AGRUPFAT.NRORG       = AGRUPCONT.NRORG
                    JOIN FCT_CONTRATO
                      ON FCT_CONTRATO.NRSEQCONTRATO = AGRUPFAT.NRSEQCONTRATO
                     AND FCT_CONTRATO.NRORG         = AGRUPFAT.NRORG
                   WHERE (FCT_FATURACONT.NRORG = P_NRORG)
                     AND ((INSTR(P_NRSEQCONTRATO, '_' || TO_CHAR(AGRUPFAT.NRSEQCONTRATO) || '_') > 0) OR (P_NRSEQCONTRATO IS NULL))
                     AND ((INSTR(P_NRPARCNEGOCIO, '_' || TO_CHAR(FCT_FATURACONT.NRPARCFATURA) || '_') > 0) OR (P_NRPARCNEGOCIO IS NULL))
                     AND ((INSTR(P_NRFATURACONT, '_' || TO_CHAR(FCT_FATURACONT.NRFATURACONT) || '_') > 0) OR (P_NRFATURACONT IS NULL))
                     AND ((TRUNC(TO_DATE(FCT_FATURACONT.DTINICOMPET)) >= TRUNC(TO_DATE(P_DATAINI))) OR (P_DATAINI IS NULL))
                     AND ((TRUNC(TO_DATE(FCT_FATURACONT.DTFINCOMPET)) <= TRUNC(TO_DATE(P_DATAFIN))) OR (P_DATAFIN IS NULL))
                     AND (FCT_FATURACONT.IDSITUACAO = '1')) LOOP
      /*Preenche Filial*/
        V_FILIAL    := C_APUR.CDFILIALFATURA;
        V_TPOPERFAT := C_APUR.CDTIPOOPERFATURA;
        V_TPSERIENF := C_APUR.CDSERIENF;
      /* Recebe empresa para faturamento */
      SELECT CDEMPRESA
        INTO V_EMPRESA
        FROM FILIAL
       WHERE CDFILIAL = V_FILIAL
         AND NRORG = P_NRORG;
        /*Recebe dados do grupo de faturamento
        SELECT CDTIPOOPERFATURA, CDSERIENF, CDPRODUTOVENDA, NMPRODUTO
         INTO V_TPOPERFAT, V_TPSERIENF, V_PRODFAT, V_NMPRODFAT
         FROM FCT_GRUPOFATURA GRP, PRODUTO PRO
        WHERE GRP.NRGRUPOFATURA = C_APUR.NRGRUPOFATURA
          AND GRP.NRORG = P_NRORG
          AND PRO.CDPRODUTO(+) = GRP.CDPRODUTOVENDA;*/
       /* Recebe codigo do cliente */
       BEGIN
         SELECT CL.CDCLIENTE
           INTO V_CDCLIENTE
           FROM PARCNEGOCIO PN, CLIENTE CL
          WHERE PN.NRPARCNEGOCIO = C_APUR.NRPARCFATURA
            AND PN.NRORG = P_NRORG
            AND CL.NRPARCNEGOCIO = PN.NRPARCNEGOCIO
            AND CL.NRORG = PN.NRORG;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
             RAISE_APPLICATION_ERROR('-20001', 'SEM_CLIENTE');
       END;
       /* Recebe Tipo do Orçamento
       BEGIN
          SELECT RF.NRTIPOORCAMENTO
            INTO V_TPORCA
            FROM FCT_ORCAMENTO OC, FCT_REFEORCACONT RF
           WHERE RF.NRORG = P_NRORG
             AND OC.NRORG = RF.NRORG
             AND OC.NRSEQORCAMENTO = RF.NRSEQORCAMENTO;
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_TPORCA := NULL;
       END;*/
       /* ----- Recebe a data de saída da NF ----- */
       V_DTEMISS := TRUNC(SYSDATE);
       /* INICIO: verificacao da serie da nota de acordo com a empresa e filial */
        SELECT MAX(F.CDINSCESTA), MAX(F.CDINSCMUNI)
          INTO V_CDINSCESTA, V_CDINSCMUNI
          FROM FILIAL F, INSCRESTAD I
         WHERE (F.CDFILIAL   = C_APUR.CDFILIALFATURA)
           AND (F.CDEMPRESA  = V_EMPRESA)
           AND (I.CDINSCESTA = F.CDINSCESTA)
           AND (I.CDEMPRESA  = F.CDEMPRESA)
           AND (NVL(V_DTEMISS, TRUNC(SYSDATE)) >= NVL(NVL(I.DTINIVIGIEST, V_DTEMISS), TRUNC(SYSDATE)))
           AND (NVL(V_DTEMISS, TRUNC(SYSDATE)) <= NVL(NVL(I.DTFIMVIGIEST, V_DTEMISS), TRUNC(SYSDATE)));
        IF (V_CDINSCESTA IS NULL) OR (V_CDINSCMUNI IS NULL) THEN
           SELECT MAX(E.CDINSCESTA), MAX(E.CDINSCMUNI)
             INTO V_CDINSCESTA, V_CDINSCMUNI
             FROM EMPRCNTRFIL E, INSCRESTAD I
            WHERE (E.CDFILIAL  = C_APUR.CDFILIALFATURA)
              AND (E.CDEMPRESA = V_EMPRESA)
              AND (E.CDINSCESTA = I.CDINSCESTA)
              AND (E.CDEMPRESA  = I.CDEMPRESA)
              AND (NVL(V_DTEMISS, TRUNC(SYSDATE)) >= NVL(NVL(I.DTINIVIGIEST, V_DTEMISS), TRUNC(SYSDATE)))
              AND (NVL(V_DTEMISS, TRUNC(SYSDATE)) <= NVL(NVL(I.DTFIMVIGIEST, V_DTEMISS), TRUNC(SYSDATE)));
        END IF;
        IF (V_CDINSCESTA IS NULL) OR (V_CDINSCMUNI IS NULL) THEN
           SELECT MAX(CDINSCESTA), MAX(CDINSCMUNI)
             INTO V_CDINSCESTA, V_CDINSCMUNI
             FROM FILIAL
            WHERE (CDFILIAL  = C_APUR.CDFILIALFATURA)
              AND (CDEMPRESA = V_EMPRESA);
        END IF;
        IF (V_CDINSCESTA IS NULL) OR (V_CDINSCMUNI IS NULL) THEN
            RAISE_APPLICATION_ERROR('-20002', 'FK_SERIENF');
        ELSE
            SELECT COUNT(*)
              INTO V_EXISTE_SERIE
              FROM SERIENF
             WHERE CDEMPRESA  = V_EMPRESA
               AND CDINSCESTA = V_CDINSCESTA
               AND CDINSCMUNI = V_CDINSCMUNI
               AND CDSERIE    = V_TPSERIENF;
            IF (V_EXISTE_SERIE = 0) THEN
                RAISE_APPLICATION_ERROR('-20002', 'FK_SERIENF');
            END IF;
        END IF;
        /* FIM: verificacao da serie da nota de acordo com a empresa e filial */
       /* Geracao do CORPO da nota fiscal da apuracao*/
      GERA_NOTAFISCAL_CORPO(C_APUR.CDFILIALFATURA, C_APUR.CDFILIALFATURA, V_EMPRESA, V_TPOPERFAT, V_TPSERIENF, V_CDCLIENTE, V_DTEMISS,'DFS', V_NRLANCTONF, V_PRXLANCESTQ);
      IF (V_NRLANCTONF IS NOT NULL) THEN
          --ALTERAR
          FCT_PREENCHE_DADOS_NOTAFISC(P_NRORG, C_APUR.CDFILIALFATURA, V_NRLANCTONF, C_APUR.NRFATURACONT, P_CDOPERINCLUSAO);
          V_NFCRIADA := V_NFCRIADA||'_'||V_NRLANCTONF||'_';
      END IF;
      /* Insercao dos itens na nota fical */
      FOR C_ITENS IN (SELECT FCT_ITFATURACONT.NRITFATURACONT, FCT_ITFATURACONT.NRFATURACONT, FCT_ITFATURACONT.NRSEQCONTRATO,
                         FCT_ITFATURACONT.NRITEMOCONTRATO, FCT_ITFATURACONT.CDPRODFATURA, PRODUTO.NMPRODUTO,
                         FCT_ITFATURACONT.IDSITUACAO, 1 AS QUANTIDADE, FCT_ITFATURACONT.VRVENCIMENTO, FCT_ITFATURACONT.VRFATURADO,
                         FCT_ITFATURACONT.VRFALTAFATURAR, FCT_ITFATURACONT.IDFORMAFATURA, FCT_ITFATURACONT.DSJUSTIFICATIVA,
                         FCT_ITFATURACONT.NRAPURACAO, FCT_ITFATURACONT.IDATIVO, FCT_ITFATURACONT.NRORG
                    FROM FCT_ITFATURACONT
                    LEFT JOIN FCT_RELACAGRUPAMENTOCONT AGRUP
                      ON FCT_ITFATURACONT.NRSEQCONTRATO = AGRUP.NRSEQCONTRATO
                      AND FCT_ITFATURACONT.NRORG        = AGRUP.NRORG
                    JOIN PRODUTO
                      ON PRODUTO.CDPRODUTO = FCT_ITFATURACONT.CDPRODFATURA
                     AND PRODUTO.NRORG = FCT_ITFATURACONT.NRORG
                   WHERE (AGRUP.IDFATCONTJUNT = C_APUR.IDFATCONTJUNT
                        OR C_APUR.IDFATCONTJUNT IS NULL)
                     AND FCT_ITFATURACONT.NRFATURACONT = C_APUR.NRFATURACONT
                     AND FCT_ITFATURACONT.NRORG = P_NRORG
      ) LOOP
          SELECT COUNT(*)
            INTO V_QTPRODNOTA
            FROM ITEMPRODUTO
           WHERE NRLANCTONF = V_NRLANCTONF
             AND CDFILIAL = C_APUR.CDFILIALFATURA
             AND CDPRODUTO = C_ITENS.CDPRODFATURA;
          IF (V_QTPRODNOTA = 0) THEN
            GERA_NOTAFISCAL_PRODUTO(C_APUR.CDFILIALFATURA, V_NRLANCTONF, C_ITENS.CDPRODFATURA, C_ITENS.CDPRODFATURA, C_ITENS.NMPRODUTO, C_ITENS.QUANTIDADE, C_ITENS.VRVENCIMENTO);
          ELSE
             UPDATE ITEMPRODUTO
                SET VRUNITITEM = VRUNITITEM + C_ITENS.VRVENCIMENTO,
                    VRTOTAITEM = VRTOTAITEM + C_ITENS.VRVENCIMENTO
              WHERE NRLANCTONF = V_NRLANCTONF
                AND CDFILIAL   = C_APUR.CDFILIALFATURA
                AND CDPRODUTO  = C_ITENS.CDPRODFATURA;
          END IF;
          /* Caso o item tenha rateio, serao criados os rateios na Nota Fiscal */
          /* -- Rateio será realizado posteriormente --
          IF ((C_APUR.IDTPFATURA <> P) AND (C_ITENS.IDRATEADO = S)) THEN
             FOR C_RATEIO IN (
                 SELECT NRRATEIOITEMVENC, NRITVENCPREVCONT, NRVENCPREVCONT, NRSEQCONTRATO, NRITEMOCONTRATO,
                        NRESTRUTURAM, CDCENTCUST, VRRATEADO
                   FROM FCT_RATEIOITVENCIMENTO RAT
                  WHERE RAT.NRVENCPREVCONT   = C_APUR.NRVENCPREVCONT
                    AND RAT.NRSEQCONTRATO    = C_APUR.NRSEQCONTRATO
                    AND RAT.NRITVENCPREVCONT = C_ITENS.NRITVENCPREVCONT
                    AND RAT.IDSITUVENCRATEIO <> F
                    AND ((INSTR(P_NRRATEIOITEMVENC, _ || TO_CHAR(RAT.NRRATEIOITEMVENC) || _) > 0) OR P_NRRATEIOITEMVENC IS NULL)
             ) LOOP
                   -- Busca o nímero do item na Nota Fiscal
                   SELECT NRSEQITPROD
                     INTO V_NRSEQIRPROD
                     FROM ITEMPRODUTO
                     WHERE NRLANCTONF = V_NRLANCTONF
                     AND CDFILIAL = C_APUR.CDFILIALFATURA
                     AND CDPRODUTO = C_ITENS.PROD;
                    SELECT COUNT(*)
                      INTO V_COUNTRATEIO
                      FROM RATEIONF
                     WHERE NRLANCTONF = V_NRLANCTONF
                       AND CDFILIAL = C_APUR.CDFILIALFATURA
                       AND NRSEQITPROD = V_NRSEQIRPROD
                       AND CDFILICCUST = C_APUR.CDFILIALFATURA
                       AND CDCENTCUSNF = C_RATEIO.CDCENTCUST
                       AND NRORG = P_NRORG;
                   IF  V_COUNTRATEIO = 0 THEN
                       INSERT INTO RATEIONF(CDFILIAL, NRLANCTONF, NRSEQITPROD, CDFILICCUST, CDCENTCUSNF,
                                           VRRATENF, NRORG, DTINCLUSAO, IDATIVO)
                                   VALUES(C_APUR.CDFILIALFATURA, V_NRLANCTONF, V_NRSEQIRPROD, C_APUR.CDFILIALFATURA, C_RATEIO.CDCENTCUST,
                                          C_RATEIO.VRRATEADO, P_NRORG, SYSDATE, S);
                   ELSE
                       UPDATE RATEIONF
                          SET VRRATENF = VRRATENF + C_RATEIO.VRRATEADO
                        WHERE NRLANCTONF = V_NRLANCTONF
                          AND CDFILIAL = C_APUR.CDFILIALFATURA
                          AND NRSEQITPROD = V_NRSEQIRPROD
                          AND CDFILICCUST = C_APUR.CDFILIALFATURA
                          AND CDCENTCUSNF = C_RATEIO.CDCENTCUST
                          AND NRORG = P_NRORG;
                   END IF;
             END LOOP; -- C_RATEIO
          END IF;  -- IDRATEADO = S
          -- Rateio será realizado posteriormente -- */
       END LOOP;  -- C_ITENS
       /* ====== Abaixo ele testa se a nota fiscal possui algum item, se ela nao possuir ele deleta a nota fiscal e ignora o resto da rotina.
                 Se ela possuir, ele continua a rotina normalmente. */
       SELECT COUNT(*)
        INTO V_TESTAITEM
        FROM ITEMPRODUTO
       WHERE NRLANCTONF = V_NRLANCTONF
         AND CDFILIAL = C_APUR.CDFILIALFATURA
         AND NRORG = P_NRORG;
       IF V_TESTAITEM = 0 THEN
          DELETE FROM NOTAFISCAL
           WHERE NRLANCTONF = V_NRLANCTONF
             AND CDFILIAL = C_APUR.CDFILIALFATURA
             AND NRORG = P_NRORG;
       ELSE
          /* UPDATA DATAS DE COMPETENCIA DE FATURAMENTO NA NF */
          UPDATE NOTAFISCAL
             SET DTINIREFEFAT = C_APUR.DTINICOMPET,
                 DTFINREFEFAT = C_APUR.DTFINCOMPET
           WHERE NRLANCTONF   = V_NRLANCTONF
             AND CDFILIAL     = C_APUR.CDFILIALFATURA;
          IF(V_IDFATCONTJUNT IS NULL OR V_IDFATCONTJUNT <> C_APUR.IDFATCONTJUNT) THEN
            V_NRAPURACAO    := NULL;
            V_IDFATCONTJUNT := C_APUR.IDFATCONTJUNT;
          END IF;
         /* Gera apuracao do contrato */
         IF (V_NRAPURACAO IS NULL) THEN
              NOVO_CODIGO('FCT_APURACAO', V_NRAPURACAO, 1, P_NRORG);
              V_NRAPURACAO := SUBSTR(V_NRAPURACAO, 11, 10);
              INSERT INTO FCT_APURACAO
                    (NRAPURACAO, NRSEQCONTRATO, NRTIPOORCAMENTO,
                     NRPARCNEGOCIO, CDMODPGTO, NRGRUPOFATURA,
                     CDEMPRESA, CDFILIAL, NRLANCTONF,
                     IDSITUACAOAPURACAO, VRAPURACAO, VRAPURACAOORIGINAL,
                     DSALTERACAO, CDAGRUPANF, NRORG,
                     DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
              VALUES
                    (V_NRAPURACAO, NULL, V_TPORCA,
                     C_APUR.NRPARCFATURA, NULL, NULL,
                     V_EMPRESA, C_APUR.CDFILIALFATURA, V_NRLANCTONF,
                     'FATURADA', C_APUR.VRVENCIMENTO, C_APUR.VRVENCIMENTO,
                     NULL, NULL, P_NRORG,
                     SYSDATE, P_NRORG, P_CDOPERINCLUSAO);
            /* cria uma liga¿ entre as apura¿s e a parcela */
            NOVO_CODIGO('FCT_RELACAPURACAOFATURA', V_NRAPURACAOFATURA, 1, P_NRORG);
            INSERT INTO FCT_RELACAPURACAOFATURA (
                NRAPURACAOFATURA, NRAPURACAO,    NRFATURACONT,
                NRORG,            IDATIVO,       DTINCLUSAO,
                DTULTATU,         NRORGINCLUSAO, CDOPERINCLUSAO,
                NRORGULTATU,      CDOPERULTATU
            ) VALUES (
                V_NRAPURACAOFATURA, V_NRAPURACAO,    C_APUR.NRFATURACONT,
                P_NRORG,            'S',       SYSDATE,
                NULL,               P_NRORG, P_CDOPERINCLUSAO,
                NULL,               NULL
            );
            V_APURACAOCONLUIDA := 'S';
          END IF;
          /* Atualiza a tabela de rateios */
          /* -- Rateio será realizado posteriormente --
          IF (P_NRRATEIOITEMVENC IS NOT NULL) THEN
              UPDATE FCT_RATEIOITVENCIMENTO
                 SET NRAPURACAO       = V_NRAPURACAO,
                     IDSITUVENCRATEIO = F
               WHERE NRORG          = P_NRORG
                 AND NRVENCPREVCONT = C_APUR.NRVENCPREVCONT
                 AND NRSEQCONTRATO  = C_APUR.NRSEQCONTRATO
                 AND NRAPURACAO     IS NULL
                 AND (INSTR(P_NRRATEIOITEMVENC, _ || TO_CHAR(NRRATEIOITEMVENC) || _) > 0);
          ELSE */
            /* Atualiza tabela de Previsao de Vencimento
            UPDATE FCT_FATURACONT
              SET NRAPURACAO     = V_NRAPURACAO
            WHERE NRORG          = P_NRORG
              AND NRFATURACONT   = C_APUR.NRFATURACONT;
          */
/* -- Rateio será realizado posteriormente --
            UPDATE FCT_RATEIOITVENCIMENTO
               SET NRAPURACAO       = V_NRAPURACAO,
                   IDSITUVENCRATEIO = F
             WHERE NRORG            = P_NRORG
               AND NRSEQCONTRATO    = C_APUR.NRSEQCONTRATO
               AND NRVENCPREVCONT   = C_APUR.NRFATURACONT
               AND NRAPURACAO       IS NULL
               AND IDSITUVENCRATEIO <> F;
         -- END IF;    Rateio será realizado posteriormente
         */
             /*Contrato*/
             IF C_APUR.NRCONTRATOFCT IS NOT NULL THEN
                SELECT MAX(NRDADOADIC)
                  INTO V_DADOADIC
                  FROM DADOSADIC
                 WHERE (CDFILIAL   = C_APUR.CDFILIALFATURA) AND
                       (NRLANCTONF = V_NRLANCTONF);
                IF V_DADOADIC IS NULL THEN
                   V_DADOADIC := '001';
                ELSE
                   V_DADOADIC := V_DADOADIC+1;
                END IF;
                INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                  VALUES(C_APUR.CDFILIALFATURA, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'Contrato: '||C_APUR.NRCONTRATOFCT);
             END IF;
             /*Vencimento*/
             IF C_APUR.DTVENCIMENTO IS NOT NULL THEN
                SELECT MAX(NRDADOADIC)
                  INTO V_DADOADIC
                  FROM DADOSADIC
                 WHERE (CDFILIAL   = C_APUR.CDFILIALFATURA) AND
                       (NRLANCTONF = V_NRLANCTONF);
                IF V_DADOADIC IS NULL THEN
                   V_DADOADIC := '001';
                ELSE
                   V_DADOADIC := V_DADOADIC+1;
                END IF;
                BEGIN
                   SELECT DTATUAVENREC
                     INTO V_VENCIMENTO
                     FROM CONTARECEBER
                    WHERE NRLANCTONF = V_NRLANCTONF
                      AND CDFILIAL = C_APUR.CDFILIALFATURA;
                EXCEPTION
                   WHEN NO_DATA_FOUND THEN
                       V_VENCIMENTO := C_APUR.DTVENCIMENTO;
                END;
                INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                  VALUES(C_APUR.CDFILIALFATURA, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'Vencimento: '||TO_CHAR(V_VENCIMENTO,'DD/MM/YYYY'));
              END IF;
              /*Período*/
              IF C_APUR.DTINICOMPET IS NOT NULL THEN
                 SELECT MAX(NRDADOADIC)
                   INTO V_DADOADIC
                   FROM DADOSADIC
                  WHERE (CDFILIAL   = C_APUR.CDFILIALFATURA) AND
                        (NRLANCTONF = V_NRLANCTONF);
                 IF V_DADOADIC IS NULL THEN
                    V_DADOADIC := '001';
                 ELSE
                    V_DADOADIC := V_DADOADIC+1;
                 END IF;
                 INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                   VALUES(C_APUR.CDFILIALFATURA, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), 'Período: '||TO_CHAR(C_APUR.DTINICOMPET,'DD/MM/YYYY')||' - '||TO_CHAR(C_APUR.DTFINCOMPET,'DD/MM/YYYY'));
              END IF;
              /*Observações*/
              IF C_APUR.DSOBSERVACAOCONT IS NOT NULL THEN
                 SELECT MAX(NRDADOADIC)
                   INTO V_DADOADIC
                   FROM DADOSADIC
                  WHERE (CDFILIAL   = C_APUR.CDFILIALFATURA) AND
                        (NRLANCTONF = V_NRLANCTONF);
                 IF V_DADOADIC IS NULL THEN
                    V_DADOADIC := '001';
                 ELSE
                    V_DADOADIC := V_DADOADIC+1;
                 END IF;
                 INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                   VALUES(C_APUR.CDFILIALFATURA, V_NRLANCTONF, LPAD(V_DADOADIC,3,'0'), C_APUR.DSOBSERVACAOCONT);
              END IF;
       END IF;
    END LOOP;
    FOR C_NFFECHAMENTO IN (SELECT DISTINCT NRSEQCONTRATO, NRLANCTONF, CDFILIAL, NRFATURACONT, DSREFERENCIANOTA
                            FROM FCT_DADOSNF
                           WHERE (INSTR('_'||P_NRFATURACONT||'_', '_'||TO_CHAR(NRFATURACONT)||'_')>0)
                             AND (INSTR('_'||V_NFCRIADA||'_', '_'||NRLANCTONF||'_')>0)
                             AND NRORG = P_NRORG) LOOP
      GERA_NOTAFISCAL_FECHAMENTO(C_NFFECHAMENTO.CDFILIAL, C_NFFECHAMENTO.NRLANCTONF);
      SELECT VRNOTAFISC
        INTO V_VRNOTAFISC
        FROM NOTAFISCAL
       WHERE NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
         AND CDFILIAL = C_NFFECHAMENTO.CDFILIAL
         AND NRORG = P_NRORG;
      BEGIN
        SELECT VRVENCIMENTO, VRFALTAFATURAR
          INTO V_VRVENCIMENTO, V_VRFALTAFATURAR
          FROM FCT_FATURACONT
         WHERE NRFATURACONT = C_NFFECHAMENTO.NRFATURACONT
           AND NRORG        = P_NRORG;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          V_VRVENCIMENTO := NULL;
          V_VRFALTAFATURAR := NULL;
      END;
      IF(V_VRFALTAFATURAR IS NOT NULL AND V_VRFALTAFATURAR <> 0) THEN
        V_VRNOTAFISC := ROUND(V_VRNOTAFISC, 2);
        V_VRVENCIMENTO := ROUND(V_VRVENCIMENTO, 2);
        V_VRFALTAFATURAR := ROUND(V_VRFALTAFATURAR, 2);
        IF (V_VRNOTAFISC = V_VRVENCIMENTO) THEN
            V_IDSITUACAO := '2';
            UPDATE FCT_FATURACONT
               SET IDSITUACAO     = V_IDSITUACAO,
                   VRFATURADO     = V_VRNOTAFISC,
                   VRFALTAFATURAR = 0,
                   IDFORMAFATURA  = 'A'
             WHERE NRFATURACONT = C_NFFECHAMENTO.NRFATURACONT
               AND NRORG          = P_NRORG;
        ELSE
            V_IDSITUACAO := '2';
            UPDATE FCT_FATURACONT
               SET IDSITUACAO     = V_IDSITUACAO,
                   VRFATURADO     = VRFATURADO + V_VRNOTAFISC,
                   VRFALTAFATURAR = VRFALTAFATURAR - V_VRNOTAFISC,
                   IDFORMAFATURA  = 'A'
             WHERE NRFATURACONT   = C_NFFECHAMENTO.NRFATURACONT
               AND NRORG          = P_NRORG;
        END IF;
        /* -- Rateio será realizado posteriormente --
        IF (V_IDSITUACAO = F) THEN
            UPDATE FCT_RATEIOITVENCIMENTO
               SET IDSITUVENCRATEIO = F
             WHERE NRVENCPREVCONT = C_NFFECHAMENTO.NRVENCPREVCONT
               AND NRORG          = P_NRORG;
        END IF;
        */
      END IF;
      UPDATE FCT_APURACAO
         SET VRAPURACAO         = V_VRNOTAFISC,
             VRAPURACAOORIGINAL = V_VRNOTAFISC
       WHERE NRAPURACAO = V_NRAPURACAO
         AND NRORG      = P_NRORG;
       /* -- Rateio será realizado posteriormente --
       -- UPDATA VALORES DO RATEIO PARA CONSIDER O VALOR CONTÿ¿ÿºparam1BIL DO ITEM DA NF (ITEMPRODUTO.VRCONTITEM)
       FOR C_UPDRATEIO IN (SELECT NRSEQITPROD, VRRATENF, CDFILICCUST, CDCENTCUSNF
                        FROM RATEIONF RAT
                       WHERE (RAT.NRLANCTONF =  C_NFFECHAMENTO.NRLANCTONF)
                         AND (RAT.CDFILIAL = C_NFFECHAMENTO.CDFILIAL)
                         AND (NRORG = P_NRORG)) LOOP
           -- Busca valores do item
           SELECT VRCONTITEM, VRBRUTITEM
             INTO V_VRCONTITEM, V_VRBRUTITEM
             FROM ITEMPRODUTO
             WHERE NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
             AND CDFILIAL = C_NFFECHAMENTO.CDFILIAL
             AND NRSEQITPROD = C_UPDRATEIO.NRSEQITPROD
             AND NRORG = P_NRORG;
           SELECT (C_UPDRATEIO.VRRATENF*100)/ V_VRBRUTITEM
             INTO V_VRPERCRATEIO
             FROM DUAL;
           IF V_VRPERCRATEIO = 100 THEN
              V_VRRATEIO := V_VRCONTITEM;
           ELSE
              V_VRRATEIO := (V_VRCONTITEM * V_VRPERCRATEIO)/100;
           END IF;
           UPDATE RATEIONF
              SET VRRATENF = V_VRRATEIO
            WHERE CDFILIAL = C_NFFECHAMENTO.CDFILIAL
              AND NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
              AND CDFILICCUST = C_UPDRATEIO.CDFILICCUST
              AND CDCENTCUSNF = C_UPDRATEIO.CDCENTCUSNF
              AND NRSEQITPROD = C_UPDRATEIO.NRSEQITPROD
              AND NRORG = P_NRORG;
       END LOOP;
       */
       /* atualiza a descrição do item da NF de acordo com a referencia da FCT_DADOSNF*/
       IF C_NFFECHAMENTO.DSREFERENCIANOTA IS NOT NULL THEN
          UPDATE ITEMPRODUTO
            SET DSPRODEMIS = C_NFFECHAMENTO.DSREFERENCIANOTA
          WHERE NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
            AND CDFILIAL = C_NFFECHAMENTO.CDFILIAL
            AND NRORG = P_NRORG;
       END IF;
      /* atualiza a descrição do item da NF de acordo com a parametrizaÿ§ÿ£o do serviço, SIM, ELA SUBSTITUI A DO FCT_DADOSNF*/
      FOR C_ITENSVENC IN (SELECT NRITFATURACONT, NRITEMOCONTRATO
                            FROM FCT_ITFATURACONT
                            WHERE NRFATURACONT = C_NFFECHAMENTO.NRFATURACONT
                              AND NRORG          = P_NRORG) LOOP
           V_DSSERVORCANF := NULL;
          FOR C_SERVICOS IN (SELECT ORC.NRORCAMENTO,
                                    CONT.NRCONTRATOFCT,
                                    PARC.NMPRINCIPALPARC,
                                    PARCELATOT.QTPARCELASTOT,
                                    NVL(PARCELA.QTPARCELAS, 0) AS QTPARCELAS,
                                    SERVORCA.CDPRODFATSERV,
                                    SERVORCA.DSSERVORCANF
                              FROM FCT_CONTRATO CONT
                              INNER JOIN PARCNEGOCIO PARC
                                ON PARC.NRPARCNEGOCIO = CONT.NRPARCNEGOCIO
                                AND PARC.NRORG = CONT.NRORG
                                LEFT JOIN (SELECT AGRUPCONT.NRSEQCONTRATO,
                                                  FCT_FATURACONT.NRORG,
                                                  COUNT(FCT_FATURACONT.NRFATURACONT) AS QTPARCELASTOT
                                            FROM FCT_FATURACONT
                                            INNER JOIN FCT_RELACAGRUPCONTFAT AGRUPCONT
                                              ON FCT_FATURACONT.NRFATURACONT = AGRUPCONT.NRFATURACONT
                                              AND FCT_FATURACONT.NRORG       = AGRUPCONT.NRORG
                                            JOIN FCT_ITFATURACONT
                                              ON FCT_ITFATURACONT.NRFATURACONT   = FCT_FATURACONT.NRFATURACONT
                                            AND FCT_ITFATURACONT.NRORG           = FCT_FATURACONT.NRORG
                                            AND FCT_ITFATURACONT.NRITEMOCONTRATO = C_ITENSVENC.NRITEMOCONTRATO
                                            WHERE AGRUPCONT.NRSEQCONTRATO = C_NFFECHAMENTO.NRSEQCONTRATO
                                              AND FCT_FATURACONT.NRORG = P_NRORG
                                            GROUP BY AGRUPCONT.NRSEQCONTRATO,
                                                    FCT_FATURACONT.NRORG) PARCELATOT
                                ON PARCELATOT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                                AND PARCELATOT.NRORG = CONT.NRORG
                                LEFT JOIN (SELECT AGRUPCONT.NRSEQCONTRATO,
                                                  FCT_FATURACONT.NRORG,
                                                  COUNT(FCT_FATURACONT.NRFATURACONT) AS QTPARCELAS
                                            FROM FCT_FATURACONT
                                            INNER JOIN FCT_RELACAGRUPCONTFAT AGRUPCONT
                                              ON FCT_FATURACONT.NRFATURACONT = AGRUPCONT.NRFATURACONT
                                              AND FCT_FATURACONT.NRORG       = AGRUPCONT.NRORG
                                            JOIN FCT_ITFATURACONT
                                              ON FCT_ITFATURACONT.NRFATURACONT = FCT_FATURACONT.NRFATURACONT
                                            AND FCT_ITFATURACONT.NRORG = FCT_FATURACONT.NRORG
                                            AND FCT_ITFATURACONT.NRITEMOCONTRATO = C_ITENSVENC.NRITEMOCONTRATO
                                            WHERE AGRUPCONT.NRSEQCONTRATO = C_NFFECHAMENTO.NRSEQCONTRATO
                                              AND FCT_FATURACONT.NRORG = P_NRORG
                                              AND FCT_FATURACONT.IDSITUACAO IN ('2','3')
                                            GROUP BY AGRUPCONT.NRSEQCONTRATO,
                                                    FCT_FATURACONT.NRORG) PARCELA
                                ON PARCELA.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                                AND PARCELA.NRORG = CONT.NRORG
                                LEFT JOIN FCT_REFEORCACONT RELACCONTPROP
                                ON RELACCONTPROP.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                                AND RELACCONTPROP.NRORG = CONT.NRORG
                                LEFT JOIN FCT_ORCAMENTO ORC
                                ON RELACCONTPROP.NRSEQORCAMENTO = ORC.NRSEQORCAMENTO
                                AND RELACCONTPROP.NRORG = ORC.NRORG
                                INNER JOIN FCT_ITEMCONTRATO ITEMCONT
                                ON ITEMCONT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                                AND ITEMCONT.NRITEMOCONTRATO = C_ITENSVENC.NRITEMOCONTRATO
                                AND ITEMCONT.NRORG = CONT.NRORG
                                INNER JOIN FCT_SERVICOORCA SERVORCA
                                ON SERVORCA.CDSERVORCA = ITEMCONT.CDSERVORCA
                                AND SERVORCA.NRORG = ITEMCONT.NRORG
                              WHERE CONT.NRSEQCONTRATO = C_NFFECHAMENTO.NRSEQCONTRATO
                                AND CONT.NRORG = P_NRORG
                                AND SERVORCA.DSSERVORCANF IS NOT NULL) LOOP
              V_DSSERVORCANF := C_SERVICOS.DSSERVORCANF;
              V_PARCELAS := C_SERVICOS.QTPARCELAS||'/'||C_SERVICOS.QTPARCELASTOT;
              /*Mnemônicos: [CODPROP] - Código Proposta | [CODCONT] - Código Contrato | [PARCEIRO] - Parceiro de Negócio | [PARCELA] - Parcelas*/
              V_DSSERVORCANF := REPLACE(V_DSSERVORCANF,'[CODPROP]', NVL(C_SERVICOS.NRORCAMENTO, ''));
              V_DSSERVORCANF := REPLACE(V_DSSERVORCANF,'[CODCONT]', NVL(C_SERVICOS.NRCONTRATOFCT, ''));
              V_DSSERVORCANF := REPLACE(V_DSSERVORCANF,'[PARCEIRO]', NVL(C_SERVICOS.NMPRINCIPALPARC, ''));
              V_DSSERVORCANF := REPLACE(V_DSSERVORCANF,'[PARCELA]', NVL(V_PARCELAS, ''));
              UPDATE ITEMPRODUTO
                SET DSPRODEMIS = V_DSSERVORCANF
              WHERE NRLANCTONF = C_NFFECHAMENTO.NRLANCTONF
                AND CDFILIAL = C_NFFECHAMENTO.CDFILIAL
                AND CDPRODUTO = C_SERVICOS.CDPRODFATSERV
                AND NRORG = P_NRORG;
          END LOOP;
      END LOOP;
   END LOOP;
   P_RETORNO := 'SUCESS';
   P_RETORNOERRO := 'Processo realizado com sucesso.';
 EXCEPTION
   -- Caso dÿ¿ÿª algum erro no faturamento, serÿ¿ÿ£o deletadas as notas fiscais para nÿ¿ÿ£o ficar lixo na base de dados. --
   WHEN OTHERS THEN BEGIN
      IF V_NFCRIADA IS NOT NULL THEN -- Verifica se tem NF criada --
         IF  V_APURACAOCONLUIDA IS NULL THEN -- Verifica se a NF criada jÿ¿ÿ¡ foi vinculadaÿ¿ÿ  apuraÿ¿ÿ§ÿ¿ÿ£o. No caso, se ja foi gravada a ITEMPRODUTO e a FCT_APURACAO --
            FOR C_EXCEPTION IN (SELECT DISTINCT NRLANCTONF, CDFILIAL
                                  FROM NOTAFISCAL
                                 WHERE (INSTR('_'||V_NFCRIADA||'_', '_'||NRLANCTONF||'_')>0)
                                   AND (CDFILIAL = V_FILIAL)
                                   AND NRORG = P_NRORG) LOOP
               --  Caso exista rateio para nota, deleta o rateio --
               DELETE FROM RATEIONF
                     WHERE NRORG = P_NRORG
                       AND NRLANCTONF = C_EXCEPTION.NRLANCTONF
                       AND CDFILIAL = C_EXCEPTION.CDFILIAL;
              -- Deleta a NF ---
               DELETA_NF(C_EXCEPTION.CDFILIAL,C_EXCEPTION.NRLANCTONF);
               --  ALTERA O STATUS DO VENCIMEMNTO PARA PENDENTE --
               FOR C_UPDVENC IN (SELECT NRAPURACAO
                                   FROM FCT_APURACAO
                                  WHERE NRLANCTONF = C_EXCEPTION.NRLANCTONF
                                    AND CDFILIAL = C_EXCEPTION.CDFILIAL
                                    AND NRORG = P_NRORG)LOOP
                UPDATE FCT_FATURACONT
                   SET IDSITUACAO = '1',
                       IDFORMAFATURA  = NULL
                 WHERE NRORG = P_NRORG
                   AND NRAPURACAO = C_UPDVENC.NRAPURACAO;
               END LOOP;
           END LOOP;
         ELSE
            FCT_CANC_APURCAO_FATURAMENTO (P_NRORG, P_NRSEQCONTRATO, P_CDOPERINCLUSAO, P_DATAINI, P_DATAFIN, P_NRFATURACONT);
         END IF;
      END IF;
      P_RETORNO := 'ERROR';
      P_RETORNOERRO := 'Opera¿ bloqueada. Ocorreram erros na realiza¿ do processo.';
   END;
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_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;
    V_ULTDIAMES             FCT_COMPETENCIANEGOCONT.NRDIACOMPETINI%TYPE;
    V_NRAGRUPAMENTO         FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
    V_IDPARCAGRUP           FCT_RELACAGRUPCONTFAT.IDPARCAGRUP%TYPE;
BEGIN
    -- Manda deletar as parcelas e medições no caso de regeração do faturamento
    FCT_EXCLUIR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG);
    -- Verifica se o contrato faz parte de um agrupamento
    BEGIN
        SELECT NRAGRUPAMENTO
        INTO V_NRAGRUPAMENTO
        FROM FCT_RELACAGRUPAMENTOCONT
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
            AND NRORG       = P_NRORG;
    EXCEPTION WHEN NO_DATA_FOUND THEN
        V_NRAGRUPAMENTO := NULL;
    END;
    FOR C_NEGOCIACAO IN (
        SELECT NEG.NRSEQCONTRATO,
               NEG.NRTIPOORCAMENTO,
               NEG.IDTPFATURA,
               NEG.VRPERCDESCITEM,
               NEG.VRDESCITEM,
               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
        V_NRFATURACONT := NULL;
        V_IDPARCAGRUP  := 'N';
        /*
        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;
                V_NRFATURACONT := NULL;
                V_IDPARCAGRUP  := 'N';
                -- Verifica se há uma parcela pendente inserida para o agrupamento
                IF(V_NRAGRUPAMENTO IS NOT NULL) THEN
                    V_IDPARCAGRUP := 'S';
                    BEGIN
                        SELECT DISTINCT PARCELA.NRFATURACONT
                        INTO V_NRFATURACONT
                        FROM FCT_FATURACONT PARCELA
                        INNER JOIN FCT_RELACAGRUPCONTFAT PARCCONT
                          ON PARCELA.NRFATURACONT = PARCCONT.NRFATURACONT
                          AND PARCELA.NRORG       = PARCCONT.NRORG
                        INNER JOIN FCT_RELACAGRUPAMENTOCONT AGRUPCONT
                          ON PARCCONT.NRSEQCONTRATO = AGRUPCONT.NRSEQCONTRATO
                          AND PARCCONT.NRORG        = AGRUPCONT.NRORG
                        INNER JOIN FCT_AGRUPAMENTO AGRUP
                          ON AGRUPCONT.NRAGRUPAMENTO = AGRUP.NRAGRUPAMENTO
                          AND AGRUPCONT.NRORG        = AGRUP.NRORG
                        WHERE AGRUP.NRAGRUPAMENTO      = V_NRAGRUPAMENTO
                          AND PARCELA.IDSITUACAO       = '1'
                          AND PARCELA.IDTPFATURA       = C_NEGOCIACAO.IDTPFATURA
                          AND PARCELA.CDFILIALFATURA   = C_NEGOCIACAO.CDFILIALFATURA
                          AND PARCELA.NRPARCFATURA     = C_NEGOCIACAO.NRPARCFATURA
                          AND PARCELA.CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                          AND PARCELA.CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                          AND PARCELA.CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                          AND PARCELA.CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                          AND PARCELA.CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                          AND TO_CHAR(PARCELA.DTINICOMPET, 'DD/MM/YYYY') = V_DTINICOMPET_ATUAL
                          AND TO_CHAR(PARCELA.DTFINCOMPET, 'DD/MM/YYYY') = V_DTFINCOMPET_ATUAL;
                    EXCEPTION WHEN NO_DATA_FOUND THEN
                        V_NRFATURACONT := NULL;
                    END;
                END IF;
                IF(V_NRFATURACONT IS NULL) 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 + 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
                    );
                ELSE
                    UPDATE FCT_FATURACONT
                        SET VRVENCIMENTO  = VRVENCIMENTO + C_PARCELAS.VRPARCELA,
                           VRFALTAFATURAR = VRVENCIMENTO + C_PARCELAS.VRPARCELA
                    WHERE NRFATURACONT  = V_NRFATURACONT
                      AND NRORG         = P_NRORG;
                END IF;
                BEGIN
                    SELECT NRAGRUPCONTFAT
                    INTO V_NRAGRUPCONTFAT
                    FROM FCT_RELACAGRUPCONTFAT
                    WHERE NRFATURACONT    = V_NRFATURACONT
                        AND NRSEQCONTRATO = P_NRSEQCONTRATO
                        AND NRORG         = P_NRORG;
                EXCEPTION WHEN NO_DATA_FOUND THEN
                  V_NRAGRUPCONTFAT := NULL;
                END;
                IF(V_NRAGRUPCONTFAT IS NULL) THEN
                    NOVO_CODIGO_SC('FCT_RELACAGRUPCONTFAT', V_NRAGRUPCONTFAT, 1, P_NRORG);
                    INSERT INTO FCT_RELACAGRUPCONTFAT (
                       NRAGRUPCONTFAT,     NRFATURACONT, IDPARCAGRUP,  NRSEQCONTRATO,
                       NRORG,              IDATIVO,      DTINCLUSAO,   DTULTATU,
                       CDOPERINCLUSAO,     NRORGULTATU,  CDOPERULTATU, NRMEDICAOFATURA,
                       NRORGINCLUSAO)
                    VALUES (
                          V_NRAGRUPCONTFAT,     V_NRFATURACONT, V_IDPARCAGRUP,       P_NRSEQCONTRATO,
                          P_NRORG,              'S',            SYSDATE,             NULL,
                          P_CDOPERADOR,          NULL,          NULL,                NULL,
                          P_NRORG);
                END IF;
                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.VRPERCDESCITEM,
                           ITNEG.VRDESCITEM,
                           ITNEG.VRTOTITEMCOMDESC,
                           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.VRTOTITEMCOMDESC - (C_ITNEGOCIACAO.VRTOTITEMCOMDESC * 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_NRFATURACONT := NULL;
                    V_IDPARCAGRUP  := 'N';
                    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
                            -- Verifica se há uma parcela pendente inserida para o agrupamento
                            IF(V_NRAGRUPAMENTO IS NOT NULL) THEN
                                BEGIN
                                    SELECT DISTINCT PARCELA.NRFATURACONT
                                    INTO V_NRFATURACONT
                                    FROM FCT_FATURACONT PARCELA
                                    INNER JOIN FCT_RELACAGRUPCONTFAT PARCCONT
                                      ON PARCELA.NRFATURACONT = PARCCONT.NRFATURACONT
                                      AND PARCELA.NRORG       = PARCCONT.NRORG
                                    INNER JOIN FCT_RELACAGRUPAMENTOCONT AGRUPCONT
                                      ON PARCCONT.NRSEQCONTRATO = AGRUPCONT.NRSEQCONTRATO
                                      AND PARCCONT.NRORG        = AGRUPCONT.NRORG
                                    INNER JOIN FCT_AGRUPAMENTO AGRUP
                                      ON AGRUPCONT.NRAGRUPAMENTO = AGRUP.NRAGRUPAMENTO
                                      AND AGRUPCONT.NRORG        = AGRUP.NRORG
                                    WHERE AGRUP.NRAGRUPAMENTO      = V_NRAGRUPAMENTO
                                      AND PARCELA.IDSITUACAO       = '1'
                                      AND PARCELA.IDTPFATURA       = C_NEGOCIACAO.IDTPFATURA
                                      AND PARCELA.CDFILIALFATURA   = C_NEGOCIACAO.CDFILIALFATURA
                                      AND PARCELA.NRPARCFATURA     = C_NEGOCIACAO.NRPARCFATURA
                                      AND PARCELA.CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                                      AND PARCELA.CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                                      AND PARCELA.CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                                      AND PARCELA.CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                                      AND PARCELA.CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                                      AND TO_CHAR(PARCELA.DTINICOMPET, 'DD/MM/YYYY') = V_DTINICOMPET_ATUAL
                                      AND TO_CHAR(PARCELA.DTFINCOMPET, 'DD/MM/YYYY') = V_DTFINCOMPET_ATUAL;
                                EXCEPTION WHEN NO_DATA_FOUND THEN
                                    V_NRFATURACONT := NULL;
                                END;
                            END IF;
                            IF V_NRFATURACONT IS NOT NULL THEN
                                UPDATE FCT_FATURACONT
                                    SET VRVENCIMENTO  = VRVENCIMENTO + V_VRTOTITEMCOMDESC,
                                       VRFALTAFATURAR = VRVENCIMENTO + V_VRTOTITEMCOMDESC
                                WHERE NRFATURACONT  = V_NRFATURACONT
                                  AND NRORG         = P_NRORG;
                            ELSE
                                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
                                );
                            END IF;
                            BEGIN
                                SELECT NRAGRUPCONTFAT
                                INTO V_NRAGRUPCONTFAT
                                FROM FCT_RELACAGRUPCONTFAT
                                WHERE NRFATURACONT    = V_NRFATURACONT
                                    AND NRSEQCONTRATO = P_NRSEQCONTRATO
                                    AND NRORG         = P_NRORG;
                            EXCEPTION WHEN NO_DATA_FOUND THEN
                              V_NRAGRUPCONTFAT := NULL;
                            END;
                            IF(V_NRAGRUPCONTFAT IS NULL) THEN
                              NOVO_CODIGO_SC('FCT_RELACAGRUPCONTFAT', V_NRAGRUPCONTFAT, 1, P_NRORG);
                              INSERT INTO FCT_RELACAGRUPCONTFAT (
                                   NRAGRUPCONTFAT,     NRFATURACONT, IDPARCAGRUP,  NRSEQCONTRATO,
                                   NRORG,              IDATIVO,      DTINCLUSAO,   DTULTATU,
                                   CDOPERINCLUSAO,     NRORGULTATU,  CDOPERULTATU, NRMEDICAOFATURA,
                                   NRORGINCLUSAO)
                              VALUES (
                                      V_NRAGRUPCONTFAT,     V_NRFATURACONT, V_IDPARCAGRUP,       P_NRSEQCONTRATO,
                                      P_NRORG,              'S',            SYSDATE,             NULL,
                                      P_CDOPERADOR,          NULL,          NULL,                NULL,
                                      P_NRORG);
                            END IF;
                            V_VRPERCDESCITEM := (V_VRDESCITEM / V_VRTOTITEMCOMDESC) * 100;
                            FOR C_ITNEGOCIACAO IN (
                                SELECT ITNEG.NRITEMOCONTRATO,
                                       ITNEG.VRTOTITEM,
                                       ITNEG.VRPERCDESCITEM,
                                       ITNEG.VRDESCITEM,
                                       ITNEG.VRTOTITEMCOMDESC,
                                       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.VRTOTITEMCOMDESC - (C_ITNEGOCIACAO.VRTOTITEMCOMDESC * C_NEGOCIACAO.VRPERCDESCITEM / 100);
                                V_VRVENCIMENTOITEM := V_VRVENCIMENTOITEM - (V_VRVENCIMENTOITEM * 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.VRPERCDESCITEM,
                                       ITNEG.VRDESCITEM,
                                       ITNEG.VRTOTITEMCOMDESC,
                                       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.VRTOTITEMCOMDESC - (C_ITNEGOCIACAO.VRTOTITEMCOMDESC * 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;