create or replace PROCEDURE UTILI_RECEITA_MANUAL(
P_CDFILIPROC IN VARCHAR2,
P_CDRECEITA IN VARCHAR2,
P_IDVIGENCIA IN VARCHAR2,
P_NRORG IN NUMBER,
P_CDOPERADOR IN VARCHAR2,
P_MENU_EXPIRADO IN VARCHAR2,
P_NRLISTAERROS OUT NUMBER
)
AS
   V_SEQ VARCHAR2(20);
   PROCEDURE INSERE_LISTA_ERROS(P_MENSAGEM IN VARCHAR2)
   AS
      V_SEQ VARCHAR2(20); 
   BEGIN
      IF P_MENSAGEM IS NOT NULL THEN
         IF P_NRLISTAERROS IS NULL THEN
            NOVO_CODIGO('LISTAERROS'|| P_CDFILIPROC, V_SEQ);
            P_NRLISTAERROS := TO_NUMBER(V_SEQ);
         END IF;
         INSERT INTO LISTAERROS
         (CDFILIAL, NRLISTA, DSERRO,
          NRORG, NRORGINCLUSAO, NRORGULTATU,
          CDOPERINCLUSAO, CDOPERULTATU,
          DTINCLUSAO, DTULTATU)
         VALUES
         (P_CDFILIPROC, P_NRLISTAERROS, P_MENSAGEM,
          P_NRORG, P_NRORG, P_NRORG,
          P_CDOPERADOR, P_CDOPERADOR,
          SYSDATE, SYSDATE);
      END IF;
   END;
   
BEGIN
  /*VALIDACOES DA LISTA DE ERROS*/
  P_NRLISTAERROS := NULL;

  /*BUSCA DENTRO DE TODOS OS MANUAIS A RECEITA INFORMADA*/
  FOR CUR_RECEITA IN (SELECT DISTINCT MC.CDMANCIA, MC.IDSITUAPROPCIA,
                        MC.CDFILIAL, MC.CDCIA, MC.DSMANUAL, MC.DTINIVGMA, MC.DTFIMVGMA,
                        MC.NRORG, RSBM.CDRECEITA, CIA.NMCIA, CIA.SGCIA, FL.NMFILIAL
                      FROM MANUALCIAM MC
                        JOIN RECSUBSEMAM RSBM
                            ON MC.CDFILIAL     = RSBM.CDFILIAL
                            AND MC.CDCIA       =RSBM.CDCIA
                            AND MC.CDMANCIA    = RSBM.CDMANCIA
                            AND MC.NRORG       = RSBM.NRORG
                        JOIN  SUBGRUSEMAM SGM
                            ON  SGM.CDFILIAL         = RSBM.CDFILIAL
                            AND SGM.CDCIA            = RSBM.CDCIA
                            AND SGM.CDMANCIA         = RSBM.CDMANCIA
                            AND SGM.NRSERVICOCIAFILI = RSBM.NRSERVICOCIAFILI
                            AND SGM.CDCLASSE         = RSBM.CDCLASSE
                            AND SGM.CDSUBGRU         = RSBM.CDSUBGRU
                            AND SGM.NRSEQSUBGRUSEMAM = RSBM.NRSEQSUBGRUSEMAM
                        JOIN COMPANHIA CIA
                            ON CIA.CDCIA      = MC.CDCIA
                            AND CIA.NRORG     = MC.NRORG
                        JOIN FILIAL FL
                            ON FL.CDFILIAL = MC.CDFILIAL
                            AND FL.NRORG = MC.NRORG
                      WHERE MC.NRORG      = P_NRORG
                        AND (
                        (P_MENU_EXPIRADO = 'S') OR
                        (MC.IDSITUAPROPCIA <> 'R' AND (MC.IDSITUAPROPCIA <> 'A' OR (MC.DTFIMVGMA >= TRUNC(SYSDATE) AND SGM.DTFIMVGSUMA >= TRUNC(SYSDATE) ) ) )
                        )
  ) LOOP
    /*CASO A RECEITA ESTEJA NA COMPOSICAO DO MENU GRID INSERE NA LISTA DE ERROS*/ 
    IF CUR_RECEITA.CDRECEITA = P_CDRECEITA THEN
      /*Operacao bloqueada. A receita e utilizada na composicao do Menu Grid: $param[0]*/
      INSERE_LISTA_ERROS('APPERRMSGSTR' || 'APP-00074' || '$$' || CUR_RECEITA.DSMANUAL || '$$' || CUR_RECEITA.NMCIA || '$$' || CUR_RECEITA.NMFILIAL || '$$' || 'APPERRMSGEND');   
    ELSE 
    /*SENAO PROCURA DENTRO DA COMPOSICAO DE SUAS SUBRECEITAS RECURSIVAMENTE*/
      RECURSIVE_RECEITA(P_CDFILIPROC, CUR_RECEITA.CDRECEITA, P_CDRECEITA, CUR_RECEITA.DSMANUAL, CUR_RECEITA.NMCIA, CUR_RECEITA.NMFILIAL, NULL, P_NRORG, P_CDOPERADOR, P_NRLISTAERROS);
    END IF; 

  END LOOP;
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(P_NRLISTAERROS));
END UTILI_RECEITA_MANUAL;
/