CREATE OR REPLACE
PROCEDURE APROVA_TRABNECECOMP (
    P_CDFILIAL                IN VARCHAR2,
    P_CDOPERADOR              IN OPERADOR.CDOPERADOR%TYPE,
    P_NRNECECOMP              IN TRABNECECOMP.NRNECECOMP%TYPE,
    P_CDPRODNECCMP            IN VARCHAR2,
    P_CDOPERADORCOMP          IN COMPRADOR.CDOPERADOR%TYPE,
    P_IDAPROVTRABNECECOMP     IN VARCHAR2,
    P_NRNIVELAPROV            IN NUMBER,
    P_DSJUSTNECECOMP          IN VARCHAR2,
    P_RETURN                  OUT VARCHAR2)
IS
   V_LISTA_OPERADOR      VARCHAR2(2000) := '';
   V_CDOPERADOR          OPERADOR.CDOPERADOR%TYPE;
   V_CONTADOR            NUMBER := 0;
   V_QTDEAPROVNIVEL      NUMBER;
   V_CONTAGESTOR         NUMBER;
BEGIN
   IF P_NRNIVELAPROV = 0 THEN
      V_LISTA_OPERADOR := 'G';
      FOR C_ITEM IN (SELECT CDOPERADOR, NRNIVELAPROV, QTDEAPROVNIVEL, MIN(NRNIVELAPROV) MIN_NRNIVELAPROV
                       FROM APROVNECECMPEXTRA
                      WHERE CDFILIAL      =  P_CDFILIAL
                        AND NRNIVELAPROV >= P_NRNIVELAPROV
                      GROUP BY CDOPERADOR, NRNIVELAPROV, QTDEAPROVNIVEL
                      ORDER BY NRNIVELAPROV)
      LOOP
         IF C_ITEM.MIN_NRNIVELAPROV = C_ITEM.NRNIVELAPROV THEN
            V_LISTA_OPERADOR  := V_LISTA_OPERADOR||'_'||C_ITEM.CDOPERADOR;
            INSERT
              INTO APROVTRABNECECOMP(NRAPROVTRABNECECOMP, NRNECECOMP, CDFILIAL, CDPRODNECCMP, CDOPERADORCOMP, CDOPERADOR)
            VALUES (SEQ_APROVTRABNECECOMP.NEXTVAL, P_NRNECECOMP, P_CDFILIAL, P_CDPRODNECCMP, C_ITEM.CDOPERADOR, P_CDOPERADOR);
         ELSE
            EXIT;
         END IF;
      END LOOP;
   ELSE
      SELECT MAX(CDOPERADOR)
        INTO V_CDOPERADOR
        FROM LOGNECECOMP
       WHERE CDFILIAL      = P_CDFILIAL
         AND NRNECECMPLOG  = P_NRNECECOMP;
      IF P_IDAPROVTRABNECECOMP = 'S' THEN
         UPDATE APROVTRABNECECOMP
            SET IDAPROVTRABNECECOMP = 'S',
                CDOPERADOR          = P_CDOPERADOR
          WHERE NRNECECOMP          = P_NRNECECOMP
            AND CDFILIAL            = P_CDFILIAL
            AND CDPRODNECCMP        = P_CDPRODNECCMP
            AND CDOPERADORCOMP      = P_CDOPERADORCOMP;
         SELECT NVL(MAX(QTDEAPROVNIVEL), 0), COUNT(1)
           INTO V_QTDEAPROVNIVEL, V_CONTAGESTOR
           FROM APROVNECECMPEXTRA, APROVTRABNECECOMP
          WHERE APROVTRABNECECOMP.NRNECECOMP     = P_NRNECECOMP
            AND APROVTRABNECECOMP.CDFILIAL       = P_CDFILIAL
            AND APROVTRABNECECOMP.CDPRODNECCMP   = P_CDPRODNECCMP
            AND APROVTRABNECECOMP.CDFILIAL       = APROVNECECMPEXTRA.CDFILIAL
            AND APROVTRABNECECOMP.CDOPERADORCOMP = APROVNECECMPEXTRA.CDOPERADOR
            AND APROVNECECMPEXTRA.NRNIVELAPROV   = P_NRNIVELAPROV
            AND NVL(APROVTRABNECECOMP.IDAPROVTRABNECECOMP, 'N') = 'S';
         V_CONTADOR := 0;
         IF V_QTDEAPROVNIVEL >= V_CONTAGESTOR+1 THEN
            V_LISTA_OPERADOR := 'G';
            FOR C_ITEM IN (SELECT CDOPERADOR, NRNIVELAPROV, QTDEAPROVNIVEL, MIN(NRNIVELAPROV) MIN_NRNIVELAPROV
                             FROM APROVNECECMPEXTRA
                            WHERE CDFILIAL      =  P_CDFILIAL
                              AND NRNIVELAPROV  > P_NRNIVELAPROV
                            GROUP BY CDOPERADOR, NRNIVELAPROV, QTDEAPROVNIVEL
                            ORDER BY NRNIVELAPROV)
            LOOP
               V_CONTADOR := V_CONTADOR + 1;
               IF C_ITEM.MIN_NRNIVELAPROV = C_ITEM.NRNIVELAPROV THEN
                  V_LISTA_OPERADOR  := V_LISTA_OPERADOR||'_'||C_ITEM.CDOPERADOR;
                  INSERT
                    INTO APROVTRABNECECOMP(NRAPROVTRABNECECOMP, NRNECECOMP, CDFILIAL, CDPRODNECCMP, CDOPERADORCOMP, CDOPERADOR)
                  VALUES (SEQ_APROVTRABNECECOMP.NEXTVAL, P_NRNECECOMP, P_CDFILIAL, P_CDPRODNECCMP, C_ITEM.CDOPERADOR, P_CDOPERADOR);
               ELSE
                  EXIT;
               END IF;
            END LOOP;
         END IF;
         IF V_CONTADOR = 0 THEN
            UPDATE TRABNECECOMP
               SET IDAPROVTRABNECECOMP = 'S'
             WHERE NRNECECOMP          = P_NRNECECOMP
               AND CDFILNECECMP        = P_CDFILIAL
               AND CDPRODNECCMP        = P_CDPRODNECCMP;
            V_LISTA_OPERADOR := 'O'||'_'||V_CDOPERADOR;
         END IF;
      ELSE
         UPDATE TRABNECECOMP
            SET IDAPROVTRABNECECOMP = 'N'
          WHERE NRNECECOMP          = P_NRNECECOMP
            AND CDFILNECECMP        = P_CDFILIAL
            AND CDPRODNECCMP        = P_CDPRODNECCMP;
         UPDATE APROVTRABNECECOMP
            SET IDAPROVTRABNECECOMP = 'N',
                CDOPERADOR          = P_CDOPERADOR,
                DSJUSTNECECOMP      = P_DSJUSTNECECOMP
          WHERE NRNECECOMP          = P_NRNECECOMP
            AND CDFILIAL            = P_CDFILIAL
            AND CDPRODNECCMP        = P_CDPRODNECCMP
            AND CDOPERADORCOMP      = P_CDOPERADORCOMP;
         V_LISTA_OPERADOR := 'O'||'_'||V_CDOPERADOR;
      END IF;
   END IF;
   P_RETURN := V_LISTA_OPERADOR;
END;
/