ALTER TABLE TRABNECECOMP ADD QTESTNFPEND FLOAT NULL
/
CREATE OR REPLACE FUNCTION FORMATPRODMASK (P_CDARVPROD IN VARCHAR2) RETURN VARCHAR2
IS
  V_FORMATMASK VARCHAR2(50);
  V_CDPICTPROD VARCHAR2(50);
  V_CDARVPROD  VARCHAR2(50);
  V_MASKLENGTH FLOAT;
BEGIN
  SELECT CDPICTPROD, LENGTH(CDPICTPROD)
    INTO V_CDPICTPROD, V_MASKLENGTH
    FROM PARAMGERAL;
     
  V_CDARVPROD := P_CDARVPROD; 
  FOR V_LOOP IN 1..V_MASKLENGTH
  LOOP 
    IF(SUBSTR(V_CDPICTPROD, V_LOOP, 1) = '.') THEN
      V_FORMATMASK := V_FORMATMASK||'.';
      V_CDARVPROD  := V_FORMATMASK||SUBSTR(V_CDARVPROD, V_LOOP, V_MASKLENGTH);
    ELSE
      V_FORMATMASK := V_FORMATMASK||SUBSTR(V_CDARVPROD, V_LOOP, 1);
    END IF;
  END LOOP;
   
  WHILE SUBSTR(V_FORMATMASK, LENGTH(V_FORMATMASK), 1) = '.' 
  LOOP
    V_FORMATMASK := SUBSTR(V_FORMATMASK, 0 , LENGTH(V_FORMATMASK)-1);
  END LOOP;
  RETURN(V_FORMATMASK);
END;
/

create or replace PROCEDURE GERA_NOTAFISCAL_CORPO_NFE(
   P_NRACESSONFE  IN NOTAFISCAL.NRACESSONFE%TYPE,
   P_GERAIGUALXML IN PARAMGERAL.IDGERNFIGUALXML%TYPE,
   P_LIBERAXML    IN PARAMGERAL.IDGERNFIGUALXML%TYPE DEFAULT 'N',
   P_CDTIPOOPER    VARCHAR2 DEFAULT 'N'
   )
AS

   V_IDORIGDESTNF VARCHAR2(01);
   V_IDTPIJURNF   VARCHAR2(01);
   V_NRINSJURNF   VARCHAR2(20);
   V_CDFORNECED   VARCHAR2(21);
   V_CDCLIENTE    VARCHAR2(21);
   V_CDFILIEMIT   VARCHAR2(21);
   V_CDINSCESTA   VARCHAR2(16);
   V_CDINSCMUNI   VARCHAR2(16);
   V_IDDOCFATUR   VARCHAR2(01);
   V_IDDOCFISCENT VARCHAR2(01);
   V_IDDOCESTOQUE VARCHAR2(01);
   V_CDMODDOCFISC VARCHAR2(05);
   V_NRLANCTONF   VARCHAR2(20);
   V_NRLANCESTQ   VARCHAR2(20);
   V_CDTIPOOPER   VARCHAR2(02);
   V_CDTPOPRELAC  VARCHAR2(02);
   V_CDFILIRECE   VARCHAR2(04);
   V_CDFILIAL     VARCHAR2(04);
   V_CDFILLANC    VARCHAR2(04);
   V_CDFILDEST    VARCHAR2(04);
   V_CDEMPRESA    VARCHAR2(02);
   V_ATUAESTOQUE  VARCHAR2(01);
   V_DTENTRSAID   DATE;
   V_DTEMISSAO    DATE;
   V_NRNOTAFISC   VARCHAR2(20);
   V_CDSERIEENTR  VARCHAR2(05);
   V_IDTPIJURTRAN VARCHAR2(01);
   V_VRNOTAFISC   NUMBER;
   V_VRPRODUTOS   NUMBER;
   V_TAMNOTAFISC  NUMBER;
   V_VRDESPERITEM NUMBER;
   V_QTPROGENTAF  NUMBER;
   V_QTITEMPROD   NUMBER;
   V_VRPREUNIAF   FLOAT;
   V_CDMARCA      VARCHAR2(10);
   V_INSPROD      VARCHAR2(01);
   V_IDIMPIMPOXML VARCHAR2(01);
   V_PRODATUEST   VARCHAR2(01);
   V_FILIATUEST   VARCHAR2(01);
   V_CDALMOXARIFE VARCHAR2(10);
   V_CDLOCALESTOQ VARCHAR2(10);
   V_IDUTILALMOX  VARCHAR2(01);
   V_IDUTILLCESTQ VARCHAR2(01);
   V_IDUTILLOTE   VARCHAR2(01);
   V_CLIENT_INFO  VARCHAR2(64);
   V_CDOPERADOR   VARCHAR2(20);
   V_ERRO         VARCHAR2(01);
   V_ERROAF       VARCHAR2(01);
   V_CDPAISORIG   VARCHAR2(04);
   V_CDPAISDEST   VARCHAR2(04);
   V_SGESTAORIG   VARCHAR2(02);
   V_SGESTADEST   VARCHAR2(02);
   V_CDGRUPOFISC  VARCHAR2(05);
   V_IDINTEREST   VARCHAR2(01);
   V_CDFISCALIT   VARCHAR2(01);
   V_DIG1CST      VARCHAR2(01);
   V_CODIGOCST    VARCHAR2(03);

   V_QTDCFOP      NUMBER;
   V_EXPRODAF     NUMBER;
   V_RELACAF      NUMBER;
   V_CDCFOPNF     VARCHAR2(10);
   V_CFOP1DIGT    VARCHAR2(01);
   V_CFOPXML      VARCHAR2(10);
   V_PAISDEST     VARCHAR2(04);
   V_ESTADEST     VARCHAR2(02);
   V_MUNIDEST     VARCHAR2(04);
   V_PAISORIG     VARCHAR2(04);
   V_ESTAORIG     VARCHAR2(02);
   V_MUNIORIG     VARCHAR2(04);
   V_PAISCFOP     VARCHAR2(04);
   V_ESTACFOP     VARCHAR2(02);
   V_IDENDCFOP    VARCHAR2(01);
   V_IMPVENCXML   VARCHAR2(01);
   V_ROLLBACK     VARCHAR2(01);
   V_TOTALNOTA    NUMBER;
   V_COUNTINCONS  NUMBER;
   V_NRAUTOFORN   VARCHAR2(10);
   V_QTDAFANTIGA  FLOAT;
   V_IDUTINSCNFFILORI  VARCHAR2(01); /* Utilizar a inscrição estadual para verificar a filial de destino (V_CDFILIRECE)*/
   V_IDBAIXAFTOTLANNF  VARCHAR2(01);

   V_IDFUNCAOFILI  VARCHAR2(01);
   V_CDENCARGOIMPXML  VARCHAR2(02);

   V_NRINSJURTRANXML  VARCHAR2(20);
   V_NRPLACAVEICXML   VARCHAR2(07);
   V_SGUFVEICXML      VARCHAR2(02);
   V_IDPGTOFRETEXML   VARCHAR2(01);
   V_DSQTDEVOLUXML    VARCHAR2(10);
   V_DSESPECVOLUXML   VARCHAR2(10);
   V_DSMARCAVOLUXML   VARCHAR2(120);
   V_DSNUMEVOLUXML    VARCHAR2(15);
   V_VRPBRUTOVOLUXML  FLOAT;
   V_VRPLIQUVOLUXML   FLOAT;

   C_NRSEQINCONS   INTG_INCONSISTENCIA.NRSEQINCONS%TYPE;
   C_CDCONSISTXML  INTG_INCONSISTENCIA.CDCONSISTXML%TYPE;
   C_DSINCONSIS    INTG_INCONSISTENCIA.DSINCONSIS%TYPE;

   CURSOR C_INCONS IS
      SELECT NRSEQINCONS, CDCONSISTXML, DSINCONSIS
        FROM INTG_INCONSISTENCIA
       WHERE NRACESSONFE = P_NRACESSONFE
       ORDER BY NRSEQINCONS;

BEGIN
   V_CDCLIENTE    := NULL;
   V_CDFORNECED   := NULL;
   V_CDFILIEMIT   := NULL;
   V_ERRO         := 'N';
   V_IDINTEREST   := 'N';

   VERIFICA_INCONS_NF(P_NRACESSONFE, P_GERAIGUALXML, 'N', NULL, NULL, P_LIBERAXML, P_CDTIPOOPER, V_ERRO);

   IF (V_ERRO = 'N') THEN

      DBMS_APPLICATION_INFO.READ_CLIENT_INFO(V_CLIENT_INFO);
      V_CDOPERADOR := SUBSTR(V_CLIENT_INFO,45,12);

      BEGIN
         SELECT CDOPERADOR
           INTO V_CDOPERADOR
           FROM OPERADOR
          WHERE CDOPERADOR = V_CDOPERADOR;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDOPERADOR := SUBSTR(V_CLIENT_INFO,1,12);
      END;

      IF (NVL(P_CDTIPOOPER, 'N') = 'N') THEN
         BEGIN
            SELECT CDTIPOOPER
              INTO V_CDTPOPRELAC
              FROM INTG_ITEMPRODUTO I, CFOPXMLTPOPER C
             WHERE I.NRACESSONFE = P_NRACESSONFE
               AND IDENTRSAIDOP  = 'E'
               AND I.CDFISOPEITEM = C.CDFISCOPER
               AND ROWNUM = 1
             ORDER BY NRSEQITPROD;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDTPOPRELAC := NULL;
         END;
      ELSE
         V_CDTPOPRELAC := P_CDTIPOOPER;
      END IF;

      SELECT I.CDFORNECED,  I.CDFILIRECE, NVL(I.CDTIPOOPER, V_CDTPOPRELAC), I.CDINSCESTA,
             I.NRNOTAFISC,  I.DTEMISSAO,  I.VRNOTAFISC, I.VRPRODUTOS,
             I.CDSERIEENTR, I.CDMODDOCFISC, LPAD(IP.NRAUTOFORN, 10, '0') AS NRAUTOFORN,
             I.NRINSJURTRANXML, I.NRPLACAVEICXML, I.SGUFVEICXML,   I.IDPGTOFRETEXML,  I.DSQTDEVOLUXML,
             I.DSESPECVOLUXML,  I.DSMARCAVOLUXML, I.DSNUMEVOLUXML, I.VRPBRUTOVOLUXML, I.VRPLIQUVOLUXML
        INTO V_CDFORNECED, V_CDFILIRECE, V_CDTIPOOPER, V_CDINSCESTA,
             V_NRNOTAFISC, V_DTEMISSAO,  V_VRNOTAFISC, V_VRPRODUTOS,
             V_CDSERIEENTR, V_CDMODDOCFISC, V_NRAUTOFORN,
             V_NRINSJURTRANXML, V_NRPLACAVEICXML, V_SGUFVEICXML,   V_IDPGTOFRETEXML,  V_DSQTDEVOLUXML,
             V_DSESPECVOLUXML,  V_DSMARCAVOLUXML, V_DSNUMEVOLUXML, V_VRPBRUTOVOLUXML, V_VRPLIQUVOLUXML
        FROM INTG_NOTAFISCAL I,
                (SELECT MIN(NRAUTOFORN) AS NRAUTOFORN
                   FROM INTG_ITEMPRODUTO
                  WHERE NRACESSONFE = P_NRACESSONFE) IP
       WHERE NRACESSONFE = P_NRACESSONFE;

      IF (V_NRAUTOFORN IS NOT NULL) THEN
         BEGIN
            SELECT COUNT(1)
              INTO V_QTDAFANTIGA
              FROM AUTOFORNE
             WHERE NRAUTOFORN = V_NRAUTOFORN;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_QTDAFANTIGA := 0;
         END;

         IF (V_QTDAFANTIGA = 1) THEN
            SELECT CDFILDEST, CDFILLANC
              INTO V_CDFILIRECE, V_CDFILLANC
              FROM AUTOFORNE
             WHERE NRAUTOFORN = V_NRAUTOFORN;
             
            UPDATE INTG_NOTAFISCAL
               SET CDFILIRECE = V_CDFILIRECE
             WHERE NRACESSONFE = P_NRACESSONFE;
         END IF;
      END IF;

      /* BUSCAR A FILIAL RELACIONADA A INSCRIÇÃO ESTADUAL DO ARQUIVO XML CASO A FILIAL
         NÃO TENHA SIDO PREENCHIDA E O PARÂMETRO IDUTINSCNFFILORI ESTEJA MARCADO*/
      IF (V_CDINSCESTA IS NOT NULL) AND (V_CDFILIRECE IS NULL) THEN
         BEGIN
            SELECT NVL(IDUTINSCNFFILORI, 'N') AS IDUTINSCNFFILORI, NVL(IDBAIXAFTOTLANNF, 'N') AS IDBAIXAFTOTLANNF
              INTO V_IDUTINSCNFFILORI, V_IDBAIXAFTOTLANNF
              FROM PARAMGERAL
             WHERE CDPARGERAL = '0001';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDUTINSCNFFILORI := 'N'; V_IDBAIXAFTOTLANNF:= 'N';
         END;

         IF (V_IDUTINSCNFFILORI = 'S') THEN
            BEGIN
               SELECT MAX(CDFILIAL)
                 INTO V_CDFILIRECE
                 FROM FILIAL
                WHERE CDINSCESTA = V_CDINSCESTA;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDFILIRECE := NULL;
            END;
            IF V_CDFILIRECE IS NOT NULL THEN
               UPDATE INTG_NOTAFISCAL
                  SET CDFILIRECE = V_CDFILIRECE
                WHERE NRACESSONFE = P_NRACESSONFE;
            END IF;

         END IF;
      END IF;

      /* BUSCAR TIPO DE OPERAÇÃO RELACIONADO A FILIAL */
      IF (V_CDFILIRECE IS NOT NULL) THEN
         BEGIN
            SELECT NVL(MAX(CDTIPOOPERFIL), V_CDTIPOOPER)
              INTO V_CDTIPOOPER
              FROM INTG_ITEMPRODUTO I, CFOPXMLTPOPFIL C
             WHERE I.NRACESSONFE = P_NRACESSONFE
               AND IDENTRSAIDOPFIL  = 'E'
               AND I.CDFISOPEITEM = C.CDFISCOPERFIL
               AND C.CDFILIAL = V_CDFILIRECE
               AND ROWNUM = 1
             ORDER BY NRSEQITPROD;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDTIPOOPER := V_CDTIPOOPER;
         END;
      END IF;

      /* BUSCAR A FILIAL RELACIONADA A INSCRIÇÃO ESTADUAL DO ARQUIVO XML CASO A FILIAL
         NÃO TENHA SIDO PREENCHIDA E O PARÂMETRO IDUTINSCNFFILORI ESTEJA MARCADO*/

      V_IDFUNCAOFILI := 'N';
      BEGIN
         SELECT NVL(IDFUNCAOFILI, 'N')
           INTO V_IDFUNCAOFILI
           FROM FILIAL
          WHERE CDFILIAL = V_CDFILIRECE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDFUNCAOFILI := 'N';
      END;

      SELECT MIN(A.CDEMPRESA), MIN(A.CDINSCMUNI)
        INTO V_CDEMPRESA, V_CDINSCMUNI
        FROM(SELECT CDEMPRESA, CDINSCMUNI
               FROM FILIAL
              WHERE CDFILIAL   = V_CDFILIRECE
                AND CDINSCESTA = V_CDINSCESTA
              UNION
             SELECT CDEMPRESA, CDINSCMUNI
               FROM EMPRCNTRFIL
              WHERE CDFILIAL   = V_CDFILIRECE
                AND CDINSCESTA = V_CDINSCESTA) A;

      --VARIÁVEIS PARA CONSULTA DE ALÍQUOTA, INCIDÊNCIA, CFOP
      BEGIN
         SELECT CDPAIS,     SGESTADO,   CDMUNICIPIO
           INTO V_PAISDEST, V_ESTADEST, V_MUNIDEST
           FROM INSCRESTAD
          WHERE (CDEMPRESA  = V_CDEMPRESA)
            AND (CDINSCESTA = V_CDINSCESTA);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_PAISDEST := NULL; V_ESTADEST := NULL; V_MUNIDEST := NULL;
      END;

      BEGIN
         SELECT NVL(IDENDCFOPFOR, 'P')
           INTO V_IDENDCFOP
           FROM FORNECEDOR
          WHERE (CDFORNECED = V_CDFORNECED);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDENDCFOP := 'P';
      END;
      IF V_IDENDCFOP = 'I' THEN
         BEGIN
            SELECT CDPAIS    , SGESTADO
              INTO   V_PAISCFOP, V_ESTACFOP
              FROM INSCRESTAD
             WHERE CDEMPRESA  = V_CDEMPRESA
               AND CDINSCESTA = V_CDINSCESTA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PAISCFOP := NULL; V_ESTACFOP := NULL;
         END;
      ELSE
         BEGIN
            SELECT CDPAIS, SGESTADO
              INTO V_PAISCFOP, V_ESTACFOP
              FROM ENDEFORN
             WHERE (CDFORNECED   = V_CDFORNECED)
               AND (IDTPENDEFORN = V_IDENDCFOP);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PAISCFOP := NULL; V_ESTACFOP := NULL;
         END;
      END IF;

      BEGIN
         SELECT CDPAIS, SGESTADO, CDMUNICIPIO
           INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
           FROM ENDEFORN
          WHERE (CDFORNECED   = V_CDFORNECED)
            AND (IDTPENDEFORN = 'P');
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_PAISORIG := NULL; V_ESTAORIG := NULL; V_MUNIORIG := NULL;
      END;

      IF (V_PAISORIG = V_PAISDEST) AND (V_ESTAORIG <> V_ESTADEST) THEN
         V_IDINTEREST := 'S';
      END IF;

      /* Verifica primeiro digito do CFOP */
      V_CFOP1DIGT := '';

      IF V_PAISCFOP = V_PAISDEST THEN
         IF V_ESTACFOP = V_ESTADEST THEN
            V_CFOP1DIGT := '1';
         ELSE
            V_CFOP1DIGT := '2';
         END IF;
      ELSE
         V_CFOP1DIGT := '3';
      END IF;

      BEGIN
         SELECT NVL(MAX(NRTAMNUMNFUTDFE), 9)
           INTO V_TAMNOTAFISC
           FROM PARAMFILIAL
          WHERE CDFILIAL = V_CDFILIRECE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_TAMNOTAFISC := 9;
      END;

      BEGIN
         SELECT MAX(IDTPIJURFORN), MAX(NRINSJURFORN)
           INTO V_IDTPIJURNF, V_NRINSJURNF
           FROM FORNECEDOR
          WHERE CDFORNECED = V_CDFORNECED;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDTPIJURNF := NULL; V_NRINSJURNF := NULL;
      END;

      BEGIN
         SELECT NVL(IDCTRLESTQ, 'S')
           INTO V_ATUAESTOQUE
           FROM PARAMFILIAL
          WHERE CDFILIAL = V_CDFILIRECE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_ATUAESTOQUE := 'S';
      END;

      BEGIN
         SELECT NVL(IDATUESTTPOP, V_ATUAESTOQUE)
           INTO V_ATUAESTOQUE
           FROM TIPOOPERAC
          WHERE CDTIPOOPER   = V_CDTIPOOPER
            AND IDENTRSAIDOP = 'E';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_ATUAESTOQUE := V_ATUAESTOQUE;
      END;

      BEGIN
         SELECT DECODE(PG.IDUTILDTPROC,'S',DECODE(PF.DTPROCESSA, NULL, TO_DATE(SYSDATE), PF.DTPROCESSA),TO_DATE(SYSDATE)) AS DTPROCESSA
           INTO V_DTENTRSAID
           FROM PARAMGERAL PG, PARAMFILIAL PF
          WHERE PG.CDPARGERAL = '0001'
            AND PF.CDFILIAL = V_CDFILIRECE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_DTENTRSAID := TO_DATE(SYSDATE);
      END;

      V_NRNOTAFISC := LPAD(V_NRNOTAFISC, V_TAMNOTAFISC, '0');

      V_IDDOCFISCENT := 'S';

      V_IDDOCESTOQUE := 'N';

      IF (V_NRAUTOFORN IS NOT NULL) THEN
         V_CDFILIAL := V_CDFILLANC;
      ELSE
         V_CDFILIAL := V_CDFILIRECE;
      END IF;

      NOVO_CODIGO('LANCNFPROD/FILIAL' || V_CDFILIAL, V_NRLANCTONF);
      NOVO_CODIGO('LANCNF/FILIAL' || V_CDFILIAL, V_NRLANCTONF);

      V_NRLANCTONF := SUBSTR(V_NRLANCTONF, 11, 10);

      IF V_ATUAESTOQUE = 'S' THEN
         NOVO_CODIGO('LANCTOEST' || V_CDFILIAL, V_NRLANCESTQ);
         V_NRLANCESTQ := SUBSTR(V_NRLANCESTQ, 11, 10);
      ELSE
         V_NRLANCESTQ := '';
      END IF;

      CONSULTA_GRUPOFISCAL('F', V_CDFORNECED, V_CDFILIRECE, 'E', V_CDTIPOOPER, V_CDGRUPOFISC);

      IF (V_NRINSJURTRANXML IS NOT NULL) THEN
         BEGIN
            SELECT NRINSJURTRAN, IDTPIJURTRAN
              INTO V_NRINSJURTRANXML, V_IDTPIJURTRAN
              FROM TRANSPORT
             WHERE NRINSJURTRAN = V_NRINSJURTRANXML
               AND ROWNUM = 1;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_NRINSJURTRANXML := NULL; V_IDTPIJURTRAN := NULL;
         END;
      END IF;

      INSERT INTO NOTAFISCAL
         (CDFILIAL,     NRLANCTONF,   CDEMPRESA,    CDINSCESTA,   CDINSCMUNI,
          CDFILIEMIT,   CDFILIRECE,   IDTPIJURNF,   NRINSJURNF,   CDFORNECED,
          CDCLIENTE,    IDBLOQUEADO,  IDDOCFISCAL,  IDDOCFINANC,  DTENTRSAID,
          VRPRODUTOS,   VRNOTAFISC,   NRPLACAVEIC,  SGUFVEIC,     IDPGTOFRETE,
          DSQTDEVOLU,   DSESPECVOLU,  DSMARCAVOLU,  DSNUMEVOLU,   VRPBRUTOVOLU,
          VRPLIQUVOLU,  IDENTRSAIDOP, CDTIPOOPER,   CDSERIEENTR,  IDTPIJURTRAN,
          NRINSJURTRAN, IDDOCCONTAB,  IDSTATUS,     IDDOCFATUR,   IDDOCFISCENT,
          IDDOCFISCSAI, IDDOCESTOQUE, IDSISTEMA,    CDMODDOCFISC, IDORIGDESTNF,
          NRAPURACFAT,  CDINTEGRACAO, DTLANCAMENNF, NRNOTAFISC,   DTEMISSAO,
          NRACESSONFE,  CDOPERGERA,   IDNFGERADAVIAXML)
      VALUES
         (V_CDFILIAL,        V_NRLANCTONF,     V_CDEMPRESA,      V_CDINSCESTA,    V_CDINSCMUNI,
          V_CDFILIEMIT,      V_CDFILIRECE,     V_IDTPIJURNF,     V_NRINSJURNF,    V_CDFORNECED,
          V_CDCLIENTE,       'N',              'S',              'S',             TO_DATE(V_DTENTRSAID),
          0,                 V_VRNOTAFISC,     V_NRPLACAVEICXML, V_SGUFVEICXML,   V_IDPGTOFRETEXML,
          V_DSQTDEVOLUXML,   V_DSESPECVOLUXML, V_DSMARCAVOLUXML, V_DSNUMEVOLUXML, V_VRPBRUTOVOLUXML,
          V_VRPLIQUVOLUXML,  'E',              V_CDTIPOOPER,     V_CDSERIEENTR,   V_IDTPIJURTRAN,
          V_NRINSJURTRANXML, 'S',              'I',              V_IDDOCFATUR,    'N',
          V_IDDOCFISCENT,    V_IDDOCESTOQUE,   'DFE',            V_CDMODDOCFISC,  'F',
          NULL,              NULL,             SYSDATE,          V_NRNOTAFISC,    TO_DATE(V_DTEMISSAO),
          P_NRACESSONFE,     V_CDOPERADOR,     'S');

      INSERT INTO ITEMENCARGO
         (CDFILIAL, NRLANCTONF, CDENCARGO, VRITEMENCA)
         (SELECT V_CDFILIAL, V_NRLANCTONF, CDENCARGO, 0
            FROM ENCARGO
           WHERE NOT EXISTS(SELECT CDENCARGO
                              FROM ITEMENCARGO
                             WHERE CDFILIAL   = V_CDFILIAL
                               AND NRLANCTONF = V_NRLANCTONF
                               AND CDENCARGO  = ENCARGO.CDENCARGO));

      FOR C_ITEMENCARGO IN (SELECT CDFILIAL, NRLANCTONF, I.CDENCARGO, I.VRITEMENCA, E.NMENCARGO, E.IDENCARGO
                                 FROM INTG_ITEMENCARGO I, ENCARGO E
                                WHERE I.CDENCARGO = E.CDENCARGO
                                  AND I.VRITEMENCA > 0
                                  AND I.NRACESSONFE = P_NRACESSONFE)LOOP

         UPDATE ITEMENCARGO
            SET VRITEMENCA = VRITEMENCA + C_ITEMENCARGO.VRITEMENCA
          WHERE CDENCARGO  = C_ITEMENCARGO.CDENCARGO
            AND CDFILIAL   = V_CDFILIAL
            AND NRLANCTONF = V_NRLANCTONF;

      END LOOP;   

      FOR C_ITEMPRODUTO IN (SELECT PR.CDARVPROD, PR.NMPRODUTO,  I.VRUNITITEM,
                                   I.VRDESCITEM, I.NRSEQITPROD, I.VRTOTAITEM,
                                   PR.CDPRODUTO, I.QTITEMPROD,  LPAD(I.NRAUTOFORN, 10, '0') AS NRAUTOFORN,
                                   I.IDORIGEMPROD, I.CDFISOPEITEM, I.CDSITUTRIBPR,
                                   PR.CDPRODESTO, NVL(PR.VRFATOCONV, 1) AS VRFATOCONV
                              FROM INTG_ITEMPRODUTO I, PRODFORNXML P, PRODUTO PR
                             WHERE I.NRACESSONFE = P_NRACESSONFE
                               AND I.CDPRODUTO   = P.CDPRODUTOXML
                               AND P.CDPRODUTO   = PR.CDPRODUTO
                               AND P.CDFORNECED  = V_CDFORNECED
                               AND V_IDFUNCAOFILI <> 'O'
                             UNION ALL
                            SELECT PR.CDARVPROD, PR.NMPRODUTO,
                                   (I.VRTOTAITEM - I.VRDESCITEM)/ (I.QTITEMPROD/NVL(P.VRFATCONVOL, 1)) AS VRUNITITEM,
                                   I.VRDESCITEM, I.NRSEQITPROD, I.VRTOTAITEM,
                                   PR.CDPRODUTO, ROUND((I.QTITEMPROD/NVL(P.VRFATCONVOL, 1)), 3) AS QTITEMPROD,
                                   LPAD(I.NRAUTOFORN, 10, '0') AS NRAUTOFORN,
                                   I.IDORIGEMPROD, I.CDFISOPEITEM, I.CDSITUTRIBPR,
                                   PR.CDPRODESTO, NVL(P.VRFATCONVOL, 1) AS VRFATOCONV
                              FROM INTG_ITEMPRODUTO I, PRODFORNXML P, PRODUTO PR, RELACPRODOL R, PRODUTO PR2
                             WHERE I.NRACESSONFE = P_NRACESSONFE
                               AND I.CDPRODUTO   = P.CDPRODUTOXML
                               AND R.CDPRARVORIG = P.CDPRODUTO
                               AND R.CDPRODARVOL = PR.CDPRODUTO
                               AND P.CDFORNECED  = V_CDFORNECED
                               AND V_IDFUNCAOFILI = 'O'
                               AND PR2.CDPRODUTO = P.CDPRODUTO
                             ORDER BY NRSEQITPROD) LOOP


         SELECT NVL(MAX(P.IDCNTRESTOQ),NVL(MAX(F.IDCTRLESTQ),'N')) AS CNTRESTOQ,
                NVL(MAX(F.IDCTRLESTQ),'N') AS IDCTRLESTQ,
                NVL(NVL(MAX(P.CDALMOXARIFE),MAX(F.CDALMOXARIFE)),' '),
                NVL(NVL(MAX(P.CDLOCALESTOQ),MAX(F.CDLOCALESTOQ)),' '),
                NVL(MAX(F.IDUTILALMOX),'N'),
                NVL(MAX(F.IDUTILLCESTQ),'N'),
                NVL(MAX(F.IDUTILLOTE),'N')
           INTO V_PRODATUEST,
                V_FILIATUEST,
                V_CDALMOXARIFE,
                V_CDLOCALESTOQ,
                V_IDUTILALMOX,
                V_IDUTILLCESTQ,
                V_IDUTILLOTE
           FROM PRODFILI P, PARAMFILIAL F, PRODUTO D
          WHERE P.CDFILIAL    = V_CDFILIRECE
            AND P.CDFILIAL    = F.CDFILIAL
            AND D.CDPRODUTO   = C_ITEMPRODUTO.CDPRODUTO
            AND P.CDPRODUTO   = D.CDPRODESTO
            AND (F.IDCTRLESTQ = 'S' OR F.IDCTRLESTQ IS NULL);

         V_CFOPXML := SUBSTR(C_ITEMPRODUTO.CDFISOPEITEM, 2, 3);

         INSERT INTO ITEMPRODUTO
            (CDFILIAL,  CDPRODEMIS,  VRUNITITEM, IDCONFORITEM, NRLANCTONF,
             DSPRODEMIS, VRDESCITEM, NRSEQITPROD, IDATUVRESTOQ,
             VRTOTAITEM, CDPRODUTO, QTITEMPROD, VRCONTITEM, CDFISOPEITEM,
             IDAVISOSITEM, VRBRUTITEM, CDFILDEST, NRAUTOFORN, CDSITUTRIBPR,
             CDMARCA, DTPROGENTAF, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,
             NRSUBLOTE, CDFILIMOVI, VRDESPERITEM, CDOPERADOR, IDITEMORIGEM,
             IDORIGEMPROD, VRENCARGOIMPXML)
         VALUES
            (V_CDFILIAL, C_ITEMPRODUTO.CDARVPROD, C_ITEMPRODUTO.VRUNITITEM, 'S', V_NRLANCTONF,
             C_ITEMPRODUTO.NMPRODUTO, C_ITEMPRODUTO.VRDESCITEM, LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0'), V_PRODATUEST,
             C_ITEMPRODUTO.VRTOTAITEM, C_ITEMPRODUTO.CDPRODUTO,  C_ITEMPRODUTO.QTITEMPROD, 0, V_CFOP1DIGT||V_CFOPXML,
             '000000', (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM), V_CDFILIRECE, C_ITEMPRODUTO.NRAUTOFORN,
             C_ITEMPRODUTO.CDSITUTRIBPR, NULL, NULL, V_CDALMOXARIFE, V_CDLOCALESTOQ, ' ',
             ' ', V_CDFILIRECE, V_VRDESPERITEM, V_CDOPERADOR, NULL,
             C_ITEMPRODUTO.IDORIGEMPROD, 0);

         IF (C_ITEMPRODUTO.NRAUTOFORN IS NOT NULL) THEN    /* AND EXISTE AF NO SISTEMA*/
            SELECT CDFILLANC, CDFILDEST
              INTO V_CDFILLANC, V_CDFILDEST
              FROM AUTOFORNE
             WHERE NRAUTOFORN = C_ITEMPRODUTO.NRAUTOFORN
               AND (IDAFFORALIM = 'N')
               AND (IDSITUATUAAF IS NULL)
               AND (NVL(IDAFOPERLOG,'1') = '1')
               AND (NVL(IDAFEXPIRADA, 'N') = 'N');

            V_EXPRODAF := 0;

            BEGIN
               SELECT COUNT(1)
                 INTO V_EXPRODAF
                 FROM ITEMAUTF I, PRODUTO P
                WHERE I.CDFILLANC   = V_CDFILLANC
                  AND I.CDFILDEST   = V_CDFILDEST
                  AND I.NRAUTOFORN  = C_ITEMPRODUTO.NRAUTOFORN
                  AND P.CDPRODESTO  = C_ITEMPRODUTO.CDPRODESTO
                  AND (IDBAIXITMAF NOT IN ('2','3') OR IDBAIXITMAF IS NULL)
                  AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0
                  AND I.CDPRODUTO = P.CDPRODUTO;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_EXPRODAF := 0;
            END;

            IF (V_EXPRODAF > 0) THEN
               V_INSPROD := 'S';
               FOR C_ITEMAUTF IN(SELECT CDMARCA, DTPROGENTAF, (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) AS QTPROGENTAF,
                                        VRPREUNIAF, P.CDPRODUTO, P.CDARVPROD, NVL(P.VRFATOCONV, 1) AS VRFATOCONVAF
                                   FROM ITEMAUTF I, PRODUTO P
                                  WHERE I.CDFILLANC   = V_CDFILLANC
                                    AND I.CDFILDEST   = V_CDFILDEST
                                    AND I.NRAUTOFORN  = C_ITEMPRODUTO.NRAUTOFORN
                                    AND P.CDPRODESTO  = C_ITEMPRODUTO.CDPRODESTO
                                    AND (IDBAIXITMAF NOT IN ('2','3') OR IDBAIXITMAF IS NULL)
                                    AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0
                                    AND I.CDPRODUTO = P.CDPRODUTO
                                  ORDER BY I.DTPROGENTAF) LOOP

                  IF V_INSPROD = 'S' THEN

                     V_INSPROD := 'N';

                     V_RELACAF := 0;
                     BEGIN
                        SELECT COUNT(1)
                          INTO V_RELACAF
                          FROM NFRELACAF
                         WHERE CDFILIAL    = V_CDFILIAL
                           AND CDFILLANC   = V_CDFILLANC
                           AND NRLANCTONF  = V_NRLANCTONF
                           AND CDFILDEST   = V_CDFILDEST
                           AND NRAUTOFORN  = C_ITEMPRODUTO.NRAUTOFORN
                           AND CDPRODUTO   = C_ITEMAUTF.CDPRODUTO
                           AND CDMARCA     = C_ITEMAUTF.CDMARCA
                           AND DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_RELACAF := 0;
                     END;

                     IF (C_ITEMPRODUTO.CDPRODUTO = C_ITEMAUTF.CDPRODUTO) OR (V_IDFUNCAOFILI = 'O') THEN
                        V_QTITEMPROD := C_ITEMPRODUTO.QTITEMPROD;
                     ELSE
                        V_QTITEMPROD := (C_ITEMPRODUTO.QTITEMPROD * C_ITEMPRODUTO.VRFATOCONV)/C_ITEMAUTF.VRFATOCONVAF;
                     END IF;

                     IF V_RELACAF = 0 THEN
                        INSERT INTO NFRELACAF
                           (CDFILIAL, CDFILLANC, NRLANCTONF, CDFILDEST,
                            NRAUTOFORN, CDPRODUTO, CDMARCA,
                            DTPROGENTAF, QTNFRELACAF, VRNFRELACAF)
                           VALUES
                           (V_CDFILIAL, V_CDFILLANC, V_NRLANCTONF, V_CDFILDEST,
                            C_ITEMPRODUTO.NRAUTOFORN, C_ITEMAUTF.CDPRODUTO, C_ITEMAUTF.CDMARCA,
                            C_ITEMAUTF.DTPROGENTAF, C_ITEMAUTF.QTPROGENTAF /*V_QTITEMPROD*/, C_ITEMAUTF.VRPREUNIAF);
                     END IF;

                     UPDATE ITEMPRODUTO
                        SET CDMARCA     = C_ITEMAUTF.CDMARCA,
                            DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF
                      WHERE CDFILIAL    = V_CDFILIAL
                        AND NRLANCTONF  = V_NRLANCTONF
                        AND NRSEQITPROD = LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0');

                     V_CDMARCA := C_ITEMAUTF.CDMARCA;

                     NF_BAIXA_AF(V_CDFILIAL, V_NRLANCTONF, LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0'), 'I', C_ITEMAUTF.CDARVPROD, C_ITEMAUTF.CDARVPROD,
                                 C_ITEMAUTF.CDPRODUTO, C_ITEMAUTF.CDPRODUTO, V_CDMARCA, V_CDMARCA, V_QTITEMPROD, V_QTITEMPROD, V_ERROAF);

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

         BEGIN
            SELECT NVL(NVL(P.CDCSTDIG1PROD ,F.CDCSTDIG1ENT), '0') AS CDCSTDIG1
              INTO V_DIG1CST
              FROM ITEMPRODUTO I, NOTAFISCAL N, FORNECEDOR F, PRODUTO P
             WHERE I.CDFILIAL    = V_CDFILIAL
               AND I.NRLANCTONF  = V_NRLANCTONF
               AND I.NRSEQITPROD = LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0')
               AND N.CDFILIAL    = I.CDFILIAL
               AND N.NRLANCTONF  = I.NRLANCTONF
               AND F.CDFORNECED  = N.CDFORNECED
               AND P.CDPRODUTO   = I.CDPRODUTO;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_DIG1CST := 0;
         END;

         IF (P_GERAIGUALXML = 'S') THEN
            FOR C_TRABITPROIMPOS IN(SELECT IT.CDFILIAL, IT.NRLANCTONF, IT.NRSEQIMPOIT, IT.CDIMPOSTOIT,
                                           B.SGIMPOSTO, B.IDTRATIMPO, B.IDPREIMPENTR, B.IDCONSISTENT,
                                           IT.VRCONTITIMP, IT.VRPERREDBCIT, IT.VRBASECALCIT, IT.VRALIQITEM,
                                           IT.VRIMPOSTOIT, IT.CDFISCALIT, IT.CDSITUTRIBIT, IT.CDFISCOPERIT,
                                           IT.NRITPROIMPOS, IT.IDMODBCITNFE, IT.IDMODBCSTITNFE,
                                           NVL(IT.VRADICALIQFECP, 0) AS VRADICALIQFECP,
                                           NVL(IT.VRADICFECP, 0) AS VRADICFECP
                                      FROM INTG_TRABITPROIMPOS IT, IMPOSTO B
                                     WHERE NRACESSONFE    = P_NRACESSONFE
                                       AND B.CDIMPOSTO    = IT.CDIMPOSTOIT
                                       AND IT.NRSEQIMPOIT = C_ITEMPRODUTO.NRSEQITPROD
                                     ORDER BY IT.CDFILIAL, IT.NRLANCTONF, IT.NRSEQIMPOIT, IT.CDIMPOSTOIT) LOOP


               IF(C_TRABITPROIMPOS.VRIMPOSTOIT > 0) THEN
                  V_CDFISCALIT := '1';
               ELSE
                  V_CDFISCALIT := '2';
               END IF;

               IF (LENGTH(C_TRABITPROIMPOS.CDSITUTRIBIT) = 2) THEN
                  V_CODIGOCST := C_TRABITPROIMPOS.CDSITUTRIBIT;
               ELSE
                  IF (LENGTH(C_TRABITPROIMPOS.CDSITUTRIBIT) > 2) THEN
                     V_CODIGOCST := SUBSTR(C_TRABITPROIMPOS.CDSITUTRIBIT, 2,2);
                  END IF;
               END IF;

               V_CFOPXML := SUBSTR(C_ITEMPRODUTO.CDFISOPEITEM, 2, 3);

               BEGIN
                  SELECT NVL(CDENCARGOIMPXML, NULL)
                    INTO V_CDENCARGOIMPXML
                    FROM IMPOSTO
                   WHERE CDIMPOSTO = C_TRABITPROIMPOS.CDIMPOSTOIT;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CDENCARGOIMPXML := NULL;
               END;

               IF (V_CDENCARGOIMPXML IS NULL) THEN

                  INSERT INTO TRABITPROIMPOS
                     (CDFILIMPOIT, NRLANCIMPOIT, NRSEQIMPOIT, CDIMPOSTOIT, VRCONTIMPOIT,
                      VRREDBCIMPOIT, VRBCALCIMPOIT, VRALIQIMPOIT, VRPDEDIMPOIT, VRIMPOSIT,
                      CDFISCIMPOIT,  CDSTRIBIMPOIT, CDFOPERIMPOIT, NRSEQITPRO, IDVALORINFO,
                      VR1REDBCIMPOIT, IDTRIMPSTTI, VRIMPOSVISUIT, CDSTRIBITNFE, VRADICALIQFECP, VRADICFECP)
                  VALUES
                     (V_CDFILIAL, V_NRLANCTONF, LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0'), C_TRABITPROIMPOS.CDIMPOSTOIT, (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM),
                      NVL(C_TRABITPROIMPOS.VRPERREDBCIT,  0), NVL(C_TRABITPROIMPOS.VRBASECALCIT, 0), C_TRABITPROIMPOS.VRALIQITEM, 0, C_TRABITPROIMPOS.VRIMPOSTOIT,
                      V_CDFISCALIT, V_DIG1CST||V_CODIGOCST, V_CFOP1DIGT||V_CFOPXML, C_TRABITPROIMPOS.NRITPROIMPOS, 'S',
                       0, '0', C_TRABITPROIMPOS.VRIMPOSTOIT, V_CODIGOCST, C_TRABITPROIMPOS.VRADICALIQFECP, C_TRABITPROIMPOS.VRADICFECP);

               ELSE
                  UPDATE ITEMENCARGO
                     SET VRITEMENCA = VRITEMENCA + C_TRABITPROIMPOS.VRIMPOSTOIT + C_TRABITPROIMPOS.VRADICFECP
                   WHERE CDENCARGO  = V_CDENCARGOIMPXML
                     AND CDFILIAL   = V_CDFILIAL
                     AND NRLANCTONF = V_NRLANCTONF;

                  UPDATE ITEMPRODUTO
                     SET VRENCARGOIMPXML  = VRENCARGOIMPXML + C_TRABITPROIMPOS.VRIMPOSTOIT + C_TRABITPROIMPOS.VRADICFECP
                   WHERE NRSEQITPROD = LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0')
                     AND CDFILIAL    = V_CDFILIAL
                     AND NRLANCTONF  = V_NRLANCTONF;
               END IF;
            END LOOP;

         ELSE
            IMPOSTO_ENTRADA_PRODUTO(V_CDEMPRESA, V_CDINSCESTA, V_CDTIPOOPER, V_CDFORNECED, V_CDFILIAL, V_NRLANCTONF,
                                    V_DTENTRSAID, 'E', V_CDOPERADOR, V_CDGRUPOFISC, V_IDINTEREST, C_ITEMPRODUTO.CDARVPROD,
                                    '', 'F', V_CDFILIRECE, NULL, NULL, C_ITEMPRODUTO.VRTOTAITEM, C_ITEMPRODUTO.IDORIGEMPROD);


            FOR C_ALIQITEM IN(SELECT IM.CDIMPOSTO, IM.SGIMPOSTO, IM.IDTRATIMPO, IM.IDPREIMPENTR,
                                     I.CDFISCTEMP, NVL(AL.VRALIQUTMP, 0) AS VRALIQUOTA,
                                     NVL(AL.VRADICALIQFECP, 0) AS VRADICALIQFECP
                                FROM INCITEMP I, IMPOSTO IM, ALIQTEMPPROD AL
                               WHERE I.CDIMPOTEMP  = IM.CDIMPOSTO
                                 AND I.NRINCITEMP  = V_CDFILIAL||V_NRLANCTONF
                                 AND I.NRINCITEMP  = AL.NRALIQTEMP(+)
                                 AND I.CDIMPOTEMP  = AL.CDIMPOTEMP(+)
                                 AND IM.IDPRODNOTA <> 'C') LOOP

               BEGIN
                  SELECT NVL(IDIMPORTAIMPXML , 'N')
                    INTO V_IDIMPIMPOXML
                    FROM IMPOSTO
                   WHERE CDIMPOSTO = C_ALIQITEM.CDIMPOSTO;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_IDIMPIMPOXML := 'N';
               END;

               IF (V_IDIMPIMPOXML = 'N') THEN
                  INSERT INTO TRABITPROIMPOS
                     (CDFILIMPOIT, NRLANCIMPOIT, NRSEQIMPOIT, CDIMPOSTOIT, VRCONTIMPOIT,
                     VRREDBCIMPOIT, VRBCALCIMPOIT, VRALIQIMPOIT, VRPDEDIMPOIT, VRIMPOSIT,
                     CDFISCIMPOIT,  NRSEQITPRO, IDVALORINFO,
                     VR1REDBCIMPOIT, IDTRIMPSTTI, VRIMPOSVISUIT, VRADICALIQFECP)

                  VALUES
                     (V_CDFILIAL, V_NRLANCTONF,   LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0'), C_ALIQITEM.CDIMPOSTO, (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM),
                      0, C_ITEMPRODUTO.VRTOTAITEM, C_ALIQITEM.VRALIQUOTA, 0, 0,
                      C_ALIQITEM.CDFISCTEMP, '1', 'N',
                      0, '0', 0, C_ALIQITEM.VRADICALIQFECP);
               ELSE
                  FOR C_TRABITPROIMPOS IN(SELECT IT.CDFILIAL, IT.NRLANCTONF, IT.NRSEQIMPOIT, IT.CDIMPOSTOIT,
                                                 B.SGIMPOSTO, B.IDTRATIMPO, B.IDPREIMPENTR, B.IDCONSISTENT,
                                                 IT.VRCONTITIMP, IT.VRPERREDBCIT, IT.VRBASECALCIT, IT.VRALIQITEM,
                                                 IT.VRIMPOSTOIT, IT.CDFISCALIT, IT.CDSITUTRIBIT, IT.CDFISCOPERIT,
                                                 IT.NRITPROIMPOS, IT.IDMODBCITNFE, IT.IDMODBCSTITNFE,
                                                 NVL(IT.VRADICALIQFECP, 0) AS VRADICALIQFECP,
                                                 NVL(IT.VRADICFECP, 0) AS VRADICFECP
                                            FROM INTG_TRABITPROIMPOS IT, IMPOSTO B
                                           WHERE NRACESSONFE    = P_NRACESSONFE
                                             AND B.CDIMPOSTO    = IT.CDIMPOSTOIT
                                             AND IT.NRSEQIMPOIT = C_ITEMPRODUTO.NRSEQITPROD
                                             AND IT.CDIMPOSTOIT = C_ALIQITEM.CDIMPOSTO
                                             AND B.CDENCARGOIMPXML IS NULL
                                           ORDER BY IT.CDFILIAL, IT.NRLANCTONF, IT.NRSEQIMPOIT, IT.CDIMPOSTOIT) LOOP


                     IF(C_TRABITPROIMPOS.VRIMPOSTOIT > 0) THEN
                        V_CDFISCALIT := '1';
                     ELSE
                        V_CDFISCALIT := '2';
                     END IF;

                     IF (LENGTH(C_TRABITPROIMPOS.CDSITUTRIBIT) = 2) THEN
                        V_CODIGOCST := C_TRABITPROIMPOS.CDSITUTRIBIT;
                     ELSE
                        IF (LENGTH(C_TRABITPROIMPOS.CDSITUTRIBIT) > 2) THEN
                           V_CODIGOCST := SUBSTR(C_TRABITPROIMPOS.CDSITUTRIBIT, 2,2);
                        END IF;
                     END IF;

                     V_CFOPXML := SUBSTR(C_ITEMPRODUTO.CDFISOPEITEM, 2, 3);

                     INSERT INTO TRABITPROIMPOS
                        (CDFILIMPOIT, NRLANCIMPOIT, NRSEQIMPOIT, CDIMPOSTOIT, VRCONTIMPOIT,
                         VRREDBCIMPOIT, VRBCALCIMPOIT, VRALIQIMPOIT, VRPDEDIMPOIT, VRIMPOSIT,
                         CDFISCIMPOIT,  CDSTRIBIMPOIT, CDFOPERIMPOIT, NRSEQITPRO, IDVALORINFO,
                         VR1REDBCIMPOIT, IDTRIMPSTTI, VRIMPOSVISUIT, CDSTRIBITNFE, VRADICALIQFECP, VRADICFECP)
                     VALUES
                        (V_CDFILIAL, V_NRLANCTONF, LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0'), C_TRABITPROIMPOS.CDIMPOSTOIT, (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM),
                         NVL(C_TRABITPROIMPOS.VRPERREDBCIT,  0), NVL(C_TRABITPROIMPOS.VRBASECALCIT, 0), C_TRABITPROIMPOS.VRALIQITEM, 0, C_TRABITPROIMPOS.VRIMPOSTOIT,
                         V_CDFISCALIT, V_DIG1CST||V_CODIGOCST, V_CFOP1DIGT||V_CFOPXML, C_TRABITPROIMPOS.NRITPROIMPOS, 'S',
                          0, '0', C_TRABITPROIMPOS.VRIMPOSTOIT, V_CODIGOCST, C_TRABITPROIMPOS.VRADICALIQFECP, C_TRABITPROIMPOS.VRADICFECP);

                  END LOOP;
               END IF;
            END LOOP;
            /* Caso algum imposto esteja marcado para que seja gerado como encarego */
            FOR C_TRABITPROIMPOS IN(SELECT IT.CDFILIAL, IT.NRLANCTONF, IT.NRSEQIMPOIT, IT.CDIMPOSTOIT,
                                           B.SGIMPOSTO, B.IDTRATIMPO, B.IDPREIMPENTR, B.IDCONSISTENT,
                                           IT.VRCONTITIMP, IT.VRPERREDBCIT, IT.VRBASECALCIT, IT.VRALIQITEM,
                                           IT.VRIMPOSTOIT, IT.CDFISCALIT, IT.CDSITUTRIBIT, IT.CDFISCOPERIT,
                                           IT.NRITPROIMPOS, IT.IDMODBCITNFE, IT.IDMODBCSTITNFE, B.CDENCARGOIMPXML,
                                           NVL(IT.VRADICALIQFECP, 0) AS VRADICALIQFECP,
                                           NVL(IT.VRADICFECP, 0) AS VRADICFECP
                                      FROM INTG_TRABITPROIMPOS IT, IMPOSTO B
                                     WHERE NRACESSONFE    = P_NRACESSONFE
                                       AND B.CDIMPOSTO    = IT.CDIMPOSTOIT
                                       AND IT.NRSEQIMPOIT = C_ITEMPRODUTO.NRSEQITPROD
                                       AND B.CDENCARGOIMPXML IS NOT NULL
                                     ORDER BY IT.CDFILIAL, IT.NRLANCTONF, IT.NRSEQIMPOIT, IT.CDIMPOSTOIT) LOOP


               UPDATE ITEMENCARGO
                  SET VRITEMENCA = VRITEMENCA + C_TRABITPROIMPOS.VRIMPOSTOIT + C_TRABITPROIMPOS.VRADICFECP
                WHERE CDENCARGO  = C_TRABITPROIMPOS.CDENCARGOIMPXML
                  AND CDFILIAL   = V_CDFILIAL
                  AND NRLANCTONF = V_NRLANCTONF;

               UPDATE ITEMPRODUTO
                  SET VRENCARGOIMPXML  = VRENCARGOIMPXML + C_TRABITPROIMPOS.VRIMPOSTOIT + C_TRABITPROIMPOS.VRADICFECP
                WHERE NRSEQITPROD = LPAD(C_ITEMPRODUTO.NRSEQITPROD, 4, '0')
                  AND CDFILIAL    = V_CDFILIAL
                  AND NRLANCTONF  = V_NRLANCTONF;


            END LOOP;
            /* Caso algum imposto esteja marcado para que seja gerado como encarego */

            DELETE
              FROM ALIQTEMPPROD
             WHERE NRALIQTEMP = V_CDFILIAL||V_NRLANCTONF;

            DELETE
              FROM INCITEMP
             WHERE NRINCITEMP = V_CDFILIAL||V_NRLANCTONF;
         END IF;

      END LOOP;

      /*  Baixar todos os itens da AF caso o parâmetro “Baixa total da AF no Lançamento da Nota Fiscal” esteja marcado*/
      BEGIN
         SELECT NVL(IDBAIXAFTOTLANNF, 'N') AS IDBAIXAFTOTLANNF
           INTO V_IDBAIXAFTOTLANNF
           FROM PARAMGERAL
          WHERE CDPARGERAL = '0001';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDBAIXAFTOTLANNF:= 'N';
      END;

      IF (V_IDBAIXAFTOTLANNF = 'S') THEN
         FOR C_ITEMPRODUTO IN (SELECT DISTINCT LPAD(I.NRAUTOFORN, 10, '0') AS NRAUTOFORN,
                                               CDFILLANC, CDFILDEST
                                 FROM INTG_ITEMPRODUTO I, AUTOFORNE A
                                WHERE I.NRACESSONFE = P_NRACESSONFE
                                  AND LPAD(I.NRAUTOFORN, 10, '0') = A.NRAUTOFORN) LOOP

           UPDATE ITEMAUTF
              SET IDBAIXITMAF = '2',
                  QTEFETENTRAF = QTPROGENTAF
            WHERE CDFILDEST   = C_ITEMPRODUTO.CDFILDEST   AND
                  CDFILLANC   = C_ITEMPRODUTO.CDFILLANC   AND
                  NRAUTOFORN  = C_ITEMPRODUTO.NRAUTOFORN;

           UPDATE AUTOFORNE
              SET IDBAIXAAF = '2'
            WHERE CDFILDEST   = C_ITEMPRODUTO.CDFILDEST   AND
                  CDFILLANC   = C_ITEMPRODUTO.CDFILLANC   AND
                  NRAUTOFORN  = C_ITEMPRODUTO.NRAUTOFORN;

         END LOOP;
      END IF;


      IF (P_GERAIGUALXML = 'S') THEN
         FOR C_CONTAPAGAR IN(SELECT CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                                    CDTPCTPAGAR, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG
                               FROM INTG_CONTAPAGAR
                              WHERE NRACESSONFE = P_NRACESSONFE)LOOP

            INSERT INTO CONTAPAGAR
               (CDFILIAL,    NRLANCTONF,   NRSEQVENPAG,  NRPARCELAPAG,
                CDTPCTPAGAR, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, VRATUAPAG, DTATUAVENPAG)
            VALUES
               (V_CDFILIAL, V_NRLANCTONF, LPAD(C_CONTAPAGAR.NRSEQVENPAG, 2, '0'), C_CONTAPAGAR.NRPARCELAPAG,
                C_CONTAPAGAR.CDTPCTPAGAR, (C_CONTAPAGAR.DTORIGVENPAG - SYSDATE), C_CONTAPAGAR.DTORIGVENPAG,
                C_CONTAPAGAR.VRORIGPAG, C_CONTAPAGAR.VRORIGPAG, C_CONTAPAGAR.DTORIGVENPAG);
         END LOOP;
      ELSE
         BEGIN
            SELECT NVL(IMPVENCXML, 'N')
              INTO V_IMPVENCXML
              FROM PARAMFORNE
             WHERE CDFORNECED = V_CDFORNECED;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IMPVENCXML := 'N';
         END;

         IF (V_IMPVENCXML = 'S') THEN
            FOR C_CONTAPAGAR IN(SELECT CDFILIAL, NRLANCTONF, NRSEQVENPAG, NRPARCELAPAG,
                                       CDTPCTPAGAR, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG
                                  FROM INTG_CONTAPAGAR
                                 WHERE NRACESSONFE = P_NRACESSONFE)LOOP
               INSERT INTO CONTAPAGAR
                  (CDFILIAL,    NRLANCTONF,   NRSEQVENPAG,  NRPARCELAPAG,
                   CDTPCTPAGAR, QTDIASVENPAG, DTORIGVENPAG, VRORIGPAG, VRATUAPAG, DTATUAVENPAG)
               VALUES
                  (V_CDFILIAL, V_NRLANCTONF, LPAD(C_CONTAPAGAR.NRSEQVENPAG, 2, '0'), C_CONTAPAGAR.NRPARCELAPAG,
                   C_CONTAPAGAR.CDTPCTPAGAR, (C_CONTAPAGAR.DTORIGVENPAG - SYSDATE), C_CONTAPAGAR.DTORIGVENPAG,
                   C_CONTAPAGAR.VRORIGPAG, C_CONTAPAGAR.VRORIGPAG, C_CONTAPAGAR.DTORIGVENPAG);
            END LOOP;
         END IF;
      END IF;   

      SELECT COUNT (DISTINCT CDFISOPEITEM), MIN(CDFISOPEITEM)
        INTO V_QTDCFOP, V_CDCFOPNF
        FROM ITEMPRODUTO
       WHERE CDFILIAL   = V_CDFILIAL
         AND NRLANCTONF = V_NRLANCTONF;

      IF (V_QTDCFOP > 1) THEN
         UPDATE NOTAFISCAL
            SET CDFISOPENTF  = '***'
          WHERE CDFILIAL     = V_CDFILIAL
            AND NRLANCTONF   = V_NRLANCTONF;

         UPDATE NOTAFISCAL
            SET DSCDFISOPENF = SUBSTR(DESCRICAO_CFOP(V_CDCFOPNF),1,45)
          WHERE (CDFILIAL    = V_CDFILIAL)
            AND (NRLANCTONF  = V_NRLANCTONF)
            AND DSCDFISOPENF IS NULL;

      ELSIF (V_QTDCFOP = 1) THEN
         UPDATE NOTAFISCAL
            SET CDFISOPENTF  = V_CDCFOPNF
          WHERE (CDFILIAL    = V_CDFILIAL)
            AND (NRLANCTONF  = V_NRLANCTONF);

         UPDATE NOTAFISCAL
            SET DSCDFISOPENF = SUBSTR(DESCRICAO_CFOP(V_CDCFOPNF),1,45)
          WHERE (CDFILIAL    = V_CDFILIAL)
            AND (NRLANCTONF  = V_NRLANCTONF)
            AND DSCDFISOPENF IS NULL;
      END IF;

      FOR C_TRABIMPOSNFTOT IN (SELECT SUM(T.VRIMPOSIT) VRTOTAIMPO, T.CDIMPOSTOIT
                                 FROM TRABITPROIMPOS T, IMPOSTO I
                                WHERE CDFILIMPOIT  = V_CDFILIAL
                                  AND NRLANCIMPOIT = V_NRLANCTONF
                                  AND IDPRODNOTA <> 'C'
                                  AND T.CDIMPOSTOIT = I.CDIMPOSTO
                                GROUP BY CDIMPOSTOIT
                                ORDER BY CDIMPOSTOIT)LOOP

          INSERT INTO TRABIMPOSNFTOT
                     (CDFILIMPTOT, NRLANCIMPTOT, CDIMPOSTOT, VRIMPOSTOT, VRBCALIMPTOT)

               VALUES(V_CDFILIAL, V_NRLANCTONF, C_TRABIMPOSNFTOT.CDIMPOSTOIT, (0 + C_TRABIMPOSNFTOT.VRTOTAIMPO), 0);
      END LOOP;

      GERA_FECHAMENTO_NFENTRADA(V_CDFILIAL, V_NRLANCTONF, V_DTENTRSAID, V_NRLANCESTQ, V_CDOPERADOR);

      UPDATE ITLANCTOEST
         SET IDEVOLESTOQ  = 'N'
       WHERE CDFILIAL     = V_CDFILIAL
         AND NRLANCESTQ   = V_NRLANCESTQ;

      VERIFICA_INCONS_NF(P_NRACESSONFE, P_GERAIGUALXML, 'S', V_NRLANCTONF, V_CDFILIAL, P_LIBERAXML, P_CDTIPOOPER, V_ERRO);

      IF (V_ERRO = 'S') THEN
         V_ROLLBACK := 'S';

         OPEN C_INCONS;
         LOOP
         BEGIN
            FETCH C_INCONS INTO C_NRSEQINCONS,
                                C_CDCONSISTXML,
                                C_DSINCONSIS;

            IF V_ROLLBACK = 'S' THEN
               ROLLBACK;
               V_ROLLBACK := 'N';
            END IF;

            EXIT WHEN C_INCONS%NOTFOUND;
               INSERT
                 INTO INTG_INCONSISTENCIA (NRACESSONFE, NRSEQINCONS, CDCONSISTXML, DSINCONSIS)
               VALUES (P_NRACESSONFE, C_NRSEQINCONS, C_CDCONSISTXML, C_DSINCONSIS);

               UPDATE INTG_NOTAFISCAL
                  SET IDSTATUS = 'I'
                WHERE NRACESSONFE = P_NRACESSONFE;
         EXCEPTION
            WHEN OTHERS THEN
            IF (V_ROLLBACK = 'N') THEN
               COMMIT;
            END IF;
         END;

         END LOOP;

         CLOSE C_INCONS;
      ELSE
         V_COUNTINCONS := 0;
         BEGIN
            SELECT COUNT(1)
              INTO V_COUNTINCONS
              FROM INTG_INCONSISTENCIA
             WHERE NRACESSONFE = P_NRACESSONFE;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNTINCONS := 0;
         END;
         IF (V_COUNTINCONS > 0) THEN
            UPDATE INTG_NOTAFISCAL
               SET CDFILIAL     = V_CDFILIAL,
                   NRLANCTONF   = V_NRLANCTONF,
                   DTUTILIZAXML = SYSDATE,
                   IDIMPORTADA  = 'S',
                   IDSTATUSNFE  = 'U',
                   IDSTATUS     = 'I'
             WHERE NRACESSONFE  = P_NRACESSONFE;
         ELSE
            UPDATE INTG_NOTAFISCAL
               SET CDFILIAL     = V_CDFILIAL,
                   NRLANCTONF   = V_NRLANCTONF,
                   DTUTILIZAXML = SYSDATE,
                   IDIMPORTADA  = 'S',
                   IDSTATUSNFE  = 'U',
                   IDSTATUS     = 'L'
             WHERE NRACESSONFE  = P_NRACESSONFE;

             UPDATE NOTAFISCAL
               SET IDSTATUS = 'L'
             WHERE NRACESSONFE = P_NRACESSONFE
               AND IDENTRSAIDOP = 'E';
         END IF;
      END IF;
   ELSE
      UPDATE INTG_NOTAFISCAL
         SET IDSTATUS = 'I'
       WHERE NRACESSONFE = P_NRACESSONFE;
   END IF;
   COMMIT;
END;
/

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_QTESTNFPEND             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_CONTADOR3               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_IDDESCONSILIMCALCMP   PARASUPRI.IDDESCONSILIMCALCMP%TYPE;
    V_QTSOLIPROD              FLOAT;
    V_QTPROGENTAF             FLOAT;
    V_NRSEQCMPGER             VARCHAR2(10);
    V_NFSTATUSLI              FLOAT;
    
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;
    V_CONTADOR3 := 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(IDDESCONSILIMCALCMP), 'N')
            INTO V_IDCSSOLAFFORAPERICMP, V_IDCONSANTECPENDNECC, V_IDDESCONSILIMCALCMP
            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;

          V_CONTADOR3 := V_CONTADOR3 + 1;
          IF V_CONTADOR3 = 1 THEN
             SELECT COUNT(*)
               INTO V_NFSTATUSLI
               FROM NOTAFISCAL
              WHERE CDFILIRECE = V_FILIAL_CORRENTE
                AND IDSTATUS   IN ('L', 'I')
                AND DTENTRSAID BETWEEN V_DTPROCESS - 30 AND P_DTFINAL;
          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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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..NVL(V_CONTROLE, 0)
                           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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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 CASE
                                                                 WHEN V_IDSISDOS = W_3
                                                                 THEN V_DTMAXENTREGA_ADD1
                                                                 ELSE V_DTENTREGA
                                                              END AND CASE
                                                                         WHEN V_IDSISDOS = W_3
                                                                         THEN V_DTENTREGA
                                                                         ELSE V_DTANTPROXENT_1
                                                                      END
                             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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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 CASE
                                                                    WHEN V_IDSISDOS = W_3
                                                                    THEN V_DTMAXENTREGA_ADD1
                                                                    ELSE V_DTENTREGA
                                                                 END AND CASE
                                                                            WHEN V_IDSISDOS = W_3
                                                                            THEN V_DTENTREGA
                                                                            ELSE V_DTANTPROXENT_1
                                                                         END
                                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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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, IDPREVIACONSAF, NRSEQCMPGER)
                              SELECT ITEMAUTF.CDFILDEST, P_NRNECECOMP, NVL(V_CODPRODUTOPREF, PRODUTO.CDPRODESTO), ITEMAUTF.DTPROGENTAF,
                                     NVL(SUM((QTPROGENTAF - NVL(QTEFETENTRAF,0)) * PRODUTO.VRFATOCONV), 0), V_IDCONSAFNECCMP, MAX(AUTOFORNE.NRAUTOFORN)
                                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 CASE
                                                                             WHEN V_IDSISDOS = W_3
                                                                             THEN V_DTMAXENTREGA_ADD1
                                                                             ELSE V_DTENTREGA
                                                                          END
                                                                  END AND CASE
                                                                             WHEN V_IDSISDOS = W_3
                                                                             THEN V_DTENTREGA
                                                                             ELSE V_DTANTPROXENT_1
                                                                          END
                                 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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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 CASE
                                                                  WHEN V_IDSISDOS = W_3
                                                                  THEN V_DTMAXENTREGA_ADD1
                                                                  ELSE V_DTENTREGA
                                                               END AND CASE
                                                                          WHEN V_IDSISDOS = W_3
                                                                          THEN V_DTENTREGA
                                                                          ELSE V_DTANTPROXENT_1
                                                                       END
                              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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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 CASE
                                                                     WHEN V_IDSISDOS = W_3
                                                                     THEN V_DTMAXENTREGA_ADD1
                                                                     ELSE V_DTENTREGA
                                                                  END AND CASE
                                                                             WHEN V_IDSISDOS = W_3
                                                                             THEN V_DTENTREGA
                                                                             ELSE V_DTANTPROXENT_1
                                                                          END
                             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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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 CASE
                                                              WHEN V_IDSISDOS = W_3
                                                              THEN V_DTMAXENTREGA_ADD1
                                                              ELSE V_DTENTREGA
                                                           END AND CASE
                                                                      WHEN V_IDSISDOS = W_3
                                                                      THEN V_DTENTREGA
                                                                      ELSE V_DTANTPROXENT_1
                                                                   END
                           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 CASE
                                                            WHEN V_IDSISDOS = W_3
                                                            THEN V_DTMAXENTREGA_ADD1
                                                            ELSE V_DTENTREGA
                                                         END AND CASE
                                                                    WHEN V_IDSISDOS = W_3
                                                                    THEN V_DTENTREGA
                                                                    ELSE V_DTANTPROXENT_1
                                                                 END
                        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 CASE
                                                                WHEN V_IDSISDOS = W_3
                                                                THEN V_DTMAXENTREGA_ADD1
                                                                ELSE V_DTENTREGA
                                                             END AND CASE
                                                                        WHEN V_IDSISDOS = W_3
                                                                        THEN V_DTENTREGA
                                                                        ELSE V_DTANTPROXENT_1
                                                                     END;

                     /*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 CASE
                                                           WHEN V_IDSISDOS = W_3
                                                           THEN V_DTMAXENTREGA_ADD1
                                                           ELSE V_DTENTREGA
                                                        END AND CASE
                                                                   WHEN V_IDSISDOS = W_3
                                                                   THEN V_DTENTREGA
                                                                   ELSE V_DTANTPROXENT_1
                                                                END
                        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 CASE
                                                                  WHEN V_IDSISDOS = W_3
                                                                  THEN V_DTMAXENTREGA_ADD1
                                                                  ELSE V_DTENTREGA
                                                               END AND CASE
                                                                          WHEN V_IDSISDOS = W_3
                                                                          THEN V_DTENTREGA
                                                                          ELSE V_DTANTPROXENT_1
                                                                       END
                              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 CASE
                                                                         WHEN V_IDSISDOS = W_3
                                                                         THEN V_DTMAXENTREGA_ADD1
                                                                         ELSE V_DTENTREGA
                                                                      END AND CASE
                                                                                 WHEN V_IDSISDOS = W_3
                                                                                 THEN V_DTENTREGA
                                                                                 ELSE V_DTANTPROXENT_1
                                                                              END;
                           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 CASE
                                                                 WHEN V_IDSISDOS = W_3
                                                                 THEN V_DTMAXENTREGA_ADD1
                                                                 ELSE V_DTENTREGA
                                                              END AND CASE
                                                                         WHEN V_IDSISDOS = W_3
                                                                         THEN V_DTENTREGA
                                                                         ELSE V_DTANTPROXENT_1
                                                                      END
                              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_QTESTNFPEND := 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 CASE
                                                                            WHEN V_IDSISDOS = W_3
                                                                            THEN V_DTMAXENTREGA_ADD1
                                                                            ELSE V_DTENTREGA
                                                                         END AND CASE
                                                                                    WHEN V_IDSISDOS = W_3
                                                                                    THEN V_DTENTREGA
                                                                                    ELSE V_DTANTPROXENT_1
                                                                                 END
                                               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_IDDESCONSILIMCALCMP = '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_IDDESCONSILIMCALCMP = '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;

                             IF V_NFSTATUSLI > 0 THEN
                                /* Notas Fiscais pendentes - Liberada e Inconsistente */
                                SELECT NVL(SUM(ITEMPRODUTO.QTITEMPROD * PRODUTO.VRFATOCONV), 0)
                                  INTO V_QTESTNFPEND
                                  FROM ITEMAUTF, AUTOFORNE, NFRELACAF, PRODUTO, NOTAFISCAL, ITEMPRODUTO
                                 WHERE 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
                                   AND NOTAFISCAL.NRLANCTONF = NFRELACAF.NRLANCTONF
                                   AND NOTAFISCAL.CDFILIAL   = NFRELACAF.CDFILIAL
                                   AND NOTAFISCAL.NRLANCTONF = ITEMPRODUTO.NRLANCTONF
                                   AND NOTAFISCAL.CDFILIAL   = ITEMPRODUTO.CDFILIAL
                                   AND PRODUTO.CDARVPROD     = ITEMPRODUTO.CDPRODUTO
                                   AND ITEMAUTF.CDFILDEST    = AUTOFORNE.CDFILDEST
                                   AND ITEMAUTF.CDFILLANC    = AUTOFORNE.CDFILLANC
                                   AND ITEMAUTF.NRAUTOFORN   = AUTOFORNE.NRAUTOFORN
                                   AND NVL(AUTOFORNE.IDBAIXAAF, W_0) IN (W_1, W_2)
                                   AND NOTAFISCAL.IDSTATUS   IN ('L', 'I')
                                   AND PRODUTO.CDPRODESTO    = V_CODPRODUTO
                                   AND NFRELACAF.CDFILDEST   = V_FILIAL_CORRENTE
                                   AND NOTAFISCAL.DTENTRSAID BETWEEN V_DTPROCESS - 30 AND P_DTFINAL;
                             END IF;
                          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;
                     IF V_IDSISDOS = W_3 THEN
                        IF V_QTESTOQUENECCMP < 0 THEN
                          V_QTESTOQUENECCMP:= 0;
                        END IF;
                     ELSE
                        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;
                     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_IDSISDOS = W_3 THEN
                           V_QTESTOQUENECCMP:= V_QTESTOQUENECCMP + V_QTJASOLICITADA;
                        ELSE
                           IF V_UTILIZOU_JASOLI = 'N' THEN
                              V_QTESTOQUENECCMP:= V_QTESTOQUENECCMP + V_QTJASOLICITADA;
                           END IF;
                        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, QTESTNFPEND,
                            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_QTESTNFPEND,
                            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;
/

DROP FUNCTION CURVA_ABC_PROD_FORN_CMP
/

DROP FUNCTION CURVA_ABC_AF_NF_CMP
/

DROP TYPE CURVA_ABC_PROD_FORN_CMP_TABLE
/

DROP TYPE CURVA_ABC_PROD_FORN_CMP_TYPE
/

CREATE TYPE CURVA_ABC_PROD_FORN_CMP_TYPE AS
OBJECT(LISTA_REGIAO     VARCHAR2(1000),
       CDREGIAO         VARCHAR2(3),
       NMREGIAO         VARCHAR2(30),
       LISTA_FILIAL     VARCHAR2(1000),
       CDFILIAL         VARCHAR2(4),
       NMFILIAL         VARCHAR2(30),
       LISTA_GRUPFILI   VARCHAR2(1000),
       CDPRODUTO        VARCHAR2(10),
       CDARVPROD        VARCHAR2(20),
       NMPRODUTO        VARCHAR2(50),
       SGUNIDADE        VARCHAR2(10),
       DTENTRINI        DATE,
       DTENTRFIN        DATE,
       DTGERAINI        DATE,
       DTGERAFIN        DATE,
       CDPRODINICIAL    VARCHAR2(20),
       NMDPRODINICIAL   VARCHAR2(50),
       CDPRODFINAL      VARCHAR2(20),
       NMPRODFINAL      VARCHAR2(50),
       CDOPERADOR       VARCHAR2(12),
       NMOPERADOR       VARCHAR2(40),
       CDFORNECED       VARCHAR2(21),
       NRINSJURFORN     VARCHAR2(20),
       IDTPIJURFORN     VARCHAR2(1),
       NMRAZSOCFORN     VARCHAR2(100),
       NMFANTFORN       VARCHAR2(40),
       CDGRUPPROD       VARCHAR2(10),
       NMGRUPPROD       VARCHAR2(40),
       TIPOCURVA        VARCHAR2(1),
       CDOPERGESTOR     VARCHAR2(12),
       NMOPERGESTOR     VARCHAR2(40),
       EXIBE_PROD       VARCHAR2(1),
       RELATORIO        VARCHAR2(1),

       QTTOT            FLOAT,
       VRMED            FLOAT,
       VRTOT            FLOAT,
       VRPERCENTG       FLOAT,
       VRPECURVA        FLOAT,
       VRTOTCURVA       FLOAT,
       VRTOTG           FLOAT,
       VRTOTPROD        FLOAT,
       VRCUSTO          FLOAT)
/

CREATE TYPE CURVA_ABC_PROD_FORN_CMP_TABLE AS TABLE OF CURVA_ABC_PROD_FORN_CMP_TYPE
/

CREATE OR REPLACE FUNCTION CURVA_ABC_AF_NF_CMP (P_RELATORIO       IN VARCHAR2,
                                                P_DADO            IN VARCHAR2,
                                                P_CDGRUPFILI      IN VARCHAR2,
                                                P_TCDGRUPFILI     IN VARCHAR2,
                                                P_EXIBE_GRUPFILI  IN VARCHAR2,
                                                P_CDREGIAO        IN VARCHAR2,
                                                P_TCDREGIAO       IN VARCHAR2,
                                                P_EXIBE_REGIAO    IN VARCHAR2,
                                                P_CDFILIAL        IN VARCHAR2,
                                                P_TCDFILIAL       IN VARCHAR2,
                                                P_EXIBE_FILIAL    IN VARCHAR2,
                                                P_DTENTRINI       IN DATE,
                                                P_DTENTRFIN       IN DATE,
                                                P_TDTENTREGA      IN VARCHAR2,
                                                P_DTGERAINI       IN DATE,
                                                P_DTGERAFIN       IN DATE,
                                                P_TDTGERACAO      IN VARCHAR2,
                                                P_CDNVPRODUTO     IN VARCHAR2,
                                                P_SUBGRUPO        IN VARCHAR2,
                                                P_TSUBGRUPO       IN VARCHAR2,
                                                P_CDFORNECED      IN VARCHAR2,
                                                P_TCDFORNECED     IN VARCHAR2,

                                                P_CDOPERADOR      IN VARCHAR2,
                                                P_TCDOPERADOR     IN VARCHAR2,

                                                P_CDPRODINI       IN VARCHAR2,
                                                P_CDPRODFIN       IN VARCHAR2,
                                                P_IDBAIXAAF       IN VARCHAR2,
                                                P_TIDBAIXAAF      IN VARCHAR2,
                                                P_IDAFEXPIRADA    IN VARCHAR2,
                                                P_TIDAFEXPIRADA   IN VARCHAR2,
                                                P_CONSISTE_BAIXA  IN VARCHAR2,
                                                P_VALOR_EFETIVADO IN VARCHAR2,
                                                P_IDFILIATIVA     IN VARCHAR2,
                                                P_TIDFILIATIVA    IN VARCHAR2,
                                                P_FILIAL_LOGADA   IN VARCHAR2,
                                                P_EXIBE_PROD      IN VARCHAR2,
                                                P_CUSTO           IN VARCHAR2,
                                                P_OPERADORLOG     IN VARCHAR2)
 RETURN CURVA_ABC_PROD_FORN_CMP_TABLE PIPELINED
IS
  V_CDGRUPPROD   VARCHAR2(10);
  V_CDNVPRODUTO  NUMERIC;
  TYPE CURTYPE   IS REF CURSOR;
  C_BASE         CURTYPE;

  V_CDFILDEST    ITEMAUTF.CDFILDEST%TYPE;
  V_NMFILIAL     FILIAL.NMFILIAL%TYPE;
  V_CDREGIAO     FILIAL.CDREGIAO%TYPE;
  V_NMREGIAO     REGIAO.NMREGIAO%TYPE;
  V_CDARVPROD    PRODUTO.CDARVPROD%TYPE;
  V_SGUNIDADE    PRODUTO.SGUNIDADE%TYPE;
  V_NMPRODUTO    PRODUTO.NMPRODUTO%TYPE;
  V_IDTPIJURFORN FORNECEDOR.IDTPIJURFORN%TYPE;
  V_NRINSJURFORN FORNECEDOR.NRINSJURFORN%TYPE;
  V_NMRAZSOCFORN FORNECEDOR.NMRAZSOCFORN%TYPE;
  V_CDOPERGESTOR OPERADOR.CDOPERADOR%TYPE;
  V_NMOPERGESTOR OPERADOR.NMOPERADOR%TYPE;
  V_QTTOT        FLOAT;
  V_VRMED        FLOAT;
  V_VRTOT        FLOAT;
  V_RELATORIO    VARCHAR2(1) := P_RELATORIO;
  V_DTENTRSAID   DATE;
  V_CDPRODESTO   PRODUTO.CDPRODESTO%TYPE;
  V_VRFATOCONV   PRODUTO.VRFATOCONV%TYPE;
  V_NRLANCTONF   ITEMPRODUTO.NRLANCTONF%TYPE;
  V_NRSEQITPROD  ITEMPRODUTO.NRSEQITPROD%TYPE;
  V_IDRESTRFILIOPER VARCHAR2(1);
  V_LISTA_FILIAL    VARCHAR2(1000);
  V_LISTA_REGIAO    VARCHAR2(1000);
  V_CONTADOR        NUMERIC := 0;
  V_CONTADORTOTAL   NUMERIC;
OUT_RECORD CURVA_ABC_PROD_FORN_CMP_TYPE := CURVA_ABC_PROD_FORN_CMP_TYPE (NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL,0, 0, 0, 0,
                                                                         0, 0, 0, 0, 0);
BEGIN

   SELECT NVL(MAX(CDGRUPPROD), '0')
     INTO V_CDGRUPPROD
     FROM PARASUPRI, FILIAL
    WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
      AND FILIAL.CDFILIAL    = P_FILIAL_LOGADA;
   SELECT LENGTH(MAX(CDARVPROD))
     INTO V_CDNVPRODUTO
     FROM PRODUTO
    WHERE CDNVPRODUTO = P_CDNVPRODUTO;
   IF P_EXIBE_PROD = 'S' THEN
      V_RELATORIO := 'P';
   END IF;
   SELECT NVL(MAX(IDRESTRFILIOPER), 'N')
     INTO V_IDRESTRFILIOPER
     FROM PARAMGERAL;
   IF P_DADO = 'A' THEN
      IF P_VALOR_EFETIVADO = 'N' THEN
         OPEN C_BASE FOR
            SELECT ITEMAUTF.CDFILDEST, FIL.NMFILIAL,
                   FIL.CDREGIAO, FIL.NMREGIAO,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO)
                      ELSE ''
                   END AS CDARVPROD,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), PRODUTO.SGUNIDADE, PRODESTO.SGUNIDADE)
                      ELSE ''
                   END AS SGUNIDADE,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.IDTPIJURFORN
                      ELSE ''
                   END IDTPIJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NRINSJURFORN
                      ELSE ''
                   END NRINSJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NMRAZSOCFORN
                      ELSE ''
                   END NMRAZSOCFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.CDOPERGESTOR
                      ELSE ''
                   END CDOPERGESTOR ,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN OPERADOR.NMOPERADOR
                      ELSE ''
                   END NMOPERGESTOR,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMAUTF.QTPROGENTAF, ITEMAUTF.QTPROGENTAF * PRODUTO.VRFATOCONV) AS QTTOT,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMAUTF.VRPREUNIAF, ITEMAUTF.VRPREUNIAF/PRODUTO.VRFATOCONV)  AS VRMED,
                   ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF AS VRTOT,
                   ITEMAUTF.DTPROGENTAF DTENTRSAID, ITEMAUTF.NRAUTOFORN NRLANCTONF, '' NRSEQITPROD,
                   COUNT(ITEMAUTF.VRPREUNIAF) OVER () CONTADORTOTAL
              FROM PRODUTO, PRODUTO PRODESTO, FORNECEDOR, OPERADOR,
                   ITEMAUTF, AUTOFORNE,
                   (SELECT FILIAL.CDFILIAL, FILIAL.NMFILIAL, FILIAL.CDREGIAO, REGIAO.NMREGIAO
                      FROM FILIAL, REGIAO
                     WHERE FILIAL.CDREGIAO = REGIAO.CDREGIAO
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0) OR (P_TCDFILIAL   = 'T'))
                       AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) <> 0) OR (P_TCDREGIAO  = 'T'))
                       AND ((FILIAL.IDCNTRRESC                  = P_IDFILIATIVA) OR (P_TIDFILIATIVA  = 'T'))
                       AND ((V_IDRESTRFILIOPER = 'N') OR EXISTS (SELECT 1
				                                                     		        FROM FILIOPER
				                                                     		       WHERE FILIOPER.CDFILIAL = FILIAL.CDFILIAL
				                                                     		         AND FILIOPER.CDOPERADOR = P_OPERADORLOG))
                       AND ((P_TCDGRUPFILI = 'T') OR
                            EXISTS (SELECT 1
                                      FROM FILGRUPFILI
                                     WHERE FILGRUPFILI.CDFILIAL = FILIAL.CDFILIAL
                                      AND (FILGRUPFILI.CDGRUPFILI                     = P_CDGRUPFILI)))) FIL
             WHERE (FIL.CDFILIAL = ITEMAUTF.CDFILDEST)
               AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
               AND ((AUTOFORNE.DTAUTOFORN BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
               AND ((ITEMAUTF.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTREGA = 'T'))
               AND AUTOFORNE.CDFORNECED = FORNECEDOR.CDFORNECED
               AND FORNECEDOR.CDOPERGESTOR = OPERADOR.CDOPERADOR(+)
               AND ((INSTR(P_CDFORNECED, AUTOFORNE.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
               AND ((INSTR(P_CDOPERADOR, AUTOFORNE.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
               AND (ITEMAUTF.CDFILDEST                        = AUTOFORNE.CDFILDEST)
               AND (ITEMAUTF.CDFILLANC                        = AUTOFORNE.CDFILLANC)
               AND (ITEMAUTF.NRAUTOFORN                       = AUTOFORNE.NRAUTOFORN)
               AND NVL(AUTOFORNE.IDBAIXAAF,'0')              <> '6'
               AND (ITEMAUTF.CDPRODUTO                        = PRODUTO.CDPRODUTO)
               AND (PRODUTO.CDPRODESTO                        = PRODESTO.CDPRODUTO)
               AND ((INSTR(P_IDBAIXAAF, NVL(AUTOFORNE.IDBAIXAAF, 0)) > 0) OR (P_TIDBAIXAAF  = 'T'))
               AND (AUTOFORNE.IDSITUATUAAF                   IS NULL)
               AND (NVL(AUTOFORNE.IDAFFORALIM, 'N')          = 'N')
               AND ((NVL(AUTOFORNE.IDAFEXPIRADA, 'N')         = P_IDAFEXPIRADA) OR (P_TIDAFEXPIRADA =  'T'))

               AND NVL(ITEMAUTF.IDITAFMIGRADA, 'N')||NVL(ITEMAUTF.IDBAIXITMAF, '0') <> 'S0'

               AND ((P_TSUBGRUPO = 'T') OR (EXISTS (SELECT CDGRUPPROD
                                                      FROM PRSUBGRPROD
                                                     WHERE (PRSUBGRPROD.CDGRUPPROD   = V_CDGRUPPROD)
                                                       AND ((PRSUBGRPROD.CDFILISUBGR = 'P') OR (PRSUBGRPROD.CDFILISUBGR  = ITEMAUTF.CDFILDEST))
                                                       AND (PRSUBGRPROD.CDPRODUTO    = PRODUTO.CDPRODUTO)
                                                       AND (INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) <> 0))))
             ORDER BY FIL.CDREGIAO, ITEMAUTF.CDFILDEST;
      ELSE
         OPEN C_BASE FOR
            SELECT ITEMAUTF.CDFILDEST, FIL.NMFILIAL, FIL.CDREGIAO, FIL.NMREGIAO,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO)
                      ELSE ''
                   END AS CDARVPROD,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), PRODUTO.SGUNIDADE, PRODESTO.SGUNIDADE)
                      ELSE ''
                   END AS SGUNIDADE,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.IDTPIJURFORN
                      ELSE ''
                   END IDTPIJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NRINSJURFORN
                      ELSE ''
                   END NRINSJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NMRAZSOCFORN
                      ELSE ''
                   END NMRAZSOCFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.CDOPERGESTOR
                      ELSE ''
                   END CDOPERGESTOR ,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN OPERADOR.NMOPERADOR
                      ELSE ''
                   END NMOPERGESTOR,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMAUTF.QTPROGENTAF, ITEMAUTF.QTPROGENTAF * PRODUTO.VRFATOCONV) AS QTTOT,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMAUTF.VRPREUNIAF, ITEMAUTF.VRPREUNIAF/PRODUTO.VRFATOCONV)  AS VRMED,
                   ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF AS VRTOT,
                   ITEMAUTF.DTPROGENTAF DTENTRSAID, ITEMAUTF.NRAUTOFORN NRLANCTONF, '' NRSEQITPROD,
                   COUNT(ITEMAUTF.VRPREUNIAF) OVER () CONTADORTOTAL
              FROM PRODUTO, PRODUTO PRODESTO, FORNECEDOR, OPERADOR,

                   (SELECT ITEMAUTF.CDFILDEST, ITEMAUTF.CDFILLANC, ITEMAUTF.NRAUTOFORN, ITEMAUTF.CDPRODUTO, ITEMAUTF.DTPROGENTAF, ITEMAUTF.IDITAFMIGRADA,
                           NVL(ITEMAUTF.QTEFETENTRAF, 0) QTPROGENTAF,
                           NVL(MAX(NFRELACAF.VRNFRELACAF), MAX(ITEMAUTF.VRPREUNIAF)) VRPREUNIAF,
                           AUTOFORNE.CDFORNECED
                      FROM ITEMAUTF, AUTOFORNE, NFRELACAF, PRODUTO, NOTAFISCAL
                     WHERE NFRELACAF.CDFILIAL      = NOTAFISCAL.CDFILIAL
                       AND NFRELACAF.NRLANCTONF    = NOTAFISCAL.NRLANCTONF
                       AND ITEMAUTF.CDFILDEST      = NFRELACAF.CDFILDEST
                       AND ITEMAUTF.CDFILLANC      = NFRELACAF.CDFILLANC
                       AND ITEMAUTF.NRAUTOFORN     = NFRELACAF.NRAUTOFORN
                       AND ITEMAUTF.CDMARCA        = NFRELACAF.CDMARCA
                       AND ITEMAUTF.CDPRODUTO      = NFRELACAF.CDPRODUTO
                       AND ITEMAUTF.DTPROGENTAF    = NFRELACAF.DTPROGENTAF
                       AND ((INSTR(P_CDFORNECED, AUTOFORNE.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
                       AND ((INSTR(P_CDOPERADOR, AUTOFORNE.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
                       AND (ITEMAUTF.CDFILDEST                        = AUTOFORNE.CDFILDEST)
                       AND (ITEMAUTF.CDFILLANC                        = AUTOFORNE.CDFILLANC)
                       AND (ITEMAUTF.NRAUTOFORN                       = AUTOFORNE.NRAUTOFORN)
                       AND ((INSTR(P_IDBAIXAAF, NVL(AUTOFORNE.IDBAIXAAF, 0)) > 0) OR (P_TIDBAIXAAF  = 'T'))
                       AND (AUTOFORNE.IDSITUATUAAF                   IS NULL)
                       AND (NVL(AUTOFORNE.IDAFFORALIM, 'N')          = 'N')
                       AND ((NVL(AUTOFORNE.IDAFEXPIRADA, 'N')         = P_IDAFEXPIRADA) OR (P_TIDAFEXPIRADA =  'T'))
                       AND ITEMAUTF.CDPRODUTO      = PRODUTO.CDPRODUTO
                       AND NOTAFISCAL.IDENTRSAIDOP = 'E'
                       AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
                       AND ((AUTOFORNE.DTAUTOFORN BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
                       AND ((INSTR(P_CDFORNECED, NOTAFISCAL.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
                       AND NVL(ITEMAUTF.IDITAFMIGRADA, 'N')||NVL(ITEMAUTF.IDBAIXITMAF, '0') <> 'S0'
                       AND NVL(ITEMAUTF.IDBAIXITMAF, 0) IN ('1', '2')
                     GROUP BY ITEMAUTF.CDFILDEST, ITEMAUTF.CDFILLANC, ITEMAUTF.NRAUTOFORN, ITEMAUTF.CDPRODUTO, ITEMAUTF.DTPROGENTAF, ITEMAUTF.IDITAFMIGRADA,
                           NVL(ITEMAUTF.QTEFETENTRAF, 0), AUTOFORNE.CDFORNECED
                     UNION ALL
                    SELECT ITEMAUTF.CDFILDEST, ITEMAUTF.CDFILLANC, ITEMAUTF.NRAUTOFORN, ITEMAUTF.CDPRODUTO, ITEMAUTF.DTPROGENTAF, ITEMAUTF.IDITAFMIGRADA,
                           NVL(ITEMAUTF.QTPROGENTAF, 0) - NVL(ITEMAUTF.QTEFETENTRAF, 0) QTPROGENTAF,
                           ITEMAUTF.VRPREUNIAF,
                           AUTOFORNE.CDFORNECED
                      FROM ITEMAUTF, AUTOFORNE, PRODUTO
                     WHERE (ITEMAUTF.CDFILDEST                        = AUTOFORNE.CDFILDEST)
                       AND (ITEMAUTF.CDFILLANC                        = AUTOFORNE.CDFILLANC)
                       AND (ITEMAUTF.NRAUTOFORN                       = AUTOFORNE.NRAUTOFORN)
                       AND ITEMAUTF.CDPRODUTO      = PRODUTO.CDPRODUTO
                       AND ((INSTR(P_CDFORNECED, AUTOFORNE.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
                       AND ((INSTR(P_CDOPERADOR, AUTOFORNE.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
                       AND NVL(AUTOFORNE.IDBAIXAAF,'0')              NOT IN ('3', '4', '5', '6')
                       AND NVL(ITEMAUTF.IDBAIXITMAF, 0) IN ('0', '1')
                       AND ((INSTR(P_IDBAIXAAF, NVL(AUTOFORNE.IDBAIXAAF, 0)) > 0) OR (P_TIDBAIXAAF  = 'T'))
                       AND (AUTOFORNE.IDSITUATUAAF                   IS NULL)
                       AND (NVL(AUTOFORNE.IDAFFORALIM, 'N')          = 'N')
                       AND (NVL(AUTOFORNE.IDAFEXPIRADA, 'N')         = 'N')
                       AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
                       AND ((AUTOFORNE.DTAUTOFORN BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
                       AND ((ITEMAUTF.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTREGA = 'T'))
                       AND NVL(ITEMAUTF.IDITAFMIGRADA, 'N')||NVL(ITEMAUTF.IDBAIXITMAF, '0') <> 'S0') ITEMAUTF,

                   (SELECT FILIAL.CDFILIAL, FILIAL.NMFILIAL, FILIAL.CDREGIAO, REGIAO.NMREGIAO
                      FROM FILIAL, REGIAO
                     WHERE FILIAL.CDREGIAO = REGIAO.CDREGIAO
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0) OR (P_TCDFILIAL   = 'T'))
                       AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) <> 0) OR (P_TCDREGIAO  = 'T'))
                       AND ((FILIAL.IDCNTRRESC                  = P_IDFILIATIVA) OR (P_TIDFILIATIVA  = 'T'))
                       AND ((V_IDRESTRFILIOPER = 'N') OR EXISTS (SELECT 1
				                                                     		        FROM FILIOPER
				                                                     		       WHERE FILIOPER.CDFILIAL = FILIAL.CDFILIAL
				                                                     		         AND FILIOPER.CDOPERADOR = P_OPERADORLOG))
                       AND ((P_TCDGRUPFILI = 'T') OR
                            EXISTS (SELECT 1
                                      FROM FILGRUPFILI
                                     WHERE FILGRUPFILI.CDFILIAL = FILIAL.CDFILIAL
                                      AND (FILGRUPFILI.CDGRUPFILI                     = P_CDGRUPFILI)))) FIL
             WHERE (FIL.CDFILIAL = ITEMAUTF.CDFILDEST)
               AND ITEMAUTF.CDFORNECED = FORNECEDOR.CDFORNECED
               AND (ITEMAUTF.CDPRODUTO                        = PRODUTO.CDPRODUTO)
               AND (PRODUTO.CDPRODESTO                        = PRODESTO.CDPRODUTO)

               AND ((P_TSUBGRUPO = 'T') OR (EXISTS (SELECT CDGRUPPROD
                                                      FROM PRSUBGRPROD
                                                     WHERE (PRSUBGRPROD.CDGRUPPROD   = V_CDGRUPPROD)
                                                       AND ((PRSUBGRPROD.CDFILISUBGR = 'P') OR (PRSUBGRPROD.CDFILISUBGR  = ITEMAUTF.CDFILDEST))
                                                       AND (PRSUBGRPROD.CDPRODUTO    = PRODUTO.CDPRODUTO)
                                                       AND (INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) <> 0))))
             ORDER BY FIL.CDREGIAO, ITEMAUTF.CDFILDEST;
      END IF;
   ELSE
      OPEN C_BASE FOR
         SELECT NOTAFISCAL.CDFILIRECE, FIL.NMFILIAL, FIL.CDREGIAO, FIL.NMREGIAO,
                CASE V_RELATORIO
                   WHEN 'P'
                   THEN SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO)
                   ELSE ''
                END AS CDARVPROD,
                CASE V_RELATORIO
                   WHEN 'P'
                   THEN DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), PRODUTO.SGUNIDADE, PRODESTO.SGUNIDADE)
                   ELSE ''
                END AS SGUNIDADE,
                CASE P_RELATORIO
                   WHEN 'F'
                   THEN FORNECEDOR.IDTPIJURFORN
                   ELSE ''
                END IDTPIJURFORN,
                CASE P_RELATORIO
                   WHEN 'F'
                   THEN FORNECEDOR.NRINSJURFORN
                   ELSE ''
                END NRINSJURFORN,
                CASE P_RELATORIO
                   WHEN 'F'
                   THEN FORNECEDOR.NMRAZSOCFORN
                   ELSE ''
                END NMRAZSOCFORN,
                CASE P_RELATORIO
                   WHEN 'F'
                   THEN FORNECEDOR.CDOPERGESTOR
                   ELSE ''
                END CDOPERGESTOR ,
                CASE P_RELATORIO
                   WHEN 'F'
                   THEN OPERADOR.NMOPERADOR
                   ELSE ''
                END NMOPERGESTOR,
                DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMPRODUTO.QTITEMPROD, ITEMPRODUTO.QTITEMPROD * CASE
                                                                                                                                           WHEN LENGTH(P_CUSTO) > 0
                                                                                                                                           THEN 1
                                                                                                                                           ELSE PRODUTO.VRFATOCONV
                                                                                                                                        END) AS QTTOT,
                DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMPRODUTO.VRUNITITEM, ITEMPRODUTO.VRUNITITEM/ CASE
                                                                                                                                           WHEN LENGTH(P_CUSTO) > 0
                                                                                                                                           THEN 1
                                                                                                                                           ELSE PRODUTO.VRFATOCONV
                                                                                                                                        END)  AS VRMED,
                (ITEMPRODUTO.QTITEMPROD * ITEMPRODUTO.VRUNITITEM) VRTOT,
                NOTAFISCAL.DTENTRSAID, ITEMPRODUTO.NRLANCTONF, ITEMPRODUTO.NRSEQITPROD,
                COUNT(ITEMPRODUTO.VRUNITITEM) OVER () CONTADORTOTAL
           FROM PRODUTO, PRODUTO PRODESTO, FORNECEDOR, OPERADOR,
                ITEMPRODUTO, NOTAFISCAL, TIPOOPERAC,
                (SELECT FILIAL.CDFILIAL, FILIAL.NMFILIAL, FILIAL.CDREGIAO, REGIAO.NMREGIAO
                   FROM FILIAL, REGIAO
                  WHERE FILIAL.CDREGIAO = REGIAO.CDREGIAO
                    AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0) OR (P_TCDFILIAL   = 'T'))
                    AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) <> 0) OR (P_TCDREGIAO  = 'T'))
                    AND ((FILIAL.IDCNTRRESC                  = P_IDFILIATIVA) OR (P_TIDFILIATIVA  = 'T'))
                    AND ((V_IDRESTRFILIOPER = 'N') OR EXISTS (SELECT 1
				                                                  		        FROM FILIOPER
				                                                  		       WHERE FILIOPER.CDFILIAL = FILIAL.CDFILIAL
				                                                  		         AND FILIOPER.CDOPERADOR = P_OPERADORLOG))
                    AND ((P_TCDGRUPFILI = 'T') OR
                         EXISTS (SELECT 1
                                   FROM FILGRUPFILI
                                  WHERE FILGRUPFILI.CDFILIAL = FILIAL.CDFILIAL
                                   AND (FILGRUPFILI.CDGRUPFILI                     = P_CDGRUPFILI)))) FIL
          WHERE (FIL.CDFILIAL = NOTAFISCAL.CDFILIRECE)
            AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
            AND ((NOTAFISCAL.DTENTRSAID BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
            AND NOTAFISCAL.CDFORNECED = FORNECEDOR.CDFORNECED
            AND FORNECEDOR.CDOPERGESTOR = OPERADOR.CDOPERADOR(+)
            AND ((INSTR(P_CDFORNECED, NOTAFISCAL.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
            --AND ((INSTR(P_CDOPERADOR, NOTAFISCAL.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
            --AND ((ITEMPRODUTO.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTREGA = 'T'))
            AND ITEMPRODUTO.CDFILIAL    = NOTAFISCAL.CDFILIAL
            AND ITEMPRODUTO.NRLANCTONF  = NOTAFISCAL.NRLANCTONF
            AND NOTAFISCAL.CDTIPOOPER   = TIPOOPERAC.CDTIPOOPER
            AND TIPOOPERAC.IDENTRSAIDOP = NOTAFISCAL.IDENTRSAIDOP
            AND NOTAFISCAL.IDENTRSAIDOP = 'E'
            AND (((TIPOOPERAC.IDGERANFCMP  = 'S') AND (P_DADO = 'N' ))
             OR (( TIPOOPERAC.IDGERANFCMP  = 'S') AND (P_DADO = 'S' ) AND (TIPOOPERAC.IDOPERDEVONF  = 'S')))
            AND (ITEMPRODUTO.CDPRODUTO  = PRODUTO.CDPRODUTO)
            AND (PRODUTO.CDPRODESTO     = PRODESTO.CDPRODUTO)
            AND NVL(NOTAFISCAL.CDFORNECED, '{')  = CASE
                                                      WHEN LENGTH(P_CUSTO) > 0
                                                      THEN NVL(NOTAFISCAL.CDFORNECED, '}')
                                                      ELSE NVL(NOTAFISCAL.CDFORNECED, '{')
                                                   END
            AND ((P_TSUBGRUPO = 'T') OR (EXISTS (SELECT CDGRUPPROD
                                                   FROM PRSUBGRPROD
                                                  WHERE (PRSUBGRPROD.CDGRUPPROD   = V_CDGRUPPROD)
                                                    AND ((PRSUBGRPROD.CDFILISUBGR = 'P') OR (PRSUBGRPROD.CDFILISUBGR  = NOTAFISCAL.CDFILIRECE))
                                                    AND (PRSUBGRPROD.CDPRODUTO    = PRODUTO.CDPRODUTO)
                                                    AND (INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) <> 0))))
          ORDER BY FIL.CDREGIAO, NOTAFISCAL.CDFILIRECE;
   END IF;
   LOOP
      FETCH C_BASE INTO V_CDFILDEST, V_NMFILIAL, V_CDREGIAO, V_NMREGIAO,
                        V_CDARVPROD, V_SGUNIDADE, V_IDTPIJURFORN,
                        V_NRINSJURFORN, V_NMRAZSOCFORN, V_CDOPERGESTOR, V_NMOPERGESTOR,
                        V_QTTOT, V_VRMED, V_VRTOT, V_DTENTRSAID, V_NRLANCTONF, V_NRSEQITPROD,
                        V_CONTADORTOTAL;
      EXIT WHEN C_BASE%NOTFOUND;
      V_CONTADOR := V_CONTADOR+1;
      V_NMPRODUTO  := '';
      V_CDPRODESTO := '';
      IF LENGTH(V_CDARVPROD) > 0 THEN
         SELECT MAX(NMPRODUTO), MAX(CDPRODESTO), NVL(MAX(PRODUTO.VRFATOCONV), 1)
           INTO V_NMPRODUTO, V_CDPRODESTO, V_VRFATOCONV
           FROM PRODUTO
          WHERE CDARVPROD = V_CDARVPROD;
      END IF;
      IF NVL(P_CUSTO, 'W') <> 'W' THEN
         OUT_RECORD.VRCUSTO := ((CUSTO_PRODUTO(V_CDFILDEST, V_CDPRODESTO, P_CUSTO, V_DTENTRSAID, SYSDATE))*(V_VRFATOCONV));
      END IF;
      IF P_EXIBE_FILIAL = 'C' THEN
         IF V_LISTA_FILIAL IS NULL THEN
            V_LISTA_FILIAL    := V_LISTA_FILIAL||V_CDFILDEST||' - '||SUBSTR(V_NMFILIAL, 1, 15)||' / ';
         ELSE
            IF INSTR(V_LISTA_FILIAL||'_', V_CDFILDEST||' - '||SUBSTR(V_NMFILIAL, 1, 15)||' / ') = 0 THEN
               V_LISTA_FILIAL := SUBSTR(V_LISTA_FILIAL||V_CDFILDEST||' - '||SUBSTR(V_NMFILIAL, 1, 15)||' / ', 1, 1000);
            END IF;
         END IF;
      END IF;
      IF P_EXIBE_REGIAO = 'L' THEN
         IF V_LISTA_REGIAO IS NULL THEN
            V_LISTA_REGIAO    := V_LISTA_REGIAO||V_CDREGIAO||' - '||SUBSTR(V_NMREGIAO, 1, 15)||' / ';
         ELSE
            IF INSTR(V_LISTA_REGIAO||'_', V_CDREGIAO||' - '||SUBSTR(V_NMREGIAO, 1, 15)||' / ') = 0 THEN
               V_LISTA_REGIAO := SUBSTR(V_LISTA_REGIAO||V_CDREGIAO||' - '||SUBSTR(V_NMREGIAO, 1, 15)||' / ', 1, 1000);
            END IF;
         END IF;
      END IF;
      IF V_CONTADORTOTAL = V_CONTADOR THEN
         OUT_RECORD.LISTA_REGIAO := SUBSTR(V_LISTA_REGIAO, 1, LENGTH(V_LISTA_REGIAO)-3);
         OUT_RECORD.LISTA_FILIAL := SUBSTR(V_LISTA_FILIAL, 1, LENGTH(V_LISTA_FILIAL)-3);
      END IF;
      OUT_RECORD.CDFILIAL         := V_CDFILDEST;
      OUT_RECORD.NMFILIAL         := V_NMFILIAL;
      OUT_RECORD.CDREGIAO         := V_CDREGIAO;
      OUT_RECORD.NMREGIAO         := V_NMREGIAO;
      OUT_RECORD.CDFILIAL         := V_CDFILDEST;
      OUT_RECORD.NMFILIAL         := V_NMFILIAL;
      OUT_RECORD.CDARVPROD        := V_CDARVPROD;
      OUT_RECORD.SGUNIDADE        := V_SGUNIDADE;
      OUT_RECORD.NMPRODUTO        := V_NMPRODUTO;
      OUT_RECORD.QTTOT            := V_QTTOT;
      OUT_RECORD.VRMED            := V_VRMED;
      IF NVL(P_CUSTO, 'W') = 'W' THEN
         OUT_RECORD.VRTOT         := V_VRTOT;
      ELSE
         OUT_RECORD.VRTOT := (V_VRMED - OUT_RECORD.VRCUSTO)*V_QTTOT;
      END IF;
      OUT_RECORD.IDTPIJURFORN     := V_IDTPIJURFORN;
      OUT_RECORD.NRINSJURFORN     := V_NRINSJURFORN;
      OUT_RECORD.NMRAZSOCFORN     := V_NMRAZSOCFORN;
      OUT_RECORD.CDOPERGESTOR     := V_CDOPERGESTOR;
      OUT_RECORD.NMOPERGESTOR     := V_NMOPERGESTOR;
      PIPE ROW (OUT_RECORD);
   END LOOP;
   CLOSE C_BASE;
END;
/

CREATE OR REPLACE FUNCTION CURVA_ABC_PROD_FORN_CMP (P_RELATORIO       IN VARCHAR2,
                                                    P_DADO            IN VARCHAR2,
                                                    P_CDGRUPFILI      IN VARCHAR2,
                                                    P_TCDGRUPFILI     IN VARCHAR2,
                                                    P_EXIBE_GRUPFILI  IN VARCHAR2,
                                                    P_CDREGIAO        IN VARCHAR2,
                                                    P_TCDREGIAO       IN VARCHAR2,
                                                    P_EXIBE_REGIAO    IN VARCHAR2,
                                                    P_CDFILIAL        IN VARCHAR2,
                                                    P_TCDFILIAL       IN VARCHAR2,
                                                    P_EXIBE_FILIAL    IN VARCHAR2,
                                                    P_DTENTRINI       IN DATE,
                                                    P_DTENTRFIN       IN DATE,
                                                    P_TDTENTREGA      IN VARCHAR2,
                                                    P_DTGERAINI       IN DATE,
                                                    P_DTGERAFIN       IN DATE,
                                                    P_TDTGERACAO      IN VARCHAR2,
                                                    P_CDNVPRODUTO     IN VARCHAR2,
                                                    P_SUBGRUPO        IN VARCHAR2,
                                                    P_TSUBGRUPO       IN VARCHAR2,
                                                    P_CDFORNECED      IN VARCHAR2,
                                                    P_TCDFORNECED     IN VARCHAR2,

                                                    P_CDOPERADOR      IN VARCHAR2,
                                                    P_TCDOPERADOR     IN VARCHAR2,

                                                    P_CDPRODINI       IN VARCHAR2,
                                                    P_CDPRODFIN       IN VARCHAR2,
                                                    P_IDBAIXAAF       IN VARCHAR2,
                                                    P_TIDBAIXAAF      IN VARCHAR2,
                                                    P_IDAFEXPIRADA    IN VARCHAR2,
                                                    P_TIDAFEXPIRADA   IN VARCHAR2,
                                                    P_CONSISTE_BAIXA  IN VARCHAR2,
                                                    P_VALOR_EFETIVADO IN VARCHAR2,
                                                    P_IDFILIATIVA     IN VARCHAR2,
                                                    P_TIDFILIATIVA    IN VARCHAR2,
                                                    P_FILIAL_LOGADA   IN VARCHAR2,
                                                    P_EXIBE_PROD      IN VARCHAR2,
                                                    P_CUSTO           IN VARCHAR2,
                                                    P_OPERADORLOG     IN VARCHAR2)
 RETURN CURVA_ABC_PROD_FORN_CMP_TABLE PIPELINED
IS
  V_CDGRUPPROD        VARCHAR2(10);
  V_NMGRUPFILI        VARCHAR2(40);
  V_CDPRODINICIAL     VARCHAR2(10);
  V_NMDPRODINICIAL    VARCHAR2(50);
  V_CDPRODFINAL       VARCHAR2(10);
  V_NMPRODFINAL       VARCHAR2(50);
  V_VRPECURVAA        FLOAT;
  V_VRPECURVAB        FLOAT;
  V_VRPECURVA         FLOAT := 0;
  V_TIPOCURVA         VARCHAR2(1) := 'A';
  V_VRTOTCURVA        FLOAT := 0;
  V_CHAVE             VARCHAR2(100) := '_';
  V_EXIBE_FILIAL      VARCHAR2(1);
  V_IDRESTRFILIOPER   VARCHAR2(1);
OUT_RECORD CURVA_ABC_PROD_FORN_CMP_TYPE := CURVA_ABC_PROD_FORN_CMP_TYPE (NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL, NULL, NULL,
                                                                         NULL, NULL, NULL,0, 0, 0, 0,
                                                                         0, 0, 0, 0, 0);
BEGIN
/*RAISE_APPLICATION_ERROR(-20501, P_RELATORIO||'-'||P_DADO||'-'||P_CDGRUPFILI||'-'||P_TCDGRUPFILI||'-'||P_EXIBE_GRUPFILI||'-'||P_CDREGIAO||'-'||P_TCDREGIAO||'-'||P_EXIBE_REGIAO
||'-'||P_CDFILIAL||'-'||P_TCDFILIAL||'-'||P_EXIBE_FILIAL||'-'||P_DTENTRINI||'-'||P_DTENTRFIN||'-'||P_TDTENTREGA||'-'||P_DTGERAINI||'-'||
P_DTGERAFIN||'-'||P_TDTGERACAO||'-'||P_CDNVPRODUTO||'-'||P_SUBGRUPO||'-'||P_TSUBGRUPO||'-'||P_CDFORNECED||'-'||P_TCDFORNECED||'-'||
P_CDOPERADOR||'-'||P_TCDOPERADOR||'-'||P_CDPRODINI||'-'||P_CDPRODFIN||'-'||P_IDBAIXAAF||'-'||P_TIDBAIXAAF||'-'||P_IDAFEXPIRADA
||'-'||P_TIDAFEXPIRADA||'-'||P_CONSISTE_BAIXA||'-'||P_VALOR_EFETIVADO||'-'||P_IDFILIATIVA||'-'||P_TIDFILIATIVA||'-'||P_FILIAL_LOGADA||'-'||P_EXIBE_PROD||'-'||P_CUSTO||'_');*/
   SELECT NVL(MAX(CDGRUPPROD), '0')
     INTO V_CDGRUPPROD
     FROM PARASUPRI, FILIAL
    WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
      AND FILIAL.CDFILIAL    = P_FILIAL_LOGADA;
   IF P_TCDGRUPFILI <> 'T' AND P_EXIBE_GRUPFILI = 'S' THEN
      SELECT MAX(NMGRUPFILI)
        INTO V_NMGRUPFILI
        FROM GRUPFILI
       WHERE CDGRUPFILI =  P_CDGRUPFILI;
   END IF;
   SELECT MAX(CDARVPROD), MAX(NMPRODUTO)
     INTO V_CDPRODINICIAL, V_NMDPRODINICIAL
     FROM PRODUTO
    WHERE CDARVPROD = P_CDPRODINI;
      SELECT MAX(CDARVPROD), MAX(NMPRODUTO)
     INTO V_CDPRODFINAL, V_NMPRODFINAL
     FROM PRODUTO
    WHERE CDARVPROD = P_CDPRODFIN;
   SELECT NVL(MAX(VRPECURVAA), 70), NVL(MAX(VRPECURVAB), 20), NVL(MAX(IDRESTRFILIOPER), 'N')
     INTO V_VRPECURVAA, V_VRPECURVAB, V_IDRESTRFILIOPER
     FROM PARAMGERAL;
   V_EXIBE_FILIAL := P_EXIBE_FILIAL;
   IF P_EXIBE_FILIAL = 'L' THEN
      V_EXIBE_FILIAL := 'S';
   END IF;
   FOR C_BASE IN (SELECT TOT.CDREGIAO, TOT.NMREGIAO, TOT.CDFILDEST,
                         TOT.NMFILIAL, SUBSTR(RPAD(TOT.CDARVPROD, 10, ' '), 1, 10) AS CDARVPROD,
                         TOT.SGUNIDADE, TOT.NMPRODUTO,
                         TOT.QTTOT, TOT.VRMED, TOT.VRMED_F, TOT.VRTOT,
                         SUM(TOT.VRTOT) OVER (PARTITION BY NVL(TOT.CDFILDEST, TOT.CDREGIAO)) VRTOTG,
                         SUM(TOT.VRTOT) OVER (PARTITION BY NVL(TOT.CDFILDEST, TOT.CDREGIAO), CASE P_RELATORIO||P_EXIBE_PROD
                                                                                                 WHEN 'FS'
                                                                                                 THEN TOT.CDARVPROD
                                                                                                 ELSE ''
                                                                                              END) VRTOTPROD,
                         (((TOT.VRTOT)/(SUM(TOT.VRTOT) OVER (PARTITION BY NVL(TOT.CDFILDEST, TOT.CDREGIAO), CASE P_RELATORIO||P_EXIBE_PROD
                                                                                                               WHEN 'FS'
                                                                                                               THEN TOT.CDARVPROD
                                                                                                               ELSE ''
                                                                                                            END))*10000000)/100000) VRPERCENTG,
                         TOT.IDTPIJURFORN, TOT.NRINSJURFORN, TOT.NMRAZSOCFORN, TOT.CDOPERGESTOR, TOT.NMOPERGESTOR, TOT.VRCUSTO,
                         LISTA_REGIAO, LISTA_FILIAL
                    FROM (SELECT CASE V_EXIBE_FILIAL
                                    WHEN 'S'
                                    THEN PROD.CDFILDEST
                                    ELSE ''
                                 END CDFILDEST, CASE V_EXIBE_FILIAL
                                                   WHEN 'S'
                                                   THEN PROD.NMFILIAL
                                                   ELSE ''
                                                END NMFILIAL,
                                 CASE P_EXIBE_REGIAO
                                    WHEN 'S'
                                    THEN PROD.CDREGIAO
                                    ELSE ''
                                 END CDREGIAO, CASE P_EXIBE_REGIAO
                                                  WHEN 'S'
                                                  THEN PROD.NMREGIAO
                                                  ELSE ''
                                               END NMREGIAO,
                                 AVG(VRMED) AS VRMED_F,
                                 SUM(PROD.QTTOT) AS QTTOT, (SUM(PROD.VRTOT)/SUM(PROD.QTTOT)) AS VRMED,
                                 SUM(PROD.VRTOT) AS VRTOT,
                                 PROD.CDARVPROD, PROD.SGUNIDADE, PROD.NMPRODUTO, PROD.IDTPIJURFORN, PROD.NRINSJURFORN, PROD.NMRAZSOCFORN,
                                 PROD.CDOPERGESTOR, PROD.NMOPERGESTOR, PROD.VRCUSTO, CASE
                                                                                        WHEN LENGTH(P_CUSTO) > 0
                                                                                        THEN PROD.VRMED
                                                                                        ELSE 0
                                                                                     END VRMED_L,
                                 LISTA_REGIAO, LISTA_FILIAL
                            FROM (SELECT CDFILIAL CDFILDEST, NMFILIAL, CDREGIAO, NMREGIAO, CDARVPROD, QTTOT, VRMED, SGUNIDADE, VRTOT,
                                         IDTPIJURFORN, NRINSJURFORN, NMRAZSOCFORN, CDOPERGESTOR, NMOPERGESTOR, NMPRODUTO, VRCUSTO,
                                         MAX(LISTA_REGIAO) OVER () LISTA_REGIAO,
                                         MAX(LISTA_FILIAL) OVER () LISTA_FILIAL
                                    FROM TABLE(CURVA_ABC_AF_NF_CMP(P_RELATORIO, P_DADO, P_CDGRUPFILI, P_TCDGRUPFILI, P_EXIBE_GRUPFILI,
                                                                   P_CDREGIAO, P_TCDREGIAO, P_EXIBE_REGIAO, P_CDFILIAL, P_TCDFILIAL,
                                                                   V_EXIBE_FILIAL, P_DTENTRINI, P_DTENTRFIN, P_TDTENTREGA, P_DTGERAINI,
                                                                   P_DTGERAFIN, P_TDTGERACAO, P_CDNVPRODUTO, P_SUBGRUPO, P_TSUBGRUPO,
                                                                   P_CDFORNECED, P_TCDFORNECED, P_CDOPERADOR, P_TCDOPERADOR, P_CDPRODINI,
                                                                   P_CDPRODFIN, P_IDBAIXAAF, P_TIDBAIXAAF, P_IDAFEXPIRADA, P_TIDAFEXPIRADA,
                                                                   P_CONSISTE_BAIXA, P_VALOR_EFETIVADO, P_IDFILIATIVA, P_TIDFILIATIVA, P_FILIAL_LOGADA,
                                                                   P_EXIBE_PROD, P_CUSTO, P_OPERADORLOG) )) PROD
                                   GROUP BY CASE V_EXIBE_FILIAL
                                               WHEN 'S'
                                               THEN PROD.CDFILDEST
                                               ELSE ''
                                            END, CASE V_EXIBE_FILIAL
                                                    WHEN 'S'
                                                    THEN PROD.NMFILIAL
                                                    ELSE ''
                                                 END,
                                            CASE P_EXIBE_REGIAO
                                               WHEN 'S'
                                               THEN PROD.CDREGIAO
                                               ELSE ''
                                            END, CASE P_EXIBE_REGIAO
                                                    WHEN 'S'
                                                    THEN PROD.NMREGIAO
                                                    ELSE ''
                                                 END, PROD.CDARVPROD, PROD.SGUNIDADE, PROD.NMPRODUTO,
                                                 PROD.CDARVPROD, PROD.SGUNIDADE, PROD.NMPRODUTO, PROD.IDTPIJURFORN, PROD.NRINSJURFORN, PROD.NMRAZSOCFORN,
                                                 PROD.CDOPERGESTOR, PROD.NMOPERGESTOR, PROD.VRCUSTO, CASE
                                                                                                        WHEN LENGTH(P_CUSTO) > 0
                                                                                                        THEN PROD.VRMED
                                                                                                        ELSE 0
                                                                                                     END, LISTA_REGIAO, LISTA_FILIAL) TOT
                   WHERE TOT.VRTOT > 0
                   ORDER BY TOT.CDREGIAO, TOT.CDFILDEST, CASE P_RELATORIO||P_EXIBE_PROD
                                                            WHEN 'FS'
                                                            THEN SUBSTR(RPAD(TOT.CDARVPROD, 10, ' '), 1, 10)
                                                            ELSE ''
                                                         END, TOT.VRTOT DESC

)
   LOOP
      IF V_CHAVE <> NVL(C_BASE.CDREGIAO, 'Y')||NVL(C_BASE.CDFILDEST, 'W')||CASE P_RELATORIO||P_EXIBE_PROD
                                                                              WHEN 'FS'
                                                                              THEN C_BASE.CDARVPROD
                                                                              ELSE ''
                                                                           END THEN
         V_CHAVE := NVL(C_BASE.CDREGIAO, 'Y')||NVL(C_BASE.CDFILDEST, 'W')||CASE P_RELATORIO||P_EXIBE_PROD
                                                                               WHEN 'FS'
                                                                               THEN C_BASE.CDARVPROD
                                                                               ELSE ''
                                                                            END;
         V_VRPECURVA   := 0;
         V_VRTOTCURVA  := 0;
         V_TIPOCURVA   := 'A';
      END IF;
      OUT_RECORD.LISTA_REGIAO     := C_BASE.LISTA_REGIAO;
      OUT_RECORD.LISTA_FILIAL     := C_BASE.LISTA_FILIAL;
      OUT_RECORD.CDREGIAO         := C_BASE.CDREGIAO;
      OUT_RECORD.NMREGIAO         := C_BASE.NMREGIAO;
      OUT_RECORD.CDFILIAL         := C_BASE.CDFILDEST;
      OUT_RECORD.NMFILIAL         := C_BASE.NMFILIAL;
      OUT_RECORD.CDPRODUTO        := '';
      OUT_RECORD.CDARVPROD        := C_BASE.CDARVPROD;
      OUT_RECORD.NMPRODUTO        := C_BASE.NMPRODUTO;
      OUT_RECORD.SGUNIDADE        := C_BASE.SGUNIDADE;
      OUT_RECORD.DTENTRINI        := P_DTENTRINI;
      OUT_RECORD.DTENTRFIN        := P_DTENTRFIN;
      OUT_RECORD.DTGERAINI        := P_DTGERAINI;
      OUT_RECORD.DTGERAFIN        := P_DTGERAFIN;
      OUT_RECORD.CDPRODINICIAL    := V_CDPRODINICIAL;
      OUT_RECORD.NMDPRODINICIAL   := V_NMDPRODINICIAL;
      OUT_RECORD.CDPRODFINAL      := V_CDPRODFINAL;
      OUT_RECORD.NMPRODFINAL      := V_NMPRODFINAL;
      OUT_RECORD.CDOPERADOR       := '';
      OUT_RECORD.NMOPERADOR       := '';
      OUT_RECORD.CDFORNECED       := '';
      OUT_RECORD.NRINSJURFORN     := C_BASE.NRINSJURFORN;
      OUT_RECORD.IDTPIJURFORN     := C_BASE.IDTPIJURFORN;
      OUT_RECORD.NMRAZSOCFORN     := C_BASE.NMRAZSOCFORN;
      OUT_RECORD.CDOPERGESTOR     := C_BASE.CDOPERGESTOR;
      OUT_RECORD.NMOPERGESTOR     := C_BASE.NMOPERGESTOR;

      OUT_RECORD.NMFANTFORN       := '';
      OUT_RECORD.CDGRUPPROD       := '';
      OUT_RECORD.NMGRUPPROD       := '';
      OUT_RECORD.QTTOT            := C_BASE.QTTOT;
      OUT_RECORD.VRTOTPROD        := C_BASE.VRTOTPROD;
      IF P_RELATORIO = 'F' THEN
         OUT_RECORD.VRMED            := C_BASE.VRMED_F;
      ELSE
         OUT_RECORD.VRMED            := C_BASE.VRMED;
      END IF;
      OUT_RECORD.VRTOT            := C_BASE.VRTOT;
      OUT_RECORD.VRTOTG           := C_BASE.VRTOTG;
      IF C_BASE.VRTOTG = 0 THEN
         OUT_RECORD.VRPERCENTG       := 0;
         OUT_RECORD.TIPOCURVA        := '';
      ELSE
         OUT_RECORD.VRPERCENTG       := C_BASE.VRPERCENTG;
      END IF;
      V_VRTOTCURVA                   := V_VRTOTCURVA+C_BASE.VRTOT;
      OUT_RECORD.VRTOTCURVA          := V_VRTOTCURVA;

      V_VRPECURVA                    := V_VRPECURVA+C_BASE.VRPERCENTG;
      OUT_RECORD.VRPECURVA           := V_VRPECURVA;
      OUT_RECORD.TIPOCURVA           := V_TIPOCURVA;
      IF (V_VRPECURVA >= V_VRPECURVAA) AND (V_TIPOCURVA = 'A') THEN
         V_VRPECURVA   := 0;
         V_VRTOTCURVA  := 0;
         V_TIPOCURVA   := 'B';
      END IF;
      IF V_VRPECURVA >= V_VRPECURVAB AND (V_TIPOCURVA = 'B')THEN
          V_VRPECURVA   := 0;
          V_VRTOTCURVA  := 0;
          V_TIPOCURVA   := 'C';
      END IF;
      OUT_RECORD.VRCUSTO :=  C_BASE.VRCUSTO;
      OUT_RECORD.EXIBE_PROD   :=  P_EXIBE_PROD;
      OUT_RECORD.RELATORIO    :=  P_RELATORIO;
      PIPE ROW (OUT_RECORD);
   END LOOP;
END;