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
           (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, 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;
/
