DROP TYPE CALC_NECESSIDADE_OL_TABLE
/

DROP TYPE CALC_NECESSIDADE_OL_TYPE
/

CREATE TYPE CALC_NECESSIDADE_OL_TYPE AS OBJECT
  (CDFILIALOL     VARCHAR2(4),
   NMFILIALOL     VARCHAR2(30),
   DTINICIAL      DATE,
   DTFINAL        DATE,
   DTINICIALAF    DATE,
   DTFINALAF      DATE,
   CDREGIAO       VARCHAR2(3),
   NMREGIAO       VARCHAR2(30),
   CDOPERADOR     VARCHAR2(12),
   NMOPERADOR     VARCHAR2(40),
   CDARVPROD      VARCHAR2(20),
   NMPRODUTO      VARCHAR2(50),
   QTESTOQ        FLOAT,
   QTPROGENTCONS  FLOAT,
   QTSOLIPROD     FLOAT,
   QTPROGENTAFOL  FLOAT,
   QTSALDOAF      FLOAT,
   DTPROGENTAF    DATE,
   CDFILDEST      VARCHAR2(4),
   NMFILDEST      VARCHAR2(30),
   NRAUTOFORN     VARCHAR2(35),
   QTPROGENTAF    FLOAT,
   QTACUMULADAF   FLOAT,
   DTLIMENTRAFOL  DATE,
   DTUTILIZA      DATE,
   SGUNIDADE      VARCHAR2(10),
   CDPRODUTO      VARCHAR2(10),
   CDMARCA        VARCHAR2(10),
   CDPRODARVOL    VARCHAR2(10),
   IDPARTCDMARCA  VARCHAR2(1),
   QTDEAFOL       FLOAT,
   IDFUNCAOFILI   VARCHAR2(1),
   QTPROGENTAFAUX FLOAT
  )
/

CREATE TYPE CALC_NECESSIDADE_OL_TABLE AS TABLE OF CALC_NECESSIDADE_OL_TYPE
/

CREATE OR REPLACE FUNCTION CALC_NECESS_OL
                          (P_CDFILIOPELOG    IN ITEMAUTF.CDFILDEST%TYPE,
                           P_DTINICIAL       IN DATE,
                           P_DTFINAL         IN DATE,
                           P_DTINICIALAF     IN DATE,
                           P_DTFINALAF       IN DATE,
                           P_CDOPERADOR      IN VARCHAR2,
                           P_CDREGIAO        IN VARCHAR2,
                           P_CDPRODINIC      IN PRODUTO.CDARVPROD%TYPE,
                           P_CDPRODFIN       IN PRODUTO.CDARVPROD%TYPE,
                           P_TIPOCONSULTA    IN VARCHAR2,
                           P_GERACMP         IN VARCHAR2)
                          RETURN CALC_NECESSIDADE_OL_TABLE PIPELINED IS
   OUT_RECORD CALC_NECESSIDADE_OL_TYPE := CALC_NECESSIDADE_OL_TYPE (NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                                                                    NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0,
                                                                    NULL, NULL, NULL, NULL, 0, 0, NULL, NULL,
                                                                    NULL, NULL, NULL, NULL, NULL, 0, NULL, 0);
   V_QTPROGENTAFOL    FLOAT;
   V_QTSALDOAF        FLOAT;
   V_QTACUMULADAF     FLOAT := 0;
   V_QTPROGITEMOL     FLOAT;
   V_CONTADOR         FLOAT;
   V_CHAVE            VARCHAR2(24) := '1';
   V_CDARVPRODOL      VARCHAR2(20) := '1';
   V_QTPROGITEMOL_AUX FLOAT := 0;
   V_DTINICIAL        DATE;
   V_DTFINAL          DATE;
   V_DTINICIALAF      DATE;
   V_DTFINALAF        DATE;
   V_IDPARTCDMARCA    VARCHAR2(1);
   V_CDMARCAPADRAO    VARCHAR2(5);
   V_CDPRODARVOL_P    VARCHAR2(10);
   V_CDARVPROD_P      VARCHAR2(20);
   V_QTDEAFOL         FLOAT;
   V_QTPROGITEMOL_AUX1 FLOAT := 0;
   V_CHAVEOL          VARCHAR2(24) := '1';
   V_DTLIMENTRAFOL    VARCHAR2(4000) := '_';
   V_CHAVEAFOL        VARCHAR2(32)   := '_';
   V_CDPRODUTO        VARCHAR2(10)   := NULL;
   V_CDOPERADOR       VARCHAR2(12)   := NULL;
   V_DTAFOL           VARCHAR2(4000) := '1';
   V_QTPROGENTAF      FLOAT;
   V_QTESTOQ          FLOAT;
   V_QTPROGENTCONS    FLOAT;
   V_QTSOLIPROD       FLOAT;
   V_DTPROGENTAF_AUX  VARCHAR(2000) := '_';
   V_CDPRODINIC       VARCHAR2(20);
   V_CDPRODFIN        VARCHAR2(20);
   V_MIN_DTLIMENTRAFOL DATE;
   V_MAX_DTLIMENTRAFOL DATE;

BEGIN
   V_DTINICIALAF := P_DTINICIALAF;
   V_DTINICIAL   := P_DTINICIAL;
   V_DTFINAL     := P_DTFINAL;
   V_DTFINALAF   := P_DTFINALAF;

   SELECT NVL(MIN(PRODUTO.CDARVPROD), '0')
     INTO V_CDPRODINIC
     FROM RELACPRODOL, PRODUTO PRODUTOOL, PRODUTO
    WHERE RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
      AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
      AND PRODUTOOL.CDARVPROD BETWEEN P_CDPRODINIC AND P_CDPRODFIN;

   SELECT NVL(MAX(PRODUTO.CDARVPROD), 'Z')
     INTO V_CDPRODFIN
     FROM RELACPRODOL, PRODUTO PRODUTOOL, PRODUTO
    WHERE RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
      AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
      AND PRODUTOOL.CDARVPROD BETWEEN P_CDPRODINIC AND P_CDPRODFIN;
   V_CDPRODFIN := SUBSTR(V_CDPRODFIN, 1, LENGTH(V_CDPRODFIN)-1);
   V_CDPRODFIN := RPAD(V_CDPRODFIN, 20, 'Z');
   FOR C_DADOS_CAB IN (SELECT CDFILIALOL, NMFILIALOL, DTINICIAL, DTFINAL, DTINICIALAF, DTFINALAF,
                              CDREGIAO, NMREGIAO, CDOPERADOR, NMOPERADOR, CDARVPRODOL, NMPRODUTOOL,
                              SGUNIDADEOL, MAX(QTESTOQ) OVER (PARTITION BY CDARVPRODOL) QTESTOQ,
                              MAX(QTPROGENTCONS) OVER (PARTITION BY CDARVPRODOL) QTPROGENTCONS,
                              MAX(QTSOLIPROD) OVER (PARTITION BY CDARVPRODOL) QTSOLIPROD,
                              CDPRARVORIG, CDMARCA, CDPRODARVOL, CDFILDEST, NMFILDEST,
                              NRAUTOFORN, CDPRODUTO, QTPROGENTAF, DTPROGENTAF, DTUTILIZA, CDARVPROD,
                              NRLIMISEGU, DTLIMENTRAFOL, IDEXISTEAF,
                              (NVL(P_DTINICIALAF, P_DTINICIAL)-NRLIMISEGU) MIN_DTLIMENTRAFOL,
                              (NVL(P_DTFINALAF, P_DTFINAL)-NRLIMISEGU) MAX_DTLIMENTRAFOL,
                              ROW_NUMBER() OVER (PARTITION BY CDARVPRODOL
                                                     ORDER BY CDOPERADOR, CDARVPRODOL) QTCDARVPROD
                         FROM (SELECT CDFILIALOL, NMFILIALOL, V_DTINICIAL DTINICIAL, V_DTFINAL DTFINAL,
                                      V_DTINICIALAF DTINICIALAF, V_DTFINALAF DTFINALAF,
                                      CDREGIAO, NMREGIAO, CDOPERADOR, NMOPERADOR, CDARVPRODOL, NMPRODUTOOL,
                                      SGUNIDADEOL, QTESTOQ, QTPROGENTCONS, QTSOLIPROD, CDPRARVORIG, CDMARCA, CDPRODARVOL, CDFILDEST,
                                      NMFILDEST, NRAUTOFORN, CDPRODUTO, QTPROGENTAF, DTPROGENTAF, DTUTILIZA, CDARVPROD,
                                      NRLIMISEGU, DTLIMENTRAFOL, IDEXISTEAF
                                 FROM TABLE(CALC_PRE_ITEMAUTF_OL(P_CDFILIOPELOG, P_DTINICIAL, P_DTFINAL, P_DTINICIALAF, P_DTFINALAF,
                                                                  P_CDOPERADOR, P_CDREGIAO, P_CDPRODINIC, P_CDPRODFIN, P_TIPOCONSULTA, P_GERACMP))  )
                        ORDER BY CDOPERADOR, CDARVPRODOL, DTLIMENTRAFOL, DTPROGENTAF, QTPROGENTAF, CDFILDEST, NRAUTOFORN)
   LOOP
      IF ((P_GERACMP = 'S') OR ((P_GERACMP = 'N') AND (C_DADOS_CAB.CDPRODUTO <> C_DADOS_CAB.CDPRODARVOL))) THEN
         V_QTPROGENTAFOL   := 0;
         V_QTPROGENTAF     := C_DADOS_CAB.QTPROGENTAF;
         V_IDPARTCDMARCA   := '';
         /*SO REALIZA CONSULTA PARA PRODUTO COM RELACPRODOL*/
         IF (C_DADOS_CAB.CDPRODUTO <> C_DADOS_CAB.CDPRODARVOL) THEN
            SELECT CARREGA_PERIFILI_FUN(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, C_DADOS_CAB.MIN_DTLIMENTRAFOL)
              INTO V_MIN_DTLIMENTRAFOL
              FROM DUAL;
            SELECT CARREGA_PERIFILI_FUN(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, C_DADOS_CAB.MAX_DTLIMENTRAFOL)
              INTO V_MAX_DTLIMENTRAFOL
              FROM DUAL;
            SELECT CALC_ESTOQ_CONS(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, SYSDATE+120)
              INTO V_QTESTOQ
              FROM DUAL;

            /*Consolidado por item de AF do OL maior igual que a data de processamento*/
            SELECT NVL(SUM(ITEMAUTF.QTPROGENTAF-NVL(QTEFETENTRAF, 0)), 0)
              INTO V_QTPROGENTAFOL
              FROM ITEMAUTF, AUTOFORNE
             WHERE ITEMAUTF.CDFILDEST               = AUTOFORNE.CDFILDEST
               AND ITEMAUTF.CDFILLANC               = AUTOFORNE.CDFILLANC
               AND ITEMAUTF.NRAUTOFORN              = AUTOFORNE.NRAUTOFORN
               AND ITEMAUTF.CDFILDEST               = P_CDFILIOPELOG
               AND ITEMAUTF.CDPRODUTO               = C_DADOS_CAB.CDPRODUTO /*MEXER*/
               AND ITEMAUTF.DTPROGENTAF >=  TRUNC(SYSDATE)
               AND AUTOFORNE.CDOPERADOR             = C_DADOS_CAB.CDOPERADOR
               AND CASE AUTOFORNE.IDTIPOLANCAF
                      WHEN 'M'
                      THEN ITEMAUTF.DTPROGENTAF
                      ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                   END   BETWEEN V_MIN_DTLIMENTRAFOL AND V_MAX_DTLIMENTRAFOL
               AND AUTOFORNE.CDOPERADOR = P_CDOPERADOR
               --AND ((INSTR(P_CDOPERADOR, AUTOFORNE.CDOPERADOR) > 0) OR (P_CDOPERADOR = 'T'))
               AND NVL(ITEMAUTF.IDBAIXITMAF, '1')   = '1'
               AND NVL(AUTOFORNE.IDBAIXAAF, '1')  NOT IN ('2', '3', '4', '5');
         END IF;
         V_QTSALDOAF       := V_QTESTOQ - (C_DADOS_CAB.QTPROGENTCONS+C_DADOS_CAB.QTSOLIPROD);
         V_CDPRODUTO       := C_DADOS_CAB.CDPRODUTO;
         V_CDOPERADOR      := C_DADOS_CAB.CDOPERADOR;

         IF (V_CHAVEAFOL <> V_CDPRODUTO||V_CDOPERADOR) AND
            (C_DADOS_CAB.CDPRODUTO <> C_DADOS_CAB.CDPRODUTO) THEN
            SELECT CARREGA_PERIFILI_FUN(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, C_DADOS_CAB.MIN_DTLIMENTRAFOL)
              INTO V_MIN_DTLIMENTRAFOL
              FROM DUAL;
            SELECT CARREGA_PERIFILI_FUN(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, C_DADOS_CAB.MAX_DTLIMENTRAFOL)
              INTO V_MAX_DTLIMENTRAFOL
              FROM DUAL;
            SELECT CALC_ESTOQ_CONS(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, SYSDATE+120)
              INTO V_QTESTOQ
              FROM DUAL;
            FOR C_DADOS_AFOL IN (SELECT FILIAL.CDFILIAL, FILIAL.NMFILIAL, OPERADOR.CDOPERADOR, OPERADOR.NMOPERADOR,
                                        AUTOFORNE.NRAUTOFORN, REGIAO.CDREGIAO, REGIAO.NMREGIAO,
                                        PRODUTO.CDARVPROD, PRODUTO.NMPRODUTO, PRODUTO.CDPRODUTO,
                                        PRODUTO.SGUNIDADE, ITEMAUTF.CDMARCA,  ITEMAUTF.DTPROGENTAF,
                                        SUM(ITEMAUTF.QTPROGENTAF)-NVL(SUM(ITEMAUTF.QTEFETENTRAF), 0) QTDEAFOL,
                                        CASE AUTOFORNE.IDTIPOLANCAF
                                           WHEN 'M'
                                           THEN ITEMAUTF.DTPROGENTAF
                                           ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                        END DTENTRITMSOL
                                   FROM ITEMAUTF INNER JOIN AUTOFORNE  ON ITEMAUTF.CDFILDEST             = AUTOFORNE.CDFILDEST
                                                                      AND ITEMAUTF.CDFILLANC             = AUTOFORNE.CDFILLANC
                                                                      AND ITEMAUTF.NRAUTOFORN            = AUTOFORNE.NRAUTOFORN
                                                                      AND ITEMAUTF.CDFILDEST             = P_CDFILIOPELOG
                                                                      AND ITEMAUTF.CDPRODUTO             = V_CDPRODUTO
                                                                      AND CASE AUTOFORNE.IDTIPOLANCAF
                                                                             WHEN 'M'
                                                                             THEN ITEMAUTF.DTPROGENTAF
                                                                             ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                                                          END BETWEEN V_MIN_DTLIMENTRAFOL AND V_MAX_DTLIMENTRAFOL
                                                                      AND INSTR(V_DTLIMENTRAFOL, TO_CHAR(ITEMAUTF.DTENTRITMSOL, 'DD/MM/YYYY')) = 0
                                                                      AND CASE AUTOFORNE.IDTIPOLANCAF
                                                                             WHEN 'M'
                                                                             THEN ITEMAUTF.DTPROGENTAF
                                                                             ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                                                          END <> C_DADOS_CAB.DTLIMENTRAFOL
                                                                      AND ITEMAUTF.DTPROGENTAF >=  TRUNC(SYSDATE)
                                                                      AND AUTOFORNE.CDOPERADOR           = V_CDOPERADOR
                                                                      AND NVL(AUTOFORNE.IDBAIXAAF, '1')  NOT IN ('2', '3', '4', '5')
                                                                      AND NVL(ITEMAUTF.IDBAIXITMAF, '1') = '1'
                                                 INNER JOIN FILIAL     ON ITEMAUTF.CDFILDEST             = FILIAL.CDFILIAL
                                                 INNER JOIN REGIAO     ON REGIAO.CDREGIAO                = FILIAL.CDREGIAO
                                                 INNER JOIN PRODUTO    ON ITEMAUTF.CDPRODUTO             = PRODUTO.CDPRODUTO
                                                 INNER JOIN OPERADOR   ON AUTOFORNE.CDOPERADOR           = OPERADOR.CDOPERADOR
                                              GROUP BY FILIAL.CDFILIAL, FILIAL.NMFILIAL, OPERADOR.CDOPERADOR, OPERADOR.NMOPERADOR,
                                                    AUTOFORNE.NRAUTOFORN, REGIAO.CDREGIAO, REGIAO.NMREGIAO,
                                                    PRODUTO.CDARVPROD, PRODUTO.NMPRODUTO, PRODUTO.CDPRODUTO,
                                                    PRODUTO.SGUNIDADE, ITEMAUTF.CDMARCA,  ITEMAUTF.DTPROGENTAF,
                                                    CASE AUTOFORNE.IDTIPOLANCAF
                                                       WHEN 'M'
                                                       THEN ITEMAUTF.DTPROGENTAF
                                                       ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                                    END)
            LOOP
               OUT_RECORD.CDFILIALOL    := C_DADOS_AFOL.CDFILIAL;
               OUT_RECORD.NMFILIALOL    := C_DADOS_AFOL.NMFILIAL;
               OUT_RECORD.CDOPERADOR    := C_DADOS_AFOL.CDOPERADOR;
               OUT_RECORD.NMOPERADOR    := C_DADOS_AFOL.NMOPERADOR;
               OUT_RECORD.CDREGIAO      := C_DADOS_AFOL.CDREGIAO;
               OUT_RECORD.NMREGIAO      := C_DADOS_AFOL.NMREGIAO;
               OUT_RECORD.DTINICIAL     := P_DTINICIAL;
               OUT_RECORD.DTFINAL       := P_DTFINAL;
               OUT_RECORD.DTINICIALAF   := P_DTINICIALAF;
               OUT_RECORD.DTFINALAF     := P_DTFINALAF;
               OUT_RECORD.CDFILDEST     := C_DADOS_AFOL.CDFILIAL;
               OUT_RECORD.NMFILDEST     := C_DADOS_AFOL.NMFILIAL;
               OUT_RECORD.NRAUTOFORN    := C_DADOS_AFOL.NRAUTOFORN;
               OUT_RECORD.CDARVPROD     := C_DADOS_AFOL.CDARVPROD;
               OUT_RECORD.NMPRODUTO     := C_DADOS_AFOL.NMPRODUTO;
               OUT_RECORD.SGUNIDADE     := C_DADOS_AFOL.SGUNIDADE;
               OUT_RECORD.CDPRODUTO     := C_DADOS_AFOL.CDPRODUTO;
               OUT_RECORD.CDMARCA       := C_DADOS_AFOL.CDMARCA;
               OUT_RECORD.DTPROGENTAF   := C_DADOS_AFOL.DTENTRITMSOL;
               OUT_RECORD.QTDEAFOL      := C_DADOS_AFOL.QTDEAFOL;
               OUT_RECORD.IDFUNCAOFILI  := 'O';
               OUT_RECORD.QTESTOQ       := V_QTESTOQ;
               OUT_RECORD.QTPROGENTCONS := C_DADOS_CAB.QTPROGENTCONS;
               OUT_RECORD.QTSOLIPROD    := C_DADOS_CAB.QTSOLIPROD;
               OUT_RECORD.QTPROGENTAFOL := V_QTPROGENTAFOL;
               OUT_RECORD.QTSALDOAF     := V_QTSALDOAF;
               OUT_RECORD.QTPROGENTAF   := NULL;
               OUT_RECORD.QTACUMULADAF  := NULL;
               OUT_RECORD.DTLIMENTRAFOL := C_DADOS_AFOL.DTENTRITMSOL;
               OUT_RECORD.DTUTILIZA     := C_DADOS_AFOL.DTENTRITMSOL;
               OUT_RECORD.CDPRODARVOL   := NULL;
               OUT_RECORD.IDPARTCDMARCA := NULL;
               PIPE ROW (OUT_RECORD);
            END LOOP;
            V_DTLIMENTRAFOL := '_';
            V_CHAVEAFOL     := V_CDPRODUTO||V_CDOPERADOR;
         END IF;
         /*FIM GRAVA AFS DO OL PARA REGISTRO(CDPRODUTO) ANTERIOR*/
         OUT_RECORD.CDFILIALOL    := C_DADOS_CAB.CDFILIALOL;
         OUT_RECORD.NMFILIALOL    := C_DADOS_CAB.NMFILIALOL;
         OUT_RECORD.DTINICIAL     := C_DADOS_CAB.DTINICIAL;
         OUT_RECORD.DTFINAL       := C_DADOS_CAB.DTFINAL;
         OUT_RECORD.DTINICIALAF   := C_DADOS_CAB.DTINICIALAF;
         OUT_RECORD.DTFINALAF     := C_DADOS_CAB.DTFINALAF;
         OUT_RECORD.CDREGIAO      := C_DADOS_CAB.CDREGIAO;
         OUT_RECORD.NMREGIAO      := C_DADOS_CAB.NMREGIAO;
         OUT_RECORD.CDOPERADOR    := C_DADOS_CAB.CDOPERADOR;
         OUT_RECORD.NMOPERADOR    := C_DADOS_CAB.NMOPERADOR;
         OUT_RECORD.CDARVPROD     := C_DADOS_CAB.CDARVPRODOL;
         OUT_RECORD.NMPRODUTO     := C_DADOS_CAB.NMPRODUTOOL;
         OUT_RECORD.SGUNIDADE     := C_DADOS_CAB.SGUNIDADEOL;
         OUT_RECORD.QTESTOQ       := V_QTESTOQ;
         OUT_RECORD.QTPROGENTCONS := C_DADOS_CAB.QTPROGENTCONS;
         OUT_RECORD.QTSOLIPROD    := C_DADOS_CAB.QTSOLIPROD;
         OUT_RECORD.QTPROGENTAFOL := V_QTPROGENTAFOL;
         OUT_RECORD.QTSALDOAF     := V_QTSALDOAF;
         OUT_RECORD.DTPROGENTAF   := NULL;
         OUT_RECORD.CDFILDEST     := NULL;
         OUT_RECORD.NMFILDEST     := NULL;
         OUT_RECORD.NRAUTOFORN    := NULL;
         OUT_RECORD.QTPROGENTAF   := 0;
         OUT_RECORD.QTACUMULADAF  := 0;
         OUT_RECORD.DTLIMENTRAFOL := NULL;
         OUT_RECORD.DTUTILIZA     := NULL;
         OUT_RECORD.CDPRODUTO     := C_DADOS_CAB.CDPRODUTO;
         OUT_RECORD.CDMARCA       := C_DADOS_CAB.CDMARCA;
         OUT_RECORD.CDPRODARVOL   := C_DADOS_CAB.CDPRODARVOL;
         OUT_RECORD.IDPARTCDMARCA := NULL;
         OUT_RECORD.QTDEAFOL      := 0;
         OUT_RECORD.IDFUNCAOFILI  := 'A';
         IF V_QTSALDOAF < 0 THEN
            IF V_CDARVPRODOL  <> C_DADOS_CAB.CDARVPRODOL THEN
               SELECT CALC_ESTOQ_CONS(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, SYSDATE+120)
                 INTO V_QTESTOQ
                 FROM DUAL;
               V_QTPROGITEMOL := V_QTESTOQ;
               V_CDARVPRODOL  := C_DADOS_CAB.CDARVPRODOL;
               V_QTACUMULADAF := 0;
               V_DTAFOL       := '1';
               V_QTPROGITEMOL_AUX := V_QTESTOQ;
            END IF;
            /*ALTERACAO DIA 08/02*/
            IF (V_CHAVE <> C_DADOS_CAB.CDARVPRODOL||TO_CHAR(C_DADOS_CAB.DTLIMENTRAFOL, 'DD/MM/YYYY') AND
               (C_DADOS_CAB.CDPRODUTO <> C_DADOS_CAB.CDPRODARVOL)) THEN
            SELECT CARREGA_PERIFILI_FUN(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, C_DADOS_CAB.MIN_DTLIMENTRAFOL)
              INTO V_MIN_DTLIMENTRAFOL
              FROM DUAL;
            SELECT CARREGA_PERIFILI_FUN(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, C_DADOS_CAB.MAX_DTLIMENTRAFOL)
              INTO V_MAX_DTLIMENTRAFOL
              FROM DUAL;
               V_CHAVE := '';
               SELECT NVL(MAX(QTPROGENTAF), 0)+V_QTPROGITEMOL_AUX, NVL(MAX(DTPROGENTAF), '_')
                 INTO V_QTPROGITEMOL_AUX, V_DTPROGENTAF_AUX
                 FROM (SELECT SUM(QTPROGENTAF) QTPROGENTAF, LISTAGG(TO_CHAR(DTPROGENTAF, 'DD/MM/YYYY'), '_') WITHIN
                                                    GROUP (ORDER BY TO_CHAR(DTPROGENTAF, 'DD/MM/YYYY')) DTPROGENTAF
                         FROM (SELECT SUM(ITEMAUTF.QTPROGENTAF-NVL(QTEFETENTRAF, 0)) QTPROGENTAF,
                                      CASE AUTOFORNE.IDTIPOLANCAF
                                         WHEN 'M'
                                         THEN ITEMAUTF.DTPROGENTAF
                                         ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                      END DTPROGENTAF
                                 FROM ITEMAUTF, AUTOFORNE
                                WHERE ITEMAUTF.CDFILDEST               = AUTOFORNE.CDFILDEST
                                  AND ITEMAUTF.CDFILLANC               = AUTOFORNE.CDFILLANC
                                  AND ITEMAUTF.NRAUTOFORN              = AUTOFORNE.NRAUTOFORN
                                  AND ITEMAUTF.CDFILDEST               = P_CDFILIOPELOG
                                  AND ITEMAUTF.CDPRODUTO               = C_DADOS_CAB.CDPRODUTO
                                  AND AUTOFORNE.CDOPERADOR             = C_DADOS_CAB.CDOPERADOR
                                  AND CASE AUTOFORNE.IDTIPOLANCAF
                                         WHEN 'M'
                                         THEN ITEMAUTF.DTPROGENTAF
                                         ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                      END  >=  TRUNC(SYSDATE)
                                  AND CASE AUTOFORNE.IDTIPOLANCAF
                                         WHEN 'M'
                                         THEN ITEMAUTF.DTPROGENTAF
                                         ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                      END <= C_DADOS_CAB.DTLIMENTRAFOL
                                  AND CASE AUTOFORNE.IDTIPOLANCAF
                                         WHEN 'M'
                                         THEN ITEMAUTF.DTPROGENTAF
                                         ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                      END BETWEEN V_MIN_DTLIMENTRAFOL AND V_MAX_DTLIMENTRAFOL
                                  AND NVL(AUTOFORNE.IDBAIXAAF, '1')   NOT IN ('2', '3', '4', '5')
                                  AND NVL(ITEMAUTF.IDBAIXITMAF, '1')   = '1'
                                  AND INSTR(V_DTAFOL, CASE AUTOFORNE.IDTIPOLANCAF
                                                         WHEN 'M'
                                                         THEN ITEMAUTF.DTPROGENTAF
                                                         ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                                      END) = 0
                                 GROUP BY CASE AUTOFORNE.IDTIPOLANCAF
                                             WHEN 'M'
                                             THEN ITEMAUTF.DTPROGENTAF
                                             ELSE NVL(ITEMAUTF.DTENTRITMSOL, ITEMAUTF.DTPROGENTAF)
                                          END));
               V_DTAFOL := V_DTAFOL||V_DTPROGENTAF_AUX;
               V_CHAVE := C_DADOS_CAB.CDARVPRODOL||TO_CHAR(C_DADOS_CAB.DTLIMENTRAFOL, 'DD/MM/YYYY');
            END IF;
            IF NVL(C_DADOS_CAB.QTPROGENTAF, 0) > 0 THEN
               IF V_QTPROGITEMOL_AUX > C_DADOS_CAB.QTPROGENTAF THEN
                  V_QTPROGENTAF      := 0;
                  V_QTPROGITEMOL_AUX := V_QTPROGITEMOL_AUX - C_DADOS_CAB.QTPROGENTAF;
               ELSE
                  IF V_QTPROGITEMOL_AUX <> 0 THEN
                     V_QTPROGENTAF := C_DADOS_CAB.QTPROGENTAF - V_QTPROGITEMOL_AUX;
                     V_QTPROGITEMOL_AUX := 0;
                  END IF;
               END IF;
               V_QTPROGITEMOL := V_QTPROGITEMOL - C_DADOS_CAB.QTPROGENTAF;
            END IF;
            --IF ((P_GERACMP = 'S') OR ((P_GERACMP = 'N') AND (V_QTPROGENTAF > 0))) THEN
               /*CONSIDERA PARTICULAREIDADE DE MARCA PREFERENCIAL E OBRIGATRIA DA FILIAL*/
                  SELECT NVL(MAX(CDTIPPART), 'N')
                    INTO V_IDPARTCDMARCA
                    FROM PARTFILI
                   WHERE CDFILIAL  = C_DADOS_CAB.CDFILDEST
                     AND CDPRODUTO = C_DADOS_CAB.CDPRODUTO
                     AND CDMARCA   = C_DADOS_CAB.CDMARCA
                     AND CDTIPPART IN ('1', '2');
                  IF V_IDPARTCDMARCA = 'N' THEN
                     /*SE TIVER CADASTRO DE MARCA RESTRITA GRAVA A MARCA QUE VIER COMO OBRIGATORIA*/
                     SELECT NVL(MAX(CDTIPPART), 'N')
                       INTO V_IDPARTCDMARCA
                       FROM PARTFILI
                      WHERE CDFILIAL  = C_DADOS_CAB.CDFILDEST
                        AND CDPRODUTO = C_DADOS_CAB.CDPRODUTO
                        AND CDMARCA   <> C_DADOS_CAB.CDMARCA
                        AND CDTIPPART = '3';
                     IF V_IDPARTCDMARCA = 'N' THEN
                        V_IDPARTCDMARCA := 'N';
                     ELSE
                        V_IDPARTCDMARCA := '1';
                     END IF;
                  ELSE
                     V_IDPARTCDMARCA := '1';
                  END IF;
               IF V_IDPARTCDMARCA  = 'N' THEN
                  SELECT NVL(MAX(CDMARCA), '')
                    INTO V_CDMARCAPADRAO
                    FROM FILIAL, PARASUPRI
                   WHERE FILIAL.CDFILIAL    = C_DADOS_CAB.CDFILDEST
                     AND PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL);
                  SELECT NVL(MAX(RELACPRODOL.CDPRODARVOL), C_DADOS_CAB.CDPRODARVOL), NVL(MAX(PRODUTO.CDARVPROD), C_DADOS_CAB.CDARVPRODOL)
                    INTO V_CDPRODARVOL_P, V_CDARVPROD_P
                    FROM RELACPRODOL, PRODUTO
                   WHERE RELACPRODOL.CDPRARVORIG = C_DADOS_CAB.CDPRODUTO
                     AND RELACPRODOL.CDMARCA     = V_CDMARCAPADRAO
                     AND RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODUTO;
                  OUT_RECORD.CDARVPROD     := V_CDARVPROD_P;
                  OUT_RECORD.CDPRODARVOL   := V_CDPRODARVOL_P;
               END  IF;

               V_QTACUMULADAF           := V_QTPROGITEMOL;
               OUT_RECORD.DTPROGENTAF   := C_DADOS_CAB.DTPROGENTAF;
               OUT_RECORD.CDFILDEST     := C_DADOS_CAB.CDFILDEST;
               OUT_RECORD.NMFILDEST     := C_DADOS_CAB.NMFILDEST;
               OUT_RECORD.NRAUTOFORN    := C_DADOS_CAB.NRAUTOFORN;

               OUT_RECORD.QTPROGENTAF   := V_QTPROGENTAF;
               OUT_RECORD.QTPROGENTAFAUX := C_DADOS_CAB.QTPROGENTAF;


               IF V_QTACUMULADAF < 0 THEN
                  OUT_RECORD.QTACUMULADAF  := V_QTACUMULADAF;
               ELSE
                  OUT_RECORD.QTACUMULADAF  := 0;
               END IF;
               OUT_RECORD.DTLIMENTRAFOL := C_DADOS_CAB.DTLIMENTRAFOL;
               OUT_RECORD.DTUTILIZA     := C_DADOS_CAB.DTUTILIZA;
               OUT_RECORD.IDPARTCDMARCA := V_IDPARTCDMARCA;
               /*Imprime AFs do OL*/
               V_QTDEAFOL := 0;
               PIPE ROW (OUT_RECORD);
            --END IF;
         ELSE
            IF C_DADOS_CAB.QTCDARVPROD = 1 THEN
               PIPE ROW (OUT_RECORD);
            END IF;
         END IF;
         V_QTESTOQ       := V_QTESTOQ;
         V_QTPROGENTCONS := C_DADOS_CAB.QTPROGENTCONS;
         V_QTSOLIPROD    := C_DADOS_CAB.QTSOLIPROD;
      END IF;
   END LOOP;
   RETURN;
END;
/

CREATE OR REPLACE FUNCTION CALC_NECESSIDADE_OL
                          (P_CDFILIOPELOG    IN ITEMAUTF.CDFILDEST%TYPE,
                           P_DTINICIAL       IN DATE,
                           P_DTFINAL         IN DATE,
                           P_DTINICIALAF     IN DATE,
                           P_DTFINALAF       IN DATE,
                           P_CDOPERADOR      IN VARCHAR2,
                           P_CDREGIAO        IN VARCHAR2,
                           P_CDPRODINIC      IN PRODUTO.CDARVPROD%TYPE,
                           P_CDPRODFIN       IN PRODUTO.CDARVPROD%TYPE,
                           P_TIPOCONSULTA    IN VARCHAR2,
                           P_GERACMP         IN VARCHAR2)
                          RETURN CALC_NECESSIDADE_OL_TABLE PIPELINED IS
   OUT_RECORD CALC_NECESSIDADE_OL_TYPE := CALC_NECESSIDADE_OL_TYPE (NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                                                                    NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0,
                                                                    NULL, NULL, NULL, NULL, 0, 0, NULL, NULL,
                                                                    NULL, NULL, NULL, NULL, NULL, 0, NULL, 0);

   V_CDPRODINIC       VARCHAR2(20);
   V_CDPRODFIN        VARCHAR2(20);
BEGIN

   SELECT NVL(MIN(PRODUTO.CDARVPROD), '0')
     INTO V_CDPRODINIC
     FROM RELACPRODOL, PRODUTO PRODUTOOL, PRODUTO
    WHERE RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
      AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
      AND PRODUTOOL.CDARVPROD BETWEEN P_CDPRODINIC AND P_CDPRODFIN;

   SELECT NVL(MAX(PRODUTO.CDARVPROD), 'Z')
     INTO V_CDPRODFIN
     FROM RELACPRODOL, PRODUTO PRODUTOOL, PRODUTO
    WHERE RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
      AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
      AND PRODUTOOL.CDARVPROD BETWEEN P_CDPRODINIC AND P_CDPRODFIN;

   FOR C_COMPRADOR_CAB IN(SELECT COMPRADOR.CDOPERADOR
                            FROM COMPRADOR
                           WHERE ((INSTR(P_CDOPERADOR, COMPRADOR.CDOPERADOR) > 0) OR (P_CDOPERADOR = 'T'))
                             AND EXISTS (SELECT  /*+ FIRST_ROWS(1) */
                                                1
                                           FROM PRODCOMP, PRODUTO PR, PRODUTO
                                          WHERE PRODCOMP.CDOPERADOR = COMPRADOR.CDOPERADOR
                                            AND PRODCOMP.CDPRODUTO  = PR.CDPRODUTO
                                            AND PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%'
                                            AND PRODUTO.CDARVPROD BETWEEN V_CDPRODINIC AND V_CDPRODFIN)
                                            )
   LOOP

      FOR C_DADOS_CAB IN (SELECT CDFILIALOL, NMFILIALOL, DTINICIAL, DTFINAL, DTINICIALAF, DTFINALAF, CDREGIAO, NMREGIAO,
                          CDOPERADOR, NMOPERADOR, CDARVPROD, NMPRODUTO, QTESTOQ, QTPROGENTCONS, QTSOLIPROD,
                          QTPROGENTAFOL, QTSALDOAF, DTPROGENTAF, CDFILDEST, NMFILDEST, NRAUTOFORN, QTPROGENTAF,
                          QTACUMULADAF, DTLIMENTRAFOL, DTUTILIZA, SGUNIDADE, CDPRODUTO, CDMARCA, CDPRODARVOL,
                          IDPARTCDMARCA, QTDEAFOL, IDFUNCAOFILI, QTPROGENTAFAUX
                          FROM TABLE (CALC_NECESS_OL
                             (P_CDFILIOPELOG,
                              P_DTINICIAL,
                              P_DTFINAL,
                              P_DTINICIALAF,
                              P_DTFINALAF,
                              C_COMPRADOR_CAB.CDOPERADOR,
                              P_CDREGIAO,
                              P_CDPRODINIC,
                              P_CDPRODFIN,
                              P_TIPOCONSULTA,
                              P_GERACMP)))
      LOOP
         OUT_RECORD.CDFILIALOL    := C_DADOS_CAB.CDFILIALOL;
         OUT_RECORD.NMFILIALOL    := C_DADOS_CAB.NMFILIALOL;
         OUT_RECORD.DTINICIAL     := C_DADOS_CAB.DTINICIAL;
         OUT_RECORD.DTFINAL       := C_DADOS_CAB.DTFINAL;
         OUT_RECORD.DTINICIALAF   := C_DADOS_CAB.DTINICIALAF;
         OUT_RECORD.DTFINALAF     := C_DADOS_CAB.DTFINALAF;
         OUT_RECORD.CDREGIAO      := C_DADOS_CAB.CDREGIAO;
         OUT_RECORD.NMREGIAO      := C_DADOS_CAB.NMREGIAO;
         OUT_RECORD.CDOPERADOR    := C_DADOS_CAB.CDOPERADOR;
         OUT_RECORD.NMOPERADOR    := C_DADOS_CAB.NMOPERADOR;
         OUT_RECORD.CDARVPROD     := C_DADOS_CAB.CDARVPROD;
         OUT_RECORD.NMPRODUTO     := C_DADOS_CAB.NMPRODUTO;
         OUT_RECORD.SGUNIDADE     := C_DADOS_CAB.SGUNIDADE;
         OUT_RECORD.QTESTOQ       := C_DADOS_CAB.QTESTOQ;
         OUT_RECORD.QTPROGENTCONS := C_DADOS_CAB.QTPROGENTCONS;
         OUT_RECORD.QTSOLIPROD    := C_DADOS_CAB.QTSOLIPROD;
         OUT_RECORD.QTPROGENTAFOL := C_DADOS_CAB.QTPROGENTAFOL;
         OUT_RECORD.QTSALDOAF     := C_DADOS_CAB.QTSALDOAF;
         OUT_RECORD.DTPROGENTAF   := C_DADOS_CAB.DTPROGENTAF;
         OUT_RECORD.CDFILDEST     := C_DADOS_CAB.CDFILDEST;
         OUT_RECORD.NMFILDEST     := C_DADOS_CAB.NMFILDEST;
         OUT_RECORD.NRAUTOFORN    := C_DADOS_CAB.NRAUTOFORN;
         OUT_RECORD.QTPROGENTAF   := C_DADOS_CAB.QTPROGENTAF;
         OUT_RECORD.QTACUMULADAF  := C_DADOS_CAB.QTACUMULADAF;
         OUT_RECORD.DTLIMENTRAFOL := C_DADOS_CAB.DTLIMENTRAFOL;
         OUT_RECORD.DTUTILIZA     := C_DADOS_CAB.DTUTILIZA;
         OUT_RECORD.CDPRODUTO     := C_DADOS_CAB.CDPRODUTO;
         OUT_RECORD.CDMARCA       := C_DADOS_CAB.CDMARCA;
         OUT_RECORD.CDPRODARVOL   := C_DADOS_CAB.CDPRODARVOL;
         OUT_RECORD.IDPARTCDMARCA := C_DADOS_CAB.IDPARTCDMARCA;
         OUT_RECORD.QTDEAFOL      := C_DADOS_CAB.QTDEAFOL;
         OUT_RECORD.IDFUNCAOFILI  := C_DADOS_CAB.IDFUNCAOFILI;
         OUT_RECORD.QTPROGENTAFAUX  := C_DADOS_CAB.QTPROGENTAFAUX;
         PIPE ROW (OUT_RECORD);
      END LOOP;
   END LOOP;
   RETURN;
END;
/