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,
   P_CDRECEITA      IN MAPAAPURAC.CDRECEITACONTR%TYPE DEFAULT NULL) RETURN VARCHAR
AS
   V_CDRECEITA  VARCHAR2(11);
   V_IDGERADIRF CODRECEPADRAO.IDGERADIRF%TYPE;
   V_CDNATUREND VARCHAR2(5);
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;
   V_CDRECEITA := NVL(V_CDRECEITA,P_CDRECEITA);
   IF V_CDRECEITA IS NOT NULL THEN
      BEGIN
         SELECT MAX(C.IDGERADIRF), MAX(CDNATUREND)
           INTO V_IDGERADIRF, V_CDNATUREND
           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';
            V_CDNATUREND := 'XXXXX';
      END;
      V_CDRECEITA := V_CDRECEITA || NVL(V_IDGERADIRF,'N')|| NVL(V_CDNATUREND,'XXXXX');
   END IF;
   RETURN(V_CDRECEITA);
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('RETORNA_COD_RECEITA','6.49.030'); END;
/
