CREATE OR REPLACE FUNCTION QUERY_VDITEM_CMP99000(P_CDFILCENTCMP   IN ITMAPURPREC.CDCENTITMAP%TYPE,         /*Central de Compras da Unidade de Processamento*/
                                                 P_CDFORNECED     IN VARCHAR2,                             /*Fornecedor Filtrado*/
                                                 P_CDFILIAL       IN VARCHAR2,                             /*Unidade Filtrada*/
                                                 P_CDCOMPRADOR    IN VARCHAR2,                             /*Comprador Filrado*/
                                                 P_TIPOPREVISAO   IN VARCHAR2,                             /*Tipo de Previsão de Compra Filtrada*/
                                                 P_CDSUBGRUPPROD  IN VARCHAR2,                             /*Subgrupo Filtrado*/
                                                 P_CDPRODINI      IN PRODUTO.CDARVPROD%TYPE,               /*Produto Inicial filtrado*/
                                                 P_CDPRODFIN      IN PRODUTO.CDARVPROD%TYPE,               /*Produto Final Filtrado*/
                                                 P_CDMARCA        IN VARCHAR2,                             /*Marca Filtrada*/
                                                 P_DTINICIAL      IN DATE,                                 /*Período Inicial filtrado*/
                                                 P_DTFINAL        IN DATE,                                 /*Período Final filtrado*/
                                                 P_DTENTREGA      IN ITMAPURPREC.DTENTRAPUT%TYPE,          /*Data de entrega filtrada*/
                                                 P_TIPOTELA       IN VARCHAR2,                             /*Tipo de tela Filtro(F) ou Tela(T)*/
                                                 P_CDOPERADOR     IN VARCHAR2,                             /*Operador logado no sistemas*/
                                                 P_NRAPURPREC     IN VARCHAR2 DEFAULT NULL
                                                 )RETURN QUERY_VDITEM_CMP99000_TABLE PIPELINED
IS
   OUT_RECORD QUERY_VDITEM_CMP99000_TYPE := QUERY_VDITEM_CMP99000_TYPE (NULL, NULL, NULL,
                                                                        NULL,NULL, 0);

 TYPE CURTYPE         IS REF CURSOR;
 C_ITEM               CURTYPE;
 V_DSERRO             VARCHAR2(2000) := '';
 V_IDRESTRFILIOPER    PARAMGERAL.IDRESTRFILIOPER%TYPE;
 V_CONTAERRO          NUMERIC;
 V_IDULTIDTVALQ       PARASUPRI.IDULTIDTVALQ%TYPE;
 V_CDGRUPPROD         PARASUPRI.CDGRUPPROD%TYPE;
 V_CDARVPROD          PRODUTO.CDARVPROD%TYPE;
 V_NMPRODUTO          PRODUTO.NMPRODUTO%TYPE;
 V_SGUNIDADE          PRODUTO.SGUNIDADE%TYPE;
 V_CDPRODUTO          PRODUTO.CDPRODUTO%TYPE;
 V_CDMARCAPADRAO      MARCA.CDMARCA%TYPE;
 V_DTPROCESS          DATE;
 V_DTINICIAL          DATE;
 V_DTFINAL            DATE;
 V_DTENTREGA          DATE;
BEGIN
   SELECT NVL(MAX(CDGRUPPROD), 'N'), NVL(MAX(CDMARCA), 'N'), NVL(MAX(PARASUPRI.IDULTIDTVALQ), 'D')
     INTO V_CDGRUPPROD, V_CDMARCAPADRAO, V_IDULTIDTVALQ
     FROM PARASUPRI
    WHERE CDFILIAL = P_CDFILCENTCMP;
   SELECT NVL(MAX(CASE
                     WHEN NVL(PARAMGERAL.IDUTILDTPROC, 'N') = 'N'
                     THEN TO_DATE(TRUNC(SYSDATE))
                     ELSE NVL(PARAMFILIAL.DTPROCESSA, TO_DATE(TRUNC(SYSDATE)))
                  END), TO_DATE(TRUNC(SYSDATE))), NVL(MAX(PARAMGERAL.IDRESTRFILIOPER), 'N')
     INTO V_DTPROCESS, V_IDRESTRFILIOPER
     FROM PARAMGERAL, PARAMFILIAL
    WHERE PARAMFILIAL.CDFILIAL = P_CDFILIAL;
   IF NVL(P_DTINICIAL||P_DTFINAL||P_DTENTREGA, '0') = '0' THEN
      SELECT MAX(DTINIAPUPREC), MAX(DTFINAPUPREC), MAX(DTENTREGA)
        INTO V_DTINICIAL, V_DTFINAL, V_DTENTREGA
        FROM APURPRECO
       WHERE CDFILCENTCMP = P_CDFILCENTCMP
         AND NRAPURPREC   = P_NRAPURPREC;
   ELSE
      V_DTINICIAL := P_DTINICIAL;
      V_DTFINAL   := P_DTFINAL;
      V_DTENTREGA := P_DTENTREGA;
   END IF;
   FOR C_FILIAL IN (SELECT CDFILIAL, NMFILIAL, NVL(FILIAL.IDCNTRRESC, 'S') IDCNTRRESC,
                           NVL(CDREGIAO, 'W') CDREGIAO, NRORG
                      FROM FILIAL
                     WHERE NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL) = P_CDFILCENTCMP
                       AND ((INSTR(P_CDFILIAL, 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)))
   LOOP
      V_DSERRO := '';
      IF C_FILIAL.CDREGIAO = 'W' THEN
         V_DSERRO := 'ERROREG_'; /*Unidade sem Regiao cadastrada*/
      END IF;
      IF C_FILIAL.IDCNTRRESC = 'S' THEN
         V_DSERRO := V_DSERRO||'ERROINATIV_'; /*Unidade com Contrato Rescindido*/
      END IF;
      SELECT COUNT(1)
        INTO V_CONTAERRO
        FROM PARASUPRI
       WHERE CDFILIAL = P_CDFILCENTCMP;
      IF V_CONTAERRO = 0 THEN
         V_DSERRO := V_DSERRO||'ERROSUP_'; /*Central de Compras sem Parametrização de Compras de Suprimento*/
      END IF;
      SELECT COUNT(1)
        INTO V_CONTAERRO
        FROM PARCMPSUP
       WHERE CDFILIAL = C_FILIAL.CDFILIAL;
      IF V_CONTAERRO = 0 THEN
         V_DSERRO := V_DSERRO||'ERROCMP_'; /*Unidade sem Parametrização de Compras de Suprimento*/
      END IF;
      IF V_CDMARCAPADRAO = 'N' THEN
         V_DSERRO := V_DSERRO||'ERROMARCAPDR_'; /*Não existe marca padrão cadastrada*/
      END IF;
      IF V_DTPROCESS > V_DTENTREGA THEN
         V_DSERRO := V_DSERRO||'ERRODTENR_'; /*Data de entrega menor que a data de processamento da unidade*/
      END IF;
      IF P_TIPOTELA = 'T' THEN
         SELECT COUNT(1)
           INTO V_CONTAERRO
           FROM REFOREG
          WHERE REFOREG.CDREGIAO   = C_FILIAL.CDREGIAO
            AND ((INSTR('_'||P_CDFORNECED||'_', REFOREG.CDFORNECED) > 0 ) OR (P_CDFORNECED = 'T'));
         IF V_CONTAERRO > 0 THEN
            V_DSERRO := V_DSERRO||'ERROREFOREG_'; /*Fornecedor selecionado não atende a regiao da Unidade*/
         END IF;
         SELECT COUNT(1)
           INTO V_CONTAERRO
           FROM REFORFIL
          WHERE REFORFIL.CDFILIAL   = C_FILIAL.CDFILIAL
            AND NVL(REFORFIL.CDPERIENTR, 'W') = 'W'
            AND ((INSTR('_'||P_CDFORNECED||'_', REFORFIL.CDFORNECED) > 0 ) OR (P_CDFORNECED = 'T'));
         IF V_CONTAERRO > 0 THEN
            V_DSERRO := V_DSERRO||'ERROREFORFIL_'; /*Fornecedor selecionado não atende a Unidade*/
         END IF;
         SELECT COUNT(1)
           INTO V_CONTAERRO
           FROM QUALIFICACAO, FORNECEDOR
          WHERE (FORNECEDOR.CDQUALIF       = QUALIFICACAO.CDQUALIF)
            AND ((INSTR('_'||P_CDFORNECED||'_', FORNECEDOR.CDFORNECED) > 0 ) OR (P_CDFORNECED = 'T'))
            AND (FORNECEDOR.IDFORNAUTO     = 'N')
            AND ((QUALIFICACAO.IDPERCOTCMP = '2')
             OR ((V_IDULTIDTVALQ  = 'D'
            AND V_DTENTREGA > FORNECEDOR.DTVALQUALIF)
             OR (V_IDULTIDTVALQ = 'M'
            AND V_DTENTREGA > LAST_DAY(FORNECEDOR.DTVALQUALIF))));
          IF V_CONTAERRO > 0 THEN
            V_DSERRO := V_DSERRO||'QUALIFORN_'; /*Fornecedor selecionado não qualificado*/
          END IF;
          SELECT COUNT(1)
           INTO V_CONTAERRO
           FROM FORNECEDOR
          WHERE ((INSTR('_'||P_CDFORNECED||'_', FORNECEDOR.CDFORNECED) > 0 ) OR (P_CDFORNECED = 'T'))
            AND FORNECEDOR.IDSITUCADA       = 'A'
            AND FORNECEDOR.IDTIPOFORN      <> 'A';
          IF V_CONTAERRO <= 0 THEN
            V_DSERRO := V_DSERRO||'FORNECINATIV_'; /*Fornecedor selecionado é inativo ou alternativo*/
          END IF;
      END IF;
      IF NVL(V_DSERRO, 'W') <> 'W' THEN
         OUT_RECORD.NRORG             := C_FILIAL.NRORG;
         OUT_RECORD.DSFILIAL          := C_FILIAL.CDFILIAL||' - '||C_FILIAL.NMFILIAL;
         OUT_RECORD.CDPRODUTO         := '';
         OUT_RECORD.NMPRODUTO         := '';
         OUT_RECORD.CDARVPROD         := '';
         OUT_RECORD.DSERRO            := V_DSERRO;
         PIPE ROW (OUT_RECORD);
      ELSE
         IF P_TIPOPREVISAO = 'R' THEN
            OPEN C_ITEM FOR
               SELECT PRODUTO.CDPRODUTO, PRODUTO.CDARVPROD, PRODUTO.NMPRODUTO
                 FROM ITLANCTOEST, PRODUTO, FILIAL, PRODFILI
                WHERE ITLANCTOEST.CDPRODMOVI = PRODUTO.CDPRODUTO
                  AND ITLANCTOEST.CDFILIMOVI = FILIAL.CDFILIAL
                  AND ITLANCTOEST.CDPRODMOVI = PRODFILI.CDPRODUTO
                  AND ITLANCTOEST.CDFILIMOVI = PRODFILI.CDFILIAL
                  AND NVL(PRODFILI.IDPRODATIV, 'I') = 'A'
                  AND ((INSTR(P_CDFILIAL, ITLANCTOEST.CDFILIMOVI) > 0 ) OR (P_CDFILIAL = 'T'))
                  AND ITLANCTOEST.IDTIPOMOVI IN ('3', '4')
                  AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z')
                  AND NVL(PRODUTO.IDPRODATIVPR, 'N')  = 'S'
                  AND ITLANCTOEST.DTLANCMOVI BETWEEN V_DTINICIAL AND LAST_DAY(V_DTFINAL)
                  AND ((NVL(P_CDSUBGRUPPROD, 'T') =  'T')
                   OR (EXISTS (SELECT 1
                                 FROM PRSUBGRPROD
                                WHERE PRSUBGRPROD.CDGRUPPROD  = V_CDGRUPPROD
                                  AND (INSTR(P_CDSUBGRUPPROD, PRSUBGRPROD.CDSUBGRPROD) > 0 )
                                  AND PRSUBGRPROD.CDPRODUTO   = ITLANCTOEST.CDPRODMOVI
                                  AND PRSUBGRPROD.CDFILISUBGR = 'P')))
                  AND EXISTS (SELECT 1
                                FROM PRODCOMP, PRODUTO PR
                               WHERE PRODCOMP.CDPRODUTO  = PR.CDPRODUTO
                                 AND PRODCOMP.CDOPERADOR = P_CDCOMPRADOR
                                 AND PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%');
         ELSE
            OPEN C_ITEM FOR
               SELECT PRODUTO.CDPRODUTO, PRODUTO.CDARVPROD, PRODUTO.NMPRODUTO
                 FROM PRODUTO, PRODFILI
                WHERE PRODUTO.CDPRODUTO = PRODUTO.CDPRODESTO
                  AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z')
                  AND NVL(PRODFILI.IDPRODATIV, 'I') = 'A'
                  AND PRODFILI.CDPRODUTO     = PRODUTO.CDPRODUTO
                  AND PRODFILI.CDFILIAL      = C_FILIAL.CDFILIAL
                  AND NVL(PRODUTO.IDPRODATIVPR, 'N')  = 'S'
                  AND ((NVL(P_CDSUBGRUPPROD, 'T') =  'T')
                   OR (EXISTS (SELECT 1
                                 FROM PRSUBGRPROD
                                WHERE PRSUBGRPROD.CDGRUPPROD  = V_CDGRUPPROD
                                  AND (INSTR(P_CDSUBGRUPPROD, PRSUBGRPROD.CDSUBGRPROD) > 0 )
                                  AND PRSUBGRPROD.CDPRODUTO   = PRODFILI.CDPRODUTO
                                  AND PRSUBGRPROD.CDFILISUBGR = 'P')))
                  AND EXISTS (SELECT 1
                                FROM PRODCOMP, PRODUTO PR
                               WHERE PRODCOMP.CDPRODUTO  = PR.CDPRODUTO
                                 AND PRODCOMP.CDOPERADOR = P_CDCOMPRADOR
                                 AND PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%');
         END IF;
         LOOP
            FETCH C_ITEM INTO V_CDPRODUTO, V_CDARVPROD, V_NMPRODUTO;
            EXIT WHEN C_ITEM%NOTFOUND;
            V_DSERRO := '';
            IF P_TIPOTELA = 'T' THEN
               SELECT COUNT(1)
                 INTO V_CONTAERRO
                 FROM PRODFORNCOMP
                WHERE PRODFORNCOMP.CDPRODCOMPL  = V_CDPRODUTO
                  AND ((INSTR('_'||P_CDFORNECED||'_', PRODFORNCOMP.CDFORNECED) > 0 ) OR (P_CDFORNECED = 'T'));
               IF V_CONTAERRO <= 0 THEN
                  V_DSERRO := V_DSERRO||'PRODFORNCOMP_'; /*Fornecedor selecionado não relacionado ao produto*/
               END IF;
               SELECT COUNT(1)
                 INTO V_CONTAERRO
                 FROM MARCPRODCOMP
                WHERE MARCPRODCOMP.CDPRMARCOMPL = V_CDPRODUTO
                  AND ((INSTR('_'||P_CDMARCA||'_', MARCPRODCOMP.CDMARCA) > 0 ) OR (P_CDMARCA = 'T'));
               IF V_CONTAERRO <= 0 THEN
                  V_DSERRO := V_DSERRO||'MARCPRODCOMP_'; /*Marca selecionado não relacionado ao produto*/
               END IF;
               SELECT COUNT(1)
                 INTO V_CONTAERRO
                 FROM QFOPRODFORN
                WHERE (QFOPRODFORN.CDPRODUTO = V_CDPRODUTO)
                  AND ((INSTR('_'||P_CDFORNECED||'_', QFOPRODFORN.CDFORNECED) > 0 ) OR (P_CDFORNECED = 'T'))
                  AND ((QFOPRODFORN.IDFORNAPROV = 'N'
                  AND QFOPRODFORN.IDFORNAUTOR = 'N')
                   OR ((QFOPRODFORN.IDFORNAPROV = 'S')
                  AND ((V_IDULTIDTVALQ = 'M'
                  AND V_DTENTREGA > LAST_DAY(QFOPRODFORN.DTVALPRFORN))
                   OR (V_IDULTIDTVALQ = 'D'
                   AND V_DTENTREGA > QFOPRODFORN.DTVALPRFORN)) ) );
               IF V_CONTAERRO > 0 THEN
                  V_DSERRO := V_DSERRO||'QFOPROFFORN_'; /*Fornecedor selecionado não qualificado para o produto*/
               END IF;
               SELECT COUNT(1)
                 INTO V_CONTAERRO
                 FROM QFOMARPROD 
                WHERE (QFOMARPROD.CDPRODUTO = V_CDPRODUTO)
                  AND ((INSTR('_'||P_CDMARCA||'_', QFOMARPROD.CDMARCA) > 0) OR (NVL(P_CDMARCA, 'T') = 'T'))
                  AND ((QFOMARPROD.IDAPRMARPRO = 'N'
                  AND QFOMARPROD.IDAUTMARPRO = 'N')
                   OR ((QFOMARPROD.IDAPRMARPRO = 'S')
                  AND ((V_IDULTIDTVALQ = 'M'
                  AND V_DTENTREGA > LAST_DAY(QFOMARPROD.DTVALAPROVA))
                   OR (V_IDULTIDTVALQ = 'D'
                  AND V_DTENTREGA > QFOMARPROD.DTVALAPROVA)) ) );
               IF V_CONTAERRO > 0 THEN
                  V_DSERRO := V_DSERRO||'QFOMARPROD_'; /*Marca selecionado não qualificada para o produto*/
               END IF;
               SELECT COUNT(1)
                 INTO V_CONTAERRO
                 FROM (SELECT QFOMARPROD.CDMARCA
                         FROM QFOMARPROD
                        WHERE QFOMARPROD.CDPRODUTO = V_CDPRODUTO
                          AND ((INSTR('_'||P_CDMARCA||'_', QFOMARPROD.CDMARCA) > 0) OR (NVL(P_CDMARCA, 'T') = 'T'))
                        UNION
                       SELECT PARASUPRI.CDMARCA
                         FROM PARASUPRI
                        WHERE PARASUPRI.CDFILIAL     = P_CDFILCENTCMP
                          AND (PARASUPRI.IDMARSEMQUA = 'N' OR PARASUPRI.IDMARSEMQUA IS NULL));
               IF V_CONTAERRO <= 0 THEN
                  V_DSERRO := V_DSERRO||'QFOMARPROD_'; /*Marca selecionado não qualificada para o produto*/
               END IF;
               IF NVL(V_DSERRO, 'W') <> 'W' THEN
                  OUT_RECORD.NRORG             := C_FILIAL.NRORG;
                  OUT_RECORD.DSFILIAL          := C_FILIAL.CDFILIAL||' - '||C_FILIAL.NMFILIAL;
                  OUT_RECORD.CDPRODUTO         := V_CDPRODUTO;
                  OUT_RECORD.NMPRODUTO         := V_NMPRODUTO;
                  OUT_RECORD.CDARVPROD         := V_CDARVPROD;
                  OUT_RECORD.DSERRO            := V_DSERRO;
                  PIPE ROW (OUT_RECORD);
               END IF;
            END IF;
         END LOOP;
      END IF;
   END LOOP;
END;
/