create or replace
PROCEDURE CRIA_VENCIMENTO(
          P_CDFILIAL      IN VARCHAR2,
          P_NRLANCTONF    IN VARCHAR2,
          P_IDENTRSAIDOP  IN VARCHAR2,
          P_VRPAGTO       IN FLOAT,
          P_DTEMISSAO     IN DATE,
          P_DTENTRSAID    IN DATE,
          P_CDCLIEFORN    IN VARCHAR2,
          P_CDFILIEMIRECE IN VARCHAR2,
          P_ORIGDESTNF    IN VARCHAR2,
          P_CDFILLANC     IN VARCHAR2,
          P_CDFILDEST     IN VARCHAR2,
          P_NRAUTOFORN    IN VARCHAR2,
          P_CDFILPEDIDO   IN VARCHAR2,
          P_NRPEDIDO      IN VARCHAR2)
AS
   V_IDFORMAPGTO     VARCHAR2(01);
   V_NRPARCPGTO      NUMBER;
   V_IDTIPODTPGT     VARCHAR2(4);

   V_COUNT         NUMBER;

   V_SEQUENCIAL      NUMBER;
   V_VRPARCVENC      NUMBER;
   V_NRPARCELAS      NUMBER;
   V_NRPARCELASST    NUMBER;
   V_VRPARCAUXI      NUMBER;
   V_INDIAS          NUMBER;
   V_INGUARDANRDIAS  NUMBER;

   V_DTVENCIMENTO    DATE;
   V_DTBASE          DATE;

   V_VRPAGTO         NUMBER;

   V_CDSERVCONT      VARCHAR2(5);

   V_CODIGO VARCHAR2(1);
   V_CDCLIEFORN VARCHAR2(21);

   V_IDGERPARCST  VARCHAR2(1);
   V_NRDIAPOSEMDOCST NUMBER;

   V_VRTOTIMPONF   NUMBER;
   V_VRTOTIMPONFPR NUMBER;

   V_IDTPPERIODO VARCHAR2(1);

   V_CDFORMPGTO VARCHAR2(2);

   V_CONSDIAUTILAUX VARCHAR2(1);
   V_DTEMISSAOAUX DATE;
   V_CDMODPGTO   VARCHAR2(05);
   V_NRSEQCONTRATO  NUMBER; 
   V_TPVENCCONT     NUMBER;
   V_DIAVENCCONT    NUMBER;
   V_DTCOMPVENC     DATE;
   V_DTVENC         DATE;
   V_DTEMISSAO      DATE;

   V_QTDIASFATUVENC FCT_FATURACONT.QTDIASFATUVENC%TYPE;
   V_VERSAOFATSM    VARCHAR2(1);
   V_DATAAUX        DATE;
   
   
   CURSOR C_PARCELAS (P_CLIEFORN VARCHAR2,
                      P_CODIGO VARCHAR2,
                      P_CDSERVCONT VARCHAR2,
                      P_CDFILIDEST VARCHAR2,
                      P_CDFILILANC VARCHAR2,
                      P_NRAUTOFORN VARCHAR2,
                      P_CDFILPEDIDO VARCHAR2,
                      P_NRPEDIDO VARCHAR2)
       IS
      SELECT NRDIASPGTO, VRPERCPGTO
        FROM
      (SELECT NVL(NRDIASPGTOFO, 0) AS NRDIASPGTO, NVL(VRPERCPGTOFO, 100) VRPERCPGTO
        FROM PRAZOPGTFORN
       WHERE CDFORNECED = P_CDCLIEFORN
         AND P_CODIGO = '0'
       UNION
      SELECT NVL(NRDIASPGTOCL, 0) AS NRDIASPGTO, NVL(VRPERCPGTOCL, 100) VRPERCPGTO
        FROM PRAZOPGTCLIE
       WHERE CDCLIENTE = P_CDCLIEFORN
         AND P_CODIGO = '1'
       UNION
      SELECT NVL(NRDIASPGTOSC, 0) AS NRDIASPGTO, NVL(VRPERCPGTOSC, 100) VRPERCPGTO
        FROM PZPGSERCONT
       WHERE CDCLIENTE = P_CDCLIEFORN
         AND CDSERVCONT = P_CDSERVCONT
         AND P_CODIGO = '2'
       UNION
      SELECT NVL(NRDIASPGTOAF, 0) AS NRDIASPGTO, NVL(VRPERCPGTOAF, 100) VRPERCPGTO
        FROM PRAZOPGTAF
       WHERE CDFILDEST = P_CDFILDEST
         AND CDFILLANC  = P_CDFILLANC
         AND NRAUTOFORN = P_NRAUTOFORN
         AND P_CODIGO = '3'
       UNION
      SELECT NVL(NRDIASPGTOPED, 0) AS NRDIASPGTO, NVL(VRPERCPGTOPED, 100) VRPERCPGTO
        FROM PRAZOPGTOPED
       WHERE CDFILIAL = P_CDFILPEDIDO
         AND NRPEDIDO = P_NRPEDIDO
         AND P_CODIGO = '4'
         UNION
      SELECT NVL(NRDIASMODPGTO, 0) AS NRDIASPGTO, NVL(VRPERCMODPGTO, 100) VRPERCPGTO
        FROM PRAZOMODPGTO
       WHERE CDMODPGTO = V_CDMODPGTO
         AND P_CODIGO = '5');
   FUNCTION FORMAPGTOFIXA(P_DTBASE      IN DATE,
                          P_IDUTDIAPGTO IN VARCHAR2,
                          V_NRDIAFIXO   IN VARCHAR2)
            RETURN DATE
   IS
      V_DATEVENCI    DATE;
      V_INDIAS       NUMBER;

   BEGIN
      IF NOT (P_DTBASE IS NULL) THEN
         /* FORMA FIXA Verifica se o numero informado no cadastro de forma de pagamento e maior
         ou igual ao dia da data de vencimento. Ou se o opcao de gerar 1 parcela no proximo mes
         esteja marcada  */
         IF (P_IDUTDIAPGTO = 'I') THEN
            IF (V_NRDIAFIXO >= TO_NUMBER(TO_CHAR(P_DTBASE, 'DD'))) THEN
               /* pega o maior dia do mes */
               V_INDIAS :=  TO_NUMBER(TO_CHAR(LAST_DAY(P_DTBASE), 'DD'));

                /* Verifica se numero informado no cadastro de forma de pagamento e
                   maior que o ultimo dia do mes. Exemplo informou 31 no cadastro e o ultimo dia do e 30*/
               IF V_NRDIAFIXO > V_INDIAS THEN
                  /*Pega o maior dia do mes */
                  V_DATEVENCI := LAST_DAY(P_DTBASE);
               ELSE
                  /*Joga a data com o dia informado na parametrizcao */
                  V_DATEVENCI := TO_DATE(TO_CHAR(V_NRDIAFIXO)||'/'||TO_CHAR(P_DTBASE, 'MM/YYYY'), 'DD/MM/YYYY');
               END IF;
            ELSE
               V_DATEVENCI := ADD_MONTHS(P_DTBASE, 1);
               /*Vefica se o dia parametrizado e menor ou igual ao ULTIMO DIA do mes (proximo mes)*/
               /*
                 EXEMPLO:
                 PARAMTRIZEI VENCIMENTO PARA TODO DIA 30 DO PROX. MES
                 EMISSAO DA NOTA E DIA 01/01
                 DIA 30/02 NAO EXISTE, PORTANTO ESTE IF E IMPORTANTE
               */
               IF (V_NRDIAFIXO <= TO_NUMBER(TO_CHAR(LAST_DAY(V_DATEVENCI), 'DD'))) THEN
                  V_DATEVENCI := TO_DATE(TO_CHAR(V_NRDIAFIXO)||'/'||TO_CHAR(V_DATEVENCI, 'MM/YYYY'), 'DD/MM/YYYY');
               ELSE
                  V_DATEVENCI := LAST_DAY(V_DATEVENCI);
               END IF;
            END IF;
         ELSE
            V_DATEVENCI := ADD_MONTHS(P_DTBASE, 1);
            /*Vefica se o dia parametrizado e menor ou igual ao ULTIMO DIA do mes (proximo mes)*/
            /*
                 EXEMPLO:
                 PARAMTRIZEI VENCIMENTO PARA TODO DIA 30 DO PROX. MES
                 EMISSAO DA NOTA E DIA 01/01
                 DIA 30/02 NAO EXISTE, PORTANTO ESTE IF E IMPORTANTE
            */
            IF (V_NRDIAFIXO <= TO_NUMBER(TO_CHAR(LAST_DAY(V_DATEVENCI), 'DD'))) THEN
               V_DATEVENCI := TO_DATE(TO_CHAR(V_NRDIAFIXO)||'/'||TO_CHAR(V_DATEVENCI, 'MM/YYYY'), 'DD/MM/YYYY');
            ELSE
               V_DATEVENCI := LAST_DAY(V_DATEVENCI);
            END IF;
         END IF;
         RETURN(V_DATEVENCI);
      ELSE
         RETURN(V_DTEMISSAO);
      END IF;
   END;


   /*DETERMINA O DIA DA SEMANA OU DO MES EM QUE O PAGAMENTO DEVE CAIR*/
   FUNCTION DIAPGTO (P_DTBASE IN DATE,
                     P_IDTPPERIODO IN VARCHAR2,
                     P_CDFORMPGTO IN VARCHAR2) RETURN DATE
   IS
      V_DTVENCIMENTO DATE;
   BEGIN
      V_DTVENCIMENTO := P_DTBASE;
      IF P_IDTPPERIODO = 'M' THEN
         V_DTVENCIMENTO := UTIL_CRIAVENCIMENTO.DIAMES(P_CDFORMPGTO,
                                                      P_DTBASE);
      ELSIF p_IDTPPERIODO = 'S' THEN
         V_DTVENCIMENTO := UTIL_CRIAVENCIMENTO.DIASEMANA(P_CDFORMPGTO,
                                                         P_DTBASE);
      ELSE
         V_DTVENCIMENTO := UTIL_CRIAVENCIMENTO.DIASEMANAMES(P_CDFORMPGTO,
                                                            P_DTBASE);
      END IF;
      RETURN V_DTVENCIMENTO;
   END;


   /* DETERMINA A DATA REFERENCIA DA FORMA DE PAGAMENTO */
   FUNCTION DATAREFERENCIA(P_DTBASEREF IN DATE,
                 P_IDREFECALCPARC IN VARCHAR2)
            RETURN DATE
   IS
   P_DTBASE DATE;
   V_DIASEMANA NUMBER;
   BEGIN
      IF P_IDREFECALCPARC = 'FORA_SEMANA' THEN
         V_DIASEMANA := 8 - TO_CHAR(P_DTBASEREF, 'D');
         P_DTBASE := P_DTBASEREF + V_DIASEMANA;
        /* P_DTBASE := TO_DATE(TO_CHAR(P_DTBASEREF, 'DD') + V_DIASEMANA||TO_CHAR(P_DTBASEREF, '/MM/YYYY'), 'DD/MM/YYYY');  */
      ELSIF P_IDREFECALCPARC = 'FORA_DEZENA' THEN
         IF ((TO_CHAR(P_DTBASEREF, 'DD') >= 01) AND (TO_CHAR(P_DTBASEREF, 'DD') <= 10)) THEN
            P_DTBASE := TO_DATE('11/'||TO_CHAR(P_DTBASEREF, 'MM/YYYY'), 'DD/MM/YYYY');
         ELSIF ((TO_CHAR(P_DTBASEREF, 'DD') >= 11) AND (TO_CHAR(P_DTBASEREF, 'DD') <= 20)) THEN
            P_DTBASE := TO_DATE('21/'||TO_CHAR(P_DTBASEREF, 'MM/YYYY'), 'DD/MM/YYYY');
         ELSIF ((TO_CHAR(P_DTBASEREF, 'DD') >= 21) AND (TO_CHAR(P_DTBASEREF, 'DD') <= 31)) THEN
            P_DTBASE := TO_DATE('01/'||TO_CHAR(P_DTBASEREF, 'MM/YYYY'), 'DD/MM/YYYY');
            P_DTBASE := ADD_MONTHS(P_DTBASE, 1);
         END IF;
      ELSIF P_IDREFECALCPARC = 'FORA_QUINZENA' THEN
         IF ((TO_CHAR(P_DTBASEREF, 'DD') >= 01) AND (TO_CHAR(P_DTBASEREF, 'DD') <= 15)) THEN
            P_DTBASE := TO_DATE('16/'||TO_CHAR(P_DTBASEREF, 'MM/YYYY'), 'DD/MM/YYYY');
         ELSIF ((TO_CHAR(P_DTBASEREF, 'DD') >= 16) AND (TO_CHAR(P_DTBASEREF, 'DD') <= 31)) THEN
            P_DTBASE := TO_DATE('01/'||TO_CHAR(P_DTBASEREF, 'MM/YYYY'), 'DD/MM/YYYY');
            P_DTBASE := ADD_MONTHS(P_DTBASE, 1);
         END IF;
      ELSIF P_IDREFECALCPARC = 'FORA_MES' THEN
         P_DTBASE := TO_DATE('01/'||TO_CHAR(P_DTBASEREF, 'MM/YYYY'), 'DD/MM/YYYY');
         P_DTBASE := ADD_MONTHS(P_DTBASE, 1);
      ELSIF P_IDREFECALCPARC = 'DIA_DE_REFERENCIA' THEN
         P_DTBASE := P_DTBASEREF;
      END IF;
      RETURN(P_DTBASE);
   END;


   /*DETEMINA A DATA BASE E O NUMERO DE DIAS A PARTIR DO TIPO DA FORMA DE PAGAMENTO
   E DO TIPO DA DATA DE PAGAMENTO*/
  
   PROCEDURE FORMAPGTO(P_INDIAS OUT NUMBER,
                       P_DTBASE OUT DATE,
                       P_DTEMISSAO IN DATE,
                       P_DTENTRSAID IN DATE,
                       P_IDTPFORPGT IN VARCHAR2,
                       P_IDTPPERIODO IN VARCHAR2,
                       P_IDUTDIAPGT IN VARCHAR2,
                       P_NRDIAFIXO IN VARCHAR2,
                       P_CODIGO IN VARCHAR2,
                       P_IDTIPODTPGT IN VARCHAR2,
                       P_CDFORMPGTO IN VARCHAR2,
                       P_IDREFECALCPARC IN VARCHAR2)
   IS
   V_DTAUX DATE;
   BEGIN
      IF NOT P_IDTPFORPGT IS NULL THEN
         IF P_IDTPFORPGT = 'V' THEN
            IF P_IDTIPODTPGT = 'EMIN' THEN
               P_INDIAS := 0;
               P_DTBASE := P_DTEMISSAO;
            ELSIF P_IDTIPODTPGT = 'EMEX' THEN
               P_INDIAS := 1;
               P_DTBASE := P_DTEMISSAO;
            ELSIF P_IDTIPODTPGT = 'ENIN' THEN
               P_INDIAS := 0;
               P_DTBASE := P_DTENTRSAID;
            ELSIF P_IDTIPODTPGT = 'ENEX' THEN
               P_INDIAS := 1;
               P_DTBASE := P_DTENTRSAID;
            ELSIF P_IDTIPODTPGT = 'DSIN' THEN
               P_INDIAS := 0;
               P_DTBASE := P_DTENTRSAID;
            ELSIF P_IDTIPODTPGT = 'DSEX' THEN
               P_INDIAS := 1;
               P_DTBASE := P_DTENTRSAID;
            END IF;
            

            /* CHAMA A FUNCAO PARA GERAR A DATA DE REFERENCIA DA FORMA DE PAGAMENTO*/
            
             IF NOT (P_DTBASE IS NULL) THEN
               P_DTBASE := DATAREFERENCIA(P_DTBASE, P_IDREFECALCPARC);
            END IF;

            V_DTAUX := P_DTBASE + P_INDIAS;
            V_DTAUX := V_DTAUX - 1;
            /*SE FOR NOTA FISCAL DE SERVICO, CONSIDERA O DIA DE PAGAMENTO*/
            IF (P_CODIGO = '2') AND NOT (P_CDFORMPGTO IS NULL) THEN
               V_DTAUX := DIAPGTO(V_DTAUX,
                                  P_IDTPPERIODO,
                                  P_CDFORMPGTO);
            END IF;
         ELSE
            P_DTBASE := P_DTEMISSAO;
            V_DTAUX := FORMAPGTOFIXA(P_DTEMISSAO ,P_IDUTDIAPGT, P_NRDIAFIXO);
         END IF;
         P_INDIAS := TRUNC(V_DTAUX - P_DTBASE);
         IF (P_INDIAS IS NULL) THEN
            P_INDIAS := 0;
         END IF;
      END IF;
   END;


   /*CORRIGE A DATA DE VENCIMENTO CONSIDERANDO FERIADO BANCARIO*/
   PROCEDURE CONSISTE_FERI_BANC(P_CDFILIEMIRECE IN VARCHAR2,
                                P_DTVENCIMENTO IN DATE,
                                P_DTVENC OUT DATE,
                                P_IDTIPODTPGTO IN VARCHAR2,
                                P_DTEMISSAO IN DATE)
   IS
      V_BOFERI BOOLEAN;
      V_NRDIASFERI NUMBER;
      V_DTANTERIOR DATE;
      V_IDCONSCALVENNF VARCHAR2(1);
   BEGIN
      V_BOFERI := TRUE;
      P_DTVENC := P_DTVENCIMENTO;

      BEGIN
         SELECT IDCONSCALVENNF
           INTO V_IDCONSCALVENNF
           FROM PARAMFILIAL
          WHERE CDFILIAL = P_CDFILIEMIRECE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
              V_IDCONSCALVENNF := NULL;
      END;
      
      WHILE V_BOFERI LOOP
         IF P_IDTIPODTPGTO = 'EMEX' OR P_IDTIPODTPGTO = 'ENEX' OR P_IDTIPODTPGTO = 'DSEX' THEN
           
            BEGIN
               IF V_IDCONSCALVENNF = 'F' THEN
                  SELECT COUNT(*)
                    INTO V_NRDIASFERI
                    FROM FERIFILI
                   WHERE CDFILIAL = P_CDFILIEMIRECE
                     AND DTFERIFILI BETWEEN P_DTEMISSAO+1 AND P_DTVENC;
               ELSIF V_IDCONSCALVENNF = 'C' THEN
                  SELECT COUNT(*)
                    INTO V_NRDIASFERI
                    FROM FERICOMP
                   WHERE CDFILIAL = P_CDFILIEMIRECE
                     AND DTFERICOMP BETWEEN P_DTEMISSAO+1 AND P_DTVENC;
               ELSE
                  SELECT COUNT(*)
                    INTO V_NRDIASFERI
                    FROM FERIBANC
                   WHERE CDFILIAL = P_CDFILIEMIRECE
                     AND DTFERIBANC BETWEEN P_DTEMISSAO+1 AND P_DTVENC;
               END IF;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_NRDIASFERI := 0;
            END;
         ELSE
            BEGIN 
               IF V_IDCONSCALVENNF = 'F' THEN
                  SELECT COUNT(*)
                    INTO V_NRDIASFERI
                    FROM FERIFILI
                   WHERE CDFILIAL = P_CDFILIEMIRECE
                     AND DTFERIFILI BETWEEN P_DTEMISSAO AND P_DTVENC;
               ELSIF V_IDCONSCALVENNF = 'C' THEN
                  SELECT COUNT(*)
                    INTO V_NRDIASFERI
                    FROM FERICOMP
                   WHERE CDFILIAL = P_CDFILIEMIRECE
                     AND DTFERICOMP BETWEEN P_DTEMISSAO AND P_DTVENC;
               ELSE
                  SELECT COUNT(*)
                    INTO V_NRDIASFERI
                    FROM FERIBANC
                   WHERE CDFILIAL = P_CDFILIEMIRECE
                     AND DTFERIBANC BETWEEN P_DTEMISSAO AND P_DTVENC;
               END IF;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_NRDIASFERI := 0;
            END;
         END IF;

         IF NOT(V_NRDIASFERI = 0) THEN
            V_DTANTERIOR := P_DTVENC;
            P_DTVENC := P_DTVENC + V_NRDIASFERI;
            WHILE V_BOFERI LOOP
               V_DTANTERIOR := V_DTANTERIOR+1;
               BEGIN
                  IF V_IDCONSCALVENNF = 'F' THEN
                     SELECT COUNT(*)
                       INTO V_NRDIASFERI
                       FROM FERIFILI
                      WHERE CDFILIAL = P_CDFILIEMIRECE
                        AND DTFERIFILI BETWEEN V_DTANTERIOR AND P_DTVENC;
                  ELSIF V_IDCONSCALVENNF = 'C' THEN
                     SELECT COUNT(*)
                       INTO V_NRDIASFERI
                       FROM FERICOMP
                      WHERE CDFILIAL = P_CDFILIEMIRECE
                        AND DTFERICOMP BETWEEN V_DTANTERIOR AND P_DTVENC;
                  ELSE
                     SELECT COUNT(*)
                       INTO V_NRDIASFERI
                       FROM FERIBANC
                      WHERE CDFILIAL = P_CDFILIEMIRECE
                        AND DTFERIBANC BETWEEN V_DTANTERIOR AND P_DTVENC;
                  END IF;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_NRDIASFERI := 0;
               END;

               IF V_NRDIASFERI > 0 THEN
                  V_DTANTERIOR := P_DTVENC;
                  P_DTVENC := P_DTVENC + V_NRDIASFERI;
               ELSE
                  V_BOFERI := FALSE;
               END IF;
            END LOOP;
         ELSE
            V_BOFERI := FALSE;
         END IF;
      END LOOP;
   END;

   /*ALTERACAO DOS PARAMETROS NECESSARIOS PARA GERACAO DO FINANCEIRO
     QUANTIDADE DE DIAS, DATA BASE, FORMA DE PAGAMENTO,NUMERO DE PARCELAS*/
   PROCEDURE SET_PARAMETROS (P_CDCLIEFORN IN VARCHAR2,
                             P_IDENTRSAIDOP IN VARCHAR2,
                             P_DTEMISSAO IN DATE,
                             P_DTENTRSAID IN DATE,
                             P_CDFILDEST IN VARCHAR2,
                             P_CDFILLANC IN VARCHAR2,
                             P_NRAUTOFORN IN VARCHAR2,
                             P_CDFILPEDIDO IN VARCHAR2,
                             P_NRPEDIDO IN VARCHAR2,
                             P_CDSERVCONT IN VARCHAR2,
                             P_INDIAS OUT NUMBER,
                             P_DTBASE OUT DATE,
                             P_IDFORMAPGTO OUT VARCHAR2,
                             P_IDTIPODTPGT OUT VARCHAR2,
                             P_IDTPPERIODO OUT VARCHAR2,
                             P_NRPARCELAS OUT VARCHAR2,
                             P_NRPARCPGTO OUT VARCHAR2,
                             P_CDFORMPGTO OUT VARCHAR2,
                             P_CODIGO IN VARCHAR2)
   IS
      V_IDTPFORPGT     VARCHAR2(1);
      V_IDUTDIAPGT     VARCHAR2(1);
      V_NRDIAFIXO      VARCHAR2(2);
      V_IDREFECALCPARC VARCHAR2(30);
      V_DTAUX          DATE;
      V_CONSDIAUTIL    VARCHAR2(1);
      /*PARAMETROS GERAIS PARA GERACAO DA DATA BASE E QUANTIDADE DE DIAS*/
      CURSOR C_PARAMETRIZACAO_PGTO (P_CLIEFORN VARCHAR2,
                                    P_CODIGO VARCHAR2,
                                    P_CDSERVCONT VARCHAR2,
                                    P_CDFILIDEST VARCHAR2,
                                    P_CDFILILANC VARCHAR2,
                                    P_NRAUTOFORN VARCHAR2,
                                    P_CDFILPEDIDO VARCHAR2,
                                    P_NRPEDIDO VARCHAR2)
          IS
         SELECT IDTPFORPGT, IDUTDIAPGT, NRDIAPGFIX, IDTIPODTPGT, CDFORMPGT, IDTPPERIODO, NRPARCPGTO, IDREFECALCPARC, IDCONSDIAUTIL
           FROM
          (SELECT F.IDTPFORPGTFO IDTPFORPGT, F.IDUTDIAPGTFO IDUTDIAPGT, F.NRDIAPGFIXFO NRDIAPGFIX,
                  FP.IDTIPODTPGTO IDTIPODTPGT, F.CDFORMPGTO CDFORMPGT, FP.IDTPPERIODO IDTPPERIODO,
                  F.NRPARCPGTOFO NRPARCPGTO, FP.IDREFECALCPARC, FP.IDCONSDIAUTIL
             FROM FORNECEDOR F, FORMPGTO FP
            WHERE (F.CDFORNECED = P_CDCLIEFORN)
              AND (F.CDFORMPGTO = FP.CDFORMPGTO(+))
              AND (P_CODIGO = '0')
            UNION
           SELECT C.IDTPFORPGTCL IDTPFORPGT, C.IDUTDIAPGTCL IDUTDIAPGT , C.NRDIAPGFIXCL NRDIAPGFIX ,
                  FP.IDTIPODTPGTO IDTIPODTPGT, C.CDFORMPGTO CDFORMPGT, FP.IDTPPERIODO IDTPPERIODO,
                  C.NRPARCPGTOCL NRPARCPGTO, FP.IDREFECALCPARC, FP.IDCONSDIAUTIL
             FROM CLIENTE C, FORMPGTO FP
            WHERE (C.CDCLIENTE = P_CDCLIEFORN)
              AND (C.CDFORMPGTO = FP.CDFORMPGTO(+))
              AND (P_CODIGO = '1')
            UNION
           SELECT SC.IDTPFORPGTSC IDTPFORPGT, SC.IDUTDIAPGTSC IDUTDIAPGT, SC.NRDIAPGFIXSC NRDIAPGFIX,
                  FP.IDTIPODTPGTO IDTIPODTPGT, SC.CDFORMPGTO CDFORMPGT, FP.IDTPPERIODO IDTPPERIODO,
                  SC.NRPARCPGTOSC NRPARCPGTO, FP.IDREFECALCPARC, FP.IDCONSDIAUTIL
             FROM SERVCONTRAT SC, FORMPGTO FP
            WHERE (SC.CDCLIENTE  = P_CDCLIEFORN)
              AND (SC.CDSERVCONT = P_CDSERVCONT)
              AND (SC.CDFORMPGTO = FP.CDFORMPGTO(+))
              AND (P_CODIGO = '2')
            UNION
           SELECT A.IDTPFORPGTAF IDTPFORPGT, A.IDUTDIAPGTAF IDUTDIAPGT, A.NRDIAPGFIXAF NRDIAPGFIX,
                  FP.IDTIPODTPGTO IDTIPODTPGT, A.CDFORMPGTO CDFORMPGT, FP.IDTPPERIODO IDTPPERIODO,
                  NRPARCPGTOAF NRPARCPGTO, FP.IDREFECALCPARC, FP.IDCONSDIAUTIL
             FROM AUTOFORNE A, FORMPGTO FP
            WHERE (A.CDFILDEST  = P_CDFILDEST)
              AND (A.CDFILLANC  = P_CDFILLANC)
              AND (A.NRAUTOFORN = P_NRAUTOFORN)
              AND (A.CDFORMPGTO = FP.CDFORMPGTO(+))
              AND (P_CODIGO = '3')
            UNION
           SELECT P.IDTPFORPGTPED IDTPFORPGT, P.IDUTDIAPAGPED IDUTDIAPGT, P.NRDIAPGFIXPED NRDIAPGFIX,
                  FP.IDTIPODTPGTO IDTIPODTPGT, P.CDFORMPGTO CDFORMPGT, FP.IDTPPERIODO IDTPPERIODO,
                  NRPARCPGTOPED NRPARCPGTO, FP.IDREFECALCPARC, FP.IDCONSDIAUTIL
             FROM PEDIDO P, FORMPGTO FP
            WHERE (P.CDFILIAL   = P_CDFILPEDIDO)
              AND (P.NRPEDIDO   = P_NRPEDIDO)
              AND (P.CDFORMPGTO = FP.CDFORMPGTO(+))
              AND (P_CODIGO = '4')
            UNION
           SELECT M.IDTPFORPGTOMOD IDTPFORPGT, M.IDUTDIAPAGMOD IDUTDIAPGT, M.NRDIAPGFIXMOD NRDIAPGFIX,
                  FP.IDTIPODTPGTO IDTIPODTPGT, M.CDFORMPGTO CDFORMPGT, FP.IDTPPERIODO IDTPPERIODO,
                  NRPARCPGTOMOD NRPARCPGTO, FP.IDREFECALCPARC, '' AS IDCONSDIAUTIL
             FROM MODPGTO M, FORMPGTO FP
            WHERE (CDMODPGTO = V_CDMODPGTO)
              AND (M.CDFORMPGTO = FP.CDFORMPGTO(+))
              AND (P_CODIGO = '5')
              );
              
      CURSOR C_QTPARCELAS(P_CLIEFORN VARCHAR2,
                          P_CODIGO VARCHAR2,
                          P_CDSERVCONT VARCHAR2,
                          P_CDFILIDEST VARCHAR2,
                          P_CDFILILANC VARCHAR2,
                          P_NRAUTOFORN VARCHAR2,
                          P_CDFILPEDIDO VARCHAR2,
                          P_NRPEDIDO VARCHAR2)
          IS
          SELECT MAX(QTPARCELAS)  AS QTPARCELAS
            FROM
            (SELECT COUNT(*) AS QTPARCELAS
               FROM PRAZOPGTFORN
              WHERE CDFORNECED = P_CDCLIEFORN
                AND P_CODIGO = '0'
              UNION
             SELECT COUNT(*) AS QTPARCELAS
               FROM PRAZOPGTCLIE
              WHERE CDCLIENTE = P_CDCLIEFORN
                AND P_CODIGO = '1'
              UNION
             SELECT COUNT(*) AS QTPARCELAS
               FROM PZPGSERCONT
              WHERE CDCLIENTE = P_CDCLIEFORN
                AND CDSERVCONT = P_CDSERVCONT
                AND P_CODIGO = '2'
              UNION
             SELECT COUNT(*) AS QTPARCELAS
               FROM PRAZOPGTAF
              WHERE CDFILDEST  = P_CDFILDEST
                AND CDFILLANC  = P_CDFILLANC
                AND NRAUTOFORN = P_NRAUTOFORN
                AND P_CODIGO = '3'
              UNION
             SELECT COUNT(*) AS QTPARCELAS
               FROM PRAZOPGTOPED
              WHERE CDFILIAL = P_CDFILPEDIDO
                AND NRPEDIDO = P_NRPEDIDO
                AND P_CODIGO = '4'
              UNION
             SELECT COUNT(*) AS QTPARCELAS
               FROM PRAZOMODPGTO
              WHERE CDMODPGTO = V_CDMODPGTO
                AND P_CODIGO = '5');
   BEGIN
      
      OPEN C_PARAMETRIZACAO_PGTO(P_CDCLIEFORN,
                                 P_CODIGO,
                                 P_CDSERVCONT,
                                 P_CDFILDEST,
                                 P_CDFILLANC,
                                 P_NRAUTOFORN,
                                 P_CDFILPEDIDO,
                                 P_NRPEDIDO);
      FETCH C_PARAMETRIZACAO_PGTO INTO
         V_IDTPFORPGT,
         V_IDUTDIAPGT,
         V_NRDIAFIXO,
         P_IDTIPODTPGT,
         P_CDFORMPGTO,
         P_IDTPPERIODO,
         P_NRPARCPGTO,
         V_IDREFECALCPARC,
         V_CONSDIAUTIL;

      P_IDFORMAPGTO := V_IDTPFORPGT;

      V_CONSDIAUTILAUX := V_CONSDIAUTIL;
      
      IF NOT (V_IDTPFORPGT IS NULL) AND C_PARAMETRIZACAO_PGTO%FOUND THEN
         IF V_IDTPFORPGT = 'V' THEN
            /*QUANTIDADE DE PARCELAS*/
            OPEN C_QTPARCELAS(P_CDCLIEFORN,
                              P_CODIGO,
                              P_CDSERVCONT,
                              P_CDFILDEST,
                              P_CDFILLANC,
                              P_NRAUTOFORN,
                              P_CDFILPEDIDO,
                              P_NRPEDIDO);
            FETCH C_QTPARCELAS INTO P_NRPARCELAS;
         ELSE
            P_NRPARCELAS := P_NRPARCPGTO;
         END IF;
         
         /*DETEMINA A DATA BASE E O NUMERO DE DIAS A PARTIR DO TIPO DA FORMA DE PAGAMENTO
           E DO TIPO DA DATA DE PAGAMENTO*/
           
         FORMAPGTO(P_INDIAS,
                   P_DTBASE,
                   P_DTEMISSAO,
                   P_DTENTRSAID,
                   V_IDTPFORPGT,
                   P_IDTPPERIODO,
                   V_IDUTDIAPGT,
                   V_NRDIAFIXO,
                   P_CODIGO,
                   P_IDTIPODTPGT,
                   P_CDFORMPGTO,
                   V_IDREFECALCPARC);
      ELSE
         P_INDIAS := 0;
         P_DTBASE := P_DTEMISSAO;
         P_IDFORMAPGTO := NULL;
         P_IDTIPODTPGT := NULL;
         P_IDTPPERIODO := NULL;
         P_NRPARCELAS := 1;
         P_NRPARCPGTO := 1;
      END IF;

      CLOSE C_PARAMETRIZACAO_PGTO;
      IF C_QTPARCELAS%ISOPEN THEN
         CLOSE C_QTPARCELAS;
      END IF;
   END;
BEGIN
   V_CDCLIEFORN := P_CDCLIEFORN;

   /* DETERMINA O CODIGO PARA PESQUISA DOS DADOS PARA VENCIMENTO :
   0 - FORNECEDOR
   1 - CLIENTE
   2 - CONTRATO DE SERVICO
   3 - AUTORIZACAO DE FORNECIMENTO
   4 - PEDIDO
   5 - SRV
   */
   
   IF P_IDENTRSAIDOP = 'E' THEN
      V_CODIGO := '0';
   ELSIF P_IDENTRSAIDOP = 'S' THEN
      /*BUSCA O CONTRATO DE SERVICO RELACIONADO A NOTA*/
      BEGIN
         SELECT MAX(CDSERVCONT) AS CDSERVCONT
           INTO V_CDSERVCONT
           FROM SERVFATU
          WHERE (CDFILIAL   = P_CDFILIAL) AND
                (NRLANCTONF = P_NRLANCTONF);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
               V_CDSERVCONT := NULL;
      END;
      
      IF (V_CDSERVCONT IS NULL) THEN
         V_CODIGO := '1';
      ELSE
         V_CODIGO := '2';
      END IF;
      
      /* VERIFICA SE A NOTA FOI GERADA NO SISTEMA SRV */
      BEGIN
         SELECT MAX(V.CDMODPGTO), MIN(V.DTINICOMPET)
           INTO V_CDMODPGTO, V_DTEMISSAO
           FROM FCT_APURACAO AP, FCT_VENCPREVCONT V, FCT_PARAMFATCONT PR
          WHERE AP.CDFILIAL = P_CDFILIAL
            AND AP.NRLANCTONF = P_NRLANCTONF
            AND AP.NRAPURACAO = V.NRAPURACAO
            AND V.IDFATURACONTR = 'O'
            AND V.NRSEQCONTRATO = PR.NRSEQCONTRATO
            AND PR.IDGERANFPARC = 'N';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
               V_CDMODPGTO := NULL;
      END;

      
      IF (V_CDMODPGTO IS NOT NULL) THEN
         V_CODIGO := '5';
      END IF;       
    
      /*VERIFICA SE E DEVOLUCAO AO FORNECEDOR*/
      IF P_ORIGDESTNF = 'F' THEN
         /* BUSCA O CLIENTE RELACIONADO AO FORNECEDOR NO CADASTRO DE FORNECEDOR
          APENAS PARA NOTA DE DEVOLUCAO */
         BEGIN
            SELECT CDCLIENTE
              INTO V_CDCLIEFORN
              FROM FORNECEDOR
             WHERE CDFORNECED = P_CDCLIEFORN;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDCLIEFORN := NULL;
         END;
         V_CODIGO := '2';
      END IF;
   ELSIF P_IDENTRSAIDOP = 'A' THEN
      V_CODIGO := '3';
   ELSIF P_IDENTRSAIDOP = 'P' THEN
      V_CODIGO := '4';
   END IF;

   /* VERIFICA GERACAO DE PARCELA DE SUBST. TRIBUTARIA*/
   IF (V_CODIGO = '1') OR (V_CODIGO = '4') THEN
   
     /*BUSCA SE EXISTE ALGUEM IMPOSTO ACRESCER PARA GERAR PARCELA SEPADARA*/
     Begin
      SELECT COUNT(1)
        INTO V_COUNT
        FROM IMPOSNFTOT IT, IMPOSTO I
       WHERE IT.CDFILIAL = P_CDFILIAL
         AND IT.NRLANCTONF = P_NRLANCTONF
         AND IT.CDIMPOSTO= I.CDIMPOSTO
         AND I.IDTRATIMPO = 'A'
         AND I.IDGERAPARCFIN = 'S';
     Exception
        When No_Data_Found Then
           V_COUNT := 0;
     End;

     /*BUSCA  VALOR DO IMPOSTO ACRESCER PARA SOMAR NA PRIMEIRA PARCELA */
     Begin
        SELECT NVL(SUM(N.VRTOTIMPONF + NVL(VRADICFECP, 0)), 0)
          INTO V_VRTOTIMPONFPR
          FROM IMPOSNFTOT N, IMPOSTO I
         WHERE N.CDFILIAL = P_CDFILIAL
           AND N.NRLANCTONF = P_NRLANCTONF
           AND N.CDIMPOSTO= I.CDIMPOSTO
           AND I.IDTRATIMPO = 'A'
           AND IDGERAPARCFIN = 'P';
     Exception
        When No_Data_Found Then
           V_VRTOTIMPONFPR := 0;
     End;

   ELSE
      V_COUNT := 0;
   END IF;

   IF(V_CODIGO <> '5') THEN
         V_DTEMISSAO := P_DTEMISSAO;
   END IF;
   
   
   
   /*VALOR DA PARCELA DE SUBST. TRIBUTARIA*/
   V_VRTOTIMPONF  := 0;
   V_NRPARCELASST := 0;
   IF V_COUNT > 0 THEN
      Begin
         SELECT SUM(NVL(N.VRTOTIMPONF + NVL(VRADICFECP, 0), 0)), MAX(NRDIASEMISDOC)
           INTO V_VRTOTIMPONF, V_NRDIAPOSEMDOCST
           FROM IMPOSNFTOT N, IMPOSTO I
          WHERE N.CDFILIAL = P_CDFILIAL
            AND N.NRLANCTONF = P_NRLANCTONF
            AND N.CDIMPOSTO= I.CDIMPOSTO
            AND I.IDTRATIMPO = 'A'
            AND IDGERAPARCFIN = 'S';
      Exception
         When No_Data_Found Then
            V_VRTOTIMPONF := 0;
      End;

      /*LANCA VENCIMENTO PARA O VALOR DA SUBST. TRIBUTARIA*/
      IF NOT (V_VRTOTIMPONF = 0) THEN
         V_NRPARCELASST := 1;

         INSERT INTO TRAB_VENCIMENTO
           (CDFILIALVENC, NRLANCTONFVENC, DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC, IDTPCONTATRABVEN)
         VALUES
           (P_CDFILIAL, P_NRLANCTONF, (V_DTEMISSAO + V_NRDIAPOSEMDOCST), ROUND(V_VRTOTIMPONF, 2), NVL(V_NRDIAPOSEMDOCST, 0), LPAD(TO_CHAR(V_NRPARCELASST), 5, '0'), 'S');
      END IF;
   END IF;

   V_INDIAS := 0;
   V_DTVENCIMENTO := NULL;

   /*DETERMINA A DATA BASE E O NUMERO DE DIAS APOS A EMISSAO*/
   
   SET_PARAMETROS(V_CDCLIEFORN,
                  P_IDENTRSAIDOP,
                  V_DTEMISSAO,
                  P_DTENTRSAID,
                  P_CDFILDEST,
                  P_CDFILLANC,
                  P_NRAUTOFORN,
                  P_CDFILPEDIDO,
                  P_NRPEDIDO,
                  V_CDSERVCONT,
                  V_INGUARDANRDIAS,
                  V_DTBASE,
                  V_IDFORMAPGTO,
                  V_IDTIPODTPGT,
                  V_IDTPPERIODO,
                  V_NRPARCELAS,
                  V_NRPARCPGTO,
                  V_CDFORMPGTO,
                  V_CODIGO);

  
   /*ABATE A PARCELA DE IMPOSTO*/
   IF V_VRTOTIMPONFPR IS NULL THEN
      V_VRTOTIMPONFPR := 0;
   END IF;
   
  /*VERIFICA SE A NOTA FOI GERADA NO SISTEMA PEBBIAN SM - FATURAMENTO ANTIGO (VERSAO 1) */
   BEGIN
      SELECT CT.NRSEQCONTRATO, CT.IDTPDTVENC, CT.NRDIAVENPARCFAT, MAX(V.DTVENCIMENTO), '1' AS VERSAO
        INTO V_NRSEQCONTRATO, V_TPVENCCONT, V_DIAVENCCONT, V_DTCOMPVENC, V_VERSAOFATSM
        FROM FCT_APURACAO AP, FCT_VENCPREVCONT V, FCT_CONTRATO CT, FCT_PARAMFATCONT PR
       WHERE AP.CDFILIAL = P_CDFILIAL
         AND AP.NRLANCTONF = P_NRLANCTONF
         AND V.NRAPURACAO =  AP.NRAPURACAO
         AND ((V.IDFATURACONTR = 'A') OR ((V.IDFATURACONTR = 'O') AND (PR.IDGERANFPARC = 'S')))
         AND PR.NRSEQCONTRATO = CT.NRSEQCONTRATO
         AND CT.NRSEQCONTRATO = AP.NRSEQCONTRATO
         GROUP BY CT.NRSEQCONTRATO, CT.IDTPDTVENC, CT.NRDIAVENPARCFAT;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_NRSEQCONTRATO := NULL;
         V_TPVENCCONT    := NULL;
         V_DIAVENCCONT   := NULL;
         V_DTCOMPVENC    := NULL;
         V_VERSAOFATSM   := NULL;
      END;
   END;

   IF (V_NRSEQCONTRATO IS NULL) THEN
       /*VERIFICA SE A NOTA FOI GERADA NO SISTEMA PEBBIAN SM - FATURAMENTO NOVO (VERSAO 2) */
       BEGIN
          SELECT FAT.NRFATURACONT, 0, FAT.DTVENCIMENTO, FAT.NRDIASVENCIMENTO, FAT.QTDIASFATUVENC, '2' AS VERSAO
            INTO V_NRSEQCONTRATO, V_TPVENCCONT, V_DTCOMPVENC, V_DIAVENCCONT, V_QTDIASFATUVENC, V_VERSAOFATSM
            FROM FCT_APURACAO APU
            JOIN FCT_RELACAPURACAOFATURA RELAP
              ON APU.NRAPURACAO = RELAP.NRAPURACAO
            JOIN FCT_FATURACONT FAT
              ON RELAP.NRFATURACONT = FAT.NRFATURACONT
           WHERE APU.CDFILIAL   = P_CDFILIAL
             AND APU.NRLANCTONF = P_NRLANCTONF;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN BEGIN
             V_NRSEQCONTRATO  := NULL;
             V_TPVENCCONT     := NULL;
             V_DIAVENCCONT    := NULL;
             V_DTCOMPVENC     := NULL;
             V_QTDIASFATUVENC := NULL;
             V_VERSAOFATSM    := NULL;
          END;
       END;

   END IF;
   
   
   /* Se for gerada no Pebbian SM, verifica se o tipo de vencimento do contrato e o 5 - Forma de Pagamento do Cliente */
   
   /* BLOCO ABAIXO COMENTADO PELA EQUIPE SM
   O sistema vai considerar a forma de pagamento do cliente.
   Caso nao tenha, considera o que foi definido no contrato do SM.

   IF (V_TPVENCCONT IS NOT NULL AND V_TPVENCCONT <> 5) THEN
      V_IDFORMAPGTO := NULL;
   END IF; */
   
   /*ABATE A PARCELA DE IMPOSTO*/
   V_VRPAGTO := ROUND(P_VRPAGTO - V_VRTOTIMPONF - V_VRTOTIMPONFPR, 2);   
   IF V_IDFORMAPGTO IS NULL THEN /* SEM FORMA DE PAGAMENTO*/
      V_NRPARCELAS := 1;
      
     /* Rotina do Pebbian SM para pegar a data correta para o vencimento da parcela. */ 
      IF V_NRSEQCONTRATO IS NOT NULL THEN
         
         IF (V_VERSAOFATSM = '1') THEN
             -- FATURAMENTO ANTIGO
             /* 1 - Quantidade dias anterior Data de Emissao */
             IF V_TPVENCCONT = 1 THEN
                V_DTVENC := P_DTENTRSAID-V_DIAVENCCONT; 
            
             /* 2 - Quantidade dias posterior Data de Emissao */
             ELSIF V_TPVENCCONT = 2 THEN
                V_DTVENC := P_DTENTRSAID+V_DIAVENCCONT;
            
             /*3 - Proximo dia posterior data de emissao */
             ELSIF V_TPVENCCONT = 3 THEN
                IF TO_NUMBER(TO_CHAR(P_DTENTRSAID,'DD')) > V_DIAVENCCONT THEN 
                   V_DTVENC := TO_DATE(V_DIAVENCCONT||'/'||TO_CHAR(ADD_MONTHS(P_DTENTRSAID,1),'MM/YYYY'));
                ELSE
                   V_DTVENC := TO_DATE(V_DIAVENCCONT||'/'||TO_CHAR(P_DTENTRSAID,'MM/YYYY'));
                 END IF;

             /*4 - Proximo dia anterior data de emissao*/
             ELSIF V_TPVENCCONT = 4 THEN
                IF TO_NUMBER(TO_CHAR(P_DTENTRSAID,'DD')) > V_DIAVENCCONT THEN 
                   V_DTVENC := TO_DATE(V_DIAVENCCONT||'/'||TO_CHAR(P_DTENTRSAID,'MM/YYYY'));
                ELSE
                   V_DTVENC := TO_DATE(V_DIAVENCCONT||'/'||TO_CHAR(ADD_MONTHS(P_DTENTRSAID,-1),'MM/YYYY'));
                END IF;

             END IF;
             
             V_DTVENC := V_DTCOMPVENC;

         ELSE
            -- FATURAMENTO NOVO
            IF (V_DIAVENCCONT IS NOT NULL) THEN
                V_DTVENC := V_DTEMISSAO + V_DIAVENCCONT;

            ELSIF (V_DTCOMPVENC IS NOT NULL) THEN
                V_DTVENC := V_DTCOMPVENC;

                IF (V_QTDIASFATUVENC IS NOT NULL) THEN
                    V_DATAAUX := V_DTEMISSAO + V_QTDIASFATUVENC;
                   
                    IF (TRUNC(V_DATAAUX) > TRUNC(V_DTVENC)) THEN
                        V_DTVENC := V_DATAAUX;
                    END IF;

                END IF;

            ELSE
                V_DTVENC := V_DTEMISSAO;
            END IF;

         END IF;

      ELSE
         /* Se nao for do Pebbian SM, recebe a DTEMISSAO como fazia antes*/ 
         V_DTVENC := V_DTEMISSAO;
      END IF;
      
      INSERT INTO TRAB_VENCIMENTO
         (CDFILIALVENC, NRLANCTONFVENC, DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC, IDTPCONTATRABVEN)
      VALUES
         (P_CDFILIAL, P_NRLANCTONF, V_DTVENC, ROUND(V_VRPAGTO+V_VRTOTIMPONFPR, 2), 0, LPAD(TO_CHAR(1+V_NRPARCELASST),5, '0'), 'N');
   ELSIF (V_IDFORMAPGTO = 'F') THEN /*FORMA DE PAGAMENTO FIXA*/
      V_DTVENCIMENTO := V_DTBASE + V_INGUARDANRDIAS;
      V_VRPARCVENC := ROUND(V_VRPAGTO/V_NRPARCPGTO,2);
      V_SEQUENCIAL := 1;
      V_NRPARCELAS := V_NRPARCPGTO;
      /*LANCA CONTAS PARA O MESMO DIA INDICADO POREM EM MESES DIFERENTES*/
      WHILE V_SEQUENCIAL <= V_NRPARCELAS LOOP
         IF V_SEQUENCIAL = V_NRPARCELAS THEN
            V_VRPARCVENC := V_VRPARCVENC + ROUND(V_VRPAGTO - (V_VRPARCVENC * V_NRPARCPGTO),2);
         END IF;
         /*INSERE OS DADOS DO VENCIMENTO*/
         INSERT INTO TRAB_VENCIMENTO
            (CDFILIALVENC, NRLANCTONFVENC, DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC, IDTPCONTATRABVEN)
         VALUES
            (P_CDFILIAL, P_NRLANCTONF, V_DTVENCIMENTO, ROUND(DECODE(V_SEQUENCIAL, 1, V_VRPARCVENC+V_VRTOTIMPONFPR, V_VRPARCVENC), 2), NVL(TRUNC(V_DTVENCIMENTO-V_DTEMISSAO), 0), LPAD(TO_CHAR(V_SEQUENCIAL+V_NRPARCELASST), 5, '0'), 'N');

         IF NOT (V_DTVENCIMENTO IS NULL) THEN
            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
         END IF;

         V_SEQUENCIAL := V_SEQUENCIAL + 1;
      END LOOP;
   ELSE /*FORMA DE PAGAMENTO VARIAVEL*/
      V_SEQUENCIAL := 1;
      V_VRPARCAUXI := 0;
      

      /*PARCELAS PARA GERACAO DE TIPO DE PAGAMENTO VARIAVEL*/
      FOR C_PARC IN C_PARCELAS(V_CDCLIEFORN,
                               V_CODIGO,
                               V_CDSERVCONT,
                               P_CDFILDEST,
                               P_CDFILLANC,
                               P_NRAUTOFORN,
                               P_CDFILPEDIDO,
                               P_NRPEDIDO
                               ) LOOP

         V_VRPARCVENC := ROUND((V_VRPAGTO * (C_PARC.VRPERCPGTO/100)),2);
         V_VRPARCAUXI := V_VRPARCAUXI + V_VRPARCVENC;

         IF V_SEQUENCIAL = V_NRPARCELAS THEN
            V_VRPARCVENC := V_VRPARCVENC + ROUND((V_VRPAGTO - V_VRPARCAUXI),2);
         END IF;

         IF C_PARC.NRDIASPGTO = 0 THEN
            V_INDIAS := V_INGUARDANRDIAS +1;
         ELSE
            V_INDIAS := V_INGUARDANRDIAS + C_PARC.NRDIASPGTO;
         END IF;

         IF NOT V_DTBASE IS NULL THEN
            V_DTVENCIMENTO := V_DTBASE + V_INDIAS;
         END IF;

         IF V_IDTIPODTPGT = 'ENEX' OR V_IDTIPODTPGT = 'DSEX' OR
            V_IDTIPODTPGT = 'ENIN' OR V_IDTIPODTPGT = 'DSIN' THEN            
            V_DTEMISSAOAUX := P_DTENTRSAID;
         ELSE
            V_DTEMISSAOAUX := V_DTEMISSAO;
         END IF;
         
         IF V_CONSDIAUTILAUX = 'S' THEN
            CONSISTE_FERI_BANC(P_CDFILIEMIRECE,
                               V_DTVENCIMENTO,
                               V_DTVENCIMENTO,
                               V_IDTIPODTPGT,
                               V_DTEMISSAOAUX);
         END IF;

         /*CONSIDERA DIA DE PAGAMENTO. CASO FOR NOTA FISCAL DE SERVICO, O DIA DE PAGAMENTO JA FOI CONSISTIDO ANTERIORMENTE*/
         IF NOT (V_DTVENCIMENTO IS NULL) THEN
            V_DTVENCIMENTO := DIAPGTO(V_DTVENCIMENTO,
                                      V_IDTPPERIODO,
                                      V_CDFORMPGTO);
         END IF;

         INSERT INTO TRAB_VENCIMENTO
            (CDFILIALVENC, NRLANCTONFVENC, DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC, IDTPCONTATRABVEN)
         VALUES
            (P_CDFILIAL, P_NRLANCTONF, V_DTVENCIMENTO, ROUND(DECODE(V_SEQUENCIAL, 1, V_VRPARCVENC+V_VRTOTIMPONFPR, V_VRPARCVENC), 2), NVL(TRUNC(V_DTVENCIMENTO-V_DTEMISSAO), 0), LPAD(TO_CHAR(V_SEQUENCIAL+V_NRPARCELASST), 5, '0'), 'N');

         V_SEQUENCIAL := V_SEQUENCIAL + 1;
      END LOOP;
      
      
      IF V_SEQUENCIAL = 1 THEN /*FORMA DE PAGAMENTO VARIAVEL NAO INFORMADA. LANCAMENTO A VISTA*/
         INSERT INTO TRAB_VENCIMENTO
            (CDFILIALVENC, NRLANCTONFVENC, DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC, IDTPCONTATRABVEN)
         VALUES
            (P_CDFILIAL, P_NRLANCTONF, V_DTEMISSAO, ROUND(V_VRPAGTO+V_VRTOTIMPONFPR, 2), 0, LPAD(TO_CHAR(1+V_NRPARCELASST),5, '0'), 'N');
      END IF;
   END IF;

   IF C_PARCELAS%ISOPEN THEN
      CLOSE C_PARCELAS;
   END IF;
   
END;
/