CREATE OR REPLACE
FUNCTION SITUACAO_LINPLUSO
  (P_LU_IDLUSOATIV IN LICENCAUSO.IDLUSOATIV%TYPE,
   P_LL_DTVALPERSPEND IN DATE,
   P_LL_DTVALPERSPAGO IN DATE,
   P_LL_IDEXCLUIDO IN VARCHAR2,
   P_DATA IN DATE,
   P_SITUACAO IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
IS
   V_SITUACAO VARCHAR2(10);
   V_ULTDIAMESANT DATE;
BEGIN
   V_SITUACAO := 'NULL';
   SELECT ADD_MONTHS(LAST_DAY(TRUNC(P_DATA)), -1) INTO V_ULTDIAMESANT FROM DUAL;

   -- ATIVA
   IF ((P_LU_IDLUSOATIV = 'S' AND (P_LL_DTVALPERSPEND IS NOT NULL OR P_LL_DTVALPERSPAGO IS NOT NULL)) AND
       (P_LL_IDEXCLUIDO = 'N' OR P_LL_DTVALPERSPEND > V_ULTDIAMESANT OR P_LL_DTVALPERSPAGO > V_ULTDIAMESANT)) THEN

       -- UNIDADE ATIVA COM PER GERADO PARA A LINHA DE PRODUTO, OU SEJA,
       -- COM UMA DAS DUAS DATAS PREENCHIDA
       -- LINHA DE PRODUTO NAO EXCLUIDA PARA A UNIDADE
       -- LINHA DE PRODUTO EXCLUIDA PARA A UNIDADE COM PER VALIDO

      V_SITUACAO := 'ATIVA';
   END IF;

   IF P_SITUACAO IS NOT NULL AND V_SITUACAO = P_SITUACAO THEN
      RETURN (V_SITUACAO);
   END IF;

   -- VALIDA
   IF ((P_LU_IDLUSOATIV = 'S' AND (P_LL_DTVALPERSPEND IS NOT NULL OR P_LL_DTVALPERSPAGO IS NOT NULL)) AND
       (P_LL_IDEXCLUIDO = 'N' OR P_LL_DTVALPERSPEND > V_ULTDIAMESANT OR P_LL_DTVALPERSPAGO > V_ULTDIAMESANT))

       -- ATIVA
       -- UNIDADE ATIVA COM PER GERADO PARA A LINHA DE PRODUTO, OU SEJA,
       -- COM UMA DAS DUAS DATAS PREENCHIDA
       -- LINHA DE PRODUTO NAO EXCLUIDA PARA A UNIDADE
       -- LINHA DE PRODUTO EXCLUIDA PARA A UNIDADE COM PER VALIDO

    OR (P_LL_DTVALPERSPEND > V_ULTDIAMESANT OR P_LL_DTVALPERSPAGO > V_ULTDIAMESANT) THEN

       -- ARQUIVO DE PERSONALIZACAO VALIDO ESTANDO A UNIDADE ATIVA OU NAO

       V_SITUACAO := 'VALIDA';
   END IF;

   IF P_SITUACAO IS NOT NULL AND V_SITUACAO = P_SITUACAO THEN
      RETURN (V_SITUACAO);
   END IF;

   -- INVALIDA
   IF ((P_LU_IDLUSOATIV = 'N' AND (P_LL_DTVALPERSPEND <= V_ULTDIAMESANT  OR P_LL_DTVALPERSPAGO <= V_ULTDIAMESANT))

        -- INATIVA E COM ARQUIVO DE PERSONALIZACAO VENCIDO

    OR (P_LL_DTVALPERSPEND IS NULL AND P_LL_DTVALPERSPAGO IS NULL)

        -- SEM PER GERADO PARA A LINHA DE PRODUTO

    OR (P_LL_IDEXCLUIDO = 'S' AND (P_LL_DTVALPERSPEND <= V_ULTDIAMESANT  OR P_LL_DTVALPERSPAGO <= V_ULTDIAMESANT))) THEN

       -- LINHA DE PRODUTO EXCLUIDA PARA A UNIDADE E COM PER VENCIDO

       V_SITUACAO := 'INVALIDA';
   END IF;

   RETURN(V_SITUACAO);
END;
/