CREATE OR REPLACE FUNCTION CODIGO_FISCAL_PRODUTO_NFE(
   P_ENTRSAIDIN    IN INCIDENCIA.IDENTRSAIDIN%TYPE,
   P_EMPRESA       IN INCIDENCIA.CDEMPRESA%TYPE,
   P_PRODUTO       IN PRODUTO.CDARVPROD%TYPE,
   P_INSCESTA      IN INCIDENCIA.CDINSCESTA%TYPE,
   P_TIPOOPER      IN INCIDENCIA.CDTIPOOPER%TYPE,
   P_CDIMPOSTO     IN IMPOSTO.CDIMPOSTO%TYPE) RETURN VARCHAR
AS
   V_ARVPROD         VARCHAR(20);
   V_CDIMPOSTO       VARCHAR(2);
   V_IDTRATIMPOIN    VARCHAR(1);
   V_CDFISCAL        VARCHAR(1);
   V_CDIMPOSTRIB     VARCHAR(2);
BEGIN

   V_CDIMPOSTRIB := '80';

   BEGIN
      SELECT MAX(P.CDARVPROD) AS CDARVPROD, IM.CDIMPOSTONFE
        INTO V_ARVPROD, V_CDIMPOSTO
        FROM INCIDENCIA I, PRODUTO P, IMPOSTO IM
       WHERE (I.IDENTRSAIDIN  = P_ENTRSAIDIN)
         AND (I.CDEMPRESA     = P_EMPRESA)
         AND (I.CDTIPOOPER    = P_TIPOOPER)
         AND (I.CDINSCESTA    = P_INSCESTA)
         AND (IM.CDIMPOSTONFE = V_CDIMPOSTRIB)
         AND (IM.CDIMPOSTO    = I.CDIMPOSTO)
         AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1)
         AND (I.CDGRUPOFISC IS NULL)
         AND (I.CDPRODUTO    = P.CDPRODUTO(+))
       GROUP BY IM.CDIMPOSTONFE;
      EXCEPTION WHEN NO_DATA_FOUND THEN
         V_ARVPROD   := NULL;
         V_CDIMPOSTO := NULL;
   END;

   IF (V_ARVPROD IS NULL) THEN
      BEGIN
         SELECT MAX(P.CDARVPROD) AS CDARVPROD, IM.CDIMPOSTONFE
           INTO V_ARVPROD,V_CDIMPOSTO
           FROM INCIDENCIA I, PRODUTO P, IMPOSTO IM
          WHERE (I.IDENTRSAIDIN  = P_ENTRSAIDIN)
            AND (I.CDEMPRESA     = P_EMPRESA)
            AND (I.CDTIPOOPER    = P_TIPOOPER)
            AND (I.CDINSCESTA    = P_INSCESTA)
            AND (IM.CDIMPOSTONFE = P_CDIMPOSTO)
            AND (IM.CDIMPOSTO    = I.CDIMPOSTO)
            AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1)
            AND (I.CDGRUPOFISC IS NULL)
            AND (I.CDPRODUTO     = P.CDPRODUTO(+))
          GROUP BY IM.CDIMPOSTONFE;
         EXCEPTION WHEN NO_DATA_FOUND THEN
            V_ARVPROD   := NULL;
            V_CDIMPOSTO := NULL;
      END;
      IF NOT (V_ARVPROD IS NULL) THEN
         BEGIN
            SELECT MAX(IDTRATIMPOIN), MAX(IM.CDIMPOSTONFE), MAX(CDFISCAL)
              INTO V_IDTRATIMPOIN, V_CDIMPOSTO, V_CDFISCAL
              FROM INCIDENCIA I, PRODUTO P, IMPOSTO IM
             WHERE (I.IDENTRSAIDIN  = P_ENTRSAIDIN)
               AND (I.CDEMPRESA     = P_EMPRESA)
               AND (I.CDTIPOOPER    = P_TIPOOPER)
               AND (IM.CDIMPOSTONFE = V_CDIMPOSTO)
               AND (IM.CDIMPOSTO    = I.CDIMPOSTO)
               AND (I.CDINSCESTA    = P_INSCESTA)
               AND (I.CDGRUPOFISC IS NULL)
               AND (I.CDPRODUTO     = P.CDPRODUTO(+))
               AND (P.CDARVPROD     = V_ARVPROD);
            EXCEPTION WHEN NO_DATA_FOUND THEN
               V_IDTRATIMPOIN := NULL;
               V_CDIMPOSTO := NULL;
               V_CDFISCAL     := '3';
         END;
      ELSE
         BEGIN
            SELECT MAX(IDTRATIMPOIN), MAX(IM.CDIMPOSTONFE), MAX(CDFISCAL)
              INTO V_IDTRATIMPOIN, V_CDIMPOSTO, V_CDFISCAL
              FROM INCIDENCIA I, IMPOSTO IM
             WHERE (I.IDENTRSAIDIN  = P_ENTRSAIDIN)
               AND (I.CDEMPRESA     = P_EMPRESA)
               AND (I.CDTIPOOPER    = P_TIPOOPER)
               AND (IM.CDIMPOSTONFE = P_CDIMPOSTO)
               AND (IM.CDIMPOSTO    = I.CDIMPOSTO)
               AND (I.CDINSCESTA    = P_INSCESTA)
               AND (I.CDGRUPOFISC IS NULL)
               AND (CDPRODUTO IS NULL);
            EXCEPTION WHEN NO_DATA_FOUND THEN
              V_IDTRATIMPOIN := NULL;
              V_CDIMPOSTO    := NULL;
              V_CDFISCAL     := '3';
         END;
      END IF;
   ELSE
      BEGIN
         SELECT MAX(IDTRATIMPOIN), MAX(IM.CDIMPOSTONFE), MAX(CDFISCAL)
           INTO V_IDTRATIMPOIN,V_CDIMPOSTO,V_CDFISCAL
           FROM INCIDENCIA I, PRODUTO P, IMPOSTO IM
          WHERE (I.IDENTRSAIDIN  = P_ENTRSAIDIN)
            AND (I.CDEMPRESA     = P_EMPRESA)
            AND (I.CDTIPOOPER    = P_TIPOOPER)
            AND (IM.CDIMPOSTONFE = V_CDIMPOSTRIB)
            AND (IM.CDIMPOSTO    = I.CDIMPOSTO)
            AND (I.CDINSCESTA    = P_INSCESTA)
            AND (I.CDGRUPOFISC IS NULL)
            AND (I.CDPRODUTO     = P.CDPRODUTO(+))
            AND (P.CDARVPROD     = V_ARVPROD);
         EXCEPTION WHEN NO_DATA_FOUND THEN
            V_IDTRATIMPOIN := NULL;
            V_CDIMPOSTO    := NULL;
            V_CDFISCAL     := '3';
      END;
   END IF;
   RETURN (NVL(V_CDFISCAL,'3'));
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CODIGO_FISCAL_PRODUTO','5.05.025'); END;
/

