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_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
   UPDATE LOGNECECOMP
      SET IDSITUACAO   = 'P'
    WHERE CDFILIAL     = P_CDFILIAL
      AND NRNECECMPLOG = P_NRNECECOMP;
   IF P_NRNIVELAPROV = 0 THEN
      V_LISTA_OPERADOR := 'P';
      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;
            FOR C_PRODUTO IN (SELECT CDPRODUTO
                                FROM PRODUTO
                               WHERE (INSTR('_'||P_CDPRODNECCMP||'_', CDPRODUTO) > 0)
                                 AND CDPRODUTO = CDPRODESTO)
            LOOP
               DELETE
                 FROM APROVTRABNECECOMP
                WHERE NRNECECOMP     = P_NRNECECOMP
                  AND CDFILIAL       = P_CDFILIAL
                  AND CDPRODNECCMP   = C_PRODUTO.CDPRODUTO
                  AND CDOPERADORCOMP = C_ITEM.CDOPERADOR;
               INSERT
                 INTO APROVTRABNECECOMP(NRAPROVTRABNECECOMP, NRNECECOMP, CDFILIAL, CDPRODNECCMP, CDOPERADORCOMP, CDOPERADOR)
               VALUES (SEQ_APROVTRABNECECOMP.NEXTVAL, P_NRNECECOMP, P_CDFILIAL, C_PRODUTO.CDPRODUTO, C_ITEM.CDOPERADOR, P_CDOPERADOR);
            END LOOP;
         ELSE
            EXIT;
         END IF;
      END LOOP;
   ELSE
      SELECT COUNT(1)
        INTO V_QTDEAPROVNIVEL
        FROM APROVTRABNECECOMP
       WHERE APROVTRABNECECOMP.NRNECECOMP     = P_NRNECECOMP
         AND APROVTRABNECECOMP.CDFILIAL       = P_CDFILIAL
         AND APROVTRABNECECOMP.IDAPROVTRABNECECOMP IS NULL;
      FOR C_APROVADOR IN (SELECT CDPRODNECCMP, IDAPROVTRABNECECOMP
                            FROM APROVTRABNECECOMP
                           WHERE NRNECECOMP = P_NRNECECOMP
                             AND CDFILIAL = P_CDFILIAL
                             AND CDOPERADORCOMP = P_CDOPERADORCOMP
                             AND INSTR('_'|| P_CDPRODNECCMP || '_', CDPRODNECCMP) > 0)
      LOOP
         IF C_APROVADOR.IDAPROVTRABNECECOMP = 'S' THEN
            UPDATE TRABNECECOMP
               SET IDAPROVTRABNECECOMP = 'S'
             WHERE NRNECECOMP   = P_NRNECECOMP
               AND CDFILNECECMP = P_CDFILIAL
               AND CDPRODNECCMP = C_APROVADOR.CDPRODNECCMP;
         ELSE
            UPDATE APROVTRABNECECOMP
               SET IDAPROVTRABNECECOMP = 'N'
             WHERE CDFILIAL = P_CDFILIAL
               AND NRNECECOMP = P_NRNECECOMP
               AND CDPRODNECCMP = C_APROVADOR.CDPRODNECCMP
               AND CDOPERADORCOMP != P_CDOPERADORCOMP;
            UPDATE TRABNECECOMP
               SET IDAPROVTRABNECECOMP = 'N'
             WHERE NRNECECOMP          = P_NRNECECOMP
               AND CDFILNECECMP        = P_CDFILIAL
               AND CDPRODNECCMP = C_APROVADOR.CDPRODNECCMP;
         END IF;
      END LOOP;
      IF V_QTDEAPROVNIVEL = 0 THEN
         UPDATE LOGNECECOMP
            SET IDSITUACAO   = 'C'
          WHERE CDFILIAL     = P_CDFILIAL
            AND NRNECECMPLOG = P_NRNECECOMP;
      ELSE
         UPDATE LOGNECECOMP
            SET IDSITUACAO   = 'P'
          WHERE CDFILIAL     = P_CDFILIAL
            AND NRNECECMPLOG = P_NRNECECOMP;
      END IF;
   END IF;
   P_RETURN := V_LISTA_OPERADOR;
END;
/