DROP TYPE CALC_PRE_ITEMAUTF_OL_TABLE
/

DROP TYPE CALC_PRE_ITEMAUTF_OL_TYPE
/

CREATE TYPE CALC_PRE_ITEMAUTF_OL_TYPE AS OBJECT
  (CDFILIALOL     VARCHAR2(4),
   NMFILIALOL     VARCHAR2(30),
   CDREGIAO       VARCHAR2(3),
   NMREGIAO       VARCHAR2(30),
   CDOPERADOR     VARCHAR2(12),
   NMOPERADOR     VARCHAR2(40),
   CDARVPRODOL    VARCHAR2(20),
   NMPRODUTOOL    VARCHAR2(50),
   SGUNIDADEOL    VARCHAR2(10),
   CDPRARVORIG    VARCHAR2(10),
   CDMARCA        VARCHAR2(5),
   CDPRODARVOL    VARCHAR2(10),
   CDFILDEST      VARCHAR2(4),
   NMFILDEST      VARCHAR2(30),
   NRAUTOFORN     VARCHAR2(35),
   CDPRODUTO      VARCHAR2(10),
   CDARVPROD      VARCHAR2(20),
   IDEXISTEAF     VARCHAR2(1),
   DTPROGENTAF    DATE,
   DTUTILIZA      DATE,
   DTLIMENTRAFOL  DATE,
   NRLIMISEGU     FLOAT,
   QTPROGENTAF    FLOAT,
   QTESTOQ        FLOAT,
   QTPROGENTCONS  FLOAT,
   QTSOLIPROD     FLOAT
)
/

CREATE TYPE CALC_PRE_ITEMAUTF_OL_TABLE AS TABLE OF CALC_PRE_ITEMAUTF_OL_TYPE
/

CREATE OR REPLACE FUNCTION CALC_PRE_ITEMAUTF_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_PRE_ITEMAUTF_OL_TABLE PIPELINED IS
   OUT_RECORD CALC_PRE_ITEMAUTF_OL_TYPE := CALC_PRE_ITEMAUTF_OL_TYPE (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);

   V_CDPRODINIC       VARCHAR2(20);
   V_CDPRODFIN        VARCHAR2(20);
   V_CHAVE            VARCHAR2(100) := '_';
   V_NRLIMISEGU       FLOAT;
   V_DTLIMENTRAFOL    DATE;
   V_DTLIMENTRAFOL_1  DATE;
BEGIN
   FOR C_DADOS_CAB IN (SELECT CDFILIALOL, NMFILIALOL,
                              CDREGIAO, NMREGIAO, CDOPERADOR, NMOPERADOR,
                              CDARVPRODOL, NMPRODUTOOL, SGUNIDADEOL,
                              0 QTESTOQ,
                              SUM(QTPROGENTCONS) OVER (PARTITION BY CDARVPRODOL) QTPROGENTCONS,
                              0 QTSOLIPROD, CDPRARVORIG, CDMARCA, CDPRODARVOL, CDARVPROD,
                              CDFILDEST, NMFILDEST, NRAUTOFORN, CDPRODUTO,
                              QTPROGENTAF, DTPROGENTAF,
                              DTUTILIZA,
                              NRLIMISEGU, --CARREGA_LIMISEGU_OLP(P_CDFILIOPELOG, CDARVPRODOL, DTPROGENTAF) NRLIMISEGU,
                              IDEXISTEAF,
                              (SELECT MAX(B.CDARVPROD)
                                 FROM PERFILPROD A, PRODUTO B
                                WHERE A.CDPRODUTO = B.CDPRODUTO
                                  AND A.CDFILIAL  = P_CDFILIOPELOG
                                  AND INSTR(CDARVPRODOL, B.CDARVPROD) = 1) MAX_CDARVPROD
                         FROM TABLE(CALC_ITEMAUTF_OL (P_CDFILIOPELOG, P_DTINICIALAF, P_DTFINALAF, P_CDOPERADOR,
                                                      P_CDREGIAO, P_CDPRODINIC, P_CDPRODFIN, P_GERACMP))
                       UNION ALL
                       SELECT CDFILIALOL, NMFILIALOL,
                              CDREGIAO, NMREGIAO, CDOPERADOR, NMOPERADOR,
                              PREVIANECE.CDARVPROD CDARVPRODOL, PREVIANECE.NMPRODUTO NMPRODUTOOL, PREVIANECE.SGUNIDADE SGUNIDADEOL,
                              0 QTESTOQ,
                              0 QTPROGENTCONS,
                              SUM(CASE MOD(PREVIANECE.QTPROGENTAF, CASE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                      WHEN 0
                                                                      THEN 1
                                                                      ELSE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                   END)
                                     WHEN 0
                                     THEN PREVIANECE.QTPROGENTAF
                                     ELSE CEIL((PREVIANECE.QTPROGENTAF) / CASE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                                                WHEN 0
                                                                                                THEN 1
                                                                                                ELSE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                                             END)*CASE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                                                     WHEN 0
                                                                                                     THEN 1
                                                                                                     ELSE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                                                  END
                                  END
                                 )  OVER (PARTITION BY PREVIANECE.CDARVPROD) QTSOLIPROD,
                              CDPRARVORIG, CDMARCA, CDPRODARVOL, PREVIANECE.CDARVPRODORIG CDARVPROD,
                              CDFILDEST, NMFILDEST, '**********' NRAUTOFORN, PREVIANECE.CDPRARVORIG CDPRODUTO,
                              CASE MOD(PREVIANECE.QTPROGENTAF, CASE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                  WHEN 0
                                                                  THEN 1
                                                                  ELSE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                END)
                                 WHEN 0
                                 THEN PREVIANECE.QTPROGENTAF
                                 ELSE (CEIL((PREVIANECE.QTPROGENTAF)) / CASE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                                                WHEN 0
                                                                                                THEN 1
                                                                                                ELSE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                                             END)*CASE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                                                     WHEN 0
                                                                                                     THEN 1
                                                                                                     ELSE NVL(PREVIANECE.VRARREDCMP, 1)
                                                                                                  END
                              END QTPROGENTAF,
                              DTPROGENTAF, DTUTILIZA, CARREGA_LIMISEGU_OL(P_CDFILIOPELOG, PREVIANECE.CDARVPROD, DTPROGENTAF) NRLIMISEGU,
                              'N' IDEXISTEAF,
                              (SELECT MAX(B.CDARVPROD)
                                 FROM PERFILPROD A, PRODUTO B
                                WHERE A.CDPRODUTO = B.CDPRODUTO
                                  AND A.CDFILIAL  = P_CDFILIOPELOG
                                  AND INSTR(PREVIANECE.CDARVPROD, B.CDARVPROD) = 1) MAX_CDARVPROD
                         FROM TABLE(CALC_PREVIANECE_OL(P_CDFILIOPELOG, P_DTINICIAL, P_DTFINAL, P_CDPRODINIC,
                              P_CDPRODFIN, P_CDOPERADOR, P_CDREGIAO, P_TIPOCONSULTA, P_DTINICIAL, P_DTFINAL)) PREVIANECE
                       ORDER BY MAX_CDARVPROD, DTPROGENTAF, CDARVPRODOL)
   LOOP
      V_DTLIMENTRAFOL_1 := C_DADOS_CAB.DTPROGENTAF-C_DADOS_CAB.NRLIMISEGU;
      IF V_CHAVE <> C_DADOS_CAB.MAX_CDARVPROD||C_DADOS_CAB.DTPROGENTAF THEN
         SELECT MAX(CARREGA_PERIFILI_FUN(P_CDFILIOPELOG, C_DADOS_CAB.CDARVPRODOL, V_DTLIMENTRAFOL_1, C_DADOS_CAB.MAX_CDARVPROD))
           INTO V_DTLIMENTRAFOL
           FROM DUAL;
         V_CHAVE := C_DADOS_CAB.MAX_CDARVPROD||C_DADOS_CAB.DTPROGENTAF;
      END IF;
      OUT_RECORD.CDFILIALOL     := C_DADOS_CAB.CDFILIALOL;
      OUT_RECORD.NMFILIALOL     := C_DADOS_CAB.NMFILIALOL;
      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.CDARVPRODOL    := C_DADOS_CAB.CDARVPRODOL;
      OUT_RECORD.NMPRODUTOOL    := C_DADOS_CAB.NMPRODUTOOL;
      OUT_RECORD.SGUNIDADEOL    := C_DADOS_CAB.SGUNIDADEOL;
      OUT_RECORD.CDPRARVORIG    := C_DADOS_CAB.CDPRARVORIG;
      OUT_RECORD.CDMARCA        := C_DADOS_CAB.CDMARCA;
      OUT_RECORD.CDPRODARVOL    := C_DADOS_CAB.CDPRODARVOL;
      OUT_RECORD.CDFILDEST      := C_DADOS_CAB.CDFILDEST;
      OUT_RECORD.NMFILDEST      := C_DADOS_CAB.NMFILDEST;
      OUT_RECORD.NRAUTOFORN     := C_DADOS_CAB.NRAUTOFORN;
      OUT_RECORD.CDPRODUTO      := C_DADOS_CAB.CDPRODUTO;
      OUT_RECORD.CDARVPROD      := C_DADOS_CAB.CDARVPROD;
      OUT_RECORD.IDEXISTEAF     := C_DADOS_CAB.IDEXISTEAF;
      OUT_RECORD.DTPROGENTAF    := C_DADOS_CAB.DTPROGENTAF;
      OUT_RECORD.DTUTILIZA      := C_DADOS_CAB.DTUTILIZA;
      OUT_RECORD.DTLIMENTRAFOL  := V_DTLIMENTRAFOL;
      OUT_RECORD.NRLIMISEGU     := C_DADOS_CAB.NRLIMISEGU;
      OUT_RECORD.QTPROGENTAF    := C_DADOS_CAB.QTPROGENTAF;
      OUT_RECORD.QTESTOQ        := C_DADOS_CAB.QTESTOQ;
      OUT_RECORD.QTPROGENTCONS  := C_DADOS_CAB.QTPROGENTCONS;
      OUT_RECORD.QTSOLIPROD     := C_DADOS_CAB.QTSOLIPROD;
      PIPE ROW (OUT_RECORD);
   END LOOP;
   RETURN;
END;
/