create or replace PROCEDURE ORCAMENTO_CENTCUST_OK(P_CDEMPRESA EMPRESA.CDEMPRESA%TYPE,
                                                  P_CDFILIAL  FILIAL.CDFILIAL%TYPE,
                                                  P_CDCLASSFINA CLASSFINANC.CDCLASSFINA%TYPE,
                                                  P_CDCENTCUST CENTCUST.CDCENTCUST%TYPE,
                                                  P_DTLANCAMENTO DATE,
                                                  P_VRVALOR NUMBER,
                                                  P_RESULTADO OUT NUMBER)
AS
   V_IDCONSORCFIN VARCHAR2(1);
   V_IDTPORCAFINA VARCHAR2(1);
   V_DTINIMES DATE;
   V_DTFINMES DATE;
   V_CDFILIAL VARCHAR2(4);
BEGIN
   /*VERIFICA PARAMETRIZAÇÃO GERAL SOBRE ORÇAMENTO FINANCEIRO*/
   SELECT IDCONSORCFIN, IDTPORCAFINA
     INTO V_IDCONSORCFIN, V_IDTPORCAFINA
     FROM PARAMGERAL;
   /*VERIFICA SE CONSISTE OU NÃO ORÇAMENTO FINANCEIRO*/
   IF (V_IDCONSORCFIN = 'S') AND (P_VRVALOR <> 0) THEN
      /*VERIFICA SE O TIPO DE ORÇAMENTO É POR FILIAL*/
      IF V_IDTPORCAFINA = 'F' THEN
         V_CDFILIAL := P_CDFILIAL;
      ELSE
         V_CDFILIAL := NULL;
      END IF;
      V_DTINIMES := TO_DATE('01' || TO_CHAR(P_DTLANCAMENTO, 'MMYYYY'), 'DDMMYYYY');
      V_DTFINMES := LAST_DAY(P_DTLANCAMENTO);
      /*PESQUISA O ORÇAMENTO FINANCEIRO PARA A EMPRESA, CLASSIFICAÇÃO FINANCEIRA,
      FILIAL E MES DA DATA DE LANÇAMENTO*/
      FOR C_ORCAFIN IN (SELECT CDEMPRESA,
                               CDFILIAL,
                               CDCENTCUST,
                               DTORCAFINA,
                               NVL(VRORCAFINA, 0) VRORCAFINA,
                               NVL(VREXTOLEORCA, 0) VREXTOLEORCA,
                               NVL(VRREALORCA, 0) VRREALORCA
                          FROM ORCAFINACENTCUST
                         WHERE (CDEMPRESA   = P_CDEMPRESA)   AND
                               (CDFILIAL    = NVL(V_CDFILIAL, CDFILIAL)) AND
                               (CDCENTCUST  = P_CDCENTCUST) AND
                               (CDCLASSFINA = P_CDCLASSFINA) AND
                               (DTORCAFINA BETWEEN V_DTINIMES AND V_DTFINMES)) LOOP
         /*VERIFICA SE O VALOR ORÇADO SERÁ ULTRAPASSADO*/
         IF ROUND(C_ORCAFIN.VRREALORCA + P_VRVALOR, 2) > ROUND(C_ORCAFIN.VRORCAFINA + C_ORCAFIN.VREXTOLEORCA, 2) THEN
            P_RESULTADO := 0;
            RETURN;
         END IF;
         /*ATUALIZA O VALOR DO ORÇAMENTO JÁ UTILIZADO*/
         UPDATE ORCAFINACENTCUST
            SET VRREALORCA  = ROUND(C_ORCAFIN.VRREALORCA + P_VRVALOR, 2)
          WHERE CDEMPRESA   = P_CDEMPRESA AND
                CDCENTCUST  = P_CDCENTCUST AND
                CDCLASSFINA = P_CDCLASSFINA AND
                DTORCAFINA  = C_ORCAFIN.DTORCAFINA;
      END LOOP;
   END IF;
   P_RESULTADO := 1;
END;