DROP TYPE EMISSAO_OL_1_TABLE
/

DROP TYPE EMISSAO_OL_1_TYPE
/

CREATE TYPE EMISSAO_OL_1_TYPE AS
   OBJECT(CDFILDEST     VARCHAR2(4),
          CDFILLANC     VARCHAR2(4),
          NRAUTOFORN    VARCHAR2(10),
          CDPRODUTO     VARCHAR2(10),
          NMPRODUTO     VARCHAR2(50),
          CDMARCA       VARCHAR2(5),
          CDFILIOPELOG  VARCHAR2(4),
          NMFILIAL      VARCHAR2(30),
          NMFILDEST     VARCHAR2(30) ,
          SGUNIDADE     VARCHAR2(10),
          CDARVPROD     VARCHAR2(20),
          DTNOVAENTRAF  DATE,
          DTPROGENTAF   DATE,
          NRPRIORIDADE  NUMBER,
          QTPROGENTAF   FLOAT,
          QTNOVAPROGAF  FLOAT)
/

CREATE TYPE EMISSAO_OL_1_TABLE AS TABLE OF EMISSAO_OL_1_TYPE
/ 

CREATE OR REPLACE FUNCTION EMISSAO_OL_1(P_CDPRODINI   IN VARCHAR2,
                                        P_CDPRODFIN   IN VARCHAR2,
                                        P_CDFILIOL    IN VARCHAR2,
                                        P_TCDFILIOL   IN VARCHAR2,
                                        P_CDFILIAL    IN VARCHAR2,
                                        P_TCDFILIAL   IN VARCHAR2,
                                        P_SUBGRUPO    IN VARCHAR2,
                                        P_CDGRUPPROD  IN VARCHAR2,
                                        P_DTENTRINI   IN DATE,
                                        P_DTENTRFIN   IN DATE,
                                        P_TDTENTR     IN VARCHAR2,
                                        P_CDOPERADOR  IN VARCHAR2,
                                        P_TPRODUTO    IN VARCHAR2,
                                        P_TROTA       IN VARCHAR2,
                                        P_ROTA        IN VARCHAR2,
                                        P_IDPEDEXTRA  IN VARCHAR2 ) RETURN EMISSAO_OL_1_TABLE PIPELINED
IS


   OUT_RECORD EMISSAO_OL_1_TYPE := EMISSAO_OL_1_TYPE (NULL, NULL, NULL, NULL, NULL, NULL,
                                                      NULL, NULL, NULL, NULL, NULL, NULL,
                                                      NULL, 0, 0, 0);
BEGIN
   FOR C_FILIAL IN (SELECT TIPOOPEROPL.CDFILDEST, TIPOOPEROPL.CDFILIOPELOG
                      FROM TIPOOPEROPL
                     WHERE (INSTR(P_CDFILIOL, TIPOOPEROPL.CDFILIOPELOG) <> 0 OR P_TCDFILIOL = 'T')
                       AND (INSTR(P_CDFILIAL, TIPOOPEROPL.CDFILDEST) <> 0 OR P_TCDFILIAL = 'T'))
   LOOP
      FOR C_ITEM IN (SELECT
                     ITEMAUTF.CDFILDEST,
                     ITEMAUTF.CDFILLANC,
                     ITEMAUTF.NRAUTOFORN,
                     ITEMAUTF.CDPRODUTO,
                     PRODUTO.NMPRODUTO,
                     ITEMAUTF.CDMARCA,
                     ITEMAUTF.DTPROGENTAF,
                     ITEMAUTF.QTPROGENTAF,
                     AUTOFORNE.CDFILIOPELOG,
                     FILIAL.NMFILIAL,
                     FILDEST.NMFILIAL NMFILDEST,
                     PRODUTO.SGUNIDADE,
                     PRODUTO.CDARVPROD,
                     1 NRPRIORIDADE,
                     ITEMAUTF.DTNOVAENTRAF,
                     ITEMAUTF.QTNOVAPROGAF
                  FROM PRODUTO, AUTOFORNE, ITEMAUTF, FILIAL, FILIAL FILDEST
                  WHERE ITEMAUTF.CDFILDEST     = AUTOFORNE.CDFILDEST
                    AND ITEMAUTF.CDFILLANC     = AUTOFORNE.CDFILLANC
                    AND ITEMAUTF.NRAUTOFORN    = AUTOFORNE.NRAUTOFORN
                    AND ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO
                    AND ITEMAUTF.CDFILDEST     = FILDEST.CDFILIAL
                    AND ITEMAUTF.IDBAIXITAFS   IS NULL
                    AND AUTOFORNE.CDFILIOPELOG = FILIAL.CDFILIAL
                    AND NVL(ITEMAUTF.IDITMSEPARADO, 'N') = 'N'
                    AND NVL(AUTOFORNE.IDBAIXAAF,'1') NOT IN ('2','3','4','5','6')
                    AND AUTOFORNE.IDAFOPERLOG = '2'
                    AND NVL(AUTOFORNE.IDAFEXPIRADA,'N') = 'N'
                    AND ITEMAUTF.IDBAIXITMAF IS NULL

                    AND ((P_CDOPERADOR = 'T') OR
                         EXISTS (SELECT 1
                                   FROM FILIOPER
                                  WHERE FILIOPER.CDOPERADOR = P_CDOPERADOR
                                    AND FILIOPER.CDFILIAL   = ITEMAUTF.CDFILDEST)
                         )
                    AND ((PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND P_CDPRODFIN) OR (P_TPRODUTO = 'T'))
                    AND NVL(AUTOFORNE.CDFILIOPELOG, 'W') = C_FILIAL.CDFILIOPELOG
                    AND ITEMAUTF.CDFILDEST     = C_FILIAL.CDFILDEST
                    AND ((P_SUBGRUPO = 'N') OR
                         (EXISTS(SELECT 1
                                   FROM PRSUBGRPROD
                                  WHERE PRSUBGRPROD.CDGRUPPROD = P_CDGRUPPROD
                                    AND PRSUBGRPROD.CDPRODUTO  = ITEMAUTF.CDPRODUTO
                                    AND INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                 )
                         )
                        )
                    AND ((P_TROTA = 'T') OR
                         EXISTS (SELECT 1
                                   FROM FILIALROTA
                                  WHERE FILIALROTA.CDFILIROTA = ITEMAUTF.CDFILDEST
                                    AND INSTR(P_ROTA, FILIALROTA.CDROTATRANS) > 0)
                         )
                    AND ((ITEMAUTF.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTR = 'T'))
                    AND ((AUTOFORNE.IDAUTOFORNEX = P_IDPEDEXTRA)  OR (P_IDPEDEXTRA   = 'T'))
                    AND ITEMAUTF.QTATENDPEDOL IS NULL
                    ORDER BY
                     AUTOFORNE.CDFILIOPELOG,
                     PRODUTO.CDARVPROD,
                     ITEMAUTF.CDMARCA,
                     NRPRIORIDADE,
                     ITEMAUTF.QTPROGENTAF,
                     ITEMAUTF.DTPROGENTAF,
                     ITEMAUTF.CDFILLANC,
                     ITEMAUTF.CDFILDEST,
                     ITEMAUTF.NRAUTOFORN) LOOP

         OUT_RECORD.CDFILDEST      := C_ITEM.CDFILDEST;
         OUT_RECORD.CDFILLANC      := C_ITEM.CDFILLANC;
         OUT_RECORD.NRAUTOFORN     := C_ITEM.NRAUTOFORN;
         OUT_RECORD.CDPRODUTO      := C_ITEM.CDPRODUTO;
         OUT_RECORD.NMPRODUTO      := C_ITEM.NMPRODUTO;
         OUT_RECORD.CDMARCA        := C_ITEM.CDMARCA;

         OUT_RECORD.DTPROGENTAF    := C_ITEM.DTPROGENTAF;
         OUT_RECORD.QTPROGENTAF    := C_ITEM.QTPROGENTAF;
         OUT_RECORD.CDFILIOPELOG   := C_ITEM.CDFILIOPELOG;
         OUT_RECORD.NMFILIAL       := C_ITEM.NMFILIAL;
         OUT_RECORD.NMFILDEST      := C_ITEM.NMFILDEST;
         OUT_RECORD.SGUNIDADE      := C_ITEM.SGUNIDADE;

         OUT_RECORD.CDARVPROD      := C_ITEM.CDARVPROD;
         OUT_RECORD.NRPRIORIDADE   := C_ITEM.NRPRIORIDADE;
         OUT_RECORD.DTNOVAENTRAF   := C_ITEM.DTNOVAENTRAF;
         OUT_RECORD.QTNOVAPROGAF   := C_ITEM.QTNOVAPROGAF;

         PIPE ROW (OUT_RECORD);
      END LOOP;
   END LOOP;
END;
/