CREATE OR REPLACE PROCEDURE CAD_AUT_PARAMPRODSUP (P_CDFILIOPELOG    IN VARCHAR2, /*Lista de OL ou T*/
                                                  P_CDREGIAO        IN VARCHAR2, /*Lista de regiao ou T*/
                                                  P_CDFILDEST       IN VARCHAR2, /*Lista de Filial ou T*/
                                                  P_CDGRUPPROD      IN GRUPPROD.CDGRUPPROD%TYPE, /*Grupo de produto parametrizado no CMP-PARASUPRI.CDGRUPPROD*/
                                                  P_CDSUBGRPROD     IN VARCHAR2, /*Lista de Agrupamento de Produtos ou T*/
                                                  P_CDFILISUBGR     IN VARCHAR2, /*A princípio P*/ 
                                                  P_OPERACAO        IN VARCHAR2, /*I = Inclusão e E = Exclusão*/ 
                                                  P_CDPRODINI       IN VARCHAR2, /*Produto inicial*/
                                                  P_CDPRODFIN       IN VARCHAR2, /*Produto final*/
                                                  P_ERROS           OUT VARCHAR2) /*T = Não há dados e N = Concluido com Sucesso*/
IS
   V_CONTADOR          NUMERIC := 0;
   V_CONTA_PARAM       NUMERIC;
   V_CONTA_PARFILI     NUMERIC;
   V_IDUTILCONSSOLIOL  PARASUPRI.IDUTILCONSSOLIOL%TYPE;
   V_CDFORNOPELOG      FILIAL.CDFORNOPELOG%TYPE;
   V_NRSEQPARPROD      PARAMPRODSUP.NRSEQPARPROD%TYPE;
   V_IDSISDOS          VARCHAR2(1);
   V_CDSUBGRARVOR      PARASUPRI.CDSUBGRARVOR%TYPE;
BEGIN
   P_ERROS := 'T';
   SELECT NVL(MAX(IDSISDOS), '1')
     INTO V_IDSISDOS
     FROM PARAMGERAL;
   FOR C_FILIOPELOG IN
      (SELECT CDFILIAL
         FROM FILIAL
        WHERE NVL(FILIAL.IDCNTRRESC, 'N') <> 'S'
          AND NVL(FILIAL.IDFUNCAOFILI, 'T') = 'O'
          AND ((INSTR(P_CDFILIOPELOG, CDFILIAL) > 0) OR (P_CDFILIOPELOG = 'T')))
   LOOP
      V_CONTADOR := 0;
     SELECT NVL(MAX(FILIAL.CDFORNOPELOG), 'N')
       INTO V_CDFORNOPELOG
       FROM FILIAL
      WHERE FILIAL.CDFILIAL = C_FILIOPELOG.CDFILIAL;
     FOR C_FILDEST IN (SELECT CDFILIAL
                          FROM FILIAL
                         WHERE NVL(FILIAL.IDCNTRRESC, 'N') <> 'S'
                           AND NVL(FILIAL.IDFUNCAOFILI, 'T') <> 'O'
                           AND ((INSTR(P_CDREGIAO, CDREGIAO) > 0)  OR (P_CDREGIAO  = 'T'))
                           AND ((INSTR(P_CDFILDEST, CDFILIAL) > 0) OR (P_CDFILDEST = 'T'))
                           AND ((V_IDSISDOS <> '3')
                           OR  ((V_IDSISDOS = '3') AND EXISTS (SELECT 1
                                                                 FROM TIPOOPEROPL
                                                                WHERE TIPOOPEROPL.CDFILIOPELOG = C_FILIOPELOG.CDFILIAL
                                                                  AND TIPOOPEROPL.CDFILDEST    = FILIAL.CDFILIAL
                                                                  AND P_CDFILDEST = 'T'
                                                                  AND P_CDREGIAO  = 'T'))))
      LOOP
         V_CONTADOR := 0;
         SELECT NVL(MAX(P.IDUTILCONSSOLIOL), 'N'), MAX(CDSUBGRARVOR)
           INTO V_IDUTILCONSSOLIOL, V_CDSUBGRARVOR
           FROM PARASUPRI P, FILIAL F
          WHERE F.CDFILIAL = C_FILDEST.CDFILIAL
            AND NVL(F.CDFILCENTCMP, F.CDFILIAL) = P.CDFILIAL;
         IF P_OPERACAO = 'E' THEN
            FOR C_DEL_PARAMPRODSUP IN (SELECT PARAMPRODSUP.ROWID, PARAMPRODSUP.CDPRODUTO
                                       FROM PARAMPRODSUP, PRODUTO
                                      WHERE PARAMPRODSUP.CDPRODUTO    = PRODUTO.CDPRODUTO
                                        AND PARAMPRODSUP.CDFILIAL     = C_FILDEST.CDFILIAL
                                        AND PARAMPRODSUP.CDFILIOPELOG IS NOT NULL
                                        AND PARAMPRODSUP.CDFILIOPELOG  = C_FILIOPELOG.CDFILIAL
                                        AND PARAMPRODSUP.CDGRUPPROD    = P_CDGRUPPROD
                                        AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINI  AND RPAD(P_CDPRODFIN, 20, 'Z')
                                        AND ((INSTR(P_CDSUBGRPROD, PARAMPRODSUP.CDSUBGRPROD) > 0)  OR (P_CDSUBGRPROD = 'T'))
                                        AND PARAMPRODSUP.CDFILISUBGR = P_CDFILISUBGR)
            LOOP
               P_ERROS := 'N';
               V_CONTADOR := V_CONTADOR + 1;
               IF V_CONTADOR > 500 THEN
                  V_CONTADOR := 0;
                  COMMIT;
               END IF;
               DELETE
                 FROM PARAMPRODSUP
                WHERE PARAMPRODSUP.ROWID = C_DEL_PARAMPRODSUP.ROWID;
               IF V_IDUTILCONSSOLIOL = 'N' THEN
                  DELETE
                    FROM PARTFILI
                   WHERE CDFILIAL   = C_FILDEST.CDFILIAL
                     AND CDPRODUTO  = C_DEL_PARAMPRODSUP.CDPRODUTO
                     AND CDTIPPART IN ('4', '7');
               END IF;
            END LOOP;
            COMMIT;
         ELSE
            FOR C_INS_PARAMPRODSUP IN (SELECT PRODUTO.CDPRODUTO, PRSUBGRPROD.CDGRUPPROD, PRSUBGRPROD.CDSUBGRPROD, PRSUBGRPROD.CDFILISUBGR
                                       FROM PRSUBGRPROD, PRODUTO
                                      WHERE PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z')
                                        AND ((INSTR(P_CDSUBGRPROD, PRSUBGRPROD.CDSUBGRPROD) > 0) OR (P_CDSUBGRPROD = 'T'))
                                        AND PRSUBGRPROD.CDGRUPPROD = P_CDGRUPPROD
                                        AND CDPRODESTO IS NOT NULL
                                        AND PRSUBGRPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                                        AND PRSUBGRPROD.CDFILISUBGR = P_CDFILISUBGR
                                        AND PRSUBGRPROD.CDSUBGRPROD <> V_CDSUBGRARVOR
                                        AND NOT EXISTS (SELECT 1
                                                          FROM PARAMPRODSUP
                                                         WHERE PARAMPRODSUP.CDFILIAL     = C_FILDEST.CDFILIAL
                                                           AND PARAMPRODSUP.CDPRODUTO    = PRSUBGRPROD.CDPRODUTO
                                                           AND PARAMPRODSUP.CDFILIOPELOG = C_FILIOPELOG.CDFILIAL
                                                           AND PARAMPRODSUP.CDGRUPPROD   = PRSUBGRPROD.CDGRUPPROD
                                                           AND PARAMPRODSUP.CDSUBGRPROD  = PRSUBGRPROD.CDSUBGRPROD
                                                           AND PARAMPRODSUP.CDFILISUBGR  = 'P'))
            LOOP
               P_ERROS := 'N';
               V_CONTADOR := V_CONTADOR + 1;
               IF V_CONTADOR > 500 THEN
                  V_CONTADOR := 0;
                  COMMIT;
               END IF;
               NOVO_CODIGO_NT('PARAMPRODSUP', V_NRSEQPARPROD);
               INSERT
                 INTO PARAMPRODSUP (NRSEQPARPROD, CDFILIAL, CDPRODUTO, CDFILIOPELOG,
                                    CDGRUPPROD, CDSUBGRPROD, CDFILISUBGR)
               VALUES (V_NRSEQPARPROD, C_FILDEST.CDFILIAL, C_INS_PARAMPRODSUP.CDPRODUTO, C_FILIOPELOG.CDFILIAL,
                       C_INS_PARAMPRODSUP.CDGRUPPROD, C_INS_PARAMPRODSUP.CDSUBGRPROD, C_INS_PARAMPRODSUP.CDFILISUBGR);

               IF V_IDUTILCONSSOLIOL = 'N' THEN
                  DELETE
                    FROM PARTFILI
                   WHERE CDFILIAL   = C_FILDEST.CDFILIAL
                     AND CDPRODUTO  = C_INS_PARAMPRODSUP.CDPRODUTO
                     AND CDTIPPART IN ('4', '7');
                  INSERT
                    INTO PARTFILI (CDPRODUTO, CDFILIAL, NRSEQPART, CDTIPPART, CDFORNECED)
                  VALUES (C_INS_PARAMPRODSUP.CDPRODUTO, C_FILDEST.CDFILIAL, '1', '4', V_CDFORNOPELOG);
               END IF;
            END LOOP;
            COMMIT;
         END IF;
      END LOOP;
      COMMIT;
   END LOOP;
   COMMIT;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CAD_AUT_PARAMPRODSUP','6.49.019'); END;
/
