create or replace
PROCEDURE USR_EXP_PRODUTO
IS
   V_NMPRODUTO  VARCHAR2(50);
   V_SGUNIDADE  VARCHAR2(5);
   V_VRFATOCONV FLOAT;
   V_IDPRODATIV CHAR;
   V_GRUPPROT   VARCHAR2(6);
   V_CONTCTBLEN VARCHAR2(20);
   V_CDCLASFISC VARCHAR2(10);
   V_CDARVPROD  VARCHAR2(20);
   V_PRODATIV   VARCHAR2(1);
   V_DTHRATUAL  DATE;
    
   CURSOR C_PRODUTO IS
      SELECT P.NMPRODUTO, P.SGUNIDADE, P.VRFATOCONV,
             P.CDCLASFISC, P.CDARVPROD, NVL(P.IDPRODATIVPR, 'S') IDPRODATIVPR
        FROM PRODUTO P
       WHERE P.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO)
         AND P.USR_DTEXPPROD IS NULL
         AND P.CDARVPROD NOT IN (SELECT CDPRODUTO FROM USR_PROT_PRODUTO);
   
   CURSOR C_ATUAL_PRODUTO IS
      SELECT P.NMPRODUTO, P.SGUNIDADE, P.VRFATOCONV,
             P.CDCLASFISC, P.CDARVPROD, NVL(P.IDPRODATIVPR, 'S') IDPRODATIVPR
        FROM PRODUTO P
       WHERE P.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO)
         AND P.DTULTATUPROD > P.USR_DTEXPPROD
         AND P.USR_DTEXPPROD IS NOT NULL;
   
   FUNCTION CONTCTBL_PRODUTO(P_CDARVPROD IN VARCHAR2) RETURN VARCHAR2
   IS
      V_MASCPROD VARCHAR2(20);
      V_CDPRODUT VARCHAR2(20);
      V_CDCTBLPR VARCHAR2(20);
      B_PRODCTBL BOOLEAN;
   BEGIN
      B_PRODCTBL := TRUE;
      V_CDPRODUT := P_CDARVPROD;
      V_CDCTBLPR := '';
      SELECT CDPICTPROD
        INTO V_MASCPROD
        FROM PARAMGERAL
       WHERE CDPARGERAL = '0001';
      
      WHILE B_PRODCTBL LOOP
         BEGIN
            SELECT MAX(CDCTBLCPROPR)
              INTO V_CDCTBLPR
              FROM PRODUTO P
             WHERE P.CDNVPRODUTO = (SELECT MIN(PR.CDNVPRODUTO)
                                      FROM PRODUTO PR
                                     WHERE REGEXP_LIKE(PR.CDARVPROD, '^'||V_CDPRODUT))
               AND REGEXP_LIKE(P.CDARVPROD, '^'||V_CDPRODUT);
         EXCEPTION
            WHEN OTHERS THEN
               V_CDCTBLPR := NULL;
               B_PRODCTBL := FALSE;
         END;
         V_MASCPROD := SUBSTR(V_MASCPROD, 1, INSTR(V_MASCPROD,'.', -1)-1);
         V_CDPRODUT := SUBSTR(V_CDPRODUT, 1, LENGTH(REGEXP_REPLACE(V_MASCPROD, '\W')));
         
         IF ((V_CDCTBLPR IS NOT NULL) OR (TRIM(V_MASCPROD) IS NULL)) THEN
            B_PRODCTBL := FALSE;
         END IF;
      END LOOP;
      
      RETURN V_CDCTBLPR;
   EXCEPTION
      WHEN OTHERS THEN
         RETURN '';
   END;
   
BEGIN
   OPEN C_PRODUTO;
   LOOP
      SELECT SYSDATE
        INTO V_DTHRATUAL
        FROM DUAL;
   
      FETCH C_PRODUTO INTO V_NMPRODUTO, V_SGUNIDADE, V_VRFATOCONV,
                           V_CDCLASFISC, V_CDARVPROD, V_PRODATIV;
      EXIT WHEN C_PRODUTO%NOTFOUND;
      BEGIN
         SELECT U.USR_CDTPPRODUTO
           INTO V_GRUPPROT
           FROM PRODUTO P, USR_PRODTPPRO U
          WHERE P.CDPRODUTO = U.USR_CDPRODTPPRO
            AND INSTR(V_CDARVPROD,P.CDARVPROD) = 1;
      EXCEPTION
         WHEN OTHERS THEN
            V_GRUPPROT := NULL;
      END;
      
      IF (V_GRUPPROT IS NOT NULL) THEN
         V_CONTCTBLEN := CONTCTBL_PRODUTO(V_CDARVPROD);
         
         INSERT INTO USR_PROT_PRODUTO(CDPRODUTO, NMPRODUTO, SGUNIDADE, VRFATOCONV, IDPRODATIVPR, GRUPO_PROT,  
                                      CONTA_CONTABIL, NCM_PROD, STATUS, IDINTERFACE, DTGRAVACAO, HRGRAVACAO) 
         VALUES(V_CDARVPROD, V_NMPRODUTO, V_SGUNIDADE, V_VRFATOCONV, V_PRODATIV, V_GRUPPROT, 
                V_CONTCTBLEN, V_CDCLASFISC, 'A', '1', TO_CHAR(V_DTHRATUAL, 'DD/MM/YYYY'), TO_CHAR(V_DTHRATUAL, 'HH24:MI')); 
          
         UPDATE PRODUTO 
            SET USR_DTEXPPROD = V_DTHRATUAL 
          WHERE CDARVPROD = V_CDARVPROD; 
      END IF;
   END LOOP; 
   CLOSE C_PRODUTO; 
    
   OPEN C_ATUAL_PRODUTO; 
   LOOP 
      SELECT SYSDATE
        INTO V_DTHRATUAL
        FROM DUAL;
      
      FETCH C_ATUAL_PRODUTO INTO V_NMPRODUTO, V_SGUNIDADE, V_VRFATOCONV,
                                 V_CDCLASFISC, V_CDARVPROD, V_PRODATIV;
      EXIT WHEN C_ATUAL_PRODUTO%NOTFOUND;
      
      BEGIN
         SELECT U.USR_CDTPPRODUTO
           INTO V_GRUPPROT
           FROM PRODUTO P, USR_PRODTPPRO U
          WHERE P.CDPRODUTO = U.USR_CDPRODTPPRO
            AND INSTR(V_CDARVPROD,P.CDARVPROD) = 1;
      EXCEPTION
         WHEN OTHERS THEN
            V_GRUPPROT := NULL;
      END;
      IF (V_GRUPPROT IS NOT NULL) THEN
         V_CONTCTBLEN := CONTCTBL_PRODUTO(V_CDARVPROD);
         
         INSERT INTO USR_PROT_PRODUTO(CDPRODUTO, NMPRODUTO, SGUNIDADE, VRFATOCONV, IDPRODATIVPR, GRUPO_PROT,
                                      CONTA_CONTABIL, NCM_PROD, STATUS, IDINTERFACE, DTGRAVACAO, HRGRAVACAO)
         VALUES(V_CDARVPROD, V_NMPRODUTO, V_SGUNIDADE, V_VRFATOCONV, V_PRODATIV, V_GRUPPROT,
                V_CONTCTBLEN, V_CDCLASFISC, 'A', '3', TO_CHAR(V_DTHRATUAL, 'DD/MM/YYYY'), TO_CHAR(V_DTHRATUAL, 'HH24:MI'));
         
         UPDATE PRODUTO
            SET USR_DTEXPPROD = V_DTHRATUAL
          WHERE CDARVPROD = V_CDARVPROD;
      END IF;
   END LOOP;
   CLOSE C_ATUAL_PRODUTO;
   
   COMMIT;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('USR_EXP_PRODUTO ','5.85.XXX'); END;
/