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
   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) OVER (PARTITION BY CDFILIAL)  MIN_NRNIVELAPROV
                       FROM APROVNECECMPEXTRA
                      WHERE CDFILIAL      =  P_CDFILIAL
                        AND NRNIVELAPROV >= P_NRNIVELAPROV
                      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 NVL(CDPRODESTO, 'W') <> 'W')
            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 MAX(CDOPERADOR)
        INTO V_CDOPERADOR
        FROM LOGNECECOMP
       WHERE CDFILIAL      = P_CDFILIAL
         AND NRNECECMPLOG  = P_NRNECECOMP;
      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 (INSTR('_'||P_CDPRODNECCMP||'_', APROVTRABNECECOMP.CDPRODNECCMP) > 0)
         AND APROVTRABNECECOMP.CDFILIAL       = APROVNECECMPEXTRA.CDFILIAL
         AND APROVTRABNECECOMP.CDOPERADORCOMP = APROVNECECMPEXTRA.CDOPERADOR
         AND APROVNECECMPEXTRA.NRNIVELAPROV   = P_NRNIVELAPROV
         AND NVL(APROVTRABNECECOMP.IDAPROVTRABNECECOMP, 'N') = 'S';
      IF P_IDAPROVTRABNECECOMP = 'S' THEN
         UPDATE APROVTRABNECECOMP
            SET IDAPROVTRABNECECOMP = 'S',
                CDOPERADOR          = P_CDOPERADOR
          WHERE NRNECECOMP          = P_NRNECECOMP
            AND CDFILIAL            = P_CDFILIAL
            AND (INSTR('_'||P_CDPRODNECCMP||'_', CDPRODNECCMP) > 0)
            AND CDOPERADORCOMP      = P_CDOPERADORCOMP;
         V_CONTADOR := 0;
         IF V_QTDEAPROVNIVEL <= V_CONTAGESTOR+1 THEN
            V_LISTA_OPERADOR := 'P';
            FOR C_ITEM IN (SELECT CDOPERADOR, NRNIVELAPROV, QTDEAPROVNIVEL, MIN(NRNIVELAPROV) OVER (PARTITION BY CDFILIAL) MIN_NRNIVELAPROV
                             FROM APROVNECECMPEXTRA
                            WHERE CDFILIAL      =  P_CDFILIAL
                              AND NRNIVELAPROV  > P_NRNIVELAPROV
                            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;
                  FOR C_PRODUTO IN (SELECT CDPRODUTO
                                      FROM PRODUTO
                                     WHERE (INSTR('_'||P_CDPRODNECCMP||'_', CDPRODUTO) > 0)
                                       AND NVL(CDPRODESTO, 'W') <> 'W')
                  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;
         END IF;
         IF V_CONTADOR = 0 THEN
            UPDATE TRABNECECOMP
               SET IDAPROVTRABNECECOMP = 'S'
             WHERE NRNECECOMP          = P_NRNECECOMP
               AND CDFILNECECMP        = P_CDFILIAL
               AND (INSTR('_'||P_CDPRODNECCMP||'_', CDPRODNECCMP) > 0);
            UPDATE LOGNECECOMP
               SET IDSITUACAO   = 'C'
             WHERE CDFILIAL     = P_CDFILIAL
               AND NRNECECMPLOG = P_NRNECECOMP;
            V_LISTA_OPERADOR := 'C'||'_'||V_CDOPERADOR;
         END IF;
      ELSE
         UPDATE TRABNECECOMP
            SET IDAPROVTRABNECECOMP = 'N'
          WHERE NRNECECOMP          = P_NRNECECOMP
            AND CDFILNECECMP        = P_CDFILIAL
            AND (INSTR('_'||P_CDPRODNECCMP||'_', CDPRODNECCMP) > 0);
         IF V_QTDEAPROVNIVEL > V_CONTAGESTOR THEN
            UPDATE APROVTRABNECECOMP
               SET IDAPROVTRABNECECOMP = 'N',
                   CDOPERADOR          = P_CDOPERADOR,
                   DSJUSTNECECOMP      = P_DSJUSTNECECOMP
             WHERE NRNECECOMP          = P_NRNECECOMP
               AND CDFILIAL            = P_CDFILIAL
               AND (INSTR('_'||P_CDPRODNECCMP||'_', CDPRODNECCMP) > 0)
               AND CDOPERADORCOMP      = P_CDOPERADORCOMP;
            UPDATE LOGNECECOMP
               SET IDSITUACAO   = 'P'
             WHERE CDFILIAL     = P_CDFILIAL
               AND NRNECECMPLOG = P_NRNECECOMP;
         END IF;
         V_LISTA_OPERADOR := 'P'||'_'||V_CDOPERADOR;
      END IF;
   END IF;
   P_RETURN := V_LISTA_OPERADOR;
END;
/