CREATE OR REPLACE FUNCTION CONTCTBL_SPED(
    P_IDENTRSAIDOP IN NOTAFISCAL.IDENTRSAIDOP%TYPE,
    P_CDPRODUTO    IN PRODUTO.CDPRODUTO%TYPE,
    P_CDTIPOOPER   IN NOTAFISCAL.CDTIPOOPER%TYPE,
    P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE)RETURN VARCHAR2
IS
    V_CDARVPROD  VARCHAR2(20);
    V_RETORNA    VARCHAR2(20);
BEGIN
   /*Busca o codigo da arvore de produtos*/
   BEGIN
      SELECT CDARVPROD
        INTO V_CDARVPROD
        FROM PRODUTO
       WHERE CDPRODUTO = P_CDPRODUTO;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDARVPROD := NULL;
   END;

   /*Tipo de Operacao -> Produto*/
   IF V_CDARVPROD IS NOT NULL THEN
      BEGIN
         SELECT CDCTBLPRODTO
           INTO V_RETORNA
           FROM CTBPRDTPOPER CO, PRODUTO PR
          WHERE CO.IDENTRSAIDOP = P_IDENTRSAIDOP
            AND CO.CDTIPOOPER   = P_CDTIPOOPER
            AND CO.CDPRODUTO    = PR.CDPRODUTO
            AND PR.CDARVPROD    = (SELECT MAX(CDARVPROD)
                                     FROM CTBPRDTPOPER C, PRODUTO P
                                    WHERE C.IDENTRSAIDOP = P_IDENTRSAIDOP
                                      AND C.CDTIPOOPER   = P_CDTIPOOPER
                                      AND C.CDPRODUTO    = P.CDPRODUTO
                                      AND V_CDARVPROD LIKE P.CDARVPROD ||'%'
                                      AND NOT CDCTBLPRODTO IS NULL);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_RETORNA := NULL;
      END;
   END IF;

   /*Tipo de Operacao -> Tipo de Operacao*/
   IF V_RETORNA IS NULL THEN
      BEGIN
         SELECT CDCONTPROD
           INTO V_RETORNA
           FROM TIPOOPERAC
          WHERE IDENTRSAIDOP = P_IDENTRSAIDOP
            AND CDTIPOOPER   = P_CDTIPOOPER;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_RETORNA := NULL;
      END;
   END IF;

   /*Produto -> Produtos por Filial*/
   IF (V_RETORNA IS NULL) AND (P_CDPRODUTO IS NOT NULL) THEN
      IF P_IDENTRSAIDOP = 'E' THEN
         BEGIN
            SELECT CDCTBLENTRPF
              INTO V_RETORNA
              FROM PRODFILI
             WHERE CDFILIAL  = P_CDFILIAL
               AND CDPRODUTO = P_CDPRODUTO;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_RETORNA := NULL;
         END;
      ELSE
         BEGIN
            SELECT CDCTBLSAIDPF
              INTO V_RETORNA
              FROM PRODFILI
             WHERE CDFILIAL  = P_CDFILIAL
               AND CDPRODUTO = P_CDPRODUTO;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_RETORNA := NULL;
         END;
      END IF;
   END IF;

   /*Produto -> Produto*/
   IF (V_RETORNA IS NULL) AND (V_CDARVPROD IS NOT NULL) THEN
      IF P_IDENTRSAIDOP = 'E' THEN
         BEGIN
            SELECT CDCTBLENTRPR
              INTO V_RETORNA
              FROM PRODUTO PR
             WHERE PR.CDARVPROD = (SELECT MAX(CDARVPROD)
                                     FROM PRODUTO P
                                    WHERE V_CDARVPROD LIKE P.CDARVPROD ||'%'
                                      AND CDCTBLENTRPR IS NOT NULL);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_RETORNA := NULL;
         END;
      ELSE
         BEGIN
            SELECT CDCTBLSAIDPR
              INTO V_RETORNA
              FROM PRODUTO PR
             WHERE PR.CDARVPROD = (SELECT MAX(CDARVPROD)
                                     FROM PRODUTO P
                                    WHERE V_CDARVPROD LIKE P.CDARVPROD ||'%'
                                      AND CDCTBLSAIDPR IS NOT NULL);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_RETORNA := NULL;
         END;
      END IF;
   END IF;
   RETURN(V_RETORNA);
END;
/