create or replace PROCEDURE RAST_PRODUTO_ORDPROD(P_CDFILIAL     IN VARCHAR2,
                                                 P_NRORDPROD    IN VARCHAR2,
                                                 P_NRSUBORDPROD IN VARCHAR2)
IS
   V_CDFILIAL           VARCHAR2(4);
   V_CDPRODUTO          VARCHAR2(10);
   V_NRLOTEESTQ         VARCHAR2(20);
   V_NRSUBLOTE          VARCHAR2(4);
   V_CDGTIN             VARCHAR2(14);
   V_NRREGISTROANVISA   VARCHAR2(20);
   V_DTVALIDLOTE        VARCHAR2(6);
   V_PAGES              INTEGER;
   V_CDSERIALSCNM_INI   VARCHAR2(20);
   V_CDSERIALSCNM_FIN   VARCHAR2(20);
   V_DTFABRLOTE         VARCHAR2(8);
   V_EXPDATE            VARCHAR2(8);
   V_PRD_ID             VARCHAR2(20);
   V_NMPRODUTO          VARCHAR2(20);
   
   -- LOTE SEM MASCARA
   V_LOTE   VARCHAR2(20);   
   V_ERRO   VARCHAR2(500);
   
   CURSOR C_SERIALPRODSCNM IS
      SELECT S.CDFILIAL, S.CDPRODUTO, S.NRLOTEESTQ NRLOTEESTQ, S.NRSUBLOTE, S.CDGTIN, S.NRREGISTROANVISA, 
             MIN(S.CDSERIALSCNM) INICIAL, MAX(S.CDSERIALSCNM) FINAL, S.DTVALIDLOTE, CEIL(TO_NUMBER(S.CDSERIALSCNM)/ 500) PAGES, /*,CDIUMPROD,*/
             TO_CHAR(S.DTFABRLOTE, 'YYYYMMDD') DTFABRLOTE, P.CDARVPROD PRD_ID, P.NMPRODUTO
        FROM SERIALPRODSCNM S, PRODUTO P
       WHERE CDFILIAL     = P_CDFILIAL
         AND NRORDPROD    = P_NRORDPROD
         AND NRSUBORDPROD = P_NRSUBORDPROD
         AND S.CDPRODUTO  = P.CDPRODUTO
         AND S.DTEXPORTA IS NULL
       GROUP BY S.CDFILIAL, S.CDPRODUTO, S.NRLOTEESTQ, S.NRSUBLOTE, S.CDGTIN, S.NRREGISTROANVISA, S.DTVALIDLOTE, CEIL(TO_NUMBER(S.CDSERIALSCNM)/ 500), DTFABRLOTE, P.CDARVPROD, P.NMPRODUTO
       ORDER BY PAGES;
BEGIN
   OPEN C_SERIALPRODSCNM;
   LOOP
      FETCH C_SERIALPRODSCNM INTO V_CDFILIAL, V_CDPRODUTO, V_NRLOTEESTQ, V_NRSUBLOTE, V_CDGTIN, V_NRREGISTROANVISA, 
                                  V_CDSERIALSCNM_INI, V_CDSERIALSCNM_FIN, V_DTVALIDLOTE, V_PAGES,
                                  V_DTFABRLOTE, V_PRD_ID, V_NMPRODUTO;
      EXIT WHEN C_SERIALPRODSCNM%NOTFOUND;
      
      SELECT REGEXP_REPLACE(V_NRLOTEESTQ, '\W')
        INTO V_LOTE
        FROM DUAL;
      
      SELECT TO_CHAR(TO_DATE(V_DTVALIDLOTE, 'YYMMDD'), 'YYYYMMDD') 
        INTO V_EXPDATE
        FROM DUAL;
      
      INSERT INTO OP_PRD_INTEGRA(CDFILIAL, CDPRODUTO, NRLOTEESTQ, NRSUBLOTE, NRORDPROD, NRSUBORDPROD,
                                 CDGTIN, NRREGISTROANVISA, DTVALIDLOTE, LOTE, SERIAL_INI, SERIAL_FIN, PAGES,
                                 BATCH, EXPDATE, MFGDATE, PRD_ID, NAME)
      VALUES(V_CDFILIAL, V_CDPRODUTO, V_NRLOTEESTQ, V_NRSUBLOTE, P_NRORDPROD, P_NRSUBORDPROD,
             V_CDGTIN, V_NRREGISTROANVISA, V_DTVALIDLOTE, V_LOTE, V_CDSERIALSCNM_INI, V_CDSERIALSCNM_FIN, V_PAGES,
             V_LOTE, V_EXPDATE, V_DTFABRLOTE, V_PRD_ID, V_NMPRODUTO);
      
      UPDATE SERIALPRODSCNM
         SET DTEXPORTA    = SYSDATE
       WHERE CDFILIAL     = P_CDFILIAL
         AND NRORDPROD    = P_NRORDPROD
         AND NRSUBORDPROD = P_NRSUBORDPROD
         AND CDSERIALSCNM BETWEEN V_CDSERIALSCNM_INI AND V_CDSERIALSCNM_FIN;
         
      COMMIT;
   END LOOP;
   CLOSE C_SERIALPRODSCNM;
EXCEPTION
   WHEN OTHERS THEN
      V_ERRO := SQLERRM(SQLCODE);
      
      IF C_SERIALPRODSCNM%ISOPEN THEN
         CLOSE C_SERIALPRODSCNM;
      END IF;
      
      ROLLBACK;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('RAST_PRODUTO_ORDPROD','6.39.016'); END;
/

