CREATE OR REPLACE PROCEDURE CONSULTA_CSOSN(
	P_ENTSAICSOSN     IN CODFISCOPER.IDENTSAICFOP%TYPE,
	P_EMPRESA         IN CODFISCOPER.CDEMPRESA%TYPE,
	P_CDARVPROD       IN PRODUTO.CDARVPROD%TYPE,
	P_INSCESTA        IN CODFISCOPER.CDINSCESTA%TYPE,
  	P_TIPOOPER        IN CODFISCOPER.CDTIPOOPER%TYPE,
   P_FILIAL          IN VARCHAR2,
   P_LANCTONF        IN VARCHAR2,
   P_CDGRUPOFISC     IN CODFISCOPER.CDGRUPOFISC%TYPE,
   P_IDCSOSNINTEREST IN CODSITUTRIB.IDCSTINTEREST%TYPE,
   P_CDFISCOPERSN  OUT NoCopy VARCHAR2)
IS
   V_CDARVPROD     VARCHAR2(20);
   V_CONTADOR      NUMBER;
   V_IDINTEREST    VARCHAR2(01);
   V_ORIGDESTOP    VARCHAR2(01);
   V_EMPRESA       VARCHAR2(02);
   V_INSCESTA      VARCHAR2(16);
   V_CDFILIRECE    VARCHAR2(04);
   V_CDFISCOPERSN  VARCHAR2(03);
   V_CDCSTDIG1PROD VARCHAR2(01);
   V_IDORIGDESTOP  VARCHAR2(01);
   V_RESULT        VARCHAR2(03);
   V_IDCRTCSOSN    VARCHAR2(01);
   V_CDSITUCRT     VARCHAR2(01);
BEGIN
   V_CONTADOR   := 0;
   V_RESULT := 'X';

----------------------------------------------------------------
/*BLOCO VERIFICA O PRIMEIRO DIGITO DO CSOSN*/
----------------------------------------------------------------
   IF P_ENTSAICSOSN = 'E' THEN /*OPERACOES DE ENTRADA*/
      Begin
         /*Verifica o 1 digito no cadastro do produto*/
         SELECT MAX(CDCSTDIG1PROD)
         INTO V_CDCSTDIG1PROD
         FROM PRODUTO
         WHERE (CDARVPROD = P_CDARVPROD);
      Exception
         When No_Data_Found Then
            V_CDCSTDIG1PROD := NULL;
      End;

      Begin
         /*Se no cadastro do produto for vazio verifica se o destino da nota e cliente/fornecedor/filial*/
         IF V_CDCSTDIG1PROD IS NULL THEN
            SELECT MAX(IDORIGDESTOP)
            INTO V_IDORIGDESTOP
            FROM TIPOOPERAC
            WHERE CDTIPOOPER   = P_TIPOOPER AND
                  IDENTRSAIDOP = P_ENTSAICSOSN;
         END IF;
      Exception
         When No_Data_Found Then
            V_IDORIGDESTOP := NULL;
      End;

      IF V_IDORIGDESTOP = 'C' THEN /*Quando o destino da nota for um cliente*/
         Begin
            SELECT MAX(CDCSTDIG1CLI)
            INTO V_CDCSTDIG1PROD
            FROM CLIENTE C, NOTAFISCAL N
            WHERE C.CDCLIENTE  = N.CDCLIENTE AND
                  N.CDFILIAL   = P_FILIAL    AND
                  N.NRLANCTONF = P_LANCTONF;
         Exception
            When No_Data_Found Then
               V_CDCSTDIG1PROD := NULL;
         End;
      ELSIF V_IDORIGDESTOP = 'F' THEN /*Quando o destino da nota for um fornecedor*/
         Begin
            SELECT MAX(CDCSTDIG1ENT)
            INTO V_CDCSTDIG1PROD
            FROM FORNECEDOR F, NOTAFISCAL N
            WHERE F.CDFORNECED = N.CDFORNECED AND
                  N.CDFILIAL   = P_FILIAL AND
                  N.NRLANCTONF = P_LANCTONF;
         Exception
            When No_Data_Found Then
               V_CDCSTDIG1PROD := NULL;
         End;
      ELSE /*Quando o destino da nota for uma filial*/
         Begin
            SELECT MAX(CDEMPRESA), MAX(CDINSCESTA)
            INTO   V_EMPRESA, V_INSCESTA
            FROM FILIAL
            WHERE CDFILIAL IN (SELECT MAX(CDFILIRECE)
                               FROM NOTAFISCAL
                               WHERE CDFILIAL   = P_FILIAL   AND
                                     NRLANCTONF = P_LANCTONF);
         Exception
            When No_Data_Found Then
               V_EMPRESA  := NULL;
               V_INSCESTA := NULL;
         End;

         Begin
            SELECT MAX(CDCSTDIG1SAI)
            INTO V_CDCSTDIG1PROD
            FROM INSCRESTAD
            WHERE CDEMPRESA  = V_EMPRESA AND
                  CDINSCESTA = V_INSCESTA;
         Exception
            When No_Data_Found Then
               V_CDCSTDIG1PROD := NULL;
         End;
      END IF;
   ELSE /*OPERACOES DE SAIDA*/
      Begin
      /*Gera o primeiro digito como CRT 1 ou 2*/
         SELECT MAX(IDGERACRTCSOSN), 
		        MAX(CDSITUCRT)
           INTO V_IDCRTCSOSN, V_CDSITUCRT
           FROM PARAMEMPRESA
          WHERE (CDEMPRESA = P_EMPRESA);

         IF V_IDCRTCSOSN = 'S' THEN
            IF V_CDSITUCRT <> '3' THEN
               V_CDCSTDIG1PROD :=  V_CDSITUCRT;
            END IF;
         ELSE
         /*Verifica o 1 digito no cadastro do produto*/		 
            SELECT MAX(CDCSTDIG1PROD)
              INTO V_CDCSTDIG1PROD
              FROM PRODUTO
             WHERE (CDARVPROD = P_CDARVPROD);

            IF V_CDCSTDIG1PROD IS NULL THEN
               SELECT MAX(CDCSTDIG1SAI)
                 INTO   V_CDCSTDIG1PROD
                 FROM INSCRESTAD
                WHERE (CDEMPRESA  = P_EMPRESA) AND
                      (CDINSCESTA = P_INSCESTA);
            END IF;
         END IF;
      Exception
         When No_Data_Found Then
            V_CDCSTDIG1PROD := NULL;
      End;
   END IF;
----------------------------------------------------------------
/*FIM DO BLOCO QUE VERIFICA O PRIMEIRO DIGITO DO CSOSN*/
----------------------------------------------------------------

   IF P_IDCSOSNINTEREST = 'S' THEN
      IF P_CDGRUPOFISC IS NOT NULL THEN
         IF P_CDARVPROD IS NOT NULL THEN
            SELECT MAX(P.CDARVPROD), COUNT(*)
            INTO V_CDARVPROD, V_CONTADOR
            FROM CODFISCOPERSN C, PRODUTO P
            WHERE (IDENTSAICSOSN = P_ENTSAICSOSN)    AND
                  (CDEMPRESA    = P_EMPRESA)       AND
                  (CDTIPOOPER   = P_TIPOOPER)      AND
                  (CDINSCESTA   = P_INSCESTA)      AND
                  (CDGRUPOFISC  = P_CDGRUPOFISC)   AND
                  (IDCSOSNINTEREST = 'S')           AND
                  (C.CDPRODUTO  = P.CDPRODUTO(+))  AND
                  (INSTR(P_CDARVPROD,NVL(RTRIM(P.CDARVPROD),P_CDARVPROD)) = 1);
         ELSE
            SELECT MAX(C.CDPRODUTO), COUNT(*)
            INTO V_CDARVPROD, V_CONTADOR
            FROM CODFISCOPERSN C
            WHERE (IDENTSAICSOSN = P_ENTSAICSOSN)    AND
                  (CDEMPRESA    = P_EMPRESA)       AND
                  (CDTIPOOPER   = P_TIPOOPER)      AND
                  (CDINSCESTA   = P_INSCESTA)      AND
                  (CDGRUPOFISC  = P_CDGRUPOFISC)   AND
                  (IDCSOSNINTEREST = 'S')           AND
                  (CDPRODUTO   IS NULL);
         END IF;
      END IF;

      IF V_CONTADOR > 0 THEN
         IF NOT (V_CDARVPROD IS NULL) THEN
            SELECT NVL(MAX(CDFISCOPERSN), 'X')
              INTO V_CDFISCOPERSN
              FROM CODFISCOPERSN C, PRODUTO P
             WHERE (C.IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (C.CDEMPRESA    = P_EMPRESA)
               AND (C.CDTIPOOPER   = P_TIPOOPER)
               AND (C.CDINSCESTA   = P_INSCESTA)
               AND (C.CDGRUPOFISC  = P_CDGRUPOFISC)
               AND (IDCSOSNINTEREST = 'S')
               AND (C.CDPRODUTO    = P.CDPRODUTO(+))
               AND (P.CDARVPROD    = V_CDARVPROD);

            V_RESULT := V_CDFISCOPERSN;
         ELSIF (V_CDARVPROD IS NULL) THEN
            SELECT NVL(MAX(CDFISCOPERSN), 'X')
              INTO V_CDFISCOPERSN
              FROM CODFISCOPERSN C
             WHERE (C.IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (C.CDEMPRESA    = P_EMPRESA)
               AND (C.CDTIPOOPER   = P_TIPOOPER)
               AND (C.CDINSCESTA   = P_INSCESTA)
               AND (C.CDGRUPOFISC  = P_CDGRUPOFISC)
               AND (IDCSOSNINTEREST = 'S')
               AND (C.CDPRODUTO IS NULL);

            V_RESULT := V_CDFISCOPERSN;
         END IF;
      ELSE
         IF P_CDARVPROD IS NOT NULL THEN
            SELECT MAX(P.CDARVPROD)
              INTO V_CDARVPROD
              FROM CODFISCOPERSN C, PRODUTO P
            WHERE (IDENTSAICSOSN = P_ENTSAICSOSN)
              AND (CDEMPRESA    = P_EMPRESA)
              AND (CDTIPOOPER   = P_TIPOOPER)
              AND (CDINSCESTA   = P_INSCESTA)
              AND (CDGRUPOFISC IS NULL)
              AND (IDCSOSNINTEREST = 'S')
              AND (C.CDPRODUTO  = P.CDPRODUTO(+))
              AND (INSTR(P_CDARVPROD,NVL(RTRIM(P.CDARVPROD),P_CDARVPROD)) = 1);
         ELSE
            SELECT MAX(C.CDPRODUTO)
              INTO V_CDARVPROD
              FROM CODFISCOPERSN C
             WHERE (IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDTIPOOPER   = P_TIPOOPER)
               AND (CDINSCESTA   = P_INSCESTA)
               AND (CDGRUPOFISC IS NULL)
               AND (IDCSOSNINTEREST = 'S')
               AND (CDPRODUTO IS NULL);
         END IF;

         IF NOT (V_CDARVPROD IS NULL) THEN
            SELECT NVL(MAX(CDFISCOPERSN), 'X')
              INTO V_CDFISCOPERSN
              FROM CODFISCOPERSN C, PRODUTO P
             WHERE (C.IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (C.CDEMPRESA    = P_EMPRESA)
               AND (C.CDTIPOOPER   = P_TIPOOPER)
               AND (C.CDINSCESTA   = P_INSCESTA)
               AND (C.CDGRUPOFISC IS NULL)
               AND (IDCSOSNINTEREST = 'S')
               AND (C.CDPRODUTO    = P.CDPRODUTO(+))
               AND (P.CDARVPROD    = V_CDARVPROD);

            V_RESULT := V_CDFISCOPERSN;
         ELSIF (V_CDARVPROD IS NULL) THEN
            SELECT NVL(MAX(CDFISCOPERSN), 'X')
              INTO V_CDFISCOPERSN
              FROM CODFISCOPERSN C
             WHERE (C.IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (C.CDEMPRESA    = P_EMPRESA)
               AND (C.CDTIPOOPER   = P_TIPOOPER)
               AND (C.CDINSCESTA   = P_INSCESTA)
               AND (C.CDGRUPOFISC IS NULL)
               AND (IDCSOSNINTEREST = 'S')
               AND (C.CDPRODUTO IS NULL);
            V_RESULT := V_CDFISCOPERSN;
         END IF;
      END IF;
   END IF;

   IF V_RESULT = 'X' THEN

      IF P_CDGRUPOFISC IS NOT NULL THEN
         IF P_CDARVPROD IS NOT NULL THEN
            SELECT MAX(P.CDARVPROD), COUNT(*)
              INTO V_CDARVPROD, V_CONTADOR
              FROM CODFISCOPERSN C, PRODUTO P
             WHERE (IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDTIPOOPER   = P_TIPOOPER)
               AND (CDINSCESTA   = P_INSCESTA)
               AND (CDGRUPOFISC  = P_CDGRUPOFISC)
               AND (IDCSOSNINTEREST = 'N')
               AND (C.CDPRODUTO  = P.CDPRODUTO(+))
               AND (INSTR(P_CDARVPROD,NVL(RTRIM(P.CDARVPROD),P_CDARVPROD)) = 1);
         ELSE
            SELECT MAX(C.CDPRODUTO), COUNT(*)
              INTO V_CDARVPROD, V_CONTADOR
              FROM CODFISCOPERSN C
             WHERE (IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDTIPOOPER   = P_TIPOOPER)
               AND (CDINSCESTA   = P_INSCESTA)
               AND (CDGRUPOFISC  = P_CDGRUPOFISC)
               AND (IDCSOSNINTEREST = 'N')
               AND (CDPRODUTO  IS NULL);
         END IF;
         IF V_CONTADOR > 0 THEN
            IF NOT (V_CDARVPROD IS NULL) THEN
               SELECT MAX(CDFISCOPERSN)
                 INTO V_CDFISCOPERSN
                 FROM CODFISCOPERSN C, PRODUTO P
                WHERE (C.IDENTSAICSOSN = P_ENTSAICSOSN)
                  AND (C.CDEMPRESA    = P_EMPRESA)
                  AND (C.CDTIPOOPER   = P_TIPOOPER)
                  AND (C.CDINSCESTA   = P_INSCESTA)
                  AND (C.CDGRUPOFISC  = P_CDGRUPOFISC)
                  AND (IDCSOSNINTEREST = 'N')
                  AND (C.CDPRODUTO    = P.CDPRODUTO(+))
                  AND (P.CDARVPROD    = V_CDARVPROD);

               V_RESULT := V_CDFISCOPERSN;
            ELSIF (V_CDARVPROD IS NULL) THEN
               SELECT MAX(CDFISCOPERSN)
                 INTO V_CDFISCOPERSN
                 FROM CODFISCOPERSN C
                WHERE (C.IDENTSAICSOSN = P_ENTSAICSOSN)
                  AND (C.CDEMPRESA    = P_EMPRESA)
                  AND (C.CDTIPOOPER   = P_TIPOOPER)
                  AND (C.CDINSCESTA   = P_INSCESTA)
                  AND (C.CDGRUPOFISC  = P_CDGRUPOFISC)
                  AND (IDCSOSNINTEREST = 'N')
                  AND (C.CDPRODUTO IS NULL);

               V_RESULT := V_CDFISCOPERSN;
            END IF;
         END IF;
      ELSE
         IF P_CDARVPROD IS NOT NULL THEN
            SELECT MAX(P.CDARVPROD)
              INTO V_CDARVPROD
              FROM CODFISCOPERSN C, PRODUTO P
            WHERE (IDENTSAICSOSN = P_ENTSAICSOSN)
              AND (CDEMPRESA    = P_EMPRESA)
              AND (CDTIPOOPER   = P_TIPOOPER)
              AND (CDINSCESTA   = P_INSCESTA)
              AND (CDGRUPOFISC IS NULL)
              AND (IDCSOSNINTEREST = 'N')
              AND (C.CDPRODUTO  = P.CDPRODUTO(+))
              AND (INSTR(P_CDARVPROD,NVL(RTRIM(P.CDARVPROD),P_CDARVPROD)) = 1);
         ELSE
            SELECT MAX(C.CDPRODUTO)
              INTO V_CDARVPROD
              FROM CODFISCOPERSN C
             WHERE (IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDTIPOOPER   = P_TIPOOPER)
               AND (CDINSCESTA   = P_INSCESTA)
               AND (CDGRUPOFISC IS NULL)
               AND (IDCSOSNINTEREST = 'N')
               AND (C.CDPRODUTO  IS NULL);
         END IF;

         IF NOT (V_CDARVPROD IS NULL) THEN
            SELECT MAX(CDFISCOPERSN)
              INTO V_CDFISCOPERSN
              FROM CODFISCOPERSN C, PRODUTO P
             WHERE (C.IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (C.CDEMPRESA    = P_EMPRESA)
               AND (C.CDTIPOOPER   = P_TIPOOPER)
               AND (C.CDINSCESTA   = P_INSCESTA)
               AND (C.CDGRUPOFISC IS NULL)
               AND (IDCSOSNINTEREST = 'N')
               AND (C.CDPRODUTO    = P.CDPRODUTO(+))
               AND (P.CDARVPROD    = V_CDARVPROD);

            V_RESULT := V_CDFISCOPERSN;
         ELSIF (V_CDARVPROD IS NULL) THEN
            SELECT MAX(CDFISCOPERSN)
              INTO V_CDFISCOPERSN
              FROM CODFISCOPERSN C
             WHERE (C.IDENTSAICSOSN = P_ENTSAICSOSN)
               AND (C.CDEMPRESA    = P_EMPRESA)
               AND (C.CDTIPOOPER   = P_TIPOOPER)
               AND (C.CDINSCESTA   = P_INSCESTA)
               AND (C.CDGRUPOFISC IS NULL)
               AND (IDCSOSNINTEREST = 'N')
               AND (C.CDPRODUTO IS NULL);
            V_RESULT := V_CDFISCOPERSN;
         END IF;
      END IF;
   END IF;
   IF V_RESULT = 'X' THEN
      V_RESULT := '';
   END IF;
   P_CDFISCOPERSN := V_CDCSTDIG1PROD||V_RESULT;
END;
/