CREATE OR REPLACE FUNCTION RETORNA_COD_RECEITA(
   P_CDIMPOSTO      IN IMPOSTO.CDIMPOSTO%TYPE,
   P_IDPARTICIPANTE IN NOTAFISCAL.IDORIGDESTNF%TYPE,
   P_CDPARTICIPANTE IN NOTAFISCAL.CDFORNECED%TYPE) RETURN VARCHAR
AS
   V_CDRECEITA  VARCHAR2(11);
   V_IDGERADIRF CODRECEPADRAO.IDGERADIRF%TYPE;
BEGIN
   V_CDRECEITA := NULL;
   IF P_IDPARTICIPANTE = 'F' THEN
      BEGIN
         SELECT R.CDRECEITA
           INTO V_CDRECEITA
           FROM RELACCODRECPART R
          WHERE R.IDTIPO     = 'F'
            AND R.CDFORNECED = P_CDPARTICIPANTE
            AND R.CDIMPOSTO  = P_CDIMPOSTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDRECEITA := NULL;
      END;
   ELSIF P_IDPARTICIPANTE = 'C' THEN
      BEGIN
         SELECT R.CDRECEITA
           INTO V_CDRECEITA
           FROM RELACCODRECPART R
          WHERE R.IDTIPO    = 'C'
            AND R.CDCLIENTE = P_CDPARTICIPANTE
            AND R.CDIMPOSTO = P_CDIMPOSTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDRECEITA := NULL;
      END;
   ELSIF P_IDPARTICIPANTE = 'L' THEN
      BEGIN
         SELECT R.CDRECEITA
           INTO V_CDRECEITA
           FROM RELACCODRECPART R
          WHERE R.IDTIPO    = 'L'
            AND R.CDFILIAL  = P_CDPARTICIPANTE
            AND R.CDIMPOSTO = P_CDIMPOSTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDRECEITA := NULL;
      END;
   END IF;
   IF V_CDRECEITA IS NULL THEN
      BEGIN
         SELECT R.CDRECEITA
           INTO V_CDRECEITA
           FROM RELACCODRECIMP R
          WHERE R.CDIMPOSTO = P_CDIMPOSTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDRECEITA := NULL;
      END;
   END IF;
   IF V_CDRECEITA IS NOT NULL THEN
      BEGIN
         SELECT MAX(C.IDGERADIRF)
           INTO V_IDGERADIRF
           FROM CODRECEITACONTR C, IMPOSTO I
          WHERE C.CDIMPOSTO = I.CDIMPOSTONFE
            AND I.CDIMPOSTO = P_CDIMPOSTO
            AND C.CDRECEITACONTR = V_CDRECEITA;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDGERADIRF := 'N';
      END;
      V_CDRECEITA := V_CDRECEITA || NVL(V_IDGERADIRF,'N');
   END IF;
   RETURN(V_CDRECEITA);
END;
/