CREATE OR REPLACE FUNCTION GERA_DTVENCGUIAIMP(
   P_CDFORMPGTO    IN PARAMIMPOSGUIA.CDFORMPGTO%TYPE,
   P_DTEMISSAO     IN NOTAFISCAL.DTEMISSAO%TYPE,
   P_CDFILIAL      IN NOTAFISCAL.CDFILIAL%TYPE,
   P_NRDIAVENCGUIA IN IMPOSTO.NRDIAVENCGUIA%TYPE) RETURN DATE
AS
   V_DIAUTIL       BOOLEAN;
   V_DIAVENC       DATE;
   V_ULTDIAMES     NUMBER;
   V_DIAFERI       NUMBER;
   V_NRDIAVENCGUIA NUMBER;
BEGIN
   V_NRDIAVENCGUIA := NVL(P_NRDIAVENCGUIA,0);
   IF V_NRDIAVENCGUIA = 0 THEN
      V_DIAVENC := P_DTEMISSAO;
   ELSE
      V_DIAUTIL   := FALSE;
      V_DIAVENC   := ADD_MONTHS(P_DTEMISSAO,1);
      V_ULTDIAMES := TO_NUMBER(TO_CHAR(LAST_DAY(V_DIAVENC),'DD'));

      IF V_NRDIAVENCGUIA > V_ULTDIAMES THEN
         V_DIAVENC := TO_DATE(V_ULTDIAMES||'/'||TO_CHAR(V_DIAVENC,'MM/YYYY'));
      ELSE
         V_DIAVENC := TO_DATE(V_NRDIAVENCGUIA||'/'||TO_CHAR(V_DIAVENC,'MM/YYYY'));
      END IF;

      WHILE NOT(V_DIAUTIL) LOOP
         V_DIAFERI := 0;
         BEGIN
            SELECT COUNT(*)
              INTO V_DIAFERI
              FROM FERIBANC
             WHERE CDFILIAL   = P_CDFILIAL
               AND DTFERIBANC = V_DIAVENC;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_DIAFERI := 0;
         END;
         IF V_DIAFERI > 0 THEN
            V_DIAVENC := V_DIAVENC-1;
         ELSE
            V_DIAUTIL := TRUE;
         END IF;
      END LOOP;
   END IF;
   RETURN(V_DIAVENC);
END;
/