ALTER TABLE PARASUPRI ADD IDDESCONSILIMICALECMP VARCHAR2(1) DEFAULT 'N' NULL 
        CONSTRAINT CKC_PARSUP_IDDSCNSIDLMTCALECMP CHECK (IDDESCONSILIMICALECMP IS NULL OR (IDDESCONSILIMICALECMP IN ('S','N'))) 
/
CREATE OR REPLACE
PROCEDURE NECESSIDADE_DE_COMPRAS (
    P_CDFILIAL                IN  VARCHAR2,
    P_TCDFILIAL               IN  VARCHAR2,
    P_CDGRUPFILI              IN  GRUPFILI.CDGRUPFILI%TYPE,
    P_DTINICIAL               IN  DATE,
    P_DTFINAL                 IN  DATE,
    P_CDPRODINI               IN  PRODUTO.CDARVPROD%TYPE,
    P_CDPRODFIN               IN  PRODUTO.CDARVPROD%TYPE,
    P_PEACRESCIMO             IN  NUMBER,
    P_CDOPERADOR              IN  OPERADOR.CDOPERADOR%TYPE,
    P_DTHRCALCNC              IN  DATE,
    P_IDQTDEZERO              IN  VARCHAR2,
    P_NRNECECOMP              IN  TRABNECECOMP.NRNECECOMP%TYPE,
    P_EXTRA                   IN  VARCHAR2 DEFAULT 'N',
    P_CDSUBGRUPO              IN  VARCHAR2 DEFAULT NULL,
    P_CDGRUPPROD              IN  VARCHAR2 DEFAULT NULL)
IS

    TYPE CURTYPE              IS REF CURSOR;
    CUR_FILIAL                CURTYPE;
    C_PREV_DATA               CURTYPE;
    C_PREV                    CURTYPE;
    C_PRODUTO                 CURTYPE;
    V_SQLFILIAL               VARCHAR2(2000);
    V_SQLCPREV                VARCHAR2(6000);
    V_SQLF_GFILIAL            VARCHAR2(1000);
    V_SQLW_GFILIAL            VARCHAR2(1000);
    V_SQLFILTER               VARCHAR2(2000);
    V_FILIAL_CORRENTE         VARCHAR2(4);
    V_FILIAL_UNICA            VARCHAR2(4);
    V_IDSISDOS                VARCHAR2(1);
    V_RETIRDATA               NUMBER;
    V_ENTRADADATA             NUMBER;
    V_NRDIASEG                NUMBER := 0;
    V_NRDIASEGANT             NUMBER := 0;
    V_APENAS_CONSUMO          NUMBER;
    V_QTDESTOQUENEGCALC       NUMBER;
    V_QTESTOQUENECCMP         NUMBER;
    V_QTESTOQUENECCMP_1       NUMBER;
    V_QTESTOQUEVND            NUMBER;
    V_QTDIAESTOQUE            NUMBER;
    V_VALRESTO                NUMBER;
    V_VALRBRUT                NUMBER;

    V_FILINECE                INT;
    V_PRODFILI                INT;

    V_CDPRODINI               VARCHAR2(40);
    V_CDPRODFIN               VARCHAR2(40);
    V_CODPRODUTO              VARCHAR2(10);
    V_CODARVPRODUTO           VARCHAR2(20);
    V_CODPRODUTOPREF          VARCHAR2(10);
    V_CDPERIENTR              VARCHAR2(2);
    V_NRLIMISEGCAD            LIMISEGPROD.NRLIMISEGU%TYPE;
    V_DTPROCESS               DATE;
    V_DTENTREGA               DATE;
    V_DTANTPROXENT            DATE;
    V_DTMAXENTREGA            DATE;
    V_DTMAXENTREGA_ADD1       DATE;
    V_DTPRIMEIRAENTREGA       DATE;
    V_DTPRIMEIRAUTILIZAPROD   DATE;
    V_IDESTOQUE               CHAR(1);
    V_IDEVOLESTONC            CHAR(1);
    V_IDUTILDTPROC            CHAR(1);
    V_IDENTRADAFORAPERIODO    VARCHAR2(1);
    V_IDESTOQUENEGATIVO       CHAR(1);
    V_IDMARCNECCOMPRA         CHAR(1);
    V_UTILIZAPRODPREF         CHAR(1);
    V_EHPRIMEIRAVEZPROD       CHAR(1);
    V_PRIMEIRAENTFORAPERIODO  CHAR(1);
    V_IDUTILLOTE              CHAR(1);
    V_IDCONSAFNECCMP          CHAR(1);
    V_PRODUTOPERFILPROD       VARCHAR2(20);
    V_QUANTIDADE              FLOAT;
    V_QTCONSUMOPERIODO        FLOAT;
    V_QTCONSUMOPERIODOFILNECE FLOAT;
    V_QTCONSUMOANTECIPADO     FLOAT;
    V_QTCONSUMOANTECIPADOFILNECE FLOAT;
    V_QTASERENTREGUE          FLOAT;
    V_QTASERENTREGUEFILNECE   FLOAT;
    V_FATORCONVERSAO          FLOAT;
    V_QTJASOLICITADA          FLOAT;
    V_QTJASOLICITADAFP        FLOAT;
    V_QTAFFUTURA              FLOAT;
    V_QTJASOLICPEXOL          FLOAT;
    V_QTCONSUMOATEPENTREGA    FLOAT;
    V_QTCONSUMOATEPENTREGAFILNECE FLOAT;
    V_QTESTOQUESEGURANCA      FLOAT;
    V_QTDESTOQUEATUAL         FLOAT;
    V_QTDESTOQUEUTILIZADO     FLOAT;
    V_QTDTEORICANECCOMPRA     FLOAT;
    V_QTDORIGINALNECCOMPRA    FLOAT;
    V_QTDPRACOMPRAR           FLOAT;
    V_VRARREDONDACMP          FLOAT;
    V_VRFATORCONVERSAO        FLOAT;
    V_QTDPRODUTOCONVCOMPRA    FLOAT;
    V_QTDESTOQUENEGATIVOIMPR  FLOAT;
    V_QTDAFANTPRIMEIRAENT     FLOAT;
    V_QTDEESTO                FLOAT;

    V_QTESTAFPANT             FLOAT;
    V_QTESTAFPDEP             FLOAT;
    V_QTESTAFPEND             FLOAT;
    V_QTESTAFPEXOL            FLOAT;
    V_QTESTOQATUAL            FLOAT;
    V_EXTRA                   CHAR(1);
    V_IDMAPDISTALMOX          CHAR(1);

    V_PERFILPROD_DNUTIL  VARCHAR2(1); -- Parâmetro utiliza dia não util da tabela PERFILPROD (tem precedência ao PERIENTR)
    V_PERFILPROD_SITENTR VARCHAR2(1); -- Parâmetro que define se atrasa (A) ou adianta (D) a entrega do produto
    V_DTATRASA                DATE;
    V_DTTESTE                 DATE;
    V_DTATRASA2               DATE;
    V_DTANTAUX                DATE;
    V_DTTEMP                  DATE;
    V_QTDTEMP                 FLOAT;
    V_CONTADOR                INTEGER;
    V_CONTADOR2               INTEGER;
    V_TESTE                   FLOAT;
    V_COMPARA                 INTEGER;
    V_CONTROLE                INTEGER;
    V_CONTTEMP                INTEGER;
    V_NRRETMAXLOT             INTEGER;
    V_LOTE                    VARCHAR2(10);

    C_UNDERSCORE              CHAR(1):= '_';
    W_A                       CHAR(1):= 'A';
    W_N                       CHAR(1):= 'N';
    W_X                       CHAR(1):= 'X';
    W_P                       CHAR(1):= 'P';
    W_S                       CHAR(1):= 'S';
    W_0                       CHAR(1):= '0';
    W_1                       CHAR(1):= '1';
    W_2                       CHAR(1):= '2';
    W_3                       CHAR(1):= '3';
    W_4                       CHAR(1):= '4';
    W_5                       CHAR(1):= '5';
    W_6                       CHAR(1):= '6';

    V_CDFILIOPELOG            VARCHAR2(4);
    V_IDCSSOLAFFORAPERICMP    VARCHAR2(1); /*Parâmetro Considerar AFs fora da Periodicidade da Filial no Cálculo da Necessidade de Compras*/
    V_IDCONSANTECPENDNECC     PARASUPRI.IDCONSANTECPENDNECC%TYPE;
    V_DTANTPROXENT_1          DATE;
    V_UTILIZOU_JASOLI         CHAR(1):= 'N';
    V_IDDESCONSILIMICALECMP   PARASUPRI.IDDESCONSILIMICALECMP%TYPE;
    V_QTSOLIPROD              FLOAT;
    V_QTPROGENTAF             FLOAT;
    V_NRSEQCMPGER             VARCHAR2(10);

BEGIN
    IF P_EXTRA IS NULL THEN
       V_EXTRA := 'N';
    ELSE
       V_EXTRA := P_EXTRA;
    END IF;

    BEGIN
      SELECT NVL(IDSISDOS, W_1), NVL(IDUTILDTPROC, W_N)
      INTO V_IDSISDOS, V_IDUTILDTPROC
      FROM PARAMGERAL;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
        V_IDSISDOS:= W_1;
        V_IDUTILDTPROC:= W_N;
      END;
    END;

    IF P_CDPRODINI > P_CDPRODFIN THEN
       V_CDPRODINI := RPAD(P_CDPRODINI, 20, 'Z');
       V_CDPRODFIN := P_CDPRODFIN;
    ELSE
       V_CDPRODFIN := RPAD(P_CDPRODFIN, 20, 'Z');
       V_CDPRODINI := P_CDPRODINI;
    END IF;

    /* MONTAGEM DA QUERY PARA BUSCAR FILIAIS */
    IF (((P_TCDFILIAL <> 'T') OR (P_TCDFILIAL IS NULL)) AND (P_CDFILIAL IS NOT NULL)) THEN
      IF (LENGTH(P_CDFILIAL) > 6) THEN
        V_SQLFILTER:= ' WHERE INSTR(''' || P_CDFILIAL || ''', CDFILIAL) > 0 ';
      ELSE
        IF INSTR(P_CDFILIAL, '_') > 0 THEN
           V_FILIAL_UNICA:= SUBSTR(P_CDFILIAL, 2, LENGTH(P_CDFILIAL)-2);
        ELSE
           V_FILIAL_UNICA:= P_CDFILIAL;
        END IF;
        V_SQLFILTER:= ' WHERE  CDFILIAL = ''' || V_FILIAL_UNICA || '''';
      END IF;
    END IF;

    IF P_CDGRUPFILI IS NOT NULL THEN
      V_SQLF_GFILIAL:= '(SELECT CDFILIAL '     ||
                       '  FROM FILGRUPFILI '   ||
                       '  WHERE  CDGRUPFILI = ''' || P_CDGRUPFILI || ''') G, ';
      V_SQLW_GFILIAL:= ' G.CDFILIAL = F.CDFILIAL AND ';
    END IF;

    V_SQLFILIAL:= 'SELECT F.CDFILIAL AS COD_FILIAL_CORRENTE, NVL(PCMP.IDUTPRODPREF, ''' || W_N || '''),' ||
                  'NVL(PCMP.IDSCONESTNEC, ''' || W_N || '''), ' ||
                  'NVL(PCMP.IDMAPDISTALMOX, ''' || W_N || '''), ' ||
                  'NVL(P.IDEVOLESTONC, ''' || W_N || '''), ' ||
                  'DECODE('''||V_IDUTILDTPROC||''',  ''' || W_S || ''', NVL(PF.DTPROCESSA, TRUNC(SYSDATE)), TRUNC(SYSDATE)),' ||
                  'NVL(PF.IDUTILLOTE,'''|| W_N ||'''),'||
                  'NVL(P.IDCONSAFNECCMP,'''|| W_N ||''')'||
                  'FROM (SELECT CDFILIAL, NVL(CDFILCENTCMP, CDFILIAL) AS CDFILCENTCMP, IDCNTRRESC' ||
                  '      FROM FILIAL ' || V_SQLFILTER   || ' ) F, '  || V_SQLF_GFILIAL  ||
                  '      PARCMPSUP PCMP, PARASUPRI P, PARAMFILIAL PF '  ||
                  'WHERE ' || V_SQLW_GFILIAL            ||
                  '      P.CDFILIAL     = F.CDFILCENTCMP ' ||
                  '  AND F.CDFILIAL     = PCMP.CDFILIAL '  ||
                  '  AND F.IDCNTRRESC   = '''|| W_N ||'''' ||
                  '  AND PF.CDFILIAL(+) = F.CDFILIAL ';
    /* FIM -- MONTAGEM DA QUERY PARA BUSCAR FILIAIS */

    V_QTDESTOQUENEGCALC:= 0;

    OPEN CUR_FILIAL FOR V_SQLFILIAL;
    LOOP
      FETCH CUR_FILIAL INTO V_FILIAL_CORRENTE, V_UTILIZAPRODPREF, V_IDESTOQUE, V_IDMAPDISTALMOX, V_IDEVOLESTONC, V_DTPROCESS, V_IDUTILLOTE, V_IDCONSAFNECCMP;
      EXIT WHEN CUR_FILIAL%NOTFOUND;
          V_SQLCPREV:= NULL;
          SELECT COUNT(*)
          INTO V_FILINECE
          FROM FILINECE
          WHERE CDFILIAL = V_FILIAL_CORRENTE;

          SELECT NVL(MAX(P.IDCSSOLAFFORAPERICMP), 'N'), NVL(MAX(IDCONSANTECPENDNECC), 'N'), NVL(MAX(IDDESCONSILIMICALECMP), 'N')
            INTO V_IDCSSOLAFFORAPERICMP, V_IDCONSANTECPENDNECC, V_IDDESCONSILIMICALECMP
            FROM PARASUPRI P INNER JOIN FILIAL F ON P.CDFILIAL = NVL(F.CDFILCENTCMP, F.CDFILIAL)
           WHERE F.CDFILIAL = V_FILIAL_CORRENTE;
           
          -- PROCESSO EXCLUSIVO GR
          IF V_IDSISDOS = W_3 THEN
             V_IDCSSOLAFFORAPERICMP := 'N';
             INSERT INTO NECESSIDADE_TMP
                (NRNECECOMP,
                 CDFILIAL,
                 NRLANCTONF,
                 CDPRODUTO,
                 CDPRODESTO,
                 VRFATOCONV,
                 IDENTRADAAF)
             SELECT
                NRNECECOMP,
                CDFILIAL,
                NRLANCTONF,
                CDPRODUTO,
                CDPRODESTO,
                VRFATOCONV,
                MIN(IDENTRADAAF)
             FROM
                (SELECT /*+ORDERED*/
                 DISTINCT
                   P_NRNECECOMP AS NRNECECOMP,
                   NFRELACAF.CDFILIAL,
                   NFRELACAF.NRLANCTONF,
                   NFRELACAF.CDPRODUTO,
                   PRODUTO.CDPRODESTO,
                   PRODUTO.VRFATOCONV,
                   DECODE(TRUNC(V_DTPROCESS) - ITEMAUTF.DTPROGENTAF, ABS(TRUNC(V_DTPROCESS) - ITEMAUTF.DTPROGENTAF), W_P, W_A) IDENTRADAAF
                 FROM NFRELACAF, ITEMAUTF, PRODUTO
                 WHERE NFRELACAF.CDFILDEST  = V_FILIAL_CORRENTE
                  AND ITEMAUTF.CDFILDEST   = NFRELACAF.CDFILDEST
                  AND ITEMAUTF.CDFILLANC   = NFRELACAF.CDFILLANC
                  AND ITEMAUTF.NRAUTOFORN  = NFRELACAF.NRAUTOFORN
                  AND ITEMAUTF.CDPRODUTO   = NFRELACAF.CDPRODUTO
                  AND ITEMAUTF.CDMARCA     = NFRELACAF.CDMARCA
                  AND ITEMAUTF.DTPROGENTAF = NFRELACAF.DTPROGENTAF
                  AND PRODUTO.CDPRODUTO    = NFRELACAF.CDPRODUTO)
             GROUP BY
                NRNECECOMP,
                CDFILIAL,
                NRLANCTONF,
                CDPRODUTO,
                CDPRODESTO,
                VRFATOCONV;
          END IF;

          IF V_FILINECE > 0 THEN
            V_SQLCPREV:=  'SELECT P.CDPRODESTO AS CDPRODUTO, P.CDARVPROD AS CDARVPRODUTO, P.VRFATOCONV ' ||
                           'FROM V_PREVISAO_COMPRA X, PRODUTO P ' ||
                           'WHERE X.CDFILIAL    = ''' || V_FILIAL_CORRENTE || ''' ' ||
                           '  AND X.DTPREVCONS >= ''' || V_DTPROCESS       || ''' ' ||
                           '  AND P.CDPRODUTO   = X.CDPRODUTO ' ||
                           '  AND P.CDARVPROD BETWEEN ''' || V_CDPRODINI || ''' AND '''  || V_CDPRODFIN || ''' ' ||
                           '  AND (('''||P_CDSUBGRUPO||''' IS NULL)  OR'||
                           '  (EXISTS(SELECT 1 '||
                                     '  FROM PRSUBGRPROD'||
                                     ' WHERE PRSUBGRPROD.CDGRUPPROD  = '''||P_CDGRUPPROD|| ''' ' ||
                                      '  AND INSTR('''||P_CDSUBGRUPO||''', PRSUBGRPROD.CDSUBGRPROD) > 0 '||
                                      '  AND PRSUBGRPROD.CDFILISUBGR = '''|| W_P  || '''  AND PRSUBGRPROD.CDPRODUTO   = P.CDPRODUTO)))';

            V_SQLCPREV:= V_SQLCPREV || ' UNION ' ||
                                       'SELECT ' ||
                                       '   ESTOSEGU.CDPRODESTO AS CDPRODUTO, ' ||
                                       '   PRODUTO.CDARVPROD, '||
                                       '   PRODUTO.VRFATOCONV '||
                                       'FROM '                 ||
                                       '   PRODUTO, '          ||
                                       '   ESTOSEGU '          ||
                                       'WHERE '                ||
                                       '   ESTOSEGU.CDFILIAL = ''' || V_FILIAL_CORRENTE  || ''' ' ||
                                       '   AND PRODUTO.CDPRODUTO = ESTOSEGU.CDPRODESTO ' ||
                                       '   AND PRODUTO.CDARVPROD BETWEEN''' || V_CDPRODINI || ''' AND '''  || V_CDPRODFIN || ''' ' ||
                           '  AND (('''||P_CDSUBGRUPO||''' IS NULL)  OR'||
                           '  (EXISTS(SELECT 1 '||
                                      ' FROM PRSUBGRPROD'||
                                     ' WHERE PRSUBGRPROD.CDGRUPPROD  = '''||P_CDGRUPPROD|| ''' ' ||
                                      '  AND INSTR('''||P_CDSUBGRUPO||''', PRSUBGRPROD.CDSUBGRPROD) > 0 '||
                                      '  AND PRSUBGRPROD.CDFILISUBGR = '''|| W_P  || '''   AND PRSUBGRPROD.CDPRODUTO   = PRODUTO.CDPRODUTO)))';

            V_SQLCPREV:= V_SQLCPREV || ' UNION ' ||
                                       'SELECT P.CDPRODESTO AS CDPRODUTO, P.CDARVPROD AS CDARVPRODUTO, P.VRFATOCONV ' ||
                                       'FROM V_PREVISAO_COMPRA_FILIAL X, PRODUTO P ' ||
                                       'WHERE X.CDFILIAL    = ''' || V_FILIAL_CORRENTE || ''' ' ||
                                       '  AND X.DTPREVCONS >= ''' || V_DTPROCESS       || ''' ' ||
                                       '  AND P.CDPRODUTO   = X.CDPRODUTO ' ||
                                       '  AND P.CDARVPROD BETWEEN ''' || V_CDPRODINI || ''' AND '''  || V_CDPRODFIN || ''' ' ||
                           '  AND (('''||P_CDSUBGRUPO||''' IS NULL)  OR'||
                           '  (EXISTS(SELECT 1 '||
                                      ' FROM PRSUBGRPROD'||
                                     ' WHERE PRSUBGRPROD.CDGRUPPROD  = '''||P_CDGRUPPROD|| ''' ' ||
                                      '  AND INSTR('''||P_CDSUBGRUPO||''', PRSUBGRPROD.CDSUBGRPROD) > 0 '||
                                      '  AND PRSUBGRPROD.CDFILISUBGR = '''|| W_P  || '''  AND PRSUBGRPROD.CDPRODUTO   = P.CDPRODUTO)))';
          ELSE
            V_SQLCPREV:= 'SELECT ' ||
                         '   ESTOSEGU.CDPRODESTO AS CDPRODUTO, ' ||
                         '   PRODUTO.CDARVPROD, '                ||
                         '   PRODUTO.VRFATOCONV '                 ||
                         'FROM '                                 ||
                         '   PRODUTO, '                          ||
                         '   ESTOSEGU '                          ||
                         'WHERE '                                ||
                         '   ESTOSEGU.CDFILIAL = ''' || V_FILIAL_CORRENTE  || ''' ' ||
                         '   AND PRODUTO.CDPRODUTO = ESTOSEGU.CDPRODESTO ' ||
                         '   AND PRODUTO.CDARVPROD BETWEEN ''' || V_CDPRODINI || ''' AND '''  || V_CDPRODFIN || ''' ' ||
                           '  AND (('''||P_CDSUBGRUPO||''' IS NULL)  OR'||
                           '  (EXISTS(SELECT 1 '||
                                      ' FROM PRSUBGRPROD'||
                                     ' WHERE PRSUBGRPROD.CDGRUPPROD  = '''||P_CDGRUPPROD|| ''' ' ||
                                      '  AND INSTR('''||P_CDSUBGRUPO||''', PRSUBGRPROD.CDSUBGRPROD) > 0 '||
                                      '  AND PRSUBGRPROD.CDFILISUBGR = '''|| W_P  || '''  AND PRSUBGRPROD.CDPRODUTO   = PRODUTO.CDPRODUTO)))';

            V_SQLCPREV:= V_SQLCPREV || ' UNION ' ||
                          'SELECT P.CDPRODESTO AS CDPRODUTO, P.CDARVPROD AS CDARVPRODUTO, P.VRFATOCONV ' ||
                          'FROM V_PREVISAO_COMPRA X, PRODUTO P ' ||
                          'WHERE X.CDFILIAL    = ''' || V_FILIAL_CORRENTE || ''' ' ||
                          '  AND X.DTPREVCONS >= ''' || V_DTPROCESS       || ''' ' ||
                          '  AND P.CDPRODUTO   = X.CDPRODUTO ' ||
                          '  AND P.CDARVPROD BETWEEN ''' || V_CDPRODINI || ''' AND '''  || V_CDPRODFIN || ''' ' ||
                           '  AND (('''||P_CDSUBGRUPO||''' IS NULL)  OR'||
                           '  (EXISTS(SELECT 1 '||
                                      ' FROM PRSUBGRPROD'||
                                     ' WHERE PRSUBGRPROD.CDGRUPPROD  = '''||P_CDGRUPPROD|| ''' ' ||
                                      '  AND INSTR('''||P_CDSUBGRUPO||''', PRSUBGRPROD.CDSUBGRPROD) > 0 '||
                                      '  AND PRSUBGRPROD.CDFILISUBGR = '''|| W_P  || '''  AND PRSUBGRPROD.CDPRODUTO   = P.CDPRODUTO)))';
          END IF;

          OPEN C_PREV FOR V_SQLCPREV;
          LOOP
            FETCH C_PREV INTO V_CODPRODUTO, V_CODARVPRODUTO, V_FATORCONVERSAO;
            EXIT WHEN C_PREV%NOTFOUND;
              SELECT
                 COUNT(*)
              INTO
                 V_PRODFILI
              FROM
                 PRODFILI
              WHERE
                 V_FILIAL_CORRENTE    = PRODFILI.CDFILIAL   AND
                 V_CODPRODUTO         = PRODFILI.CDPRODUTO  AND
                 NVL(PRODFILI.IDPRODATIV,'A') = 'A';
              IF V_PRODFILI > 0 THEN
                 V_PRODUTOPERFILPROD := NULL;
                 SELECT
                    MAX(B.CDARVPROD)
                 INTO V_PRODUTOPERFILPROD
                 FROM
                    PERFILPROD A,
                    PRODUTO B
                 WHERE
                    A.CDPRODUTO = B.CDPRODUTO       AND
                    A.CDFILIAL  = V_FILIAL_CORRENTE AND
                    INSTR(V_CODARVPRODUTO, B.CDARVPROD) = 1;

                 -- PROCESSO EXCLUSIVO GR
                 IF V_IDSISDOS = W_3 THEN
                   V_ENTRADADATA:= 0;
                   V_RETIRDATA:= 0;
                 ELSE
                    /* 2 - VERIFICA SE HOUVE ENTRADA PARA CONSIDERAR COMO ESTOQUE ENTREGUE */
                    SELECT NVL(SUM(DECODE(IDTIPOMOVI, 2, 1, 0)), 0) IDTIPOMOVI_2,
                           NVL(SUM(DECODE(IDTIPOMOVI, 3, 1, 0)), 0) IDTIPOMOVI_3
                    INTO V_ENTRADADATA, V_RETIRDATA
                    FROM ITLANCTOEST
                    WHERE CDFILIMOVI = V_FILIAL_CORRENTE
                      AND DTLANCMOVI = V_DTPROCESS
                      AND CDPRODMOVI = V_CODPRODUTO
                      AND IDTIPOMOVI IN (W_2, W_3);
                 END IF;
                 V_EHPRIMEIRAVEZPROD:= W_S;
                 V_PRIMEIRAENTFORAPERIODO:= W_S;
                 V_QTDESTOQUENEGCALC:= 0;
                 V_QTESTOQUENECCMP:= 0;
                 V_QTDESTOQUENEGATIVOIMPR:= 0;
                 V_DTPRIMEIRAENTREGA:= NULL;

                 IF V_IDDESCONSILIMICALECMP = 'N' THEN
                    OPEN C_PREV_DATA FOR
                       SELECT CALECOMP.DTENTREGA, CALECOMP.DTANTPROXENT, CALECOMP.CDPERIENTR,
                              W_N AS IDENTFORPERI
                       FROM PERFILPROD, CALECOMP, PRODUTO P
                       WHERE PERFILPROD.CDPRODUTO = P.CDPRODUTO
                         AND PERFILPROD.CDFILIAL  = V_FILIAL_CORRENTE
                         AND CALECOMP.CDFILIAL    = PERFILPROD.CDFILIAL
                         AND CALECOMP.CDPERIENTR  = PERFILPROD.CDPERIENTR
                         AND P.CDARVPROD = V_PRODUTOPERFILPROD
                         AND CALECOMP.DTENTREGA   BETWEEN V_DTPROCESS AND P_DTFINAL
                       UNION ALL
                       SELECT DISTINCT ITEMAUTF.DTPROGENTAF AS DTENTREGA, TO_DATE(NULL) AS DTANTPROXENT,
                                       LPAD(' ', 2, ' ') AS CDPERIENTR,  W_S  AS IDENTFORPERI
                       FROM PRODUTO P, AUTOFORNE, ITEMAUTF
                       WHERE ITEMAUTF.CDFILDEST     = V_FILIAL_CORRENTE
                         AND V_IDSISDOS = W_3
                         AND AUTOFORNE.IDAFFORALIM  = W_N
                         AND AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST
                         AND AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC
                         AND AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN
                         AND ITEMAUTF.CDPRODUTO     = P.CDPRODUTO
                         AND P.CDPRODESTO           = V_CODPRODUTO
                         AND AUTOFORNE.IDSITUATUAAF IS NULL
                         AND (ITEMAUTF.IDBAIXITMAF  IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                         AND ITEMAUTF.DTPROGENTAF   BETWEEN V_DTPROCESS AND P_DTFINAL
                         AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N
                         AND ITEMAUTF.DTPROGENTAF NOT IN (SELECT CALECOMP.DTENTREGA
                                                          FROM PERFILPROD, CALECOMP, PRODUTO
                                                          WHERE PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                                            AND PERFILPROD.CDFILIAL  = ITEMAUTF.CDFILDEST
                                                            AND CALECOMP.CDFILIAL    = ITEMAUTF.CDFILDEST
                                                            AND CALECOMP.CDPERIENTR  = PERFILPROD.CDPERIENTR
                                                            AND CALECOMP.DTENTREGA   BETWEEN V_DTPROCESS AND P_DTFINAL
                                                            AND PRODUTO.CDARVPROD    = V_PRODUTOPERFILPROD)
                       ORDER BY 1;
                 ELSE
                    OPEN C_PREV_DATA FOR
                       SELECT DTDATA, (SELECT MIN(D.DTDATA)-1
                                         FROM DATA D
                                        WHERE D.DTDATA > DATA.DTDATA
                                          /*AND NOT EXISTS (SELECT 1
                                                            FROM FERICOMP F
                                                           WHERE F.CDFILIAL   = V_FILIAL_CORRENTE
                                                             AND F.DTFERICOMP = D.DTDATA)*/),
                              '' CDPERIENTR,
                              W_N AS IDENTFORPERI
                         FROM DATA
                        WHERE DTDATA BETWEEN V_DTPROCESS AND P_DTFINAL
                          /*AND NOT EXISTS(SELECT 1
                                           FROM FERICOMP
                                          WHERE FERICOMP.CDFILIAL = V_FILIAL_CORRENTE
                                            AND FERICOMP.DTFERICOMP = DATA.DTDATA)*/
                       UNION ALL
                       SELECT DISTINCT ITEMAUTF.DTPROGENTAF AS DTENTREGA, TO_DATE(NULL) AS DTANTPROXENT,
                                       LPAD(' ', 2, ' ') AS CDPERIENTR,  W_S  AS IDENTFORPERI
                       FROM PRODUTO P, AUTOFORNE, ITEMAUTF
                       WHERE ITEMAUTF.CDFILDEST     = V_FILIAL_CORRENTE
                         AND V_IDSISDOS = W_3
                         AND AUTOFORNE.IDAFFORALIM  = W_N
                         AND AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST
                         AND AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC
                         AND AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN
                         AND ITEMAUTF.CDPRODUTO     = P.CDPRODUTO
                         AND P.CDPRODESTO           = V_CODPRODUTO
                         AND AUTOFORNE.IDSITUATUAAF IS NULL
                         AND (ITEMAUTF.IDBAIXITMAF  IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                         AND ITEMAUTF.DTPROGENTAF   BETWEEN V_DTPROCESS AND P_DTFINAL
                         AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N
                         AND ITEMAUTF.DTPROGENTAF IN (SELECT DTFERICOMP
                                                        FROM FERICOMP
                                                        WHERE FERICOMP.CDFILIAL  = ITEMAUTF.CDFILDEST
                                                          AND FERICOMP.DTFERICOMP    = ITEMAUTF.DTPROGENTAF
                                                          AND FERICOMP.DTFERICOMP   BETWEEN V_DTPROCESS AND P_DTFINAL)
                       ORDER BY 1;

                 END IF;
                 LOOP
                   FETCH C_PREV_DATA INTO V_DTENTREGA, V_DTANTPROXENT, V_CDPERIENTR, V_IDENTRADAFORAPERIODO;
                   EXIT WHEN C_PREV_DATA%NOTFOUND;
                     -- FAZ CHECAGEM NAS FUNÇÕES DE LIMITE DE SEGURANÇA
                     IF V_IDDESCONSILIMICALECMP = 'N' THEN
                        LIMISEGU_CONS_DNUT(V_FILIAL_CORRENTE, V_CODARVPRODUTO, V_DTENTREGA, V_CDPERIENTR, V_NRDIASEG, V_NRLIMISEGCAD);
                        LIMISEGU(V_FILIAL_CORRENTE, V_CODARVPRODUTO, V_DTANTPROXENT, V_CDPERIENTR, V_NRDIASEGANT, V_NRLIMISEGCAD);
                     END IF; 
                     V_QTCONSUMOANTECIPADO:= 0;
                     V_QTCONSUMOANTECIPADOFILNECE:= 0;
                     V_QTCONSUMOPERIODO:= 0;
                     V_QTCONSUMOPERIODOFILNECE:= 0;
                     V_QTASERENTREGUE:= 0;
                     V_QTASERENTREGUEFILNECE:= 0;
                     IF (V_IDENTRADAFORAPERIODO = W_N) THEN

                     /*Busca na tabela PERFILPROD pelos parametros de "utiliza dia não util" e "situação de entrega"*/
                     SELECT MAX(IDDNULIMSEGPR), MAX(IDSITUENTREGA)
                     INTO V_PERFILPROD_DNUTIL, V_PERFILPROD_SITENTR
                     FROM PERFILPROD PFP, PRODUTO PRO
                     WHERE PFP.CDPRODUTO = PRO.CDPRODUTO
                       AND PFP.CDFILIAL = V_FILIAL_CORRENTE
                       AND PRO.CDARVPROD =
                     ( SELECT MAX(CDARVPROD)
                       FROM PRODUTO PR, PERFILPROD PF
                       WHERE PR.CDPRODUTO = PF.CDPRODUTO
                         AND PF.CDFILIAL = V_FILIAL_CORRENTE
                         AND (INSTR(V_CODARVPRODUTO, PR.CDARVPROD) = 1));
                       -- BUSCA O CONSUMO NO PERIODO.
                       -- V_QTCONSPERIOD
                       BEGIN
                         SELECT NVL(SUM(V_PREV.QTPREVCONS * V_FATORCONVERSAO), 0) QUANTIDADE
                         INTO V_QTCONSUMOPERIODO
                         FROM V_PREVISAO_COMPRA V_PREV
                         WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                           AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                           AND (V_PREV.DTPREVCONS <> V_DTPROCESS OR V_RETIRDATA = 0 OR V_IDESTOQUE <> W_S)
                           AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA AND V_DTANTPROXENT;
                       EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                           V_QTCONSUMOPERIODO:= 0;
                       END;
                       BEGIN
                         IF V_FILINECE > 0 THEN
                           SELECT NVL(SUM(V_PREV.QTPREVCONS * P.VRFATOCONV), 0) QUANTIDADE
                           INTO V_QTCONSUMOPERIODOFILNECE
                           FROM V_PREVISAO_COMPRA_FILIAL V_PREV, PRODUTO P
                           WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                             AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                             AND P.CDPRODUTO       = V_PREV.CDPRODUTO
                             AND (V_PREV.DTPREVCONS <> V_DTPROCESS OR V_RETIRDATA = 0 OR V_IDESTOQUE <> W_S)
                             AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA AND V_DTANTPROXENT;
                         ELSE
                            V_QTCONSUMOPERIODOFILNECE:= 0;
                         END IF;
                       EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                           V_QTCONSUMOPERIODOFILNECE:= 0;
                       END;
                       V_QTCONSUMOPERIODO:= V_QTCONSUMOPERIODO + V_QTCONSUMOPERIODOFILNECE;

                       IF V_NRDIASEG > 0 THEN
                          -- BUSCA O CONSUMO ANTECIPADO.
                          -- V_QTCONSANTECI
                          BEGIN
                            SELECT NVL(SUM(V_PREV.QTPREVCONS * V_FATORCONVERSAO), 0) QUANTIDADE
                            INTO V_QTCONSUMOANTECIPADO
                            FROM V_PREVISAO_COMPRA V_PREV
                            WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                              AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                              AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA AND (V_DTENTREGA + V_NRDIASEG - 1);
                          EXCEPTION
                            WHEN NO_DATA_FOUND THEN
                              V_QTCONSUMOANTECIPADO:= 0;
                          END;

                          BEGIN
                            IF V_FILINECE > 0 THEN
                              SELECT NVL(SUM(V_PREV.QTPREVCONS * P.VRFATOCONV), 0) QUANTIDADE
                              INTO V_QTCONSUMOANTECIPADOFILNECE
                              FROM V_PREVISAO_COMPRA_FILIAL V_PREV, PRODUTO P
                              WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                                AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                                AND P.CDPRODUTO       = V_PREV.CDPRODUTO
                                AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA AND (V_DTENTREGA + V_NRDIASEG - 1);
                            ELSE
                              V_QTCONSUMOANTECIPADOFILNECE:= 0;
                            END IF;
                          EXCEPTION
                            WHEN NO_DATA_FOUND THEN
                              V_QTCONSUMOANTECIPADOFILNECE:= 0;
                          END;
                          V_QTCONSUMOANTECIPADO:= V_QTCONSUMOANTECIPADO + V_QTCONSUMOANTECIPADOFILNECE;
                       END IF;

                       -- BUSCA A QUANTIDADE A SER ENTREGUE.
                       -- V_QTASERENTREG
                       BEGIN
                        V_QTASERENTREGUE := NULL;
                        /* Entra quando estiver desmarcado o parâmetro "Verifica dia não útil na apuração da necessidade de compras
                           utilizando limite de segurança" ou quando estiver marcado o parâmetro "Antecipa Entrega" */
                        IF NOT((V_PERFILPROD_DNUTIL = 'S') AND (V_PERFILPROD_SITENTR = 'A')) THEN
                            SELECT NVL(SUM(V_PREV.QTPREVCONS * V_FATORCONVERSAO), 0) QUANTIDADE
                            INTO V_QTASERENTREGUE
                            FROM V_PREVISAO_COMPRA V_PREV
                            WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                              AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                              AND (V_PREV.DTPREVCONS <> V_DTPROCESS OR V_RETIRDATA = 0 OR V_IDESTOQUE <> W_S)
                              AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA + V_NRDIASEG AND (V_DTANTPROXENT + V_NRDIASEGANT)
                              AND ((P_CDSUBGRUPO IS NULL)  OR
                                  (EXISTS(SELECT 1
                                            FROM PRSUBGRPROD
                                           WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                             AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                             AND PRSUBGRPROD.CDPRODUTO   = V_PREV.CDPRODUTO)));
                        ELSE /* Entra quando estiver marcado o parâmetro "Verifica dia não útil na apuração da necessidade de compras
                                utilizando limite de segurança" e quando estiver marcado o parâmetro "Atrasa Entrega" */
                           V_QTASERENTREGUE := 0;
                           V_QTCONSUMOANTECIPADO := 0;

                           IF (TO_NUMBER(V_NRLIMISEGCAD) < (V_DTANTPROXENT - V_DTENTREGA)) THEN
                              V_CONTROLE := (V_DTANTPROXENT - V_DTENTREGA);
                           ELSE
                              V_CONTROLE := TO_NUMBER(V_NRLIMISEGCAD);
                           END IF;

                           V_CONTTEMP := 0;
                           V_DTTEMP := NULL;
                           FOR V_CONTADOR IN 0..V_CONTROLE
                           LOOP
                              V_COMPARA := 0;
                              V_DTTESTE := V_DTENTREGA + V_CONTADOR;
                              V_DTATRASA := NULL;
                              V_DTATRASA2 := NULL;
                              --IF C_PREV_DATA.IDENTFORPERI = W_N THEN
                                 FOR V_CONTADOR2 IN 0..200
                                 LOOP
                                    BEGIN
                                       IF V_IDDESCONSILIMICALECMP = 'N' THEN
                                       SELECT COUNT(1) INTO V_TESTE
                                       FROM CALECOMP
                                       WHERE CALECOMP.CDFILIAL   = V_FILIAL_CORRENTE
                                         AND (CALECOMP.DTENTREGA = V_DTTESTE - (TO_NUMBER(V_NRLIMISEGCAD) - V_COMPARA))
                                         AND CALECOMP.CDPERIENTR = V_CDPERIENTR
                                         AND NOT EXISTS(
                                                         SELECT DTFERICOMP
                                                         FROM FERICOMP FER, CALECOMP CAL
                                                         WHERE FER.CDFILIAL = V_FILIAL_CORRENTE
                                                           AND FER.CDFILIAL = CAL.CDFILIAL
                                                           AND CAL.DTENTREGA = CALECOMP.DTENTREGA
                                                           AND FER.DTFERICOMP = CAL.DTENTREGA
                                                           AND CAL.CDPERIENTR = V_CDPERIENTR
                                                         );

                                       ELSE
                                       SELECT COUNT(1) INTO V_TESTE
                                       FROM DATA
                                       WHERE (DATA.DTDATA = V_DTTESTE - (TO_NUMBER(V_NRLIMISEGCAD) - V_COMPARA))
                                        /* AND NOT EXISTS(SELECT 1
                                                          FROM FERICOMP
                                                         WHERE FERICOMP.CDFILIAL = V_FILIAL_CORRENTE
                                                           AND FERICOMP.DTFERICOMP = DATA.DTDATA
                                                         )*/;
                                      END IF;
                                    EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_TESTE := 0;
                                    END;

                                    IF (V_TESTE = 1) THEN
                                       IF V_COMPARA >= 0 THEN
                                          IF (V_DTTESTE - (TO_NUMBER(V_NRLIMISEGCAD) - V_COMPARA)) = V_DTENTREGA THEN
                                             V_DTATRASA := V_DTTESTE;
                                          END IF;
                                       ELSE
                                          V_DTATRASA := V_DTTESTE;
                                       END IF;
                                       EXIT;
                                    END IF;

                                    IF (V_COMPARA >= (TO_NUMBER(V_NRLIMISEGCAD))) THEN
                                       IF V_COMPARA > 0 THEN
                                          V_COMPARA := -V_COMPARA;
                                       END IF;
                                       V_COMPARA := V_COMPARA - 1;
                                    ELSE
                                       IF V_COMPARA >= 0 THEN
                                          V_COMPARA := V_COMPARA + 1;
                                       ELSE
                                          V_COMPARA := V_COMPARA - 1;
                                       END IF;
                                    END IF;
                                 END LOOP;
                              /*ELSE
                                 V_DTATRASA := NULL;
                              END IF;*/
                              BEGIN
                                  SELECT NVL(SUM(V_PREV.QTPREVCONS * V_FATORCONVERSAO), 0) QUANTIDADE
                                  INTO V_QTDTEMP
                                  FROM V_PREVISAO_COMPRA V_PREV
                                  WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                                    AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                                    AND (V_PREV.DTPREVCONS <> V_DTPROCESS OR V_RETIRDATA = 0 OR V_IDESTOQUE <> W_S)
                                    AND V_PREV.DTPREVCONS = V_DTATRASA
                                    AND ((P_CDSUBGRUPO IS NULL)  OR
                                        (EXISTS(SELECT 1
                                                  FROM PRSUBGRPROD
                                                 WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                                   AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                   AND PRSUBGRPROD.CDPRODUTO   = V_PREV.CDPRODUTO)));
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_QTDTEMP := 0;
                              END;
                              V_QTASERENTREGUE := V_QTASERENTREGUE + V_QTDTEMP;

                             -- BUSCA O CONSUMO ANTECIPADO (ATRASA).
                             -- V_QTCONSANTECI
                             V_QTDTEMP := 0;
                             V_DTTESTE := (V_DTENTREGA  - 1) + (V_CONTADOR);
                             V_COMPARA := 0;

                             IF (V_DTTEMP IS NULL) THEN
                              IF V_CONTADOR <= TO_NUMBER(V_NRLIMISEGCAD) THEN
                                 BEGIN
                                    IF V_IDDESCONSILIMICALECMP = 'N' THEN
                                    SELECT DTENTREGA INTO V_DTANTAUX
                                    FROM CALECOMP
                                    WHERE CDFILIAL   = P_CDFILIAL
                                      AND DTANTPROXENT = (V_DTTESTE)
                                      AND CDPERIENTR = V_CDPERIENTR;
                                    ELSE 
                                    SELECT DTDATA INTO V_DTANTAUX
                                    FROM DATA
                                    WHERE DTDATA = (V_DTTESTE)
                                      /*AND NOT EXISTS(SELECT 1
                                                        FROM FERICOMP
                                                       WHERE FERICOMP.CDFILIAL = V_FILIAL_CORRENTE
                                                         AND FERICOMP.DTFERICOMP = DATA.DTDATA
                                                       )*/;
                                     END IF; 
                                 EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_DTANTAUX := NULL;
                                 END;

                                 BEGIN
                                    IF V_IDDESCONSILIMICALECMP = 'N' THEN
                                    SELECT COUNT(1) INTO V_TESTE
                                    FROM CALECOMP
                                    WHERE CALECOMP.CDFILIAL   = V_FILIAL_CORRENTE
                                      AND (CALECOMP.DTENTREGA = (V_DTANTAUX))
                                      AND CALECOMP.CDPERIENTR = V_CDPERIENTR
                                      AND NOT EXISTS(
                                                      SELECT DTFERICOMP
                                                      FROM FERICOMP FER, CALECOMP CAL
                                                      WHERE FER.CDFILIAL = V_FILIAL_CORRENTE
                                                        AND FER.CDFILIAL = CAL.CDFILIAL
                                                        AND CAL.DTENTREGA = CALECOMP.DTENTREGA
                                                        AND FER.DTFERICOMP = CAL.DTENTREGA
                                                        AND CAL.CDPERIENTR = V_CDPERIENTR
                                                      );
                                    ELSE 
                                    SELECT COUNT(1) INTO V_TESTE
                                      FROM DATA
                                     WHERE (DATA.DTDATA = V_DTTESTE - (TO_NUMBER(V_NRLIMISEGCAD) - V_COMPARA))
                                       /*AND NOT EXISTS(SELECT 1
                                                        FROM FERICOMP
                                                       WHERE FERICOMP.CDFILIAL = V_FILIAL_CORRENTE
                                                         AND FERICOMP.DTFERICOMP = DATA.DTDATA
                                                       )*/;
                                      END IF; 
                                 EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_TESTE := 0;
                                 END;

                                 IF (V_TESTE = 1) THEN
                                    IF (V_DTTESTE - V_DTANTAUX) < 1 THEN
                                       V_DTATRASA2 := V_DTTESTE;
                                    ELSE
                                       IF (V_DTTESTE - V_DTANTAUX) >= TO_NUMBER(V_NRLIMISEGCAD) THEN
                                          V_DTATRASA2 := V_DTANTAUX;
                                          V_DTTEMP := V_DTANTAUX +1;
                                       ELSE
                                          V_DTATRASA2 := NULL;
                                          V_DTTEMP := V_DTTESTE - 1;
                                          IF V_DTENTREGA <= V_DTANTAUX THEN
                                             V_DTATRASA2 := V_DTTESTE;
                                             V_DTTEMP := NULL;
                                          END IF;
                                       END IF;
                                    END IF;
                                 ELSE
                                    V_DTATRASA2 := NULL;
                                 END IF;
                              END IF;
                             ELSE
                                 V_COMPARA := 0;

                                 BEGIN
                                    IF V_IDDESCONSILIMICALECMP = 'N' THEN
                                    SELECT COUNT(1) INTO V_TESTE
                                    FROM CALECOMP
                                    WHERE CALECOMP.CDFILIAL   = V_FILIAL_CORRENTE
                                      AND (CALECOMP.DTENTREGA = (V_DTTEMP + V_CONTTEMP))
                                      AND CALECOMP.CDPERIENTR = V_CDPERIENTR
                                      AND NOT EXISTS(
                                                      SELECT DTFERICOMP
                                                      FROM FERICOMP FER, CALECOMP CAL
                                                      WHERE FER.CDFILIAL = V_FILIAL_CORRENTE
                                                        AND FER.CDFILIAL = CAL.CDFILIAL
                                                        AND CAL.DTENTREGA = CALECOMP.DTENTREGA
                                                        AND FER.DTFERICOMP = CAL.DTENTREGA
                                                        AND CAL.CDPERIENTR = V_CDPERIENTR
                                                     );
                                    ELSE
                                    SELECT COUNT(1) INTO V_TESTE
                                      FROM DATA
                                     WHERE (DATA.DTDATA = V_DTTESTE - (TO_NUMBER(V_NRLIMISEGCAD) - V_COMPARA))
                                       /*AND NOT EXISTS(SELECT 1
                                                        FROM FERICOMP
                                                       WHERE FERICOMP.CDFILIAL = V_FILIAL_CORRENTE
                                                         AND FERICOMP.DTFERICOMP = DATA.DTDATA
                                                       )*/;
                                    END IF;
                                 EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_TESTE := 0;
                                 END;

                                 IF (V_TESTE = 1) THEN
                                    V_DTATRASA2 := V_DTTEMP + V_CONTTEMP;
                                 ELSE
                                    V_DTATRASA2 := NULL;
                                 END IF;

                                 V_CONTTEMP := V_CONTTEMP + 1;
                             END IF;
                             BEGIN
                               SELECT NVL(SUM(V_PREV.QTPREVCONS * V_FATORCONVERSAO), 0) QUANTIDADE
                               INTO V_QTDTEMP
                               FROM V_PREVISAO_COMPRA V_PREV
                               WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                                 AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                                 AND V_PREV.DTPREVCONS = V_DTATRASA2
                                 AND V_PREV.DTPREVCONS > (V_DTENTREGA - 1)
                                 AND ((P_CDSUBGRUPO IS NULL)  OR
                                     (EXISTS(SELECT 1
                                               FROM PRSUBGRPROD
                                              WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                                AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                AND PRSUBGRPROD.CDPRODUTO   = V_PREV.CDPRODUTO)));
                             EXCEPTION
                               WHEN NO_DATA_FOUND THEN
                                 V_QTDTEMP:= 0;
                             END;
                             V_QTCONSUMOANTECIPADO := V_QTCONSUMOANTECIPADO + V_QTDTEMP;
                           END LOOP;
                        END IF;
                       EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                           V_QTASERENTREGUE:= 0;
                       END;

                       BEGIN
                         IF V_FILINECE > 0 THEN
                           SELECT NVL(SUM(V_PREV.QTPREVCONS * P.VRFATOCONV), 0) QUANTIDADE
                           INTO V_QTASERENTREGUEFILNECE
                           FROM V_PREVISAO_COMPRA_FILIAL V_PREV, PRODUTO P
                           WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                             AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                             AND P.CDPRODUTO       = V_PREV.CDPRODUTO
                             AND (V_PREV.DTPREVCONS <> V_DTPROCESS OR V_RETIRDATA = 0 OR V_IDESTOQUE <> W_S)
                             AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA + V_NRDIASEG AND (V_DTANTPROXENT + V_NRDIASEGANT);
                         ELSE
                            V_QTASERENTREGUEFILNECE:= 0;
                         END IF;
                       EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                           V_QTASERENTREGUEFILNECE:= 0;
                       END;
                       V_QTASERENTREGUE:= V_QTASERENTREGUE + V_QTASERENTREGUEFILNECE;

                       IF V_QTCONSUMOPERIODO > 0 THEN
                         V_QTCONSUMOPERIODO:= V_QTCONSUMOPERIODO * (1 + (P_PEACRESCIMO / 100));
                       END IF;

                       IF V_QTCONSUMOANTECIPADO > 0 THEN
                         V_QTCONSUMOANTECIPADO:= V_QTCONSUMOANTECIPADO * (1 + (P_PEACRESCIMO / 100));
                       END IF;

                       IF V_QTASERENTREGUE > 0 THEN
                         V_QTASERENTREGUE:= V_QTASERENTREGUE * (1 + (P_PEACRESCIMO / 100));
                       END IF;

                     END IF;
                     IF V_IDDESCONSILIMICALECMP = 'N' THEN
                     SELECT MAX(DTENTREGA)
                     INTO V_DTMAXENTREGA
                     FROM CALECOMP
                     WHERE CDFILIAL   = V_FILIAL_CORRENTE
                       AND CDPERIENTR = V_CDPERIENTR
                       AND DTENTREGA  < V_DTENTREGA;
                     IF V_IDSISDOS = W_3 THEN
                       IF V_DTPRIMEIRAENTREGA IS NULL THEN
                         V_DTMAXENTREGA:= V_DTENTREGA - 1;
                       END IF;
                     END IF;

                     SELECT NVL(MAX(DTANTPROXENT), V_DTENTREGA)
                     INTO V_DTANTPROXENT_1
                     FROM CALECOMP
                     WHERE CDFILIAL   = V_FILIAL_CORRENTE
                       AND CDPERIENTR = V_CDPERIENTR
                       AND DTENTREGA  = V_DTENTREGA;

                     ELSE
                     SELECT MAX(D.DTDATA)+1
                       INTO V_DTMAXENTREGA
                       FROM DATA D
                      WHERE D.DTDATA < V_DTENTREGA
                        /*AND NOT EXISTS (SELECT 1
                                          FROM FERICOMP F
                                         WHERE F.CDFILIAL   = V_FILIAL_CORRENTE
                                           AND F.DTFERICOMP = D.DTDATA)*/;
                     IF V_IDSISDOS = W_3 THEN
                       IF V_DTPRIMEIRAENTREGA IS NULL THEN
                         V_DTMAXENTREGA:= V_DTENTREGA - 1;
                       END IF;
                     END IF;


                     SELECT MIN(D.DTDATA)-1
                       INTO V_DTANTPROXENT_1
                       FROM DATA D
                      WHERE D.DTDATA > V_DTENTREGA
                        /*AND NOT EXISTS (SELECT 1
                                          FROM FERICOMP F
                                         WHERE F.CDFILIAL   = V_FILIAL_CORRENTE
                                           AND F.DTFERICOMP = D.DTDATA)*/;
                     END IF;
                     V_DTMAXENTREGA_ADD1 := V_DTMAXENTREGA + 1;
                     -- PROCESSO EXCLUSIVO GR OU SE O PARAMETRO IDCONSAFNECCMP ESTIVER MARCADO
                     IF (V_IDSISDOS = W_3) OR (V_IDCONSAFNECCMP = W_S) THEN
                       IF (V_IDENTRADAFORAPERIODO = W_N) THEN
                         V_QTJASOLICITADA := 0;
                         BEGIN
                           /* "AF EM ABERTO" - APARTIR DA PRIMEIRA ENTREGA CALCULADA */
                           -- V_QTJASOLICITA
                           SELECT NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                           INTO V_QTJASOLICITADA
                           FROM AUTOFORNE, ITEMAUTF, PRODUTO
                           WHERE ITEMAUTF.CDFILDEST  = AUTOFORNE.CDFILDEST
                             AND ITEMAUTF.CDFILLANC  = AUTOFORNE.CDFILLANC
                             AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN
                             AND ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                             AND ITEMAUTF.CDFILDEST  = V_FILIAL_CORRENTE
                             AND PRODUTO.CDPRODESTO  = V_CODPRODUTO
                             AND (ITEMAUTF.IDBAIXITMAF IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                             AND QTPROGENTAF - NVL(QTEFETENTRAF, 0) > 0
                             AND NVL(AUTOFORNE.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                             AND AUTOFORNE.IDAFFORALIM = W_N
                             AND AUTOFORNE.IDSITUATUAAF IS NULL
                             AND ITEMAUTF.DTPROGENTAF BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                             AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N
                             AND ((ITEMAUTF.DTPROGENTAF IN (SELECT CALECOMP.DTENTREGA
                                                          FROM PERFILPROD, CALECOMP, PRODUTO
                                                          WHERE PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                                            AND PERFILPROD.CDFILIAL  = V_FILIAL_CORRENTE
                                                            AND CALECOMP.CDFILIAL    = PERFILPROD.CDFILIAL
                                                            AND CALECOMP.CDPERIENTR  = PERFILPROD.CDPERIENTR
                                                            AND PRODUTO.CDARVPROD    = V_PRODUTOPERFILPROD
                                                            AND CALECOMP.DTENTREGA BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND V_IDDESCONSILIMICALECMP = 'N') 
                             OR (ITEMAUTF.DTPROGENTAF NOT IN (SELECT DTFERICOMP
                                                        FROM FERICOMP
                                                        WHERE FERICOMP.CDFILIAL  = ITEMAUTF.CDFILDEST
                                                          AND FERICOMP.DTFERICOMP    BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND V_IDDESCONSILIMICALECMP = 'S'));
                           V_QTJASOLICITADAFP := 0;
                           IF V_IDCSSOLAFFORAPERICMP = 'S' THEN
                              SELECT NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                              INTO V_QTJASOLICITADAFP
                              FROM AUTOFORNE, ITEMAUTF, PRODUTO
                              WHERE ITEMAUTF.CDFILDEST  = AUTOFORNE.CDFILDEST
                                AND ITEMAUTF.CDFILLANC  = AUTOFORNE.CDFILLANC
                                AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN
                                AND ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                                AND ITEMAUTF.CDFILDEST  = V_FILIAL_CORRENTE
                                AND PRODUTO.CDPRODESTO  = V_CODPRODUTO
                                AND (ITEMAUTF.IDBAIXITMAF IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                                AND QTPROGENTAF - NVL(QTEFETENTRAF, 0) > 0
                                AND NVL(AUTOFORNE.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                                AND AUTOFORNE.IDAFFORALIM = W_N
                                AND AUTOFORNE.IDSITUATUAAF IS NULL
                                AND ITEMAUTF.DTPROGENTAF BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                                AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N
                                AND ((ITEMAUTF.DTPROGENTAF NOT IN (SELECT CALECOMP.DTENTREGA
                                                                    FROM PERFILPROD, CALECOMP, PRODUTO
                                                                   WHERE PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                                                     AND PERFILPROD.CDFILIAL  = V_FILIAL_CORRENTE
                                                                     AND CALECOMP.CDFILIAL    = PERFILPROD.CDFILIAL
                                                                     AND CALECOMP.CDPERIENTR  = PERFILPROD.CDPERIENTR
                                                                     AND PRODUTO.CDARVPROD    = V_PRODUTOPERFILPROD
                                                                     AND CALECOMP.DTENTREGA BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND V_IDDESCONSILIMICALECMP = 'N')
                                 OR (ITEMAUTF.DTPROGENTAF IN (SELECT DTFERICOMP
                                                        FROM FERICOMP
                                                        WHERE FERICOMP.CDFILIAL  = ITEMAUTF.CDFILDEST
                                                          AND FERICOMP.DTFERICOMP    BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND V_IDDESCONSILIMICALECMP = 'S'));

                           END IF;
                           V_QTJASOLICITADA := V_QTJASOLICITADA+V_QTJASOLICITADAFP;
                         EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                             V_QTJASOLICITADA:= 0;
                         END;

                         IF V_IDCSSOLAFFORAPERICMP = 'S' THEN
                            IF V_UTILIZAPRODPREF = W_S THEN
                               BEGIN
                                 SELECT PRODPREFMED.CDPRODPREF
                                 INTO V_CODPRODUTOPREF
                                 FROM PRODPREFMED
                                 WHERE PRODPREFMED.CDFILIAL  = V_FILIAL_CORRENTE
                                   AND PRODPREFMED.CDPRODUTO = V_CODPRODUTO;
                               EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                   V_CODPRODUTOPREF:= NULL;
                               END;
                            END IF;
                            INSERT INTO TRABNECECOMP (CDFILNECECMP, NRNECECOMP, CDPRODNECCMP,
                                                        DTENTRNECCMP, QTJASOLICITA)
                              SELECT ITEMAUTF.CDFILDEST, P_NRNECECOMP, NVL(V_CODPRODUTOPREF, PRODUTO.CDPRODESTO), ITEMAUTF.DTPROGENTAF,
                                     NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                                FROM AUTOFORNE, ITEMAUTF, PRODUTO
                               WHERE ITEMAUTF.CDFILDEST  = AUTOFORNE.CDFILDEST
                                 AND ITEMAUTF.CDFILLANC  = AUTOFORNE.CDFILLANC
                                 AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN
                                 AND ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                                 AND ITEMAUTF.CDFILDEST  = V_FILIAL_CORRENTE
                                 AND PRODUTO.CDPRODESTO  = V_CODPRODUTO
                                 AND (ITEMAUTF.IDBAIXITMAF IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                                 AND QTPROGENTAF - NVL(QTEFETENTRAF, 0) > 0
                                 AND NVL(AUTOFORNE.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                                 AND AUTOFORNE.IDAFFORALIM = W_N
                                 AND AUTOFORNE.IDSITUATUAAF IS NULL
                                 AND ITEMAUTF.DTPROGENTAF BETWEEN CASE NVL(V_DTPRIMEIRAENTREGA, SYSDATE)
                                                                     WHEN SYSDATE
                                                                     THEN V_DTPROCESS
                                                                     ELSE V_DTENTREGA
                                                                  END AND V_DTANTPROXENT_1
                                 AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N
                                 AND ((ITEMAUTF.DTPROGENTAF NOT IN (SELECT CALECOMP.DTENTREGA
                                                                     FROM PERFILPROD, CALECOMP, PRODUTO
                                                                    WHERE PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                                                      AND PERFILPROD.CDFILIAL  = V_FILIAL_CORRENTE
                                                                      AND CALECOMP.CDFILIAL    = PERFILPROD.CDFILIAL
                                                                      AND CALECOMP.CDPERIENTR  = PERFILPROD.CDPERIENTR
                                                                      AND PRODUTO.CDARVPROD    = V_PRODUTOPERFILPROD
                                                                      AND CALECOMP.DTENTREGA BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND V_IDDESCONSILIMICALECMP = 'N')
                                OR (ITEMAUTF.DTPROGENTAF IN (SELECT DTFERICOMP
                                                        FROM FERICOMP
                                                        WHERE FERICOMP.CDFILIAL  = ITEMAUTF.CDFILDEST
                                                          AND FERICOMP.DTFERICOMP    BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND V_IDDESCONSILIMICALECMP = 'S'))
                              GROUP BY ITEMAUTF.CDFILDEST, ITEMAUTF.DTPROGENTAF, NVL(V_CODPRODUTOPREF, PRODUTO.CDPRODESTO);
                            V_CODPRODUTOPREF := NULL;
                         END IF;

                         /*AFs Futuras. Ou seja, a data de entrada da NF é superior a data de processamento da filial*/
                         BEGIN
                           SELECT NVL(SUM(NVL(QTEFETENTRAF,0) * PRODUTO.VRFATOCONV), 0)
                             INTO V_QTAFFUTURA
                             FROM ITEMAUTF, PRODUTO
                            WHERE ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                              AND ITEMAUTF.CDFILDEST  = V_FILIAL_CORRENTE
                              AND PRODUTO.CDPRODESTO  = V_CODPRODUTO
                              AND NVL(QTEFETENTRAF, 0) > 0
                              AND DTEFETENTAF > V_DTPROCESS
                              AND ITEMAUTF.DTEFETENTAF BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                              AND NVL(ITEMAUTF.IDBAIXITMFUTURA, W_X) = W_S
                              AND ((ITEMAUTF.DTPROGENTAF IN (SELECT CALECOMP.DTENTREGA
                                                             FROM PERFILPROD, CALECOMP, PRODUTO
                                                            WHERE PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                                              AND PERFILPROD.CDFILIAL  = V_FILIAL_CORRENTE
                                                              AND CALECOMP.CDFILIAL    = PERFILPROD.CDFILIAL
                                                              AND CALECOMP.CDPERIENTR  = PERFILPROD.CDPERIENTR
                                                              AND PRODUTO.CDARVPROD    = V_PRODUTOPERFILPROD
                                                              AND CALECOMP.DTENTREGA BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1) ) AND V_IDDESCONSILIMICALECMP = 'N')
                             OR (ITEMAUTF.DTPROGENTAF NOT IN (SELECT DTFERICOMP
                                                        FROM FERICOMP
                                                        WHERE FERICOMP.CDFILIAL  = ITEMAUTF.CDFILDEST
                                                          AND FERICOMP.DTFERICOMP    BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND V_IDDESCONSILIMICALECMP = 'S'));
                         EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                             V_QTAFFUTURA:= 0;
                         END;

                         /*Pedidos do OL em aberto*/
                         BEGIN
                           SELECT NVL(SUM((QTPROGENPEOL - NVL(QTEFETENPEOL,0)) * PRODUTO.VRFATOCONV), 0)
                           INTO V_QTJASOLICPEXOL
                           FROM PEDIDOEXOL, ITEMPEDEXOL, PRODUTO
                           WHERE ITEMPEDEXOL.CDFILDEST = PEDIDOEXOL.CDFILDEST
                             AND ITEMPEDEXOL.CDFILLANC = PEDIDOEXOL.CDFILLANC
                             AND ITEMPEDEXOL.NRPEDEXOL = PEDIDOEXOL.NRPEDEXOL
                             AND ITEMPEDEXOL.CDPRODUTO = PRODUTO.CDPRODUTO
                             AND ITEMPEDEXOL.CDFILDEST = V_FILIAL_CORRENTE
                             AND PRODUTO.CDPRODESTO = V_CODPRODUTO
                             AND (ITEMPEDEXOL.IDBAIXENPEOL IS NULL OR ITEMPEDEXOL.IDBAIXENPEOL = W_1)
                             AND QTPROGENPEOL - NVL(QTEFETENPEOL, 0) > 0
                             AND NVL(ITEMPEDEXOL.IDITEMAJUSTE, 'N') = 'N'
                             AND NVL(PEDIDOEXOL.IDBAIXEXOL, W_0) NOT IN (W_4, W_5)
                             AND NVL(PEDIDOEXOL.IDBAIXEXOL, W_1) = W_1
                             AND ITEMPEDEXOL.DTPROGENPEOL BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                             AND ((ITEMPEDEXOL.DTPROGENPEOL IN (SELECT CALECOMP.DTENTREGA
                                                              FROM PERFILPROD, CALECOMP, PRODUTO
                                                              WHERE PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                                                AND PERFILPROD.CDFILIAL  = V_FILIAL_CORRENTE
                                                                AND CALECOMP.CDFILIAL    = PERFILPROD.CDFILIAL
                                                                AND CALECOMP.CDPERIENTR  = PERFILPROD.CDPERIENTR
                                                                AND PRODUTO.CDARVPROD    = V_PRODUTOPERFILPROD
                                                                AND CALECOMP.DTENTREGA BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1) ) AND V_IDDESCONSILIMICALECMP = 'N')
                             AND (ITEMPEDEXOL.DTPROGENPEOL NOT IN (SELECT DTFERICOMP
                                                        FROM FERICOMP
                                                        WHERE FERICOMP.CDFILIAL  = ITEMPEDEXOL.CDFILDEST
                                                          AND FERICOMP.DTFERICOMP    BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND V_IDDESCONSILIMICALECMP = 'S'));
                         EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                             V_QTJASOLICPEXOL:= 0;
                         END;
                         V_QTJASOLICITADA := V_QTJASOLICITADA + V_QTAFFUTURA + V_QTJASOLICPEXOL;
                       ELSE
                          /* "AF EM ABERTO" - APARTIR DA PRIMEIRA ENTREGA CALCULADA */
                          -- V_QTJASOLICITA
                          BEGIN
                            SELECT NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                            INTO V_QTJASOLICITADA
                            FROM AUTOFORNE, ITEMAUTF, PRODUTO
                            WHERE ITEMAUTF.CDFILDEST    = V_FILIAL_CORRENTE
                              AND PRODUTO.CDPRODESTO    = V_CODPRODUTO
                              AND ITEMAUTF.DTPROGENTAF  = V_DTENTREGA
                              AND ITEMAUTF.CDFILDEST    = AUTOFORNE.CDFILDEST
                              AND ITEMAUTF.CDFILLANC    = AUTOFORNE.CDFILLANC
                              AND ITEMAUTF.NRAUTOFORN   = AUTOFORNE.NRAUTOFORN
                              AND ITEMAUTF.CDPRODUTO    = PRODUTO.CDPRODUTO
                              AND AUTOFORNE.IDAFFORALIM = W_N
                              AND (ITEMAUTF.IDBAIXITMAF IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                              AND QTPROGENTAF - NVL(QTEFETENTRAF, 0) > 0
                              AND NVL(AUTOFORNE.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                              AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N
                              AND AUTOFORNE.IDSITUATUAAF IS NULL;
                          EXCEPTION
                            WHEN NO_DATA_FOUND THEN
                              V_QTJASOLICITADA:= 0;
                          END;
                          BEGIN
                            SELECT NVL(SUM(NVL(QTEFETENTRAF,0) * PRODUTO.VRFATOCONV), 0)
                            INTO V_QTAFFUTURA
                            FROM ITEMAUTF, PRODUTO
                            WHERE ITEMAUTF.CDFILDEST    = V_FILIAL_CORRENTE
                              AND PRODUTO.CDPRODESTO    = V_CODPRODUTO
                              AND ITEMAUTF.DTEFETENTAF  = V_DTENTREGA
                              AND ITEMAUTF.CDPRODUTO    = PRODUTO.CDPRODUTO
                              AND NVL(QTEFETENTRAF, 0) > 0
                              AND DTEFETENTAF > V_DTPROCESS
                              AND NVL(ITEMAUTF.IDBAIXITMFUTURA, W_X) = W_S;
                          EXCEPTION
                            WHEN NO_DATA_FOUND THEN
                              V_QTAFFUTURA:= 0;
                          END;
                          V_QTJASOLICITADA := V_QTJASOLICITADA + V_QTAFFUTURA;
                       END IF;
                        /* FIM - CALCULO PELA AF - UTILIZADO SOMENTE NA GR */
                     ELSE
                       /* CALCULO POR SOLICITAÇÕES. UTILIZADO PELO RESTANTE DOS CLIENTES. */
                       -- V_QTJASOLICITA
                       BEGIN
                         SELECT NVL(SUM(QTSOLIPROD * PRODUTO.VRFATOCONV), 0)
                         INTO V_QTJASOLICITADA
                         FROM SOLICITA, ITEMSOLI, PRODUTO
                         WHERE PRODUTO.CDPRODESTO   = V_CODPRODUTO
                           AND ITEMSOLI.CDFILSOLI   = V_FILIAL_CORRENTE
                           AND ITEMSOLI.DTPROGENTR >= V_DTPROCESS
                           AND ITEMSOLI.CDPRODUTO   = PRODUTO.CDPRODUTO
                           AND ITEMSOLI.CDFILSOLI   = SOLICITA.CDFILSOLI
                           AND ITEMSOLI.CDFILLAN    = SOLICITA.CDFILLANCA
                           AND ITEMSOLI.NRSOLICMP   = SOLICITA.NRSOLICMP
                           AND NVL(SOLICITA.IDSOLEXTRA, W_N) = W_N
                           --AND ITEMSOLI.DTPROGENTR BETWEEN V_DTMAXENTREGA_ADD1 AND V_DTENTREGA ALIBRAS DIA 23/11
                           AND ITEMSOLI.DTPROGENTR BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                           AND NOT EXISTS (SELECT 1
                                             FROM ITEMSOLI I
                                            WHERE I.DTPROGENCONS = ITEMSOLI.DTPROGENTR
                                              AND I.CDPRODUTCONS = ITEMSOLI.CDPRODUTO
                                              AND I.CDFILSOLCONS = ITEMSOLI.CDFILSOLI
                                              AND I.CDFILLANCONS = ITEMSOLI.CDFILLAN
                                              AND I.NRSOLCMPCONS = ITEMSOLI.NRSOLICMP );
                       EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                           V_QTJASOLICITADA:= 0;
                       END;
                     END IF;

                     V_QTPROGENTAF := 0;
                     V_QTSOLIPROD  := 0;
                     /*CONSUULTA A QUANTIDADE DE AF PARA SER EXIBIDO NA PREVIA CMP03802.QR2*/
                     SELECT NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                       INTO V_QTPROGENTAF
                       FROM AUTOFORNE, ITEMAUTF, PRODUTO
                      WHERE ITEMAUTF.CDFILDEST  = AUTOFORNE.CDFILDEST
                        AND ITEMAUTF.CDFILLANC  = AUTOFORNE.CDFILLANC
                        AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN
                        AND ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                        AND ITEMAUTF.CDFILDEST  = V_FILIAL_CORRENTE
                        AND PRODUTO.CDPRODESTO  = V_CODPRODUTO
                        AND (ITEMAUTF.IDBAIXITMAF IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                        AND QTPROGENTAF - NVL(QTEFETENTRAF, 0) > 0
                        AND NVL(AUTOFORNE.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                        AND AUTOFORNE.IDAFFORALIM = W_N
                        AND AUTOFORNE.IDSITUATUAAF IS NULL
                        AND ITEMAUTF.DTPROGENTAF BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                        AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N;

                     /*CONSUULTA A QUANTIDADE DE AF+PEDIDO OL PARA SER EXIBIDO NA PREVIA CMP03802.QR2*/
                     SELECT NVL(SUM((QTPROGENPEOL - NVL(QTEFETENPEOL,0)) * PRODUTO.VRFATOCONV), 0)+V_QTPROGENTAF
                       INTO V_QTPROGENTAF
                       FROM PEDIDOEXOL, ITEMPEDEXOL, PRODUTO
                      WHERE ITEMPEDEXOL.CDFILDEST = PEDIDOEXOL.CDFILDEST
                        AND ITEMPEDEXOL.CDFILLANC = PEDIDOEXOL.CDFILLANC
                        AND ITEMPEDEXOL.NRPEDEXOL = PEDIDOEXOL.NRPEDEXOL
                        AND ITEMPEDEXOL.CDPRODUTO = PRODUTO.CDPRODUTO
                        AND ITEMPEDEXOL.CDFILDEST = V_FILIAL_CORRENTE
                        AND PRODUTO.CDPRODESTO = V_CODPRODUTO
                        AND (ITEMPEDEXOL.IDBAIXENPEOL IS NULL OR ITEMPEDEXOL.IDBAIXENPEOL = W_1)
                        AND QTPROGENPEOL - NVL(QTEFETENPEOL, 0) > 0
                        AND NVL(ITEMPEDEXOL.IDITEMAJUSTE, 'N') = 'N'
                        AND NVL(PEDIDOEXOL.IDBAIXEXOL, W_0) NOT IN (W_4, W_5)
                        AND NVL(PEDIDOEXOL.IDBAIXEXOL, W_1) = W_1
                        AND ITEMPEDEXOL.DTPROGENPEOL BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1;

                     /*CONSUULTA A QUANTIDADE DE SOLICITAÇÃO PARA SER EXIBIDO NA PREVIA CMP03802.QR2*/
                     SELECT NVL(SUM(QTSOLIPROD * PRODUTO.VRFATOCONV), 0)
                       INTO V_QTSOLIPROD
                       FROM SOLICITA, ITEMSOLI, PRODUTO
                      WHERE PRODUTO.CDPRODESTO   = V_CODPRODUTO
                        AND ITEMSOLI.CDFILSOLI   = V_FILIAL_CORRENTE
                        AND ITEMSOLI.DTPROGENTR >= V_DTPROCESS
                        AND ITEMSOLI.CDPRODUTO   = PRODUTO.CDPRODUTO
                        AND ITEMSOLI.CDFILSOLI   = SOLICITA.CDFILSOLI
                        AND ITEMSOLI.CDFILLAN    = SOLICITA.CDFILLANCA
                        AND ITEMSOLI.NRSOLICMP   = SOLICITA.NRSOLICMP
                        AND NVL(SOLICITA.IDSOLEXTRA, W_N) = W_N
                        AND ITEMSOLI.DTPROGENTR BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                        AND NOT EXISTS (SELECT 1
                                          FROM ITEMSOLI I
                                         WHERE I.DTPROGENCONS = ITEMSOLI.DTPROGENTR
                                           AND I.CDPRODUTCONS = ITEMSOLI.CDPRODUTO
                                           AND I.CDFILSOLCONS = ITEMSOLI.CDFILSOLI
                                           AND I.CDFILLANCONS = ITEMSOLI.CDFILLAN
                                           AND I.NRSOLCMPCONS = ITEMSOLI.NRSOLICMP );
                     V_NRSEQCMPGER := '';
                     IF V_IDCONSAFNECCMP = 'S' THEN
                        /*CONSUULTA SEQUENCIAL DE AF PARA SER EXIBIDO NA PREVIA CMP03802.QR2*/
                        BEGIN
                           SELECT MAX(AUTOFORNE.NRAUTOFORN)
                             INTO V_NRSEQCMPGER
                             FROM AUTOFORNE, ITEMAUTF, PRODUTO
                            WHERE ITEMAUTF.CDFILDEST  = AUTOFORNE.CDFILDEST
                              AND ITEMAUTF.CDFILLANC  = AUTOFORNE.CDFILLANC
                              AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN
                              AND ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                              AND ITEMAUTF.CDFILDEST  = V_FILIAL_CORRENTE
                              AND PRODUTO.CDPRODESTO  = V_CODPRODUTO
                              AND (ITEMAUTF.IDBAIXITMAF IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                              AND QTPROGENTAF - NVL(QTEFETENTRAF, 0) > 0
                              AND NVL(AUTOFORNE.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                              AND AUTOFORNE.IDAFFORALIM = W_N
                              AND AUTOFORNE.IDSITUATUAAF IS NULL
                              AND ITEMAUTF.DTPROGENTAF BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                              AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_NRSEQCMPGER := '';
                        END;
                        IF V_NRSEQCMPGER = NULL THEN
                           /*SE NÃO EXISTIR SEQUENCIAL DE AF CONSUULTA SEQUENCIAL DE PEDIDO OL PARA SER EXIBIDO NA PREVIA CMP03802.QR2*/
                           BEGIN
                              SELECT MAX(ITEMPEDEXOL.NRPEDEXOL)
                                INTO V_NRSEQCMPGER
                                FROM PEDIDOEXOL, ITEMPEDEXOL, PRODUTO
                               WHERE ITEMPEDEXOL.CDFILDEST = PEDIDOEXOL.CDFILDEST
                                 AND ITEMPEDEXOL.CDFILLANC = PEDIDOEXOL.CDFILLANC
                                 AND ITEMPEDEXOL.NRPEDEXOL = PEDIDOEXOL.NRPEDEXOL
                                 AND ITEMPEDEXOL.CDPRODUTO = PRODUTO.CDPRODUTO
                                 AND ITEMPEDEXOL.CDFILDEST = V_FILIAL_CORRENTE
                                 AND PRODUTO.CDPRODESTO = V_CODPRODUTO
                                 AND (ITEMPEDEXOL.IDBAIXENPEOL IS NULL OR ITEMPEDEXOL.IDBAIXENPEOL = W_1)
                                 AND QTPROGENPEOL - NVL(QTEFETENPEOL, 0) > 0
                                 AND NVL(ITEMPEDEXOL.IDITEMAJUSTE, 'N') = 'N'
                                 AND NVL(PEDIDOEXOL.IDBAIXEXOL, W_0) NOT IN (W_4, W_5)
                                 AND NVL(PEDIDOEXOL.IDBAIXEXOL, W_1) = W_1
                                 AND ITEMPEDEXOL.DTPROGENPEOL BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_NRSEQCMPGER := '';
                           END;
                        END IF;
                     ELSE
                        BEGIN
                           SELECT MAX(SOLICITA.NRSOLICMP)
                             INTO V_NRSEQCMPGER
                             FROM SOLICITA, ITEMSOLI, PRODUTO
                            WHERE PRODUTO.CDPRODESTO   = V_CODPRODUTO
                              AND ITEMSOLI.CDFILSOLI   = V_FILIAL_CORRENTE
                              AND ITEMSOLI.DTPROGENTR >= V_DTPROCESS
                              AND ITEMSOLI.CDPRODUTO   = PRODUTO.CDPRODUTO
                              AND ITEMSOLI.CDFILSOLI   = SOLICITA.CDFILSOLI
                              AND ITEMSOLI.CDFILLAN    = SOLICITA.CDFILLANCA
                              AND ITEMSOLI.NRSOLICMP   = SOLICITA.NRSOLICMP
                              AND NVL(SOLICITA.IDSOLEXTRA, W_N) = W_N
                              AND ITEMSOLI.DTPROGENTR BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                              AND NOT EXISTS (SELECT 1
                                                FROM ITEMSOLI I
                                               WHERE I.DTPROGENCONS = ITEMSOLI.DTPROGENTR
                                                 AND I.CDPRODUTCONS = ITEMSOLI.CDPRODUTO
                                                 AND I.CDFILSOLCONS = ITEMSOLI.CDFILSOLI
                                                 AND I.CDFILLANCONS = ITEMSOLI.CDFILLAN
                                                 AND I.NRSOLCMPCONS = ITEMSOLI.NRSOLICMP );
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_NRSEQCMPGER := '';
                        END;
                     END IF;

                     IF V_QTJASOLICITADA IS NULL THEN
                       V_QTJASOLICITADA:= 0;
                     END IF;
                     /* Entra quando estiver marcado o parâmetro "Verifica dia não útil na apuração da necessidade de compras
                        utilizando limite de segurança" e quando estiver marcado o parâmetro "Atrasa Entrega" */
                     IF (V_PERFILPROD_DNUTIL = 'S') AND (V_PERFILPROD_SITENTR = 'A') THEN
                        IF V_FILINECE > 0 THEN
                           BEGIN
                             SELECT MIN(DTPREVCONS)
                             INTO V_DTPRIMEIRAUTILIZAPROD
                             FROM
                                (SELECT V_PREV.DTPREVCONS
                                 FROM V_PREVISAO_COMPRA_FILIAL V_PREV
                                 WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                                   AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                                   AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA AND V_DTANTPROXENT
                                 UNION ALL
                                 SELECT V_PREV.DTPREVCONS
                                 FROM V_PREVISAO_COMPRA V_PREV
                                 WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                                   AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                                   AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA AND V_DTANTPROXENT
                                 );
                           EXCEPTION
                             WHEN NO_DATA_FOUND THEN
                               V_DTPRIMEIRAUTILIZAPROD:= NULL;
                           END;
                        ELSE
                           BEGIN
                             SELECT MIN(V_PREV.DTPREVCONS)
                             INTO V_DTPRIMEIRAUTILIZAPROD
                             FROM V_PREVISAO_COMPRA V_PREV
                             WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                               AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                               AND V_PREV.DTPREVCONS BETWEEN V_DTENTREGA AND V_DTANTPROXENT;
                           EXCEPTION
                             WHEN NO_DATA_FOUND THEN
                               V_DTPRIMEIRAUTILIZAPROD:= NULL;
                           END;
                        END IF;
                     /* Entra quando estiver desmarcado o parâmetro "Verifica dia não útil na apuração da necessidade de compras
                        utilizando limite de segurança" ou quando estiver marcado o parâmetro "Antecipa Entrega" */   
                     ELSE
                        IF V_FILINECE > 0 THEN
                           BEGIN
                             SELECT MIN(DTPREVCONS)
                             INTO V_DTPRIMEIRAUTILIZAPROD
                              FROM
                                (SELECT V_PREV.DTPREVCONS
                                 FROM V_PREVISAO_COMPRA_FILIAL V_PREV
                                 WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                                   AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                                   AND V_PREV.DTPREVCONS BETWEEN (V_DTENTREGA + V_NRDIASEG) AND (V_DTANTPROXENT + V_NRDIASEGANT)
                                 UNION ALL
                                 SELECT V_PREV.DTPREVCONS
                                 FROM V_PREVISAO_COMPRA V_PREV
                                 WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                                   AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                                   AND V_PREV.DTPREVCONS BETWEEN (V_DTENTREGA + V_NRDIASEG) AND (V_DTANTPROXENT + V_NRDIASEGANT)
                                 );
                           EXCEPTION
                             WHEN NO_DATA_FOUND THEN
                               V_DTPRIMEIRAUTILIZAPROD:= NULL;
                           END;
                        ELSE
                           BEGIN
                             SELECT MIN(V_PREV.DTPREVCONS)
                             INTO V_DTPRIMEIRAUTILIZAPROD
                             FROM V_PREVISAO_COMPRA V_PREV
                             WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                               AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                               AND V_PREV.DTPREVCONS BETWEEN (V_DTENTREGA + V_NRDIASEG) AND (V_DTANTPROXENT + V_NRDIASEGANT);
                           EXCEPTION
                             WHEN NO_DATA_FOUND THEN
                               V_DTPRIMEIRAUTILIZAPROD:= NULL;
                           END;
                        END IF;
                     END IF;
                     IF V_EHPRIMEIRAVEZPROD = 'S' THEN
                       IF V_PRIMEIRAENTFORAPERIODO = 'S' THEN
                         V_QTESTAFPEND:= 0;
                         V_QTESTAFPANT:= 0;
                         V_QTESTAFPDEP:= 0;
                         V_QTDAFANTPRIMEIRAENT:= 0;
                       END IF;

                       IF V_DTPRIMEIRAENTREGA IS NULL THEN
                          V_QTDAFANTPRIMEIRAENT := V_QTDAFANTPRIMEIRAENT + V_QTESTOQUENECCMP;
                       END IF;

                       V_QTCONSUMOATEPENTREGA:= 0;
                       V_QTCONSUMOATEPENTREGAFILNECE:= 0;
                       V_QTESTOQUENECCMP:= 0;
                       V_QTDPRODUTOCONVCOMPRA:= 0;
                       V_QTDTEORICANECCOMPRA:= 0;
                       V_QTDESTOQUEUTILIZADO:= 0;
                       V_QTDESTOQUEATUAL:= 0;
                       V_QTDORIGINALNECCOMPRA:= 0;
                       V_QTDPRACOMPRAR:= 0;
                       V_QTESTOQUESEGURANCA:= 0;

                       -- QUANTIDADE CONSUMO ATE PRIMEIRA ENTREGA
                       -- V_QTCONATEPREN

                       IF (V_IDENTRADAFORAPERIODO = W_N) THEN
                          BEGIN
                            SELECT NVL(SUM(V_PREV.QTPREVCONS * V_FATORCONVERSAO), 0) QUANTIDADE
                            INTO V_QTCONSUMOATEPENTREGA
                            FROM V_PREVISAO_COMPRA V_PREV
                            WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                              AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                              AND (V_PREV.DTPREVCONS <> V_DTPROCESS OR V_RETIRDATA = 0 OR V_IDESTOQUE <> W_S)
                              AND V_PREV.DTPREVCONS BETWEEN V_DTPROCESS AND (V_DTENTREGA - 1);
                          EXCEPTION
                            WHEN NO_DATA_FOUND THEN
                              V_QTCONSUMOATEPENTREGA:= 0;
                          END;

                          BEGIN
                            IF V_FILINECE > 0 THEN
                              SELECT NVL(SUM(V_PREV.QTPREVCONS * P.VRFATOCONV), 0) QUANTIDADE
                              INTO V_QTCONSUMOATEPENTREGAFILNECE
                              FROM V_PREVISAO_COMPRA_FILIAL V_PREV, PRODUTO P
                              WHERE V_PREV.CDFILIAL   = V_FILIAL_CORRENTE
                                AND V_PREV.CDPRODUTO  = V_CODPRODUTO
                                AND P.CDPRODUTO       = V_PREV.CDPRODUTO
                                AND (V_PREV.DTPREVCONS <> V_DTPROCESS OR V_RETIRDATA = 0 OR V_IDESTOQUE <> W_S )
                                AND V_PREV.DTPREVCONS BETWEEN V_DTPROCESS AND (V_DTENTREGA - 1);
                            ELSE
                               V_QTCONSUMOATEPENTREGAFILNECE:= 0;
                            END IF;
                          EXCEPTION
                            WHEN NO_DATA_FOUND THEN
                              V_QTCONSUMOATEPENTREGAFILNECE:= 0;
                          END;
                          V_QTCONSUMOATEPENTREGA:= V_QTCONSUMOATEPENTREGA + V_QTCONSUMOATEPENTREGAFILNECE;
                          V_DTPRIMEIRAENTREGA:= V_DTENTREGA;
                       END IF;
                       IF (V_IDESTOQUE = W_S) AND (V_DTPRIMEIRAENTREGA IS NOT NULL) THEN
                          -- SE CONSIDERA O ESTOQUE
                          -- PROCESSO EXCLUSIVO GR
                          SELECT DECODE(V_IDSISDOS, W_3, 0, 1)
                          INTO V_QTDIAESTOQUE
                          FROM DUAL;

                          --V_QTESTONECCMP

                          IF V_IDUTILLOTE = W_N THEN
                             POSICAO_ESTOQUE(V_FILIAL_CORRENTE, V_CODPRODUTO, V_DTPROCESS + V_QTDIAESTOQUE,
                                             V_QTESTOQUENECCMP, V_VALRESTO, V_VALRBRUT, W_N);
                          ELSE
                             SELECT
                                ROUND(CALC_ESTOQ_CONS(V_FILIAL_CORRENTE, V_CODPRODUTO, V_DTPROCESS + V_QTDIAESTOQUE), 3)
                             INTO
                                V_QTESTOQUENECCMP
                             FROM
                                DUAL;
                          END IF;
                       END IF;
                       V_QTDESTOQUEATUAL:= V_QTESTOQUENECCMP;

                       -- V_QTESTOSEGU
                       SELECT NVL(MAX(QTESTOSEGU), 0)
                       INTO V_QTESTOQUESEGURANCA
                       FROM ESTOSEGU
                       WHERE CDFILIAL   = V_FILIAL_CORRENTE
                         AND CDPRODESTO = V_CODPRODUTO;

                       -- PROCESSO EXCLUSIVO GR
                       IF (V_IDSISDOS = W_3) AND (V_PRIMEIRAENTFORAPERIODO = W_S) THEN
                          /* "AF PENDENTE" - ANTERIOR À PRIMEIRA ENTREGA CALCULADA, CONSIDERADO NO ESTOQUE INICIAL PARA ABATER O CONSUMO ATÉ A PRIMEIRA ENTREGA+ANTECIPADO */
                          SELECT NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                          INTO V_QTESTAFPEND
                          FROM AUTOFORNE, ITEMAUTF, PRODUTO
                          WHERE ITEMAUTF.CDFILDEST     = V_FILIAL_CORRENTE
                            AND PRODUTO.CDPRODESTO     = V_CODPRODUTO
                            AND AUTOFORNE.IDAFFORALIM  = W_N
                            AND ITEMAUTF.CDFILDEST     = AUTOFORNE.CDFILDEST
                            AND ITEMAUTF.CDFILLANC     = AUTOFORNE.CDFILLANC
                            AND ITEMAUTF.NRAUTOFORN    = AUTOFORNE.NRAUTOFORN
                            AND ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO
                            AND AUTOFORNE.IDSITUATUAAF IS NULL
                            AND (ITEMAUTF.IDBAIXITMAF IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                            AND ITEMAUTF.QTPROGENTAF - NVL(ITEMAUTF.QTEFETENTRAF, 0) > 0
                            AND NVL(AUTOFORNE.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                            AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N
                            AND ITEMAUTF.DTPROGENTAF BETWEEN V_DTPROCESS - 30 AND V_DTENTREGA - 1
                            AND NOT EXISTS (SELECT 1
                                              FROM AUTOFORNE A, ITEMAUTF I, PRODUTO P
                                             WHERE I.CDFILDEST  = A.CDFILDEST
                                               AND I.CDFILLANC  = A.CDFILLANC
                                               AND I.NRAUTOFORN = A.NRAUTOFORN
                                               AND I.CDPRODUTO  = P.CDPRODUTO
                                               AND I.CDFILDEST  = V_FILIAL_CORRENTE
                                               AND P.CDPRODESTO  = V_CODPRODUTO
                                               AND (I.IDBAIXITMAF IS NULL OR I.IDBAIXITMAF = W_1)
                                               AND I.QTPROGENTAF - NVL(I.QTEFETENTRAF, 0) > 0
                                               AND NVL(A.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                                               AND A.IDAFFORALIM = W_N
                                               AND A.IDSITUATUAAF IS NULL
                                               --AND I.DTPROGENTAF BETWEEN V_DTMAXENTREGA_ADD1 AND V_DTENTREGA
                                               AND I.DTPROGENTAF BETWEEN V_DTENTREGA AND V_DTANTPROXENT_1
                                               AND NVL(A.IDAFEXPIRADA, W_N) = W_N
                                               AND I.CDFILDEST  = ITEMAUTF.CDFILDEST
                                               AND I.CDFILLANC  = ITEMAUTF.CDFILLANC
                                               AND I.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
                                               AND I.CDPRODUTO  = ITEMAUTF.CDPRODUTO
                                               AND I.CDMARCA  = ITEMAUTF.CDMARCA
                                               AND I.DTPROGENTAF = ITEMAUTF.DTPROGENTAF
                                               AND ((((V_IDCSSOLAFFORAPERICMP = 'S') 
                                                OR (ITEMAUTF.DTPROGENTAF IN (SELECT CALECOMP.DTENTREGA
                                                                               FROM PERFILPROD, CALECOMP, PRODUTO
                                                                              WHERE PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                                                                AND PERFILPROD.CDFILIAL  = V_FILIAL_CORRENTE
                                                                                AND CALECOMP.CDFILIAL    = PERFILPROD.CDFILIAL
                                                                                AND CALECOMP.CDPERIENTR  = PERFILPROD.CDPERIENTR
                                                                                AND PRODUTO.CDARVPROD    = V_PRODUTOPERFILPROD
                                                                                AND CALECOMP.DTENTREGA BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND (V_IDDESCONSILIMICALECMP = 'N')) ))
                                                OR                                
                                                (((V_IDCSSOLAFFORAPERICMP = 'S') 
                                                OR ( ITEMAUTF.DTPROGENTAF IN (SELECT DTFERICOMP
                                                        FROM FERICOMP
                                                        WHERE FERICOMP.CDFILIAL  = ITEMAUTF.CDFILDEST
                                                          AND FERICOMP.DTFERICOMP    BETWEEN V_DTPROCESS AND ADD_MONTHS(P_DTFINAL,1)) AND (V_IDDESCONSILIMICALECMP = 'S')) ))));
                          /* ENTRADA DE AF PENDENTE */
                          SELECT /*+ ordered INDEX(ITEMPRODUTO ITEMPRODUTO_01) */
                             NVL(SUM(ITEMPRODUTO.QTITEMPROD * A.VRFATOCONV), 0)
                          INTO V_QTESTAFPANT
                          FROM  NECESSIDADE_TMP A, NOTAFISCAL, ITEMPRODUTO
                          WHERE ITEMPRODUTO.CDFILIAL   = NOTAFISCAL.CDFILIAL
                            AND ITEMPRODUTO.NRLANCTONF = NOTAFISCAL.NRLANCTONF
                            AND NOTAFISCAL.CDFILIAL    = A.CDFILIAL
                            AND NOTAFISCAL.NRLANCTONF  = A.NRLANCTONF
                            AND ITEMPRODUTO.CDPRODUTO  = A.CDPRODUTO
                            AND A.NRNECECOMP           = P_NRNECECOMP
                            AND A.CDPRODESTO           = V_CODPRODUTO
                            AND NOTAFISCAL.DTENTRSAID  = V_DTPROCESS
                            AND A.IDENTRADAAF          = W_P;

                          /* BAIXA DE AF PENDENTE */
                          SELECT V_QTESTAFPANT + NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                          INTO V_QTESTAFPANT
                          FROM PRODUTO, ITEMAUTF
                          WHERE ITEMAUTF.CDPRODUTO   = PRODUTO.CDPRODUTO
                            AND PRODUTO.CDPRODESTO   = V_CODPRODUTO
                            AND ITEMAUTF.CDFILDEST   = V_FILIAL_CORRENTE
                            AND ITEMAUTF.DTBAIXITMAF = V_DTPROCESS
                            AND ITEMAUTF.IDBAIXITMAF = W_3
                            AND ITEMAUTF.DTPROGENTAF < V_DTPROCESS;

                          /* ENTRADA DE AF ANTECIPADA */
                          SELECT /*+ ordered INDEX(ITEMPRODUTO ITEMPRODUTO_01) */
                             NVL(SUM(ITEMPRODUTO.QTITEMPROD * A.VRFATOCONV), 0)
                          INTO V_QTESTAFPDEP
                          FROM NECESSIDADE_TMP A, NOTAFISCAL, ITEMPRODUTO
                          WHERE ITEMPRODUTO.CDFILIAL   = NOTAFISCAL.CDFILIAL
                            AND ITEMPRODUTO.NRLANCTONF = NOTAFISCAL.NRLANCTONF
                            AND NOTAFISCAL.CDFILIAL    = A.CDFILIAL
                            AND NOTAFISCAL.NRLANCTONF  = A.NRLANCTONF
                            AND ITEMPRODUTO.CDPRODUTO  = A.CDPRODUTO
                            AND A.NRNECECOMP           = P_NRNECECOMP
                            AND A.CDPRODESTO           = V_CODPRODUTO
                            AND NOTAFISCAL.DTENTRSAID  = V_DTPROCESS
                            AND A.IDENTRADAAF          = W_A;

                          /* BAIXA DE AF ANTECIPADA */
                          SELECT V_QTESTAFPDEP + NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                          INTO V_QTESTAFPDEP
                          FROM PRODUTO, ITEMAUTF
                          WHERE ITEMAUTF.CDPRODUTO   = PRODUTO.CDPRODUTO
                            AND PRODUTO.CDPRODESTO   = V_CODPRODUTO
                            AND ITEMAUTF.CDFILDEST   = V_FILIAL_CORRENTE
                            AND ITEMAUTF.DTBAIXITMAF = V_DTPROCESS
                            AND ITEMAUTF.IDBAIXITMAF = W_3
                            AND ITEMAUTF.DTPROGENTAF > V_DTPROCESS;

                          V_PRIMEIRAENTFORAPERIODO := W_N;
                       ELSE
                          IF (V_IDCONSAFNECCMP = W_S) AND (V_PRIMEIRAENTFORAPERIODO = W_S) THEN
                             /* "AF PENDENTE" - ANTERIOR À PRIMEIRA ENTREGA CALCULADA, CONSIDERADO NO ESTOQUE INICIAL PARA ABATER O CONSUMO ATÉ A PRIMEIRA ENTREGA+ANTECIPADO */
                             SELECT NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0)
                             INTO V_QTESTAFPEND
                             FROM AUTOFORNE, ITEMAUTF, PRODUTO
                             WHERE ITEMAUTF.CDFILDEST     = V_FILIAL_CORRENTE
                               AND PRODUTO.CDPRODESTO     = V_CODPRODUTO
                               AND AUTOFORNE.IDAFFORALIM  = W_N
                               AND ITEMAUTF.CDFILDEST     = AUTOFORNE.CDFILDEST
                               AND ITEMAUTF.CDFILLANC     = AUTOFORNE.CDFILLANC
                               AND ITEMAUTF.NRAUTOFORN    = AUTOFORNE.NRAUTOFORN
                               AND ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO
                               AND AUTOFORNE.IDSITUATUAAF IS NULL
                               AND (ITEMAUTF.IDBAIXITMAF IS NULL OR ITEMAUTF.IDBAIXITMAF = W_1)
                               AND ITEMAUTF.QTPROGENTAF - NVL(ITEMAUTF.QTEFETENTRAF, 0) > 0
                               AND NVL(AUTOFORNE.IDBAIXAAF, W_0) NOT IN (W_4, W_5, W_6)
                               AND NVL(AUTOFORNE.IDAFEXPIRADA, W_N) = W_N
                               AND ITEMAUTF.DTPROGENTAF BETWEEN V_DTPROCESS - 30 AND V_DTENTREGA - 1;

                             SELECT NVL(SUM((QTPROGENPEOL - NVL(QTEFETENPEOL,0)) * PRODUTO.VRFATOCONV), 0)
                             INTO V_QTESTAFPEXOL
                             FROM PEDIDOEXOL, ITEMPEDEXOL, PRODUTO
                             WHERE ITEMPEDEXOL.CDFILDEST = V_FILIAL_CORRENTE
                               AND PRODUTO.CDPRODESTO = V_CODPRODUTO
                               AND ITEMPEDEXOL.CDFILDEST = PEDIDOEXOL.CDFILDEST
                               AND ITEMPEDEXOL.CDFILLANC = PEDIDOEXOL.CDFILLANC
                               AND ITEMPEDEXOL.NRPEDEXOL = PEDIDOEXOL.NRPEDEXOL
                               AND ITEMPEDEXOL.CDPRODUTO = PRODUTO.CDPRODUTO
                               AND (ITEMPEDEXOL.IDBAIXENPEOL  IS NULL OR ITEMPEDEXOL.IDBAIXENPEOL  = W_1)
                               AND ITEMPEDEXOL.QTPROGENPEOL - NVL(ITEMPEDEXOL.QTEFETENPEOL, 0) > 0
                               AND NVL(PEDIDOEXOL.IDBAIXEXOL, W_0) NOT IN (W_4, W_5)
                               AND NVL(ITEMPEDEXOL.IDITEMAJUSTE, 'N') = 'N'
                               AND ITEMPEDEXOL.DTPROGENPEOL BETWEEN V_DTPROCESS - 30 AND V_DTENTREGA - 1;

                             V_QTESTAFPEND := V_QTESTAFPEND + V_QTESTAFPEXOL;

                             V_PRIMEIRAENTFORAPERIODO := W_N;
                          END IF;
                       END IF;

                       IF (V_DTPRIMEIRAENTREGA IS NOT NULL) THEN
                         V_QTESTOQUENECCMP:= (V_QTDAFANTPRIMEIRAENT + V_QTESTOQUENECCMP + V_QTESTAFPEND + V_QTESTAFPANT + V_QTESTAFPDEP) - V_QTCONSUMOATEPENTREGA;
                         V_EHPRIMEIRAVEZPROD:= W_N;
                       END IF;
                     END IF; -- IF PRIMEIRA VEZ DO PRODUTO.
                     -- V_QTESTNEGATIVIMPR
                     V_QTDESTOQUENEGATIVOIMPR:= V_QTESTOQUENECCMP;
                     V_UTILIZOU_JASOLI:= 'N';
                     IF V_QTESTOQUENECCMP < 0 THEN
                       IF V_QTESTOQUENECCMP + V_QTJASOLICITADA < 0 THEN
                          V_QTESTOQUENECCMP:= 0;
                          V_UTILIZOU_JASOLI:= 'N';
                       ELSE
                          V_QTESTOQUENECCMP:= V_QTESTOQUENECCMP + V_QTJASOLICITADA;
                          V_UTILIZOU_JASOLI:= 'S';
                       END IF;
                     END IF;

                     -- V_IDESTNEGATIVO
                     V_IDESTOQUENEGATIVO:= W_N;

                     -- PROCESSO EXCLUSIVO GR
                     IF (V_IDSISDOS = W_3) THEN
                       -- V_QTESTNEGATIVCALC
                       V_QTDESTOQUENEGCALC:= V_QTESTOQUENECCMP;
                       IF (V_QTESTOQUENECCMP - V_QTCONSUMOANTECIPADO) < 0 THEN
                         V_QTESTOQUENECCMP:= 0;
                         V_IDESTOQUENEGATIVO:= W_S;
                       END IF;
                     END IF;

                     IF ((V_DTENTREGA <> V_DTPROCESS) OR (V_ENTRADADATA = 0) OR (V_IDESTOQUE <> W_S)) THEN
                       IF V_UTILIZOU_JASOLI = 'N' THEN
                          V_QTESTOQUENECCMP:= V_QTESTOQUENECCMP + V_QTJASOLICITADA;
                       END IF;
                     END IF;

                     -- V_QTESTOUTILIZ  >>>>  V_QTDESTOQUEUTILIZADO
                     IF (V_DTENTREGA < P_DTINICIAL) OR (V_IDENTRADAFORAPERIODO = W_S) THEN
                       IF V_IDESTOQUENEGATIVO = W_N THEN -- ADRIANO NA GR
                         IF (V_QTESTOQUENECCMP - V_QTCONSUMOANTECIPADO) >= V_QTASERENTREGUE THEN
                            V_QTDESTOQUEUTILIZADO:= V_QTASERENTREGUE;
                         ELSE
                            V_QTDESTOQUEUTILIZADO:= V_QTESTOQUENECCMP - V_QTCONSUMOANTECIPADO;
                         END IF;
                       ELSE
                         IF (V_QTESTOQUENECCMP) >= V_QTASERENTREGUE THEN
                            V_QTDESTOQUEUTILIZADO:= V_QTASERENTREGUE;
                         ELSE
                            V_QTDESTOQUEUTILIZADO:= V_QTESTOQUENECCMP;
                         END IF;
                       END IF;
                     ELSE
                       IF V_IDESTOQUENEGATIVO = W_N THEN --ADRIANO NA GR
                         IF (V_QTESTOQUENECCMP - V_QTCONSUMOANTECIPADO - V_QTESTOQUESEGURANCA) >= V_QTASERENTREGUE THEN
                            V_QTDESTOQUEUTILIZADO:= V_QTASERENTREGUE;
                         ELSE
                            V_QTDESTOQUEUTILIZADO:= V_QTESTOQUENECCMP - V_QTCONSUMOANTECIPADO - V_QTESTOQUESEGURANCA;
                         END IF;
                       ELSE
                         IF (V_QTESTOQUENECCMP - V_QTESTOQUESEGURANCA) >= V_QTASERENTREGUE THEN
                            V_QTDESTOQUEUTILIZADO:= V_QTASERENTREGUE;
                         ELSE
                            V_QTDESTOQUEUTILIZADO:= V_QTESTOQUENECCMP - V_QTESTOQUESEGURANCA;
                         END IF;
                       END IF;
                     END IF;

                     IF V_IDCONSANTECPENDNECC = 'S' THEN
                        IF V_IDESTOQUE = 'S' THEN
                           IF V_QTDESTOQUEUTILIZADO < 0 THEN
                             V_QTDESTOQUEUTILIZADO:= 0;
                           END IF;
                        END IF;
                     ELSE
                        IF V_QTDESTOQUEUTILIZADO < 0 THEN
                           V_QTDESTOQUEUTILIZADO:= 0;
                        END IF;
                     END IF;

                     -- V_QTTEORNECCMP
                     V_QTDTEORICANECCOMPRA:= V_QTASERENTREGUE - V_QTDESTOQUEUTILIZADO;

                     -- V_QTORIGNECCMP
                     IF V_QTDTEORICANECCOMPRA < 0 THEN
                       V_QTDORIGINALNECCOMPRA:= 0;
                     ELSE
                       V_QTDORIGINALNECCOMPRA:= V_QTDTEORICANECCOMPRA;
                     END IF;

                     IF (V_IDENTRADAFORAPERIODO = W_N) AND (V_DTENTREGA >= P_DTINICIAL) THEN
                        IF V_QTESTOQUENECCMP < V_QTESTOQUESEGURANCA THEN
                           V_QTDORIGINALNECCOMPRA := V_QTDORIGINALNECCOMPRA + (V_QTESTOQUESEGURANCA - V_QTESTOQUENECCMP);
                        END IF;
                     END IF;

                     V_APENAS_CONSUMO := 0;
                     SELECT COUNT(*)
                     INTO V_APENAS_CONSUMO
                     FROM PRODUTO, PRODNECECOMP
                     WHERE PRODNECECOMP.CDFILIAL = V_FILIAL_CORRENTE
                       AND PRODUTO.CDPRODUTO     = PRODNECECOMP.CDPRODUTO
                       AND V_CODARVPRODUTO       LIKE PRODUTO.CDARVPROD || '%';

                     -- V_QTPRACOMPRAR
                     IF V_APENAS_CONSUMO = 0 THEN
                       SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR(V_QTDORIGINALNECCOMPRA, '999999999999999.99999'), -2, 2)),
                                     0, 0, 0.001) + TRUNC(V_QTDORIGINALNECCOMPRA, 3)
                       INTO V_QTDPRACOMPRAR
                       FROM DUAL;
                     ELSE
                       SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR(V_QTASERENTREGUE, '999999999999999.99999'), -2, 2)),
                                     0, 0, 0.001) + TRUNC(V_QTASERENTREGUE, 3)
                       INTO V_QTDPRACOMPRAR
                       FROM DUAL;
                     END IF;

                     V_CODPRODUTOPREF:= NULL;
                     IF V_UTILIZAPRODPREF = W_S THEN
                       BEGIN
                         SELECT PRODPREFMED.CDPRODPREF
                         INTO V_CODPRODUTOPREF
                         FROM PRODPREFMED
                         WHERE PRODPREFMED.CDFILIAL  = V_FILIAL_CORRENTE
                           AND PRODPREFMED.CDPRODUTO = V_CODPRODUTO;
                       EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                           V_CODPRODUTOPREF:= NULL;
                       END;
                       IF V_CODPRODUTOPREF IS NOT NULL THEN
                          V_PRODFILI := 0;
                          SELECT
                             COUNT(*)
                          INTO
                             V_PRODFILI
                          FROM
                             PRODFILI
                          WHERE
                             (V_CODPRODUTOPREF  = PRODFILI.CDPRODUTO) AND
                             (V_FILIAL_CORRENTE = PRODFILI.CDFILIAL)  AND
                             (NVL(PRODFILI.IDPRODATIV,'A') = 'A');

                          IF (NOT(V_PRODFILI > 0)) THEN
                             INSERT INTO
                                TRABNECEINAT (NRNECCMPINAT, CDFILNECINAT, CDPRONECINAT)
                             SELECT
                                P_NRNECECOMP,
                                V_FILIAL_CORRENTE,
                                V_CODPRODUTOPREF
                             FROM
                                DUAL
                             WHERE
                                NOT EXISTS(SELECT 1
                                           FROM TRABNECEINAT
                                           WHERE NRNECCMPINAT = P_NRNECECOMP        AND
                                                 CDFILNECINAT = V_FILIAL_CORRENTE   AND
                                                 CDPRONECINAT = V_CODPRODUTOPREF
                                           );
                             V_CODPRODUTOPREF:= NULL;
                          END IF;
                       END IF;
                     END IF;

                     -- V_VRARREDCMP, V_VRFATOCONV
                     SELECT VRARREDCMP, VRFATOCONV
                     INTO V_VRARREDONDACMP, V_VRFATORCONVERSAO
                     FROM PRODUTO
                     WHERE CDPRODUTO = NVL(V_CODPRODUTOPREF, V_CODPRODUTO); -- ESTA VARIÁVEL ESTARÁ SETADA COM O CODIGO DO PRODUTO OU PRODUTO PREFERENCIAL.

                     /* AS EXPRESSÕES ABAIXO FORAM FEITAS PARA ARREDONDAR UM NÚMERO PARA CIMA DEIXANDO 3 CASAS DECIMAIS.
                        EX:  0.00301 >> 0.004
                             0.00300 >> 0.003 */
                     IF (V_CODPRODUTOPREF IS NULL) OR (V_UTILIZAPRODPREF <> W_S) THEN
                         IF V_APENAS_CONSUMO = 0 THEN
                           IF MOD(V_QTDORIGINALNECCOMPRA, V_VRARREDONDACMP) <> 0 AND V_VRARREDONDACMP > 0 THEN
                             SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR(CEIL(V_QTDORIGINALNECCOMPRA / V_VRARREDONDACMP) * V_VRARREDONDACMP, '999999999999999.99999'), -2, 2)),
                                           0, 0, 0.001) + TRUNC(CEIL(V_QTDORIGINALNECCOMPRA / V_VRARREDONDACMP) * V_VRARREDONDACMP, 3)
                             INTO V_QTDPRACOMPRAR
                             FROM DUAL;
                           END IF;
                         ELSE
                           IF MOD (V_QTASERENTREGUE, V_VRARREDONDACMP) <> 0 AND V_VRARREDONDACMP > 0 THEN
                             SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR(CEIL(V_QTASERENTREGUE / V_VRARREDONDACMP) * V_VRARREDONDACMP, '999999999999999.99999'), -2, 2)),
                                           0, 0, 0.001) + TRUNC(CEIL(V_QTASERENTREGUE / V_VRARREDONDACMP) * V_VRARREDONDACMP, 3)
                             INTO V_QTDPRACOMPRAR
                             FROM DUAL;
                           END IF;
                         END IF;

                         SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR(V_QTDPRACOMPRAR, '999999999999999.99999'), -2, 2)), 0, 0, 0.001) + TRUNC(V_QTDPRACOMPRAR, 3)
                         INTO V_QTDPRODUTOCONVCOMPRA
                         FROM DUAL;
                     ELSE
                         IF V_APENAS_CONSUMO = 0 THEN
                           SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR((V_QTDORIGINALNECCOMPRA / V_VRFATORCONVERSAO), '999999999999999.99999'), -2, 2)),
                                         0, 0, 0.001) + TRUNC((V_QTDORIGINALNECCOMPRA / V_VRFATORCONVERSAO), 3)
                           INTO V_QTDPRODUTOCONVCOMPRA
                           FROM DUAL;
                         ELSE
                           SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR((V_QTASERENTREGUE / V_VRFATORCONVERSAO), '999999999999999.99999'), -2, 2)),
                                         0, 0, 0.001) + TRUNC((V_QTASERENTREGUE / V_VRFATORCONVERSAO), 3)
                           INTO V_QTDPRODUTOCONVCOMPRA
                           FROM DUAL;
                         END IF;

                         IF MOD(V_QTDPRODUTOCONVCOMPRA, V_VRARREDONDACMP) <> 0 AND V_VRARREDONDACMP > 0 THEN
                           SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR(CEIL(V_QTDPRODUTOCONVCOMPRA / V_VRARREDONDACMP) * V_VRARREDONDACMP, '999999999999999.99999'), -2, 2)),
                                         0, 0, 0.001) + TRUNC(CEIL(V_QTDPRODUTOCONVCOMPRA / V_VRARREDONDACMP) * V_VRARREDONDACMP, 3)
                           INTO V_QTDPRODUTOCONVCOMPRA
                           FROM DUAL;
                         END IF;

                         SELECT DECODE(TO_NUMBER(SUBSTR(TO_CHAR(V_QTDPRODUTOCONVCOMPRA*V_VRFATORCONVERSAO, '999999999999999.99999'), -2, 2)), 0, 0, 0.001) + TRUNC(V_QTDPRODUTOCONVCOMPRA*V_VRFATORCONVERSAO, 3)
                         INTO V_QTDPRACOMPRAR
                         FROM DUAL;

                     END IF;

                     IF V_CODPRODUTOPREF IS NULL THEN
                        V_CODPRODUTOPREF:= V_CODPRODUTO;
                     END IF;

                     -- V_IDMARCNECCMP
                     IF (V_DTENTREGA < P_DTINICIAL) OR (V_IDENTRADAFORAPERIODO = W_S) THEN
                       V_IDMARCNECCOMPRA:= W_N;
                     ELSE
                       SELECT MAX(DECODE(NVL(V_QTDPRODUTOCONVCOMPRA, 0), 0, W_N, W_S))
                       INTO V_IDMARCNECCOMPRA
                       FROM DUAL;
                     END IF;

                     IF TRUNC(V_QTDPRODUTOCONVCOMPRA, 3) = 0 THEN
                        V_QTDPRODUTOCONVCOMPRA:= 0;
                     END IF;

                     IF TRUNC(V_QTDPRACOMPRAR, 3) = 0 THEN
                        V_QTDPRACOMPRAR:= 0;
                     END IF;
                     IF (V_IDCSSOLAFFORAPERICMP = 'S')THEN
                        V_QTESTOQUENECCMP_1  := 0;
                        IF (V_IDESTOQUE = W_S) THEN
                           SELECT DECODE(V_IDSISDOS, W_3, 0, 1) INTO V_QTDIAESTOQUE FROM DUAL;
                           IF V_IDUTILLOTE = W_N THEN
                             POSICAO_ESTOQUE(V_FILIAL_CORRENTE, V_CODPRODUTO, V_DTPROCESS + V_QTDIAESTOQUE, V_QTESTOQUENECCMP_1, V_VALRESTO, V_VALRBRUT, W_N);
                           ELSE
                             SELECT CALC_ESTOQ_CONS(V_FILIAL_CORRENTE, V_CODPRODUTO, V_DTPROCESS + V_QTDIAESTOQUE)
                             INTO V_QTESTOQUENECCMP_1
                             FROM DUAL;
                           END IF;
                        END IF;
                        UPDATE TRABNECECOMP
                        SET QTESTOQATUAL   = V_QTESTOQUENECCMP_1,
                          QTCONATEPREN     = V_QTCONSUMOATEPENTREGA
                        WHERE CDFILNECECMP = V_FILIAL_CORRENTE
                        AND NRNECECOMP     = P_NRNECECOMP
                        AND CDPRODNECCMP   = V_CODPRODUTOPREF
                        AND QTESTOQATUAL  IS NULL
                        AND QTCONATEPREN  IS NULL;
                     END IF;
                     IF (((V_QTDPRACOMPRAR IS NOT NULL) AND (V_QTDPRACOMPRAR > 0)) OR (P_IDQTDEZERO = W_S)) THEN
                         V_CDFILIOPELOG := NULL;
                         SELECT
                            MAX(P.CDFILIOPELOG)
                         INTO
                            V_CDFILIOPELOG
                         FROM
                            PARAMPRODSUP P
                         WHERE P.CDFILIAL = V_FILIAL_CORRENTE
                           AND P.CDPRODUTO = V_CODPRODUTOPREF
                           AND P.CDFILIOPELOG IS NOT NULL;

                         /* INSERE DADOS NA TABELA DE TRABALHO */
                         INSERT INTO TRABNECECOMP (CDFILNECECMP, NRNECECOMP, CDPRODNECCMP, DTENTRNECCMP,
                            DTANENNECCMP, QTCONATEPREN, QTESTOQATUAL, DTPRIUTIPROD, QTASERENTREG,
                            QTCONSPERIOD, QTCONSANTECI, QTESTONECCMP, QTESTOUTILIZ, QTJASOLICITA,
                            QTTEORNECCMP, QTORIGNECCMP, QTPRACOMPRAR, QTPRCNVCOMPR, QTESTAFPEND,
                            QTESTAFPANT,  QTESTAFPDEP,  IDMARCNECCMP, IDENTFORPERI, DTPRIMENTREG,
                            QTESTNEGATIV, NRDIASEGPROD, QTESTOSEGCAD, NRLIMISEGCAD, CDFILIOPELOG,
                            QTJASOLICITAFP, DTENTREGASEG, DTANTPROXENTSEG, QTSOLIPROD, QTPROGENTAF,
                            IDPREVIACONSAF, NRSEQCMPGER)
                         VALUES
                           (V_FILIAL_CORRENTE,       P_NRNECECOMP,  V_CODPRODUTOPREF,  -- FOI TROCADO PORQUE O CODIGO DO PRODUTO PREFERENCIAL ABRANGE AS DUAS VARIAVEIS.
                            V_DTENTREGA,             V_DTANTPROXENT,           V_QTCONSUMOATEPENTREGA, V_QTDESTOQUEATUAL,
                            V_DTPRIMEIRAUTILIZAPROD, V_QTASERENTREGUE,         V_QTCONSUMOPERIODO,     V_QTCONSUMOANTECIPADO,
                            V_QTESTOQUENECCMP,       V_QTDESTOQUEUTILIZADO,    V_QTJASOLICITADA,       V_QTDTEORICANECCOMPRA,
                            V_QTDORIGINALNECCOMPRA,  V_QTDPRACOMPRAR,          V_QTDPRODUTOCONVCOMPRA, V_QTESTAFPEND,
                            V_QTESTAFPANT,           V_QTESTAFPDEP,            V_IDMARCNECCOMPRA,      V_IDENTRADAFORAPERIODO,
                            V_DTPRIMEIRAENTREGA,     V_QTDESTOQUENEGATIVOIMPR, V_NRDIASEG,             V_QTESTOQUESEGURANCA,    V_NRLIMISEGCAD,    V_CDFILIOPELOG,
                            V_QTJASOLICITADAFP, V_DTENTREGA+V_NRDIASEG, V_DTANTPROXENT+V_NRDIASEGANT, V_QTSOLIPROD, V_QTPROGENTAF,
                            V_IDCONSAFNECCMP, V_NRSEQCMPGER);
                     END IF;

                     IF (V_IDEVOLESTONC = W_S) AND (V_IDMARCNECCOMPRA = W_N) THEN
                        IF V_IDESTOQUENEGATIVO = W_N THEN
                           V_QTESTOQUENECCMP:= V_QTESTOQUENECCMP - V_QTCONSUMOPERIODO;
                        ELSE
                           V_QTESTOQUENECCMP:= (V_QTESTOQUENECCMP + V_QTDESTOQUENEGCALC) - V_QTCONSUMOPERIODO;
                        END IF;
                     ELSE
                        IF V_IDESTOQUENEGATIVO = W_N THEN
                           V_QTESTOQUENECCMP:= (V_QTESTOQUENECCMP + V_QTDPRACOMPRAR) - V_QTCONSUMOPERIODO;
                        ELSE
                           V_QTESTOQUENECCMP:= (V_QTESTOQUENECCMP + V_QTDESTOQUENEGCALC + V_QTDPRACOMPRAR) - V_QTCONSUMOPERIODO;
                        END IF;
                     END IF;
                     IF (V_IDEVOLESTONC = W_S) THEN
                        IF V_QTESTOQUENECCMP < 0 THEN
                           V_QTESTOQUENECCMP:= 0;
                        END IF;
                     END IF;
                 END LOOP;
                 CLOSE C_PREV_DATA;
              ELSE
                 INSERT INTO
                    TRABNECEINAT (NRNECCMPINAT, CDFILNECINAT, CDPRONECINAT)
                 SELECT
                    P_NRNECECOMP,
                    V_FILIAL_CORRENTE,
                    V_CODPRODUTO
                 FROM
                    DUAL
                 WHERE
                    NOT EXISTS(SELECT 1
                               FROM TRABNECEINAT
                               WHERE NRNECCMPINAT = P_NRNECECOMP        AND
                                     CDFILNECINAT = V_FILIAL_CORRENTE   AND
                                     CDPRONECINAT = V_CODPRODUTO
                               );
              END IF;

          END LOOP;
          CLOSE C_PREV;

          /* INSERE OS DADOS DO CÁLCULO NA TABELA DE LOG */
          INSERT INTO LOGNECECOMP (CDFILIAL, CDOPERADOR, DTHRCALCNC, DTINICIALNC, DTFINALNC,
                        CDPRODINICNC, CDPRODFINANC, IDUTILESTONC, PEACRESCIMNC, NRNECECMPLOG, IDGERSOLEXTNCMP)
          VALUES (V_FILIAL_CORRENTE, P_CDOPERADOR, P_DTHRCALCNC, P_DTINICIAL, P_DTFINAL,
                  P_CDPRODINI, P_CDPRODFIN, V_IDESTOQUE, P_PEACRESCIMO, P_NRNECECOMP, V_EXTRA);

          /* INSERE OS DADOS REFERENTES AO MAPA DE DISTRIBUIÇÃO POR ALMOXARIFADO DO VND */
          IF V_IDMAPDISTALMOX = 'S' THEN
             FOR C_PREVISAOVND IN
                (SELECT
                   PC_PDV.CDFILIAL,
                   PDV.CDLOJA,
                   P.CDPRODESTO AS CDPRODUTO,
                   LOJA.CDALMOXARIFE,
                   LOJA.CDLOCALESTOQ,
                   SUM(PC_PDV.QTPRODCONPDV*P.VRFATOCONV) AS QTPREVCONS
                 FROM PREVISAOPDV PDV, PREVCONSPDV PC_PDV, PRODUTO P, LOJA
                 WHERE PDV.NRSEQPREVPDV = PC_PDV.NRSEQPREVPDV
                  AND PC_PDV.CDPRODUTO = P.CDPRODUTO
                  AND PC_PDV.CDFILIAL = V_FILIAL_CORRENTE
                  AND PDV.CDFILIAL = V_FILIAL_CORRENTE
                  AND TRUNC(PDV.DTPREVCONPDV) BETWEEN V_DTPROCESS AND P_DTFINAL
                  AND PC_PDV.CDPRODUTO = P.CDPRODUTO
                  AND P.CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN
                  AND LOJA.CDFILIAL = V_FILIAL_CORRENTE
                  AND LOJA.CDLOJA = PDV.CDLOJA
                 GROUP BY
                   PC_PDV.CDFILIAL,
                   PDV.CDLOJA,
                   P.CDPRODESTO,
                   LOJA.CDALMOXARIFE,
                   LOJA.CDLOCALESTOQ)
             LOOP
                V_QTESTOQUEVND := 0;
                IF C_PREVISAOVND.CDALMOXARIFE IS NOT NULL THEN
                   POSICAO_ESTOQUE(V_FILIAL_CORRENTE, V_CODPRODUTO, V_DTPROCESS + V_QTDIAESTOQUE,
                                   V_QTESTOQUEVND, V_VALRESTO, V_VALRBRUT, W_N,
                                   C_PREVISAOVND.CDALMOXARIFE, C_PREVISAOVND.CDLOCALESTOQ);
                ELSE
                   IF V_IDUTILLOTE = W_N THEN
                      POSICAO_ESTOQUE(V_FILIAL_CORRENTE, V_CODPRODUTO, V_DTPROCESS + V_QTDIAESTOQUE,
                                      V_QTESTOQUEVND, V_VALRESTO, V_VALRBRUT, W_N);
                   ELSE
                      SELECT
                         CALC_ESTOQ_CONS(V_FILIAL_CORRENTE, V_CODPRODUTO, V_DTPROCESS + V_QTDIAESTOQUE)
                      INTO
                         V_QTESTOQUENECCMP
                      FROM
                         DUAL;
                   END IF;
                END IF;

                SELECT NVL(NRRETMAXLOT,'9')
                  INTO V_NRRETMAXLOT
                  FROM PARAMAN
                 WHERE CDFILIAL = P_CDFILIAL;


                IF V_NRRETMAXLOT = '1' THEN
                  SELECT NVL(MAX(QTESTOQDIA),0) AS QTDEESTO,
                          P.NRLOTEESTQ
                   INTO V_QTDEESTO,
                        V_LOTE
                   FROM POSESTDIA P
                   WHERE (CDFILIAL     = P_CDFILIAL)     AND
                         (CDPRODUTO    = C_PREVISAOVND.CDPRODUTO)    AND
                         (DTPOSIESTQ = (SELECT MAX(DTPOSIESTQ)
                                        FROM POSESTDIA
                                        WHERE (CDFILIAL     = P_CDFILIAL)     AND
                                              (CDPRODUTO    = C_PREVISAOVND.CDPRODUTO)    AND
                                              (DTPOSIESTQ  <= V_DTPROCESS)))
                   GROUP BY P.NRLOTEESTQ;

                   IF C_PREVISAOVND.QTPREVCONS < V_QTDEESTO THEN
                      V_QTESTOQUEVND := 0;
                   END IF;
                END IF;

                   INSERT INTO MAPDISTALMOX (CDFILIAL, NRNECECMPMAP, CDLOJA,
                                             CDPRODUTO, DTINIMAPDIST, DTFINMAPDIST,
                                             QTPREVCONLOJ, QTESTOQUELOJ)
                   VALUES(V_FILIAL_CORRENTE, P_NRNECECOMP, C_PREVISAOVND.CDLOJA,
                          C_PREVISAOVND.CDPRODUTO, P_DTINICIAL, P_DTFINAL,
                          C_PREVISAOVND.QTPREVCONS, V_QTESTOQUEVND);
             END LOOP;
          END IF;

          IF V_IDSISDOS = W_3 THEN
             DELETE NECESSIDADE_TMP WHERE NRNECECOMP = P_NRNECECOMP;
          END IF;
          COMMIT;
    END LOOP; -- LOOP DA FILIAL
    CLOSE CUR_FILIAL;
END;
/
CREATE OR REPLACE FUNCTION CARREGA_PERIFORN_FUN
(
   P_CDFILIAL        IN FILIAL.CDFILIAL%TYPE,
   P_CDFORNECED      IN FORNECEDOR.CDFORNECED%TYPE,
   P_DTPROGENTAF     IN DATE,
   P_IDDESCONSILIMICALECMP  IN PARASUPRI.IDDESCONSILIMICALECMP%TYPE DEFAULT 'N',
   P_CDARVPROD       IN PRODUTO.CDARVPROD%TYPE DEFAULT NULL
)  RETURN DATE
IS
   V_NEW_DTPROGENTAF DATE;
   V_CDPERIENTR      VARCHAR2(2);
   V_IDTIPODIA       VARCHAR2(1);
   V_IDDIANUTIL      VARCHAR2(1);
   V_DIENTREGA       VARCHAR2(3);
   V_DTDIAENTR       VARCHAR2(3);
   V_COUNT           NUMBER;
   V_EXISTE          CHAR(1);
   V_DATA            DATE;
   V_IDUTCALENDCMPGERACAOAF VARCHAR(1);
   V_CALEVAZIA       VARCHAR2(1) := 'N';
   V_DTPROGENTAF     DATE;
   V_IDDNULIMSEG     VARCHAR2(1);
   V_NRLIMISEGU      NUMBER(5);
BEGIN
   SELECT
      MAX(REFORFIL.CDPERIENTR),
      MAX(PERIENTR.IDTIPODIA),
      MAX(PERIENTR.IDDIANUTIL),
      NVL(MAX(REFORFIL.IDUTCALENDCMPGERACAOAF),'N'),
      NVL(MAX(PERIENTR.IDDNULIMSEGP), 'W')   /*Considera dia não útil no cálculo de dias de limite de segurança na tela de periodicidade*/
   INTO
      V_CDPERIENTR, V_IDTIPODIA, V_IDDIANUTIL, V_IDUTCALENDCMPGERACAOAF, V_IDDNULIMSEG
   FROM
      REFORFIL, PERIENTR
   WHERE
      REFORFIL.CDPERIENTR = PERIENTR.CDPERIENTR AND
      REFORFIL.CDFORNECED = P_CDFORNECED AND
      REFORFIL.CDFILIAL = P_CDFILIAL;

   /*INICIO IMPLEMENTAÇÃO SOLICITAÇÃO 185368*/
   IF P_IDDESCONSILIMICALECMP = 'N' THEN
      V_DTPROGENTAF := P_DTPROGENTAF;
   ELSE
      SELECT NVL(MAX(TO_NUMBER(NRLIMISEGU)),0)
        INTO V_NRLIMISEGU
        FROM LIMISEGPROD, PRODUTO
       WHERE LIMISEGPROD.CDPRODUTO = PRODUTO.CDPRODUTO
         AND LIMISEGPROD.CDFILIAL  = P_CDFILIAL
         AND NRLIMISEGU IS NOT NULL
         AND PRODUTO.CDARVPROD     = (SELECT /*+ INDEX (A PK_LIMISEGPROD) INDEX (B PK_PRODUTO) */
                                             MAX(CDARVPROD)
                                        FROM LIMISEGPROD A, PRODUTO B
                                       WHERE A.CDPRODUTO = B.CDPRODUTO
                                         AND A.CDFILIAL  = P_CDFILIAL
                                         AND INSTR(P_CDARVPROD,B.CDARVPROD) = 1);

      IF V_IDDNULIMSEG = 'W' THEN
         /* Se não tiver paramerizaçao de periodiciadde busca parâmetro geral*/
         SELECT
            NVL(MAX(PARASUPRI.IDDNULIMSEG), 'N') INTO V_IDDNULIMSEG
         FROM
            PARASUPRI,
            FILIAL
         WHERE
            (FILIAL.CDFILIAL    = P_CDFILIAL) AND
            (PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL));
      END IF;
      IF V_IDDNULIMSEG = 'N' THEN
         SELECT NVL(MAX(D.DTDATA), P_DTPROGENTAF)
           INTO V_DTPROGENTAF
           FROM DATA D
          WHERE D.DTDATA <= P_DTPROGENTAF - V_NRLIMISEGU
            AND NOT EXISTS (SELECT 1
                              FROM FERICOMP F
                             WHERE F.CDFILIAL   = P_CDFILIAL
                               AND F.DTFERICOMP = D.DTDATA);
      ELSE
         SELECT NVL(MAX(D.DTDATA), P_DTPROGENTAF)
            INTO V_DTPROGENTAF
            FROM DATA D
           WHERE D.DTDATA <= P_DTPROGENTAF
             AND NOT EXISTS (SELECT 1
                               FROM FERICOMP F
                              WHERE F.CDFILIAL   = P_CDFILIAL
                                AND F.DTFERICOMP = D.DTDATA);
         IF V_NRLIMISEGU > 0 THEN
            SELECT NVL(MAX(D.DTDATA), V_DTPROGENTAF)
              INTO V_DTPROGENTAF
              FROM (SELECT DT.DTDATA, ROWNUM NRLIMISEGU
                      FROM DATA DT
                     WHERE DT.DTDATA < V_DTPROGENTAF
                       AND NOT EXISTS (SELECT 1
                                         FROM FERICOMP F
                                        WHERE F.CDFILIAL   = P_CDFILIAL
                                          AND F.DTFERICOMP = DT.DTDATA)
                                        ORDER BY DT.DTDATA DESC) D
             WHERE D.NRLIMISEGU = V_NRLIMISEGU;
          END IF;
      END IF;
   END IF;
   /*FIM IMPLEMENTAÇÃO SOLICITAÇÃO 185368*/

   V_NEW_DTPROGENTAF := V_DTPROGENTAF;
   IF V_IDUTCALENDCMPGERACAOAF = 'S' THEN
      SELECT MAX(C.DTENTREGA)
        INTO V_NEW_DTPROGENTAF
        FROM CALECOMP C
       WHERE C.CDFILIAL    = P_CDFILIAL
         AND C.CDPERIENTR  = V_CDPERIENTR
         AND C.DTENTREGA  <= V_DTPROGENTAF;
      IF V_NEW_DTPROGENTAF IS NULL THEN
         V_CALEVAZIA := 'S';
      END IF;
   END IF;
   IF (V_NEW_DTPROGENTAF IS NULL) OR (V_IDUTCALENDCMPGERACAOAF = 'N') THEN
      IF V_IDTIPODIA = 'S' THEN
         V_DATA := TRUNC(V_DTPROGENTAF);
         WHILE V_EXISTE IS NULL LOOP
            V_EXISTE := NULL;
            BEGIN
               SELECT '1' INTO V_EXISTE
               FROM DIASENTR
               WHERE
                  TO_NUMBER(TO_CHAR(V_DATA, 'D')) = TO_NUMBER(DIASENTR.DIENTREGA)   AND
                  DIASENTR.CDPERIENTR = V_CDPERIENTR AND
                  (TRUNC((TO_NUMBER(TO_CHAR(V_DATA, 'DD')) + 6) / 7) + IDOCOR01 = (2*TO_NUMBER(IDOCOR01)) OR
                   TRUNC((TO_NUMBER(TO_CHAR(V_DATA, 'DD')) + 6) / 7) + IDOCOR02 = (3*TO_NUMBER(IDOCOR02)) OR
                   TRUNC((TO_NUMBER(TO_CHAR(V_DATA, 'DD')) + 6) / 7) + IDOCOR03 = (4*TO_NUMBER(IDOCOR03)) OR
                   TRUNC((TO_NUMBER(TO_CHAR(V_DATA, 'DD')) + 6) / 7) + IDOCOR04 = (5*TO_NUMBER(IDOCOR04)) OR
                   /*CORRECAO GRSA 186787*/
                   ((TRUNC((TO_NUMBER(TO_CHAR((V_DATA), 'DD')) + 6) / 7) + IDOCOR05 = (6*TO_NUMBER(IDOCOR05)))
                    OR ((TRUNC((TO_NUMBER(TO_CHAR((V_DATA), 'DD')) + 6) / 7) + IDOCOR05 = (5*TO_NUMBER(IDOCOR05))) AND (TRUNC((TO_NUMBER(TO_CHAR((V_DATA+7), 'DD')) + 6) / 7) + IDOCOR05 <> (6*TO_NUMBER(IDOCOR05))))) );
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_EXISTE := NULL;
               END;
            END;
            IF V_EXISTE IS NOT NULL THEN
               V_NEW_DTPROGENTAF := V_DATA;
            ELSE
               V_DATA := V_DATA - 1;
            END IF;
            /*CORRECAO GRSA 186787*/
            IF (V_DTPROGENTAF - V_DATA) > 60 THEN
               V_EXISTE := '1';
            END IF;
         END LOOP;
      END IF;
      IF V_IDTIPODIA = 'R' THEN
         SELECT
            MAX(C.DTENTREGA) INTO V_NEW_DTPROGENTAF
         FROM
            CALECOMP C
         WHERE C.CDFILIAL    = P_CDFILIAL
           AND C.CDPERIENTR  = V_CDPERIENTR
           AND C.DTENTREGA  <= V_DTPROGENTAF;

         IF V_NEW_DTPROGENTAF IS NULL THEN
            V_NEW_DTPROGENTAF := V_DTPROGENTAF;
         END IF;
      END IF;
      IF V_IDTIPODIA = 'M' THEN
         SELECT MAX(DIENTREGA) INTO V_DIENTREGA
         FROM
           (SELECT '-'||DIENTREGA DIENTREGA
            FROM DIASENTR
            WHERE CDPERIENTR = V_CDPERIENTR
            UNION ALL
            SELECT DIENTREGA
            FROM DIASENTR
            WHERE CDPERIENTR = V_CDPERIENTR)
         WHERE
            DIENTREGA <= TO_CHAR(V_DTPROGENTAF, 'DD');

         IF SUBSTR(V_DIENTREGA, 1, 1) = '-' THEN
            V_DTDIAENTR := SUBSTR(V_DIENTREGA, 2, 2);
            IF TO_NUMBER(V_DTDIAENTR) > TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(LAST_DAY(V_DTPROGENTAF)+1,-2)), 'DD')) THEN
               V_DIENTREGA := '-'||TO_CHAR(LAST_DAY(ADD_MONTHS(LAST_DAY(V_DTPROGENTAF)+1,-2)), 'DD');
            END IF;
            V_NEW_DTPROGENTAF := TO_DATE(SUBSTR(V_DIENTREGA, 2, 2)||TO_CHAR(ADD_MONTHS(V_DTPROGENTAF, -1), 'MMYYYY'), 'DDMMYYYY');
         ELSE
            V_DTDIAENTR := V_DIENTREGA;
            IF TO_NUMBER(V_DTDIAENTR) > TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(LAST_DAY(V_DTPROGENTAF)+1,-1)), 'DD')) THEN
               V_DIENTREGA := TO_CHAR(LAST_DAY(ADD_MONTHS(LAST_DAY(V_DTPROGENTAF)+1,-1)), 'DD');
            END IF;
            V_NEW_DTPROGENTAF := TO_DATE(V_DIENTREGA||TO_CHAR(V_DTPROGENTAF, 'MMYYYY'), 'DDMMYYYY');
         END IF;
      END IF;
   END IF;

   IF V_IDDIANUTIL = 'S' THEN
      IF V_CALEVAZIA = 'N' THEN
         SELECT COUNT(*) INTO V_COUNT
         FROM FERICOMP
         WHERE CDFILIAL = P_CDFILIAL AND
               DTFERICOMP = V_NEW_DTPROGENTAF;
         IF V_COUNT > 0 THEN
            CARREGA_PERIFORN(P_CDFILIAL, P_CDFORNECED, V_NEW_DTPROGENTAF - 1, V_NEW_DTPROGENTAF);
         END IF;
      END IF;
   END IF;
   RETURN(V_NEW_DTPROGENTAF);
END;
/
CREATE OR REPLACE PROCEDURE EFETIVAR_AF
                     (P_CDOPERADOR  IN VARCHAR2,
                      P_DTAUTOFORN  IN ITMAPURPREC.DTENTRAPUT%TYPE,
                      P_CDCENTCMP   IN ITMAPURPREC.CDCENTITMAP%TYPE,
                      P_NRSEQAPUR   IN ITMAPURPREC.NRSEQITMAP%TYPE,
                      P_CDFILLANC   IN AUTOFORNE.CDFILLANC%TYPE)
IS
   V_NRITEMAF NUMBER;
   V_CODIGO VARCHAR2(20);
   V_CODIGO_AUX VARCHAR2(20);
   V_CONT INT;
   V_OBSSOL VARCHAR2(2000);
   V_CDINSCESTA VARCHAR2(16);
   V_DTPROGENTAF DATE;
   V_VRPRODUTO NUMBER;
   V_VRDESCONTO NUMBER;
   V_VRIMPOSTO NUMBER;
   V_VRDESCITMAF NUMBER(15,5);
   V_NRLOTEESTQ VARCHAR2(20);
   V_NRSUBLOTE VARCHAR2(4);
   V_CDPRODPROD VARCHAR2(10);
   V_NMPRODPROD VARCHAR2(50);

   V_DIAPGTO VARCHAR2(3);
   V_DSPGTO VARCHAR2(1000);
   V_VRPGTO VARCHAR2(20);

   V_DSANTERIOR VARCHAR2(10000);
   V_DSANTERIOR_AUX VARCHAR2(10000);
   V_DSATUAL    VARCHAR2(10000);

   V_ANTCODIGO       VARCHAR2(10);
   V_ANTCDFILDEST    VARCHAR2(4);
   V_ANTCDFILLANC    VARCHAR2(4);
   V_ANTCDFORNECED   VARCHAR2(21);
   V_ANTIDTPFORPGTAF VARCHAR2(1);
   V_ANTCDTIPCOB     VARCHAR2(2);
   V_ANTIDTIPOEMITAF VARCHAR2(1);
   V_ANTCDEMPRESA    VARCHAR2(2);
   V_ANTIDTIPOFRETAF VARCHAR2(1);
   V_ANTCDFORMPGTO   VARCHAR2(2);
   V_ANTNRPARCPGTOAF VARCHAR2(3);
   V_ANTNRDIAPGFIXAF VARCHAR2(3);
   V_ANTIDUTDIAPGTAF VARCHAR2(1);
   V_ANTDSPZOPGTCONC VARCHAR2(1000);
   V_ANTCONC_KEY     VARCHAR2(1000);

   V_IDCOMPRA        VARCHAR2(1);
   V_IDGERAAF        VARCHAR2(1);
   V_DIENTREGA       VARCHAR2(3);

   V_NOVOCODIGO  VARCHAR2(20);
   V_REGANTERIOR VARCHAR2(255);
   V_ITEMAUTF_ANTERIOR VARCHAR2(255);
   V_AFANTERIOR  VARCHAR2(255);
   V_SUMPERCPZO  PRAZOPGTAF.VRPERCPGTOAF%TYPE;

   V_COUNT_AUX    NUMBER;
   V_VRPRECUNIITM NUMBER;

   V_IDUTQTDEVOLU VARCHAR2(1);
   V_QTVOLUITEMSO NUMBER;

   V_NRSOLCOMP    VARCHAR2(200);
   V_QTSOLIPROD   FLOAT;
   V_DTAUX        DATE;

   V_VRFATOCONV   FLOAT;

   V_DTENTRITMSOL DATE;
   V_ANTQTSOLIPROD FLOAT;
   V_VRARREDEMPE  PRODFORNCOMP.VRARREDEMPE%TYPE;
   V_QTPROGENTAF  ITEMAUTF.QTPROGENTAF%TYPE;
   V_IDUTEMPENHAF PARASUPRI.IDUTEMPENHAF%TYPE;
   V_IDUTILCONSSOLIOL PARASUPRI.IDUTILCONSSOLIOL%TYPE;
   V_EMPRESA      AUTOFORNE.CDEMPRESA%TYPE;
   V_CDTPCTPAGAR  AUTOFORNE.CDTPCTPAGAR%TYPE;
   V_MARCAPADRAO  PARASUPRI.CDMARCA%TYPE;
   V_MARCAITEM    MARCA.CDMARCA%TYPE;
   V_PRODUTOOL    PRODUTO.CDPRODUTO%TYPE;
   V_IDUTQTDISPGERAL PARASUPRI.IDUTQTDISPGERAL%TYPE;
   V_NRPEDIDOCOL  PEDCOLGERAL.NRPEDIDOCOL%TYPE;

   V_IDCONSOLAPUEFET  APURPRECO.IDCONSOLAPUEFET%TYPE;
   V_EXTRA            AUTOFORNE.IDAUTOFORNEX%TYPE;

   V_VRPERAJFORNFIL  AJUSTEPRFORNFIL.VRPERAJFORNFIL%TYPE;
   V_IDCONSPERPIAJPR  AJUSTEPRFORNFIL.IDCONSPERPIAJPR%TYPE;
   V_PIDSV            FORNECEDOR.VRPERPIFORN%TYPE;
   V_CDFILIOPELOG     FILIAL.CDFILIAL%TYPE;
   V_IDAFOPERLOG      PARASUPRI.IDUTQTDISPGERAL%TYPE;
   V_IDSISDOS         PARAMGERAL.IDSISDOS%TYPE;
   V_NRLOGCORTEOL     LOGCORTEOL.NRLOGCORTEOL%TYPE;
   V_QTEMPENHADA      FLOAT;
   V_IDUTLPRCMPATIVO  PARASUPRI.IDUTLPRCMPATIVO%TYPE;

   V_IDARREDCMPAMENOS PARASUPRI.IDARREDCMPAMENOS%TYPE;
   V_IDQTFRACIONADO   APURPRECO.IDQTFRACIONADO%TYPE;
   V_CONTADOR         FLOAT := 0;
   V_CONTADOR_AUX     VARCHAR2(1);
   V_IDUTLPRARVOLCMP  PARASUPRI.IDUTLPRARVOLCMP%TYPE;
   V_CDPRARVORIG      RELACPRODOL.CDPRARVORIG%TYPE;
   V_IDDESCONSILIMICALECMP   PARASUPRI.IDDESCONSILIMICALECMP%TYPE;
BEGIN
   INSERT INTO USR_NRSEQAPUR_TMP (NRSEQAPUR) VALUES (P_NRSEQAPUR);
   SELECT
      MAX(IDCONSOLAPUEFET)
   INTO V_IDCONSOLAPUEFET
   FROM APURPRECO
   WHERE CDFILCENTCMP = P_CDCENTCMP
     AND NRAPURPREC = P_NRSEQAPUR;

   IF V_IDCONSOLAPUEFET = 'S' THEN
      V_EXTRA := 'S';
   ELSE
      V_EXTRA := 'N';
   END IF;

   V_QTSOLIPROD := 0;

   V_DSANTERIOR := NULL;

   V_ANTCODIGO       := NULL;
   V_ANTCDFILDEST    := NULL;
   V_ANTCDFILLANC    := NULL;
   V_ANTCDFORNECED   := NULL;
   V_ANTIDTPFORPGTAF := NULL;
   V_ANTCDTIPCOB     := NULL;
   V_ANTIDTIPOEMITAF := NULL;
   V_ANTCDEMPRESA    := NULL;
   V_ANTIDTIPOFRETAF := NULL;
   V_ANTCDFORMPGTO   := NULL;
   V_ANTNRPARCPGTOAF := NULL;
   V_ANTNRDIAPGFIXAF := NULL;
   V_ANTIDUTDIAPGTAF := NULL;
   V_ANTDSPZOPGTCONC := NULL;
   V_ANTCONC_KEY     := NULL;
   V_CONTADOR_AUX    := 'N';

   SELECT
      MAX(IDUTQTDEVOLU),
      MAX(IDUTEMPENHAF),
      NVL(MAX(IDUTILCONSSOLIOL), 'N'),
      MAX(CDMARCA),
      NVL(MAX(IDUTQTDISPGERAL), 'N'),
      NVL(MAX(IDUTLPRCMPATIVO), 'N'),
      NVL(MAX(IDARREDCMPAMENOS), 'N'),
      NVL(MAX(IDUTLPRARVOLCMP), 'N'),
      NVL(MAX(IDDESCONSILIMICALECMP), 'N')
   INTO
      V_IDUTQTDEVOLU,
      V_IDUTEMPENHAF,
      V_IDUTILCONSSOLIOL,
      V_MARCAPADRAO,
      V_IDUTQTDISPGERAL,
      V_IDUTLPRCMPATIVO,
      V_IDARREDCMPAMENOS,  /* Grava quantidade a comprar com valor arredondado para menos */
      V_IDUTLPRARVOLCMP,
      V_IDDESCONSILIMICALECMP  /*Realiza o Cálculo da Necessidade de Compras Desconsiderando o Limite de Segurança e o Calendário de Compras da Filial*/
   FROM
      PARASUPRI
   WHERE
      CDFILIAL = P_CDCENTCMP;

   V_EMPRESA      := NULL;
   V_CDTPCTPAGAR  := NULL;

   SELECT
      MAX(CDEMPRESA),
      MAX(CDTPCTPAGAR)
   INTO
      V_EMPRESA,
      V_CDTPCTPAGAR
   FROM
      COMPRA
   WHERE
      EXISTS (SELECT 1
              FROM ITMAPURPREC
              WHERE ITMAPURPREC.CDCENTITMAP = P_CDCENTCMP AND
                    ITMAPURPREC.NRSEQITMAP  = P_NRSEQAPUR AND
                    ITMAPURPREC.NRCOMPRA    = COMPRA.NRCOMPRA);

   IF V_EMPRESA IS NOT NULL THEN
      V_IDCOMPRA := 'S';
   ELSE
      V_IDCOMPRA := 'N';
   END IF;
   SELECT NVL(MAX(IDSISDOS), '1')
     INTO V_IDSISDOS
     FROM PARAMGERAL;

   SELECT NVL(MAX(NRLOGCORTEOL), 0)
     INTO V_NRLOGCORTEOL
     FROM APURPRECO
    WHERE CDFILCENTCMP = P_CDCENTCMP
      AND NRAPURPREC   = P_NRSEQAPUR;

   IF V_NRLOGCORTEOL <> 0 THEN
      V_IDUTILCONSSOLIOL := 'S';
   END IF;

   IF V_IDARREDCMPAMENOS = 'S' THEN
      UPDATE ITEMAUTF
         SET QTPROGENTAF = CASE FLOOR(QTPROGENTAF)
                              WHEN 0
                              THEN 1
                              ELSE FLOOR(QTPROGENTAF)
                           END
       WHERE EXISTS(SELECT 1
                      FROM AUTOFORNE, APURPRECO, ITMAPURPREC
                     WHERE ITMAPURPREC.CDCENTITMAP     = P_CDCENTCMP
                       AND ITMAPURPREC.NRSEQITMAP      = P_NRSEQAPUR
                       AND ITMAPURPREC.CDCENTITMAP     = APURPRECO.CDFILCENTCMP
                       AND ITMAPURPREC.NRSEQITMAP      = APURPRECO.NRAPURPREC
                       AND AUTOFORNE.CDFILDEST         = ITMAPURPREC.CDFILIAP
                       AND AUTOFORNE.CDFILLANC         = APURPRECO.CDFILLANC
                       AND AUTOFORNE.NRSEQAPURAF       = APURPRECO.NRAPURPREC
                       AND AUTOFORNE.CDOPERADOR        = APURPRECO.CDCOMPRADOR
                       AND AUTOFORNE.CDFORNECED        = ITMAPURPREC.CDFORNITMAP
                       AND ITMAPURPREC.CDFILIAP        = ITEMAUTF.CDFILDEST
                       AND ITMAPURPREC.DTENTRAPUT      = ITEMAUTF.DTPROGENTAF
                       AND ITMAPURPREC.CDPRODITMAP     = ITEMAUTF.CDPRODUTO
                       AND ITMAPURPREC.CDMARCITMAP     = ITEMAUTF.CDMARCA
                       AND APURPRECO.IDQTFRACIONADO    = 'S'
                       AND NVL(AUTOFORNE.IDBAIXAAF, 0) = '6'
                       AND ITEMAUTF.QTPROGENTAF <> FLOOR(ITEMAUTF.QTPROGENTAF));

      SELECT IDQTFRACIONADO
        INTO V_CONTADOR_AUX
        FROM APURPRECO
       WHERE CDFILCENTCMP = P_CDCENTCMP
         AND NRAPURPREC   = P_NRSEQAPUR;
   END IF;

   FOR C_AUTOFORN IN (
      SELECT
         DECODE(FORNECEDOR.IDGERAFDTENT,
                'S', CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT, V_IDDESCONSILIMICALECMP, PRODUTO.CDARVPROD),
                NULL) AS DTENTRAPUT,
         CASE V_IDSISDOS
            WHEN '3'
            THEN CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT, V_IDDESCONSILIMICALECMP, PRODUTO.CDARVPROD)
            ELSE NVL(ITMAPURPREC.DTPROGENTRAP, CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT, V_IDDESCONSILIMICALECMP, PRODUTO.CDARVPROD))
         END AS DTNEWENTAF,
         SUM(QTSOLACOMP) OVER (PARTITION BY CDFORNITMAP,
                                            CDFILIAP,
                                            CDPRODITMAP,
                                            CASE FORNECEDOR.IDGERAFDTENT
                                               WHEN 'S'
                                               THEN CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT, V_IDDESCONSILIMICALECMP, PRODUTO.CDARVPROD)
                                               ELSE NULL
                                            END,
                                            CASE '1'
                                               WHEN '3'
                                               THEN CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT, V_IDDESCONSILIMICALECMP, PRODUTO.CDARVPROD)
                                               ELSE NVL(ITMAPURPREC.DTPROGENTRAP, CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT, V_IDDESCONSILIMICALECMP, PRODUTO.CDARVPROD))
                                            END) QTEMPENHADA,
         ITMAPURPREC.CDMARCITMAP   AS CDMARCA,
         ITMAPURPREC.CDSEGMARCCOL  AS CDSEGMARCA,
         ITMAPURPREC.CDFILIAP      AS CDFILDEST,
         NVL(FILIAL.IDFUNCAOFILI, 'NULL') AS IDFUNCAOFILI,
         P_CDFILLANC               AS CDFILLANC,
         ITMAPURPREC.CDFORNITMAP   AS CDFORNECED,
         ITMAPURPREC.IDTPFORPGTAP,
         FORNECEDOR.CDTIPCOB,
         ITMAPURPREC.DTENTRAPUT    AS DTPROGENTAF,
         ITMAPURPREC.QTSOLACOMP    AS QTSOLIPROD,
         ITMAPURPREC.QTACOMP       AS QTPROGENTAF,
         ITMAPURPREC.VRPRECUNIAP   AS VRPREUNIAF,
         ITMAPURPREC.QTDISPPRODMARC,
         ITMAPURPREC.VRPERDESIAP   AS VRPERDESAF,
         ITMAPURPREC.CDPRODITMAP   AS CDPRODUTO,
         ITMAPURPREC.IDTIPOEMITAP,
         ITMAPURPREC.CDEMPRESAAP   AS CDEMPRESA,
         ITMAPURPREC.IDTIPOFRETAP ,
         ITMAPURPREC.CDFORMPGTOAP  AS CDFORMPGTO,
         ITMAPURPREC.NRPARCPGTOAP,
         ITMAPURPREC.NRDIAPGFIAP   AS NRDIAPGFIXAF,
         ITMAPURPREC.IDULTDIAPGTAF AS IDUTDIAPGTAF,
         ITMAPURPREC.DSPZOPGTCOAP,
         ITMAPURPREC.CONCKEYAP     AS CONC_KEY,
         DECODE(SUBSTR(ITMAPURPREC.CONCKEYAP, -1, 1),
               'X', NULL,
               '2') AS IDAFOPERLOG,
         SUBSTR(ITMAPURPREC.CONCKEYAP, -2, 1) AS IDPRODWEB,
         ITMAPURPREC.CDCENTITMAP,
         ITMAPURPREC.CDREGITMAP,
         PRODUTO.VRFATOCONV,
         PRODUTO.CDARVPROD,
         ITMAPURPREC.IDMOTIVPRESC,
         ITMAPURPREC.NRCOLEITMAP,
         ITMAPURPREC.NRLISTAITMAP,
         FORNECEDOR.IDUTQTDISPFORN,
         ITMAPURPREC.NRCOMPRA
      FROM
         ITMAPURPREC, FORNECEDOR, PRODUTO, FILIAL
      WHERE
         ITMAPURPREC.CDFILIAP     = FILIAL.CDFILIAL       AND
         ITMAPURPREC.CDPRODITMAP  = PRODUTO.CDPRODUTO     AND
         ITMAPURPREC.IDITMSELAPUR = 'S'                   AND
         ITMAPURPREC.CDFORNITMAP  = FORNECEDOR.CDFORNECED AND
         ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR           AND
         ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP
      ORDER BY
         ITMAPURPREC.CDFILIAP,   ITMAPURPREC.CDCENTITMAP,
         ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.IDTPFORPGTAP,
         FORNECEDOR.CDTIPCOB,
         DECODE(FORNECEDOR.IDGERAFDTENT,
                'S',  CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT, V_IDDESCONSILIMICALECMP, PRODUTO.CDARVPROD),
                NULL),
         ITMAPURPREC.IDTIPOEMITAP, ITMAPURPREC.CDEMPRESAAP,
         ITMAPURPREC.IDTIPOFRETAP,  ITMAPURPREC.CDFORMPGTOAP,
         ITMAPURPREC.NRPARCPGTOAP, ITMAPURPREC.NRDIAPGFIAP,
         ITMAPURPREC.IDULTDIAPGTAF, ITMAPURPREC.DSPZOPGTCOAP,
         ITMAPURPREC.CONCKEYAP,
         ITMAPURPREC.DTENTRAPUT)
   LOOP

      IF V_IDCOMPRA = 'N' THEN
         V_EMPRESA := C_AUTOFORN.CDEMPRESA;
      END IF;
      V_MARCAITEM   := '';
      V_CDPRARVORIG := NULL;
      IF (V_IDUTILCONSSOLIOL = 'S') AND (C_AUTOFORN.IDFUNCAOFILI = 'O') THEN
         --V_MARCAITEM := V_MARCAPADRAO;
         SELECT
            MAX(CDPRODARVOL)
         INTO
            V_PRODUTOOL
         FROM
            RELACPRODOL
         WHERE RELACPRODOL.CDPRARVORIG = C_AUTOFORN.CDPRODUTO
           AND RELACPRODOL.CDMARCA     = C_AUTOFORN.CDMARCA;

         IF ((V_NRLOGCORTEOL <> 0) AND (V_PRODUTOOL IS NULL)) THEN
            SELECT
               MAX(CDPRODARVOL)
            INTO
               V_PRODUTOOL
            FROM
               RELACPRODOL
            WHERE RELACPRODOL.CDPRARVORIG = C_AUTOFORN.CDPRODUTO
              AND RELACPRODOL.CDMARCA     = V_MARCAPADRAO;
         END IF;

         IF V_PRODUTOOL IS NULL THEN
            V_IDGERAAF := 'N';
         ELSE
            V_IDGERAAF := 'S';
         END IF;
         IF V_IDUTLPRARVOLCMP = 'S' THEN
            SELECT NVL(MAX(RELACPRODOL.CDPRARVORIG), C_AUTOFORN.CDPRODUTO)
              INTO V_CDPRARVORIG
              FROM PRODUTO, RELACPRODOL
             WHERE CDPRODUTO = V_PRODUTOOL
               AND RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODESTO;
         END IF;
      ELSE
         V_MARCAITEM  := NULL;
         V_IDGERAAF   := 'S';
         V_PRODUTOOL  := NULL;
      END IF;

      IF V_IDGERAAF = 'S' THEN
         V_QTPROGENTAF := C_AUTOFORN.QTPROGENTAF;

         IF V_IDUTEMPENHAF = 'S' THEN
            SELECT
               NVL(MAX(VRARREDEMPMAR), 0)
            INTO
               V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
            FROM
               MARCPROD
            WHERE
               (CDMARCA   = C_AUTOFORN.CDMARCA) AND
               (CDPRODUTO IN (SELECT
                                 P.CDPRODUTO
                              FROM
                                 PRODUTO P
                              WHERE
                                 P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                 C_AUTOFORN.CDARVPROD LIKE P.CDARVPROD || '%') );

            IF V_VRARREDEMPE = 0 THEN
               SELECT
                  DECODE(MAX(VRARREDEMPE), NULL, 0, MAX(VRARREDEMPE)) INTO V_VRARREDEMPE
               FROM
                  PRODFORNCOMP
               WHERE
                  CDPRODCOMPL = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                  CDFORNECED  = C_AUTOFORN.CDFORNECED;
            END IF;

            IF (MOD(V_QTPROGENTAF, V_VRARREDEMPE) <> 0) AND V_VRARREDEMPE > 0 THEN
               V_QTPROGENTAF := CEIL(V_QTPROGENTAF / V_VRARREDEMPE) * V_VRARREDEMPE;
            END IF;
         END IF;

         IF C_AUTOFORN.DTENTRAPUT IS NULL THEN
            V_DSATUAL := C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                         C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                         C_AUTOFORN.CDTIPCOB     || NULL                    ||
                         C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                         C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                         C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                         C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                         C_AUTOFORN.CONC_KEY;
         ELSE
            V_DSATUAL := C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                         C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                         C_AUTOFORN.CDTIPCOB     || C_AUTOFORN.DTENTRAPUT   ||
                         C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                         C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                         C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                         C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                         C_AUTOFORN.CONC_KEY;
         END IF;

         IF V_IDARREDCMPAMENOS = 'S' THEN
            SELECT MAX(C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                       C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                       C_AUTOFORN.CDTIPCOB     || C_AUTOFORN.DTENTRAPUT   ||
                       C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                       C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                       C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                       C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                       C_AUTOFORN.CONC_KEY), MAX(AUTOFORNE.NRAUTOFORN)
              INTO V_DSANTERIOR_AUX, V_CODIGO_AUX
              FROM AUTOFORNE, APURPRECO, ITMAPURPREC, ITEMAUTF
             WHERE APURPRECO.CDFILCENTCMP   = ITMAPURPREC.CDCENTITMAP
               AND APURPRECO.NRAPURPREC     = ITMAPURPREC.NRSEQITMAP
               AND APURPRECO.NRAPURPREC     = AUTOFORNE.NRSEQAPURAF
               AND APURPRECO.CDFILLANC      = AUTOFORNE.CDFILLANC
               AND AUTOFORNE.CDFILDEST      = ITMAPURPREC.CDFILIAP
               AND AUTOFORNE.CDFORNECED     = C_AUTOFORN.CDFORNECED
               AND AUTOFORNE.CDFILDEST      = C_AUTOFORN.CDFILDEST

               AND AUTOFORNE.CDFILDEST      = ITEMAUTF.CDFILDEST
               AND AUTOFORNE.CDFILLANC      = ITEMAUTF.CDFILLANC
               AND AUTOFORNE.NRAUTOFORN     = ITEMAUTF.NRAUTOFORN

               AND C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                   C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                   C_AUTOFORN.CDTIPCOB     || C_AUTOFORN.DTENTRAPUT   ||
                   C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                   C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                   C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                   C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                   C_AUTOFORN.CONC_KEY      = V_DSATUAL
               AND ITMAPURPREC.IDITMSELAPUR = 'S'
               AND APURPRECO.CDFILCENTCMP   = P_CDCENTCMP
               AND APURPRECO.NRAPURPREC     = P_NRSEQAPUR
               AND ITEMAUTF.DTENTRITMSOL    = C_AUTOFORN.DTPROGENTAF;

            IF ((V_DSANTERIOR_AUX IS NOT NULL) AND (V_CODIGO_AUX IS NOT NULL)) THEN
               V_DSANTERIOR := V_DSANTERIOR_AUX;
               V_CODIGO     := V_CODIGO_AUX;
            END IF;
         END IF;

         IF (V_DSATUAL <> V_DSANTERIOR) OR (V_DSANTERIOR IS NULL) THEN
            DBMS_OUTPUT.PUT_LINE('ATUAL = ' ||V_DSATUAL||' ANTERIOR = ' ||V_DSANTERIOR);

            SELECT NVL(MAX(NRITEMAF), 0) INTO V_NRITEMAF
            FROM FORNECEDOR
            WHERE CDFORNECED = C_AUTOFORN.CDFORNECED;

            V_CONT := 1;
            NOVO_CODIGO('AUTOFORNE', V_CODIGO, 1);
            V_CODIGO := SUBSTR(V_CODIGO, 11, 10);

            V_CDFILIOPELOG := '';
            V_IDAFOPERLOG  := '';
            IF NVL(C_AUTOFORN.IDAFOPERLOG, '1') = '2' THEN
               SELECT MAX(P.CDFILIOPELOG) CDFILIOPELOG
                 INTO V_CDFILIOPELOG
                 FROM PARAMPRODSUP P
                WHERE P.CDFILIAL     = C_AUTOFORN.CDFILDEST
                  AND P.CDFILIOPELOG IS NOT NULL
                  AND EXISTS (SELECT 1
                                FROM ITMAPURPREC
                               WHERE ITMAPURPREC.CDPRODITMAP  = P.CDPRODUTO
                                 AND ITMAPURPREC.IDITMSELAPUR = 'S'
                                 AND ITMAPURPREC.CDFORNITMAP  = C_AUTOFORN.CDFORNECED
                                 AND ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR
                                 AND ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP
                                 AND ITMAPURPREC.CDFILIAP     = P.CDFILIAL);
               IF NVL(V_CDFILIOPELOG, 'O') = 'O' THEN
                  V_IDAFOPERLOG := '1';
               ELSE
                  V_IDAFOPERLOG := '2';
               END IF;
            END IF;

            INSERT INTO AUTOFORNE
            (CDFILDEST,    CDFILLANC,    NRAUTOFORN,   CDOPERADOR,   DTAUTOFORN,
             IDTPFORPGTAF, IDTIPOEMITAF, IDTIPOFRETAF, NRPARCPGTOAF, NRDIAPGFIXAF,
             IDUTDIAPGTAF, CDTIPCOB,     CDEMPRESA,    CDFORMPGTO,   CDFORNECED,
             NRSEQAPURAF,  IDAFPRODWEB,  IDAFOPERLOG,  IDTIPOLANCAF, IDBAIXAAF, IDAFCONS, DSCONCKEYAF, CDTPCTPAGAR,
             IDAUTOFORNEX, NRCOMPRAF,    CDFILIOPELOG)
            VALUES
            (C_AUTOFORN.CDFILDEST,    C_AUTOFORN.CDFILLANC,    V_CODIGO,
             P_CDOPERADOR,            P_DTAUTOFORN,            C_AUTOFORN.IDTPFORPGTAP,
             C_AUTOFORN.IDTIPOEMITAP, C_AUTOFORN.IDTIPOFRETAP, C_AUTOFORN.NRPARCPGTOAP,
             C_AUTOFORN.NRDIAPGFIXAF, C_AUTOFORN.IDUTDIAPGTAF, C_AUTOFORN.CDTIPCOB,
             V_EMPRESA,               C_AUTOFORN.CDFORMPGTO,   C_AUTOFORN.CDFORNECED,
             P_NRSEQAPUR,             C_AUTOFORN.IDPRODWEB,    V_IDAFOPERLOG, 'A', '6', 'N', C_AUTOFORN.CONC_KEY, V_CDTPCTPAGAR,
             V_EXTRA,                 C_AUTOFORN.NRCOMPRA,     V_CDFILIOPELOG);
         ELSE
            V_CONT := V_CONT + 1;

            IF (V_CONT > V_NRITEMAF) AND (V_NRITEMAF > 0) THEN

               -- GERAR PARA O ANTERIOR
               V_DSPGTO := V_ANTDSPZOPGTCONC;
               WHILE INSTR(V_DSPGTO, '_') > 0 LOOP
                  V_DIAPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '*')-1);
                  V_DSPGTO  := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '*')+1, LENGTH(V_DSPGTO));

                  V_VRPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '_')-1);
                  V_DSPGTO := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '_')+1, LENGTH(V_DSPGTO));

                  INSERT INTO PRAZOPGTAF
                     (CDFILDEST, CDFILLANC, NRAUTOFORN, NRDIASPGTOAF, VRPERCPGTOAF)
                  VALUES
                      (V_ANTCDFILDEST, V_ANTCDFILLANC, V_ANTCODIGO, V_DIAPGTO, V_VRPGTO);
               END LOOP;

               /* SE ALGUM PRODUTO FOR FRACIONADO, UPDATA A APURAÇÃO PARA HABILITAR O BOTÃO DE APURAR NOVAMENTE */
               IF V_IDARREDCMPAMENOS = 'S' THEN
                  SELECT NVL(MAX('S'), 'N')
                    INTO V_IDQTFRACIONADO
                    FROM AUTOFORNE A, ITEMAUTF I, FILIAL F
                   WHERE I.CDFILDEST   = A.CDFILDEST
                     AND I.CDFILLANC   = A.CDFILLANC
                     AND I.NRAUTOFORN  = A.NRAUTOFORN
                     AND A.CDFILDEST   = F.CDFILIAL
                     AND A.NRSEQAPURAF = P_NRSEQAPUR
                     AND DECODE(F.CDFILCENTCMP, NULL, F.CDFILIAL, F.CDFILCENTCMP) = P_CDCENTCMP
                     AND FLOOR(I.QTPROGENTAF) <> I.QTPROGENTAF;

                  IF V_IDQTFRACIONADO = 'S' THEN
                     V_CONTADOR := V_CONTADOR + 1;
                  END IF;
               END IF;

               -- FECHAMENTO_AF;
               -- GERA-PARCELAS

               UPDATE ITEMAUTF
               SET ITEMAUTF.NRPARCITMAF = (SELECT LPAD(TO_CHAR(COUNT(DISTINCT ITEM.DTPROGENTAF)),2,'0')
                                             FROM ITEMAUTF ITEM
                                            WHERE (ITEM.CDFILDEST   = V_ANTCDFILDEST)
                                              AND (ITEM.CDFILLANC   = V_ANTCDFILLANC)
                                              AND (ITEM.NRAUTOFORN  = V_ANTCODIGO)
                                              AND (ITEM.DTPROGENTAF <= ITEMAUTF.DTPROGENTAF))
               WHERE
                  (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
                  (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
                  (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);
                     --------
               SELECT MIN(CDINSCESTA) INTO V_CDINSCESTA
               FROM INSCRESTAD
               WHERE (CDEMPRESA = V_ANTCDEMPRESA);

               SELECT MIN(DTPROGENTAF) INTO V_DTPROGENTAF
               FROM ITEMAUTF
               WHERE (CDFILDEST  = V_ANTCDFILDEST)  AND
                     (CDFILLANC  = V_ANTCDFILLANC)  AND
                     (NRAUTOFORN = V_ANTCODIGO);

               IMPOSTO_ITEMAF(V_ANTCDEMPRESA,
                              V_CDINSCESTA,
                              V_ANTCDFORNECED,
                              V_ANTCDFILDEST,
                              V_ANTCDFILLANC,
                              V_ANTCODIGO,
                              V_DTPROGENTAF);

               -- qryValor_AF

               SELECT
                  SUM(ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF),
                  SUM((ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF * NVL(ITEMAUTF.VRPERDESAF, 0)) / 100)
                  INTO V_VRPRODUTO, V_VRDESCONTO
               FROM
                  ITEMAUTF
               WHERE
                  (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
                  (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
                  (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);

               SELECT
                  NVL(SUM(IMPITMAF.VRADIMPAF), 0) INTO V_VRIMPOSTO
               FROM
                  IMPITMAF,
                  ITEMAUTF,
                  IMPOSTO
               WHERE
                  (IMPITMAF.CDFILDEST   = V_ANTCDFILDEST)       AND
                  (IMPITMAF.CDFILLANC   = V_ANTCDFILLANC)       AND
                  (IMPITMAF.NRAUTOFORN  = V_ANTCODIGO)          AND
                  (IMPITMAF.CDFILDEST   = ITEMAUTF.CDFILDEST)   AND
                  (IMPITMAF.CDFILLANC   = ITEMAUTF.CDFILLANC)   AND
                  (IMPITMAF.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN)  AND
                  (IMPITMAF.CDPRODUTO   = ITEMAUTF.CDPRODUTO)   AND
                  (IMPITMAF.CDMARCA     = ITEMAUTF.CDMARCA)     AND
                  (IMPITMAF.DTPROGENTAF = ITEMAUTF.DTPROGENTAF) AND
                  (IMPITMAF.CDIMPOSTO   = IMPOSTO.CDIMPOSTO)    AND
                   NVL(IMPOSTO.IDACRPRODENTRNF, 'N') = 'N';

               UPDATE AUTOFORNE
               SET VRTOTALAF = V_VRPRODUTO - V_VRDESCONTO + V_VRIMPOSTO
               WHERE
                  (CDFILDEST   = V_ANTCDFILDEST) AND
                  (CDFILLANC   = V_ANTCDFILLANC) AND
                  (NRAUTOFORN  = V_ANTCODIGO);

               NOVO_CODIGO('AUTOFORNE', V_CODIGO, 1);
               V_CODIGO := SUBSTR(V_CODIGO, 11, 10);

               V_CDFILIOPELOG := '';
               V_IDAFOPERLOG  := '';

               IF NVL(C_AUTOFORN.IDAFOPERLOG, '1') = '2' THEN
                  SELECT MAX(P.CDFILIOPELOG) CDFILIOPELOG
                    INTO V_CDFILIOPELOG
                    FROM PARAMPRODSUP P
                   WHERE P.CDFILIAL     = C_AUTOFORN.CDFILDEST
                     AND P.CDFILIOPELOG IS NOT NULL
                     AND EXISTS (SELECT 1
                                   FROM ITMAPURPREC
                                  WHERE ITMAPURPREC.CDPRODITMAP  = P.CDPRODUTO
                                    AND ITMAPURPREC.IDITMSELAPUR = 'S'
                                    AND ITMAPURPREC.CDFORNITMAP  = C_AUTOFORN.CDFORNECED
                                    AND ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR
                                    AND ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP
                                    AND ITMAPURPREC.CDFILIAP     = P.CDFILIAL);
                  IF NVL(V_CDFILIOPELOG, 'O') = 'O' THEN
                     V_IDAFOPERLOG := '1';
                  ELSE
                     V_IDAFOPERLOG := '2';
                  END IF;
               END IF;

               INSERT INTO AUTOFORNE
               (CDFILDEST,    CDFILLANC,    NRAUTOFORN,   CDOPERADOR,   DTAUTOFORN,
                IDTPFORPGTAF, IDTIPOEMITAF, IDTIPOFRETAF, NRPARCPGTOAF, NRDIAPGFIXAF,
                IDUTDIAPGTAF, CDTIPCOB,     CDEMPRESA,    CDFORMPGTO,   CDFORNECED,
                NRSEQAPURAF,  IDAFPRODWEB,  IDAFOPERLOG, IDTIPOLANCAF, IDBAIXAAF, IDAFCONS, DSCONCKEYAF, CDTPCTPAGAR,
                IDAUTOFORNEX, CDFILIOPELOG)
               VALUES
               (C_AUTOFORN.CDFILDEST,    C_AUTOFORN.CDFILLANC,    V_CODIGO,
                P_CDOPERADOR,            P_DTAUTOFORN,            C_AUTOFORN.IDTPFORPGTAP,
                C_AUTOFORN.IDTIPOEMITAP, C_AUTOFORN.IDTIPOFRETAP, C_AUTOFORN.NRPARCPGTOAP,
                C_AUTOFORN.NRDIAPGFIXAF, C_AUTOFORN.IDUTDIAPGTAF, C_AUTOFORN.CDTIPCOB,
                V_EMPRESA,    C_AUTOFORN.CDFORMPGTO,   C_AUTOFORN.CDFORNECED,
                P_NRSEQAPUR,             C_AUTOFORN.IDPRODWEB,    V_IDAFOPERLOG, 'A', '6', 'N',C_AUTOFORN.CONC_KEY, V_CDTPCTPAGAR,
                V_EXTRA, V_CDFILIOPELOG);

                V_CONT := 1;
            END IF;
         END IF;

         V_OBSSOL := '';

         FOR C_OBSERVA IN (SELECT ITEMSOLI.TXOBSITMSOL, ITEMSOLI.NRLOTEESTQ,
                                  ITEMSOLI.NRSUBLOTE, ITEMSOLI.CDPRODPROD,
                                  PRODUTO.NMPRODUTO
                            FROM ITEMSOLI, PRODUTO
                           WHERE
                              (ITEMSOLI.CDFILSOLI  = C_AUTOFORN.CDFILDEST) AND
                              (ITEMSOLI.CDPRODUTO  = C_AUTOFORN.CDPRODUTO) AND
                              (ITEMSOLI.DTPROGENTR = C_AUTOFORN.DTPROGENTAF) AND
                              ITEMSOLI.CDPRODPROD  = PRODUTO.CDPRODUTO(+)) LOOP

            V_OBSSOL := V_OBSSOL || C_OBSERVA.TXOBSITMSOL;
            V_NRLOTEESTQ := C_OBSERVA.NRLOTEESTQ;
            V_NRSUBLOTE  := C_OBSERVA.NRSUBLOTE;
            V_CDPRODPROD := C_OBSERVA.CDPRODPROD;
            V_NMPRODPROD := C_OBSERVA.NMPRODUTO;
         END LOOP;

         IF V_NRLOTEESTQ||V_NRSUBLOTE||V_NMPRODPROD IS NOT NULL THEN/*INFORMAÇÕES DO LOTE NA OBSERVAÇÃO*/
            V_OBSSOL := 'Lote: '||V_NRLOTEESTQ||' SubLote: '||V_NRSUBLOTE||' Produto: '||V_NMPRODPROD||CHR(13)||CHR(10)||V_OBSSOL;
         END IF;

         SELECT COUNT(*), MAX(DTENTRITMSOL) INTO V_COUNT_AUX, V_DTENTRITMSOL
         FROM ITEMAUTF
         WHERE CDFILDEST   = C_AUTOFORN.CDFILDEST                   AND
               CDFILLANC   = C_AUTOFORN.CDFILLANC                   AND
               NRAUTOFORN  = V_CODIGO                               AND
               CDPRODUTO   = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
               ((CDMARCA   = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA))  OR
               (VRPREUNIAF = C_AUTOFORN.VRPREUNIAF))                AND
               DTPROGENTAF = C_AUTOFORN.DTNEWENTAF;

         IF (V_COUNT_AUX = 0) OR (V_IDARREDCMPAMENOS = 'S') THEN
            IF C_AUTOFORN.DTPROGENTAF <> C_AUTOFORN.DTNEWENTAF THEN
               SELECT MIN(VRPRECUNIITM) INTO V_VRPRECUNIITM
               FROM ITEMCOLE
               WHERE
                  CDFILIAL     = C_AUTOFORN.CDCENTITMAP AND
                  CDREGIAO     = C_AUTOFORN.CDREGITMAP AND
                  CDFORNECED   = C_AUTOFORN.CDFORNECED AND
                  CDPRODUTO    = C_AUTOFORN.CDPRODUTO AND
                  CDMARCA      = C_AUTOFORN.CDMARCA AND
                  IDITMLISPREC = DECODE(SUBSTR(C_AUTOFORN.IDMOTIVPRESC,5,1), '1', 'S', IDITMLISPREC) AND
                  C_AUTOFORN.DTNEWENTAF BETWEEN DTINIVALITM AND DTFINVALITM;
               IF NVL(V_VRPRECUNIITM, 0) = 0 THEN
                  V_VRPRECUNIITM := C_AUTOFORN.VRPREUNIAF;
               END IF;
            ELSE
               V_VRPRECUNIITM := C_AUTOFORN.VRPREUNIAF;
            END IF;

            V_VRDESCITMAF  := 0;
            V_VRDESCITMAF  := (V_QTPROGENTAF * V_VRPRECUNIITM * C_AUTOFORN.VRPERDESAF)/100;
            V_QTVOLUITEMSO := 0;

            IF V_IDUTQTDEVOLU = 'S' THEN
               SELECT SUM(QTVOLUITEMSO) INTO V_QTVOLUITEMSO
               FROM ITEMSOLI
               WHERE CDFILSOLI  = C_AUTOFORN.CDFILDEST AND
                     DTPROGENTR = C_AUTOFORN.DTPROGENTAF AND
                     CDPRODUTO  = C_AUTOFORN.CDPRODUTO AND
                     IDITMCONS  = 'N';
            END IF;

            V_VRPERAJFORNFIL := NULL;
            V_IDCONSPERPIAJPR := 'N';

            SELECT
               MAX(VRPERAJFORNFIL),
               MAX(IDCONSPERPIAJPR)
            INTO V_VRPERAJFORNFIL, V_IDCONSPERPIAJPR
            FROM AJUSTEPRFORNFIL
            WHERE AJUSTEPRFORNFIL.CDFORNECED = C_AUTOFORN.CDFORNECED
              AND AJUSTEPRFORNFIL.CDFILIAL = C_AUTOFORN.CDFILDEST
              AND AJUSTEPRFORNFIL.DTINIAJPRFORFIL = (SELECT MAX(A.DTINIAJPRFORFIL)
                                                     FROM AJUSTEPRFORNFIL A
                                                     WHERE A.CDFORNECED = C_AUTOFORN.CDFORNECED
                                                       AND A.CDFILIAL = C_AUTOFORN.CDFILDEST
                                                       AND TRUNC(SYSDATE) BETWEEN A.DTINIAJPRFORFIL AND NVL(A.DTFINAJPRFORFIL, TRUNC(SYSDATE)));

            V_PIDSV := NULL;

            IF V_IDCONSPERPIAJPR = 'S' THEN
               SELECT
                  MAX(VRPERPIPRFO)
               INTO V_PIDSV
               FROM PRODFORNCOMP
               WHERE PRODFORNCOMP.CDFORNECED  = C_AUTOFORN.CDFORNECED
                 AND PRODFORNCOMP.CDPRODCOMPL = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO);

               IF V_PIDSV IS NULL THEN
                  SELECT MAX(VRPERPIFORN)
                  INTO V_PIDSV
                  FROM FORNECEDOR
                  WHERE FORNECEDOR.CDFORNECED = C_AUTOFORN.CDFORNECED;
               END IF;
            END IF;

            IF V_PIDSV IS NULL THEN
               V_PIDSV := 0;
            END IF;
            IF V_VRPERAJFORNFIL IS NULL THEN
               V_VRPERAJFORNFIL := 0;
            END IF;

            V_VRPRECUNIITM := V_VRPRECUNIITM - (V_VRPRECUNIITM * V_PIDSV/100) + (V_VRPRECUNIITM * V_VRPERAJFORNFIL/100);

            INSERT
              INTO ITEMAUTF_CLONE (CDFILDEST,   CDFILLANC,  CDMARCA, CDPRODUTO,
                                   DTPROGENTAF, CDFORNECED, QTPROGENTAF,
                                   NRSEQAPURAF, DTAUTOFORN, NRAUTOFORN, DTNEWENTAF, DTENTRAPUT)
            VALUES (C_AUTOFORN.CDFILDEST, C_AUTOFORN.CDFILLANC, NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),
                    NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO),
                    C_AUTOFORN.DTPROGENTAF, C_AUTOFORN.CDFORNECED, V_QTPROGENTAF,
                    P_NRSEQAPUR, TRUNC(P_DTAUTOFORN), V_CODIGO, C_AUTOFORN.DTNEWENTAF, C_AUTOFORN.DTNEWENTAF);

            IF V_IDARREDCMPAMENOS = 'N' THEN
               INSERT INTO ITEMAUTF
                  (CDFILDEST,  CDFILLANC,   NRAUTOFORN, CDPRODUTO,
                   CDMARCA,    DTPROGENTAF, CDSEGMARCA, QTPROGENTAF,
                   VRPREUNIAF, VRPERDESAF,  TXOBSITMAF, VRDESCITMAF,
                   NRLOTEESTQ, NRSUBLOTE,   CDPRODPRODAF, DTENTRITMSOL,
                   QTVOLUITEMAF, IDMOTPRESCAF, IDTPLANITEAF, CDFILCOTITAF,
                   NRCOTPREITAF, CDMARCOTITAF, CDREGCOTITAF, CDFORCOTITAF,
                   CDPROCOTITAF, NRLISTAITAF, QTDISPPRODMARC)
               SELECT C_AUTOFORN.CDFILDEST, C_AUTOFORN.CDFILLANC,   V_CODIGO, NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO),
                      NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),   C_AUTOFORN.DTNEWENTAF, C_AUTOFORN.CDSEGMARCA, V_QTPROGENTAF,
                      V_VRPRECUNIITM, C_AUTOFORN.VRPERDESAF,  V_OBSSOL, V_VRDESCITMAF,
                      V_NRLOTEESTQ, V_NRSUBLOTE, V_CDPRODPROD, C_AUTOFORN.DTPROGENTAF,
                      V_QTVOLUITEMSO, C_AUTOFORN.IDMOTIVPRESC, 'A', C_AUTOFORN.CDCENTITMAP,
                      C_AUTOFORN.NRCOLEITMAP, C_AUTOFORN.CDMARCA, C_AUTOFORN.CDREGITMAP,
                      C_AUTOFORN.CDFORNECED, C_AUTOFORN.CDPRODUTO, C_AUTOFORN.NRLISTAITMAP,
                      C_AUTOFORN.QTDISPPRODMARC

                 FROM DUAL
                WHERE NOT EXISTS (SELECT 1
                                    FROM ITEMAUTF, AUTOFORNE
                                   WHERE ITEMAUTF.CDFILDEST    = AUTOFORNE.CDFILDEST
                                     AND ITEMAUTF.CDFILLANC    = AUTOFORNE.CDFILLANC
                                     AND ITEMAUTF.NRAUTOFORN   = AUTOFORNE.NRAUTOFORN
                                     AND ITEMAUTF.CDFILDEST    = C_AUTOFORN.CDFILDEST
                                     AND ITEMAUTF.CDFILLANC    = C_AUTOFORN.CDFILLANC
                                     AND ITEMAUTF.CDPRODUTO    = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO)
                                     AND ITEMAUTF.CDMARCA      = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)
                                     AND ITEMAUTF.DTPROGENTAF  = C_AUTOFORN.DTNEWENTAF
                                     AND ITEMAUTF.QTPROGENTAF  = V_QTPROGENTAF
                                     AND AUTOFORNE.CDFORNECED  = C_AUTOFORN.CDFORNECED
                                     AND AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR);
            ELSE
               BEGIN
                  INSERT INTO ITEMAUTF
                     (CDFILDEST,    CDFILLANC,    NRAUTOFORN, CDPRODUTO,
                      CDMARCA,      DTPROGENTAF,  CDSEGMARCA, QTPROGENTAF,
                      VRPREUNIAF,   VRPERDESAF,   TXOBSITMAF, VRDESCITMAF,
                      NRLOTEESTQ,   NRSUBLOTE,    CDPRODPRODAF, DTENTRITMSOL,
                      QTVOLUITEMAF, IDMOTPRESCAF, IDTPLANITEAF, CDFILCOTITAF,
                      NRCOTPREITAF, CDMARCOTITAF, CDREGCOTITAF, CDFORCOTITAF,
                      CDPROCOTITAF, NRLISTAITAF,  QTDISPPRODMARC)
                  SELECT C_AUTOFORN.CDFILDEST,   C_AUTOFORN.CDFILLANC,    V_CODIGO,              NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO),
                         NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),            C_AUTOFORN.DTNEWENTAF, C_AUTOFORN.CDSEGMARCA, V_QTPROGENTAF,
                         V_VRPRECUNIITM,         C_AUTOFORN.VRPERDESAF,   V_OBSSOL,              V_VRDESCITMAF,
                         V_NRLOTEESTQ,           V_NRSUBLOTE,             V_CDPRODPROD,          C_AUTOFORN.DTPROGENTAF,
                         V_QTVOLUITEMSO,         C_AUTOFORN.IDMOTIVPRESC, 'A',                   C_AUTOFORN.CDCENTITMAP,
                         C_AUTOFORN.NRCOLEITMAP, C_AUTOFORN.CDMARCA,      C_AUTOFORN.CDREGITMAP, C_AUTOFORN.CDFORNECED,
                         C_AUTOFORN.CDPRODUTO,   C_AUTOFORN.NRLISTAITMAP, C_AUTOFORN.QTDISPPRODMARC
                    FROM DUAL
                   WHERE NOT EXISTS (SELECT 1
                                       FROM ITEMAUTF, AUTOFORNE
                                      WHERE ITEMAUTF.CDFILDEST    = AUTOFORNE.CDFILDEST
                                        AND ITEMAUTF.CDFILLANC    = AUTOFORNE.CDFILLANC
                                        AND ITEMAUTF.NRAUTOFORN   = AUTOFORNE.NRAUTOFORN
                                        AND ITEMAUTF.CDFILDEST    = C_AUTOFORN.CDFILDEST
                                        AND ITEMAUTF.CDFILLANC    = C_AUTOFORN.CDFILLANC
                                        AND ITEMAUTF.CDPRODUTO    = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO)
                                        AND ITEMAUTF.CDMARCA      = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)
                                        AND ITEMAUTF.DTPROGENTAF  = C_AUTOFORN.DTNEWENTAF
                                        AND ITEMAUTF.QTPROGENTAF  = V_QTPROGENTAF
                                        AND AUTOFORNE.CDFORNECED  = C_AUTOFORN.CDFORNECED
                                        AND AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR);
               EXCEPTION
                  WHEN OTHERS THEN BEGIN
                     UPDATE ITEMAUTF
                        SET ITEMAUTF.QTPROGENTAF = ITEMAUTF.QTPROGENTAF + V_QTPROGENTAF
                      WHERE ITEMAUTF.CDFILDEST   = C_AUTOFORN.CDFILDEST
                        AND ITEMAUTF.CDFILLANC   = C_AUTOFORN.CDFILLANC
                        AND ITEMAUTF.NRAUTOFORN  = V_CODIGO
                        AND ITEMAUTF.CDPRODUTO   = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO)
                        AND ITEMAUTF.CDMARCA     = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)
                        AND ITEMAUTF.DTPROGENTAF = C_AUTOFORN.DTNEWENTAF;
                  END;
               END;
            END IF;

            V_NRPEDIDOCOL := NULL;

            SELECT MAX(NRPEDIDOCOL)
            INTO V_NRPEDIDOCOL
            FROM ITEMCOLE
            WHERE ITEMCOLE.CDFILIAL    = C_AUTOFORN.CDCENTITMAP
              AND ITEMCOLE.NRCOLEPRECO = C_AUTOFORN.NRCOLEITMAP
              AND ITEMCOLE.CDMARCA     = C_AUTOFORN.CDMARCA
              AND ITEMCOLE.CDREGIAO    = C_AUTOFORN.CDREGITMAP
              AND ITEMCOLE.CDFORNECED  = C_AUTOFORN.CDFORNECED
              AND ITEMCOLE.CDPRODUTO   = C_AUTOFORN.CDPRODUTO;

            IF V_NRPEDIDOCOL IS NOT NULL THEN
               IF V_IDUTQTDISPGERAL = 'S' AND C_AUTOFORN.IDUTQTDISPFORN = 'S' THEN
                  UPDATE PRMARCPEDCOL
                  SET QTDISPPRODMARC = DECODE(QTDISPPRODMARC - V_QTPROGENTAF,
                                              ABS(QTDISPPRODMARC - V_QTPROGENTAF),
                                              QTDISPPRODMARC - V_QTPROGENTAF,
                                              0)
                  WHERE PRMARCPEDCOL.CDFILIAL       = C_AUTOFORN.CDCENTITMAP
                    AND PRMARCPEDCOL.NRPEDIDOCOL    = V_NRPEDIDOCOL
                    AND PRMARCPEDCOL.CDPRODUTO      = C_AUTOFORN.CDPRODUTO
                    AND PRMARCPEDCOL.CDMARCA        = C_AUTOFORN.CDMARCA
                    AND PRMARCPEDCOL.QTDISPPRODMARC IS NOT NULL;
               END IF;
            END IF;
         ELSE
            V_NRPEDIDOCOL := NULL;
            SELECT MAX(NRPEDIDOCOL)
            INTO V_NRPEDIDOCOL
            FROM ITEMCOLE
            WHERE ITEMCOLE.CDFILIAL    = C_AUTOFORN.CDCENTITMAP
              AND ITEMCOLE.NRCOLEPRECO = C_AUTOFORN.NRCOLEITMAP
              AND ITEMCOLE.CDMARCA     = C_AUTOFORN.CDMARCA
              AND ITEMCOLE.CDREGIAO    = C_AUTOFORN.CDREGITMAP
              AND ITEMCOLE.CDFORNECED  = C_AUTOFORN.CDFORNECED
              AND ITEMCOLE.CDPRODUTO   = C_AUTOFORN.CDPRODUTO;

            IF V_NRPEDIDOCOL IS NOT NULL THEN
               IF V_IDUTQTDISPGERAL = 'S' AND C_AUTOFORN.IDUTQTDISPFORN = 'S' THEN
                  UPDATE PRMARCPEDCOL
                  SET QTDISPPRODMARC = DECODE(QTDISPPRODMARC - V_QTPROGENTAF,
                                              ABS(QTDISPPRODMARC - V_QTPROGENTAF),
                                              QTDISPPRODMARC - V_QTPROGENTAF,
                                              0)
                  WHERE PRMARCPEDCOL.CDFILIAL       = C_AUTOFORN.CDCENTITMAP
                    AND PRMARCPEDCOL.NRPEDIDOCOL    = V_NRPEDIDOCOL
                    AND PRMARCPEDCOL.CDPRODUTO      = C_AUTOFORN.CDPRODUTO
                    AND PRMARCPEDCOL.CDMARCA        = C_AUTOFORN.CDMARCA
                    AND PRMARCPEDCOL.QTDISPPRODMARC IS NOT NULL;
               END IF;
            END IF;

            IF C_AUTOFORN.DTPROGENTAF <> V_DTENTRITMSOL THEN
              /* Solicitação de Compras da Entrega não antecipada */
              SELECT
                MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
              FROM
                ITEMSOLI,
                PRODUTO PRODSOLI,
                PRODUTO
              WHERE
                ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO     AND
                ITEMSOLI.CDFILSOLI   = C_AUTOFORN.CDFILDEST   AND
                ITEMSOLI.DTPROGENTR  = C_AUTOFORN.DTPROGENTAF AND
                PRODUTO.CDPRODUTO    = C_AUTOFORN.CDPRODUTO   AND
                PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO     AND
                ITEMSOLI.CDPRODUTO   = CASE C_AUTOFORN.IDFUNCAOFILI
                                          WHEN 'O'
                                          THEN CASE V_IDUTLPRCMPATIVO
                                                  WHEN 'S'
                                                  THEN NVL(V_CDPRARVORIG, ITEMSOLI.CDPRODUTO)
                                                  ELSE NVL(V_CDPRARVORIG, C_AUTOFORN.CDPRODUTO)
                                               END
                                          ELSE ITEMSOLI.CDPRODUTO
                                       END;

              SELECT NVL(MAX(QTSOLIPROD),0) INTO V_ANTQTSOLIPROD
              FROM ITEMSOLI
              WHERE
                CDFILSOLI  = C_AUTOFORN.CDFILDEST           AND
                CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4)  AND
                NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10)  AND
                CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10) AND
                DTPROGENTR = C_AUTOFORN.DTPROGENTAF;

              SELECT
                MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
              FROM
                ITEMSOLI,
                PRODUTO PRODSOLI,
                PRODUTO
              WHERE
                ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO     AND
                ITEMSOLI.CDFILSOLI   = C_AUTOFORN.CDFILDEST   AND
                ITEMSOLI.DTPROGENTR  = V_DTENTRITMSOL         AND
                PRODUTO.CDPRODUTO    = C_AUTOFORN.CDPRODUTO   AND
                PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO     AND
                ITEMSOLI.CDPRODUTO   = CASE C_AUTOFORN.IDFUNCAOFILI
                                          WHEN 'O'
                                          THEN CASE V_IDUTLPRCMPATIVO
                                                  WHEN 'S'
                                                  THEN NVL(V_CDPRARVORIG, ITEMSOLI.CDPRODUTO)
                                                  ELSE NVL(V_CDPRARVORIG, C_AUTOFORN.CDPRODUTO)
                                               END
                                          ELSE ITEMSOLI.CDPRODUTO
                                       END;

              /* Log de Alteração */
              INSERT INTO MOVOPSOL
               (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV,
                CDPRODUTO, DTENTROPER, DTOPERSOL,
                CDOPERADOR, QTANTOPER, QTDEPOPER,
                DSJUSTOPER)
              SELECT
                ITEMSOLI.CDFILSOLI, ITEMSOLI.CDFILLAN, ITEMSOLI.NRSOLICMP,
                ITEMSOLI.CDPRODUTO, V_DTENTRITMSOL, SYSDATE,
                P_CDOPERADOR, ITEMSOLI.QTSOLIPROD, ITEMSOLI.QTSOLIPROD + V_ANTQTSOLIPROD,
                'Ef.AF -Entr. Antecipada de '||C_AUTOFORN.DTPROGENTAF
              FROM
                ITEMSOLI
              WHERE
                ITEMSOLI.CDFILSOLI  = C_AUTOFORN.CDFILDEST AND
                ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4)  AND
                ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10)  AND
                ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10) AND
                ITEMSOLI.DTPROGENTR = V_DTENTRITMSOL;

              V_DTAUX := SYSDATE;
              WHILE V_DTAUX = SYSDATE LOOP
                 V_DTAUX := V_DTAUX;
              END LOOP;

              UPDATE ITEMSOLI
              SET QTSOLIPROD = QTSOLIPROD + V_ANTQTSOLIPROD
              WHERE
                CDFILSOLI  = C_AUTOFORN.CDFILDEST           AND
                CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4)  AND
                NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10)  AND
                CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10) AND
                DTPROGENTR = V_DTENTRITMSOL;

              V_QTSOLIPROD := 0;

              /* Retirar quantidade da antiga solicitação */
              FOR C_ITEMSOLI IN
               (SELECT
                  ITEMSOLI.CDFILSOLI,
                  ITEMSOLI.CDFILLAN,
                  ITEMSOLI.NRSOLICMP,
                  ITEMSOLI.CDPRODUTO,
                  ITEMSOLI.DTPROGENTR,
                  ITEMSOLI.QTSOLIPROD,
                  PRODSOLI.VRFATOCONV
                FROM
                  ITEMSOLI,
                  PRODUTO PRODSOLI,
                  PRODUTO
                WHERE
                  ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO     AND
                  ITEMSOLI.CDFILSOLI   = C_AUTOFORN.CDFILDEST   AND
                  ITEMSOLI.DTPROGENTR  = C_AUTOFORN.DTPROGENTAF AND
                  PRODUTO.CDPRODUTO    = C_AUTOFORN.CDPRODUTO   AND
                  PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO     AND
                  ITEMSOLI.CDPRODUTO   = CASE C_AUTOFORN.IDFUNCAOFILI
                                            WHEN 'O'
                                            THEN CASE V_IDUTLPRCMPATIVO
                                                    WHEN 'S'
                                                    THEN NVL(V_CDPRARVORIG, ITEMSOLI.CDPRODUTO)
                                                    ELSE NVL(V_CDPRARVORIG, C_AUTOFORN.CDPRODUTO)
                                                 END
                                            ELSE ITEMSOLI.CDPRODUTO
                                         END)
              LOOP
                IF V_QTSOLIPROD = 0 THEN
                  V_QTSOLIPROD := V_ANTQTSOLIPROD - C_ITEMSOLI.QTSOLIPROD;
                ELSE
                  V_QTSOLIPROD := V_QTSOLIPROD - C_ITEMSOLI.QTSOLIPROD;
                END IF;
                IF V_QTSOLIPROD >= 0 THEN
                   DELETE FROM ITEMSOLI
                   WHERE
                     CDFILSOLI  = C_ITEMSOLI.CDFILSOLI  AND
                     CDFILLAN   = C_ITEMSOLI.CDFILLAN   AND
                     NRSOLICMP  = C_ITEMSOLI.NRSOLICMP  AND
                     CDPRODUTO  = C_ITEMSOLI.CDPRODUTO  AND
                     DTPROGENTR = C_ITEMSOLI.DTPROGENTR;

                   /* LOG DE ALTERAÇÃO */
                   INSERT INTO MOVOPSOL
                    (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV,
                     CDPRODUTO, DTENTROPER, DTOPERSOL,
                     CDOPERADOR, QTANTOPER, QTDEPOPER,
                     DSJUSTOPER)
                   VALUES
                    (C_ITEMSOLI.CDFILSOLI, C_ITEMSOLI.CDFILLAN, C_ITEMSOLI.NRSOLICMP,
                     C_ITEMSOLI.CDPRODUTO, C_ITEMSOLI.DTPROGENTR, SYSDATE,
                     P_CDOPERADOR, C_ITEMSOLI.QTSOLIPROD, 0,
                    'EF.AF -ENTR. ANTECIPADA P/ '||V_DTENTRITMSOL);

                   V_DTAUX := SYSDATE;
                   WHILE V_DTAUX = SYSDATE LOOP
                      V_DTAUX := V_DTAUX;
                   END LOOP;

                   IF V_QTSOLIPROD = 0 THEN
                      EXIT;
                   END IF;
                ELSE
                   IF V_QTSOLIPROD < 0 THEN
                     UPDATE ITEMSOLI
                     SET
                       QTSOLIPROD = ABS(V_QTSOLIPROD)
                     WHERE
                       CDFILSOLI  = C_ITEMSOLI.CDFILSOLI  AND
                       CDFILLAN   = C_ITEMSOLI.CDFILLAN   AND
                       NRSOLICMP  = C_ITEMSOLI.NRSOLICMP  AND
                       CDPRODUTO  = C_ITEMSOLI.CDPRODUTO  AND
                       DTPROGENTR = C_ITEMSOLI.DTPROGENTR;

                     /* LOG DE ALTERAÇÃO */
                     INSERT INTO MOVOPSOL
                      (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV,
                       CDPRODUTO, DTENTROPER, DTOPERSOL,
                       CDOPERADOR, QTANTOPER, QTDEPOPER,
                       DSJUSTOPER)
                     VALUES
                      (C_ITEMSOLI.CDFILSOLI, C_ITEMSOLI.CDFILLAN, C_ITEMSOLI.NRSOLICMP,
                       C_ITEMSOLI.CDPRODUTO, C_ITEMSOLI.DTPROGENTR, SYSDATE,
                       P_CDOPERADOR, C_ITEMSOLI.QTSOLIPROD, ABS(V_QTSOLIPROD),
                      'EF.AF -ENTR. ANTECIPADA P/ '||V_DTENTRITMSOL);

                     V_DTAUX := SYSDATE;
                     WHILE V_DTAUX = SYSDATE LOOP
                        V_DTAUX := V_DTAUX;
                     END LOOP;

                     EXIT;
                   END IF;
                END IF;
              END LOOP;
              IF V_IDUTEMPENHAF = 'S' THEN
                 SELECT
                    NVL(MAX(VRARREDEMPMAR), 0)
                  INTO
                     V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
                  FROM
                     MARCPROD
                  WHERE
                     (CDMARCA   = C_AUTOFORN.CDMARCA) AND
                     (CDPRODUTO IN (SELECT
                                       P.CDPRODUTO
                                    FROM
                                       PRODUTO P
                                    WHERE
                                       P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                       C_AUTOFORN.CDARVPROD LIKE P.CDARVPROD || '%') );
                 IF V_VRARREDEMPE = 0 THEN
                    SELECT
                       DECODE(MAX(VRARREDEMPE), NULL, 0, MAX(VRARREDEMPE)) INTO V_VRARREDEMPE
                    FROM
                       PRODFORNCOMP
                    WHERE
                       CDPRODCOMPL = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                       CDFORNECED  = C_AUTOFORN.CDFORNECED;
                  END IF;
                  IF (MOD(V_QTPROGENTAF, V_VRARREDEMPE) <> 0) AND V_VRARREDEMPE > 0 THEN
                     V_QTPROGENTAF := CEIL(V_QTPROGENTAF / V_VRARREDEMPE) * V_VRARREDEMPE;
                  END IF;
              END IF;
              V_QTEMPENHADA := 0;
              IF V_IDUTEMPENHAF = 'S' THEN
                 IF (MOD(C_AUTOFORN.QTEMPENHADA, V_VRARREDEMPE) <> 0) AND V_VRARREDEMPE > 0 THEN
                    V_QTEMPENHADA := NVL(CEIL(C_AUTOFORN.QTEMPENHADA / V_VRARREDEMPE) * V_VRARREDEMPE, 0);
                 END IF;
              END IF;
              IF V_QTEMPENHADA = 0 THEN
              /* E O UPDATE NA ITEMAUTF QUE TEM NO ANTES DESSE IF*/
              /*ALTERAÇÃO PARA ALIBRAS QUANDO FORNECEDOR TEM PERIODICIDADE E ARREDONDAMENTO DE EMPENHO
                MAIOR QUE 1 E O SISTEMA COMPRA PARA MAIS OU PARA MENNOS DO QUE DESEJA DO NO PERIODO*/
                 UPDATE ITEMAUTF
                    SET QTPROGENTAF   = QTPROGENTAF + V_QTPROGENTAF
                  WHERE CDFILDEST     = C_AUTOFORN.CDFILDEST                   AND
                        CDFILLANC     = C_AUTOFORN.CDFILLANC                   AND
                        NRAUTOFORN    = V_CODIGO                               AND
                        CDPRODUTO     = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                        CDMARCA       = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)   AND
                        DTPROGENTAF   = C_AUTOFORN.DTNEWENTAF;
              ELSE
                 UPDATE ITEMAUTF
                    SET QTPROGENTAF   = QTPROGENTAF + V_QTPROGENTAF
                  WHERE CDFILDEST     = C_AUTOFORN.CDFILDEST                   AND
                        CDFILLANC     = C_AUTOFORN.CDFILLANC                   AND
                        NRAUTOFORN    = V_CODIGO                               AND
                        CDPRODUTO     = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                        CDMARCA       = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)   AND
                        DTPROGENTAF   = C_AUTOFORN.DTNEWENTAF                  AND
                        (QTPROGENTAF + V_QTPROGENTAF) <= V_QTEMPENHADA;
                 IF SQL%NOTFOUND THEN
                    UPDATE ITEMAUTF
                       SET QTPROGENTAF   = V_QTEMPENHADA
                     WHERE CDFILDEST     = C_AUTOFORN.CDFILDEST                   AND
                           CDFILLANC     = C_AUTOFORN.CDFILLANC                   AND
                           NRAUTOFORN    = V_CODIGO                               AND
                           CDPRODUTO     = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                           CDMARCA       = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)   AND
                           DTPROGENTAF   = C_AUTOFORN.DTNEWENTAF                  AND
                           QTPROGENTAF   < V_QTEMPENHADA;
                 END IF;
              END IF;
            END IF;
         END IF;

         IF (V_DSATUAL <> V_DSANTERIOR) AND (NOT V_DSANTERIOR IS NULL) THEN
            V_DSPGTO := V_ANTDSPZOPGTCONC;
            WHILE INSTR(V_DSPGTO, '_') > 0 LOOP
               V_DIAPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '*')-1);
               V_DSPGTO  := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '*')+1, LENGTH(V_DSPGTO));

               V_VRPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '_')-1);
               V_DSPGTO := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '_')+1, LENGTH(V_DSPGTO));

               INSERT INTO PRAZOPGTAF
                  (CDFILDEST, CDFILLANC, NRAUTOFORN, NRDIASPGTOAF, VRPERCPGTOAF)
               VALUES
                   (V_ANTCDFILDEST, V_ANTCDFILLANC, V_ANTCODIGO, V_DIAPGTO, V_VRPGTO);
            END LOOP;

            /* SE ALGUM PRODUTO FOR FRACIONADO, UPDATA A APURAÇÃO PARA HABILITAR O BOTÃO DE APURAR NOVAMENTE */
            IF V_IDARREDCMPAMENOS = 'S' THEN
               SELECT NVL(MAX('S'), 'N')
                 INTO V_IDQTFRACIONADO
                 FROM AUTOFORNE A, ITEMAUTF I, FILIAL F
                WHERE I.CDFILDEST   = A.CDFILDEST
                  AND I.CDFILLANC   = A.CDFILLANC
                  AND I.NRAUTOFORN  = A.NRAUTOFORN
                  AND A.CDFILDEST   = F.CDFILIAL
                  AND A.NRSEQAPURAF = P_NRSEQAPUR
                  AND DECODE(F.CDFILCENTCMP, NULL, F.CDFILIAL, F.CDFILCENTCMP) = P_CDCENTCMP
                  AND FLOOR(I.QTPROGENTAF) <> I.QTPROGENTAF;

               IF V_IDQTFRACIONADO = 'S' THEN
                  V_CONTADOR := V_CONTADOR + 1;
               END IF;
            END IF;

            -- FECHAMENTO_AF;
            -- GERA-PARCELAS

            UPDATE ITEMAUTF
               SET ITEMAUTF.NRPARCITMAF = (SELECT LPAD(TO_CHAR(COUNT(DISTINCT ITEM.DTPROGENTAF)),2,'0')
                                             FROM ITEMAUTF ITEM
                                            WHERE (ITEM.CDFILDEST   = V_ANTCDFILDEST)
                                              AND (ITEM.CDFILLANC   = V_ANTCDFILLANC)
                                              AND (ITEM.NRAUTOFORN  = V_ANTCODIGO)
                                              AND (ITEM.DTPROGENTAF <= ITEMAUTF.DTPROGENTAF))
            WHERE
               (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
               (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
               (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);
                  --------
            SELECT MIN(CDINSCESTA) INTO V_CDINSCESTA
            FROM INSCRESTAD
            WHERE (CDEMPRESA = V_ANTCDEMPRESA);

            SELECT MIN(DTPROGENTAF) INTO V_DTPROGENTAF
            FROM ITEMAUTF
            WHERE (CDFILDEST  = V_ANTCDFILDEST)  AND
                  (CDFILLANC  = V_ANTCDFILLANC)  AND
                  (NRAUTOFORN = V_ANTCODIGO);

            IMPOSTO_ITEMAF(V_ANTCDEMPRESA,
                           V_CDINSCESTA,
                           V_ANTCDFORNECED,
                           V_ANTCDFILDEST,
                           V_ANTCDFILLANC,
                           V_ANTCODIGO,
                           V_DTPROGENTAF);

            -- qryValor_AF

            SELECT
               SUM(ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF),
               SUM((ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF * NVL(ITEMAUTF.VRPERDESAF, 0)) / 100)
               INTO V_VRPRODUTO, V_VRDESCONTO
            FROM
               ITEMAUTF
            WHERE
               (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
               (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
               (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);

            SELECT
               NVL(SUM(IMPITMAF.VRADIMPAF), 0) INTO V_VRIMPOSTO
            FROM
               IMPITMAF,
               ITEMAUTF,
               IMPOSTO
            WHERE
               (IMPITMAF.CDFILDEST   = V_ANTCDFILDEST)       AND
               (IMPITMAF.CDFILLANC   = V_ANTCDFILLANC)       AND
               (IMPITMAF.NRAUTOFORN  = V_ANTCODIGO)          AND
               (IMPITMAF.CDFILDEST   = ITEMAUTF.CDFILDEST)   AND
               (IMPITMAF.CDFILLANC   = ITEMAUTF.CDFILLANC)   AND
               (IMPITMAF.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN)  AND
               (IMPITMAF.CDPRODUTO   = ITEMAUTF.CDPRODUTO)   AND
               (IMPITMAF.CDMARCA     = ITEMAUTF.CDMARCA)     AND
               (IMPITMAF.DTPROGENTAF = ITEMAUTF.DTPROGENTAF) AND
               (IMPITMAF.CDIMPOSTO   = IMPOSTO.CDIMPOSTO)    AND
                NVL(IMPOSTO.IDACRPRODENTRNF, 'N') = 'N';

            UPDATE AUTOFORNE
            SET VRTOTALAF = V_VRPRODUTO - V_VRDESCONTO + V_VRIMPOSTO
            WHERE
               (CDFILDEST   = V_ANTCDFILDEST) AND
               (CDFILLANC   = V_ANTCDFILLANC) AND
               (NRAUTOFORN  = V_ANTCODIGO);
         END IF;

            -- qryLimite_AF
            -- qryConsAF

         IF C_AUTOFORN.DTENTRAPUT IS NULL THEN
            V_DSANTERIOR := C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                            C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                            C_AUTOFORN.CDTIPCOB     || NULL                    ||
                            C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                            C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                            C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                            C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                            C_AUTOFORN.CONC_KEY;
         ELSE
            V_DSANTERIOR := C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                            C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                            C_AUTOFORN.CDTIPCOB     || C_AUTOFORN.DTENTRAPUT   ||
                            C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                            C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                            C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                            C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                            C_AUTOFORN.CONC_KEY;
         END IF;

       --  DBMS_OUTPUT.PUT_LINE('CONC_KEY = '||C_AUTOFORN.CONC_KEY);

         V_ANTCODIGO       := V_CODIGO;
         V_ANTCDFILDEST    := C_AUTOFORN.CDFILDEST;
         V_ANTCDFILLANC    := C_AUTOFORN.CDFILLANC;
         V_ANTCDFORNECED   := C_AUTOFORN.CDFORNECED;
         V_ANTIDTPFORPGTAF := C_AUTOFORN.IDTPFORPGTAP;
         V_ANTCDTIPCOB     := C_AUTOFORN.CDTIPCOB;
         V_ANTIDTIPOEMITAF := C_AUTOFORN.IDTIPOEMITAP;
         V_ANTCDEMPRESA    := V_EMPRESA;
         V_ANTIDTIPOFRETAF := C_AUTOFORN.IDTIPOFRETAP;
         V_ANTCDFORMPGTO   := C_AUTOFORN.CDFORMPGTO;
         V_ANTNRPARCPGTOAF := C_AUTOFORN.NRPARCPGTOAP;
         V_ANTNRDIAPGFIXAF := C_AUTOFORN.NRDIAPGFIXAF;
         V_ANTIDUTDIAPGTAF := C_AUTOFORN.IDUTDIAPGTAF;
         V_ANTDSPZOPGTCONC := C_AUTOFORN.DSPZOPGTCOAP;
         V_ANTCONC_KEY     := C_AUTOFORN.CONC_KEY;
      END IF;

   END LOOP;

   -- GERAR PARA O ULTIMO ITEM

   V_DSPGTO := V_ANTDSPZOPGTCONC;

   WHILE INSTR(V_DSPGTO, '_') > 0 LOOP
      V_DIAPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '*')-1);
      V_DSPGTO  := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '*')+1, LENGTH(V_DSPGTO));

      V_VRPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '_')-1);
      V_DSPGTO := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '_')+1, LENGTH(V_DSPGTO));

      INSERT INTO PRAZOPGTAF
         (CDFILDEST, CDFILLANC, NRAUTOFORN, NRDIASPGTOAF, VRPERCPGTOAF)
      (SELECT V_ANTCDFILDEST, V_ANTCDFILLANC, V_ANTCODIGO, V_DIAPGTO, V_VRPGTO
         FROM DUAL
        WHERE NOT EXISTS (SELECT 1
                            FROM PRAZOPGTAF
                           WHERE CDFILDEST    = V_ANTCDFILDEST
                             AND CDFILLANC    = V_ANTCDFILLANC
                             AND NRAUTOFORN   = V_ANTCODIGO
                             AND NRDIASPGTOAF = V_DIAPGTO));
   END LOOP;

   /* SE ALGUM PRODUTO FOR FRACIONADO, UPDATA A APURAÇÃO PARA HABILITAR O BOTÃO DE APURAR NOVAMENTE */
   IF V_IDARREDCMPAMENOS = 'S' THEN
      SELECT NVL(MAX('S'), 'N')
        INTO V_IDQTFRACIONADO
        FROM AUTOFORNE A, ITEMAUTF I, FILIAL F
       WHERE I.CDFILDEST   = A.CDFILDEST
         AND I.CDFILLANC   = A.CDFILLANC
         AND I.NRAUTOFORN  = A.NRAUTOFORN
         AND A.CDFILDEST   = F.CDFILIAL
         AND A.NRSEQAPURAF = P_NRSEQAPUR
         AND DECODE(F.CDFILCENTCMP, NULL, F.CDFILIAL, F.CDFILCENTCMP) = P_CDCENTCMP
         AND FLOOR(I.QTPROGENTAF) <> I.QTPROGENTAF;

      IF V_IDQTFRACIONADO = 'S' THEN
         V_CONTADOR := V_CONTADOR + 1;
      END IF;
   END IF;

   -- FECHAMENTO_AF;
   -- GERA-PARCELAS

   UPDATE ITEMAUTF
      SET ITEMAUTF.NRPARCITMAF = (SELECT LPAD(TO_CHAR(COUNT(DISTINCT ITEM.DTPROGENTAF)),2,'0')
                                    FROM ITEMAUTF ITEM
                                   WHERE (ITEM.CDFILDEST   = V_ANTCDFILDEST)
                                     AND (ITEM.CDFILLANC   = V_ANTCDFILLANC)
                                     AND (ITEM.NRAUTOFORN  = V_ANTCODIGO)
                                     AND (ITEM.DTPROGENTAF <= ITEMAUTF.DTPROGENTAF))
   WHERE
      (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
      (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
      (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);

   SELECT MIN(CDINSCESTA) INTO V_CDINSCESTA
   FROM INSCRESTAD
   WHERE (CDEMPRESA = V_ANTCDEMPRESA);

   SELECT MIN(DTPROGENTAF) INTO V_DTPROGENTAF
   FROM ITEMAUTF
   WHERE (CDFILDEST  = V_ANTCDFILDEST)  AND
         (CDFILLANC  = V_ANTCDFILLANC)  AND
         (NRAUTOFORN = V_ANTCODIGO);

   IMPOSTO_ITEMAF(V_ANTCDEMPRESA,
                  V_CDINSCESTA,
                  V_ANTCDFORNECED,
                  V_ANTCDFILDEST,
                  V_ANTCDFILLANC,
                  V_ANTCODIGO,
                  V_DTPROGENTAF);

   -- qryValor_AF

   SELECT
      SUM(ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF),
      SUM((ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF * NVL(ITEMAUTF.VRPERDESAF, 0)) / 100)
      INTO V_VRPRODUTO, V_VRDESCONTO
   FROM
      ITEMAUTF
   WHERE
      (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
      (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
      (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);

   SELECT
      NVL(SUM(IMPITMAF.VRADIMPAF), 0) INTO V_VRIMPOSTO
   FROM
      IMPITMAF,
      ITEMAUTF,
      IMPOSTO
   WHERE
      (IMPITMAF.CDFILDEST   = V_ANTCDFILDEST)       AND
      (IMPITMAF.CDFILLANC   = V_ANTCDFILLANC)       AND
      (IMPITMAF.NRAUTOFORN  = V_ANTCODIGO)          AND
      (IMPITMAF.CDFILDEST   = ITEMAUTF.CDFILDEST)   AND
      (IMPITMAF.CDFILLANC   = ITEMAUTF.CDFILLANC)   AND
      (IMPITMAF.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN)  AND
      (IMPITMAF.CDPRODUTO   = ITEMAUTF.CDPRODUTO)   AND
      (IMPITMAF.CDMARCA     = ITEMAUTF.CDMARCA)     AND
      (IMPITMAF.DTPROGENTAF = ITEMAUTF.DTPROGENTAF) AND
      (IMPITMAF.CDIMPOSTO   = IMPOSTO.CDIMPOSTO)    AND
       NVL(IMPOSTO.IDACRPRODENTRNF, 'N') = 'N';

   UPDATE AUTOFORNE
   SET VRTOTALAF = V_VRPRODUTO - V_VRDESCONTO + V_VRIMPOSTO
   WHERE
      (CDFILDEST   = V_ANTCDFILDEST) AND
      (CDFILLANC   = V_ANTCDFILLANC) AND
      (NRAUTOFORN  = V_ANTCODIGO);

   /* SE ALGUM PRODUTO FOR FRACIONADO, UPDATA A APURAÇÃO PARA HABILITAR O BOTÃO DE APURAR NOVAMENTE */
   IF V_IDARREDCMPAMENOS = 'S' THEN
      IF V_CONTADOR_AUX = 'S' THEN
         UPDATE APURPRECO
            SET IDQTFRACIONADO = 'N'
          WHERE APURPRECO.CDFILCENTCMP = P_CDCENTCMP
            AND APURPRECO.NRAPURPREC   = P_NRSEQAPUR;
      ELSE
         IF V_CONTADOR = 0 THEN
            UPDATE APURPRECO
               SET IDQTFRACIONADO = 'N'
             WHERE APURPRECO.CDFILCENTCMP = P_CDCENTCMP
               AND APURPRECO.NRAPURPREC   = P_NRSEQAPUR;
         ELSE
            UPDATE APURPRECO
               SET IDQTFRACIONADO = 'S'
             WHERE APURPRECO.CDFILCENTCMP = P_CDCENTCMP
               AND APURPRECO.NRAPURPREC   = P_NRSEQAPUR;
         END IF;
      END IF;
   END IF;

   UPDATE APURPRECO
      SET CDCOMPRADOR = P_CDOPERADOR
    WHERE APURPRECO.CDFILCENTCMP = P_CDCENTCMP
      AND APURPRECO.NRAPURPREC   = P_NRSEQAPUR
      AND CDCOMPRADOR IS NULL;

   DELETE FROM USR_NRSEQAPUR_TMP
    WHERE NRSEQAPUR = P_NRSEQAPUR;
END;