CREATE OR REPLACE PROCEDURE INSERE_AGRUPA(
   P_CDARVPROD IN VARCHAR,
   P_stEdit    IN VARCHAR)
AS
   V_CDPRODUTO   PRODUTO.CDPRODUTO%TYPE;
   V_CDPRODESTO  PRODUTO.CDPRODESTO%TYPE;
   V_COUNT       FLOAT;
   V_COUNT_ITEM  FLOAT;
   V_COUNT_TOTAL FLOAT;

   V_DSREMOTEADDR VARCHAR2(15);
   V_DSREMOTEHOST VARCHAR2(15);
   V_DSSERVERRDM  VARCHAR2(20);
   V_DSSERVMETHOD VARCHAR2(30);
   V_DSREMOTEOPER VARCHAR2(12);
BEGIN
   WEBTUNNING(V_DSREMOTEADDR,
              V_DSREMOTEHOST,
              V_DSSERVERRDM ,
              V_DSSERVMETHOD,
              V_DSREMOTEOPER);

   SELECT MAX(CDPRODUTO), MAX(CDPRODESTO) INTO V_CDPRODUTO, V_CDPRODESTO
   FROM PRODUTO
   WHERE  P_CDARVPROD = CDARVPROD ;

   IF P_stEdit = 's' THEN
      DELETE FROM PRODFORNCOMP
      WHERE CDPRODCOMPL = V_CDPRODUTO;
      DELETE FROM MARCPRODCOMP
      WHERE CDPRMARCOMPL = V_CDPRODUTO;
   END IF;

   FOR C_PRODUTO IN (SELECT CDPRODUTO
                     FROM PRODUTO
                     WHERE (CDPRODUTO = P_CDARVPROD OR
                            P_CDARVPROD LIKE CDARVPROD || '%'))LOOP

       DELETE FROM PRODUTOSEG
       WHERE CDPRODUTO = C_PRODUTO.CDPRODUTO;
   END LOOP;

   V_COUNT_ITEM  := 0;
   V_COUNT_TOTAL := 0;

   SELECT COUNT(*)
     INTO V_COUNT_TOTAL
     FROM NVSUBGRPROD NV, PRODUTO PR
    WHERE NV.CDPRODUTO = PR.CDPRODUTO
      AND (P_CDARVPROD = PR.CDARVPROD OR P_CDARVPROD LIKE CDARVPROD || '%')
      AND NOT EXISTS (SELECT CDPRODUTO
                        FROM PRSUBGRPROD
                       WHERE CDPRODUTO   = V_CDPRODUTO
                         AND CDGRUPPROD  = NV.CDGRUPPROD
                         AND CDSUBGRPROD = NV.CDSUBGRPROD);

   FOR C_SUBGRUP IN(
      SELECT CDGRUPPROD, CDSUBGRPROD, CDFILISUBGR, PR.CDPRODUTO, V_CDPRODUTO AS CDARVPROD
      FROM NVSUBGRPROD NV, PRODUTO PR
      WHERE  NV.CDPRODUTO = PR.CDPRODUTO AND
             (P_CDARVPROD = PR.CDARVPROD OR
             P_CDARVPROD LIKE CDARVPROD || '%') AND
             NOT EXISTS (SELECT CDPRODUTO
                           FROM PRSUBGRPROD
                          WHERE CDPRODUTO   = V_CDPRODUTO
                            AND CDGRUPPROD  = NV.CDGRUPPROD
                            AND CDSUBGRPROD = NV.CDSUBGRPROD))
   LOOP
      IF C_SUBGRUP.CDGRUPPROD IS NOT NULL THEN
         V_COUNT_ITEM := V_COUNT_ITEM + 1;

         INSERT INTO PRSUBGRPROD
           (CDGRUPPROD, CDSUBGRPROD, CDPRODUTO, CDFILISUBGR)
         VALUES
            (C_SUBGRUP.CDGRUPPROD, C_SUBGRUP.CDSUBGRPROD, C_SUBGRUP.CDARVPROD, C_SUBGRUP.CDFILISUBGR);

         INSERT INTO LOGINSEREAGRUPA
            (NMTABELA, CDPRODUTO, DTOPERACAO, QTITEM, QTTOTALITEM, DSRDMUSUOPER, DSENDUSUOPER, DSNMUSUOPER, DSMETUSUOPER)
         VALUES
            ('PRSUBGRPROD', C_SUBGRUP.CDPRODUTO, SYSDATE, V_COUNT_ITEM, V_COUNT_TOTAL, V_DSSERVERRDM, V_DSREMOTEADDR, V_DSREMOTEHOST, V_DSSERVMETHOD);
            
         COMMIT;
      END IF;
   END LOOP;

   V_COUNT_ITEM  := 0;
   V_COUNT_TOTAL := 0;

   SELECT COUNT(*)
     INTO V_COUNT_TOTAL
     FROM PRODFORN PF, PRODUTO PR
    WHERE PF.CDPRODUTO = PR.CDPRODUTO
      AND (P_CDARVPROD = PR.CDARVPROD OR P_CDARVPROD LIKE CDARVPROD || '%');

   FOR C_PRODFORN IN
      (SELECT PF.CDFORNECED, PR.CDPRODUTO, V_CDPRODUTO AS CDPRODCOMPL
        FROM PRODFORN PF, PRODUTO PR
       WHERE
          PF.CDPRODUTO = PR.CDPRODUTO AND
          (P_CDARVPROD = PR.CDARVPROD OR
          P_CDARVPROD LIKE CDARVPROD || '%'))
   LOOP
      V_COUNT_ITEM := V_COUNT_ITEM + 1;

      INSERT INTO PRODFORNCOMP
         (CDFORNECED, CDPRODUTO, CDPRODCOMPL)
      SELECT
         C_PRODFORN.CDFORNECED,
         C_PRODFORN.CDPRODUTO,
         C_PRODFORN.CDPRODCOMPL
      FROM
         DUAL
      WHERE
         NOT EXISTS(SELECT 1
                    FROM PRODFORNCOMP P
                    WHERE
                       P.CDFORNECED  =  C_PRODFORN.CDFORNECED  AND
                       P.CDPRODUTO   =  C_PRODFORN.CDPRODUTO   AND
                       P.CDPRODCOMPL =  C_PRODFORN.CDPRODCOMPL);

      INSERT INTO LOGINSEREAGRUPA
         (NMTABELA, CDPRODUTO, DTOPERACAO, QTITEM, QTTOTALITEM, DSRDMUSUOPER, DSENDUSUOPER, DSNMUSUOPER, DSMETUSUOPER)
      VALUES
         ('PRODFORNCOMP', C_PRODFORN.CDPRODUTO, SYSDATE, V_COUNT_ITEM, V_COUNT_TOTAL, V_DSSERVERRDM, V_DSREMOTEADDR, V_DSREMOTEHOST, V_DSSERVMETHOD);

      COMMIT;
   END LOOP;

   V_COUNT_ITEM  := 0;
   V_COUNT_TOTAL := 0;

   SELECT COUNT(*)
     INTO V_COUNT_TOTAL
     FROM MARCPROD MA, PRODUTO PR
    WHERE (MA.CDPRODUTO = PR.CDPRODUTO)
      AND (P_CDARVPROD  = PR.CDARVPROD OR P_CDARVPROD LIKE PR.CDARVPROD || '%');

   FOR C_MARCPROD IN
      (SELECT CDMARCA, PR.CDPRODUTO, V_CDPRODUTO AS CDPRMARCOMPL
       FROM MARCPROD MA, PRODUTO PR
       WHERE
          (MA.CDPRODUTO = PR.CDPRODUTO) AND
          (P_CDARVPROD = PR.CDARVPROD OR
          P_CDARVPROD LIKE PR.CDARVPROD || '%')
       GROUP BY CDMARCA, PR.CDPRODUTO)
   LOOP
      V_COUNT_ITEM := V_COUNT_ITEM + 1;

      INSERT INTO MARCPRODCOMP
         (CDMARCA, CDPRODUTO, CDPRMARCOMPL)
         (SELECT C_MARCPROD.CDMARCA, C_MARCPROD.CDPRODUTO, C_MARCPROD.CDPRMARCOMPL
          FROM  PARAMGERAL
          MINUS
          (SELECT CDMARCA, CDPRODUTO, CDPRMARCOMPL
           FROM MARCPRODCOMP
           WHERE CDMARCA      = C_MARCPROD.CDMARCA    AND
                 CDPRODUTO    = C_MARCPROD.CDPRODUTO  AND
                 CDPRMARCOMPL = C_MARCPROD.CDPRMARCOMPL));

      INSERT INTO LOGINSEREAGRUPA
         (NMTABELA, CDPRODUTO, DTOPERACAO, QTITEM, QTTOTALITEM, DSRDMUSUOPER, DSENDUSUOPER, DSNMUSUOPER, DSMETUSUOPER)
      VALUES
         ('MARCPRODCOMP', C_MARCPROD.CDPRODUTO, SYSDATE, V_COUNT_ITEM, V_COUNT_TOTAL, V_DSSERVERRDM , V_DSREMOTEADDR , V_DSREMOTEHOST, V_DSSERVMETHOD);

      COMMIT;
   END LOOP;

   V_COUNT_ITEM  := 0;
   V_COUNT_TOTAL := 0;

   SELECT COUNT(*)
     INTO V_COUNT_TOTAL
     FROM NIVELPRODSEG NI, PRODUTO PR
    WHERE NI.CDPRODUTO = PR.CDPRODUTO
      AND (P_CDARVPROD = CDARVPROD OR P_CDARVPROD LIKE CDARVPROD || '%');

   FOR C_SEGMENTO IN
      (SELECT CDSEGMER, PR.CDPRODUTO, V_CDPRODUTO AS NEWCDPRODUTO
       FROM NIVELPRODSEG NI, PRODUTO PR
       WHERE
           NI.CDPRODUTO = PR.CDPRODUTO AND
           (P_CDARVPROD = CDARVPROD OR
           P_CDARVPROD LIKE CDARVPROD || '%'))
   LOOP
      V_COUNT_ITEM := V_COUNT_ITEM + 1;

      INSERT INTO PRODUTOSEG
        (CDSEGMER, CDPRODUTO)
      VALUES
        (C_SEGMENTO.CDSEGMER, C_SEGMENTO.NEWCDPRODUTO);

      INSERT INTO LOGINSEREAGRUPA
         (NMTABELA, CDPRODUTO, DTOPERACAO, QTITEM, QTTOTALITEM, DSRDMUSUOPER , DSENDUSUOPER, DSNMUSUOPER, DSMETUSUOPER)
      VALUES
         ('PRODUTOSEG', C_SEGMENTO.CDPRODUTO, SYSDATE, V_COUNT_ITEM, V_COUNT_TOTAL, V_DSSERVERRDM, V_DSREMOTEADDR, V_DSREMOTEHOST, V_DSSERVMETHOD);

      COMMIT;
   END LOOP;

   V_COUNT       := 0;
   V_COUNT_ITEM  := 0;
   V_COUNT_TOTAL := 0;

   SELECT COUNT(1)
   INTO V_COUNT
   FROM QFOMARPROD Q
   WHERE Q.CDPRODUTO = V_CDPRODESTO;

   IF V_COUNT > 0 THEN
      INSERT INTO QFOMARPROD (CDPRODUTO, CDMARCA, IDAPRMARPRO, IDAUTMARPRO, DTVALAPROVA)
      SELECT
          V_CDPRODUTO, Q.CDMARCA, Q.IDAPRMARPRO, Q.IDAUTMARPRO, Q.DTVALAPROVA
      FROM QFOMARPROD Q
      WHERE Q.CDPRODUTO = V_CDPRODESTO
        AND NOT EXISTS (SELECT 1
                        FROM QFOMARPROD QFO
                        WHERE QFO.CDPRODUTO = V_CDPRODUTO
                          AND QFO.CDMARCA = Q.CDMARCA);
      SELECT COUNT(*)
        INTO V_COUNT_TOTAL
        FROM QFOMARPROD Q
       WHERE Q.CDPRODUTO = V_CDPRODESTO
         AND NOT EXISTS (SELECT 1
                           FROM QFOMARPROD QFO
                          WHERE QFO.CDPRODUTO = V_CDPRODUTO
                            AND QFO.CDMARCA = Q.CDMARCA);

      FOR C_QFOMARPROD IN (
         SELECT V_CDPRODUTO, Q.CDMARCA, Q.IDAPRMARPRO, Q.IDAUTMARPRO, Q.DTVALAPROVA, Q.CDPRODUTO
           FROM QFOMARPROD Q
          WHERE Q.CDPRODUTO = V_CDPRODESTO
            AND NOT EXISTS (SELECT 1
                              FROM QFOMARPROD QFO
                             WHERE QFO.CDPRODUTO = V_CDPRODUTO
                               AND QFO.CDMARCA = Q.CDMARCA))
      LOOP
         V_COUNT_ITEM := V_COUNT_ITEM + 1;

         INSERT INTO LOGINSEREAGRUPA
            (NMTABELA, CDPRODUTO, DTOPERACAO, QTITEM, QTTOTALITEM, DSRDMUSUOPER, DSENDUSUOPER, DSNMUSUOPER, DSMETUSUOPER)
         VALUES
            ('QFOMARPROD', C_QFOMARPROD.CDPRODUTO, SYSDATE, V_COUNT_ITEM, V_COUNT_TOTAL, V_DSSERVERRDM, V_DSREMOTEADDR, V_DSREMOTEHOST, V_DSSERVMETHOD);
      END LOOP;

      COMMIT;
   ELSE
      INSERT INTO QFOMARPROD (CDPRODUTO, CDMARCA, IDAPRMARPRO, IDAUTMARPRO, DTVALAPROVA)
      SELECT V_CDPRODUTO, QFOMARNIVELPROD.CDMARCA, QFOMARNIVELPROD.IDAPRMARNIVPROD, QFOMARNIVELPROD.IDAUTMARNIVPROD, QFOMARNIVELPROD.DTVALAPRNIVPROD
      FROM PRODUTO PRODQFO, QFOMARNIVELPROD
      WHERE QFOMARNIVELPROD.CDPRODUTO = PRODQFO.CDPRODUTO
        AND PRODQFO.CDARVPROD = (SELECT
                                     MAX(B.CDARVPROD)
                                  FROM
                                     QFOMARNIVELPROD A,
                                     PRODUTO B
                                  WHERE A.CDPRODUTO = B.CDPRODUTO
                                    AND INSTR(P_CDARVPROD, B.CDARVPROD) = 1);

      SELECT COUNT(*)
        INTO V_COUNT_TOTAL
        FROM PRODUTO PRODQFO, QFOMARNIVELPROD
       WHERE QFOMARNIVELPROD.CDPRODUTO = PRODQFO.CDPRODUTO
         AND PRODQFO.CDARVPROD = (SELECT MAX(B.CDARVPROD)
                                    FROM QFOMARNIVELPROD A, PRODUTO B
                                   WHERE A.CDPRODUTO = B.CDPRODUTO
                                     AND INSTR(P_CDARVPROD, B.CDARVPROD) = 1);

      FOR C_QFOMARPROD IN (
         SELECT V_CDPRODUTO, QFOMARNIVELPROD.CDMARCA, QFOMARNIVELPROD.IDAPRMARNIVPROD, QFOMARNIVELPROD.IDAUTMARNIVPROD, QFOMARNIVELPROD.DTVALAPRNIVPROD, PRODQFO.CDPRODUTO
           FROM PRODUTO PRODQFO, QFOMARNIVELPROD
          WHERE QFOMARNIVELPROD.CDPRODUTO = PRODQFO.CDPRODUTO
            AND PRODQFO.CDARVPROD = (SELECT MAX(B.CDARVPROD)
                                       FROM QFOMARNIVELPROD A, PRODUTO B
                                      WHERE A.CDPRODUTO = B.CDPRODUTO
                                        AND INSTR(P_CDARVPROD, B.CDARVPROD) = 1))
      LOOP
         V_COUNT_ITEM := V_COUNT_ITEM + 1;

         INSERT INTO LOGINSEREAGRUPA
            (NMTABELA, CDPRODUTO, DTOPERACAO, QTITEM, QTTOTALITEM, DSRDMUSUOPER, DSENDUSUOPER, DSNMUSUOPER, DSMETUSUOPER)
         VALUES
            ('QFOMARPROD', C_QFOMARPROD.CDPRODUTO, SYSDATE, V_COUNT_ITEM, V_COUNT_TOTAL, V_DSSERVERRDM, V_DSREMOTEADDR, V_DSREMOTEHOST, V_DSSERVMETHOD);
      END LOOP;

      COMMIT;
   END IF;
END;