CREATE OR REPLACE PROCEDURE INCLUI_PARTFILI
                     (P_CDPRODINI    IN PRODUTO.CDARVPROD%TYPE,
                      P_CDPRODFIN    IN PRODUTO.CDARVPROD%TYPE,
                      P_TPRODUTO     IN VARCHAR2,
                      P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
                      P_CDMARCA      IN MARCA.CDMARCA%TYPE,
                      P_CDFORNECED   IN FORNECEDOR.CDFORNECED%TYPE,
                      P_CDTIPPART    IN PARTFILI.CDTIPPART%TYPE,
                      P_CDGRUPFILI   IN GRUPFILI.CDGRUPFILI%TYPE,
                      P_CDOPERADOR   IN OPERADOR.CDOPERADOR%TYPE,
                      P_CHECK        IN VARCHAR2/*S = Subistituir/ C = Clona/ A = Acrecenta*/,
                      P_CDFILIALORIG IN FILIAL.CDFILIAL%TYPE,
                      P_ROWSAFFECT   OUT VARCHAR2)
IS
  V_CHAVE      VARCHAR2(4) := '_';
  V_NRSEQPART  VARCHAR2(10);
BEGIN
  P_ROWSAFFECT := 'N';
  FOR C_ITENS IN(SELECT PF.CDFILIAL, PF.CDPRODUTO, PF.CDTIPPART, PF.NRSEQPART, PF.CDMARCA, PF.CDFORNECED
                   FROM PARTFILI PF, PRODUTO P
                  WHERE PF.CDFILCOTA    IS NULL
                    AND PF.NRCOLEPRECO  IS NULL
                    AND (PF.CDPRODUTO  =  P.CDPRODUTO)
                    AND ((P.CDARVPROD BETWEEN P_CDPRODINI  AND P_CDPRODFIN) OR P_TPRODUTO = 'T')
                    AND (INSTR(P_CDMARCA, PF.CDMARCA) <> 0 OR P_CDMARCA = 'T')
                    AND (INSTR(P_CDFORNECED, PF.CDFORNECED) <> 0 OR P_CDFORNECED = 'T')
                    AND (INSTR(P_CDTIPPART, PF.CDTIPPART)  <> 0)
                    AND (PF.CDFILIAL   =  P_CDFILIALORIG))
  LOOP
     P_ROWSAFFECT := 'S';
     FOR C_FILIAL IN (SELECT F.CDFILIAL, F.NMFILIAL
                        FROM FILIAL F, FILIOPER FP
                       WHERE F.CDFILIAL    = FP.CDFILIAL
                         AND ((INSTR(P_CDFILIAL, F.CDFILIAL) > 0) OR (P_CDFILIAL = 'T'))
                         AND (FP.CDOPERADOR = P_CDOPERADOR)
                         AND (F.CDFILIAL   <> P_CDFILIALORIG)
                         AND (F.CDFILIAL    = FP.CDFILIAL)
                         AND (P_CDGRUPFILI IS NULL OR EXISTS (SELECT 1
                                                                FROM FILGRUPFILI
                                                               WHERE FILGRUPFILI.CDFILIAL   = F.CDFILIAL
                                                                 AND FILGRUPFILI.CDGRUPFILI = P_CDGRUPFILI))
                       ORDER BY F.CDFILIAL)
     LOOP
        IF P_CHECK = 'S' THEN
           DELETE
             FROM PARTFILI
            WHERE PARTFILI.CDFILIAL   =  C_FILIAL.CDFILIAL
              AND PARTFILI.CDPRODUTO  =  C_ITENS.CDPRODUTO;
              --AND (INSTR(P_CDTIPPART, PARTFILI.CDTIPPART)  <> 0);
           INSERT
             INTO PARTFILI(CDFILIAL, CDPRODUTO, CDTIPPART, NRSEQPART, CDMARCA, CDFORNECED)
           VALUES (C_FILIAL.CDFILIAL, C_ITENS.CDPRODUTO, C_ITENS.CDTIPPART, C_ITENS.NRSEQPART, C_ITENS.CDMARCA, C_ITENS.CDFORNECED);
        ELSIF P_CHECK = 'C' THEN
           /*EXCLUIR*/
           IF V_CHAVE <> C_FILIAL.CDFILIAL THEN
              V_CHAVE := C_FILIAL.CDFILIAL;
              DELETE
                FROM PARTFILI
               WHERE PARTFILI.CDFILIAL   =  C_FILIAL.CDFILIAL
                 AND (INSTR(P_CDMARCA, PARTFILI.CDMARCA) <> 0 OR P_CDMARCA = 'T')
                 AND (INSTR(P_CDFORNECED, PARTFILI.CDFORNECED) <> 0 OR P_CDFORNECED = 'T')
                 --AND (INSTR(P_CDTIPPART, PARTFILI.CDTIPPART)  <> 0)
                 AND EXISTS (SELECT 1
                               FROM PRODUTO
                              WHERE PRODUTO.CDPRODUTO  =  PARTFILI.CDPRODUTO
                                AND ((PRODUTO.CDARVPROD BETWEEN P_CDPRODINI  AND P_CDPRODFIN) OR P_TPRODUTO = 'T'));

           END IF;
           INSERT
             INTO PARTFILI(CDFILIAL, CDPRODUTO, CDTIPPART, NRSEQPART, CDMARCA, CDFORNECED)
           VALUES (C_FILIAL.CDFILIAL, C_ITENS.CDPRODUTO, C_ITENS.CDTIPPART, C_ITENS.NRSEQPART, C_ITENS.CDMARCA, C_ITENS.CDFORNECED);
        ELSE
           /*ACRESCENTAR*/
           IF C_ITENS.CDTIPPART IN ('1', '4', '7') THEN
              INSERT
                INTO PARTFILI(CDFILIAL, CDPRODUTO, CDTIPPART, NRSEQPART, CDMARCA, CDFORNECED)
              SELECT C_FILIAL.CDFILIAL, C_ITENS.CDPRODUTO, C_ITENS.CDTIPPART, C_ITENS.NRSEQPART, C_ITENS.CDMARCA, C_ITENS.CDFORNECED
                FROM DUAL
               WHERE NOT EXISTS(SELECT 1
                                  FROM PARTFILI
                                 WHERE PARTFILI.CDFILIAL   =  C_FILIAL.CDFILIAL
                                   AND PARTFILI.CDPRODUTO  =  C_ITENS.CDPRODUTO
                                   AND PARTFILI.CDTIPPART  =  C_ITENS.CDTIPPART) ;
           ELSE
              SELECT LPAD(TO_NUMBER(NVL(MAX(NRSEQPART), '1')), 10, '0')
                INTO V_NRSEQPART
                FROM PARTFILI
               WHERE PARTFILI.CDFILIAL   =  C_FILIAL.CDFILIAL
                 AND PARTFILI.CDPRODUTO  =  C_ITENS.CDPRODUTO
                 AND PARTFILI.CDTIPPART  =  C_ITENS.CDTIPPART;

              INSERT
                INTO PARTFILI(CDFILIAL, CDPRODUTO, CDTIPPART, NRSEQPART, CDMARCA, CDFORNECED)
              SELECT C_FILIAL.CDFILIAL, C_ITENS.CDPRODUTO, C_ITENS.CDTIPPART, V_NRSEQPART, C_ITENS.CDMARCA, C_ITENS.CDFORNECED
                FROM DUAL
               WHERE NOT EXISTS(SELECT 1
                                  FROM PARTFILI
                                 WHERE PARTFILI.CDFILIAL              =  C_FILIAL.CDFILIAL
                                   AND PARTFILI.CDPRODUTO             =  C_ITENS.CDPRODUTO
                                   AND PARTFILI.CDTIPPART             =  C_ITENS.CDTIPPART
                                   AND NVL(PARTFILI.CDMARCA, '1')     =  NVL(C_ITENS.CDMARCA, '1')
                                   AND NVL(PARTFILI.CDFORNECED, '1')  =  NVL(C_ITENS.CDFORNECED, '1'));
           END IF;
        END IF;
     END LOOP;
  END LOOP;
END;