create or replace PROCEDURE FCT_DESALOCA_RECURSOS(
  P_OPERADOR  IN VARCHAR2,
  P_DTDESALOC IN DATE DEFAULT SYSDATE
)

/* A procedure "FCT_DESALOCA_RECURSOS" tem como objetivo realizar a desalocação dos recursos de acordo
   com a data que foi agendada a desalocação.

     - Se a desalocação foi marcada para uma data superior á data da operação, a operação será feita através de JOB
*/
AS
V_NRORG  NUMBER;
V_OPERADOR VARCHAR2(12);

BEGIN

V_NRORG := NVL(SYS_CONTEXT('nrorg_ctx', 'nrorg'), 1);
V_OPERADOR := NVL(P_OPERADOR, '1');

  /* 1 - Busca se existe desalocações para a data atual ou anterior*/
  FOR C_DEV IN (SELECT NRDEVAGENDRECURCON, NRRECURSOSAGENDCONT, DTDEVAGENDRECURCON
                  FROM FCT_DEVAGENDRECURCON
                 WHERE TRUNC(DTDEVAGENDRECURCON) = TRUNC(P_DTDESALOC)
                   AND NRORG                     = V_NRORG
                   AND IDATIVO                   = 'S') LOOP

     /* 2 - Deleta os registros de agedamento do recurso  */
      DELETE FROM FCT_APROPAGENDAMENTO
       WHERE NRRECURSOSAGENDCONT = C_DEV.NRRECURSOSAGENDCONT
        AND TRUNC(DTAPROPRIACAO) >= C_DEV.DTDEVAGENDRECURCON
        AND NRORG = V_NRORG;

      /* 3 - altera o status do recurso para "Desalocado" */
      UPDATE FCT_RECURSOSAGENDCONT
         SET IDSITUARECGEND = '2',
             DTULTATU       = P_DTDESALOC,
             CDOPERULTATU   = V_OPERADOR,
             NRORGULTATU    = V_NRORG
       WHERE NRRECURSOSAGENDCONT = C_DEV.NRRECURSOSAGENDCONT
         AND IDSITUARECGEND      <> '2'
         AND NRORG               = V_NRORG;

      /* 4 - Inativa a desalocação */
      UPDATE FCT_DEVAGENDRECURCON
         SET IDATIVO      = 'N',
             DTULTATU     = P_DTDESALOC,
             CDOPERULTATU = V_OPERADOR,
             NRORGULTATU  = V_NRORG
       WHERE NRDEVAGENDRECURCON = C_DEV.NRDEVAGENDRECURCON
         AND NRORG              = V_NRORG;

  END LOOP;
END;