DROP TYPE QUERY_ITEMSOLI_CMP06900_TABLE
/

DROP TYPE QUERY_ITEMSOLI_CMP06900_TYPE
/

CREATE TYPE QUERY_ITEMSOLI_CMP06900_TYPE AS
OBJECT(CALC            VARCHAR2(1),
       CDFILSOLI       VARCHAR2(4),
       CDFILLAN        VARCHAR2(4),
       NRSOLICMP       VARCHAR2(10),
       CDPRODUTO       VARCHAR2(10),
       CDARVPROD       VARCHAR2(20),
       NMPRODUTO       VARCHAR2(50),
       SGUNIDADE       VARCHAR2(10),
       NRSEQUCONSOL    VARCHAR2(10),
       IDUTPRORIGOBRIG VARCHAR2(1),
       IDTIPLAN        VARCHAR2(1),
       DTPROGENTR      DATE,
       DTSOLCMP        DATE,
       QTSOLIORIG      FLOAT,
       QTSOLIPROD      FLOAT);
/

CREATE TYPE QUERY_ITEMSOLI_CMP06900_TABLE AS TABLE OF QUERY_ITEMSOLI_CMP06900_TYPE
/

CREATE OR REPLACE FUNCTION QUERY_ITEMSOLI_CMP06900(P_TCDFILIAL     IN VARCHAR2,
                                                   P_CDFILIAL     IN VARCHAR2,
                                                   P_CDGRUPFILI   IN VARCHAR2,
                                                   P_DTINICIAL    IN DATE,
                                                   P_DTFINAL      IN DATE,
                                                   P_TSOLICITA    IN VARCHAR2,
                                                   P_DTENTRINI    IN DATE,
                                                   P_DTENTRFIN    IN DATE,
                                                   P_TENTREGA     IN VARCHAR2,
                                                   P_COMPRADOR    IN VARCHAR2,
                                                   P_CDCOMPRADOR  IN VARCHAR2,
                                                   P_DESTINO      IN VARCHAR2,
                                                   P_CDPRODUTO    IN VARCHAR2,
                                                   P_CDDESTINO    IN VARCHAR2,
                                                   P_CDOPERADOR   IN VARCHAR2) RETURN QUERY_ITEMSOLI_CMP06900_TABLE PIPELINED
IS
   OUT_RECORD QUERY_ITEMSOLI_CMP06900_TYPE := QUERY_ITEMSOLI_CMP06900_TYPE (NULL, NULL, NULL, NULL, NULL,
                                                                            NULL, NULL, NULL, NULL, NULL,
                                                                            NULL, NULL, NULL, 0, 0);
BEGIN
   FOR C_FILIAL IN (SELECT FILIAL.CDFILIAL, NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL) CDFILCENTCMP
                      FROM FILIAL
                     WHERE NVL(FILIAL.IDCNTRRESC, 'N') <> 'S'
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0)  OR (P_TCDFILIAL = 'T'))
                       AND ((P_CDGRUPFILI IS NULL)
                        OR EXISTS (SELECT 1
                                     FROM FILGRUPFILI
                                    WHERE FILGRUPFILI.CDGRUPFILI =  P_CDGRUPFILI
                                      AND FILGRUPFILI.CDFILIAL   = FILIAL.CDFILIAL )))
   LOOP
      FOR C_ITEM IN(SELECT ITEMSOLI.CDFILSOLI, ITEMSOLI.CDFILLAN, ITEMSOLI.NRSOLICMP, ITEMSOLI.DTPROGENTR, ITEMSOLI.CDPRODUTO,
                           PRODUTO.CDARVPROD,PRODUTO.NMPRODUTO, ITEMSOLI.QTSOLIPROD, SOLICITA.DTSOLCMP, PRODUTO.SGUNIDADE,
                           ITEMSOLI.QTSOLIORIG, ITEMSOLI.NRSEQUCONSOL, PRODFILI.IDUTPRORIGOBRIG, SOLICITA.IDTIPLAN
                      FROM ITEMSOLI, SOLICITA, PRODUTO,
                           PARCMPSUP, PARASUPRI, PRODFILI
                     WHERE (PARCMPSUP.CDFILIAL = SOLICITA.CDFILSOLI)
                       AND (C_FILIAL.CDFILIAL = SOLICITA.CDFILSOLI)
                       AND (ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO)
                       AND (PRODUTO.CDPRODUTO  = P_CDPRODUTO)
                       AND ((ITEMSOLI.DTPROGENTR BETWEEN P_DTENTRINI  AND P_DTENTRFIN) OR (P_TENTREGA = 'T'))
                       AND (ITEMSOLI.CDFILSOLI = SOLICITA.CDFILSOLI)
                       AND (ITEMSOLI.CDFILLAN  = SOLICITA.CDFILLANCA)
                       AND (ITEMSOLI.NRSOLICMP = SOLICITA.NRSOLICMP)
                       AND (INSTR(P_COMPRADOR, SOLICITA.CDOPERADOR) <> 0 OR P_CDCOMPRADOR = 'T')
                       AND (INSTR(P_DESTINO, SOLICITA.CDDESTSOLI) <> 0   OR P_CDDESTINO   = 'T')
                       AND ((SOLICITA.DTSOLCMP BETWEEN P_DTINICIAL    AND P_DTFINAL)   OR (P_TSOLICITA = 'T'))
                       AND C_FILIAL.CDFILCENTCMP  = (PARASUPRI.CDFILIAL)
                       AND ((NVL(PARASUPRI.IDBLOQALTSOLAUT, 'N') = 'N') OR (SOLICITA.IDTIPLAN <> 'A')
                        OR  (PARASUPRI.IDBLOQALTSOLAUT = 'S'
                       AND SOLICITA.IDTIPLAN = 'A' AND EXISTS (SELECT 1
                                                                 FROM AUTGRUPOPSOLI AUT INNER JOIN OPERGRUPOP OPP ON AUT.CDGRUPOPER = OPP.CDGRUPOPER
                                                                WHERE AUT.IDAUTALTEPRODSOLI IS NOT NULL
                                                                  AND OPP.CDOPERADOR = SOLICITA.CDOPERLANC)))
                        AND ((NVL(PARCMPSUP.IDUTLOPERSOL,    'N') = 'N') OR (SOLICITA.CDOPERLANC = P_CDOPERADOR))
                        AND ((NVL(PARCMPSUP.IDUTAPROVSOL,    'N') = 'N') OR (SUBSTR(NVL(PARCMPSUP.IDPERALTSAPR, 'NNN'), 2, 1) = 'S')
                         OR (NVL(ITEMSOLI.IDSOLIAPROV, 'S') = 'N'))
                        AND (ITEMSOLI.CDFILSOLI = PRODFILI.CDFILIAL)
                        AND (ITEMSOLI.CDPRODUTO = PRODFILI.CDPRODUTO)
                      ORDER BY ITEMSOLI.CDFILSOLI, ITEMSOLI.NRSOLICMP DESC, ITEMSOLI.DTPROGENTR DESC)
      LOOP
         OUT_RECORD.CALC            := 'N';
         OUT_RECORD.CDFILSOLI       := C_ITEM.CDFILSOLI;
         OUT_RECORD.CDFILLAN        := C_ITEM.CDFILLAN;
         OUT_RECORD.NRSOLICMP       := C_ITEM.NRSOLICMP;
         OUT_RECORD.CDPRODUTO       := C_ITEM.CDPRODUTO;
         OUT_RECORD.CDARVPROD       := C_ITEM.CDARVPROD;
         OUT_RECORD.NMPRODUTO       := C_ITEM.NMPRODUTO;
         OUT_RECORD.SGUNIDADE       := C_ITEM.SGUNIDADE;
         OUT_RECORD.NRSEQUCONSOL    := C_ITEM.NRSEQUCONSOL;
         OUT_RECORD.IDUTPRORIGOBRIG := C_ITEM.IDUTPRORIGOBRIG;
         OUT_RECORD.IDTIPLAN        := C_ITEM.IDTIPLAN;
         OUT_RECORD.DTPROGENTR      := C_ITEM.DTPROGENTR;
         OUT_RECORD.DTSOLCMP        := C_ITEM.DTSOLCMP;
         OUT_RECORD.QTSOLIORIG      := C_ITEM.QTSOLIORIG;
         OUT_RECORD.QTSOLIPROD      := C_ITEM.QTSOLIPROD;
         PIPE ROW (OUT_RECORD);
      END LOOP;
   END LOOP;
END;
/