DROP TABLE TMP_CREDSTRJ
/

DROP TABLE TMP_CREDSTRJ_SAIDA
/

DROP TABLE TMP_CREDSTRJ_ENTRADA
/

DROP TABLE TMP_CREDSTRJ_RESUL
/

CREATE GLOBAL TEMPORARY TABLE TMP_CREDSTRJ
 (
    NUMSEQ                       NUMBER,
	 NCM                          VARCHAR2(9),
	 SUBFAMILIA                   VARCHAR2(100),
	 PRODUTO                      VARCHAR2(20),
	 DESCR_PRODUTO                VARCHAR2(400),
	 INSCRICAO                    VARCHAR2(17),
	 CNPJ                         VARCHAR2(21),
	 RAZAO_SOCIAL                 VARCHAR2(100),
	 NUMERO_NF                    VARCHAR2(10),
	 SERIE                        VARCHAR2(5),
	 MODELO                       VARCHAR2(2),
	 CHAVE                        VARCHAR2(51),
	 EMISSAO                      DATE,
	 ENTRADA                      DATE,
	 FILIAL_RECE                  VARCHAR2(4),
	 NOME_FILIAL                  VARCHAR2(30),
	 TIPO                         VARCHAR2(1),
	 OPERACAO                     VARCHAR2(2),
	 DESCR_OPERACAO               VARCHAR2(30),
	 ESTADO                       VARCHAR2(2),
	 QTDE                         FLOAT,
	 VALOR_CONTABIL               FLOAT,
	 BASE                         FLOAT,
	 IMPOSTO                      FLOAT,
	 ALIQUOTA                     FLOAT,
	 CFOP                         VARCHAR2(11),
	 CST                          VARCHAR2(3),
	 SALDO                        FLOAT,
  	 SAIDA_FILIAL                 VARCHAR2(4),
    SAIDA_NOME_FILIAL            VARCHAR2(30),
	 SAIDA_NUMERO_NF              VARCHAR2(10),
	 SAIDA_EMISSAO                DATE,
	 SAIDA_ESTADO                 VARCHAR2(2),
	 SAIDA_CHAVE                  VARCHAR2(51),
	 SAIDA_VALOR_NF               FLOAT,
	 SAIDA_QTDE_ORIGINAL          FLOAT,
	 SAIDA_QTDE                   FLOAT,
	 SAIDA_CFOP                   VARCHAR2(11),
	 SAIDA_VALOR_CONTABIL         FLOAT,
	 SAIDA_BASE                   FLOAT,
	 SAIDA_IMPOSTO                FLOAT,
	 SAIDA_BASE_ST                FLOAT,
	 SAIDA_IMPOSTO_ST             FLOAT,
	 CREDITO_ICMS_PROPRIO         FLOAT,
	 CDPRODUTO                    VARCHAR2(10),
	 NRACESSONFE                  VARCHAR2(44),
    CONSTRAINT PK_TMP_CREDSTRJ PRIMARY KEY (NUMSEQ)
) ON COMMIT PRESERVE ROWS
/


CREATE GLOBAL TEMPORARY TABLE TMP_CREDSTRJ_SAIDA
(
   CONSIDERA                 VARCHAR2(1),
   INSCR_ESTADUAL            VARCHAR2(17), 
   FILIAL_EMITENTE           VARCHAR2(4),
   FILIAL_DESTINO            VARCHAR2(4),
   NOME_FILIAL               VARCHAR2(30),
   ESTADO                    VARCHAR2(2),
   NUM_NOTA                  VARCHAR2(20), 
   CNPJ                      VARCHAR2(21), 
   EMISSAO                   DATE,
   DATA_SAIDA                DATE,
   TIPO_OPERACAO             VARCHAR2(1),
   OPERACAO                  VARCHAR2(2),
   DESCR_OPERACAO            VARCHAR2(30), 
   IMPOSTO                   VARCHAR2(2),
   INCIDENCIA                VARCHAR2(1),
   CFOP                      VARCHAR2(11), 
   CST                       VARCHAR2(3),
   FAMILIA                   VARCHAR2(73),
   SUBFAMILIA                VARCHAR2(73), 
   PRODUTO                   VARCHAR2(20), 
   DESCRICAO                 VARCHAR2(50), 
   EMBALAGEM                 VARCHAR2(46), 
   QTDE                      FLOAT,
   VALOR_PRODUTO             FLOAT,
   BASE_CALCULO              NUMBER,
   VALOR_IMPOSTO             NUMBER,
   ALIQUOTA                  NUMBER,
   BASE_CALCULO_ST           NUMBER,
   VALOR_IMPOSTO_ST          NUMBER,
   ALIQUOTA_ST               NUMBER,
   VALOR_NF                  FLOAT,
   CHAVE_NFE                 VARCHAR2(51), 
   NCM                       VARCHAR2(9)
) ON COMMIT PRESERVE ROWS
/


CREATE GLOBAL TEMPORARY TABLE TMP_CREDSTRJ_ENTRADA
(
   CONSIDERA               VARCHAR2(1),
   INSCRICAO               VARCHAR2(17),
   CNPJ                    VARCHAR2(21),
   RAZAO_SOCIAL            VARCHAR2(100),
   ESTADO                  VARCHAR2(2),
   NUMERO_NF               VARCHAR2(10),
   EMISSAO                 DATE,
   SERIE                   VARCHAR2(5),
   MODELO                  VARCHAR2(2),
   ENTRADA                 DATE,
   FILIAL_RECE             VARCHAR2(4),
   NOME_FILIAL             VARCHAR2(30),
   TIPO                    VARCHAR2(1),
   OPERACAO                VARCHAR2(2),
   DESCR_OPERACAO          VARCHAR2(30),
   NCM                     VARCHAR2(9),
   PRODUTO                 VARCHAR2(10),
   DESCR_PRODUTO           VARCHAR2(400),
   QTDE                    FLOAT,
   VALOR_CONTABIL          FLOAT,
   BASE                    FLOAT,
   IMPOSTO                 FLOAT,
   ALIQUOTA                FLOAT,
   CFOP                    VARCHAR2(11),
   CST                     VARCHAR2(3),
   CHAVE                   VARCHAR2(51),
   SALDO_QTDE              FLOAT
) ON COMMIT PRESERVE ROWS
/


CREATE GLOBAL TEMPORARY TABLE TMP_CREDSTRJ_RESUL
(
   NUMSEQ                    NUMBER,
   NCM                       VARCHAR2(9),
   SUBFAMILIA                VARCHAR2(100),
   PRODUTO                   VARCHAR2(10),
   DESCR_PRODUTO             VARCHAR2(400),
   INSCRICAO                 VARCHAR2(17),
   CNPJ                      VARCHAR2(21),
   RAZAO_SOCIAL              VARCHAR2(100),
   NUMERO_NF                 VARCHAR2(10),
   SERIE                     VARCHAR2(5),
   MODELO                    VARCHAR2(2),
   CHAVE                     VARCHAR2(51),
   EMISSAO                   DATE,
   ENTRADA                   DATE,
   FILIAL_RECE               VARCHAR2(4),
   NOME_FILIAL               VARCHAR2(30),
   TIPO                      VARCHAR2(1),
   OPERACAO                  VARCHAR2(2),
   DESCR_OPERACAO            VARCHAR2(30),
   ESTADO                    VARCHAR2(2),
   QTDE                      FLOAT(126),
   VALOR_CONTABIL            FLOAT(126),
   BASE                      FLOAT(126),
   IMPOSTO                   FLOAT(126),
   ALIQUOTA                  FLOAT(126),
   CFOP                      VARCHAR2(11),
   CST                       VARCHAR2(3),
   SALDO                     FLOAT(126),
   SAIDA_FILIAL              VARCHAR2(4),
   SAIDA_NOME_FILIAL         VARCHAR2(30),
   SAIDA_NUMERO_NF           VARCHAR2(10),
   SAIDA_EMISSAO             DATE,
   SAIDA_ESTADO              VARCHAR2(2),
   SAIDA_CHAVE               VARCHAR2(51),
   SAIDA_VALOR_NF            FLOAT(126),
   SAIDA_QTDE_ORIGINAL       FLOAT(126),
   SAIDA_QTDE                FLOAT(126),
   SAIDA_CFOP                VARCHAR2(11),
   SAIDA_VALOR_CONTABIL      FLOAT(126),
   SAIDA_BASE                FLOAT(126),
   SAIDA_IMPOSTO             FLOAT(126),
   SAIDA_BASE_ST             FLOAT(126),
   SAIDA_IMPOSTO_ST          FLOAT(126),
   CREDITO_ICMS_PROPRIO      FLOAT(126),
   CONSTRAINT PK_TMP_CREDSTRJ_RESUL PRIMARY KEY (NUMSEQ)
) ON COMMIT PRESERVE ROWS
/   

CREATE OR REPLACE PROCEDURE RESUL_CREDANTST_RJ IS
   VREGISTRO NUMBER;
   VCONTA NUMBER;
   VQTDE FLOAT;
   VQTDESAIDA FLOAT;
   VSALDO FLOAT;
   VSOBRA FLOAT;
BEGIN

   DELETE TMP_CREDSTRJ_RESUL;

   UPDATE TMP_CREDSTRJ_ENTRADA
      SET SALDO_QTDE = QTDE;

   VREGISTRO := 0;
   FOR X IN ( SELECT *
                FROM TMP_CREDSTRJ_SAIDA
               WHERE INCIDENCIA = 1
            ORDER BY PRODUTO, EMISSAO, NUM_NOTA ) LOOP

       VQTDESAIDA := X.QTDE;

   <<VOLTA>>
       VCONTA := 0;

       FOR Y IN ( SELECT ROWID AS LINHA, R.*
                    FROM TMP_CREDSTRJ_ENTRADA R
                   WHERE PRODUTO = X.PRODUTO
                     AND SALDO_QTDE > 0
                ORDER BY EMISSAO DESC, NUMERO_NF) LOOP
                
           VCONTA := 1;

           IF VQTDESAIDA > Y.SALDO_QTDE THEN
               VQTDE := Y.SALDO_QTDE;
               VQTDESAIDA := VQTDESAIDA - Y.SALDO_QTDE;
               VSOBRA := 0;
           ELSE
               VQTDE := VQTDESAIDA;
               VQTDESAIDA := 0;
               VSOBRA := Y.SALDO_QTDE - VQTDE;
           END IF;

           VREGISTRO := VREGISTRO + 1;
           INSERT INTO TMP_CREDSTRJ_RESUL
           (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)
           VALUES(VREGISTRO, X.NCM, X.SUBFAMILIA, X.PRODUTO, X.DESCRICAO, Y.INSCRICAO, Y.CNPJ, Y.RAZAO_SOCIAL, Y.NUMERO_NF, Y.SERIE, Y.MODELO, Y.CHAVE, Y.EMISSAO, Y.ENTRADA,
                  Y.FILIAL_RECE, Y.NOME_FILIAL, Y.TIPO, Y.OPERACAO, Y.DESCR_OPERACAO, Y.ESTADO,Y.QTDE, Y.VALOR_CONTABIL, Y.BASE, Y.IMPOSTO, Y.ALIQUOTA, Y.CFOP, Y.CST, VSOBRA,
                  X.FILIAL_DESTINO, X.NOME_FILIAL,
                  X.NUM_NOTA, X.EMISSAO, X.ESTADO, X.CHAVE_NFE, X.VALOR_NF, X.QTDE, VQTDE, X.CFOP, X.VALOR_PRODUTO,
                  X.BASE_CALCULO, X.VALOR_IMPOSTO, X.BASE_CALCULO_ST, X.VALOR_IMPOSTO_ST, 0);

           UPDATE TMP_CREDSTRJ_ENTRADA
              SET SALDO_QTDE = VSOBRA
            WHERE ROWID = Y.LINHA;

           COMMIT;

           EXIT;

       END LOOP;
       
       IF VCONTA = 0 THEN 
           VREGISTRO := VREGISTRO + 1;
           INSERT INTO TMP_CREDSTRJ_RESUL
           VALUES(VREGISTRO, X.NCM, X.SUBFAMILIA, X.PRODUTO, X.DESCRICAO, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, --VSOBRA,
                  X.FILIAL_DESTINO, X.NOME_FILIAL,
                  X.NUM_NOTA, X.EMISSAO, X.ESTADO, X.CHAVE_NFE, X.VALOR_NF, X.QTDE, VQTDESAIDA, X.CFOP, X.VALOR_PRODUTO,
                  X.BASE_CALCULO, X.VALOR_IMPOSTO, X.BASE_CALCULO_ST, X.VALOR_IMPOSTO_ST, 0);
       END IF;

       IF VCONTA = 0 THEN
           GOTO PULA;
       END IF;

       IF VQTDESAIDA <> 0 THEN
           GOTO VOLTA;
       END IF;

   <<PULA>>
   VCONTA := 0;
   END LOOP;
END;
/

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