CREATE OR REPLACE PROCEDURE APROVA_GERENTE_ITEMSOLI
                     (P_ERRO           OUT VARCHAR2,
                      P_CDFILSOLI      IN VARCHAR2,   /*Unidade Destino da solicitacao de Compras*/
                      P_CDFILLAN       IN VARCHAR2,   /*Unidade de Lancamento da solicitacao de Compras*/
                      P_NRSOLICMP      IN VARCHAR2,   /*Numero sequencial da solicitacao de Compras*/
                      P_CDPRODUTO      IN VARCHAR2  DEFAULT NULL,  /*Codigo do produto da solicitacao de Compras*/
                      P_VRCMPANTERIOR  IN FLOAT     DEFAULT NULL,  /*Valor de compras anterior do produto da solicitacao de Compras*/
                      P_CDOPERADOR     IN VARCHAR2  DEFAULT NULL,  /*Codigo do Gerente, ao incluir item de solicitacao de compras esse campo e null*/
                      P_IDSOLIAPROV    IN VARCHAR2  DEFAULT NULL,  /*Null inclusao, 'N' reprovacao, 'S' aprovacao*/
                      P_DSJUSTREPROV   IN VARCHAR2  DEFAULT NULL)  /*Justificativa de reprovacao*/
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;
BEGIN
  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_CDFILSOLI
     AND CDFILSOLI   = P_CDFILLAN
     AND NRSOLICMP   = P_NRSOLICMP;
  IF V_CDDESTSOLI IS NOT NULL 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 V_CDGRUPPROD IS NOT NULL THEN
        IF P_IDSOLIAPROV IS NULL 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 := C_DESTSOLGERE.CDOPERADOR||'_'||P_ERRO;
              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 = P_CDOPERADOR);
           END LOOP;
           IF LENGTH(NVL(P_ERRO, '_')) <= 12 THEN
              P_ERRO := 'DESTSOLGERE';
           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;
        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
            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');
              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))
              LOOP
                 P_ERRO := C_DESTSOLGERE.CDOPERADOR||'_'||P_ERRO;
                 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 = P_CDOPERADOR);
              END LOOP;
              IF LENGTH(NVL(P_ERRO, '_')) <= 12 THEN
                 P_ERRO := 'DESTSOLGERE';
              END IF;
           END IF;
        END IF;
     ELSE
        P_ERRO := 'PARCMPSUP';
     END IF;
  ELSE
      P_ERRO := 'CDDESTSOLI';
  END IF;
END;
/