DROP TYPE PEDIDO_COLETA_ACOMP_TABLE
/

DROP TYPE PEDIDO_COLETA_ACOMP_TYPE
/

CREATE TYPE PEDIDO_COLETA_ACOMP_TYPE AS
OBJECT( CDREGIAO      VARCHAR2(3),
        NMREGIAO      VARCHAR2(30),
        CDPRODUTO     VARCHAR2(10),
        CDARVPROD     VARCHAR2(20),
        NMPRODUTO     VARCHAR2(50),
        SGUNIDADE     VARCHAR2(10),
        CDPRODESTO    VARCHAR2(10),
        CDMARCA       VARCHAR2(5),
        NMMARCA       VARCHAR2(20),
        CDMARCAPADR   VARCHAR2(5),
        CDFORNECED    VARCHAR2(21),
        NMFANTFORN    VARCHAR2(40),
        NMRAZSOCFORN  VARCHAR2(100),
        NRINSJURFORN  VARCHAR2(20),
        IDTPIJURFORN  VARCHAR2(1),
        IDTPFRETFORN  VARCHAR2(1),
        CDOPERADOR    VARCHAR2(12),
        NMOPERADOR    VARCHAR2(40),
        NRCOMPRA      VARCHAR2(10),
        QTACOMPRAR    FLOAT,
        DSEMAILCOT    VARCHAR2(400),
        DSMAILCOTCOP  VARCHAR2(400)
        )
/

CREATE TYPE PEDIDO_COLETA_ACOMP_TABLE AS TABLE OF PEDIDO_COLETA_ACOMP_TYPE
/

CREATE OR REPLACE FUNCTION PEDIDO_COLETA_ACOMP(P_CDPRODINI      IN VARCHAR2,
                                         P_CDPRODFIN      IN VARCHAR2,
                                         P_TPRODUTO       IN VARCHAR2,
                                         P_DTINI          IN DATE,
                                         P_DTFIN          IN DATE,
                                         P_CDFILIAL       IN VARCHAR2,
                                         P_CDFILIPROC     IN VARCHAR2,
                                         P_CDCOMPRADOR    IN VARCHAR2,
                                         P_T_CDCOMPRADOR  IN VARCHAR2,
                                         P_CDFORNECED     IN VARCHAR2,
                                         P_T_CDFORNECED   IN VARCHAR2,
                                         P_CDREGIAO       IN VARCHAR2,
                                         P_T_CDREGIAO     IN VARCHAR2,
                                         P_CDMARCA        IN VARCHAR2 DEFAULT NULL,
                                         P_PORTAL         IN VARCHAR2 DEFAULT 'S') RETURN PEDIDO_COLETA_ACOMP_TABLE PIPELINED
IS
  OUT_RECORD PEDIDO_COLETA_ACOMP_TYPE := PEDIDO_COLETA_ACOMP_TYPE (NULL, NULL, NULL, NULL, NULL,
                                                       NULL, NULL, NULL, NULL, NULL,
                                                       NULL, NULL, NULL, NULL, NULL,
                                                       NULL, NULL, NULL, NULL, NULL,
                                                       NULL, NULL);
  V_IDCONSPRSOL    PARASUPRI.IDCONSPRSOL%TYPE;
  V_IDFILINEGCOR   PARAMPRODSUP.IDFILINEGCOR%TYPE;
  V_CDPRODINI      PRODUTO.CDARVPROD%TYPE;
  V_CDPRODFIN      PRODUTO.CDARVPROD%TYPE;
  V_TPRODUTO       VARCHAR2(1);
  V_QTDECOMP       FLOAT;
  V_QTPROGENTAF    FLOAT;
BEGIN
  V_CDPRODINI      := P_CDPRODINI;
  V_CDPRODFIN      := P_CDPRODFIN;
  V_TPRODUTO       := P_TPRODUTO;
  IF P_TPRODUTO = 'T' THEN
     V_TPRODUTO       := '';
     IF P_PORTAL = 'N' THEN
        SELECT MIN(PRODUTO.CDARVPROD), MAX(PRODUTO.CDARVPROD)
          INTO V_CDPRODINI, V_CDPRODFIN
          FROM PRODFORNCOMP, PRODUTO
         WHERE PRODFORNCOMP.CDPRODCOMPL = PRODUTO.CDPRODUTO
           AND (INSTR(P_CDFORNECED, PRODFORNCOMP.CDFORNECED) <> 0 OR (P_T_CDFORNECED = 'T'))
           AND ((PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND P_CDPRODFIN) OR (P_TPRODUTO = 'T'));
     ELSE
        SELECT MIN(PRODUTO.CDARVPROD), MAX(PRODUTO.CDARVPROD)
          INTO V_CDPRODINI, V_CDPRODFIN
          FROM PRODFORNCOMP, PRODUTO
         WHERE PRODFORNCOMP.CDPRODCOMPL = PRODUTO.CDPRODUTO
           AND (INSTR(P_CDFORNECED, PRODFORNCOMP.CDFORNECED) <> 0 OR (P_T_CDFORNECED = 'T'))
           AND ((PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND P_CDPRODFIN) OR (P_TPRODUTO = 'T'))
           AND EXISTS (SELECT /* + FIRST_ROWS(1) */
                                  1
                             FROM DADOSFORNECOMMERCE
                            WHERE PRODFORNCOMP.CDFORNECED = DADOSFORNECOMMERCE.CDFORNECED );
     END IF;
  END IF;
  SELECT NVL(MAX(IDCONSPRSOL), 'N')
    INTO V_IDCONSPRSOL
  FROM
    PARASUPRI
  WHERE
    PARASUPRI.CDFILIAL    = P_CDFILIAL;
  IF V_IDCONSPRSOL = 'N' THEN
      FOR C_ITENS IN (SELECT
                           COMPLETO.CDREGIAO,     COMPLETO.NMREGIAO,
                           COMPLETO.CDOPERADOR,   COMPLETO.NMOPERADOR,
                           COMPLETO.CDFORNECED,   COMPLETO.NRINSJURFORN,
                           COMPLETO.IDTPIJURFORN, COMPLETO.NMRAZSOCFORN,
                           COMPLETO.NMFANTFORN,   COMPLETO.CDPRODUTO,
                           COMPLETO.NMPRODUTO,    COMPLETO.SGUNIDADE,
                           COMPLETO.CDPRODESTO,   COMPLETO.IDTPFRETFORN,
                           COMPLETO.CDMARCA,      COMPLETO.NMMARCA,
                           COMPLETO.CDMARCAPADR,  COMPLETO.CDARVPROD,
                           0 QTACOMPRAR,
                           '' NRCOMPRA,
                           COMPLETO.DSEMAILCOT,
                           COMPLETO.DSMAILCOTCOP
                        FROM
                            PARASUPRI,
                            FILIAL FILI,
                           (SELECT
                              REGIAO.CDREGIAO,          REGIAO.NMREGIAO,
                              OPERADOR.CDOPERADOR,      OPERADOR.NMOPERADOR,
                              FORNECEDOR.CDFORNECED,  FORNECEDOR.NRINSJURFORN,
                              FORNECEDOR.IDTPIJURFORN,  FORNECEDOR.NMRAZSOCFORN,
                              FORNECEDOR.NMFANTFORN,    PRODUTO.CDPRODUTO,
                              PRODUTO.CDARVPROD,        PRODUTO.NMPRODUTO,
                              PRODUTO.SGUNIDADE,        PRODUTO.CDPRODESTO,
                              FORNECEDOR.IDTPFRETFORN,
                              NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) AS CDMARCA,
                            REPLACE(REPLACE(MARCA.NMMARCA, CHR(13), ''), CHR(10), '') NMMARCA,
                              PARASUPRI.CDMARCA AS CDMARCAPADR,
                              NVL((SELECT DSEMAILFORN
                                     FROM TABLE(DADOS_FORN_EMAIL(FORNECEDOR.CDFORNECED, NULL, 'S'))), NVL(FORNECEDOR.DSEMAILPEDCOLFO, FORNECEDOR.DSEMAILCOT)) DSEMAILCOT,
                              NVL(FORNECEDOR.DSMAILPEDCOLCOP, FORNECEDOR.DSMAILCOTCOP) DSMAILCOTCOP
                            FROM
                              OPERADOR,     MARCA,
                              PRODUTO,      (SELECT CDPRODCOMPL, CDFORNECED
                                               FROM TABLE(PED_COLE(P_CDFORNECED, P_T_CDFORNECED, V_CDPRODINI,
                                                                  V_CDPRODFIN, V_TPRODUTO, P_CDCOMPRADOR, P_T_CDCOMPRADOR, P_PORTAL))) PRODFORNCOMP,
                              MARCPRODCOMP, FORNECEDOR,
                              REGIAO,       PARASUPRI
                            WHERE
                            (INSTR(P_CDCOMPRADOR, OPERADOR.CDOPERADOR) <> 0 OR (P_T_CDCOMPRADOR = 'T')) AND
                            PARASUPRI.CDFILIAL = P_CDFILIAL AND
                            ((NVL(PARASUPRI.IDUTLPROCMP, 'N') = 'N') OR
                             (NVL(PARASUPRI.IDUTLPROCMP, 'N') = 'S' AND
                              PRODUTO.CDPRODUTO <> PRODUTO.CDPRODESTO)) AND
                            ((PRODUTO.CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN) OR (V_TPRODUTO = 'T')) AND
                            (INSTR(P_CDFORNECED, FORNECEDOR.CDFORNECED) <> 0 OR (P_T_CDFORNECED = 'T'))AND
                            (INSTR(P_CDREGIAO, REGIAO.CDREGIAO        ) <> 0 OR (P_T_CDREGIAO   = 'T'))AND
                            NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) IS NOT NULL AND
                            INSTR(NVL(P_CDMARCA, MARCPRODCOMP.CDMARCA(+)), MARCPRODCOMP.CDMARCA(+))<> 0 AND

                            FORNECEDOR.CDFORNECED = PRODFORNCOMP.CDFORNECED  AND
                            PRODUTO.CDPRODUTO = PRODFORNCOMP.CDPRODCOMPL AND
                            PRODUTO.CDPRODUTO = MARCPRODCOMP.CDPRMARCOMPL(+) AND
                            MARCA.IDMARCAATIVA       = 'A' AND
                            MARCA.CDMARCA = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) AND
                            (NVL(PRODUTO.IDPRODATIVPR, 'N') =  'S')          AND
                            NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                               1
                                          FROM REFOREG
                                        WHERE REFOREG.CDREGIAO = REGIAO.CDREGIAO AND
                                              REFOREG.CDFORNECED = FORNECEDOR.CDFORNECED
                                              ) AND

                            EXISTS (SELECT /* + FIRST_ROWS(1) */
                                           1
                                      FROM PRODCOMP, PRODUTO PR
                                      WHERE PRODCOMP.CDPRODUTO = PR.CDPRODUTO AND
                                            PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%' AND
                                            OPERADOR.CDOPERADOR = PRODCOMP.CDOPERADOR) AND

                            NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                              1   /* QUALIFICACAO DO FORNECEDOR */
                                        FROM QUALIFICACAO
                                        WHERE (FORNECEDOR.CDQUALIF       = QUALIFICACAO.CDQUALIF) AND
                                              (FORNECEDOR.IDFORNAUTO     = 'N')                   AND
                                              ((QUALIFICACAO.IDPERCOTCMP = '2')                   OR
                                               ((PARASUPRI.IDULTIDTVALQ  = 'D'                    AND
                                                 TO_DATE(SYSDATE) > FORNECEDOR.DTVALQUALIF)    OR
                                               (PARASUPRI.IDULTIDTVALQ = 'M'                      AND
                                                TO_DATE(SYSDATE) > LAST_DAY(FORNECEDOR.DTVALQUALIF))))) AND
                            NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                             1  /* QUALIFICACAO DE PRODUTO/MARCA */
                                        FROM QFOMARPROD
                                        WHERE (QFOMARPROD.CDPRODUTO    = PRODUTO.CDPRODUTO) AND
                                              (QFOMARPROD.CDMARCA      = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA))     AND
                                              ((QFOMARPROD.IDAPRMARPRO = 'N' AND QFOMARPROD.IDAUTMARPRO = 'N')   OR
                                              ((QFOMARPROD.IDAPRMARPRO = 'S') AND ((PARASUPRI.IDULTIDTVALQ = 'M' AND
                                               TO_DATE(SYSDATE) > LAST_DAY(QFOMARPROD.DTVALAPROVA)) OR
                                              (PARASUPRI.IDULTIDTVALQ = 'D' AND TO_DATE(SYSDATE) > QFOMARPROD.DTVALAPROVA))))) AND
                            EXISTS (SELECT  /* + FIRST_ROWS(1) */
                                      QFOMARPROD.CDMARCA   /* QUALIFICACAO DE PRODUTO/MARCA */
                                    FROM
                                      QFOMARPROD
                                    WHERE
                                      QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO AND
                                      QFOMARPROD.CDMARCA   = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA)

                                    UNION

                                    SELECT
                                      PARASUPRI.CDMARCA
                                    FROM
                                      PARASUPRI
                                    WHERE
                                      PARASUPRI.CDFILIAL    = P_CDFILIAL AND
                                      (PARASUPRI.IDMARSEMQUA = 'N' OR PARASUPRI.IDMARSEMQUA IS NULL)) AND
                            NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                           QFOPRODFORN.CDPRODUTO /* QUALIFICACAO DE PRODUTO/FORNECEDOR */
                                        FROM
                                           QFOPRODFORN
                                        WHERE (QFOPRODFORN.CDFORNECED= PRODFORNCOMP.CDFORNECED) AND
                                          (QFOPRODFORN.CDPRODUTO = PRODUTO.CDPRODUTO) AND
                                          ((QFOPRODFORN.IDFORNAPROV = 'N' AND QFOPRODFORN.IDFORNAUTOR = 'N') OR
                                           ((QFOPRODFORN.IDFORNAPROV = 'S') AND
                                              ((PARASUPRI.IDULTIDTVALQ = 'M' AND
                                                TO_DATE(SYSDATE) > LAST_DAY(QFOPRODFORN.DTVALPRFORN)) OR
                                               (PARASUPRI.IDULTIDTVALQ = 'D' AND
                                                TO_DATE(SYSDATE) > QFOPRODFORN.DTVALPRFORN))))) AND
                            EXISTS ((SELECT /* + FIRST_ROWS(1) */
                                            1
                                       FROM MARCFORNPEDCOL
                                      WHERE MARCFORNPEDCOL.CDFORNECED = FORNECEDOR.CDFORNECED
                                        AND MARCFORNPEDCOL.CDMARCA    = MARCA.CDMARCA)
                                   UNION ALL
                                   (SELECT 1
                                      FROM DUAL
                                     WHERE NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                                              1
                                                         FROM MARCFORNPEDCOL
                                                        WHERE MARCFORNPEDCOL.CDFORNECED = FORNECEDOR.CDFORNECED)))

                        ) COMPLETO
                        WHERE
                           PARASUPRI.CDFILIAL = P_CDFILIAL AND
                           NVL(PARASUPRI.IDCONSPRSOL, 'N') <> 'S' AND

                           FILI.CDFILIAL = P_CDFILIPROC AND
                           FILI.IDFUNCAOFILI IS NULL )
      LOOP
         V_QTDECOMP := 0;
         SELECT
          NVL(SUM(ITEMSOLI.QTSOLIPROD*PRODUTO.VRFATOCONV/ESTOQUE.VRFATOCONV), 0) AS QTDECOMP
         INTO V_QTDECOMP
         FROM
          PRODUTO ESTOQUE, PRODUTO, ITEMSOLI, FILIAL
         WHERE
          (ITEMSOLI.CDFILSOLI = FILIAL.CDFILIAL)  AND
          (FILIAL.CDREGIAO    = C_ITENS.CDREGIAO)  AND
          (ITEMSOLI.IDITMCONS = 'N') AND
          (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
          (ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO)  AND
          (PRODUTO.CDPRODESTO = ESTOQUE.CDPRODESTO) AND
          (ESTOQUE.CDARVPROD   = C_ITENS.CDARVPROD) AND
          (ITEMSOLI.DTPROGENTR BETWEEN P_DTINI AND P_DTFIN) AND
          NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                             1
                        FROM REFORFIL
                       WHERE REFORFIL.CDFORNECED = C_ITENS.CDFORNECED AND
                             REFORFIL.CDFILIAL   = ITEMSOLI.CDFILSOLI AND
                             REFORFIL.CDPERIENTR IS NULL);
         IF V_QTDECOMP > 0 THEN
            SELECT
             NVL(SUM(ITEMAUTF.QTPROGENTAF*PRODUTO.VRFATOCONV/ESTOQUE.VRFATOCONV), 0) AS QTPROGENTAF
            INTO V_QTPROGENTAF
            FROM
             PRODUTO, ITEMAUTF, AUTOFORNE, PRODUTO ESTOQUE, FILIAL
            WHERE
            (AUTOFORNE.CDFILDEST= FILIAL.CDFILIAL)  AND
            (FILIAL.CDREGIAO    = C_ITENS.CDREGIAO)  AND
            (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST) AND
            (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC) AND
            (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN) AND
            (ITEMAUTF.CDPRODUTO = PRODUTO.CDPRODUTO) AND
            (PRODUTO.CDPRODESTO = ESTOQUE.CDPRODESTO) AND
            (ESTOQUE.CDARVPROD   = C_ITENS.CDARVPROD) AND
            (AUTOFORNE.IDSITUATUAAF IS NULL) AND
            (AUTOFORNE.IDAFFORALIM = 'N') AND
            (AUTOFORNE.IDAUTOFORNEX = 'N') AND
            (ITEMAUTF.DTENTRITMSOL BETWEEN P_DTINI AND P_DTFIN) AND
            NVL(AUTOFORNE.IDBAIXAAF, '0') <> '5' AND
            NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                             1
                        FROM REFORFIL
                       WHERE REFORFIL.CDFORNECED = C_ITENS.CDFORNECED AND
                             REFORFIL.CDFILIAL   = ITEMAUTF.CDFILDEST AND
                             REFORFIL.CDPERIENTR IS NULL);
            V_QTDECOMP := V_QTDECOMP - V_QTPROGENTAF;
            IF V_QTDECOMP < 0 THEN
               V_QTDECOMP := 0;
            ELSE
               V_QTDECOMP := CEIL(V_QTDECOMP);
            END IF;
         END IF;
         IF V_QTDECOMP > 0 THEN
            OUT_RECORD.CDREGIAO      := C_ITENS.CDREGIAO;
            OUT_RECORD.NMREGIAO      := C_ITENS.NMREGIAO;
            OUT_RECORD.CDPRODUTO     := C_ITENS.CDPRODUTO;
            OUT_RECORD.CDARVPROD     := C_ITENS.CDARVPROD;
            OUT_RECORD.NMPRODUTO     := C_ITENS.NMPRODUTO;
            OUT_RECORD.SGUNIDADE     := C_ITENS.SGUNIDADE;
            OUT_RECORD.CDPRODESTO    := C_ITENS.CDPRODESTO;
            OUT_RECORD.CDMARCA       := C_ITENS.CDMARCA;
            OUT_RECORD.NMMARCA       := C_ITENS.NMMARCA;
            OUT_RECORD.CDMARCAPADR   := C_ITENS.CDMARCAPADR;
            OUT_RECORD.CDFORNECED    := C_ITENS.CDFORNECED;
            OUT_RECORD.NMFANTFORN    := C_ITENS.NMFANTFORN;
            OUT_RECORD.NMRAZSOCFORN  := C_ITENS.NMRAZSOCFORN;
            OUT_RECORD.NRINSJURFORN  := C_ITENS.NRINSJURFORN;
            OUT_RECORD.IDTPIJURFORN  := C_ITENS.IDTPIJURFORN;
            OUT_RECORD.IDTPFRETFORN  := C_ITENS.IDTPFRETFORN;
            OUT_RECORD.CDOPERADOR    := C_ITENS.CDOPERADOR;
            OUT_RECORD.NMOPERADOR    := C_ITENS.NMOPERADOR;
            OUT_RECORD.NRCOMPRA      := C_ITENS.NRCOMPRA;
            OUT_RECORD.QTACOMPRAR    := V_QTDECOMP;
            OUT_RECORD.DSEMAILCOT    := C_ITENS.DSEMAILCOT;
            OUT_RECORD.DSMAILCOTCOP  := C_ITENS.DSMAILCOTCOP;
            PIPE ROW (OUT_RECORD);
         END IF;   
      END LOOP;
      SELECT COUNT(1)
        INTO V_IDFILINEGCOR
        FROM (SELECT 1
              FROM
                 PARAMPRODSUP,
                 FILIAL
              WHERE
                 FILIAL.CDFILIAL = P_CDFILIPROC AND
                 FILIAL.IDFUNCAOFILI = 'C' AND
                 FILIAL.CDFILIAL = PARAMPRODSUP.CDFILICTRL AND
                 PARAMPRODSUP.IDFILINEGCOR = 'S'
              UNION ALL
              SELECT 1
              FROM
                 PARAMPRODSUP,
                 FILIAL
              WHERE
                 FILIAL.CDFILIAL = P_CDFILIPROC AND
                 FILIAL.IDFUNCAOFILI = 'R' AND
                 FILIAL.CDFILIAL = PARAMPRODSUP.CDFILICTRL AND
                 PARAMPRODSUP.IDFILINEGREG = 'S');
      IF V_IDFILINEGCOR > 0 THEN
         FOR C_ITENS IN (SELECT
                            COMPLETO.CDREGIAO,     COMPLETO.NMREGIAO,
                            COMPLETO.CDOPERADOR,   COMPLETO.NMOPERADOR,
                            COMPLETO.CDFORNECED,   COMPLETO.NRINSJURFORN,
                            COMPLETO.IDTPIJURFORN, COMPLETO.NMRAZSOCFORN,
                            COMPLETO.NMFANTFORN,   COMPLETO.CDPRODUTO,
                            COMPLETO.NMPRODUTO,    COMPLETO.SGUNIDADE,
                            COMPLETO.CDPRODESTO,   COMPLETO.IDTPFRETFORN,
                            COMPLETO.CDMARCA,      COMPLETO.NMMARCA,
                            COMPLETO.CDMARCAPADR,  COMPLETO.CDARVPROD,
                            0 QTACOMPRAR,
                            '' NRCOMPRA,
                            COMPLETO.DSEMAILCOT,
                            COMPLETO.DSMAILCOTCOP
                         FROM
                             PARASUPRI,
                            (SELECT
                               REGIAO.CDREGIAO,          REGIAO.NMREGIAO,
                               OPERADOR.CDOPERADOR,      OPERADOR.NMOPERADOR,
                               PRODFORNCOMP.CDFORNECED,  FORNECEDOR.NRINSJURFORN,
                               FORNECEDOR.IDTPIJURFORN,  FORNECEDOR.NMRAZSOCFORN,
                               FORNECEDOR.NMFANTFORN,    PRODUTO.CDPRODUTO,
                               PRODUTO.CDARVPROD,        PRODUTO.NMPRODUTO,
                               PRODUTO.SGUNIDADE,        PRODUTO.CDPRODESTO,
                               FORNECEDOR.IDTPFRETFORN,
                               NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) AS CDMARCA,
                             REPLACE(REPLACE(MARCA.NMMARCA, CHR(13), ''), CHR(10), '') NMMARCA,
                               PARASUPRI.CDMARCA AS CDMARCAPADR,
                               NVL((SELECT DSEMAILFORN
                                     FROM TABLE(DADOS_FORN_EMAIL(FORNECEDOR.CDFORNECED, NULL, 'S'))), NVL(FORNECEDOR.DSEMAILPEDCOLFO, FORNECEDOR.DSEMAILCOT)) DSEMAILCOT,
                               NVL(FORNECEDOR.DSMAILPEDCOLCOP, FORNECEDOR.DSMAILCOTCOP) DSMAILCOTCOP
                             FROM
                               OPERADOR,     MARCA,
                               PRODUTO,      (SELECT CDPRODCOMPL, CDFORNECED
                                               FROM TABLE(PED_COLE(P_CDFORNECED, P_T_CDFORNECED, V_CDPRODINI,
                                                                  V_CDPRODFIN, V_TPRODUTO, P_CDCOMPRADOR, P_T_CDCOMPRADOR, P_PORTAL))) PRODFORNCOMP,
                               MARCPRODCOMP, FORNECEDOR,
                               REGIAO,       PARASUPRI
                             WHERE
                             (INSTR(P_CDCOMPRADOR, OPERADOR.CDOPERADOR) <> 0 OR (P_T_CDCOMPRADOR = 'T')) AND
                             PARASUPRI.CDFILIAL = P_CDFILIAL AND
                             ((NVL(PARASUPRI.IDUTLPROCMP, 'N') = 'N') OR
                              (NVL(PARASUPRI.IDUTLPROCMP, 'N') = 'S' AND
                               PRODUTO.CDPRODUTO <> PRODUTO.CDPRODESTO)) AND
                             ((PRODUTO.CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN) OR ((V_TPRODUTO = 'T'))) AND
                             (INSTR(P_CDFORNECED, FORNECEDOR.CDFORNECED) <> 0 OR (P_T_CDFORNECED = 'T'))AND
                             (INSTR(P_CDREGIAO, REGIAO.CDREGIAO        ) <> 0 OR (P_T_CDREGIAO   = 'T'))AND
                             NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) IS NOT NULL AND
                             INSTR(NVL(P_CDMARCA, MARCPRODCOMP.CDMARCA(+)), MARCPRODCOMP.CDMARCA(+))<> 0 AND

                             FORNECEDOR.CDFORNECED = PRODFORNCOMP.CDFORNECED  AND
                             PRODUTO.CDPRODUTO = PRODFORNCOMP.CDPRODCOMPL AND
                             PRODFORNCOMP.CDPRODCOMPL = MARCPRODCOMP.CDPRMARCOMPL(+) AND
                             MARCA.IDMARCAATIVA       = 'A' AND
                             MARCA.CDMARCA = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) AND
                             (NVL(PRODUTO.IDPRODATIVPR, 'N') =  'S')          AND
                             NOT EXISTS (SELECT REFOREG.CDREGIAO, REFOREG.CDFORNECED
                                         FROM REFOREG
                                         WHERE REFOREG.CDREGIAO = REGIAO.CDREGIAO AND
                                               REFOREG.CDFORNECED = FORNECEDOR.CDFORNECED) AND

                             EXISTS (SELECT PRODCOMP.CDPRODUTO, PRODCOMP.CDOPERADOR
                                         FROM PRODCOMP, PRODUTO PR
                                         WHERE PRODCOMP.CDPRODUTO = PR.CDPRODUTO AND
                                               PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%' AND
                                               OPERADOR.CDOPERADOR = PRODCOMP.CDOPERADOR) AND

                             NOT EXISTS (SELECT QUALIFICACAO.CDQUALIF   /* QUALIFICACAO DO FORNECEDOR */
                                         FROM QUALIFICACAO
                                         WHERE (FORNECEDOR.CDQUALIF       = QUALIFICACAO.CDQUALIF) AND
                                               (FORNECEDOR.IDFORNAUTO     = 'N')                   AND
                                               ((QUALIFICACAO.IDPERCOTCMP = '2')                   OR
                                                ((PARASUPRI.IDULTIDTVALQ  = 'D'                    AND
                                                  TO_DATE(SYSDATE) > FORNECEDOR.DTVALQUALIF)    OR
                                                (PARASUPRI.IDULTIDTVALQ = 'M'                      AND
                                                 TO_DATE(SYSDATE) > LAST_DAY(FORNECEDOR.DTVALQUALIF))))) AND
                             NOT EXISTS (SELECT QFOMARPROD.CDMARCA   /* QUALIFICACAO DE PRODUTO/MARCA */
                                         FROM QFOMARPROD
                                         WHERE (QFOMARPROD.CDPRODUTO    = PRODUTO.CDPRODUTO) AND
                                               (QFOMARPROD.CDMARCA      = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA))     AND
                                               ((QFOMARPROD.IDAPRMARPRO = 'N' AND QFOMARPROD.IDAUTMARPRO = 'N')   OR
                                               ((QFOMARPROD.IDAPRMARPRO = 'S') AND ((PARASUPRI.IDULTIDTVALQ = 'M' AND
                                                TO_DATE(SYSDATE) > LAST_DAY(QFOMARPROD.DTVALAPROVA)) OR
                                               (PARASUPRI.IDULTIDTVALQ = 'D' AND TO_DATE(SYSDATE) > QFOMARPROD.DTVALAPROVA))))) AND
                             EXISTS (SELECT    /* QUALIFICACAO DE PRODUTO/MARCA */
                                       QFOMARPROD.CDMARCA
                                     FROM
                                       QFOMARPROD
                                     WHERE
                                       QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO AND
                                       QFOMARPROD.CDMARCA   = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA)

                                     UNION

                                     SELECT
                                       PARASUPRI.CDMARCA
                                     FROM
                                       PARASUPRI
                                     WHERE
                                       PARASUPRI.CDFILIAL    = P_CDFILIAL AND
                                       (PARASUPRI.IDMARSEMQUA = 'N' OR PARASUPRI.IDMARSEMQUA IS NULL)) AND
                             NOT EXISTS (SELECT     /* QUALIFICACAO DE PRODUTO/FORNECEDOR */
                                            QFOPRODFORN.CDPRODUTO
                                         FROM
                                            QFOPRODFORN
                                         WHERE
                                           (QFOPRODFORN.CDPRODUTO = PRODFORNCOMP.CDPRODCOMPL) AND
                                           (QFOPRODFORN.CDFORNECED= PRODFORNCOMP.CDFORNECED) AND
                                           ((QFOPRODFORN.IDFORNAPROV = 'N' AND QFOPRODFORN.IDFORNAUTOR = 'N') OR
                                            ((QFOPRODFORN.IDFORNAPROV = 'S') AND
                                               ((PARASUPRI.IDULTIDTVALQ = 'M' AND
                                                 TO_DATE(SYSDATE) > LAST_DAY(QFOPRODFORN.DTVALPRFORN)) OR
                                                (PARASUPRI.IDULTIDTVALQ = 'D' AND
                                                 TO_DATE(SYSDATE) > QFOPRODFORN.DTVALPRFORN))))) AND
                             EXISTS ((SELECT 1
                                        FROM MARCFORNPEDCOL
                                       WHERE MARCFORNPEDCOL.CDFORNECED = FORNECEDOR.CDFORNECED
                                         AND MARCFORNPEDCOL.CDMARCA    = MARCA.CDMARCA)
                                    UNION ALL
                                    (SELECT 1
                                       FROM DUAL
                                      WHERE NOT EXISTS (SELECT 1
                                                          FROM MARCFORNPEDCOL
                                                         WHERE MARCFORNPEDCOL.CDFORNECED = FORNECEDOR.CDFORNECED)))

                         ) COMPLETO,
                             (SELECT
                                 PARAMPRODSUP.CDREGIAO,
                                 PARAMPRODSUP.CDPRODUTO
                              FROM
                                 PARAMPRODSUP,
                                 FILIAL
                              WHERE
                                 FILIAL.CDFILIAL = P_CDFILIPROC AND
                                 FILIAL.IDFUNCAOFILI = 'C' AND
                                 FILIAL.CDFILIAL = PARAMPRODSUP.CDFILICTRL AND
                                 PARAMPRODSUP.IDFILINEGCOR = 'S'

                              UNION ALL

                              SELECT
                                 PARAMPRODSUP.CDREGIAO,
                                 PARAMPRODSUP.CDPRODUTO
                              FROM
                                 PARAMPRODSUP,
                                 FILIAL
                              WHERE
                                 FILIAL.CDFILIAL = P_CDFILIPROC AND
                                 FILIAL.IDFUNCAOFILI = 'R' AND
                                 FILIAL.CDFILIAL = PARAMPRODSUP.CDFILICTRL AND
                                 PARAMPRODSUP.IDFILINEGREG = 'S') PARAMPRODSUP
                         WHERE
                            PARASUPRI.CDFILIAL = P_CDFILIAL AND
                            NVL(PARASUPRI.IDCONSPRSOL, 'N') <> 'S' AND

                            PARAMPRODSUP.CDPRODUTO = COMPLETO.CDPRODUTO(+) AND
                            PARAMPRODSUP.CDREGIAO  = COMPLETO.CDREGIAO(+))
         LOOP
            V_QTDECOMP := 0;
            SELECT
             NVL(SUM(ITEMSOLI.QTSOLIPROD*PRODUTO.VRFATOCONV/ESTOQUE.VRFATOCONV), 0) AS QTDECOMP
            INTO V_QTDECOMP
            FROM
             PRODUTO ESTOQUE, PRODUTO, ITEMSOLI, FILIAL
            WHERE
             (ITEMSOLI.CDFILSOLI = FILIAL.CDFILIAL)  AND
             (FILIAL.CDREGIAO    = C_ITENS.CDREGIAO)  AND
             (ITEMSOLI.IDITMCONS = 'N') AND
             (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
             (ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO)  AND
             (PRODUTO.CDPRODESTO = ESTOQUE.CDPRODESTO) AND
             (ESTOQUE.CDARVPROD   = C_ITENS.CDARVPROD) AND
             (ITEMSOLI.DTPROGENTR BETWEEN P_DTINI AND P_DTFIN) AND
             NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                1
                           FROM REFORFIL
                          WHERE REFORFIL.CDFORNECED = C_ITENS.CDFORNECED AND
                                REFORFIL.CDFILIAL   = ITEMSOLI.CDFILSOLI AND
                                REFORFIL.CDPERIENTR IS NULL);
            IF V_QTDECOMP > 0 THEN
               SELECT
                NVL(SUM(ITEMAUTF.QTPROGENTAF*PRODUTO.VRFATOCONV/ESTOQUE.VRFATOCONV), 0) AS QTPROGENTAF
               INTO V_QTPROGENTAF
               FROM
                PRODUTO, ITEMAUTF, AUTOFORNE, PRODUTO ESTOQUE, FILIAL
               WHERE
               (AUTOFORNE.CDFILDEST= FILIAL.CDFILIAL)  AND
               (FILIAL.CDREGIAO    = C_ITENS.CDREGIAO)  AND
               (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST) AND
               (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC) AND
               (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN) AND
               (ITEMAUTF.CDPRODUTO = PRODUTO.CDPRODUTO) AND
               (PRODUTO.CDPRODESTO = ESTOQUE.CDPRODESTO) AND
               (ESTOQUE.CDARVPROD   = C_ITENS.CDARVPROD) AND
               (AUTOFORNE.IDSITUATUAAF IS NULL) AND
               (AUTOFORNE.IDAFFORALIM = 'N') AND
               (AUTOFORNE.IDAUTOFORNEX = 'N') AND
               (ITEMAUTF.DTENTRITMSOL BETWEEN P_DTINI AND P_DTFIN) AND
               NVL(AUTOFORNE.IDBAIXAAF, '0') <> '5' AND
               NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                1
                           FROM REFORFIL
                          WHERE REFORFIL.CDFORNECED = C_ITENS.CDFORNECED AND
                                REFORFIL.CDFILIAL   = ITEMAUTF.CDFILDEST AND
                                REFORFIL.CDPERIENTR IS NULL);
               V_QTDECOMP := V_QTDECOMP - V_QTPROGENTAF;
               IF V_QTDECOMP < 0 THEN
                  V_QTDECOMP := 0;
               ELSE
                  V_QTDECOMP := CEIL(V_QTDECOMP);
               END IF;
            END IF;
            IF V_QTDECOMP > 0 THEN
               OUT_RECORD.CDREGIAO      := C_ITENS.CDREGIAO;
               OUT_RECORD.NMREGIAO      := C_ITENS.NMREGIAO;
               OUT_RECORD.CDPRODUTO     := C_ITENS.CDPRODUTO;
               OUT_RECORD.CDARVPROD     := C_ITENS.CDARVPROD;
               OUT_RECORD.NMPRODUTO     := C_ITENS.NMPRODUTO;
               OUT_RECORD.SGUNIDADE     := C_ITENS.SGUNIDADE;
               OUT_RECORD.CDPRODESTO    := C_ITENS.CDPRODESTO;
               OUT_RECORD.CDMARCA       := C_ITENS.CDMARCA;
               OUT_RECORD.NMMARCA       := C_ITENS.NMMARCA;
               OUT_RECORD.CDMARCAPADR   := C_ITENS.CDMARCAPADR;
               OUT_RECORD.CDFORNECED    := C_ITENS.CDFORNECED;
               OUT_RECORD.NMFANTFORN    := C_ITENS.NMFANTFORN;
               OUT_RECORD.NMRAZSOCFORN  := C_ITENS.NMRAZSOCFORN;
               OUT_RECORD.NRINSJURFORN  := C_ITENS.NRINSJURFORN;
               OUT_RECORD.IDTPIJURFORN  := C_ITENS.IDTPIJURFORN;
               OUT_RECORD.IDTPFRETFORN  := C_ITENS.IDTPFRETFORN;
               OUT_RECORD.CDOPERADOR    := C_ITENS.CDOPERADOR;
               OUT_RECORD.NMOPERADOR    := C_ITENS.NMOPERADOR;
               OUT_RECORD.NRCOMPRA      := C_ITENS.NRCOMPRA;
               OUT_RECORD.QTACOMPRAR    := V_QTDECOMP;
               OUT_RECORD.DSEMAILCOT    := C_ITENS.DSEMAILCOT;
               OUT_RECORD.DSMAILCOTCOP  := C_ITENS.DSMAILCOTCOP;
               PIPE ROW (OUT_RECORD);
            END IF;
         END LOOP;
      END IF;
  ELSE
     FOR C_ITENS IN (SELECT
                          COMPLETO.CDREGIAO,     COMPLETO.NMREGIAO,
                          COMPLETO.CDOPERADOR,   COMPLETO.NMOPERADOR,
                          COMPLETO.CDFORNECED,   COMPLETO.NRINSJURFORN,
                          COMPLETO.IDTPIJURFORN, COMPLETO.NMRAZSOCFORN,
                          COMPLETO.NMFANTFORN,   COMPLETO.CDPRODUTO,
                          COMPLETO.NMPRODUTO,    COMPLETO.SGUNIDADE,
                          COMPLETO.CDPRODESTO,   COMPLETO.IDTPFRETFORN,
                          COMPLETO.CDMARCA,      COMPLETO.NMMARCA,
                          COMPLETO.CDMARCAPADR,  COMPLETO.CDARVPROD,
                          0 QTACOMPRAR,
                          '' NRCOMPRA,
                          COMPLETO.DSEMAILCOT,
                          COMPLETO.DSMAILCOTCOP
                       FROM
                           PARASUPRI,
                           FILIAL FILI,
                          (SELECT
                             REGIAO.CDREGIAO,          REGIAO.NMREGIAO,
                             OPERADOR.CDOPERADOR,      OPERADOR.NMOPERADOR,
                             PRODFORNCOMP.CDFORNECED,  FORNECEDOR.NRINSJURFORN,
                             FORNECEDOR.IDTPIJURFORN,  FORNECEDOR.NMRAZSOCFORN,
                             FORNECEDOR.NMFANTFORN,    PRODUTO.CDPRODUTO,
                             PRODUTO.CDARVPROD,        PRODUTO.NMPRODUTO,
                             PRODUTO.SGUNIDADE,        PRODUTO.CDPRODESTO,
                             FORNECEDOR.IDTPFRETFORN,
                             NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) AS CDMARCA,
                           REPLACE(REPLACE(MARCA.NMMARCA, CHR(13), ''), CHR(10), '') NMMARCA,
                             PARASUPRI.CDMARCA AS CDMARCAPADR,
                             NVL((SELECT DSEMAILFORN
                                    FROM TABLE(DADOS_FORN_EMAIL(FORNECEDOR.CDFORNECED, NULL, 'S'))), NVL(FORNECEDOR.DSEMAILPEDCOLFO, FORNECEDOR.DSEMAILCOT)) DSEMAILCOT,
                             NVL(FORNECEDOR.DSMAILPEDCOLCOP, FORNECEDOR.DSMAILCOTCOP) DSMAILCOTCOP
                           FROM
                             OPERADOR,     MARCA,
                             PRODUTO,      (SELECT CDPRODCOMPL, CDFORNECED
                                               FROM TABLE(PED_COLE(P_CDFORNECED, P_T_CDFORNECED, V_CDPRODINI,
                                                                  V_CDPRODFIN, V_TPRODUTO, P_CDCOMPRADOR, P_T_CDCOMPRADOR, P_PORTAL))) PRODFORNCOMP,
                             MARCPRODCOMP, FORNECEDOR,
                             REGIAO,       PARASUPRI
                           WHERE
                           (INSTR(P_CDCOMPRADOR, OPERADOR.CDOPERADOR) <> 0 OR (P_T_CDCOMPRADOR = 'T')) AND
                           PARASUPRI.CDFILIAL = P_CDFILIAL AND
                           ((NVL(PARASUPRI.IDUTLPROCMP, 'N') = 'N') OR
                            (NVL(PARASUPRI.IDUTLPROCMP, 'N') = 'S' AND
                             PRODUTO.CDPRODUTO <> PRODUTO.CDPRODESTO)) AND
                           ((PRODUTO.CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN) OR (V_TPRODUTO = 'T')) AND
                           (INSTR(P_CDFORNECED, FORNECEDOR.CDFORNECED) <> 0 OR (P_T_CDFORNECED = 'T'))AND
                           (INSTR(P_CDREGIAO, REGIAO.CDREGIAO        ) <> 0 OR (P_T_CDREGIAO   = 'T'))AND
                           NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) IS NOT NULL AND
                           INSTR(NVL(P_CDMARCA, MARCPRODCOMP.CDMARCA(+)), MARCPRODCOMP.CDMARCA(+))<> 0 AND

                           FORNECEDOR.CDFORNECED = PRODFORNCOMP.CDFORNECED  AND
                           PRODUTO.CDPRODUTO = PRODFORNCOMP.CDPRODCOMPL AND
                           PRODFORNCOMP.CDPRODCOMPL = MARCPRODCOMP.CDPRMARCOMPL(+) AND
                           MARCA.IDMARCAATIVA       = 'A' AND
                           MARCA.CDMARCA = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) AND
                           (NVL(PRODUTO.IDPRODATIVPR, 'N') =  'S')          AND
                           NOT EXISTS (SELECT REFOREG.CDREGIAO, REFOREG.CDFORNECED
                                       FROM REFOREG
                                       WHERE REFOREG.CDREGIAO = REGIAO.CDREGIAO AND
                                             REFOREG.CDFORNECED = FORNECEDOR.CDFORNECED) AND

                           EXISTS (SELECT PRODCOMP.CDPRODUTO, PRODCOMP.CDOPERADOR
                                       FROM PRODCOMP, PRODUTO PR
                                       WHERE PRODCOMP.CDPRODUTO = PR.CDPRODUTO AND
                                             PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%' AND
                                             OPERADOR.CDOPERADOR = PRODCOMP.CDOPERADOR) AND

                           NOT EXISTS (SELECT QUALIFICACAO.CDQUALIF   /* QUALIFICACAO DO FORNECEDOR */
                                       FROM QUALIFICACAO
                                       WHERE (FORNECEDOR.CDQUALIF       = QUALIFICACAO.CDQUALIF) AND
                                             (FORNECEDOR.IDFORNAUTO     = 'N')                   AND
                                             ((QUALIFICACAO.IDPERCOTCMP = '2')                   OR
                                              ((PARASUPRI.IDULTIDTVALQ  = 'D'                    AND
                                                TO_DATE(SYSDATE) > FORNECEDOR.DTVALQUALIF)    OR
                                              (PARASUPRI.IDULTIDTVALQ = 'M'                      AND
                                               TO_DATE(SYSDATE) > LAST_DAY(FORNECEDOR.DTVALQUALIF))))) AND
                           NOT EXISTS (SELECT QFOMARPROD.CDMARCA   /* QUALIFICACAO DE PRODUTO/MARCA */
                                       FROM QFOMARPROD
                                       WHERE (QFOMARPROD.CDPRODUTO    = PRODUTO.CDPRODUTO) AND
                                             (QFOMARPROD.CDMARCA      = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA))     AND
                                             ((QFOMARPROD.IDAPRMARPRO = 'N' AND QFOMARPROD.IDAUTMARPRO = 'N')   OR
                                             ((QFOMARPROD.IDAPRMARPRO = 'S') AND ((PARASUPRI.IDULTIDTVALQ = 'M' AND
                                              TO_DATE(SYSDATE) > LAST_DAY(QFOMARPROD.DTVALAPROVA)) OR
                                             (PARASUPRI.IDULTIDTVALQ = 'D' AND TO_DATE(SYSDATE) > QFOMARPROD.DTVALAPROVA))))) AND
                           EXISTS (SELECT    /* QUALIFICACAO DE PRODUTO/MARCA */
                                     QFOMARPROD.CDMARCA
                                   FROM
                                     QFOMARPROD
                                   WHERE
                                     QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO AND
                                     QFOMARPROD.CDMARCA   = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA)

                                   UNION

                                   SELECT
                                     PARASUPRI.CDMARCA
                                   FROM
                                     PARASUPRI
                                   WHERE
                                     PARASUPRI.CDFILIAL    = P_CDFILIAL AND
                                     (PARASUPRI.IDMARSEMQUA = 'N' OR PARASUPRI.IDMARSEMQUA IS NULL)) AND
                           NOT EXISTS (SELECT     /* QUALIFICACAO DE PRODUTO/FORNECEDOR */
                                          QFOPRODFORN.CDPRODUTO
                                       FROM
                                          QFOPRODFORN
                                       WHERE
                                         (QFOPRODFORN.CDPRODUTO = PRODFORNCOMP.CDPRODCOMPL) AND
                                         (QFOPRODFORN.CDFORNECED= PRODFORNCOMP.CDFORNECED) AND
                                         ((QFOPRODFORN.IDFORNAPROV = 'N' AND QFOPRODFORN.IDFORNAUTOR = 'N') OR
                                          ((QFOPRODFORN.IDFORNAPROV = 'S') AND
                                             ((PARASUPRI.IDULTIDTVALQ = 'M' AND
                                               TO_DATE(SYSDATE) > LAST_DAY(QFOPRODFORN.DTVALPRFORN)) OR
                                              (PARASUPRI.IDULTIDTVALQ = 'D' AND
                                               TO_DATE(SYSDATE) > QFOPRODFORN.DTVALPRFORN))))) AND
                           EXISTS ((SELECT 1
                                      FROM MARCFORNPEDCOL
                                     WHERE MARCFORNPEDCOL.CDFORNECED = FORNECEDOR.CDFORNECED
                                       AND MARCFORNPEDCOL.CDMARCA    = MARCA.CDMARCA)
                                  UNION ALL
                                  (SELECT 1
                                     FROM DUAL
                                    WHERE NOT EXISTS (SELECT 1
                                                        FROM MARCFORNPEDCOL
                                                       WHERE MARCFORNPEDCOL.CDFORNECED = FORNECEDOR.CDFORNECED)))

                       ) COMPLETO
                       WHERE
                          PARASUPRI.CDFILIAL = P_CDFILIAL AND
                          NVL(PARASUPRI.IDCONSPRSOL, 'N') = 'S' AND

                          FILI.CDFILIAL = P_CDFILIPROC AND
                          FILI.IDFUNCAOFILI IS NULL)
     LOOP
        V_QTDECOMP := 0;
        SELECT
         NVL(SUM(ITEMSOLI.QTSOLIPROD), 0) AS QTDECOMP
        INTO V_QTDECOMP
        FROM
         ITEMSOLI, FILIAL
        WHERE
         (ITEMSOLI.CDFILSOLI = FILIAL.CDFILIAL)  AND
         (FILIAL.CDREGIAO    = C_ITENS.CDREGIAO)  AND
         (ITEMSOLI.IDITMCONS = 'N') AND
         (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
         (ITEMSOLI.CDPRODUTO = C_ITENS.CDPRODUTO)  AND
         (ITEMSOLI.DTPROGENTR BETWEEN P_DTINI AND P_DTFIN) AND
         NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                            1
                       FROM REFORFIL
                      WHERE REFORFIL.CDFORNECED = C_ITENS.CDFORNECED AND
                            REFORFIL.CDFILIAL   = ITEMSOLI.CDFILSOLI AND
                            REFORFIL.CDPERIENTR IS NULL);
        IF V_QTDECOMP > 0 THEN
           SELECT
            NVL(SUM(ITEMAUTF.QTPROGENTAF), 0) AS QTPROGENTAF
           INTO V_QTPROGENTAF
           FROM
            ITEMAUTF, AUTOFORNE, FILIAL
           WHERE
           (AUTOFORNE.CDFILDEST= FILIAL.CDFILIAL)  AND
           (FILIAL.CDREGIAO    = C_ITENS.CDREGIAO)  AND
           (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST) AND
           (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC) AND
           (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN) AND
           (ITEMAUTF.CDPRODUTO = C_ITENS.CDPRODUTO) AND
           (AUTOFORNE.IDSITUATUAAF IS NULL) AND
           (AUTOFORNE.IDAFFORALIM = 'N') AND
           (AUTOFORNE.IDAUTOFORNEX = 'N') AND
           (ITEMAUTF.DTENTRITMSOL BETWEEN P_DTINI AND P_DTFIN) AND
           NVL(AUTOFORNE.IDBAIXAAF, '0') <> '5' AND
           NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                            1
                       FROM REFORFIL
                      WHERE REFORFIL.CDFORNECED = C_ITENS.CDFORNECED AND
                            REFORFIL.CDFILIAL   = ITEMAUTF.CDFILDEST AND
                            REFORFIL.CDPERIENTR IS NULL);
           V_QTDECOMP := V_QTDECOMP - V_QTPROGENTAF;
           IF V_QTDECOMP < 0 THEN
              V_QTDECOMP := 0;
           ELSE
              V_QTDECOMP := CEIL(V_QTDECOMP);
           END IF;
        END IF;
        IF V_QTDECOMP > 0 THEN
           OUT_RECORD.CDREGIAO      := C_ITENS.CDREGIAO;
           OUT_RECORD.NMREGIAO      := C_ITENS.NMREGIAO;
           OUT_RECORD.CDPRODUTO     := C_ITENS.CDPRODUTO;
           OUT_RECORD.CDARVPROD     := C_ITENS.CDARVPROD;
           OUT_RECORD.NMPRODUTO     := C_ITENS.NMPRODUTO;
           OUT_RECORD.SGUNIDADE     := C_ITENS.SGUNIDADE;
           OUT_RECORD.CDPRODESTO    := C_ITENS.CDPRODESTO;
           OUT_RECORD.CDMARCA       := C_ITENS.CDMARCA;
           OUT_RECORD.NMMARCA       := C_ITENS.NMMARCA;
           OUT_RECORD.CDMARCAPADR   := C_ITENS.CDMARCAPADR;
           OUT_RECORD.CDFORNECED    := C_ITENS.CDFORNECED;
           OUT_RECORD.NMFANTFORN    := C_ITENS.NMFANTFORN;
           OUT_RECORD.NMRAZSOCFORN  := C_ITENS.NMRAZSOCFORN;
           OUT_RECORD.NRINSJURFORN  := C_ITENS.NRINSJURFORN;
           OUT_RECORD.IDTPIJURFORN  := C_ITENS.IDTPIJURFORN;
           OUT_RECORD.IDTPFRETFORN  := C_ITENS.IDTPFRETFORN;
           OUT_RECORD.CDOPERADOR    := C_ITENS.CDOPERADOR;
           OUT_RECORD.NMOPERADOR    := C_ITENS.NMOPERADOR;
           OUT_RECORD.NRCOMPRA      := C_ITENS.NRCOMPRA;
           OUT_RECORD.QTACOMPRAR    := V_QTDECOMP;
           OUT_RECORD.DSEMAILCOT    := C_ITENS.DSEMAILCOT;
           OUT_RECORD.DSMAILCOTCOP  := C_ITENS.DSMAILCOTCOP;
           PIPE ROW (OUT_RECORD);
        END IF;   
     END LOOP;
     SELECT COUNT(1)
        INTO V_IDFILINEGCOR
        FROM (SELECT 1
              FROM
                 PARAMPRODSUP,
                 FILIAL
              WHERE
                 FILIAL.CDFILIAL = P_CDFILIPROC AND
                 FILIAL.IDFUNCAOFILI = 'C' AND
                 FILIAL.CDFILIAL = PARAMPRODSUP.CDFILICTRL AND
                 PARAMPRODSUP.IDFILINEGCOR = 'S'
              UNION ALL
              SELECT 1
              FROM
                 PARAMPRODSUP,
                 FILIAL
              WHERE
                 FILIAL.CDFILIAL = P_CDFILIPROC AND
                 FILIAL.IDFUNCAOFILI = 'R' AND
                 FILIAL.CDFILIAL = PARAMPRODSUP.CDFILICTRL AND
                 PARAMPRODSUP.IDFILINEGREG = 'S');
      IF V_IDFILINEGCOR > 0 THEN
         FOR C_ITENS IN (SELECT
                            COMPLETO.CDREGIAO,     COMPLETO.NMREGIAO,
                            COMPLETO.CDOPERADOR,   COMPLETO.NMOPERADOR,
                            COMPLETO.CDFORNECED,   COMPLETO.NRINSJURFORN,
                            COMPLETO.IDTPIJURFORN, COMPLETO.NMRAZSOCFORN,
                            COMPLETO.NMFANTFORN,   COMPLETO.CDPRODUTO,
                            COMPLETO.NMPRODUTO,    COMPLETO.SGUNIDADE,
                            COMPLETO.CDPRODESTO,   COMPLETO.IDTPFRETFORN,
                            COMPLETO.CDMARCA,      COMPLETO.NMMARCA,
                            COMPLETO.CDMARCAPADR,  COMPLETO.CDARVPROD,
                            0 QTACOMPRAR,
                            '' NRCOMPRA,
                            COMPLETO.DSEMAILCOT,
                            COMPLETO.DSMAILCOTCOP
                         FROM
                             PARASUPRI,
                            (SELECT
                               REGIAO.CDREGIAO,          REGIAO.NMREGIAO,
                               OPERADOR.CDOPERADOR,      OPERADOR.NMOPERADOR,
                               PRODFORNCOMP.CDFORNECED,  FORNECEDOR.NRINSJURFORN,
                               FORNECEDOR.IDTPIJURFORN,  FORNECEDOR.NMRAZSOCFORN,
                               FORNECEDOR.NMFANTFORN,    PRODUTO.CDPRODUTO,
                               PRODUTO.CDARVPROD,        PRODUTO.NMPRODUTO,
                               PRODUTO.SGUNIDADE,        PRODUTO.CDPRODESTO,
                               FORNECEDOR.IDTPFRETFORN,
                               NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) AS CDMARCA,
                               REPLACE(REPLACE(MARCA.NMMARCA, CHR(13), ''), CHR(10), '') NMMARCA,
                               PARASUPRI.CDMARCA AS CDMARCAPADR,
                               NVL((SELECT DSEMAILFORN
                                      FROM TABLE(DADOS_FORN_EMAIL(FORNECEDOR.CDFORNECED, NULL, 'S'))), NVL(FORNECEDOR.DSEMAILPEDCOLFO, FORNECEDOR.DSEMAILCOT)) DSEMAILCOT,
                               NVL(FORNECEDOR.DSMAILPEDCOLCOP, FORNECEDOR.DSMAILCOTCOP) DSMAILCOTCOP
                             FROM
                               OPERADOR,     MARCA,
                               PRODUTO,      (SELECT CDPRODCOMPL, CDFORNECED
                                               FROM TABLE(PED_COLE(P_CDFORNECED, P_T_CDFORNECED, V_CDPRODINI,
                                                                  V_CDPRODFIN, V_TPRODUTO, P_CDCOMPRADOR, P_T_CDCOMPRADOR, P_PORTAL))) PRODFORNCOMP,
                               MARCPRODCOMP, FORNECEDOR,
                               REGIAO,       PARASUPRI
                             WHERE
                             (INSTR(P_CDCOMPRADOR, OPERADOR.CDOPERADOR) <> 0 OR (P_T_CDCOMPRADOR = 'T')) AND
                             PARASUPRI.CDFILIAL = P_CDFILIAL AND
                             ((NVL(PARASUPRI.IDUTLPROCMP, 'N') = 'N') OR
                              (NVL(PARASUPRI.IDUTLPROCMP, 'N') = 'S' AND
                               PRODUTO.CDPRODUTO <> PRODUTO.CDPRODESTO)) AND
                             ((PRODUTO.CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN) OR ((V_TPRODUTO = 'T'))) AND
                             (INSTR(P_CDFORNECED, FORNECEDOR.CDFORNECED) <> 0 OR (P_T_CDFORNECED = 'T'))AND
                             (INSTR(P_CDREGIAO, REGIAO.CDREGIAO        ) <> 0 OR (P_T_CDREGIAO   = 'T'))AND
                             NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) IS NOT NULL AND
                             INSTR(NVL(P_CDMARCA, MARCPRODCOMP.CDMARCA(+)), MARCPRODCOMP.CDMARCA(+))<> 0 AND

                             FORNECEDOR.CDFORNECED = PRODFORNCOMP.CDFORNECED  AND
                             PRODUTO.CDPRODUTO = PRODFORNCOMP.CDPRODCOMPL AND
                             PRODFORNCOMP.CDPRODCOMPL = MARCPRODCOMP.CDPRMARCOMPL(+) AND
                             MARCA.IDMARCAATIVA       = 'A' AND
                             MARCA.CDMARCA = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA) AND
                             (NVL(PRODUTO.IDPRODATIVPR, 'N') =  'S')          AND
                             NOT EXISTS (SELECT REFOREG.CDREGIAO, REFOREG.CDFORNECED
                                         FROM REFOREG
                                         WHERE REFOREG.CDREGIAO = REGIAO.CDREGIAO AND
                                               REFOREG.CDFORNECED = FORNECEDOR.CDFORNECED) AND

                             EXISTS (SELECT PRODCOMP.CDPRODUTO, PRODCOMP.CDOPERADOR
                                         FROM PRODCOMP, PRODUTO PR
                                         WHERE PRODCOMP.CDPRODUTO = PR.CDPRODUTO AND
                                               PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%' AND
                                               OPERADOR.CDOPERADOR = PRODCOMP.CDOPERADOR) AND

                             NOT EXISTS (SELECT QUALIFICACAO.CDQUALIF   /* QUALIFICACAO DO FORNECEDOR */
                                         FROM QUALIFICACAO
                                         WHERE (FORNECEDOR.CDQUALIF       = QUALIFICACAO.CDQUALIF) AND
                                               (FORNECEDOR.IDFORNAUTO     = 'N')                   AND
                                               ((QUALIFICACAO.IDPERCOTCMP = '2')                   OR
                                                ((PARASUPRI.IDULTIDTVALQ  = 'D'                    AND
                                                  TO_DATE(SYSDATE) > FORNECEDOR.DTVALQUALIF)    OR
                                                (PARASUPRI.IDULTIDTVALQ = 'M'                      AND
                                                 TO_DATE(SYSDATE) > LAST_DAY(FORNECEDOR.DTVALQUALIF))))) AND
                             NOT EXISTS (SELECT QFOMARPROD.CDMARCA   /* QUALIFICACAO DE PRODUTO/MARCA */
                                         FROM QFOMARPROD
                                         WHERE (QFOMARPROD.CDPRODUTO    = PRODUTO.CDPRODUTO) AND
                                               (QFOMARPROD.CDMARCA      = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA))     AND
                                               ((QFOMARPROD.IDAPRMARPRO = 'N' AND QFOMARPROD.IDAUTMARPRO = 'N')   OR
                                               ((QFOMARPROD.IDAPRMARPRO = 'S') AND ((PARASUPRI.IDULTIDTVALQ = 'M' AND
                                                TO_DATE(SYSDATE) > LAST_DAY(QFOMARPROD.DTVALAPROVA)) OR
                                               (PARASUPRI.IDULTIDTVALQ = 'D' AND TO_DATE(SYSDATE) > QFOMARPROD.DTVALAPROVA))))) AND
                             EXISTS (SELECT    /* QUALIFICACAO DE PRODUTO/MARCA */
                                       QFOMARPROD.CDMARCA
                                     FROM
                                       QFOMARPROD
                                     WHERE
                                       QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO AND
                                       QFOMARPROD.CDMARCA   = NVL(MARCPRODCOMP.CDMARCA, PARASUPRI.CDMARCA)

                                     UNION

                                     SELECT
                                       PARASUPRI.CDMARCA
                                     FROM
                                       PARASUPRI
                                     WHERE
                                       PARASUPRI.CDFILIAL    = P_CDFILIAL AND
                                       (PARASUPRI.IDMARSEMQUA = 'N' OR PARASUPRI.IDMARSEMQUA IS NULL)) AND
                             NOT EXISTS (SELECT     /* QUALIFICACAO DE PRODUTO/FORNECEDOR */
                                            QFOPRODFORN.CDPRODUTO
                                         FROM
                                            QFOPRODFORN
                                         WHERE
                                           (QFOPRODFORN.CDPRODUTO = PRODFORNCOMP.CDPRODCOMPL) AND
                                           (QFOPRODFORN.CDFORNECED= PRODFORNCOMP.CDFORNECED) AND
                                           ((QFOPRODFORN.IDFORNAPROV = 'N' AND QFOPRODFORN.IDFORNAUTOR = 'N') OR
                                            ((QFOPRODFORN.IDFORNAPROV = 'S') AND
                                               ((PARASUPRI.IDULTIDTVALQ = 'M' AND
                                                 TO_DATE(SYSDATE) > LAST_DAY(QFOPRODFORN.DTVALPRFORN)) OR
                                                (PARASUPRI.IDULTIDTVALQ = 'D' AND
                                                 TO_DATE(SYSDATE) > QFOPRODFORN.DTVALPRFORN))))) AND
                             EXISTS ((SELECT 1
                                        FROM MARCFORNPEDCOL
                                       WHERE MARCFORNPEDCOL.CDFORNECED = FORNECEDOR.CDFORNECED
                                         AND MARCFORNPEDCOL.CDMARCA    = MARCA.CDMARCA)
                                    UNION ALL
                                    (SELECT 1
                                       FROM DUAL
                                      WHERE NOT EXISTS (SELECT 1
                                                          FROM MARCFORNPEDCOL
                                                         WHERE MARCFORNPEDCOL.CDFORNECED = FORNECEDOR.CDFORNECED)))

                         ) COMPLETO,
                             (SELECT
                                 PARAMPRODSUP.CDREGIAO,
                                 PARAMPRODSUP.CDPRODUTO
                              FROM
                                 PARAMPRODSUP,
                                 FILIAL
                              WHERE
                                 FILIAL.CDFILIAL = P_CDFILIPROC AND
                                 FILIAL.IDFUNCAOFILI = 'C' AND
                                 FILIAL.CDFILIAL = PARAMPRODSUP.CDFILICTRL AND
                                 PARAMPRODSUP.IDFILINEGCOR = 'S'

                              UNION ALL

                              SELECT
                                 PARAMPRODSUP.CDREGIAO,
                                 PARAMPRODSUP.CDPRODUTO
                              FROM
                                 PARAMPRODSUP,
                                 FILIAL
                              WHERE
                                 FILIAL.CDFILIAL = P_CDFILIPROC AND
                                 FILIAL.IDFUNCAOFILI = 'R' AND
                                 FILIAL.CDFILIAL = PARAMPRODSUP.CDFILICTRL AND
                                 PARAMPRODSUP.IDFILINEGREG = 'S') PARAMPRODSUP
                         WHERE
                            PARASUPRI.CDFILIAL = P_CDFILIAL AND
                            NVL(PARASUPRI.IDCONSPRSOL, 'N') = 'S' AND
                            PARAMPRODSUP.CDPRODUTO = COMPLETO.CDPRODUTO AND
                            PARAMPRODSUP.CDREGIAO  = COMPLETO.CDREGIAO)
         LOOP
            V_QTDECOMP := 0;
            SELECT
             NVL(SUM(ITEMSOLI.QTSOLIPROD), 0) AS QTDECOMP
            INTO V_QTDECOMP
            FROM
             ITEMSOLI, FILIAL
            WHERE
             (ITEMSOLI.CDFILSOLI = FILIAL.CDFILIAL)  AND
             (FILIAL.CDREGIAO    = C_ITENS.CDREGIAO)  AND
             (ITEMSOLI.IDITMCONS = 'N') AND
             (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
             (ITEMSOLI.CDPRODUTO = C_ITENS.CDPRODUTO)  AND
             (ITEMSOLI.DTPROGENTR BETWEEN P_DTINI AND P_DTFIN) AND
             NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                1
                           FROM REFORFIL
                          WHERE REFORFIL.CDFORNECED = C_ITENS.CDFORNECED AND
                                REFORFIL.CDFILIAL   = ITEMSOLI.CDFILSOLI AND
                                REFORFIL.CDPERIENTR IS NULL);
            IF V_QTDECOMP > 0 THEN
               SELECT
                NVL(SUM(ITEMAUTF.QTPROGENTAF), 0) AS QTPROGENTAF
               INTO V_QTPROGENTAF
               FROM
                ITEMAUTF, AUTOFORNE, FILIAL
               WHERE
               (AUTOFORNE.CDFILDEST= FILIAL.CDFILIAL)  AND
               (FILIAL.CDREGIAO    = C_ITENS.CDREGIAO)  AND
               (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST) AND
               (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC) AND
               (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN) AND
               (ITEMAUTF.CDPRODUTO = C_ITENS.CDPRODUTO) AND
               (AUTOFORNE.IDSITUATUAAF IS NULL) AND
               (AUTOFORNE.IDAFFORALIM = 'N') AND
               (AUTOFORNE.IDAUTOFORNEX = 'N') AND
               (ITEMAUTF.DTENTRITMSOL BETWEEN P_DTINI AND P_DTFIN) AND
               NVL(AUTOFORNE.IDBAIXAAF, '0') <> '5' AND
               NOT EXISTS (SELECT /* + FIRST_ROWS(1) */
                                1
                           FROM REFORFIL
                          WHERE REFORFIL.CDFORNECED = C_ITENS.CDFORNECED AND
                                REFORFIL.CDFILIAL   = ITEMAUTF.CDFILDEST AND
                                REFORFIL.CDPERIENTR IS NULL);
               V_QTDECOMP := V_QTDECOMP - V_QTPROGENTAF;
               IF V_QTDECOMP < 0 THEN
                  V_QTDECOMP := 0;
               ELSE
                  V_QTDECOMP := CEIL(V_QTDECOMP);
               END IF;
            END IF;
            IF V_QTDECOMP > 0 THEN
               OUT_RECORD.CDREGIAO      := C_ITENS.CDREGIAO;
               OUT_RECORD.NMREGIAO      := C_ITENS.NMREGIAO;
               OUT_RECORD.CDPRODUTO     := C_ITENS.CDPRODUTO;
               OUT_RECORD.CDARVPROD     := C_ITENS.CDARVPROD;
               OUT_RECORD.NMPRODUTO     := C_ITENS.NMPRODUTO;
               OUT_RECORD.SGUNIDADE     := C_ITENS.SGUNIDADE;
               OUT_RECORD.CDPRODESTO    := C_ITENS.CDPRODESTO;
               OUT_RECORD.CDMARCA       := C_ITENS.CDMARCA;
               OUT_RECORD.NMMARCA       := C_ITENS.NMMARCA;
               OUT_RECORD.CDMARCAPADR   := C_ITENS.CDMARCAPADR;
               OUT_RECORD.CDFORNECED    := C_ITENS.CDFORNECED;
               OUT_RECORD.NMFANTFORN    := C_ITENS.NMFANTFORN;
               OUT_RECORD.NMRAZSOCFORN  := C_ITENS.NMRAZSOCFORN;
               OUT_RECORD.NRINSJURFORN  := C_ITENS.NRINSJURFORN;
               OUT_RECORD.IDTPIJURFORN  := C_ITENS.IDTPIJURFORN;
               OUT_RECORD.IDTPFRETFORN  := C_ITENS.IDTPFRETFORN;
               OUT_RECORD.CDOPERADOR    := C_ITENS.CDOPERADOR;
               OUT_RECORD.NMOPERADOR    := C_ITENS.NMOPERADOR;
               OUT_RECORD.NRCOMPRA      := C_ITENS.NRCOMPRA;
               OUT_RECORD.QTACOMPRAR    := V_QTDECOMP;
               OUT_RECORD.DSEMAILCOT    := C_ITENS.DSEMAILCOT;
               OUT_RECORD.DSMAILCOTCOP  := C_ITENS.DSMAILCOTCOP;
               PIPE ROW (OUT_RECORD);
            END IF;
         END LOOP;
      END IF;
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('PEDIDO_COLETA_ACOMP','6.35.019'); END;
/

