/*
 Tecnisa - Tecnologia em Informatica
 Nome: CST_ITEM
 Descricao:
  Criacao de duas funcoes CST_ITEM e CFOP_ITEM a serem utilizadas na procedure.
 Criacao:
 20/09/2003 - Rejane P. Leite
 RAISE_APPLICATION_ERROR(-20501, '' , TRUE);
 d:\win_v4\sql\End_Conv\Oracle\5010_FISSTPO.SQL

*/
create or replace FUNCTION CST_ITEM
   (P_CDIMPOSTO    IN IMPOSTO.CDIMPOSTO%TYPE,
    P_CDEMPRESA    IN NOTAFISCAL.CDEMPRESA%TYPE,
    P_CDINSCESTA   IN NOTAFISCAL.CDINSCESTA%TYPE,
    P_CDFILIAL     IN NOTAFISCAL.CDFILIAL%TYPE,
    P_NRLANCTONF   IN NOTAFISCAL.NRLANCTONF%TYPE,
    P_CDCLIENTE    IN NOTAFISCAL.CDCLIENTE%TYPE,
    P_CDOPERACAO   IN NOTAFISCAL.CDTIPOOPER%TYPE,
    P_DTVALIDCST   IN NOTAFISCAL.DTENTRSAID%TYPE,
    P_CDARVPROD    IN PRODUTO.CDARVPROD%TYPE,
    P_PAISORIG     IN ENDECLIE.CDPAIS%TYPE,
    P_ESTAORIG     IN ENDECLIE.SGESTADO%TYPE,
    P_PAISDEST     IN ENDECLIE.CDPAIS%TYPE,
    P_ESTADEST     IN ENDECLIE.SGESTADO%TYPE,
    P_VRITEM       IN NOTAFISCAL.VRNOTAFISC%TYPE,
    P_IDORIGEMPROD IN VARCHAR2 DEFAULT 'N') RETURN STRING
AS
   V_CSTITEM IMPOSTONF.CDSITUTRIBNF%TYPE;
   V_CDGRUPOFISC  VARCHAR2(03);
   V_CDARVPROD    VARCHAR2(20);
   V_CST1DIGT     VARCHAR2(01);   
   V_CONTADOR     NUMBER;
   V_EXISTREGRA   VARCHAR2(1);
BEGIN
   V_EXISTREGRA := 'N';
   CONSULTA_GRUPOFISCAL('C', P_CDCLIENTE, P_CDFILIAL, 'S', P_CDOPERACAO, V_CDGRUPOFISC);

   SELECT CDCSTDIG1PROD
     INTO V_CST1DIGT
     FROM PRODUTO
    WHERE (CDARVPROD = P_CDARVPROD);

   IF V_CST1DIGT IS NULL THEN
      SELECT MAX(CDCSTDIG1SAI)
        INTO V_CST1DIGT
        FROM INSCRESTAD
       WHERE (CDEMPRESA  = P_CDEMPRESA) AND
             (CDINSCESTA = P_CDINSCESTA);
   END IF;

   FOR C_REGRA IN (SELECT CDSITUTRIB, IDCSTINTEREST, CDREGRAFISC
                     FROM TABLE(CONSULTA_REGRA_FISCAL(P_CDIMPOSTO, P_CDEMPRESA, V_CDGRUPOFISC, 'S', P_CDOPERACAO, P_CDINSCESTA, P_CDARVPROD, P_DTVALIDCST,
                                                      P_PAISORIG, P_ESTAORIG, '', P_PAISDEST, P_ESTADEST, '', P_VRITEM, 'N', P_IDORIGEMPROD))
                    WHERE VRALIQUOTA IS NOT NULL) LOOP
       IF (C_REGRA.CDSITUTRIB IS NOT NULL) THEN
           V_CSTITEM := V_CST1DIGT||C_REGRA.CDSITUTRIB;
       END IF;
       V_EXISTREGRA := 'S';
   END LOOP;

   IF V_EXISTREGRA = 'N' THEN
      IF (V_CDGRUPOFISC IS NOT NULL) THEN
         SELECT MAX(P.CDARVPROD), COUNT(*)
         INTO V_CDARVPROD, V_CONTADOR
         FROM CODSITUTRIB C, PRODUTO P
         WHERE (IDENTSAICST = 'S')                  AND
               (CDEMPRESA   = P_CDEMPRESA)          AND
               (CDTIPOOPER  = P_CDOPERACAO)         AND
               (CDINSCESTA  = RTRIM(P_CDINSCESTA))  AND
               (CDGRUPOFISC = V_CDGRUPOFISC)        AND
               (C.CDPRODUTO = P.CDPRODUTO(+))       AND
               (INSTR(P_CDARVPROD,NVL(RTRIM(P.CDARVPROD),P_CDARVPROD)) = 1);
      END IF;

      IF V_CONTADOR > 0 THEN
         IF NOT(V_CDARVPROD IS NULL) THEN
            SELECT MAX(CDSITUTRIB)
            INTO V_CSTITEM
            FROM CODSITUTRIB C, PRODUTO P
            WHERE	(C.IDENTSAICST = 'S')                 AND
                  (C.CDEMPRESA   = P_CDEMPRESA)         AND
                  (C.CDTIPOOPER  = P_CDOPERACAO)        AND
                  (C.CDINSCESTA  = RTRIM(P_CDINSCESTA)) AND
                  (C.CDGRUPOFISC = V_CDGRUPOFISC)       AND
                  (C.CDPRODUTO   = P.CDPRODUTO(+))      AND
                  (P.CDARVPROD   = V_CDARVPROD);
         ELSIF (V_CDARVPROD IS NULL) THEN
            SELECT MAX(CDSITUTRIB)
            INTO V_CSTITEM
            FROM CODSITUTRIB C
            WHERE	(C.IDENTSAICST = 'S')                 AND
                  (C.CDEMPRESA   = P_CDEMPRESA)         AND
                  (C.CDTIPOOPER  = P_CDOPERACAO)        AND
                  (C.CDINSCESTA  = RTRIM(P_CDINSCESTA)) AND
                  (C.CDGRUPOFISC = V_CDGRUPOFISC)       AND
                  (C.CDPRODUTO IS NULL);
         END IF;
      ELSE
         SELECT MAX(P.CDARVPROD), COUNT(*)
         INTO V_CDARVPROD, V_CONTADOR
         FROM CODSITUTRIB C, PRODUTO P
         WHERE (IDENTSAICST = 'S')                  AND
               (CDEMPRESA   = P_CDEMPRESA)          AND
               (CDTIPOOPER  = P_CDOPERACAO)         AND
               (CDINSCESTA  = RTRIM(P_CDINSCESTA))  AND
               (CDGRUPOFISC IS NULL)                AND
               (C.CDPRODUTO = P.CDPRODUTO)          AND
               (INSTR(P_CDARVPROD,NVL(RTRIM(P.CDARVPROD),P_CDARVPROD)) = 1);

         IF NOT(V_CDARVPROD IS NULL) THEN
            SELECT MAX(CDSITUTRIB)
            INTO V_CSTITEM
            FROM CODSITUTRIB C, PRODUTO P
            WHERE	(C.IDENTSAICST = 'S')                  AND
                  (C.CDEMPRESA   = P_CDEMPRESA)          AND
                  (C.CDTIPOOPER  = P_CDOPERACAO)         AND
                  (C.CDINSCESTA  = RTRIM(P_CDINSCESTA))  AND
                  (C.CDGRUPOFISC IS NULL)                AND
                  (C.CDPRODUTO   = P.CDPRODUTO(+))       AND
                  (P.CDARVPROD   = V_CDARVPROD);

         ELSIF (V_CDARVPROD IS NULL) THEN
            SELECT MAX(CDSITUTRIB)
            INTO V_CSTITEM
            FROM CODSITUTRIB C
            WHERE	(C.IDENTSAICST = 'S')                 AND
                  (C.CDEMPRESA   = P_CDEMPRESA)         AND
                  (C.CDTIPOOPER  = P_CDOPERACAO)        AND
                  (C.CDINSCESTA  = RTRIM(P_CDINSCESTA)) AND
                  (C.CDGRUPOFISC IS NULL)               AND
                  (C.CDPRODUTO IS NULL);
         END IF;
      END IF;

      IF (V_CSTITEM IS NOT NULL) THEN
         V_CSTITEM := V_CST1DIGT||V_CSTITEM;
      END IF;
   END IF;
   RETURN (V_CSTITEM);
END;
/