create or replace
PROCEDURE NOVO_CODIGO (
   P_CONTADOR   IN  NOVOCODIGO.CDCONTADOR%TYPE,
   P_SEQUENCIAL OUT NOVOCODIGO.NRSEQUENCIAL%TYPE,
   P_QTDE 		 IN  NUMBER DEFAULT 1,
   P_NRORG 		 IN  NUMBER DEFAULT 1)
AS
   V_COUNT NUMBER;
   V_CODIGO VARCHAR2(20);
   V_NRORG NUMBER;
   V_ORGANIZACAO INTEGER;
   V_IDUTCLOUD VARCHAR2(1);
BEGIN
   V_NRORG := NVL(SYS_CONTEXT('nrorg_ctx', 'nrorg'),1);
   IF (V_NRORG = 0) THEN
      IF (P_NRORG IS NULL) THEN
         V_NRORG := 1;
      ELSIF (P_NRORG = 0) THEN
         V_NRORG := 1;
      ELSE 
         V_NRORG := P_NRORG;
      END IF;
   END IF;
   
   SELECT COUNT(CDCONTADOR) 
     INTO V_COUNT
     FROM NOVOCODIGO
    WHERE CDCONTADOR = P_CONTADOR 
      AND NRORG = V_NRORG;
   IF (V_COUNT > 0) THEN
      SELECT NRSEQUENCIAL
        INTO V_CODIGO
        FROM NOVOCODIGO
       WHERE CDCONTADOR = P_CONTADOR
         AND NRORG = V_NRORG
         FOR UPDATE;
         
      UPDATE NOVOCODIGO
         SET NRSEQUENCIAL = LPAD(RTRIM(TO_CHAR(TO_NUMBER(RTRIM(NRSEQUENCIAL)) + P_QTDE)), 20, '0')
       WHERE CDCONTADOR = P_CONTADOR 
         AND NRORG = V_NRORG;
   ELSE
      V_CODIGO := LPAD(RTRIM(TO_CHAR(0)),20,'0');
     
      INSERT INTO NOVOCODIGO(CDCONTADOR, NRSEQUENCIAL, NRORG)
      VALUES(P_CONTADOR, LPAD(RTRIM(TO_CHAR(P_QTDE)),20,'0'), V_NRORG);
   END IF;
   
   P_SEQUENCIAL := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_CODIGO) + 1)), 20, '0');
   COMMIT;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('NOVO_CODIGO','6.45.019'); END;
/
