CREATE OR REPLACE FUNCTION QRY_ITEMSOLI_CMP06900_W(P_CDFILIAL     IN VARCHAR2,
                                                   P_CDAGRUPFILI  IN VARCHAR2,
                                                   P_DTSOLINI     IN DATE,
                                                   P_DTSOLFIN     IN DATE,
                                                   P_TSOLICITA    IN VARCHAR2,
                                                   P_DTENTRINI    IN DATE,
                                                   P_DTENTRFIN    IN DATE,
                                                   P_TENTREGA     IN VARCHAR2,
                                                   P_NRSOLICMP    IN VARCHAR2,
                                                   P_CDGRUPROD    IN VARCHAR2,
                                                   P_CDPRODINI    IN VARCHAR2,
                                                   P_CDPRODFIN    IN VARCHAR2,
                                                   P_TPRODUTO     IN VARCHAR2,
                                                   P_CDOPERADOR   IN VARCHAR2,
                                                   P_ED           IN VARCHAR2,
                                                   P_OL           IN VARCHAR2,
                                                   NRORG          IN VARCHAR2  DEFAULT NULL,
                                                   P_CDCOMPRADOR  IN VARCHAR2 DEFAULT NULL,
                                                   P_CDDESTINO    IN VARCHAR2 DEFAULT NULL) RETURN QRY_ITEMSOLI_CMP06900_W_TABLE PIPELINED
IS
   OUT_RECORD QRY_ITEMSOLI_CMP06900_W_TYPE := QRY_ITEMSOLI_CMP06900_W_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, 0, 0, 0, 0, 0, 0, 0);
   V_NMMARCA  VARCHAR2(20);
   V_IDRESTRFILIOPER    PARAMGERAL.IDRESTRFILIOPER%TYPE;
BEGIN
   SELECT NVL(MAX(PARAMGERAL.IDRESTRFILIOPER), 'N')
     INTO V_IDRESTRFILIOPER
     FROM PARAMGERAL;
   FOR C_FILIAL IN (SELECT FILIAL.CDFILIAL, NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL) CDFILCENTCMP,
                           FILIAL.CDFILIAL|| ' - '||FILIAL.NMFILIAL SOLICITANTE, FILIAL.IDFUNCAOFILI
                      FROM FILIAL
                     WHERE NVL(FILIAL.IDCNTRRESC, 'N') <> 'S'
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0)  OR (P_CDFILIAL = 'T'))
                       AND (((V_IDRESTRFILIOPER = 'N' ))
                        OR EXISTS (SELECT 1
                                      FROM FILIOPER
                                     WHERE FILIOPER.CDOPERADOR = P_CDOPERADOR
                                       AND FILIOPER.CDFILIAL = FILIAL.CDFILIAL))
                       AND ((P_CDAGRUPFILI = 'T')
                        OR EXISTS (SELECT 1
                                     FROM FILGRUPFILI
                                    WHERE FILGRUPFILI.CDGRUPFILI =  P_CDAGRUPFILI
                                      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,
                           ITEMSOLI.CDFILLAN || ' - ' || LANCA.NMFILIAL LANCAMENTO, NVL(ITEMSOLI.CDFILIOPELOG, 'P') STATUS,
                           ITEMSOLI.CDFILIOPELOG, NVL(PARASUPRI.IDUTILCONSSOLIOL, 'N') IDUTILCONSSOLIOL,
                           'N' ALTERADO, NVL(PARCMPSUP.IDUTAPROVSOL, 'N') IDUTAPROVSOL, NVL(PARCMPSUP.IDPERALTSAPR, 'NNN') IDPERALTSAPR,
                           NVL(ITEMSOLI.IDSOLIAPROV, 'S') IDSOLIAPROV, ITEMSOLI.DTUTILIZA, ITEMSOLI.TXOBSITMSOL, ITEMSOLI.QTVOLUITEMSO,
                           ITEMSOLI.CDPRODORIG, ITEMSOLI.VRCMPANTERIOR, ITEMSOLI.DTCMPANTERIOR, ITEMSOLI.CDMARCA, ITEMSOLI.CDRASTRITM,
                           ITEMSOLI.NRORG
                      FROM ITEMSOLI, SOLICITA, PRODUTO,
                           PARCMPSUP, PARASUPRI, PRODFILI, FILIAL LANCA
                     WHERE (PARCMPSUP.CDFILIAL = SOLICITA.CDFILSOLI)
                       AND (C_FILIAL.CDFILIAL = SOLICITA.CDFILSOLI)
                       AND (ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO)
                       AND ITEMSOLI.CDFILLAN   = LANCA.CDFILIAL
                       AND ((PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND P_CDPRODFIN ) OR ( P_TPRODUTO = 'T' ))
                       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_CDCOMPRADOR, SOLICITA.CDOPERADOR) <> 0 OR NVL(P_CDCOMPRADOR, 'T') = 'T')
                       AND (INSTR(P_CDDESTINO, SOLICITA.CDDESTSOLI) <> 0   OR NVL(P_CDDESTINO, 'T')   = 'T')
                       AND ((SOLICITA.DTSOLCMP BETWEEN P_DTSOLINI    AND P_DTSOLFIN)   OR (P_TSOLICITA = 'T'))
                       AND C_FILIAL.CDFILCENTCMP  = (PARASUPRI.CDFILIAL)
                       AND ( INSTR(P_NRSOLICMP, ITEMSOLI.NRSOLICMP) <> 0 OR P_NRSOLICMP = 'T' )
                       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.IDAUTALTESOLI || AUT.IDAUTALTEPRODSOLI IS NOT NULL
                                            AND OPP.CDOPERADOR = P_CDOPERADOR
                                            AND NVL(AUT.CDFILCENTCMP, PARASUPRI.CDFILIAL) = PARASUPRI.CDFILIAL
                                          UNION SELECT
                                              1 FROM AUTPERFILACESSOSOLI
                                          INNER JOIN PERFACESSPARC ON AUTPERFILACESSOSOLI.NRPERFILACESSO = PERFACESSPARC.NRPERFILACESSO
                                          INNER JOIN OPERADOR ON PERFACESSPARC.NRPARCNEGOCIO = OPERADOR.NRPARCNEGOCIO
                                          WHERE AUTPERFILACESSOSOLI.IDAUTALTESOLI || AUTPERFILACESSOSOLI.IDAUTALTEPRODSOLI IS NOT NULL
                                            AND OPERADOR.CDOPERADOR = P_CDOPERADOR
                                            AND NVL(AUTPERFILACESSOSOLI.CDFILCENTCMP, PARASUPRI.CDFILIAL) = PARASUPRI.CDFILIAL) ) )
                       AND (P_CDGRUPROD = 'T'
                        OR EXISTS (SELECT 1
                                     FROM PRSUBGRPROD PR
                                    WHERE PR.CDPRODUTO = ITEMSOLI.CDPRODUTO
                                      AND PR.CDGRUPPROD = PARASUPRI.CDGRUPPROD
                                      AND ( INSTR(P_CDGRUPROD, PR.CDSUBGRPROD) > 0 )) )
                        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, PRODUTO.CDARVPROD)
      LOOP
         IF NVL(C_ITEM.CDMARCA, 'W') <> 'W' THEN
            SELECT MAX(NMMARCA)
              INTO V_NMMARCA
              FROM MARCA
             WHERE CDMARCA = C_ITEM.CDMARCA;
         END IF;    
         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;
         OUT_RECORD.SOLICITANTE      := C_FILIAL.SOLICITANTE;
         OUT_RECORD.LANCAMENTO       := C_ITEM.LANCAMENTO;
         OUT_RECORD.PRODUTO          := C_ITEM.CDARVPROD||' - '||C_ITEM.NMPRODUTO;
         OUT_RECORD.QTSOLIPRODBKP    := C_ITEM.QTSOLIPROD;
         OUT_RECORD.IDUTILCONSSOLIOL := C_ITEM.IDUTILCONSSOLIOL;
         OUT_RECORD.DSJUSTOPER       := RPAD(' ', 40, ' ');
         OUT_RECORD.IDFUNCAOFILI     := C_FILIAL.IDFUNCAOFILI;
         OUT_RECORD.NMMARCA          := V_NMMARCA;
         OUT_RECORD.CDFILIOPELOG     := C_ITEM.CDFILIOPELOG;
         OUT_RECORD.STATUS           := C_ITEM.STATUS;
         OUT_RECORD.IDSOLIAPROV      := C_ITEM.IDSOLIAPROV;
         OUT_RECORD.ALTERADO         := C_ITEM.ALTERADO;
         OUT_RECORD.IDUTAPROVSOL     := C_ITEM.IDUTAPROVSOL;
         OUT_RECORD.IDPERALTSAPR     := C_ITEM.IDPERALTSAPR;
         OUT_RECORD.TXOBSITMSOL      := C_ITEM.TXOBSITMSOL;
         OUT_RECORD.CDPRODORIG       := C_ITEM.CDPRODORIG;
         OUT_RECORD.CDMARCA          := C_ITEM.CDMARCA;
         OUT_RECORD.DTCMPANTERIOR    := C_ITEM.DTCMPANTERIOR;
         OUT_RECORD.DTUTILIZA        := C_ITEM.DTUTILIZA;
         OUT_RECORD.CDRASTRITM       := C_ITEM.CDRASTRITM;
         OUT_RECORD.NRORG            := C_ITEM.NRORG;
         OUT_RECORD.VRCMPANTERIOR    := C_ITEM.VRCMPANTERIOR;
         OUT_RECORD.QTVOLUITEMSO     := C_ITEM.QTVOLUITEMSO;
         IF OUT_RECORD.STATUS <> 'P' THEN
            OUT_RECORD.STATUS   := 'O';
         END IF;
         IF (INSTR('_'||P_OL||'_'||P_ED||'_', OUT_RECORD.STATUS) > 0) THEN
            PIPE ROW (OUT_RECORD);
         END IF;
      END LOOP;
   END LOOP;
END;
/