/*
  Nome: 9985_CMPFUNO_SQL_PESQ_PROD.SQL

  Descricao: Busca os produtos que serao utilizados.

  Retorno: Preenche a tabela com os produtos. Caso nao encontre os produtos
  retorna as seguintes mensagens:
  NAO_HA_PRODUTOS_SEM_COMP: "Nao ha produto sem composicao cadastrado."
  NAO_HA_PRODUTOS_SEGMENTO: "Nao ha produto cadastrado para o segmento de mercado da filial."
  NAO_HA_PRODUTO_MODULO: Nao ha produto cadastrado para o modulo da filial.
  NAO_HA_PRODUTOS_SEG_MODULO: "Nao ha produto cadastrado para o segmento de mercado e modulo da filial."
  NAO_HA_PRODUTO_CADASTRADO: "Nao ha produto cadastrado."
  NAO_HA_PARAM_FILIAL: "Nao ha parametrizacao cadastrada para a filial."
  FILIAL_NAO_CADASTRADA: "Filial nao cadastrada."
  ERRO_SQL_PESQ_PROD_FORN: "Erro ao executar a funcao SQL_PESQ_PROD_FORN"
  NAO_HA_RELAC_PROD_OL: Nao ha relacionamento de produtos OL
  NAO_HA_RELAC_PROD_OL_POR_COMPRADOR: Nao ha relacionamento de produtos OL por comprador
  NAO_HA_PROD_COMPRADOR: Nao ha produto por comprador



  Parametros:
  P_CDFILIAL: Filial utilizada na pesquisa
  P_PRODNVCOMPL: Nivel completo 'S' / Nivel incompleto 'N'
  P_CDFILCENTCMP: codigo  da filial central de compras
  P_CDFORNECED: codigo do fornecedor
  P_DTAUTOFORN: data de lancamento
  P_CDOPERADOR: codigo do operador
  P_NRORG: numero da organizacao
*/
DROP TYPE SQL_PESQ_PROD_TABLE
/

DROP TYPE SQL_PESQ_PROD_TYPE
/

CREATE TYPE SQL_PESQ_PROD_TYPE AS
OBJECT( CDARVPROD     VARCHAR2(20),
        CDPRODUTO     VARCHAR2(10),
        CDPRODESTO    VARCHAR2(10),
        SGUNIDADE     VARCHAR2(10),   
        NMPRODUTO     VARCHAR2(50),
        VRFATOCONV    FLOAT,
        CDNVPRODUTO   VARCHAR2(1),
        CDPRODINTE    VARCHAR2(20),
        DSERRO        VARCHAR2(200))
/

CREATE TYPE SQL_PESQ_PROD_TABLE AS TABLE OF SQL_PESQ_PROD_TYPE
/

CREATE OR REPLACE FUNCTION SQL_PESQ_PROD(P_CDFILIAL     IN VARCHAR2, 
                                         P_PRODNVCOMPL  IN VARCHAR2,
                                         P_CDFILCENTCMP IN VARCHAR2 := NULL,
                                         P_CDFORNECED   IN VARCHAR2 := NULL,
                                         P_DTAUTOFORN   IN DATE := NULL,
                                         P_CDOPERADOR   IN VARCHAR2 := NULL,
                                         P_NRORG        IN NOVOCODIGO.NRORG%TYPE DEFAULT 1) RETURN SQL_PESQ_PROD_TABLE PIPELINED
IS
  V_CDFILIAL       VARCHAR2(4);
  V_CDSEGMER       VARCHAR2(5);
  V_IDUTMODPRODFIL VARCHAR2(1);
  V_IDBLPRCOMEST   VARCHAR2(1);
  V_CDNVPRODUTO    VARCHAR2(1);
  V_COUNT          NUMERIC;
  V_CDPRODUTO      VARCHAR2(10);
  V_DSERRO         VARCHAR2(200);
  V_IDFUNCAOFILI   VARCHAR2(1);
  V_COUNT_PROD     NUMERIC;
  OUT_RECORD SQL_PESQ_PROD_TYPE := SQL_PESQ_PROD_TYPE (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);                                                
BEGIN  
  BEGIN
    V_COUNT := 0;
    SELECT COUNT(1) CDPRODUTO
      INTO V_COUNT
      FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG));
    IF V_COUNT = 1 THEN
      SELECT CDPRODUTO, DSERRO
        INTO V_CDPRODUTO, V_DSERRO
        FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG));
    END IF;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      OUT_RECORD.DSERRO := 'ERRO_SQL_PESQ_PROD_FORN';
      PIPE ROW (OUT_RECORD); 
  END;

  /*Verifica se ocorreu erro na pesquisa anterior*/
  IF ((V_COUNT = 1) AND (V_CDPRODUTO IS NULL) AND (V_DSERRO IS NOT NULL)) THEN
    OUT_RECORD.DSERRO := V_DSERRO;
    PIPE ROW (OUT_RECORD);      
  ELSE
    BEGIN
      SELECT F.CDFILIAL, F.CDSEGMER, F.IDFUNCAOFILI
        INTO V_CDFILIAL, V_CDSEGMER, V_IDFUNCAOFILI
        FROM FILIAL F
       WHERE (F.CDFILIAL = P_CDFILIAL)
         AND (F.NRORG    = P_NRORG);

      IF V_IDFUNCAOFILI = 'O' THEN
        /*Verifica se existe relacionamento de preduto OL*/
        BEGIN
          SELECT COUNT(1)
            INTO V_COUNT_PROD
            FROM RELACPRODOL R, TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P
           WHERE R.CDPRARVORIG = P.CDPRODUTO;
        EXCEPTION
          WHEN NO_DATA_FOUND THEN
            V_COUNT_PROD := 0;
        END;
        IF V_COUNT_PROD = 0 THEN
          OUT_RECORD.DSERRO := 'NAO_HA_RELAC_PROD_OL';
          PIPE ROW (OUT_RECORD);
        ELSE
          /*Verifica se existe relacionamento de preduto OL e por comprador*/
          V_COUNT := 0;
          FOR C_PRODUTO IN
            ( SELECT PRODUTO.CDPRODUTO,  PRODUTO.CDARVPROD,  PRODUTO.NMPRODUTO,  PRODUTO.SGUNIDADE, PRODUTO.CDNVPRODUTO, 
                     PRODUTO.CDPRODESTO, PRODUTO.VRFATOCONV, PRODUTO.CDPRODINTE
                FROM PRODCOMP, RELACPRODOL,
                     TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) PRODUTO
               WHERE CDOPERADOR = P_CDOPERADOR
                 AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
                 AND PRODUTO.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%'
            )
          LOOP
            OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
            OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
            OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
            OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
            OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
            OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
            OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
            OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
            PIPE ROW (OUT_RECORD);
            V_COUNT := V_COUNT + 1;
          END LOOP;
          IF V_COUNT = 0 THEN
            OUT_RECORD.DSERRO := 'NAO_HA_RELAC_PROD_OL_POR_COMPRADOR';
              PIPE ROW (OUT_RECORD);
          END IF;
        END IF;
      ELSE
        BEGIN
          SELECT COUNT(*)
            INTO V_COUNT_PROD
            FROM PRODCOMP, PRODUTO, TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) PESQ
           WHERE PRODUTO.CDPRODUTO = PRODCOMP.CDPRODUTO
             AND CDOPERADOR = P_CDOPERADOR
             AND PESQ.CDPRODUTO LIKE PRODUTO.CDARVPROD || '%';
        EXCEPTION
          WHEN NO_DATA_FOUND THEN
            V_COUNT_PROD := 0;
        END;
        IF V_COUNT_PROD = 0 THEN
          OUT_RECORD.DSERRO := 'NAO_HA_PROD_COMPRADOR';
            PIPE ROW (OUT_RECORD);            
        ELSE
          BEGIN
            SELECT P.IDUTMODPRODFIL, P.IDBLPRCOMEST
              INTO V_IDUTMODPRODFIL, V_IDBLPRCOMEST
              FROM PARAMFILIAL P
             WHERE (P.CDFILIAL = V_CDFILIAL)
               AND (P.NRORG    = P_NRORG);  
       
            IF V_IDBLPRCOMEST = 'S' THEN /*bloqueia produtos com composicao*/
              IF V_IDUTMODPRODFIL = 'N' THEN /*NAO utiliza modulo de produto*/
                IF V_CDSEGMER IS NULL THEN
                  V_COUNT := 0;
                  FOR C_PRODUTO IN 
                    (SELECT P.CDPRODUTO,  P.CDARVPROD,  P.NMPRODUTO, P.SGUNIDADE, P.CDNVPRODUTO, 
                            P.CDPRODESTO, P.VRFATOCONV, P.CDPRODINTE
                       FROM PRODCOMP, 
                            TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P
                      WHERE PRODCOMP.CDOPERADOR = P_CDOPERADOR
                        AND P.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%'
                        AND NOT EXISTS (SELECT ROTFABRICA.CDPRODUTO
                                          FROM ROTFABRICA
                                         WHERE ROTFABRICA.CDPRODUTO = P.CDPRODUTO
                                           AND ROTFABRICA.NRORG     = P_NRORG)
                        AND NOT EXISTS (SELECT ROTFABLOCAL.CDPRODUTO
                                          FROM ROTFABLOCAL
                                         WHERE CDFILIAL = V_CDFILIAL 
                                           AND ROTFABLOCAL.CDPRODUTO = P.CDPRODUTO
                                           AND ROTFABLOCAL.NRORG     = P_NRORG)
                    )
                  LOOP
                    OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
                    OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
                    OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
                    OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
                    OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
                    OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
                    OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
                    OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
                    PIPE ROW (OUT_RECORD);
                    V_COUNT := V_COUNT + 1;
                  END LOOP;
                  IF V_COUNT = 0 THEN
                    OUT_RECORD.DSERRO := 'NAO_HA_PRODUTOS_SEM_COMP';
                    PIPE ROW (OUT_RECORD);
                  END IF;
                ELSE
                  V_COUNT := 0;
                  FOR C_PRODUTO IN 
                    ( SELECT P.CDPRODUTO,  P.CDARVPROD,   P.NMPRODUTO,
                             P.SGUNIDADE,  P.CDNVPRODUTO, P.CDPRODESTO, P.VRFATOCONV,
                             P.CDPRODINTE
                        FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P, 
                             PRODUTOSEG, PRODCOMP
                       WHERE PRODCOMP.CDOPERADOR = P_CDOPERADOR
                         AND P.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%'
                         AND (PRODUTOSEG.CDSEGMER     = V_CDSEGMER)
                         AND (PRODUTOSEG.NRORG        = P_NRORG)
                         AND (P.CDPRODUTO             = PRODUTOSEG.CDPRODUTO)
                         AND (PRODUTOSEG.IDPROSEGATIV = 'S' OR PRODUTOSEG.IDPROSEGATIV IS NULL)
                         AND NOT EXISTS (SELECT CDPRODUTO
                                           FROM ROTFABRICA
                                          WHERE ROTFABRICA.CDPRODUTO = P.CDPRODUTO
                                            AND ROTFABRICA.NRORG     = P_NRORG)
                         AND NOT EXISTS (SELECT CDPRODUTO
                                           FROM ROTFABLOCAL
                                          WHERE CDFILIAL = V_CDFILIAL
                                            AND ROTFABLOCAL.CDPRODUTO = P.CDPRODUTO
                                            AND ROTFABLOCAL.NRORG     = P_NRORG)
                    )
                  LOOP
                    OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
                    OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
                    OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
                    OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
                    OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
                    OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
                    OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
                    OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
                    PIPE ROW (OUT_RECORD);
                    V_COUNT := V_COUNT + 1;
                  END LOOP;
                  IF V_COUNT = 0 THEN
                    OUT_RECORD.DSERRO := 'NAO_HA_PRODUTOS_SEGMENTO';
                    PIPE ROW (OUT_RECORD);
                  END IF;
                END IF;
              ELSE
                IF V_IDUTMODPRODFIL = 'S' THEN /*utiliza modulo de produto*/
                  IF V_CDSEGMER IS NULL THEN
                    V_COUNT := 0;
                    FOR C_PRODUTO IN 
                      ( SELECT P.CDPRODUTO,  P.CDARVPROD,   P.NMPRODUTO,
                               P.SGUNIDADE,  P.CDNVPRODUTO, P.CDPRODESTO,
                               P.VRFATOCONV, P.CDPRODINTE
                          FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P, 
                               PRODMODFILI, PRODCOMP
                         WHERE PRODCOMP.CDOPERADOR = P_CDOPERADOR
                           AND P.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%'
                           AND PRODMODFILI.CDFILIAL  = V_CDFILIAL
                           AND PRODMODFILI.CDPRODUTO = P.CDPRODUTO
                           AND PRODMODFILI.NRORG     = P_NRORG
                           AND NOT EXISTS (SELECT CDPRODUTO
                                             FROM ROTFABRICA
                                            WHERE ROTFABRICA.CDPRODUTO = P.CDPRODUTO
                                              AND ROTFABRICA.NRORG     = P_NRORG)
                           AND NOT EXISTS (SELECT CDPRODUTO
                                             FROM ROTFABLOCAL
                                            WHERE CDFILIAL = V_CDFILIAL
                                              AND ROTFABLOCAL.CDPRODUTO = P.CDPRODUTO
                                              AND ROTFABLOCAL.NRORG     = P_NRORG)
                      )
                    LOOP
                      OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
                      OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
                      OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
                      OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
                      OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
                      OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
                      OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
                      OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
                      PIPE ROW (OUT_RECORD);
                      V_COUNT := V_COUNT + 1;
                    END LOOP;
                    IF V_COUNT = 0 THEN
                      OUT_RECORD.DSERRO := 'NAO_HA_PRODUTO_MODULO';
                      PIPE ROW (OUT_RECORD);
                    END IF;                
                  ELSE
                    V_COUNT := 0;
                    FOR C_PRODUTO IN 
                      ( SELECT P.CDPRODUTO,   P.CDARVPROD,   P.NMPRODUTO,
                               P.SGUNIDADE,   P.CDNVPRODUTO, P.CDPRODESTO,
                               P.VRFATOCONV,  P.CDPRODINTE
                          FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P, 
                               PRODUTOSEG, PRODMODFILI, PRODCOMP
                         WHERE PRODCOMP.CDOPERADOR = P_CDOPERADOR
                           AND P.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%'
                           AND (PRODUTOSEG.CDSEGMER     = V_CDSEGMER)
                           AND (PRODUTOSEG.NRORG        = P_NRORG)
                           AND (PRODMODFILI.NRORG       = P_NRORG)
                           AND (P.CDPRODUTO             = PRODUTOSEG.CDPRODUTO)
                           AND (PRODMODFILI.CDFILIAL    = V_CDFILIAL)
                           AND (PRODMODFILI.CDPRODUTO   = P.CDPRODUTO)
                           AND (PRODUTOSEG.IDPROSEGATIV = 'S' OR PRODUTOSEG.IDPROSEGATIV IS NULL)
                           AND NOT EXISTS (SELECT CDPRODUTO
                                             FROM ROTFABRICA
                                            WHERE ROTFABRICA.CDPRODUTO = P.CDPRODUTO
                                              AND ROTFABRICA.NRORG     = P_NRORG)
                           AND NOT EXISTS (SELECT CDPRODUTO
                                             FROM ROTFABLOCAL
                                            WHERE CDFILIAL = V_CDFILIAL
                                              AND ROTFABLOCAL.CDPRODUTO = P.CDPRODUTO
                                              AND ROTFABLOCAL.NRORG     = P_NRORG)
                      )
                    LOOP
                      OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
                      OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
                      OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
                      OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
                      OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
                      OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
                      OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
                      OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
                      PIPE ROW (OUT_RECORD);
                      V_COUNT := V_COUNT + 1;
                    END LOOP;
                    IF V_COUNT = 0 THEN
                      OUT_RECORD.DSERRO := 'NAO_HA_PRODUTOS_SEG_MODULO';
                      PIPE ROW (OUT_RECORD);
                    END IF;    
                  END IF;
                END IF;
              END IF;
            ELSE
              IF V_IDBLPRCOMEST = 'N' THEN /*Nao bloqueia produtos com composicao*/
                IF V_IDUTMODPRODFIL = 'N' THEN
                  IF V_CDSEGMER IS NULL THEN
                    V_COUNT := 0;
                    FOR C_PRODUTO IN 
                      ( SELECT P.CDARVPROD,  P.CDPRODUTO,   P.CDPRODESTO, P.NMPRODUTO, P.SGUNIDADE, 
                               P.VRFATOCONV, P.CDNVPRODUTO, P.CDPRODINTE
                        FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P,
                             PRODCOMP
                       WHERE PRODCOMP.CDOPERADOR = P_CDOPERADOR
                         AND P.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%' 
                      )
                    LOOP
                      OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
                      OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
                      OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
                      OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
                      OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
                      OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
                      OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
                      OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
                      PIPE ROW (OUT_RECORD);
                      V_COUNT := V_COUNT + 1;
                    END LOOP;
                    IF V_COUNT = 0 THEN
                      OUT_RECORD.DSERRO := 'NAO_HA_PRODUTO_CADASTRADO';
                      PIPE ROW (OUT_RECORD);
                    END IF; 
                  ELSE
                    V_COUNT := 0;
                    FOR C_PRODUTO IN 
                      ( SELECT P.CDPRODUTO,   P.CDARVPROD,  P.CDPRODESTO, P.NMPRODUTO, P.SGUNIDADE,
                               P.CDNVPRODUTO, P.VRFATOCONV, P.CDPRODINTE
                          FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P, 
                               PRODUTOSEG S, PRODCOMP
                         WHERE PRODCOMP.CDOPERADOR = P_CDOPERADOR
                           AND P.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%'
                           AND (P.CDPRODUTO   = S.CDPRODUTO)
                           AND (S.NRORG       = P_NRORG)
                           AND (S.CDSEGMER    = V_CDSEGMER)
                           AND (S.IDPROSEGATIV = 'S' OR S.IDPROSEGATIV IS NULL)
                      )
                    LOOP
                      OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
                      OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
                      OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
                      OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
                      OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
                      OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
                      OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
                      OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
                      PIPE ROW (OUT_RECORD);
                      V_COUNT := V_COUNT + 1;
                    END LOOP;
                    IF V_COUNT = 0 THEN
                      OUT_RECORD.DSERRO := 'NAO_HA_PRODUTOS_SEGMENTO';
                      PIPE ROW (OUT_RECORD);
                    END IF; 
                  END IF;
                ELSE
                  IF V_CDSEGMER IS NULL THEN
                    V_COUNT := 0;
                    FOR C_PRODUTO IN 
                      ( SELECT CDARVPROD,  P.CDPRODUTO, CDPRODESTO, NMPRODUTO, SGUNIDADE, 
                               VRFATOCONV, CDNVPRODUTO, CDPRODINTE
                          FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P, 
                               PRODMODFILI, PRODCOMP
                         WHERE PRODCOMP.CDOPERADOR = P_CDOPERADOR
                           AND P.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%'
                           AND PRODMODFILI.CDFILIAL  = V_CDFILIAL
                           AND PRODMODFILI.CDPRODUTO = P.CDPRODUTO
                           AND PRODMODFILI.NRORG     = P_NRORG
                      )
                    LOOP
                      OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
                      OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
                      OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
                      OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
                      OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
                      OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
                      OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
                      OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
                      PIPE ROW (OUT_RECORD);
                      V_COUNT := V_COUNT + 1;
                    END LOOP;
                    IF V_COUNT = 0 THEN
                      OUT_RECORD.DSERRO := 'NAO_HA_PRODUTO_MODULO';
                      PIPE ROW (OUT_RECORD);
                    END IF; 
                  ELSE
                    V_COUNT := 0;
                    FOR C_PRODUTO IN 
                      ( SELECT P.CDPRODUTO,   P.CDARVPROD,  P.CDPRODESTO, P.NMPRODUTO, P.SGUNIDADE,
                               P.CDNVPRODUTO, P.VRFATOCONV, P.CDPRODINTE
                          FROM TABLE(SQL_PESQ_PROD_FORN(P_CDFILIAL, P_PRODNVCOMPL, P_CDFILCENTCMP, P_CDFORNECED, P_DTAUTOFORN, P_NRORG)) P, 
                               PRODUTOSEG S, PRODMODFILI, PRODCOMP
                         WHERE PRODCOMP.CDOPERADOR = P_CDOPERADOR
                           AND P.CDARVPROD LIKE PRODCOMP.CDPRODUTO || '%'
                           AND (P.CDPRODUTO           = S.CDPRODUTO)
                           AND (S.CDSEGMER            = V_CDSEGMER)
                           AND (PRODMODFILI.CDFILIAL  = V_CDFILIAL)
                           AND (PRODMODFILI.NRORG     = P_NRORG)
                           AND (S.NRORG               = P_NRORG)
                           AND (PRODMODFILI.CDPRODUTO = P.CDPRODUTO)
                           AND (S.IDPROSEGATIV = 'S' OR S.IDPROSEGATIV IS NULL)
                      )
                    LOOP
                      OUT_RECORD.CDARVPROD    := C_PRODUTO.CDARVPROD;
                      OUT_RECORD.CDPRODUTO    := C_PRODUTO.CDPRODUTO;
                      OUT_RECORD.CDPRODESTO   := C_PRODUTO.CDPRODESTO;
                      OUT_RECORD.SGUNIDADE    := C_PRODUTO.SGUNIDADE;
                      OUT_RECORD.NMPRODUTO    := C_PRODUTO.NMPRODUTO;
                      OUT_RECORD.VRFATOCONV   := C_PRODUTO.VRFATOCONV;
                      OUT_RECORD.CDNVPRODUTO  := C_PRODUTO.CDNVPRODUTO;
                      OUT_RECORD.CDPRODINTE   := C_PRODUTO.CDPRODINTE;
                      PIPE ROW (OUT_RECORD);
                      V_COUNT := V_COUNT + 1;
                    END LOOP;
                    IF V_COUNT = 0 THEN
                      OUT_RECORD.DSERRO := 'NAO_HA_PRODUTOS_SEG_MODULO';
                      PIPE ROW (OUT_RECORD);
                    END IF; 
                  END IF;
                END IF;
              END IF;
            END IF;  
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
              OUT_RECORD.DSERRO := 'NAO_HA_PARAM_FILIAL';
              PIPE ROW (OUT_RECORD);
          END;         
        END IF;
      END IF;    
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        OUT_RECORD.DSERRO := 'FILIAL_NAO_CADASTRADA';
        PIPE ROW (OUT_RECORD);
    END;    
  END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('SQL_PESQ_PROD','6.05.000'); END;
/