CREATE OR REPLACE PROCEDURE CONCLUI_WORKFLOW_CMP(P_NRAUTOFORN     IN VARCHAR2,
                                                 P_NRSEQAPURAF    IN VARCHAR2,
                                                 P_DSMOTVAFALCADA IN VARCHAR2,
                                                 P_ENVIAREMAIL    OUT VARCHAR2,
                                                 P_CDFILDEST      IN VARCHAR2 DEFAULT NULL)
AS
  V_NRAPROVALCADA   VARCHAR2(20);
  V_RETORNO         VARCHAR2(1);
  V_CDOPERADOR      OPERADOR.CDOPERADOR%TYPE;
  V_VRAPROVCMP      ALCADAGERFILI.VRAPROVCMP%TYPE;
  V_IDBLOQAFSEMALCADA PARASUPRI.IDBLOQAFSEMALCADA%TYPE;
  TYPE CURTYPE                IS REF CURSOR;
  C_AUTOFORNE                 CURTYPE;
  C_AUTOFORNE_CDFILDEST       AUTOFORNE.CDFILDEST%TYPE;
  C_AUTOFORNE_CDFILLANC       AUTOFORNE.CDFILLANC%TYPE;
  C_AUTOFORNE_NRAUTOFORN      AUTOFORNE.NRAUTOFORN%TYPE;
  C_AUTOFORNE_DTPROGENTAF     ITEMAUTF.DTPROGENTAF%TYPE;
  C_AUTOFORNE_NRCONFIGALCADA  CONFIGALCADA.NRCONFIGALCADA%TYPE;
  C_AUTOFORNE_IDTPALCADA      CONFIGALCADA.IDTPALCADA%TYPE;
  V_COUNTADOR                 NUMERIC := 1;

BEGIN
   SELECT NVL(PARASUPRI.IDBLOQAFSEMALCADA, 'N')
     INTO V_IDBLOQAFSEMALCADA
     FROM PARASUPRI, FILIAL
    WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
      AND FILIAL.CDFILIAL = P_CDFILDEST;
   IF V_IDBLOQAFSEMALCADA = 'S' THEN
      SELECT COUNT(1)
        INTO V_COUNTADOR
        FROM APROVALCADA
       WHERE CDFILDEST  = P_CDFILDEST
         AND NRDEMANDA  = P_NRAUTOFORN
         AND IDTPALCADA = 'CATALOGO'
         AND IDBLOQAFSEMALCADA  = 'S'
         AND IDAPROVADO <> 'PENDENTE';
   ELSE
      V_COUNTADOR := 1;
   END IF;
   P_ENVIAREMAIL := 'N';
   IF V_COUNTADOR > 0 THEN
      FOR C_CONSISTORCAMENTO IN (
         SELECT AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF,
                MAX(CONFIGALCADA.NRCONFIGALCADA) NRCONFIGALCADA, MIN(CONFIGALCADA.IDTPALCADA)
           FROM AUTOFORNE, FILIAL, ITEMAUTF, CONFIGALCADA, FILIALCADA
          WHERE AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST
            AND AUTOFORNE.CDFILLANC  = ITEMAUTF.CDFILLANC
            AND AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
            AND CONFIGALCADA.IDTPALCADA <> 'CATALOGO'
            AND AUTOFORNE.CDFILDEST  = FILIAL.CDFILIAL
            AND AUTOFORNE.IDSITUATUAAF IS NULL
            AND AUTOFORNE.IDAFFORALIM = 'N'
            AND (INSTR('_'||NVL(P_NRAUTOFORN, AUTOFORNE.NRAUTOFORN)||'_', AUTOFORNE.NRAUTOFORN) > 0)
            AND NVL(AUTOFORNE.NRSEQAPURAF, 'T') = NVL(P_NRSEQAPURAF, NVL(AUTOFORNE.NRSEQAPURAF, 'T'))
            AND CONFIGALCADA.NRCONFIGALCADA = FILIALCADA.NRCONFIGALCADA
            AND FILIALCADA.CDFILIAL = AUTOFORNE.CDFILDEST
            AND ((CONFIGALCADA.IDLANCAFEXTRA = AUTOFORNE.IDAUTOFORNEX) OR (CONFIGALCADA.IDLANCAFEXTRA = 'AMBOS'))
            AND ((CONFIGALCADA.IDTIPOAF = AUTOFORNE.IDTIPOLANCAF)      OR (CONFIGALCADA.IDTIPOAF = 'AMBOS'))
            AND ((CONFIGALCADA.IDTPLANC = CASE
                                             WHEN AUTOFORNE.CDFILLANC = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
                                             THEN 'MATRIZ'
                                             ELSE 'UNIDADE'
                                           END  )               OR (CONFIGALCADA.IDTPLANC = 'AMBOS'))
            AND EXISTS(SELECT 1
                             FROM ALCADAGERFILI
                            WHERE ALCADAGERFILI.CDFILIAL       = AUTOFORNE.CDFILDEST
                              AND ALCADAGERFILI.NRCONFIGALCADA = CONFIGALCADA.NRCONFIGALCADA)
          GROUP BY AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF
          ORDER BY AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF

      )LOOP
         CONSISTE_ORCAMENTO_GOP(C_CONSISTORCAMENTO.CDFILDEST, C_CONSISTORCAMENTO.CDFILLANC,
                                C_CONSISTORCAMENTO.NRAUTOFORN, V_RETORNO, 1, C_CONSISTORCAMENTO.DTPROGENTAF);
      END LOOP;

      OPEN C_AUTOFORNE FOR
         SELECT AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF,
                MAX(CONFIGALCADA.NRCONFIGALCADA) NRCONFIGALCADA, MIN(CONFIGALCADA.IDTPALCADA)
           FROM AUTOFORNE, FILIAL, ITEMAUTF, CONFIGALCADA, FILIALCADA, CONSISTORCAMENTO
          WHERE AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST
            AND AUTOFORNE.CDFILLANC  = ITEMAUTF.CDFILLANC
            AND AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
            AND AUTOFORNE.CDFILDEST  = CONSISTORCAMENTO.CDFILDEST
            AND AUTOFORNE.CDFILLANC  = CONSISTORCAMENTO.CDFILLANC
            AND AUTOFORNE.NRAUTOFORN = CONSISTORCAMENTO.NRDEMANDA
            AND CONFIGALCADA.IDTPALCADA <> 'CATALOGO'
            AND CONSISTORCAMENTO.IDORIGEMCONS = CONFIGALCADA.IDTIPORCAOP
            AND NVL(CONSISTORCAMENTO.CDDESPPREV, 'XXX') = NVL(CONFIGALCADA.CDDESPPREV, 'XXX')
            AND AUTOFORNE.CDFILDEST  = FILIAL.CDFILIAL
            AND AUTOFORNE.IDSITUATUAAF IS NULL
            AND AUTOFORNE.IDAFFORALIM = 'N'
            AND (INSTR('_'||NVL(P_NRAUTOFORN, AUTOFORNE.NRAUTOFORN)||'_', AUTOFORNE.NRAUTOFORN) > 0)
            AND NVL(AUTOFORNE.NRSEQAPURAF, 'T') = NVL(P_NRSEQAPURAF, NVL(AUTOFORNE.NRSEQAPURAF, 'T'))
            AND CONFIGALCADA.NRCONFIGALCADA = FILIALCADA.NRCONFIGALCADA
            AND FILIALCADA.CDFILIAL = AUTOFORNE.CDFILDEST
            AND ((CONFIGALCADA.IDLANCAFEXTRA = AUTOFORNE.IDAUTOFORNEX) OR (CONFIGALCADA.IDLANCAFEXTRA = 'AMBOS'))
            AND ((CONFIGALCADA.IDTIPOAF = AUTOFORNE.IDTIPOLANCAF)      OR (CONFIGALCADA.IDTIPOAF = 'AMBOS'))
            AND ((CONFIGALCADA.IDTPLANC = CASE
                                             WHEN AUTOFORNE.CDFILLANC = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
                                             THEN 'MATRIZ'
                                             ELSE 'UNIDADE'
                                           END  )               OR (CONFIGALCADA.IDTPLANC = 'AMBOS'))
            AND EXISTS(SELECT 1
                             FROM ALCADAGERFILI
                            WHERE ALCADAGERFILI.CDFILIAL       = AUTOFORNE.CDFILDEST
                              AND ALCADAGERFILI.NRCONFIGALCADA = CONFIGALCADA.NRCONFIGALCADA)
          GROUP BY AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF
          ORDER BY AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF;
   ELSE
      OPEN C_AUTOFORNE FOR
         SELECT AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF,
                MAX(CONFIGALCADA.NRCONFIGALCADA) NRCONFIGALCADA, MIN(CONFIGALCADA.IDTPALCADA) IDTPALCADA
           FROM AUTOFORNE, FILIAL, ITEMAUTF, CONFIGALCADA, FILIALCADA
          WHERE AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST
            AND AUTOFORNE.CDFILLANC  = ITEMAUTF.CDFILLANC
            AND AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
            AND AUTOFORNE.CDFILDEST  = FILIAL.CDFILIAL
            AND AUTOFORNE.IDSITUATUAAF IS NULL
            AND AUTOFORNE.IDAFFORALIM = 'N'
            AND CONFIGALCADA.IDTPALCADA = 'CATALOGO'
            AND (INSTR('_'||NVL(P_NRAUTOFORN, AUTOFORNE.NRAUTOFORN)||'_', AUTOFORNE.NRAUTOFORN) > 0)
            AND NVL(AUTOFORNE.NRSEQAPURAF, 'T') = NVL(P_NRSEQAPURAF, NVL(AUTOFORNE.NRSEQAPURAF, 'T'))
            AND CONFIGALCADA.NRCONFIGALCADA = FILIALCADA.NRCONFIGALCADA
            AND FILIALCADA.CDFILIAL = AUTOFORNE.CDFILDEST
            AND ((CONFIGALCADA.IDLANCAFEXTRA = AUTOFORNE.IDAUTOFORNEX) OR (CONFIGALCADA.IDLANCAFEXTRA = 'AMBOS'))
            AND ((CONFIGALCADA.IDTIPOAF = AUTOFORNE.IDTIPOLANCAF)      OR (CONFIGALCADA.IDTIPOAF = 'AMBOS'))
            AND ((CONFIGALCADA.IDTPLANC = CASE
                                             WHEN AUTOFORNE.CDFILLANC = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
                                             THEN 'MATRIZ'
                                             ELSE 'UNIDADE'
                                           END  )               OR (CONFIGALCADA.IDTPLANC = 'AMBOS'))
            AND EXISTS(SELECT 1
                             FROM ALCADAGERFILI
                            WHERE ALCADAGERFILI.CDFILIAL       = AUTOFORNE.CDFILDEST
                              AND ALCADAGERFILI.NRCONFIGALCADA = CONFIGALCADA.NRCONFIGALCADA)
          GROUP BY AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF
          ORDER BY AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, ITEMAUTF.DTPROGENTAF;
   END IF;
   LOOP
      FETCH C_AUTOFORNE INTO C_AUTOFORNE_CDFILDEST, C_AUTOFORNE_CDFILLANC, C_AUTOFORNE_NRAUTOFORN,
                             C_AUTOFORNE_DTPROGENTAF, C_AUTOFORNE_NRCONFIGALCADA, C_AUTOFORNE_IDTPALCADA;
      EXIT WHEN C_AUTOFORNE%NOTFOUND;
      IF V_COUNTADOR > 0 THEN
         CONSISTE_ORCAMENTO_GOP(C_AUTOFORNE_CDFILDEST, C_AUTOFORNE_CDFILLANC, C_AUTOFORNE_NRAUTOFORN, V_RETORNO, 1, C_AUTOFORNE_DTPROGENTAF);
      END IF;
      IF (V_RETORNO = 'N') OR (V_COUNTADOR = 0) THEN
         P_ENVIAREMAIL := 'S';
          DELETE
           FROM APROVALCADA
          WHERE NRCONFIGALCADA = C_AUTOFORNE_NRCONFIGALCADA
             AND CDFILDEST     = C_AUTOFORNE_CDFILDEST
             AND CDFILLANC     = C_AUTOFORNE_CDFILLANC
             AND NRDEMANDA     = C_AUTOFORNE_NRAUTOFORN;

         UPDATE AUTOFORNE
            SET NRCONFIGALCADA = C_AUTOFORNE_NRCONFIGALCADA, IDSITAFALCADA = 'PENDENTE', IDBAIXAAF = '3'
          WHERE CDFILDEST  = C_AUTOFORNE_CDFILDEST
            AND CDFILLANC  = C_AUTOFORNE_CDFILLANC
            AND NRAUTOFORN = C_AUTOFORNE_NRAUTOFORN;
         NOVO_CODIGO_NT('APROVALCADA', V_NRAPROVALCADA);

         SELECT NVL(MIN(VRAPROVCMP), 0)
           INTO V_VRAPROVCMP
           FROM ALCADAGERFILI
          WHERE ALCADAGERFILI.CDFILIAL       = C_AUTOFORNE_CDFILDEST
            AND ALCADAGERFILI.NRCONFIGALCADA = C_AUTOFORNE_NRCONFIGALCADA;

         SELECT MAX(CDOPERADOR)
           INTO V_CDOPERADOR
           FROM ALCADAGERFILI
          WHERE ALCADAGERFILI.CDFILIAL           = C_AUTOFORNE_CDFILDEST
            AND ALCADAGERFILI.NRCONFIGALCADA     = C_AUTOFORNE_NRCONFIGALCADA
            AND NVL(ALCADAGERFILI.VRAPROVCMP, 0) = V_VRAPROVCMP;
         INSERT
           INTO APROVALCADA(NRAPROVALCADA, NRCONFIGALCADA, CDFILDEST,
                            CDFILLANC, NRDEMANDA, CDOPERADOR, DTINCLUSAO,
                            IDTPDEMANDA, IDCLASSIFIC, IDOPERACAOALC, IDAPROVADO,
                            IDTPALCADA, IDBLOQAFSEMALCADA )
         VALUES (TO_NUMBER(V_NRAPROVALCADA), C_AUTOFORNE_NRCONFIGALCADA, C_AUTOFORNE_CDFILDEST,
                C_AUTOFORNE_CDFILLANC, C_AUTOFORNE_NRAUTOFORN, V_CDOPERADOR, TRUNC(SYSDATE),
                'AF', 'PADRAO', 'LANCAMENTO', 'PENDENTE', C_AUTOFORNE_IDTPALCADA, V_IDBLOQAFSEMALCADA);
      END IF;
   END LOOP;
END;
/