create or replace
PROCEDURE NOVO_CODIGO_NT(
   P_CONTADOR    IN  NOVOCODIGO.CDCONTADOR%TYPE,
   P_SEQUENCIAL  OUT NOVOCODIGO.NRSEQUENCIAL%TYPE,
   P_QTDE        IN  NUMBER DEFAULT 1,
   P_NRORG IN  NOVOCODIGO.NRORG%TYPE DEFAULT 1)
AS
   PRAGMA AUTONOMOUS_TRANSACTION;
   V_COUNT NUMBER;
   V_CODIGO VARCHAR2(20);
   V_NRORG NOVOCODIGO.NRORG%TYPE;
BEGIN

	/* Se o NRORG passado for zero:
	   - Se nao existir registros na tabela NOVOCODIGO para o contador passado com o NRORG zero, e verificado se existe com outros valores para o NRORG. Se existir, o novo codigo e gerado e incrementado em cima desses registros. */
	
    /* A procedure foi alterada para considerar o filed NRORG. Para nao atrapalhar no andamento das demais rotinas que utilizam a procedure foi criado o Default "9999999999" sendo que, se  o valor do default for passado para o parametro, a rotina considerara NULL para o NRORG. */

   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;
     
      IF V_NRORG IS NULL THEN
         UPDATE NOVOCODIGO
            SET NRSEQUENCIAL = LPAD(RTRIM(TO_CHAR(TO_NUMBER(RTRIM(NRSEQUENCIAL)) + P_QTDE)),20,'0')
          WHERE CDCONTADOR = P_CONTADOR;
      ELSE
         UPDATE NOVOCODIGO
            SET NRSEQUENCIAL = LPAD(RTRIM(TO_CHAR(TO_NUMBER(RTRIM(NRSEQUENCIAL)) + P_QTDE)),20,'0')
          WHERE CDCONTADOR = P_CONTADOR
            AND NRORG = V_NRORG;
      END IF;      
   ELSE
      V_CODIGO := LPAD(RTRIM(TO_CHAR(0)),20,'0');

      IF V_NRORG IS NULL THEN
              INSERT INTO NOVOCODIGO (CDCONTADOR, NRSEQUENCIAL)
              VALUES (P_CONTADOR, LPAD(RTRIM(TO_CHAR(P_QTDE)),20,'0')); 
      ELSE
         INSERT INTO NOVOCODIGO (CDCONTADOR, NRSEQUENCIAL, NRORG)
              VALUES (P_CONTADOR, LPAD(RTRIM(TO_CHAR(P_QTDE)),20,'0'), V_NRORG);
      END IF;
   END IF;

   P_SEQUENCIAL := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_CODIGO) + 1)),20,'0');

   COMMIT;
END;
/