CREATE OR REPLACE PROCEDURE CAD_AUT_PARAMPRODSUP_FILI (P_CDFILIAL        IN VARCHAR2, /*Filial Origem*/
                                                       P_CDFILDEST       IN VARCHAR2, /*Lista de Filial Destino ou T*/ 
                                                       P_SUBSTITUI       IN VARCHAR2, /* S = Substitui e N = Acrescenta*/
                                                       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;
BEGIN
   P_ERROS := 'T';
   FOR C_FILDEST IN
      (SELECT CDFILIAL
         FROM FILIAL
        WHERE NVL(FILIAL.IDCNTRRESC, 'N') <> 'S'
          AND NVL(FILIAL.IDFUNCAOFILI, 'T') <> 'O'
          AND CDFILIAL <> P_CDFILIAL
          AND ((INSTR(P_CDFILDEST, CDFILIAL) > 0) OR (P_CDFILDEST = 'T')))
   LOOP
      V_CONTADOR := 0;
      SELECT NVL(MAX(P.IDUTILCONSSOLIOL), 'N')
        INTO V_IDUTILCONSSOLIOL
        FROM PARASUPRI P, FILIAL F
       WHERE F.CDFILIAL = C_FILDEST.CDFILIAL
         AND NVL(F.CDFILCENTCMP, F.CDFILIAL) = P.CDFILIAL;
      IF P_SUBSTITUI = 'S' THEN
         FOR C_DEL_FILDEST IN(SELECT ROWID, CDFILIOPELOG, CDPRODUTO
                                FROM PARAMPRODSUP
                               WHERE CDFILIAL = C_FILDEST.CDFILIAL
                                 AND CDFILIOPELOG IS NOT NULL)
         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_FILDEST.ROWID;
            IF V_IDUTILCONSSOLIOL = 'N' THEN
               DELETE
                 FROM PARTFILI
                WHERE CDFILIAL   = C_FILDEST.CDFILIAL
                  AND CDPRODUTO  = C_DEL_FILDEST.CDPRODUTO
                  AND CDTIPPART IN ('4', '7');
            END IF;
         END LOOP;
         COMMIT;
      END IF;
      V_CONTADOR := 0;
      FOR C_PARAMPRODSUP IN(SELECT CDFILIAL, CDPRODUTO, CDFILIOPELOG, CDGRUPPROD, CDSUBGRPROD, CDFILISUBGR
                              FROM PARAMPRODSUP
                             WHERE CDFILIAL     = P_CDFILIAL
                               AND CDFILIOPELOG IS NOT NULL)
      LOOP
         P_ERROS := 'N';
         V_CONTADOR := V_CONTADOR + 1;
         IF V_CONTADOR > 500 THEN
            V_CONTADOR := 0;
            COMMIT;
         END IF;
         IF V_CONTADOR = 1 THEN
            SELECT NVL(MAX(FILIAL.CDFORNOPELOG), 'N')
              INTO V_CDFORNOPELOG
              FROM FILIAL
             WHERE FILIAL.CDFILIAL = C_PARAMPRODSUP.CDFILIOPELOG;
         END IF;
         IF P_SUBSTITUI = 'S' THEN
            NOVO_CODIGO_NT('PARAMPRODSUP', V_NRSEQPARPROD);
            INSERT
              INTO PARAMPRODSUP (NRSEQPARPROD, CDFILIAL, CDPRODUTO, CDFILIOPELOG,
                                 CDGRUPPROD, CDSUBGRPROD, CDFILISUBGR)
            VALUES (V_NRSEQPARPROD, C_FILDEST.CDFILIAL, C_PARAMPRODSUP.CDPRODUTO, C_PARAMPRODSUP.CDFILIOPELOG,
                    C_PARAMPRODSUP.CDGRUPPROD, C_PARAMPRODSUP.CDSUBGRPROD, C_PARAMPRODSUP.CDFILISUBGR);
            IF V_IDUTILCONSSOLIOL = 'N' THEN
               INSERT
                 INTO PARTFILI (CDPRODUTO, CDFILIAL, NRSEQPART, CDTIPPART, CDFORNECED)
               VALUES (C_PARAMPRODSUP.CDPRODUTO, C_FILDEST.CDFILIAL, '1', '4', V_CDFORNOPELOG);
            END IF;
         ELSE
            SELECT COUNT(NRSEQPARPROD)
              INTO V_CONTA_PARAM
              FROM PARAMPRODSUP
             WHERE CDFILIAL    = C_FILDEST.CDFILIAL
               AND CDPRODUTO   = C_PARAMPRODSUP.CDPRODUTO
               AND CDFILIOPELOG IS NOT NULL
               AND CDGRUPPROD  = C_PARAMPRODSUP.CDGRUPPROD
               AND CDSUBGRPROD = C_PARAMPRODSUP.CDSUBGRPROD
               AND CDFILISUBGR = C_PARAMPRODSUP.CDFILISUBGR;
            IF V_CONTA_PARAM = 0 THEN
               NOVO_CODIGO_NT('PARAMPRODSUP', V_NRSEQPARPROD);
               INSERT
                 INTO PARAMPRODSUP (NRSEQPARPROD, CDFILIAL, CDPRODUTO, CDFILIOPELOG,
                                    CDGRUPPROD, CDSUBGRPROD, CDFILISUBGR)
               VALUES (V_NRSEQPARPROD, C_FILDEST.CDFILIAL, C_PARAMPRODSUP.CDPRODUTO, C_PARAMPRODSUP.CDFILIOPELOG,
                       C_PARAMPRODSUP.CDGRUPPROD, C_PARAMPRODSUP.CDSUBGRPROD, C_PARAMPRODSUP.CDFILISUBGR);
            END IF;
            IF V_IDUTILCONSSOLIOL = 'N' THEN
               SELECT COUNT(CDFILIAL)
                 INTO V_CONTA_PARFILI
                 FROM PARTFILI
                WHERE CDFILIAL    = C_FILDEST.CDFILIAL
                  AND CDPRODUTO   = C_PARAMPRODSUP.CDPRODUTO
                  AND CDTIPPART IN ('4', '7');
               IF V_CONTA_PARFILI = 0 THEN
                  INSERT
                    INTO PARTFILI (CDPRODUTO, CDFILIAL, NRSEQPART, CDTIPPART, CDFORNECED)
                  VALUES (C_PARAMPRODSUP.CDPRODUTO, C_FILDEST.CDFILIAL, '1', '4', V_CDFORNOPELOG);
               END IF;
            END IF;
         END IF;
      END LOOP;
      COMMIT;
   END LOOP;
   COMMIT;
END;
/

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