create or replace PROCEDURE CALCULA_CREDSTANT_RJ(
   P_CDEMPRESA      IN EMPRESA.CDEMPRESA%TYPE,
   P_CDINSCESTA     IN NOTAFISCAL.CDINSCESTA%TYPE,
   P_DTINICIAL      IN MAPAAPURAC.DTINIPERIODO%TYPE,
   P_DTFINAL        IN MAPAAPURAC.DTINIPERIODO%TYPE,
   P_NRSEQUMAPAPU   IN MAPAAPURAC.NRSEQUMAPAPU%TYPE,
   P_GERARELATORIO  IN VARCHAR2 DEFAULT 'N')
AS
   V_NF              VARCHAR2(14);
   V_NRSEQITMAPR     VARCHAR2(10);
   V_NRSEQDETITMAPA  NUMBER;
   V_SEQPROD           VARCHAR2(30);
   V_CDAJCREDSTRJ      VARCHAR2(10);
   V_DSAJCREDSTRJ      VARCHAR2(250);
   V_CDRATPADSTRJTPEN  VARCHAR2(4);
   V_CDRATPADSTRJFIL   VARCHAR2(4);
   V_CDRATPADSTRJCFOPE VARCHAR2(4);
   V_CDRATPADSTRJCFOPS VARCHAR2(4);
   V_CDRATPADSTRJNCMS  VARCHAR2(4);
BEGIN
    BEGIN
       SELECT CDAJCREDSTRJ, DSAJCREDSTRJ, CDRATPADSTRJTPEN, CDRATPADSTRJFIL, CDRATPADSTRJCFOPE, CDRATPADSTRJCFOPS, CDRATPADSTRJNCMS
        INTO V_CDAJCREDSTRJ, V_DSAJCREDSTRJ, V_CDRATPADSTRJTPEN, V_CDRATPADSTRJFIL, V_CDRATPADSTRJCFOPE, V_CDRATPADSTRJCFOPS, V_CDRATPADSTRJNCMS
        FROM PARAMESTSPED
       WHERE CDEMPRESA = P_CDEMPRESA
         AND CDINSCESTA = P_CDINSCESTA;
    EXCEPTION
         WHEN NO_DATA_FOUND THEN
           V_CDAJCREDSTRJ      := NULL;
           V_DSAJCREDSTRJ      := NULL;
           V_CDRATPADSTRJTPEN  := NULL;
           V_CDRATPADSTRJFIL   := NULL;
           V_CDRATPADSTRJCFOPE := NULL;
           V_CDRATPADSTRJCFOPS := NULL;
           V_CDRATPADSTRJNCMS  := NULL;
    END;

   /*Apaga os dados gerados em outras apurações*/
   DELETE FROM ITMAPARECUP
    WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
      AND IDTIPOITMAPR = 'OC'
      AND DSITEMMAPR = V_DSAJCREDSTRJ;

   /*Grava as entradas/saidas de referencia para calculo dos valores de creditos a serem aproveitados no periodo*/
   ENTSAI_CREDANTST_RJ(P_DTINICIAL, P_DTFINAL, V_CDRATPADSTRJFIL, V_CDRATPADSTRJCFOPE, V_CDRATPADSTRJTPEN, V_CDRATPADSTRJNCMS, V_CDRATPADSTRJCFOPS);

   /*Atualiza a tabela com os filtros a serem usados na apuração, apenas produtos que entraram com CFOP 1403 ou 2403 e
     tiveram saídas no período atual, */
   DELETE TMP_CREDSTRJ;

   INSERT INTO TMP_CREDSTRJ (NUMSEQ,
               NCM,
               SUBFAMILIA,
               PRODUTO,
               DESCR_PRODUTO,
               INSCRICAO,
               CNPJ,
               RAZAO_SOCIAL,
               NUMERO_NF,
               SERIE,
               MODELO,
               CHAVE,
               EMISSAO,
               ENTRADA,
               FILIAL_RECE,
               NOME_FILIAL,
               TIPO,
               OPERACAO,
               DESCR_OPERACAO,
               ESTADO,
               QTDE,
               VALOR_CONTABIL,
               BASE,
               IMPOSTO,
               ALIQUOTA,
               CFOP,
               CST,
               SALDO,
               SAIDA_FILIAL,
               SAIDA_NOME_FILIAL,
               SAIDA_NUMERO_NF,
               SAIDA_EMISSAO,
               SAIDA_ESTADO,
               SAIDA_CHAVE,
               SAIDA_VALOR_NF,
               SAIDA_QTDE_ORIGINAL,
               SAIDA_QTDE,
               SAIDA_CFOP,
               SAIDA_VALOR_CONTABIL,
               SAIDA_BASE,
               SAIDA_IMPOSTO,
               SAIDA_BASE_ST,
               SAIDA_IMPOSTO_ST,
               CREDITO_ICMS_PROPRIO,
               CDPRODUTO, NRACESSONFE)
      (SELECT  NUMSEQ,
               NCM,
               SUBFAMILIA,
               PRODUTO,
               DESCR_PRODUTO,
               INSCRICAO,
               CNPJ,
               RAZAO_SOCIAL,
               NUMERO_NF,
               SERIE,
               MODELO,
               CHAVE,
               EMISSAO,
               ENTRADA,
               FILIAL_RECE,
               NOME_FILIAL,
               TIPO,
               OPERACAO,
               DESCR_OPERACAO,
               ESTADO,
               QTDE,
               VALOR_CONTABIL,
               BASE,
               IMPOSTO,
               ALIQUOTA,
               CFOP,
               CST,
               SALDO,
               SAIDA_FILIAL,
               SAIDA_NOME_FILIAL,
               SAIDA_NUMERO_NF,
               SAIDA_EMISSAO,
               SAIDA_ESTADO,
               SAIDA_CHAVE,
               SAIDA_VALOR_NF,
               SAIDA_QTDE_ORIGINAL,
               SAIDA_QTDE,
               SAIDA_CFOP,
               SAIDA_VALOR_CONTABIL,
               SAIDA_BASE,
               SAIDA_IMPOSTO,
               SAIDA_BASE_ST,
               SAIDA_IMPOSTO_ST,
               CREDITO_ICMS_PROPRIO,
               P.CDPRODUTO,
               SUBSTR(T.SAIDA_CHAVE,2,44)
         FROM TMP_CREDSTRJ_RESUL T, PRODUTO P,
              (SELECT CDCFOPPADRAO
                 FROM RATFISCFOPPADRAO
                WHERE IDENTRSAIDOP = 'E'
                  AND CDRATEIOPADRAO = V_CDRATPADSTRJCFOPE) CFOPE
        WHERE T.CFOP      = CFOPE.CDCFOPPADRAO
          AND T.PRODUTO   = P.CDARVPROD
          AND P.CDPRODUTO IN (SELECT T.CDPRODUTO
                                FROM ITEMPRODUTO T, ITEMPROIMPOS P,  NOTAFISCAL N,
                                     (SELECT DISTINCT CDFILIAL, NRLANCTONF
                                        FROM IMPOSTONF
                                       WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU) I
                               WHERE T.CDFILIAL     = N.CDFILIAL
                                 AND T.NRLANCTONF   = N.NRLANCTONF
                                 AND I.CDFILIAL     = N.CDFILIAL
                                 AND I.NRLANCTONF   = N.NRLANCTONF
                                 AND N.IDENTRSAIDOP = 'S'
                                 AND T.CDFILIAL     = P.CDFILIAL
                                 AND T.NRLANCTONF   = P.NRLANCTONF
                                 AND T.NRSEQITPROD  = P.NRSEQITPROD
                                 AND P.CDFISCOPERIT NOT IN (SELECT CDCFOPPADRAO
                                                              FROM RATFISCFOPPADRAO
                                                             WHERE IDENTRSAIDOP = 'S'
                                                               AND CDRATEIOPADRAO = V_CDRATPADSTRJCFOPS)));

   V_NF      := NULL;
   V_SEQPROD := NULL;
   /*Busca o maior sequencial de ajuste, para evitar problemas com chave da tabela*/
   BEGIN
      SELECT MAX(NRSEQITMAPR)
	     INTO V_NRSEQITMAPR
		  FROM ITMAPARECUP
       WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
	      AND IDTIPOITMAPR = 'OC';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
	      V_NRSEQITMAPR := NULL;
   END;

   IF P_GERARELATORIO = 'N' THEN
      FOR C_AJ IN (SELECT PRODUTO, NUMERO_NF, QTDE, BASE, (BASE * ALIQUOTA / 100) AS IMPOSTO, ALIQUOTA,
                          SAIDA_NUMERO_NF, ROUND(((BASE * ALIQUOTA / 100) /QTDE) * SAIDA_QTDE,2) AS CREDITO,
                          CST, SAIDA_QTDE, CDFILIAL, NRLANCTONF, NRSEQITPROD
                     FROM (SELECT T.PRODUTO,  T.NUMERO_NF,  T.QTDE, T.BASE, T.IMPOSTO, T.CST, T.SAIDA_NUMERO_NF,
                                  CASE WHEN SUBSTR(T.CST,1,1) = 2  THEN 4
                                       ELSE 12 END AS ALIQUOTA,
                          (T.IMPOSTO/T.QTDE*T.SAIDA_QTDE) AS CREDITO_ICMS_PROPRIO , N.CDFILIAL, N.NRLANCTONF, I.NRSEQITPROD,
                          T.SAIDA_QTDE AS SAIDA_QTDE
                     FROM TMP_CREDSTRJ T, NOTAFISCAL N, ITEMPRODUTO I
                    WHERE T.NRACESSONFE  = N.NRACESSONFE
                      AND N.IDENTRSAIDOP = 'S'
                      AND N.CDFILIAL     = I.CDFILIAL
                      AND N.NRLANCTONF   = I.NRLANCTONF
                      AND I.CDPRODUTO    = T.CDPRODUTO)
                    ORDER BY CDFILIAL, NRLANCTONF, NRSEQITPROD) LOOP

         IF (V_NF IS NULL) OR (V_NF <> C_AJ.CDFILIAL||C_AJ.NRLANCTONF) THEN
            V_NRSEQITMAPR := LPAD(TO_NUMBER(NVL(V_NRSEQITMAPR,0)) + 1,10,'0');
             INSERT INTO ITMAPARECUP
               (NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR, DSITEMMAPR, VRITEMMAPR,
                NRLANCTONF, CDFILIAL, CDAJUSTEITMAPA, IDCOMPOEC197)
            VALUES
               (P_NRSEQUMAPAPU, 'OC', V_NRSEQITMAPR, V_DSAJCREDSTRJ, C_AJ.CREDITO,
                C_AJ.NRLANCTONF, C_AJ.CDFILIAL, V_CDAJCREDSTRJ, 'I');
            V_NF := C_AJ.CDFILIAL||C_AJ.NRLANCTONF;
         ELSE
            UPDATE ITMAPARECUP
               SET VRITEMMAPR = NVL(VRITEMMAPR,0) + C_AJ.CREDITO
             WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
               AND IDTIPOITMAPR = 'OC'
               AND NRSEQITMAPR  = V_NRSEQITMAPR;
         END IF;
         IF (V_SEQPROD IS NULL) OR (V_SEQPROD <> C_AJ.CDFILIAL||C_AJ.NRLANCTONF||C_AJ.NRSEQITPROD) THEN
            NOVO_CODIGO('DETITMAPARECUP',V_NRSEQDETITMAPA);
            INSERT INTO DETITMAPARECUP
              (NRSEQDETITMAPA, NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR, CDFILIAL, NRLANCTONF, NRSEQITPROD, NRITPROIMPOS, CDIMPOSTO,  VRIMPOSTOIT, IDSUBSTSOLIDST)
            VALUES
              (V_NRSEQDETITMAPA, P_NRSEQUMAPAPU, 'OC', V_NRSEQITMAPR,  C_AJ.CDFILIAL,C_AJ.NRLANCTONF, C_AJ.NRSEQITPROD, '1', '00', C_AJ.CREDITO, 'S');
            V_SEQPROD := C_AJ.CDFILIAL||C_AJ.NRLANCTONF||C_AJ.NRSEQITPROD;
         ELSE
           UPDATE DETITMAPARECUP
              SET VRIMPOSTOIT    = NVL(VRIMPOSTOIT,0) + C_AJ.CREDITO
            WHERE NRSEQDETITMAPA = V_NRSEQDETITMAPA
              AND NRSEQUMAPAPU   = P_NRSEQUMAPAPU;
         END IF;
      END LOOP;
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CALCULA_CREDSTANT_RJ','6.45.024'); END;
/
