CREATE OR REPLACE FUNCTION CODIGO_FISCAL_PRODUTO(
    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_DSMENSINCID     VARCHAR(120); 
   V_CDIMPOSTRIB     VARCHAR(2); 
BEGIN 
   BEGIN 
       SELECT CDIMPOSTRIB 
         INTO V_CDIMPOSTRIB 
         FROM IMPOSTO 
        WHERE CDIMPOSTO = P_CDIMPOSTO; 
   EXCEPTION WHEN NO_DATA_FOUND THEN 
      V_CDIMPOSTRIB := NULL; 
   END; 
   IF (V_CDIMPOSTRIB IS NOT NULL) THEN 
      BEGIN 
         
           SELECT MAX(P.CDARVPROD) AS CDARVPROD, CDIMPOSTO 
             INTO V_ARVPROD,V_CDIMPOSTO 
             FROM INCIDENCIA I, PRODUTO P 
            WHERE (I.IDENTRSAIDIN = P_ENTRSAIDIN) 
              AND (I.CDEMPRESA    = P_EMPRESA) 
              AND (I.CDTIPOOPER   = P_TIPOOPER) 
              AND (I.CDINSCESTA   = P_INSCESTA) 
              AND (I.CDIMPOSTO    = V_CDIMPOSTRIB) 
              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 CDIMPOSTO; 
           EXCEPTION WHEN NO_DATA_FOUND THEN 
              V_ARVPROD   := NULL; 
              V_CDIMPOSTO := NULL; 
        END; 
   END IF; 
   IF (V_CDIMPOSTRIB IS NULL) OR (V_ARVPROD IS NULL) THEN 
        BEGIN 
         
           SELECT MAX(P.CDARVPROD) AS CDARVPROD, CDIMPOSTO 
             INTO V_ARVPROD,V_CDIMPOSTO 
             FROM INCIDENCIA I, PRODUTO P 
            WHERE (I.IDENTRSAIDIN = P_ENTRSAIDIN) 
              AND (I.CDEMPRESA    = P_EMPRESA) 
              AND (I.CDTIPOOPER   = P_TIPOOPER) 
              AND (I.CDINSCESTA   = P_INSCESTA) 
              AND (I.CDIMPOSTO    = P_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 CDIMPOSTO; 
           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(I.CDIMPOSTO), MAX(CDFISCAL), MAX(DSMENSINCID)
                INTO V_IDTRATIMPOIN,V_CDIMPOSTO,V_CDFISCAL,V_DSMENSINCID
                FROM INCIDENCIA I, MENSINCID M, PRODUTO P
               WHERE (I.IDENTRSAIDIN = P_ENTRSAIDIN)
                 AND (I.CDEMPRESA    = P_EMPRESA)
                 AND (I.CDTIPOOPER   = P_TIPOOPER)
                 AND (I.CDIMPOSTO    = V_CDIMPOSTO)
                 AND (I.CDINSCESTA   = P_INSCESTA)
                 AND (I.CDGRUPOFISC IS NULL)
                 AND (I.NRINCIDENCIA = M.NRINCIDENCIA(+))
                 AND (I.CDPRODUTO    = P.CDPRODUTO(+))
                 AND (P.CDARVPROD    = V_ARVPROD);
              EXCEPTION WHEN NO_DATA_FOUND THEN
                 V_IDTRATIMPOIN := NULL;
                 V_CDIMPOSTO := NULL;
                 V_CDFISCAL     := NULL;
                 V_DSMENSINCID  := NULL;
           END;
        ELSE
           BEGIN
              SELECT MAX(IDTRATIMPOIN), MAX(I.CDIMPOSTO), MAX(CDFISCAL), MAX(DSMENSINCID)
                INTO V_IDTRATIMPOIN,V_CDIMPOSTO,V_CDFISCAL,V_DSMENSINCID
                FROM INCIDENCIA I, MENSINCID M
               WHERE (I.IDENTRSAIDIN = P_ENTRSAIDIN)
                 AND (I.CDEMPRESA    = P_EMPRESA)
                 AND (I.CDTIPOOPER   = P_TIPOOPER)
                 AND (I.CDIMPOSTO    = P_CDIMPOSTO)
                 AND (I.CDINSCESTA   = P_INSCESTA)
                 AND (I.CDGRUPOFISC  IS NULL)
                 AND (I.NRINCIDENCIA = M.NRINCIDENCIA(+))
                 AND (CDPRODUTO IS NULL);
              EXCEPTION WHEN NO_DATA_FOUND THEN
                V_IDTRATIMPOIN := NULL;
                V_CDIMPOSTO    := NULL;
                V_CDFISCAL     := NULL;
                V_DSMENSINCID  := NULL;
           END;
        END IF;
   ELSE
        IF NOT (V_ARVPROD IS NULL) THEN
           BEGIN
              SELECT MAX(IDTRATIMPOIN), MAX(I.CDIMPOSTO), MAX(CDFISCAL), MAX(DSMENSINCID)
                INTO V_IDTRATIMPOIN,V_CDIMPOSTO,V_CDFISCAL,V_DSMENSINCID
                FROM INCIDENCIA I, MENSINCID M, PRODUTO P
               WHERE (I.IDENTRSAIDIN = P_ENTRSAIDIN)
                 AND (I.CDEMPRESA    = P_EMPRESA)
                 AND (I.CDTIPOOPER   = P_TIPOOPER)
                 AND (I.CDIMPOSTO    =V_CDIMPOSTRIB)
                 AND (I.CDINSCESTA   = P_INSCESTA)
                 AND (I.CDGRUPOFISC IS NULL)
                 AND (I.NRINCIDENCIA = M.NRINCIDENCIA(+))
                 AND (I.CDPRODUTO    = P.CDPRODUTO(+))
                 AND (P.CDARVPROD    = V_ARVPROD); 
              EXCEPTION WHEN NO_DATA_FOUND THEN 
                 V_IDTRATIMPOIN := NULL; 
                 V_CDIMPOSTO := NULL; 
                 V_CDFISCAL     := NULL; 
                 V_DSMENSINCID  := NULL; 
           END; 
           V_CDFISCAL := 'T'; 
        END IF; 
   END IF; 
   RETURN (V_CDFISCAL);
END; 
/


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

