CREATE OR REPLACE PROCEDURE APROVA_GERENTE_ITEMSOLI
                     (P_CDFILSOLI      IN VARCHAR2,   /*Unidade Destino da solicitação de Compras*/
                      P_CDFILLAN       IN VARCHAR2,   /*Unidade de Lançamento da solicitação de Compras*/
                      P_NRSOLICMP      IN VARCHAR2,   /*Número sequencial da solicitação de Compras*/
                      P_ERRO           OUT VARCHAR2,
                      P_CDPRODUTO      IN VARCHAR2  DEFAULT NULL,  /*Código do produto da solicitação de Compras*/
                      P_VRCMPANTERIOR  IN FLOAT     DEFAULT NULL,  /*Valor de compras anterior do produto da solicitação de Compras*/
                      P_CDOPERADOR     IN VARCHAR2  DEFAULT NULL,  /*Código do Gerente, ao incluir item de solicitação de compras esse campo é null*/
                      P_IDSOLIAPROV    IN VARCHAR2  DEFAULT NULL,  /*Null inclusão, 'N' reprovação, 'S' aprovação*/
                      P_DSJUSTREPROV   IN VARCHAR2  DEFAULT NULL)  /*Justificativa de reprovação*/
IS
 V_CDDESTSOLI        SOLICITA.CDDESTSOLI%TYPE;
 V_CDFILCENTCMP      FILIAL.CDFILCENTCMP%TYPE;
 V_CDGRUPPROD        PARCMPSUP.CDGRUPPROD%TYPE;
 V_IDAPROVASUPER     APROVSOLPRODGER.IDAPROVASUPER%TYPE;
 V_VRAPROVCMP        DESTSOLGERE.VRAPROVCMP%TYPE;
 V_PENDENTE          NUMERIC;
 V_LISTACOMPRADOR    VARCHAR2(2000);
 V_CDOPERLANC        VARCHAR2(12);
BEGIN
  IF NVL(P_CDPRODUTO, 'W') <> 'W' THEN
    DELETE
      FROM ITEMSCEMAILAPRGER
     WHERE CDFILSOLI = P_CDFILSOLI
       AND CDFILLAN  = P_CDFILLAN
       AND NRSOLICMP = P_NRSOLICMP
       AND CDPRODUTO = P_CDPRODUTO;
  END IF;
  P_ERRO := NULL;
  SELECT NVL(CDFILCENTCMP, CDFILIAL)
    INTO V_CDFILCENTCMP
    FROM FILIAL
   WHERE CDFILIAL = P_CDFILSOLI;
  SELECT MAX(CDDESTSOLI)
    INTO V_CDDESTSOLI
    FROM SOLICITA
   WHERE CDFILLANCA  = P_CDFILLAN
     AND CDFILSOLI   = P_CDFILSOLI
     AND NRSOLICMP   = P_NRSOLICMP;
  IF NVL(V_CDDESTSOLI, 'W') <> 'W' THEN
     SELECT MAX(PARCMPSUP.CDGRUPPROD)
       INTO V_CDGRUPPROD
       FROM PARASUPRI, PARCMPSUP, PRSUBGRPROD
      WHERE PARASUPRI.CDFILIAL = V_CDFILCENTCMP
        AND PARCMPSUP.CDFILIAL = P_CDFILSOLI
        AND NVL(PARASUPRI.IDEXIGAPRGERCMP, 'N') = 'S'
        AND NVL(PARASUPRI.IDAPROVITMSOLGR, 'N') = 'S'
        AND NVL(PARASUPRI.IDULTDESTSOL, 'N') = 'S'
        AND NVL(PARCMPSUP.IDUTAPROVSOL, 'N') = 'S'
        AND PARCMPSUP.CDGRUPPROD = PARASUPRI.CDGRUPPROD
        AND PARCMPSUP.CDGRUPPROD IS NOT NULL
        AND PARCMPSUP.CDSUBGRPROD IS NOT NULL
        AND PARCMPSUP.CDGRUPPROD = PARASUPRI.CDGRUPPROD
        AND PARCMPSUP.CDGRUPPROD  = PRSUBGRPROD.CDGRUPPROD
        AND PARCMPSUP.CDSUBGRPROD = PRSUBGRPROD.CDSUBGRPROD
        AND PRSUBGRPROD.CDPRODUTO = P_CDPRODUTO;
     IF NVL(V_CDGRUPPROD, 'W') <> 'W' THEN
        IF NVL(P_IDSOLIAPROV, 'W') = 'W' THEN
           FOR C_DESTSOLGERE IN (SELECT CDOPERADOR, VRAPROVCMP
                                   FROM DESTSOLGERE
                                  WHERE CDFILIAL   = P_CDFILSOLI
                                    AND CDDESTSOLI = V_CDDESTSOLI
                                    AND NVL(VRAPROVCMP, 0) > 0
                                    AND NVL(VRAPROVCMP, 0) = (SELECT NVL(MIN(D.VRAPROVCMP), 0)
                                                                FROM DESTSOLGERE D
                                                               WHERE D.CDFILIAL   = P_CDFILSOLI
                                                                 AND D.CDDESTSOLI = V_CDDESTSOLI
                                                                 AND D.CDFILIAL   = DESTSOLGERE.CDFILIAL
                                                                 AND D.CDDESTSOLI = DESTSOLGERE.CDDESTSOLI
                                                                 AND NVL(D.VRAPROVCMP, 0) > 0))
           LOOP
              P_ERRO := 'G';
              INSERT
                INTO ITEMSCEMAILAPRGER (NRITEMSCEMAILAPRGER, CDFILSOLI, CDFILLAN,
                                        NRSOLICMP, CDPRODUTO, CDOPERADOR,STATUS)
              VALUES(SEQ_ITEMSCEMAILAPRGER.NEXTVAL, P_CDFILSOLI, P_CDFILLAN,
                     P_NRSOLICMP, P_CDPRODUTO, C_DESTSOLGERE.CDOPERADOR, 'G');
              IF C_DESTSOLGERE.VRAPROVCMP >= P_VRCMPANTERIOR THEN
                 V_IDAPROVASUPER := 'S';
              ELSE
                 V_IDAPROVASUPER := 'N';
              END IF;
              INSERT
                INTO APROVSOLPRODGER (CDFILLANCA, CDFILSOLI, NRSOLICMP, CDPRODUTO, CDOPERADOR, IDAPROVPRGER, DTAPRSOLPRODGER, IDAPROVASUPER)
              SELECT P_CDFILLAN, P_CDFILSOLI, P_NRSOLICMP, P_CDPRODUTO, C_DESTSOLGERE.CDOPERADOR, NULL, SYSDATE, V_IDAPROVASUPER
                FROM DUAL
               WHERE NOT EXISTS (SELECT 1
                                   FROM APROVSOLPRODGER A
                                  WHERE A.CDFILLANCA = P_CDFILLAN
                                    AND A.CDFILSOLI  = P_CDFILSOLI
                                    AND A.NRSOLICMP  = P_NRSOLICMP
                                    AND A.CDPRODUTO  = P_CDPRODUTO
                                    AND A.CDOPERADOR = C_DESTSOLGERE.CDOPERADOR);
           END LOOP;
           IF LENGTH(NVL(P_ERRO, '_')) <= 12 THEN
              P_ERRO := 'DESTSOLGERE';
              P_ERRO := '1';
           END IF;
        ELSIF P_IDSOLIAPROV = 'N' THEN
           SELECT NVL(MAX(VRAPROVCMP), 0)
             INTO V_VRAPROVCMP
             FROM DESTSOLGERE
            WHERE CDFILIAL    = P_CDFILSOLI
              AND CDDESTSOLI  = V_CDDESTSOLI
              AND CDOPERADOR  = P_CDOPERADOR;
           IF V_VRAPROVCMP >= P_VRCMPANTERIOR THEN
              V_IDAPROVASUPER := 'S';
           ELSE
              V_IDAPROVASUPER := 'N';
           END IF;
           UPDATE APROVSOLPRODGER A
              SET IDAPROVPRGER    = 'N',
                  DTAPRSOLPRODGER = SYSDATE,
                  DSJUSTREPROV    = P_DSJUSTREPROV,
                  IDAPROVASUPER   = V_IDAPROVASUPER
            WHERE A.CDFILLANCA = P_CDFILLAN
              AND A.CDFILSOLI  = P_CDFILSOLI
              AND A.NRSOLICMP  = P_NRSOLICMP
              AND A.CDPRODUTO  = P_CDPRODUTO
              AND A.CDOPERADOR = P_CDOPERADOR;
           SELECT MAX(CDOPERLANC)
             INTO V_CDOPERLANC
             FROM SOLICITA
            WHERE CDFILLANCA = P_CDFILLAN
              AND CDFILSOLI  = P_CDFILSOLI
              AND NRSOLICMP  = P_NRSOLICMP;
           INSERT
             INTO ITEMSCEMAILAPRGER (NRITEMSCEMAILAPRGER, CDFILSOLI, CDFILLAN,
                                     NRSOLICMP, CDPRODUTO, CDOPERADOR,STATUS)
           VALUES(SEQ_ITEMSCEMAILAPRGER.NEXTVAL, P_CDFILSOLI, P_CDFILLAN,
                  P_NRSOLICMP, P_CDPRODUTO, V_CDOPERLANC, 'R');
        ELSIF P_IDSOLIAPROV = 'S' THEN
           SELECT NVL(MAX(VRAPROVCMP), 0)
             INTO V_VRAPROVCMP
             FROM DESTSOLGERE
            WHERE CDFILIAL    = P_CDFILSOLI
              AND CDDESTSOLI  = V_CDDESTSOLI
              AND CDOPERADOR  = P_CDOPERADOR;
           IF V_VRAPROVCMP >= P_VRCMPANTERIOR THEN
              V_IDAPROVASUPER := 'S';
           ELSE
              V_IDAPROVASUPER := 'N';
           END IF;
           UPDATE APROVSOLPRODGER A
              SET IDAPROVPRGER    = 'S',
                  DTAPRSOLPRODGER = SYSDATE,
                  IDAPROVASUPER   = V_IDAPROVASUPER,
                  DSJUSTREPROV    = NULL
            WHERE A.CDFILLANCA = P_CDFILLAN
              AND A.CDFILSOLI  = P_CDFILSOLI
              AND A.NRSOLICMP  = P_NRSOLICMP
              AND A.CDPRODUTO  = P_CDPRODUTO
              AND A.CDOPERADOR = P_CDOPERADOR;
           IF V_IDAPROVASUPER = 'S' THEN
              SELECT COUNT(1)
                INTO V_PENDENTE
                FROM APROVSOLPRODGER
               WHERE APROVSOLPRODGER.CDFILLANCA    = P_CDFILLAN
                 AND APROVSOLPRODGER.CDFILSOLI     = P_CDFILSOLI
                 AND APROVSOLPRODGER.NRSOLICMP     = P_NRSOLICMP
                 AND APROVSOLPRODGER.CDPRODUTO     = P_CDPRODUTO
                 AND APROVSOLPRODGER.CDOPERADOR    <> P_CDOPERADOR
                 AND NVL(APROVSOLPRODGER.IDAPROVPRGER, 'N')  = 'N';
              IF V_PENDENTE = 0 THEN
                 P_ERRO := NULL;
                 UPDATE ITEMSOLI
                    SET ITEMSOLI.IDSOLIAPROV   = 'S'
                  WHERE ITEMSOLI.CDFILLAN      = P_CDFILLAN
                    AND ITEMSOLI.CDFILSOLI     = P_CDFILSOLI
                    AND ITEMSOLI.NRSOLICMP     = P_NRSOLICMP
                    AND ITEMSOLI.CDPRODUTO     = P_CDPRODUTO
                    AND NOT EXISTS (SELECT 1
                                      FROM APROVSOLPRODGER
                                     WHERE APROVSOLPRODGER.CDFILLANCA    = ITEMSOLI.CDFILLAN
                                       AND APROVSOLPRODGER.CDFILSOLI     = ITEMSOLI.CDFILSOLI
                                       AND APROVSOLPRODGER.NRSOLICMP     = ITEMSOLI.NRSOLICMP
                                       AND APROVSOLPRODGER.CDPRODUTO     = ITEMSOLI.CDPRODUTO
                                       AND NVL(APROVSOLPRODGER.IDAPROVPRGER, 'N')  = 'N');
                 FOR C_COMPRADOR IN(SELECT CDOPERADOR
                                      FROM (SELECT DISTINCT CDOPERADOR
                                              FROM (SELECT PRODCOMP.CDOPERADOR
                                                      FROM PRODUTO, PRODCOMP, PRODUTO PROSOLI
                                                     WHERE PRODUTO.CDPRODUTO = PRODCOMP.CDPRODUTO
                                                       AND PROSOLI.CDARVPROD LIKE PRODUTO.CDARVPROD||'%'
                                                       AND P_CDPRODUTO = PROSOLI.CDPRODUTO
                                                     UNION
                                                    SELECT CDOPERLANC CDOPERADOR
                                                      FROM SOLICITA
                                                     WHERE CDFILLANCA = P_CDFILLAN
                                                       AND CDFILSOLI  = P_CDFILSOLI
                                                       AND NRSOLICMP  = P_NRSOLICMP))) LOOP

                               INSERT
                                 INTO ITEMSCEMAILAPRGER (NRITEMSCEMAILAPRGER, CDFILSOLI, CDFILLAN,
                                                         NRSOLICMP, CDPRODUTO, CDOPERADOR,STATUS)
                               VALUES(SEQ_ITEMSCEMAILAPRGER.NEXTVAL, P_CDFILSOLI, P_CDFILLAN,
                                      P_NRSOLICMP, P_CDPRODUTO, C_COMPRADOR.CDOPERADOR, 'F');
                 END LOOP;
                 P_ERRO := 'F';
              ELSE
                P_ERRO := 'N';
              END IF;
           ELSE
              FOR C_DESTSOLGERE IN (SELECT DESTSOLGERE.CDOPERADOR, DESTSOLGERE.VRAPROVCMP
                                      FROM DESTSOLGERE
                                     WHERE DESTSOLGERE.CDFILIAL   = P_CDFILSOLI
                                       AND DESTSOLGERE.CDDESTSOLI = V_CDDESTSOLI
                                       AND NVL(DESTSOLGERE.VRAPROVCMP, 0) > 0
                                       AND NVL(DESTSOLGERE.VRAPROVCMP, 0) = (SELECT NVL(MIN(D.VRAPROVCMP), 0)
                                                                               FROM DESTSOLGERE D
                                                                              WHERE DESTSOLGERE.CDFILIAL   = P_CDFILSOLI
                                                                                AND DESTSOLGERE.CDDESTSOLI = V_CDDESTSOLI
                                                                                AND DESTSOLGERE.CDFILIAL   = D.CDFILIAL
                                                                                AND DESTSOLGERE.CDDESTSOLI = D.CDDESTSOLI
                                                                                AND NVL(D.VRAPROVCMP, 0) > = P_VRCMPANTERIOR)/*
                                       AND NOT EXISTS (SELECT 1
                                                         FROM APROVSOLPRODGER
                                                        WHERE APROVSOLPRODGER.CDFILLANCA = P_CDFILLAN
                                                          AND APROVSOLPRODGER.CDFILSOLI  = P_CDFILSOLI
                                                          AND APROVSOLPRODGER.NRSOLICMP  = P_NRSOLICMP
                                                          AND APROVSOLPRODGER.CDPRODUTO  = P_CDPRODUTO
                                                          AND APROVSOLPRODGER.CDOPERADOR = P_CDOPERADOR
                                                          AND APROVSOLPRODGER.CDFILSOLI  = DESTSOLGERE.CDFILIAL
                                                          AND APROVSOLPRODGER.CDOPERADOR = DESTSOLGERE.CDOPERADOR)*/)
              LOOP
                 P_ERRO := 'G';
                 INSERT
                   INTO ITEMSCEMAILAPRGER (NRITEMSCEMAILAPRGER, CDFILSOLI, CDFILLAN,
                                           NRSOLICMP, CDPRODUTO, CDOPERADOR,STATUS)
                 VALUES (SEQ_ITEMSCEMAILAPRGER.NEXTVAL, P_CDFILSOLI, P_CDFILLAN,
                        P_NRSOLICMP, P_CDPRODUTO, C_DESTSOLGERE.CDOPERADOR, 'G');
                 IF C_DESTSOLGERE.VRAPROVCMP >= P_VRCMPANTERIOR THEN
                    V_IDAPROVASUPER := 'S';
                 ELSE
                    V_IDAPROVASUPER := 'N';
                 END IF;
                 INSERT
                   INTO APROVSOLPRODGER (CDFILLANCA, CDFILSOLI, NRSOLICMP, CDPRODUTO, CDOPERADOR, IDAPROVPRGER, DTAPRSOLPRODGER, IDAPROVASUPER)
                 SELECT P_CDFILLAN, P_CDFILSOLI, P_NRSOLICMP, P_CDPRODUTO, C_DESTSOLGERE.CDOPERADOR, NULL, SYSDATE, V_IDAPROVASUPER
                   FROM DUAL
                  WHERE NOT EXISTS (SELECT 1
                                      FROM APROVSOLPRODGER A
                                     WHERE A.CDFILLANCA = P_CDFILLAN
                                       AND A.CDFILSOLI  = P_CDFILSOLI
                                       AND A.NRSOLICMP  = P_NRSOLICMP
                                       AND A.CDPRODUTO  = P_CDPRODUTO
                                       AND A.CDOPERADOR = C_DESTSOLGERE.CDOPERADOR);
              END LOOP;
              IF LENGTH(NVL(P_ERRO, '_')) <= 12 THEN
                 P_ERRO := 'DESTSOLGERE';
                 P_ERRO := '1';
              END IF;
           END IF;
        END IF;
     ELSE
        P_ERRO := 'PARCMPSUP';
        P_ERRO := '2';
     END IF;
  ELSE
      P_ERRO := 'CDDESTSOLI';
      P_ERRO := '3';
  END IF;
END;
/