SET DEFINE OFF;

DROP TABLE MOORCAMENTOS_2202;
DROP TABLE MOPREDOCUMENTOS_2202;
DROP TABLE MODOCUMENTOSFISCAIS_2202;
DROP TABLE MODOCFISCALXNFREF_2202;
DROP TABLE CAPLACAS_2202;

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir
  IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MODOCFISCALXESTOQUE b ON b.idEstoque = a.idEstoque
    WHERE b.idItemDocFiscal = p_idItemDocFiscal
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = cab.estabelecimento AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23;
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (estoqueExcluir.idEstoque);
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idDocumentoFiscal            IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir
  IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MODOCFISCALXESTOQUE b ON b.idEstoque = a.idEstoque
    JOIN MODOCFISCALXITENS c ON c.idItemDocFiscal = b.idItemDocFiscal
    WHERE c.idDocumentoFiscal = p_idDocumentoFiscal
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = cab.estabelecimento AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal AND transfXDoc.entradaSaidaOriginal IN('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23;
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (estoqueExcluir.idEstoque);
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemPreDocumento           IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir
  IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MOPREDOCUMXESTOQUE b ON b.idEstoque = a.idEstoque
    WHERE b.idItemPreDocumento = p_idItemPreDocumento
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    SELECT
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = cab.estabelecimento AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento = 'A';
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (estoqueExcluir.idEstoque);
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_ITEM_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_preDocumento                 IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MOPREDOCUMXESTOQUE b ON b.idEstoque = a.idEstoque
    JOIN MOPREDOCUMXITENS c ON c.idItemPreDocumento = b.idItemPreDocumento
    WHERE c.preDocumento = p_preDocumento
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = cab.estabelecimento AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento = 'A';
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (estoqueExcluir.idEstoque);
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_ATUALIZ(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir
  IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MOSEPARACAOXESTOQUE b ON b.idEstoque = a.idEstoque
    WHERE b.idItemSeparacao = p_idItemSeparacao
    ORDER BY a.idEstoque;
  CURSOR c_item IS 
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemSeparacao,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEstS.indicadorPropriedadePosseItem locEst_indicProprPosseSaida,
      COALESCE (estXLocS.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderSaida,
      locEstE.indicadorPropriedadePosseItem locEst_indicProprPosseEntrada,
      COALESCE (estXLocE.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderEntrada
    FROM MOSEPARACAOXITENS item
    JOIN MOSEPARACOES cab ON cab.separacao = item.separacao
    JOIN PAETAPASSEPARACAO etap ON etap.etapaSeparacao = cab.etapaSeparacao
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEstS ON locEstS.localEstoque = item.localEstoqueSaida
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocS ON estXLocS.estabelecimento = cab.estabelecimento AND estXLocS.localEstoque = item.localEstoqueSaida
    JOIN PALOCAISESTOQUE locEstE ON locEstE.localEstoque = item.localEstoqueEntrada
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocE ON estXLocE.estabelecimento = cab.estabelecimento AND estXLocE.localEstoque = item.localEstoqueEntrada
    WHERE item.idItemSeparacao = p_idItemSeparacao
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND etap.situacaoSeparacao = 'F';    
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (estoqueExcluir.idEstoque);
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_SEPARACAO_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.idItemSeparacao,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseSaida,
      item.estXLoc_solicitaEnderSaida,
      item.locEst_indicProprPosseEntrada,
      item.estXLoc_solicitaEnderEntrada,
      v_bufferIdEstoque);
  END LOOP;
END ADD_SEPARACAO_ITEM_EST_ATUALIZ;

/

create or replace PROCEDURE ADD_SEPARACAO_CAB_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_separacao                    IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MOSEPARACAOXESTOQUE b ON b.idEstoque = a.idEstoque
    JOIN MOSEPARACAOXITENS c ON c.idItemSeparacao = b.idItemSeparacao
    WHERE c.separacao = p_separacao
    ORDER BY a.idEstoque;
  CURSOR c_item IS 
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemSeparacao,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEstS.indicadorPropriedadePosseItem locEst_indicProprPosseSaida,
      COALESCE (estXLocS.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderSaida,
      locEstE.indicadorPropriedadePosseItem locEst_indicProprPosseEntrada,
      COALESCE (estXLocE.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderEntrada
    FROM MOSEPARACAOXITENS item
    JOIN MOSEPARACOES cab ON cab.separacao = item.separacao
    JOIN PAETAPASSEPARACAO etap ON etap.etapaSeparacao = cab.etapaSeparacao
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEstS ON locEstS.localEstoque = item.localEstoqueSaida
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocS ON estXLocS.estabelecimento = cab.estabelecimento AND estXLocS.localEstoque = item.localEstoqueSaida
    JOIN PALOCAISESTOQUE locEstE ON locEstE.localEstoque = item.localEstoqueEntrada
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocE ON estXLocE.estabelecimento = cab.estabelecimento AND estXLocE.localEstoque = item.localEstoqueEntrada
    WHERE item.separacao = p_separacao
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND etap.situacaoSeparacao = 'F';
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (estoqueExcluir.idEstoque);
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_SEPARACAO_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.idItemSeparacao,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseSaida,
      item.estXLoc_solicitaEnderSaida,
      item.locEst_indicProprPosseEntrada,
      item.estXLoc_solicitaEnderEntrada,
      v_bufferIdEstoque);
  END LOOP;
END ADD_SEPARACAO_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_ITEM(
    p_bufferIdReservaEstoque       IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntrega              IN DATE,
    p_etOrc_situacaoOrcamento      IN NUMBER,
    p_item_idItemOrcamento         IN NUMBER,
    p_item_cancelado               IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_movimentaEstoque        IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidadeSaldo         IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    /* Retornos */
    r_bufferIdReservaEstoque       OUT VARCHAR2)

IS
  v_idReservaEstoque          NUMBER (14,0);  
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
  CURSOR c_resEstAnt
  IS 
    SELECT a.idReservaEstoque
    FROM MORESERVASESTOQUE a
    JOIN MOORCAMENTOXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
    WHERE b.idItemOrcamento = p_item_idItemOrcamento
    ORDER BY a.idReservaEstoque;
  CURSOR c_grade
  IS 
    SELECT
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntrega,
      a.localEstoque,
      a.quantidadeSaldo,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.indicadorPropriedadePosseItem,
      a.solicitaEnderecoEstoque
    FROM (
      SELECT
        CASE
          WHEN prod.estabelecimentoFaturamento > 0
          THEN prod.estabelecimentoFaturamento
          WHEN p_item_controleEntrega > 0 AND contrEntr.estabelecimentoSaida > 0
          THEN contrEntr.estabelecimentoSaida
          ELSE p_cab_estabelecimento
        END estabelecimento,
        p_cab_dataEmissao dataEmissao,
        p_cab_dataEntrega dataEntrega,
        CASE
          WHEN p_item_controleEntrega > 0 AND contrEntr.localEstoqueSaida > 0
          THEN contrEntr.localEstoqueSaida
          ELSE p_item_localEstoque
        END localEstoque,
        p_item_quantidadeSaldo quantidadeSaldo,
        prod.controlaNumeroSerie,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem,
        COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA contrEntr ON contrEntr.controleEntrega = p_item_controleEntrega
      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque =
        CASE
          WHEN p_item_controleEntrega > 0 AND contrEntr.localEstoqueSaida > 0
          THEN contrEntr.localEstoqueSaida
          ELSE p_item_localEstoque
        END 
      LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = 
        CASE
          WHEN prod.estabelecimentoFaturamento > 0
          THEN prod.estabelecimentoFaturamento
          WHEN p_item_controleEntrega > 0 AND contrEntr.estabelecimentoSaida > 0
          THEN contrEntr.estabelecimentoSaida
          ELSE p_cab_estabelecimento
        END
      AND estXLoc.localEstoque =
        CASE
          WHEN p_item_controleEntrega > 0 AND contrEntr.localEstoqueSaida > 0
          THEN contrEntr.localEstoqueSaida
          ELSE p_item_localEstoque
        END 
      WHERE gradProd.gradeProduto = p_item_gradeProduto
      AND p_item_cancelado = 0
      AND p_item_movimentaEstoque = 1
      AND p_item_quantidadeSaldo <> 0
      AND p_etOrc_situacaoOrcamento BETWEEN 41 AND 63
      UNION ALL
      SELECT
        doc.estabelecimento,
        doc.dataEmissao,
        doc.dataEntradaSaida dataEntrega,
        itemDoc.localEstoque,
        (itemDoc.quantidade - itemDoc.quantidadeDevolvidaRetornada - COALESCE ((SELECT SUM (entr.quantidade * CASE WHEN itemDoc.quantidadeConvertida = 0 THEN 1 ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida END) FROM MOENTREGAS entr WHERE entr.idItemOrcamento = p_item_idItemOrcamento AND entr.idItemPreDocumentoRemessa = 0 AND entr.idItemDocFiscalRemessa = 0 AND entr.situacaoEntrega IN (4,5)),0)) quantidadeSaldo,
        prod.controlaNumeroSerie,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem,
        COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc ON docXOrc.idItemOrcamento = p_item_idItemOrcamento
      JOIN MOPREDOCUMXITENS itemDoc ON itemDoc.idItemPreDocumento = docXOrc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = itemDoc.preDocumento
      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = itemDoc.localEstoque
      JOIN PACONTROLESENTREGA contEnt ON contEnt.controleEntrega = p_item_controleEntrega
      LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = doc.estabelecimento AND estXLoc.localEstoque = itemDoc.localEstoque
      WHERE gradProd.gradeProduto = p_item_gradeProduto
      AND p_item_cancelado = 0
      AND p_item_movimentaEstoque = 1
      AND p_item_controleEntrega > 0
      AND p_etOrc_situacaoOrcamento BETWEEN 64 AND 89
      AND contEnt.reservaEstoque = 1
      AND docXOrc.quantidade > 0
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoque = 0
      AND itemDoc.quantidade > itemDoc.quantidadeDevolvidaRetornada
      AND doc.entradaSaida = 'S'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.statusPreDocumento <> 'C'
      UNION ALL
      SELECT
        doc.estabelecimento,
        doc.dataEmissao,
        doc.dataEntradaSaida dataEntrega,
        itemDoc.localEstoque,
        (itemDoc.quantidade - itemDoc.quantidadeDevolvidaRetornada - COALESCE ((SELECT SUM (entr.quantidade * CASE WHEN itemDoc.quantidadeConvertida = 0 THEN 1 ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida END) FROM MOENTREGAS entr WHERE entr.idItemOrcamento = p_item_idItemOrcamento AND entr.idItemPreDocumentoRemessa = 0 AND entr.idItemDocFiscalRemessa = 0 AND entr.situacaoEntrega IN (4,5)),0)) quantidadeSaldo,
        prod.controlaNumeroSerie,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem,
        COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc ON docXOrc.idItemOrcamento = p_item_idItemOrcamento
      JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = docXOrc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = itemDoc.localEstoque
      JOIN PACONTROLESENTREGA contEnt ON contEnt.controleEntrega = p_item_controleEntrega
      LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = doc.estabelecimento AND estXLoc.localEstoque = itemDoc.localEstoque
      WHERE gradProd.gradeProduto = p_item_gradeProduto
      AND p_item_cancelado = 0
      AND p_item_movimentaEstoque = 1
      AND p_item_controleEntrega > 0
      AND p_etOrc_situacaoOrcamento BETWEEN 64 AND 89
      AND contEnt.reservaEstoque = 1
      AND docXOrc.quantidade > 0
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoque = 0
      AND itemDoc.quantidade > itemDoc.quantidadeDevolvidaRetornada
      AND doc.entradaSaida = 'S'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.situacaoDocumentoFiscal <= 23
    ) a
    WHERE a.quantidadeSaldo > 0;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR resEstAnt IN c_resEstAnt
  LOOP
    r_bufferIdReservaEstoque := CASE WHEN (r_bufferIdReservaEstoque IS NULL OR r_bufferIdReservaEstoque = '' OR r_bufferIdReservaEstoque = ' ') THEN '' ELSE RTRIM (r_bufferIdReservaEstoque) || ';' END || TO_CHAR (LPAD(resEstAnt.idReservaEstoque,14,'0'));
    ADD_MORESERVASESTOQUE_EXCLUI (resEstAnt.idReservaEstoque);
  END LOOP;
  FOR grade IN c_grade LOOP
    v_quantidadeEnderecoEstoque := 0;
    v_quantidadeNumerosSerie    := 0;
    IF grade.solicitaEnderecoEstoque = 1 AND grade.controleEstoque IN (1,3,4,5,11,12) THEN
      ADD_ORCAMENTO_ITEM_RES_ENDEREC(
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        grade.estabelecimento,
        grade.dataEmissao,
        grade.dataEntrega,
        p_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_personalizacao,
        p_item_idFormulaTinta,
        p_item_idLoteEstoque,
        grade.localEstoque,
        p_item_pessoaParticipante,
        grade.quantidadeSaldo,
        p_item_observacoes,
        grade.controlaNumeroSerie,
        grade.controleEstoque,
        grade.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque,
        v_quantidadeEnderecoEstoque);
    END IF;
    IF grade.quantidadeSaldo > v_quantidadeEnderecoEstoque THEN
      IF grade.controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
        ADD_RESERVA_ESTOQUE_FORM_TINTA(
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_modeloDocumento,
          p_cab_entradaSaida,
          grade.estabelecimento,
          grade.dataEmissao,
          grade.dataEntrega,
          p_item_idItemOrcamento,
          0, -- p_idItemDocTransferencia
          p_item_idFormulaTinta,
          grade.localEstoque,
          p_item_pessoaParticipante,
          0, -- p_item_idEnderecoEstoque
          grade.quantidadeSaldo - v_quantidadeEnderecoEstoque,
          p_item_observacoes,
          grade.indicadorPropriedadePosseItem,
          r_bufferIdReservaEstoque);
      ELSIF grade.controleEstoque IN (3,4) THEN
        ADD_ORCAMENTO_ITEM_RES_KIT(
          r_bufferIdReservaEstoque,
          p_estabelecimentoAtivo,
          p_cab_modeloDocumento,
          p_cab_entradaSaida,
          grade.estabelecimento,
          grade.dataEmissao,
          grade.dataEntrega,
          p_item_idItemOrcamento,
          p_item_gradeProduto,
          grade.localEstoque,
          p_item_pessoaParticipante,
          0, -- p_item_idEnderecoEstoque
          grade.quantidadeSaldo - v_quantidadeEnderecoEstoque,
          p_item_observacoes,
          0, -- p_end_idEnderecoEstoqueOrcam
          grade.indicadorPropriedadePosseItem,
          r_bufferIdReservaEstoque);
      ELSIF grade.controleEstoque IN (1,5,11,12) THEN
        v_quantidadeNumerosSerie := 0;
        IF grade.controlaNumeroSerie > 0 THEN
          ADD_ORCAMENTO_ITEM_RES_N_SERIE(
            r_bufferIdReservaEstoque, 
            p_estabelecimentoAtivo, 
            p_cab_modeloDocumento,
            p_cab_entradaSaida,
            grade.estabelecimento,
            grade.dataEmissao,
            grade.dataEntrega,
            p_item_idItemOrcamento,
            p_item_gradeProduto,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            grade.localEstoque,
            p_item_pessoaParticipante,
            0, -- p_item_idEnderecoEstoque
            p_item_observacoes,
            0, -- p_end_idEnderecoEstoqueOrcam
            grade.indicadorPropriedadePosseItem,
            r_bufferIdReservaEstoque,
            v_quantidadeNumerosSerie);
        END IF;
        IF grade.quantidadeSaldo - v_quantidadeEnderecoEstoque > v_quantidadeNumerosSerie THEN
          ADD_RESERVA_ESTOQUE_GRAVA(
            0,
            r_bufferIdReservaEstoque, 
            p_estabelecimentoAtivo, 
            grade.estabelecimento,
            CASE WHEN grade.dataEntrega IS NULL OR grade.dataEntrega < grade.dataEmissao THEN grade.dataEmissao ELSE grade.dataEntrega END, --p_data
            p_item_gradeProduto,
            p_cab_modeloDocumento,
            p_cab_entradaSaida,
            grade.indicadorPropriedadePosseItem,
            p_item_pessoaParticipante,
            grade.localEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            0, -- p_idEnderecoEstoque
            0, -- p_idNumeroSerie
            grade.quantidadeSaldo - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
            p_item_observacoes,
            p_item_idItemOrcamento,
            0, -- p_idItemDocTransferencia
            v_idReservaEstoque,
            r_bufferIdReservaEstoque);
        END IF;
      END IF;
    END IF;
  END LOOP;  
END ADD_ORCAMENTO_ITEM_RES_ITEM;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_RESERVA_GRAV(
    p_orcamento            IN NUMBER,
    p_estabelecimentoAtivo IN NUMBER
  )
IS
  v_bufferIdReservaEstoque        VARCHAR2 (32000);
  CURSOR c_resEstAnt
  IS 
    SELECT a.idReservaEstoque
    FROM MORESERVASESTOQUE a
    JOIN MOORCAMENTOXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
    JOIN MOORCAMENTOXITENS c ON c.idItemOrcamento = b.idItemOrcamento
    WHERE c.orcamento = p_orcamento
    ORDER BY a.idReservaEstoque;
  CURSOR c_itens
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntrega,
      etOrc.situacaoOrcamento,
      item.idItemOrcamento,
      item.cancelado,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.movimentaEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidadeSaldo,
      item.controleEntrega,
      item.observacoes
    FROM MOORCAMENTOXITENS item
    JOIN MOORCAMENTOS cab ON cab.orcamento = item.orcamento
    JOIN PAETAPASORCAMENTO etOrc ON etOrc.etapaOrcamento = cab.etapaOrcamento
    WHERE item.orcamento = p_orcamento
    AND item.cancelado = 0
    AND item.movimentaEstoque = 1
    AND (etOrc.situacaoOrcamento BETWEEN 41 AND 63 AND item.quantidadeSaldo > 0
      OR etOrc.situacaoOrcamento BETWEEN 64 AND 89 AND item.controleEntrega > 0)
    ORDER BY item.sequencia;
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR resEstAnt IN c_resEstAnt
  LOOP
    v_bufferIdReservaEstoque := CASE WHEN (v_bufferIdReservaEstoque IS NULL OR v_bufferIdReservaEstoque = '' OR v_bufferIdReservaEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdReservaEstoque) || ';' END || TO_CHAR (LPAD(resEstAnt.idReservaEstoque,14,'0'));
    ADD_MORESERVASESTOQUE_EXCLUI (resEstAnt.idReservaEstoque);
  END LOOP;  
  FOR itens IN c_itens
  LOOP
    ADD_ORCAMENTO_ITEM_RES_ITEM(
      v_bufferIdReservaEstoque, 
      p_estabelecimentoAtivo, 
      itens.modeloDocumento,
      itens.entradaSaida,
      itens.estabelecimento,
      itens.dataEmissao,
      itens.dataEntrega,
      itens.situacaoOrcamento,
      itens.idItemOrcamento,
      itens.cancelado,
      itens.gradeProduto,
      itens.idFormulaTinta,
      itens.personalizacao,
      itens.idLoteEstoque,
      itens.movimentaEstoque,
      itens.localEstoque,
      itens.pessoaParticipante,
      itens.quantidadeSaldo,
      itens.controleEntrega,
      itens.observacoes,
      v_bufferIdReservaEstoque
    );
  END LOOP;
END ADD_ORCAMENTO_CAB_RESERVA_GRAV;

/

create or replace PROCEDURE ADD_DOCTRANSF_ITEM_RES_ITEM(
    p_bufferIdReservaEstoque       IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_estabelecimentoSaida     IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_tipoDocumentoSaida       IN NUMBER,
    p_cab_situacaoDocTransferencia IN CHAR,
    p_modDoc_movimentaEstoque      IN NUMBER,
    p_item_idItemDocTransferencia  IN NUMBER,
    p_item_cancelado               IN NUMBER,
    p_item_validoSaida             IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_localEstoqueSaida       IN NUMBER,
    p_item_pessoaParticipanteSaida IN NUMBER,
    p_item_quantidadeSaldo         IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    /* Retornos */
    r_bufferIdReservaEstoque       OUT VARCHAR2)

IS
  v_idReservaEstoque               NUMBER (14,0);  
  CURSOR c_resEstAnt
  IS 
    SELECT a.idReservaEstoque
    FROM MORESERVASESTOQUE a
    JOIN MODOCTRANSFXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
    WHERE b.idItemDocTransferencia = p_item_idItemDocTransferencia
    ORDER BY a.idReservaEstoque;

  CURSOR c_grade
  IS 
    SELECT
      p_cab_dataEmissao dataEmissao,
      p_item_quantidadeSaldo quantidadeSaldo,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = p_item_localEstoqueSaida
    WHERE gradProd.gradeProduto = p_item_gradeProduto
    AND p_cab_tipoDocumentoSaida > 100
    AND p_cab_situacaoDocTransferencia = 'A'
    AND p_modDoc_movimentaEstoque = 1
    AND p_item_cancelado = 0
    AND p_item_validoSaida = 1
    AND p_item_quantidadeSaldo <> 0;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR resEstAnt IN c_resEstAnt
  LOOP
    r_bufferIdReservaEstoque := CASE WHEN (r_bufferIdReservaEstoque IS NULL OR r_bufferIdReservaEstoque = '' OR r_bufferIdReservaEstoque = ' ') THEN '' ELSE RTRIM (r_bufferIdReservaEstoque) || ';' END || TO_CHAR (LPAD(resEstAnt.idReservaEstoque,14,'0'));
    ADD_MORESERVASESTOQUE_EXCLUI (resEstAnt.idReservaEstoque);
  END LOOP;
  FOR grade IN c_grade LOOP
    IF grade.controleEstoque=12 AND p_item_idFormulaTinta>0 THEN
      ADD_RESERVA_ESTOQUE_FORM_TINTA(
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        p_cab_estabelecimentoSaida,
        grade.dataEmissao,
        grade.dataEmissao, -- grade.dataEntrega,
        0, -- p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_idFormulaTinta,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        0, -- p_item_idEnderecoEstoque
        grade.quantidadeSaldo,
        p_item_observacoes,
        grade.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque
      );
    ELSIF grade.controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT(
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        p_cab_estabelecimentoSaida,
        grade.dataEmissao,
        grade.dataEmissao, -- grade.dataEntrega,
        0, -- p_item_idItemOrcamento
        p_item_idItemDocTransferencia,
        p_item_gradeProduto,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        0, -- p_item_idEnderecoEstoque
        grade.quantidadeSaldo,
        p_item_observacoes,
        grade.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque
      );
    ELSIF grade.controleEstoque IN (1,5,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA(
        0,
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimentoSaida,
        grade.dataEmissao, --p_data
        p_item_gradeProduto,
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        grade.indicadorPropriedadePosseItem,
        p_item_pessoaParticipanteSaida,
        p_item_localEstoqueSaida,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        0, -- p_idEnderecoEstoque
        0, -- p_idNumeroSerie
        grade.quantidadeSaldo,
        p_item_observacoes,
        0, -- p_item_idItemOrcamento
        p_item_idItemDocTransferencia,
        v_idReservaEstoque,
        r_bufferIdReservaEstoque
      );
    END IF;
  END LOOP;  
END ADD_DOCTRANSF_ITEM_RES_ITEM;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_RESERVA_GRAV(
    p_documentoTransferencia IN NUMBER,
    p_estabelecimentoAtivo   IN NUMBER
  )
IS
  v_bufferIdReservaEstoque        VARCHAR2 (32000);
  CURSOR c_resEstAnt
  IS 
    SELECT a.idReservaEstoque
    FROM MORESERVASESTOQUE a
    JOIN MODOCTRANSFXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
    JOIN MODOCUMENTOTRANSFXITENS c ON c.idItemDocTransferencia = b.idItemDocTransferencia
    WHERE c.documentoTransferencia = p_documentoTransferencia
    ORDER BY a.idReservaEstoque;
  CURSOR c_itens
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimentoSaida,
      cab.dataEmissao,
      cab.tipoDocumentoSaida,
      cab.situacaoDocTransferencia,
      modDoc.movimentaEstoque,
      item.idItemDocTransferencia,
      item.cancelado,
      item.validoSaida,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.quantidadeSaldo,
      item.observacoes
    FROM MODOCUMENTOTRANSFXITENS item
    JOIN MODOCUMENTOSTRANSFERENCIA cab ON cab.documentoTransferencia = item.documentoTransferencia
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    WHERE item.documentoTransferencia = p_documentoTransferencia
    AND cab.tipoDocumentoSaida > 100
    AND cab.situacaoDocTransferencia = 'A'
    AND modDoc.movimentaEstoque = 1
    AND item.cancelado = 0
    AND item.validoSaida = 1
    AND item.quantidadeSaldo <> 0
    ORDER BY item.sequencia;
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR resEstAnt IN c_resEstAnt
  LOOP
    v_bufferIdReservaEstoque := CASE WHEN (v_bufferIdReservaEstoque IS NULL OR v_bufferIdReservaEstoque = '' OR v_bufferIdReservaEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdReservaEstoque) || ';' END || TO_CHAR (LPAD(resEstAnt.idReservaEstoque,14,'0'));
    ADD_MORESERVASESTOQUE_EXCLUI (resEstAnt.idReservaEstoque);
  END LOOP;  
  FOR itens IN c_itens
  LOOP
    ADD_DOCTRANSF_ITEM_RES_ITEM(
      v_bufferIdReservaEstoque, 
      p_estabelecimentoAtivo, 
      itens.modeloDocumento,
      itens.estabelecimentoSaida,
      itens.dataEmissao,
      itens.tipoDocumentoSaida,
      itens.situacaoDocTransferencia,
      itens.movimentaEstoque,
      itens.idItemDocTransferencia,
      itens.cancelado,
      itens.validoSaida,
      itens.gradeProduto,
      itens.idFormulaTinta,
      itens.personalizacao,
      itens.idLoteEstoque,
      itens.localEstoqueSaida,
      itens.pessoaParticipanteSaida,
      itens.quantidadeSaldo,
      itens.observacoes,
      v_bufferIdReservaEstoque
    );
  END LOOP;
END ADD_DOCTRANSF_CAB_RESERVA_GRAV;

/

UPDATE SITIPOSDOCUMENTOIMPRESSO SET observacoesReport = 'Tipo Documento = "uniqueMachineID"
Id = "contadorSessao"
Ex.:
SELECT 
  TRUNC (MIN (sess.dataAbertura)),
  TO_CHAR (MIN (sess.dataAbertura),''HH24MISS''),
  SUM (sess.valorSaldoInicialCaixa),
  TRUNC (MAX (sess.dataEncerramento)),
  TO_CHAR (MAX (sess.dataEncerramento),''HH24MISS''),
  SUM (sess.valorTrocoFinalCaixa)
FROM MOSESSOESCAIXA sess
JOIN TEMPPESQUISAS temp ON temp.id = sess.sessaoCaixa
WHERE temp.uniqueMachineID = '':pTipoDocumento''
AND temp.nomePublico = ''PesqSessoesCaixa''
AND temp.contadorSessao = :pID
AND temp.selecionado = 1'
WHERE tipoDocumentoImpresso = 5;

COMMIT;

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS
  v_preco NUMBER;

  CURSOR c_formula
  IS 
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a 
    JOIN CABASESTINTAS base ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0;

BEGIN
  v_preco := 0;

  FOR formula IN c_formula LOOP
    v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      formula.gradeProduto,
      1, --p_tinta_quantidade
      v_preco);
    IF formula.idColoranteTintaA > 0 AND formula.gradeProdutoA > 0 AND formula.quantidadeA > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoA,
        formula.quantidadeA / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaB > 0 AND formula.gradeProdutoB > 0 AND formula.quantidadeB > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoB,
        formula.quantidadeB / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaC > 0 AND formula.gradeProdutoC > 0 AND formula.quantidadeC > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoC,
        formula.quantidadeC / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaD > 0 AND formula.gradeProdutoD > 0 AND formula.quantidadeD > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoD,
        formula.quantidadeD / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaE > 0 AND formula.gradeProdutoE > 0 AND formula.quantidadeE > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoE,
        formula.quantidadeE / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaF > 0 AND formula.gradeProdutoF > 0 AND formula.quantidadeF > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoF,
        formula.quantidadeF / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaG > 0 AND formula.gradeProdutoG > 0 AND formula.quantidadeG > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoG,
        formula.quantidadeG / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaH > 0 AND formula.gradeProdutoH > 0 AND formula.quantidadeH > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoH,
        formula.quantidadeH / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaI > 0 AND formula.gradeProdutoI > 0 AND formula.quantidadeI > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoI,
        formula.quantidadeI / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaJ > 0 AND formula.gradeProdutoJ > 0 AND formula.quantidadeJ > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoJ,
        formula.quantidadeJ / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaK > 0 AND formula.gradeProdutoK > 0 AND formula.quantidadeK > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoK,
        formula.quantidadeK / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaL > 0 AND formula.gradeProdutoL > 0 AND formula.quantidadeL > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoL,
        formula.quantidadeL / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaM > 0 AND formula.gradeProdutoM > 0 AND formula.quantidadeM > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoM,
        formula.quantidadeM / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaN > 0 AND formula.gradeProdutoN > 0 AND formula.quantidadeN > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoN,
        formula.quantidadeN / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaO > 0 AND formula.gradeProdutoO > 0 AND formula.quantidadeO > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoO,
        formula.quantidadeO / 900, --p_tinta_quantidade
        v_preco);
    END IF;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)

IS

  CURSOR c_formula
  IS 
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a 
    JOIN CABASESTINTAS base ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0;

BEGIN
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo              := 0;
  r_precoAVista              := 0;
  r_promocao                 := 0;
  r_precoPromocaoAPrazo      := 0;
  r_precoPromocaoAVista      := 0;
  r_precoIndexadoAPrazo      := 0;
  r_precoIndexadoAVista      := 0;

  FOR formula IN c_formula LOOP
    ADD_BUSCA_PRECO_INTERNO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      formula.gradeProduto,
      1, --p_tinta_quantidade
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista,
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista);
    IF formula.idColoranteTintaA > 0 AND formula.gradeProdutoA > 0 AND formula.quantidadeA > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoA,
        formula.quantidadeA / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaB > 0 AND formula.gradeProdutoB > 0 AND formula.quantidadeB > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoB,
        formula.quantidadeB / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaC > 0 AND formula.gradeProdutoC > 0 AND formula.quantidadeC > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoC,
        formula.quantidadeC / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaD > 0 AND formula.gradeProdutoD > 0 AND formula.quantidadeD > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoD,
        formula.quantidadeD / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaE > 0 AND formula.gradeProdutoE > 0 AND formula.quantidadeE > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoE,
        formula.quantidadeE / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaF > 0 AND formula.gradeProdutoF > 0 AND formula.quantidadeF > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoF,
        formula.quantidadeF / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaG > 0 AND formula.gradeProdutoG > 0 AND formula.quantidadeG > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoG,
        formula.quantidadeG / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaH > 0 AND formula.gradeProdutoH > 0 AND formula.quantidadeH > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoH,
        formula.quantidadeH / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaI > 0 AND formula.gradeProdutoI > 0 AND formula.quantidadeI > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoI,
        formula.quantidadeI / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaJ > 0 AND formula.gradeProdutoJ > 0 AND formula.quantidadeJ > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoJ,
        formula.quantidadeJ / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaK > 0 AND formula.gradeProdutoK > 0 AND formula.quantidadeK > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoK,
        formula.quantidadeK / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaL > 0 AND formula.gradeProdutoL > 0 AND formula.quantidadeL > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoL,
        formula.quantidadeL / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaM > 0 AND formula.gradeProdutoM > 0 AND formula.quantidadeM > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoM,
        formula.quantidadeM / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaN > 0 AND formula.gradeProdutoN > 0 AND formula.quantidadeN > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoN,
        formula.quantidadeN / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaO > 0 AND formula.gradeProdutoO > 0 AND formula.quantidadeO > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoO,
        formula.quantidadeO / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_TINTA;

/

create or replace PROCEDURE ADD_ESTOQUE_PRODUTO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_operacaoInternaEstoque   IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_idItemPreDocumento           IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_divergenciaBalanco           IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS  
  CURSOR c_grade IS 
    SELECT 
      prod.controleEstoque,
      ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR grade IN c_grade
  LOOP
    IF grade.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_tinta_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        grade.quantidade,
        0, --p_item_valorCustoOperacao
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF grade.controleEstoque IN(1,5,11,12) THEN
      ADD_ESTOQUE_INSERE(
        r_bufferIdEstoque,
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
        p_tinta_gradeProduto,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        grade.quantidade,
        0, -- p_precoCustoOperacao,
        0, -- p_totalCustoOperacao,
        0, -- p_precoCMV,
        0, -- p_valorCMV,
        p_item_observacoes,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        r_bufferIdEstoque);
      IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo, 
          p_docTransf_estabelecSaida,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          p_tinta_gradeProduto,
          p_cab_modeloDocumento,
          900,
          0,
          0,
          CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          grade.quantidade,
          0, -- p_precoCustoOperacao,
          0, -- p_totalCustoOperacao,
          0, -- p_precoCMV,
          0, -- p_valorCMV,
          p_item_observacoes,
          p_idItemPreDocumento,
          p_idItemDocFiscal,
          p_idItemSeparacao,
          p_divergenciaBalanco,
          p_idItemDocTransferencia,
          r_bufferIdEstoque);
      END IF;
    END IF;    
  END LOOP;
END ADD_ESTOQUE_PRODUTO_TINTA;

/

create or replace PROCEDURE ADD_ESTOQUE_FORMULA_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_operacaoInternaEstoque   IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_idItemPreDocumento           IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_divergenciaBalanco           IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS
  CURSOR c_formTinta IS 
    SELECT 
      formTinta.idBaseTinta,
      baseTinta.gradeProduto,
      formTinta.idColoranteTintaA,
      formTinta.quantidadeA,
      COALESCE(colTintaA.gradeProduto,0) gradeProdutoA,
      formTinta.idColoranteTintaB,
      formTinta.quantidadeB,
      COALESCE(colTintaB.gradeProduto,0) gradeProdutoB,
      formTinta.idColoranteTintaC,
      formTinta.quantidadeC,
      COALESCE(colTintaC.gradeProduto,0) gradeProdutoC,
      formTinta.idColoranteTintaD,
      formTinta.quantidadeD,
      COALESCE(colTintaD.gradeProduto,0) gradeProdutoD,
      formTinta.idColoranteTintaE,
      formTinta.quantidadeE,
      COALESCE(colTintaE.gradeProduto,0) gradeProdutoE,
      formTinta.idColoranteTintaF,
      formTinta.quantidadeF,
      COALESCE(colTintaF.gradeProduto,0) gradeProdutoF,
      formTinta.idColoranteTintaG,
      formTinta.quantidadeG,
      COALESCE(colTintaG.gradeProduto,0) gradeProdutoG,
      formTinta.idColoranteTintaH,
      formTinta.quantidadeH,
      COALESCE(colTintaH.gradeProduto,0) gradeProdutoH,
      formTinta.idColoranteTintaI,
      formTinta.quantidadeI,
      COALESCE(colTintaI.gradeProduto,0) gradeProdutoI,
      formTinta.idColoranteTintaJ,
      formTinta.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto,0) gradeProdutoJ,
      formTinta.idColoranteTintaK,
      formTinta.quantidadeK,
      COALESCE(colTintaK.gradeProduto,0) gradeProdutoK,
      formTinta.idColoranteTintaL,
      formTinta.quantidadeL,
      COALESCE(colTintaL.gradeProduto,0) gradeProdutoL,
      formTinta.idColoranteTintaM,
      formTinta.quantidadeM,
      COALESCE(colTintaM.gradeProduto,0) gradeProdutoM,
      formTinta.idColoranteTintaN,
      formTinta.quantidadeN,
      COALESCE(colTintaN.gradeProduto,0) gradeProdutoN,
      formTinta.idColoranteTintaO,
      formTinta.quantidadeO,
      COALESCE(colTintaO.gradeProduto,0) gradeProdutoO
    FROM CAFORMULASTINTAS formTinta 
    JOIN CABASESTINTAS baseTinta ON baseTinta.idBaseTinta = formTinta.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA ON colTintaA.idColoranteTinta = formTinta.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB ON colTintaB.idColoranteTinta = formTinta.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC ON colTintaC.idColoranteTinta = formTinta.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD ON colTintaD.idColoranteTinta = formTinta.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE ON colTintaE.idColoranteTinta = formTinta.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF ON colTintaF.idColoranteTinta = formTinta.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG ON colTintaG.idColoranteTinta = formTinta.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH ON colTintaH.idColoranteTinta = formTinta.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI ON colTintaI.idColoranteTinta = formTinta.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ ON colTintaJ.idColoranteTinta = formTinta.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK ON colTintaK.idColoranteTinta = formTinta.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL ON colTintaL.idColoranteTinta = formTinta.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM ON colTintaM.idColoranteTinta = formTinta.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN ON colTintaN.idColoranteTinta = formTinta.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO ON colTintaO.idColoranteTinta = formTinta.idColoranteTintaO
    WHERE formTinta.idFormulaTinta = p_item_idFormulaTinta
    AND formTinta.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR formTinta IN c_formTinta
  LOOP
    ADD_ESTOQUE_PRODUTO_TINTA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      p_cab_modeloDocumento,
      p_cab_operacaoInternaEstoque,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_observacoes,
      p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      p_idItemPreDocumento,
      p_idItemDocFiscal,
      p_idItemSeparacao,
      p_divergenciaBalanco,
      p_idItemDocTransferencia,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      formTinta.gradeProduto,
      900, -- p_quantidade,
      r_bufferIdEstoque);    
    IF formTinta.idColoranteTintaA > 0 AND formTinta.quantidadeA > 0 AND formTinta.gradeProdutoA > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoA,
        formTinta.quantidadeA,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaB > 0 AND formTinta.quantidadeB > 0 AND formTinta.gradeProdutoB > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoB,
        formTinta.quantidadeB,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaC > 0 AND formTinta.quantidadeC > 0 AND formTinta.gradeProdutoC > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoC,
        formTinta.quantidadeC,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaD > 0 AND formTinta.quantidadeD > 0 AND formTinta.gradeProdutoD > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoD,
        formTinta.quantidadeD,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaE > 0 AND formTinta.quantidadeE > 0 AND formTinta.gradeProdutoE > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoE,
        formTinta.quantidadeE,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaF > 0 AND formTinta.quantidadeF > 0 AND formTinta.gradeProdutoF > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoF,
        formTinta.quantidadeF,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaG > 0 AND formTinta.quantidadeG > 0 AND formTinta.gradeProdutoG > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoG,
        formTinta.quantidadeG,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaH > 0 AND formTinta.quantidadeH > 0 AND formTinta.gradeProdutoH > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoH,
        formTinta.quantidadeH,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaI > 0 AND formTinta.quantidadeI > 0 AND formTinta.gradeProdutoI > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoI,
        formTinta.quantidadeI,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaJ > 0 AND formTinta.quantidadeJ > 0 AND formTinta.gradeProdutoJ > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoJ,
        formTinta.quantidadeJ,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaK > 0 AND formTinta.quantidadeK > 0 AND formTinta.gradeProdutoK > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoK,
        formTinta.quantidadeK,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaL > 0 AND formTinta.quantidadeL > 0 AND formTinta.gradeProdutoL > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoL,
        formTinta.quantidadeL,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaM > 0 AND formTinta.quantidadeM > 0 AND formTinta.gradeProdutoM > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoM,
        formTinta.quantidadeM,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaN > 0 AND formTinta.quantidadeN > 0 AND formTinta.gradeProdutoN > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoN,
        formTinta.quantidadeN,
        r_bufferIdEstoque);
    END IF;    
    IF formTinta.idColoranteTintaO > 0 AND formTinta.quantidadeO > 0 AND formTinta.gradeProdutoO > 0 THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        formTinta.gradeProdutoO,
        formTinta.quantidadeO,
        r_bufferIdEstoque);
    END IF;    
  END LOOP;
END ADD_ESTOQUE_FORMULA_TINTA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_PROD_TINTA(
    p_bufferIdReservaEstoque       IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntrega              IN DATE,
    p_item_idItemOrcamento         IN NUMBER,
    p_item_idItemDocTransferencia  IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_idEnderecoEstoque       IN NUMBER,
    p_item_quantidadeSaldo         IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_idReservaEstoque       NUMBER (14,0);
    /* Busca do precoCustoOperacao e precoCMV pendentes. */
  CURSOR c_grade
  IS 
    SELECT 
      prod.controleEstoque,
      ROUND(p_item_quantidadeSaldo * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidadeSaldo
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidadeSaldo  *p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR grade IN c_grade
  LOOP
    IF grade.controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT(
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_tinta_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        grade.quantidadeSaldo,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque                    
      );
    ELSIF grade.controleEstoque IN(1,5,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA(
        0,
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntrega IS NULL OR p_cab_dataEntrega < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntrega END, --p_data
        p_tinta_gradeProduto,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_item_personalizacao
        0, --p_idLoteEstoque
        p_item_idEnderecoEstoque,
        0, --p_idNumeroSerie
        grade.quantidadeSaldo,
        p_item_observacoes,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        v_idReservaEstoque,
        r_bufferIdReservaEstoque
      );
    END IF;
  END LOOP;
END ADD_RESERVA_ESTOQUE_PROD_TINTA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_FORM_TINTA(
    p_bufferIdReservaEstoque       IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntrega              IN DATE,
    p_item_idItemOrcamento         IN NUMBER,
    p_item_idItemDocTransferencia  IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_idEnderecoEstoque       IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_locEst_indicProprPosseItem   IN CHAR,
    r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
  
  CURSOR c_estoque
  IS 
    SELECT 
      formTinta.idBaseTinta,
      baseTinta.gradeProduto,
      formTinta.idColoranteTintaA,
      formTinta.quantidadeA,
      COALESCE(colTintaA.gradeProduto,0) gradeProdutoA,
      formTinta.idColoranteTintaB,
      formTinta.quantidadeB,
      COALESCE(colTintaB.gradeProduto,0) gradeProdutoB,
      formTinta.idColoranteTintaC,
      formTinta.quantidadeC,
      COALESCE(colTintaC.gradeProduto,0) gradeProdutoC,
      formTinta.idColoranteTintaD,
      formTinta.quantidadeD,
      COALESCE(colTintaD.gradeProduto,0) gradeProdutoD,
      formTinta.idColoranteTintaE,
      formTinta.quantidadeE,
      COALESCE(colTintaE.gradeProduto,0) gradeProdutoE,
      formTinta.idColoranteTintaF,
      formTinta.quantidadeF,
      COALESCE(colTintaF.gradeProduto,0) gradeProdutoF,
      formTinta.idColoranteTintaG,
      formTinta.quantidadeG,
      COALESCE(colTintaG.gradeProduto,0) gradeProdutoG,
      formTinta.idColoranteTintaH,
      formTinta.quantidadeH,
      COALESCE(colTintaH.gradeProduto,0) gradeProdutoH,
      formTinta.idColoranteTintaI,
      formTinta.quantidadeI,
      COALESCE(colTintaI.gradeProduto,0) gradeProdutoI,
      formTinta.idColoranteTintaJ,
      formTinta.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto,0) gradeProdutoJ,
      formTinta.idColoranteTintaK,
      formTinta.quantidadeK,
      COALESCE(colTintaK.gradeProduto,0) gradeProdutoK,
      formTinta.idColoranteTintaL,
      formTinta.quantidadeL,
      COALESCE(colTintaL.gradeProduto,0) gradeProdutoL,
      formTinta.idColoranteTintaM,
      formTinta.quantidadeM,
      COALESCE(colTintaM.gradeProduto,0) gradeProdutoM,
      formTinta.idColoranteTintaN,
      formTinta.quantidadeN,
      COALESCE(colTintaN.gradeProduto,0) gradeProdutoN,
      formTinta.idColoranteTintaO,
      formTinta.quantidadeO,
      COALESCE(colTintaO.gradeProduto,0) gradeProdutoO
    FROM CAFORMULASTINTAS formTinta 
    JOIN CABASESTINTAS baseTinta ON baseTinta.idBaseTinta = formTinta.idBaseTinta
    LEFT JOIN CACOLORANTESTINTAS colTintaA ON colTintaA.idColoranteTinta = formTinta.idColoranteTintaA
    LEFT JOIN CACOLORANTESTINTAS colTintaB ON colTintaB.idColoranteTinta = formTinta.idColoranteTintaB
    LEFT JOIN CACOLORANTESTINTAS colTintaC ON colTintaC.idColoranteTinta = formTinta.idColoranteTintaC
    LEFT JOIN CACOLORANTESTINTAS colTintaD ON colTintaD.idColoranteTinta = formTinta.idColoranteTintaD
    LEFT JOIN CACOLORANTESTINTAS colTintaE ON colTintaE.idColoranteTinta = formTinta.idColoranteTintaE
    LEFT JOIN CACOLORANTESTINTAS colTintaF ON colTintaF.idColoranteTinta = formTinta.idColoranteTintaF
    LEFT JOIN CACOLORANTESTINTAS colTintaG ON colTintaG.idColoranteTinta = formTinta.idColoranteTintaG
    LEFT JOIN CACOLORANTESTINTAS colTintaH ON colTintaH.idColoranteTinta = formTinta.idColoranteTintaH
    LEFT JOIN CACOLORANTESTINTAS colTintaI ON colTintaI.idColoranteTinta = formTinta.idColoranteTintaI
    LEFT JOIN CACOLORANTESTINTAS colTintaJ ON colTintaJ.idColoranteTinta = formTinta.idColoranteTintaJ
    LEFT JOIN CACOLORANTESTINTAS colTintaK ON colTintaK.idColoranteTinta = formTinta.idColoranteTintaK
    LEFT JOIN CACOLORANTESTINTAS colTintaL ON colTintaL.idColoranteTinta = formTinta.idColoranteTintaL
    LEFT JOIN CACOLORANTESTINTAS colTintaM ON colTintaM.idColoranteTinta = formTinta.idColoranteTintaM
    LEFT JOIN CACOLORANTESTINTAS colTintaN ON colTintaN.idColoranteTinta = formTinta.idColoranteTintaN
    LEFT JOIN CACOLORANTESTINTAS colTintaO ON colTintaO.idColoranteTinta = formTinta.idColoranteTintaO
    WHERE formTinta.idFormulaTinta = p_item_idFormulaTinta
    AND formTinta.idBaseTinta>0
    AND baseTinta.gradeProduto>0;

BEGIN

  v_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR estoque IN c_estoque
  LOOP
  
    /* Cria o movimento da base da tinta. */
    ADD_RESERVA_ESTOQUE_PROD_TINTA(
      v_bufferIdReservaEstoque,
      p_estabelecimentoAtivo,
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_idItemOrcamento,
      p_item_idItemDocTransferencia,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_idEnderecoEstoque,
      p_item_quantidade,
      p_item_observacoes,
      p_locEst_indicProprPosseItem,
      estoque.gradeProduto,
      900, -- p_quantidade
      r_bufferIdReservaEstoque
    );
    v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    
    /* Se possui colorante A, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaA > 0 AND estoque.quantidadeA > 0 AND estoque.gradeProdutoA > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoA,
        estoque.quantidadeA,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante B, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaB > 0 AND estoque.quantidadeB > 0 AND estoque.gradeProdutoB > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoB,
        estoque.quantidadeB,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante C, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaC > 0 AND estoque.quantidadeC > 0 AND estoque.gradeProdutoC > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoC,
        estoque.quantidadeC,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante D, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaD > 0 AND estoque.quantidadeD > 0 AND estoque.gradeProdutoD > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoD,
        estoque.quantidadeD,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante E, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaE > 0 AND estoque.quantidadeE > 0 AND estoque.gradeProdutoE > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoE,
        estoque.quantidadeE,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante F, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaF > 0 AND estoque.quantidadeF > 0 AND estoque.gradeProdutoF > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoF,
        estoque.quantidadeF,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante G, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaG > 0 AND estoque.quantidadeG > 0 AND estoque.gradeProdutoG > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoG,
        estoque.quantidadeG,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante H, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaH > 0 AND estoque.quantidadeH > 0 AND estoque.gradeProdutoH > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoH,
        estoque.quantidadeH,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante I, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaI > 0 AND estoque.quantidadeI > 0 AND estoque.gradeProdutoI > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoI,
        estoque.quantidadeI,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante J, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaJ > 0 AND estoque.quantidadeJ > 0 AND estoque.gradeProdutoJ > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoJ,
        estoque.quantidadeJ,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante K, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaK > 0 AND estoque.quantidadeK > 0 AND estoque.gradeProdutoK > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoK,
        estoque.quantidadeK,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante L, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaL > 0 AND estoque.quantidadeL > 0 AND estoque.gradeProdutoL > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoL,
        estoque.quantidadeL,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante M, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaM > 0 AND estoque.quantidadeM > 0 AND estoque.gradeProdutoM > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoM,
        estoque.quantidadeM,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante N, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaN > 0 AND estoque.quantidadeN > 0 AND estoque.gradeProdutoN > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoN,
        estoque.quantidadeN,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
    /* Se possui colorante O, cria o movimento do colorante da tinta. */
    IF (estoque.idColoranteTintaO > 0 AND estoque.quantidadeO > 0 AND estoque.gradeProdutoO > 0) THEN
      ADD_RESERVA_ESTOQUE_PROD_TINTA(
        v_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        estoque.gradeProdutoO,
        estoque.quantidadeO,
        r_bufferIdReservaEstoque
      );
      v_bufferIdReservaEstoque := r_bufferIdReservaEstoque;
    END IF;
    
  END LOOP;
  
END ADD_RESERVA_ESTOQUE_FORM_TINTA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_INSERE_COMB (
    p_uniqueMachineID              IN VARCHAR2,
    p_usuarioLogado                IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibPercMargemCab    IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_obrigaFinalizar              IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_origemDocumento          IN NUMBER,
    p_cab_tipoDocumento            IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataPreco                IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_dataEntrega              IN DATE,
    p_cab_municipioFatoGerador     IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_quantidade               IN NUMBER,
    p_cab_pesoLiquido              IN NUMBER,
    p_cab_pesoBruto                IN NUMBER,
    p_cab_valorProdutosBruto       IN NUMBER,
    p_cab_valorProdutos            IN NUMBER,
    p_cab_valorDescontoProdutos    IN NUMBER,
    p_cab_valorAcrescimoProdutos   IN NUMBER,
    p_cab_valorServicosBruto       IN NUMBER,
    p_cab_valorServicos            IN NUMBER,
    p_cab_valorDescontoServicos    IN NUMBER,
    p_cab_valorAcrescimoServicos   IN NUMBER,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorBasePagamento       IN NUMBER,
    p_cab_valorAVistaMinimo        IN NUMBER,
    p_cab_valorDescontoTotal       IN NUMBER,
    p_cab_valorOutrasDespTotal     IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorAdicFreteMarTotal   IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_valorImpostosSomaPag     IN NUMBER,
    p_cab_valorImpostosDiminuiPag  IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_cab_valorMargem              IN NUMBER,
    p_modDoc_capituloNatFiscal     IN NUMBER,
    p_modDoc_habilitaAmbiente      IN NUMBER,
    p_modDoc_tipoPreco             IN CHAR,
    p_modDoc_tabelaPreco           IN VARCHAR2,
    p_modDoc_fatorMultipPreco      IN NUMBER,
    p_modDoc_tipoPrecoB            IN CHAR,
    p_modDoc_tabelaPrecoB          IN VARCHAR2,
    p_modDoc_fatorMultipPrecoB     IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_est_grupoFiscal              IN NUMBER,
    p_pessEst_regimeTributario     IN CHAR,
    p_munEndEst_uf                 IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_munEndPess_uf                IN CHAR,
    p_etOrc_situacaoOrcamento      IN NUMBER,
    p_item_vendedor                IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_movimentaEstoque        IN NUMBER,
    p_item_geraFinanceiro          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_dataEntrega             IN DATE,
    p_item_quantidade              IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_item_usarPrecoAVista         IN NUMBER,
    p_item_percDescontoItem        IN NUMBER,
    p_item_percAcrescimoItem       IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_item_ambiente                IN NUMBER,
    p_item_amb_observacoes         IN VARCHAR2,
    p_atualizarTempMargem          IN NUMBER,
    p_idItemOrcamentoReferenciado  IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_buffer_idItemOrcamento       IN VARCHAR2,
    /* Retornos */
    r_obrigaFinalizar              OUT NUMBER,
    r_cab_quantidade               OUT NUMBER,
    r_cab_pesoLiquido              OUT NUMBER,
    r_cab_pesoBruto                OUT NUMBER,
    r_cab_valorProdutosBruto       OUT NUMBER,
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorDescontoProdutos    OUT NUMBER,
    r_cab_valorAcrescimoProdutos   OUT NUMBER,
    r_cab_valorServicosBruto       OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorDescontoServicos    OUT NUMBER,
    r_cab_valorAcrescimoServicos   OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespTotal     OUT NUMBER,
    r_cab_valorImpostosSomaPag     OUT NUMBER,
    r_cab_valorImpostosDiminuiPag  OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2,
    r_buffer_idItemOrcamento       OUT VARCHAR2,
    r_item_valorTotalItem          OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_auxVarchar                   VARCHAR2(256);
    v_item_idItemOrcamento         NUMBER;
    v_item_sequencia               NUMBER;
    v_item_servico                 NUMBER;
    v_item_operacaoFiscal          NUMBER;
    v_item_controleQuantidade      NUMBER;
    v_item_unidadeMedidaConversao  VARCHAR2(6);
    v_item_conversorQuantidade     NUMBER;
    v_item_loteMinimo              NUMBER;
    v_item_loteMultiplo            NUMBER;
    v_item_altura                  NUMBER;
    v_item_largura                 NUMBER;
    v_item_comprimento             NUMBER;
    v_item_pecas                   NUMBER;
    v_item_quantidade              NUMBER;
    v_item_quantidadeConvertida    NUMBER;
    v_item_pesoLiquido             NUMBER;
    v_item_pesoBruto               NUMBER;
    v_item_tipoPreco               CHAR(1);
    v_item_tabelaPreco             VARCHAR2(10);
    v_item_precoSugestaoAPrazo     NUMBER;
    v_item_precoSugestaoAVista     NUMBER;
    v_item_precoDesconto           NUMBER;
    v_item_precoMinimo             NUMBER;
    v_item_precoPautaTabelado      NUMBER;
    v_item_precoUnitarioBruto      NUMBER;
    v_item_precoUnitario           NUMBER;
    v_item_precoUnitarioConvertido NUMBER;
    v_item_valorProdutoServicoBrut NUMBER;
    v_item_valorProdutoServico     NUMBER;
    v_item_valorDescontoItem       NUMBER;
    v_item_valorAcrescimoItem      NUMBER;
    v_item_valorBasePagamento      NUMBER;
    v_item_valorTotalItem          NUMBER;
    v_item_valorDescontoTotal      NUMBER;
    v_item_valorOutrasDespTotal    NUMBER;
    v_item_cfop                    NUMBER;
    v_item_indicadorISSQN          CHAR(1);
    v_item_aliquotaISSQN           NUMBER;
    v_item_baseISSQN               NUMBER;
    v_item_valorISSQN              NUMBER;
    v_item_aliquotaIRRF            NUMBER;
    v_item_baseIRRF                NUMBER;
    v_item_valorIRRF               NUMBER;
    v_item_aliquotaINSS            NUMBER;
    v_item_baseINSS                NUMBER;
    v_item_valorINSS               NUMBER;
    v_item_retencaoPIS             NUMBER;
    v_item_baseRetPIS              NUMBER;
    v_item_valorRetPIS             NUMBER;
    v_item_retencaoCOFINS          NUMBER;
    v_item_baseRetCOFINS           NUMBER;
    v_item_valorRetCOFINS          NUMBER;
    v_item_retencaoCSLL            NUMBER;
    v_item_baseRetCSLL             NUMBER;
    v_item_valorRetCSLL            NUMBER;
    v_item_aliquotaII              NUMBER;
    v_item_baseII                  NUMBER;
    v_item_valorII                 NUMBER;
    v_item_aliquotaIOF             NUMBER;
    v_item_baseIOF                 NUMBER;
    v_item_valorIOF                NUMBER;
    v_item_codigoEnquadramentoIPI  NUMBER;
    v_item_stIPI                   CHAR(2);
    v_item_aliquotaIPI             NUMBER;
    v_item_valorAliquotaIPI        NUMBER;
    v_item_baseIPI                 NUMBER;
    v_item_valorIPI                NUMBER;
    v_item_stPIS                   CHAR(2);
    v_item_aliquotaPIS             NUMBER;
    v_item_valorAliquotaPIS        NUMBER;
    v_item_basePIS                 NUMBER;
    v_item_valorPIS                NUMBER;
    v_item_aliquotaPISST           NUMBER;
    v_item_valorAliquotaPISST      NUMBER;
    v_item_basePISST               NUMBER;
    v_item_valorPISST              NUMBER;
    v_item_stCOFINS                CHAR(2);
    v_item_aliquotaCOFINS          NUMBER;
    v_item_valorAliquotaCOFINS     NUMBER;
    v_item_baseCOFINS              NUMBER;
    v_item_valorCOFINS             NUMBER;
    v_item_aliquotaCOFINSST        NUMBER;
    v_item_valorAliquotaCOFINSST   NUMBER;
    v_item_baseCOFINSST            NUMBER;
    v_item_valorCOFINSST           NUMBER;
    v_item_stSimplesNacional       CHAR(3);
    v_item_creditoSimplesNacional  NUMBER;
    v_item_baseCreditoSimplesNac   NUMBER;
    v_item_valorCreditoSimplesNac  NUMBER;
    v_item_stICMS                  CHAR(2);
    v_item_modalBaseCalcICMS       CHAR(1);
    v_item_reducaoBaseICMS         NUMBER;
    v_item_aliquotaICMS            NUMBER;
    v_item_diferimentoICMS         NUMBER;
    v_item_motivoDesoneracaoICMS   CHAR(2);
    v_item_baseICMS                NUMBER;
    v_item_valorICMSOperacao       NUMBER;
    v_item_valorICMSDiferido       NUMBER;
    v_item_valorICMS               NUMBER;
    v_item_valorICMSDesoneracao    NUMBER;
    v_item_modalBaseCalcICMSST     CHAR(1);
    v_item_margemValorAdicST       NUMBER;
    v_item_reducaoBaseST           NUMBER;
    v_item_aliquotaICMSST          NUMBER;
    v_item_aliquotaSTSuportConsFin NUMBER;
    v_item_reducaoBaseICMSEfetivo  NUMBER;
    v_item_baseICMSST              NUMBER;
    v_item_valorICMSST             NUMBER;
    v_item_baseICMSSTAnteriormente NUMBER;
    v_item_valorICMSSTAnteriorment NUMBER;
    v_item_valorICMSProprioSubstit NUMBER;
    v_item_aliquotaICMSEfetivo     NUMBER;
    v_item_baseICMSEfetivo         NUMBER;
    v_item_valorICMSEfetivo        NUMBER;
    v_item_aliquotaICMSUFDestinat  NUMBER;
    v_item_aliquotaICMSInterestad  NUMBER;
    v_item_partilhaICMSInterestad  NUMBER;
    v_item_baseICMSUFDestinatario  NUMBER;
    v_item_valorICMSUFDestinatario NUMBER;
    v_item_baseICMSUFRemetente     NUMBER;
    v_item_valorICMSUFRemetente    NUMBER;
    v_item_aliquotaFCP             NUMBER;
    v_item_baseFCP                 NUMBER;
    v_item_valorFCP                NUMBER;
    v_item_aliquotaFCPST           NUMBER;
    v_item_baseFCPST               NUMBER;
    v_item_valorFCPST              NUMBER;
    v_item_aliquotaFCPSTAnteriorm  NUMBER;
    v_item_aliquotaFCPUFDestinat   NUMBER;
    v_item_baseFCPSTAnteriormente  NUMBER;
    v_item_valorFCPSTAnteriormente NUMBER;
    v_item_baseFCPUFDestinatario   NUMBER;
    v_item_valorFCPUFDestinatario  NUMBER;
    v_item_aliquotaEstImpFederais  NUMBER;
    v_item_aliquotaEstImpEstaduais NUMBER;
    v_item_aliquotaEstImpMunicipai NUMBER;
    v_item_baseEstimadaImpostos    NUMBER;
    v_item_valorEstImpFederais     NUMBER;
    v_item_valorEstImpEstaduais    NUMBER;
    v_item_valorEstImpMunicipais   NUMBER;
    v_item_valorImpostosSomaPag    NUMBER;
    v_item_valorImpostosDiminuiPag NUMBER;
    v_item_valorLiquidoItem        NUMBER;
    v_item_observacoes             VARCHAR2(4000);
    v_locEst_indicadorPropPosseIt CHAR(1);    
    CURSOR c_comb IS
      SELECT
        comb.gradeProdutoFilho,
        comb.quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        prod.precoPautaTabelado,
        unMed.casasDecimaisUnidadeMedida
      FROM CAGRADEPRODUTOXKITSCOMBOS comb
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = comb.gradeProdutoFilho
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed ON unMed.unidadeMedida = prod.unidadeMedida
      WHERE comb.gradeProduto = p_item_gradeProduto
      AND comb.ativo = 1
      AND comb.gradeProduto <> comb.gradeProdutoFilho;
BEGIN
  r_obrigaFinalizar              := p_obrigaFinalizar;
  r_cab_quantidade               := p_cab_quantidade;
  r_cab_pesoLiquido              := p_cab_pesoLiquido;
  r_cab_pesoBruto                := p_cab_pesoBruto;
  r_cab_valorProdutosBruto       := p_cab_valorProdutosBruto;
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorDescontoProdutos    := p_cab_valorDescontoProdutos;
  r_cab_valorAcrescimoProdutos   := p_cab_valorAcrescimoProdutos;
  r_cab_valorServicosBruto       := p_cab_valorServicosBruto;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorDescontoServicos    := p_cab_valorDescontoServicos;
  r_cab_valorAcrescimoServicos   := p_cab_valorAcrescimoServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespTotal     := p_cab_valorOutrasDespTotal;
  r_cab_valorImpostosSomaPag     := p_cab_valorImpostosSomaPag;
  r_cab_valorImpostosDiminuiPag  := p_cab_valorImpostosDiminuiPag;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_cab_valorMargem              := p_cab_valorMargem;
  r_buffer_idItemOrcamento       := p_buffer_idItemOrcamento;
  r_item_valorTotalItem          := 0;
  SELECT locEst.indicadorPropriedadePosseItem
  INTO v_locEst_indicadorPropPosseIt
  FROM PALOCAISESTOQUE locEst
  WHERE locEst.localEstoque = p_item_localEstoque;
  FOR comb IN c_comb LOOP
    v_item_quantidade := ROUND (p_item_quantidade * comb.quantidade, comb.casasDecimaisUnidadeMedida);
    IF comb.controleEstoque = 3 THEN
      ADD_ORCAMENTO_ITEM_INSERE_COMB (
        p_uniqueMachineID,
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_estabelecimentoAtivo,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        p_regMarg_tipoPreco,
        p_regMarg_tabelaPreco,
        p_regMarg_fatorMultiplicador,
        p_regMarg_tipoPrecoB,
        p_regMarg_tabelaPrecoB,
        p_regMarg_fatorMultiplicadorB,
        p_regMarg_reduzirImpostos,
        p_regMarg_reduzirTarifaCartao,
        p_regMarg_taxaCapitacaoCustoFi,
        p_regMarg_exibPercMargemCab,
        p_regMarg_exibImagemMargemCab,
        p_regMarg_regraImagemCab,
        p_regMarg_exibPercMargemItem,
        p_regMarg_exibImagemMargemItem,
        p_regMarg_regraImagemItem,
        p_regMarg_exibDetMargemItem,
        r_obrigaFinalizar,
        p_cab_orcamento,
        p_cab_origemDocumento,
        p_cab_tipoDocumento,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataPreco,
        p_cab_pessoa,
        p_cab_dataEntrega,
        p_cab_municipioFatoGerador,
        p_cab_localDestinoOperacao,
        p_cab_indicadorConsumidorFinal,
        p_cab_tipoPagamentoFrete,
        r_cab_quantidade,
        r_cab_pesoLiquido,
        r_cab_pesoBruto,
        r_cab_valorProdutosBruto,
        r_cab_valorProdutos,
        r_cab_valorDescontoProdutos,
        r_cab_valorAcrescimoProdutos,
        r_cab_valorServicosBruto,
        r_cab_valorServicos,
        r_cab_valorDescontoServicos,
        r_cab_valorAcrescimoServicos,
        p_cab_prazoMedioPonderado,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorDescontoTotal,
        r_cab_valorOutrasDespTotal,
        p_cab_valorFreteTotal,
        p_cab_valorSeguroTotal,
        p_cab_valorAdicFreteMarTotal,
        p_cab_valorDespesasAduanTotal,
        r_cab_valorImpostosSomaPag,
        r_cab_valorImpostosDiminuiPag,
        r_cab_valorLiquidoItem,
        p_cab_valorTarifaCartao,
        r_cab_valorMargem,
        p_modDoc_capituloNatFiscal,
        p_modDoc_habilitaAmbiente,
        p_modDoc_tipoPreco,
        p_modDoc_tabelaPreco,
        p_modDoc_fatorMultipPreco,
        p_modDoc_tipoPrecoB,
        p_modDoc_tabelaPrecoB,
        p_modDoc_fatorMultipPrecoB,
        p_modDoc_diminuiDescontoPrUnit,
        p_modDoc_somaAcrescimosPrUnit,
        p_modDoc_somaFreteSeguroPrUnit,
        p_est_grupoFiscal,
        p_pessEst_regimeTributario,
        p_munEndEst_uf,
        p_pess_indicadorInscricaoEstad,
        p_munEndPess_uf,
        p_etOrc_situacaoOrcamento,
        p_item_vendedor,
        comb.gradeProdutoFilho,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_dataEntrega,
        v_item_quantidade,
        p_item_controleEntrega,
        p_item_usarPrecoAVista,
        p_item_percDescontoItem,
        p_item_percAcrescimoItem,
        p_item_observacoesDigitadas,
        p_idEnderecoEstoque,
        p_item_ambiente,
        p_item_amb_observacoes,
        p_atualizarTempMargem,
        p_idItemOrcamentoReferenciado,
        p_idItemDocTransferencia,
        r_buffer_idItemOrcamento,
        /* Retornos */
        r_obrigaFinalizar,
        r_cab_quantidade,
        r_cab_pesoLiquido,
        r_cab_pesoBruto,
        r_cab_valorProdutosBruto,
        r_cab_valorProdutos,
        r_cab_valorDescontoProdutos,
        r_cab_valorAcrescimoProdutos,
        r_cab_valorServicosBruto,
        r_cab_valorServicos,
        r_cab_valorDescontoServicos,
        r_cab_valorAcrescimoServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorDescontoTotal,
        r_cab_valorOutrasDespTotal,
        r_cab_valorImpostosSomaPag,
        r_cab_valorImpostosDiminuiPag,
        r_cab_valorLiquidoItem,
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem,
        r_buffer_idItemOrcamento,
        v_item_valorTotalItem);
      r_item_valorTotalItem := r_item_valorTotalItem + v_item_valorTotalItem;
    ELSE
      v_item_idItemOrcamento := 0;
      ADD_ITEM_PROD_DADOS_BUSCA (
        p_cab_entradaSaida,
        0,
        p_cab_pessoa,
        v_item_quantidade,
        comb.produto,
        comb.unidadeMedida,
        comb.controleQuantidadeVenda,
        comb.unidadeMedidaVenda,
        comb.conversorQuantidadeVenda,
        comb.loteMinimoVenda,
        comb.loteMultiploVenda,
        comb.pesoLiquido,
        comb.pesoBruto,
        comb.altura,
        comb.largura,
        comb.comprimento,
        comb.tipoProduto,
        comb.precoPautaTabelado,
        comb.casasDecimaisUnidadeMedida,
        /* Retornos */
        v_item_servico,
        v_item_controleQuantidade,
        v_item_unidadeMedidaConversao,
        v_item_conversorQuantidade,
        v_item_loteMinimo,
        v_item_loteMultiplo,
        v_item_altura,
        v_item_largura,
        v_item_comprimento,
        v_item_pecas,
        v_item_quantidadeConvertida,
        v_item_pesoLiquido,
        v_item_pesoBruto,
        v_item_precoPautaTabelado);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        NULL,
        p_cab_dataPreco,
        p_cab_pessoa,
        p_modDoc_capituloNatFiscal,
        p_modDoc_tipoPreco,
        p_modDoc_tabelaPreco,
        p_modDoc_fatorMultipPreco,
        p_modDoc_tipoPrecoB,
        p_modDoc_tabelaPrecoB,
        p_modDoc_fatorMultipPrecoB,
        p_munEndEst_uf,
        p_munEndPess_uf,
        p_item_vendedor,
        0,
        0,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_item_quantidade,
        comb.produto,
        comb.cor,
        comb.tamanho,
        comb.controleEstoque,
        v_locEst_indicadorPropPosseIt,
        0,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_tipoPreco,
        v_item_tabelaPreco,
        /* Retornos */
        v_item_tipoPreco,
        v_item_tabelaPreco,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_precoDesconto,
        v_item_precoMinimo,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber);
      v_item_precoUnitarioBruto      := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_item_precoSugestaoAVista ELSE v_item_precoSugestaoAPrazo END;
      v_item_precoUnitario           := v_item_precoUnitarioBruto;
      v_item_valorProdutoServicoBrut := ROUND ((v_item_quantidade * v_item_precoUnitarioBruto), 2);
      v_item_valorProdutoServico     := v_item_valorProdutoServicoBrut;
      v_item_valorDescontoItem       := ROUND ((v_item_valorProdutoServico * p_item_percDescontoItem / 100), 2);
      v_item_valorAcrescimoItem      := ROUND ((v_item_valorProdutoServico * p_item_percAcrescimoItem / 100), 2);
      v_item_operacaoFiscal          := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_pessoa,
        0,
        p_cab_municipioFatoGerador,
        p_cab_indicadorConsumidorFinal,
        p_est_grupoFiscal,
        p_pessEst_regimeTributario,
        p_munEndEst_uf,
        p_pess_indicadorInscricaoEstad,
        p_munEndPess_uf,
        comb.produto);
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        1,
        p_cab_origemDocumento,
        p_cab_tipoDocumento,
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        0,
        TRUNC(SYSDATE),
        p_cab_pessoa,
        0,
        p_cab_indicadorConsumidorFinal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        p_munEndEst_uf,
        p_munEndPess_uf,
        v_item_operacaoFiscal,
        comb.produto,
        comb.tipoProduto,
        comb.origemMercadoria,
        comb.idNcm,
        comb.listaServicos,
        0,
        0,
        v_item_cfop,
        1,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        1,
        v_item_aliquotaIRRF,
        1,
        v_item_aliquotaINSS,
        1,
        v_item_retencaoPIS,
        1,
        v_item_retencaoCOFINS,
        1,
        v_item_retencaoCSLL,
        1,
        v_item_aliquotaII,
        1,
        v_item_aliquotaIOF,
        1,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        1,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        1,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        1,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        1,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        1,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        1,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        0,
        1,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        1,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0,
        '  ',
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        1,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        1,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        /* Retornos */
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_aliquotaIRRF,
        v_item_aliquotaINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_auxNumber,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
      v_item_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_uniqueMachineID,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        ' ',
        0,
        0,
        0,
        0,
        'O',
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        0,
        comb.gradeProdutoFilho,
        0,
        0,
        0,
        v_item_controleQuantidade,
        v_item_loteMultiplo,
        v_item_altura,
        v_item_largura,
        v_item_comprimento,
        v_item_quantidade,
        p_item_observacoesDigitadas);
      ADD_CALCULA_TOTAIS_ITEM (
        p_uniqueMachineID,
        ' ',
        0,
        0,
        0,
        0,
        'O',
        p_cab_entradaSaida,
        0,
        p_cab_tipoPagamentoFrete,
        p_cab_tipoPagamentoFrete,
        0,
        p_modDoc_diminuiDescontoPrUnit,
        p_modDoc_somaAcrescimosPrUnit,
        p_modDoc_somaFreteSeguroPrUnit,
        0,
        v_item_quantidade,
        v_item_quantidadeConvertida,
        v_item_precoUnitarioBruto,
        v_item_precoUnitario,
        v_item_valorProdutoServicoBrut,
        v_item_valorProdutoServico,
        v_item_valorDescontoItem,
        v_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        v_auxNumber,
        v_auxNumber,
        v_item_precoUnitario,
        v_auxNumber,
        v_item_precoUnitarioConvertido,
        v_auxNumber,
        v_item_valorProdutoServico,
        v_auxNumber,
        v_item_valorTotalItem,
        v_auxNumber,
        v_auxNumber,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber);
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        0,
        p_cab_dataEmissao,
        p_cab_pessoa,
        p_cab_localDestinoOperacao,
        p_cab_indicadorConsumidorFinal,
        p_cab_tipoPagamentoFrete,
        p_pess_indicadorInscricaoEstad,
        0,
        v_item_quantidade,
        v_item_precoPautaTabelado,
        v_item_valorProdutoServico,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        0,
        0,
        v_item_cfop,
        1,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0,
        0,
        1,
        v_item_aliquotaIRRF,
        0,
        0,
        1,
        v_item_aliquotaINSS,
        0,
        0,
        1,
        v_item_retencaoPIS,
        0,
        0,
        1,
        v_item_retencaoCOFINS,
        0,
        0,
        1,
        v_item_retencaoCSLL,
        0,
        0,
        1,
        v_item_aliquotaII,
        0,
        0,
        1,
        v_item_aliquotaIOF,
        0,
        0,
        1,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0,
        0,
        0,
        1,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0,
        0,
        1,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0,
        0,
        1,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0,
        0,
        1,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0,
        0,
        1,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0,
        0,
        1,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0,
        0,
        0,
        0,
        0,
        1,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0,
        0,
        1,
        0,
        0,
        0,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0,
        0,
        0,
        '  ',
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0,
        0,
        0,
        0,
        1,
        v_item_aliquotaFCP,
        0,
        0,
        v_item_aliquotaFCPST,
        0,
        0,
        v_item_aliquotaFCPSTAnteriorm,
        0,
        0,
        v_item_aliquotaFCPUFDestinat,
        0,
        0,
        1,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0,
        0,
        0,
        0,
        comb.produto,
        comb.cor,
        comb.tamanho,
        comb.controleEstoque,
        comb.tipoProduto,
        /* Retornos */
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_baseIRRF,
        v_item_valorIRRF,
        v_item_baseINSS,
        v_item_valorINSS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
      ADD_CALCULA_VALOR_LIQUIDO (
        0,
        p_cab_tipoPagamentoFrete,
        p_item_geraFinanceiro,
        v_item_valorProdutoServico,
        0,
        0,
        0,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        v_item_valorIRRF,
        v_item_valorINSS,
        v_item_valorRetPIS,
        v_item_valorRetCOFINS,
        v_item_valorRetCSLL,
        v_item_valorII,
        v_item_valorIOF,
        v_item_valorIPI,
        0,
        v_item_valorICMSST,
        0,
        0,
        0,
        /* Retornos */
        v_item_valorBasePagamento,
        v_item_valorImpostosSomaPag,
        v_item_valorImpostosDiminuiPag,
        v_item_valorLiquidoItem);
      r_cab_quantidade               := r_cab_quantidade + v_item_quantidadeConvertida;
      r_cab_pesoLiquido              := r_cab_pesoLiquido + v_item_pesoLiquido;
      r_cab_pesoBruto                := r_cab_pesoBruto + v_item_pesoBruto;
      IF v_item_servico = 1 THEN
        r_cab_valorServicosBruto     := r_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        r_cab_valorServicos          := r_cab_valorServicos + v_item_valorProdutoServico;
        r_cab_valorDescontoServicos  := r_cab_valorDescontoServicos + v_item_valorDescontoItem;
        r_cab_valorAcrescimoServicos := r_cab_valorAcrescimoServicos + v_item_valorAcrescimoItem;
      ELSE 
        r_cab_valorProdutosBruto     := r_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        r_cab_valorProdutos          := r_cab_valorProdutos + v_item_valorProdutoServico;
        r_cab_valorDescontoProdutos  := r_cab_valorDescontoProdutos + v_item_valorDescontoItem;
        r_cab_valorAcrescimoProdutos := r_cab_valorAcrescimoProdutos + v_item_valorAcrescimoItem;
      END IF;
      r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1 AND p_item_geraFinanceiro = 1 THEN
        r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespTotal;
      END IF;
      r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      r_cab_valorOutrasDespTotal     := r_cab_valorOutrasDespTotal + v_item_valorOutrasDespTotal;
      r_cab_valorImpostosSomaPag     := r_cab_valorImpostosSomaPag + v_item_valorImpostosSomaPag;
      r_cab_valorImpostosDiminuiPag  := r_cab_valorImpostosDiminuiPag + v_item_valorImpostosDiminuiPag;
      r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_cab_orcamento;
      ADD_ORCAMENTO_ITEM_GRAVA (
        p_estabelecimentoAtivo,
        r_obrigaFinalizar,
        p_cab_orcamento,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_etOrc_situacaoOrcamento,
        0,
        v_item_sequencia,
        0,
        0,
        p_item_vendedor,
        0,
        comb.gradeProdutoFilho,
        v_item_servico,
        0,
        'A',
        0,
        0,
        0,
        0,
        0,
        999,
        v_item_operacaoFiscal,
        0,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0,
        p_item_localEstoque,
        0,
        p_item_pessoaParticipante,
        p_item_dataEntrega,
        v_item_controleQuantidade,
        v_item_unidadeMedidaConversao,
        v_item_conversorQuantidade,
        v_item_loteMinimo,
        v_item_loteMultiplo,
        v_item_altura,
        v_item_largura,
        v_item_comprimento,
        v_item_pecas,
        v_item_quantidade,
        v_item_quantidadeConvertida,
        0,
        v_item_quantidade,
        p_item_controleEntrega,
        1,
        v_item_pesoLiquido,
        v_item_pesoBruto,
        v_item_tipoPreco,
        v_item_tabelaPreco,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_precoDesconto,
        v_item_precoMinimo,
        p_item_usarPrecoAVista,
        v_item_precoPautaTabelado,
        v_item_precoUnitarioBruto,
        0,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut,
        v_item_valorProdutoServico,
        p_item_percDescontoItem,
        v_item_valorDescontoItem,
        p_item_percAcrescimoItem,
        v_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        v_item_valorBasePagamento,
        0,
        0,
        0,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        0,
        0,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_aliquotaIRRF,
        v_item_baseIRRF,
        v_item_valorIRRF,
        v_item_aliquotaINSS,
        v_item_baseINSS,
        v_item_valorINSS,
        v_item_retencaoPIS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_retencaoCOFINS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_retencaoCSLL,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_aliquotaII,
        v_item_baseII,
        v_item_valorII,
        v_item_aliquotaIOF,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_aliquotaFCP,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_aliquotaFCPST,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais,
        v_item_valorImpostosSomaPag,
        v_item_valorImpostosDiminuiPag,
        v_item_valorLiquidoItem,
        p_item_observacoesDigitadas,
        v_item_observacoes,
        /* Retornos */
        r_obrigaFinalizar,
        v_item_idItemOrcamento);
        r_item_valorTotalItem    := r_item_valorTotalItem + v_item_valorTotalItem;
        r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(v_item_idItemOrcamento,14,'0'));
      IF p_modDoc_habilitaAmbiente = 1 THEN
        MERGE INTO MOORCAMENTOXAMBIENTES a
        USING (
          SELECT
            v_item_idItemOrcamento idItemOrcamento,
            p_item_ambiente        ambiente,
            p_item_amb_observacoes observacoes
          FROM DUAL
        ) b ON (a.idItemOrcamento = b.idItemOrcamento)
        WHEN MATCHED THEN
          UPDATE SET
            a.ambiente    = b.ambiente,
            a.observacoes = b.observacoes
        WHEN NOT MATCHED THEN
          INSERT (
            idItemOrcamento,
            ambiente,
            observacoes)
          VALUES (
            b.idItemOrcamento,
            b.ambiente,
            b.observacoes);
      END IF;
      IF p_idItemOrcamentoReferenciado > 0 THEN
        ADD_ORCAMENTO_ITEM_ORC_GRAVA (
          p_estabelecimentoAtivo,
          v_item_idItemOrcamento,
          p_idItemOrcamentoReferenciado,
          v_item_quantidade);
      END IF;
      IF p_idItemDocTransferencia > 0 THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          p_cab_entradaSaida,
          p_idItemDocTransferencia,
          v_item_idItemOrcamento,
          v_item_quantidade);
      END IF;
      IF p_idEnderecoEstoque > 0 THEN
        ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          v_item_idItemOrcamento,
          p_idEnderecoEstoque,
          v_item_quantidade,
          v_item_quantidade,
          v_item_observacoes,
          /* Retornos */
          v_auxNumber);
      END IF;
      IF p_atualizarTempMargem = 1 
        AND (p_regMarg_exibPercMargemCab = 1
          OR p_regMarg_exibImagemMargemCab = 1
          OR p_regMarg_exibPercMargemItem = 1
          OR p_regMarg_exibImagemMargemItem = 1
          OR p_regMarg_exibDetMargemItem = 1)
        AND p_cab_tipoDocumento IN (101,102,301,501,503) THEN
        ADD_TEMP_MARGEM_ITEM_GRAVA (
          p_uniqueMachineID,
          p_config_65_casasDecEntrada,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_regMarg_tipoPreco,
          p_regMarg_tabelaPreco,
          p_regMarg_fatorMultiplicador,
          p_regMarg_tipoPrecoB,
          p_regMarg_tabelaPrecoB,
          p_regMarg_fatorMultiplicadorB,
          p_regMarg_reduzirImpostos,
          p_regMarg_reduzirTarifaCartao,
          p_regMarg_taxaCapitacaoCustoFi,
          p_regMarg_exibImagemMargemCab,
          p_regMarg_regraImagemCab,
          p_regMarg_exibImagemMargemItem,
          p_regMarg_regraImagemItem,
          'O',
          p_cab_orcamento,
          p_cab_estabelecimento,
          p_cab_dataPreco,
          p_cab_prazoMedioPonderado,
          p_cab_valorFreteTotal,
          p_cab_valorSeguroTotal,
          p_cab_valorAdicFreteMarTotal,
          p_cab_valorDespesasAduanTotal,
          r_cab_valorLiquidoItem,
          p_cab_valorTarifaCartao,
          r_cab_valorMargem,
          p_munEndEst_uf,
          v_item_sequencia,
          0,
          0,
          0,
          0,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          v_item_quantidade,
          0,
          0,
          0,
          0,
          v_item_valorII,
          v_item_valorIOF,
          v_item_valorIPI,
          0,
          v_item_valorPIS,
          v_item_valorPISST,
          v_item_valorCOFINS,
          v_item_valorCOFINSST,
          v_item_valorCreditoSimplesNac,
          v_item_valorICMSOperacao,
          v_item_valorICMSDiferido,
          v_item_valorICMS,
          v_item_valorICMSDesoneracao,
          v_item_valorICMSST,
          v_item_valorICMSSTAnteriorment,
          v_item_valorICMSUFDestinatario,
          v_item_valorICMSUFRemetente,
          v_item_valorFCP,
          v_item_valorFCPST,
          v_item_valorFCPSTAnteriormente,
          v_item_valorFCPUFDestinatario,
          v_item_valorLiquidoItem,
          comb.produto,
          comb.cor,
          comb.tamanho,
          comb.controleEstoque,
          v_locEst_indicadorPropPosseIt,
          /* Retornos */
          r_cab_valorMargem,
          r_cab_percentualMargem,
          r_cab_imagemMargem,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxVarchar);
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_INSERE_COMB;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_INSERE (
    p_uniqueMachineID              IN VARCHAR2,
    p_usuarioLogado                IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_person_190_modeloFrete       IN CHAR,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibPercMargemCab    IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_obrigaFinalizar              IN NUMBER,
    p_calculoImpostosPendente      IN NUMBER,
    p_manterFinanceiro             IN NUMBER,
    p_nomeTempComposicao           IN VARCHAR2,
    p_temp_sequencia               IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_cab_valorMargem              IN NUMBER,
    p_item_vendedor                IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_servico                 IN NUMBER,
    p_item_atividadeServico        IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_vinculoItemDocumento    IN NUMBER,
    p_item_operacaoFiscal          IN NUMBER,
    p_item_movimentaEstoque        IN NUMBER,
    p_item_geraFinanceiro          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_dataEntrega             IN DATE,
    p_item_controleQuantidade      IN NUMBER,
    p_item_unidadeMedidaConversao  IN VARCHAR2,
    p_item_conversorQuantidade     IN NUMBER,
    p_item_loteMinimo              IN NUMBER,
    p_item_loteMultiplo            IN NUMBER,
    p_item_altura                  IN NUMBER,
    p_item_largura                 IN NUMBER,
    p_item_comprimento             IN NUMBER,
    p_item_pecas                   IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_quantidadeConvertida    IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_item_pesoLiquido             IN NUMBER,
    p_item_pesoBruto               IN NUMBER,
    p_item_tipoPreco               IN CHAR,
    p_item_tabelaPreco             IN VARCHAR2,
    p_item_precoSugestaoAPrazo     IN NUMBER,
    p_item_precoSugestaoAVista     IN NUMBER,
    p_item_precoDesconto           IN NUMBER,
    p_item_precoMinimo             IN NUMBER,
    p_item_usarPrecoAVista         IN NUMBER,
    p_item_precoPautaTabelado      IN NUMBER,
    p_item_precoUnitarioBruto      IN NUMBER,
    p_item_acrescimoUnitarioCompos IN NUMBER,
    p_item_precoUnitario           IN NUMBER,
    p_item_precoUnitarioConvertido IN NUMBER,
    p_item_valorProdutoServicoBrut IN NUMBER,
    p_item_valorProdutoServico     IN NUMBER,
    p_item_percDescontoItem        IN NUMBER,
    p_item_valorDescontoItem       IN NUMBER,
    p_item_percAcrescimoItem       IN NUMBER,
    p_item_valorAcrescimoItem      IN NUMBER,
    p_item_valorFreteItem          IN NUMBER,
    p_item_valorSeguroItem         IN NUMBER,
    p_item_valorAdicFreteMarItem   IN NUMBER,
    p_item_valorDespesasAduanItem  IN NUMBER,
    p_item_valorFreteGeral         IN NUMBER,
    p_item_valorSeguroGeral        IN NUMBER,
    p_item_valorDescontoGeral      IN NUMBER,
    p_item_valorOutrasDespGeral    IN NUMBER,
    p_item_valorAdicFreteMarGeral  IN NUMBER,
    p_item_valorDespesasAduanGeral IN NUMBER,
    p_item_valorFreteTotal         IN NUMBER,
    p_item_valorSeguroTotal        IN NUMBER,
    p_item_valorDescontoTotal      IN NUMBER,
    p_item_valorOutrasDespTotal    IN NUMBER,
    p_item_valorAdicFreteMarTotal  IN NUMBER,
    p_item_valorDespesasAduanTotal IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2,
    p_item_observacoes             IN VARCHAR2,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_prod_tipoProduto             IN CHAR,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_idEnderecoEstoque            IN NUMBER,
    p_idNumeroSerie                IN NUMBER,
    p_item_ambiente                IN NUMBER,
    p_item_amb_observacoes         IN VARCHAR2,
    p_atualizarTempMargem          IN NUMBER,
    p_idItemOrcamentoReferenciado  IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    /* Retornos */
    r_obrigaFinalizar              OUT NUMBER,
    r_calculoImpostosPendente      OUT NUMBER,
    r_cab_modalidadeFrete          OUT CHAR,
    r_cab_ultimoVendedorItem       OUT NUMBER,
    r_cab_quantidade               OUT NUMBER,
    r_cab_pesoLiquido              OUT NUMBER,
    r_cab_pesoBruto                OUT NUMBER,
    r_cab_valorProdutosBruto       OUT NUMBER,
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorDescontoProdutos    OUT NUMBER,
    r_cab_valorAcrescimoProdutos   OUT NUMBER,
    r_cab_valorServicosBruto       OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorDescontoServicos    OUT NUMBER,
    r_cab_valorAcrescimoServicos   OUT NUMBER,
    r_cab_valorFreteItem           OUT NUMBER,
    r_cab_valorSeguroItem          OUT NUMBER,
    r_cab_valorAdicFreteMarItem    OUT NUMBER,
    r_cab_valorDespesasAduanItem   OUT NUMBER,
    r_cab_valorFreteGeral          OUT NUMBER,
    r_cab_valorSeguroGeral         OUT NUMBER,
    r_cab_valorDescontoGeral       OUT NUMBER,
    r_cab_valorOutrasDespGeral     OUT NUMBER,
    r_cab_valorAdicFreteMarGeral   OUT NUMBER,
    r_cab_valorDespesasAduanGeral  OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorPagamentoBruto      OUT NUMBER,
    r_cab_valorPagamentoLiquido    OUT NUMBER,
    r_cab_valorTroco               OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorAdicFreteMarTotal   OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpostosSomaPag     OUT NUMBER,
    r_cab_valorImpostosDiminuiPag  OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2,
    r_idItemOrcamento              OUT NUMBER,
    r_item_valorBasePagamento      OUT NUMBER,
    r_item_valorLiquidoSemFreteSeg OUT NUMBER,
    r_item_valorCaptacao           OUT NUMBER,
    r_item_valorTarifaCartao       OUT NUMBER,
    r_item_valorImpostos           OUT NUMBER,
    r_item_precoCusto              OUT NUMBER,
    r_item_valorCusto              OUT NUMBER,
    r_item_valorMargem             OUT NUMBER,
    r_item_percentualMargem        OUT NUMBER,
    r_item_imagemMargem            OUT VARCHAR2)
IS
    v_auxNumber                    NUMBER;
    v_auxVarchar                   VARCHAR2(256);
    v_cab_origemDocumento          NUMBER;
    v_cab_tipoDocumento            NUMBER;
    v_cab_modeloDocumento          NUMBER;
    v_cab_entradaSaida             CHAR;
    v_cab_atualizaCustoMedio       NUMBER;
    v_cab_estabelecimento          NUMBER;
    v_cab_dataEmissao              DATE;
    v_cab_dataPreco                DATE;
    v_cab_pessoa                   NUMBER;
    v_cab_dataEntrega              DATE;
    v_cab_municipioFatoGerador     NUMBER;
    v_cab_localDestinoOperacao     CHAR;
    v_cab_indicadorConsumidorFinal CHAR;
    v_cab_tipoPagamentoFrete       CHAR;
    v_cab_condicaoPagamento        NUMBER;
    v_cab_numeroParcelas           NUMBER;
    v_cab_somaPrazoParcelas        NUMBER;
    v_cab_valorXPrazoParcelas      NUMBER;
    v_cab_prazoMedio               NUMBER;
    v_cab_prazoMedioPonderado      NUMBER;
    v_cab_valorEntradaMinima       NUMBER;
    v_cab_valorAVistaEntrada       NUMBER;
    v_cab_valorDescontoPagamento   NUMBER;
    v_cab_valorOutrasDespPag       NUMBER;
    v_cab_valorJurosPagamento      NUMBER;
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespTotal     NUMBER;
    v_modDoc_capituloNatFiscal     NUMBER;
    v_modDoc_habilitaAmbiente      NUMBER;
    v_modDoc_tipoPreco             CHAR(1);
    v_modDoc_tabelaPreco           VARCHAR2(10);
    v_modDoc_fatorMultipPreco      NUMBER;
    v_modDoc_tipoPrecoB            CHAR(1);
    v_modDoc_tabelaPrecoB          VARCHAR2(10);
    v_modDoc_fatorMultipPrecoB     NUMBER;
    v_modDoc_diminuiDescontoPrUnit NUMBER;
    v_modDoc_somaAcrescimosPrUnit  NUMBER;
    v_modDoc_somaFreteSeguroPrUnit NUMBER;
    v_est_grupoFiscal              NUMBER;
    v_pessEst_regimeTributario     CHAR(1);
    v_munEndEst_uf                 CHAR(2);
    v_pess_indicadorInscricaoEstad CHAR(1);
    v_munEndPess_uf                CHAR(2);
    v_etOrc_situacaoOrcamento      NUMBER;
    v_prod_controleEstoque         NUMBER;
    v_prod_origemMercadoria        CHAR(1);
    v_prod_idNcm                   NUMBER;
    v_prod_listaServicos           NUMBER;
    v_ativServ_validoPrevisto      NUMBER;
    v_ativServ_habilitaAtivPrev    NUMBER;
    v_opFisc_cfop                  NUMBER;
    v_opFisc_indicadorISSQN        CHAR(1);
    v_opFisc_aliquotaISSQN         NUMBER;
    v_opFisc_aliquotaIRRF          NUMBER;
    v_opFisc_aliquotaINSS          NUMBER;
    v_opFisc_retencaoPIS           NUMBER;
    v_opFisc_retencaoCOFINS        NUMBER;
    v_opFisc_retencaoCSLL          NUMBER;
    v_opFisc_aliquotaII            NUMBER;
    v_opFisc_aliquotaIOF           NUMBER;
    v_opFisc_codigoEnquadramIPI    NUMBER;
    v_opFisc_stIPI                 CHAR(2);
    v_opFisc_aliquotaIPI           NUMBER;
    v_opFisc_valorAliquotaIPI      NUMBER;
    v_opFisc_stPIS                 CHAR(2);
    v_opFisc_aliquotaPIS           NUMBER;
    v_opFisc_valorAliquotaPIS      NUMBER;
    v_opFisc_aliquotaPISST         NUMBER;
    v_opFisc_valorAliquotaPISST    NUMBER;
    v_opFisc_stCOFINS              CHAR(2);
    v_opFisc_aliquotaCOFINS        NUMBER;
    v_opFisc_valorAliquotaCOFINS   NUMBER;
    v_opFisc_aliquotaCOFINSST      NUMBER;
    v_opFisc_valorAliquotaCOFINSST NUMBER;
    v_opFisc_stSimplesNacional     CHAR(3);
    v_opFisc_creditoSimplesNac     NUMBER;
    v_opFisc_stICMS                CHAR(2);
    v_opFisc_modalBaseCalcICMS     CHAR(1);
    v_opFisc_reducaoBaseICMS       NUMBER;
    v_opFisc_aliquotaICMS          NUMBER;
    v_opFisc_diferimentoICMS       NUMBER;
    v_opFisc_motivoDesoneracaoICMS CHAR(2);
    v_opFisc_modalBaseCalcICMSST   CHAR(1);
    v_opFisc_margemValorAdicST     NUMBER;
    v_opFisc_reducaoBaseST         NUMBER;
    v_opFisc_aliquotaICMSST        NUMBER;
    v_opFisc_aliquotaSTSuportConsF NUMBER;
    v_opFisc_reducaoBaseICMSEfetiv NUMBER;
    v_opFisc_aliquotaICMSEfetivo   NUMBER;
    v_opFisc_aliquotaICMSUFDestin  NUMBER;
    v_opFisc_aliquotaICMSInterest  NUMBER;
    v_opFisc_partilhaICMSInterest  NUMBER;
    v_opFisc_aliquotaFCP           NUMBER;
    v_opFisc_aliquotaFCPST         NUMBER;
    v_opFisc_aliquotaFCPSTAnterior NUMBER;
    v_opFisc_aliquotaFCPUFDestin   NUMBER;
    v_cfop_geraFinanceiro          NUMBER;    
    v_item_sequencia               NUMBER;
    v_item_valorDescontoGeral      NUMBER;
    v_item_valorOutrasDespGeral    NUMBER;
    v_item_baseISSQN               NUMBER;
    v_item_valorISSQN              NUMBER;
    v_item_baseIRRF                NUMBER;
    v_item_valorIRRF               NUMBER;
    v_item_baseINSS                NUMBER;
    v_item_valorINSS               NUMBER;
    v_item_baseRetPIS              NUMBER;
    v_item_valorRetPIS             NUMBER;
    v_item_baseRetCOFINS           NUMBER;
    v_item_valorRetCOFINS          NUMBER;
    v_item_baseRetCSLL             NUMBER;
    v_item_valorRetCSLL            NUMBER;
    v_item_baseII                  NUMBER;
    v_item_valorII                 NUMBER;
    v_item_baseIOF                 NUMBER;
    v_item_valorIOF                NUMBER;
    v_item_baseIPI                 NUMBER;
    v_item_valorIPI                NUMBER;
    v_item_basePIS                 NUMBER;
    v_item_valorPIS                NUMBER;
    v_item_basePISST               NUMBER;
    v_item_valorPISST              NUMBER;
    v_item_baseCOFINS              NUMBER;
    v_item_valorCOFINS             NUMBER;
    v_item_baseCOFINSST            NUMBER;
    v_item_valorCOFINSST           NUMBER;
    v_item_baseCreditoSimplesNac   NUMBER;
    v_item_valorCreditoSimplesNac  NUMBER;
    v_item_baseICMS                NUMBER;
    v_item_valorICMSOperacao       NUMBER;
    v_item_valorICMSDiferido       NUMBER;
    v_item_valorICMS               NUMBER;
    v_item_valorICMSDesoneracao    NUMBER;
    v_item_baseICMSST              NUMBER;
    v_item_valorICMSST             NUMBER;
    v_item_baseICMSSTAnteriormente NUMBER;
    v_item_valorICMSSTAnteriorment NUMBER;
    v_item_valorICMSProprioSubstit NUMBER;
    v_item_baseICMSEfetivo         NUMBER;
    v_item_valorICMSEfetivo        NUMBER;
    v_item_baseICMSUFDestinatario  NUMBER;
    v_item_valorICMSUFDestinatario NUMBER;
    v_item_baseICMSUFRemetente     NUMBER;
    v_item_valorICMSUFRemetente    NUMBER;
    v_item_baseFCP                 NUMBER;
    v_item_valorFCP                NUMBER;
    v_item_baseFCPST               NUMBER;
    v_item_valorFCPST              NUMBER;
    v_item_baseFCPSTAnteriormente  NUMBER;
    v_item_valorFCPSTAnteriormente NUMBER;
    v_item_baseFCPUFDestinatario   NUMBER;
    v_item_valorFCPUFDestinatario  NUMBER;
    v_item_aliquotaEstImpFederais  NUMBER;
    v_item_aliquotaEstImpEstaduais NUMBER;
    v_item_aliquotaEstImpMunicipai NUMBER;
    v_item_baseEstimadaImpostos    NUMBER;
    v_item_valorEstImpFederais     NUMBER;
    v_item_valorEstImpEstaduais    NUMBER;
    v_item_valorEstImpMunicipais   NUMBER;
    v_item_valorImpostosSomaPag    NUMBER;
    v_item_valorImpostosDiminuiPag NUMBER;
    v_item_valorLiquidoItem        NUMBER;
    v_idEnderecoEstoqueOrcamento   NUMBER;
    v_buffer_idItemOrcamento       VARCHAR2 (32000);
    v_item_valorTotalItem          NUMBER;
    v_item_valorTotalItemComb      NUMBER;
    v_residuoRateioDescontoItem    NUMBER;
    v_residuoRateioAcrescimoItem   NUMBER;
    v_aj_idItemOrcamento           NUMBER;
    v_aj_valorTotalItem            NUMBER;
    v_aj_servico                   NUMBER;
    v_aj_quantidade                NUMBER;
    v_aj_quantidadeConvertida      NUMBER;
    v_aj_precoUnitarioBruto        NUMBER;
    v_aj_acrescimoUnitarioCompos   NUMBER;
    v_aj_precoUnitario             NUMBER;
    v_aj_precoUnitarioConvertido   NUMBER;
    v_aj_valorProdutoServicoBrut   NUMBER;
    v_aj_valorProdutoServico       NUMBER;
    v_aj_valorDescontoItem         NUMBER;
    v_aj_valorAcrescimoItem        NUMBER;
    v_aj_valorFreteItem            NUMBER;
    v_aj_valorSeguroItem           NUMBER;
    v_aj_valorAdicFreteMarItem     NUMBER;
    v_aj_valorDespesasAduanItem    NUMBER;
    v_aj_valorFreteGeral           NUMBER;
    v_aj_valorSeguroGeral          NUMBER;
    v_aj_valorDescontoGeral        NUMBER;
    v_aj_valorOutrasDespGeral      NUMBER;
    v_aj_valorAdicFreteMarGeral    NUMBER;
    v_aj_valorDespesasAduanGeral   NUMBER;
    v_aj_valorBasePagamento        NUMBER;
    v_aj_valorFreteTotal           NUMBER;
    v_aj_valorSeguroTotal          NUMBER;
    v_aj_valorDescontoTotal        NUMBER;
    v_aj_valorOutrasDespTotal      NUMBER;
    v_aj_valorAdicFreteMarTotal    NUMBER;
    v_aj_valorDespesasAduanTotal   NUMBER;
    v_aj_valorImpostosSomaPag      NUMBER;
    v_aj_valorImpostosDiminuiPag   NUMBER;
    v_aj_valorLiquidoItem          NUMBER;
    v_aj_usarPrecoAVista           NUMBER;
    v_aj_geraFinanceiro            NUMBER;
    v_aj_cfop_geraFinanceiro       NUMBER;
BEGIN
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorOutrasDespGeral    := p_item_valorOutrasDespGeral;
  v_buffer_idItemOrcamento       := '';
  v_item_valorTotalItem          := 0;
  v_item_valorTotalItemComb      := 0;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.modeloDocumento,
    cab.entradaSaida,
    cab.atualizaCustoMedio,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.dataPreco,
    cab.pessoa,
    cab.dataEntrega,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.ultimoVendedorItem,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorImpostosSomaPagamento,
    cab.valorImpostosDiminuiPagamento,
    cab.valorLiquidoItem,
    modDoc.capituloNaturezaFiscal,
    modDoc.habilitaAmbiente,
    modDoc.tipoPreco,
    modDoc.tabelaPreco,
    modDoc.fatorMultiplicadorPreco,
    modDoc.tipoPrecoB,
    modDoc.tabelaPrecoB,
    modDoc.fatorMultiplicadorPrecoB,
    modDoc.diminuiDescontoPrUnit,
    modDoc.somaAcrescimosPrUnit,
    modDoc.somaFreteSeguroPrUnit,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((SELECT MIN(munEst.uf) FROM CAENDERECOSPESSOA endEst JOIN SIMUNICIPIOS munEst ON munEst.municipio = endEst.municipio WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((SELECT MIN(munPess.uf) FROM CAENDERECOSPESSOA endPess JOIN SIMUNICIPIOS munPess ON munPess.municipio = endPess.municipio WHERE endPess.pessoa = cab.pessoa AND endPess.ativo = 1 AND endPess.principal = 1), '  '),
    etOrc.situacaoOrcamento
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_modeloDocumento,
    v_cab_entradaSaida,
    v_cab_atualizaCustoMedio,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataPreco,
    v_cab_pessoa,
    v_cab_dataEntrega,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    r_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    r_cab_ultimoVendedorItem,
    r_cab_quantidade,
    r_cab_pesoLiquido,
    r_cab_pesoBruto,
    r_cab_valorProdutosBruto,
    r_cab_valorProdutos,
    r_cab_valorDescontoProdutos,
    r_cab_valorAcrescimoProdutos,
    r_cab_valorServicosBruto,
    r_cab_valorServicos,
    r_cab_valorDescontoServicos,
    r_cab_valorAcrescimoServicos,
    r_cab_valorFreteItem,
    r_cab_valorSeguroItem,
    r_cab_valorAdicFreteMarItem,
    r_cab_valorDespesasAduanItem,
    r_cab_valorFreteGeral,
    r_cab_valorSeguroGeral,
    r_cab_valorDescontoGeral,
    r_cab_valorOutrasDespGeral,
    r_cab_valorAdicFreteMarGeral,
    r_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    r_cab_valorBasePagamento,
    r_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    r_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPag,
    v_cab_valorJurosPagamento,
    r_cab_valorPagamentoLiquido,
    r_cab_valorTroco,
    r_cab_valorFreteTotal,
    r_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespTotal,
    r_cab_valorAdicFreteMarTotal,
    r_cab_valorDespesasAduanTotal,
    r_cab_valorImpostosSomaPag,
    r_cab_valorImpostosDiminuiPag,
    r_cab_valorLiquidoItem,
    v_modDoc_capituloNatFiscal,
    v_modDoc_habilitaAmbiente,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_munEndPess_uf,
    v_etOrc_situacaoOrcamento
  FROM MOORCAMENTOS cab
  JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess ON pess.pessoa = cab.pessoa
  JOIN PAETAPASORCAMENTO etOrc ON etOrc.etapaOrcamento = cab.etapaOrcamento
  WHERE cab.orcamento = p_cab_orcamento;
  SELECT
    prod.controleEstoque,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos
  INTO
    v_prod_controleEstoque,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  SELECT
    ativServ.validoPrevisto,
    ativServ.habilitaAtividadePrevista
  INTO
    v_ativServ_validoPrevisto,
    v_ativServ_habilitaAtivPrev
  FROM PAATIVIDADESSERVICO ativServ
  WHERE ativServ.atividadeServico = p_item_atividadeServico;
  SELECT
    opFisc.cfop,
    opFisc.indicadorISSQN,
    opFisc.aliquotaISSQN,
    opFisc.aliquotaIRRF,
    opFisc.aliquotaINSS,
    opFisc.retencaoPIS,
    opFisc.retencaoCOFINS,
    opFisc.retencaoCSLL,
    opFisc.aliquotaII,
    opFisc.aliquotaIOF,
    opFisc.codigoEnquadramentoIPI,
    opFisc.stIPI,
    opFisc.aliquotaIPI,
    opFisc.valorAliquotaIPI,
    opFisc.stPIS,
    opFisc.aliquotaPIS,
    opFisc.valorAliquotaPIS,
    opFisc.aliquotaPISST,
    opFisc.valorAliquotaPISST,
    opFisc.stCOFINS,
    opFisc.aliquotaCOFINS,
    opFisc.valorAliquotaCOFINS,
    opFisc.aliquotaCOFINSST,
    opFisc.valorAliquotaCOFINSST,
    opFisc.stSimplesNacional,
    opFisc.creditoSimplesNacional,
    opFisc.stICMS,
    opFisc.modalidadeBaseCalcICMS,
    opFisc.reducaoBaseICMS,
    opFisc.aliquotaICMS,
    opFisc.diferimentoICMS,
    opFisc.motivoDesoneracaoICMS,
    opFisc.modalidadeBaseCalcICMSST,
    opFisc.margemValorAdicionadoST,
    opFisc.reducaoBaseST,
    opFisc.aliquotaICMSST,
    opFisc.aliquotaSTSuportConsFinal,
    opFisc.reducaoBaseICMSEfetivo,
    opFisc.aliquotaICMSEfetivo,
    opFisc.aliquotaICMSUFDestinatario,
    opFisc.aliquotaICMSInterestadual,
    opFisc.partilhaICMSInterestadual,
    opFisc.aliquotaFCP,
    opFisc.aliquotaFCPST,
    opFisc.aliquotaFCPSTAnteriormente,
    opFisc.aliquotaFCPUFDestinatario,
    cfop.geraFinanceiro
  INTO
    v_opFisc_cfop,
    v_opFisc_indicadorISSQN,
    v_opFisc_aliquotaISSQN,
    v_opFisc_aliquotaIRRF,
    v_opFisc_aliquotaINSS,
    v_opFisc_retencaoPIS,
    v_opFisc_retencaoCOFINS,
    v_opFisc_retencaoCSLL,
    v_opFisc_aliquotaII,
    v_opFisc_aliquotaIOF,
    v_opFisc_codigoEnquadramIPI,
    v_opFisc_stIPI,
    v_opFisc_aliquotaIPI,
    v_opFisc_valorAliquotaIPI,
    v_opFisc_stPIS,
    v_opFisc_aliquotaPIS,
    v_opFisc_valorAliquotaPIS,
    v_opFisc_aliquotaPISST,
    v_opFisc_valorAliquotaPISST,
    v_opFisc_stCOFINS,
    v_opFisc_aliquotaCOFINS,
    v_opFisc_valorAliquotaCOFINS,
    v_opFisc_aliquotaCOFINSST,
    v_opFisc_valorAliquotaCOFINSST,
    v_opFisc_stSimplesNacional,
    v_opFisc_creditoSimplesNac,
    v_opFisc_stICMS,
    v_opFisc_modalBaseCalcICMS,
    v_opFisc_reducaoBaseICMS,
    v_opFisc_aliquotaICMS,
    v_opFisc_diferimentoICMS,
    v_opFisc_motivoDesoneracaoICMS,
    v_opFisc_modalBaseCalcICMSST,
    v_opFisc_margemValorAdicST,
    v_opFisc_reducaoBaseST,
    v_opFisc_aliquotaICMSST,
    v_opFisc_aliquotaSTSuportConsF,
    v_opFisc_reducaoBaseICMSEfetiv,
    v_opFisc_aliquotaICMSEfetivo,
    v_opFisc_aliquotaICMSUFDestin,
    v_opFisc_aliquotaICMSInterest,
    v_opFisc_partilhaICMSInterest,
    v_opFisc_aliquotaFCP,
    v_opFisc_aliquotaFCPST,
    v_opFisc_aliquotaFCPSTAnterior,
    v_opFisc_aliquotaFCPUFDestin,
    v_cfop_geraFinanceiro
  FROM PAOPERACOESFISCAIS opFisc
  JOIN SICFOPS cfop ON cfop.cfop = opFisc.cfop
  WHERE opFisc.operacaoFiscal = p_item_operacaoFiscal;
  r_obrigaFinalizar         := p_obrigaFinalizar;
  r_calculoImpostosPendente := p_calculoImpostosPendente;
  r_cab_valorMargem         := p_cab_valorMargem;
  r_idItemOrcamento         := 0;
  IF p_manterFinanceiro = 0
    AND (r_cab_valorFreteGeral <> 0
      OR r_cab_valorSeguroGeral <> 0
      OR r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR r_cab_valorAdicFreteMarGeral <> 0
      OR r_cab_valorDespesasAduanGeral <> 0) THEN
    r_calculoImpostosPendente := 1;
  END IF;
  IF p_manterFinanceiro = 0
    AND (r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR r_cab_valorPagamentoBruto <> 0) THEN
    r_calculoImpostosPendente := 1;
    ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
      r_calculoImpostosPendente,
      p_cab_orcamento,
      r_cab_valorDescontoGeral,
      r_cab_valorOutrasDespGeral,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPag,
      v_cab_valorJurosPagamento,
      0,
      v_item_valorDescontoGeral,
      v_item_valorOutrasDespGeral,
      0,
      0,
      0,
      /* Retornos */
      r_calculoImpostosPendente,
      r_cab_valorDescontoGeral,
      r_cab_valorOutrasDespGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      r_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPag,
      v_cab_valorJurosPagamento,
      r_cab_valorPagamentoLiquido,
      r_cab_valorTroco,
      v_item_valorDescontoGeral,
      v_item_valorOutrasDespGeral,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber
    );
  END IF;
  r_cab_ultimoVendedorItem := p_item_vendedor;
  IF v_prod_controleEstoque = 3 THEN
    v_auxNumber := 0;
    ADD_ORCAMENTO_ITEM_INSERE_COMB (
      p_uniqueMachineID,
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_estabelecimentoAtivo,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibPercMargemCab,
      p_regMarg_exibImagemMargemCab,
      p_regMarg_regraImagemCab,
      p_regMarg_exibPercMargemItem,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      p_regMarg_exibDetMargemItem,
      r_obrigaFinalizar,
      p_cab_orcamento,
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_modeloDocumento,
      v_cab_entradaSaida,
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataPreco,
      v_cab_pessoa,
      v_cab_dataEntrega,
      v_cab_municipioFatoGerador,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_cab_tipoPagamentoFrete,
      r_cab_quantidade,
      r_cab_pesoLiquido,
      r_cab_pesoBruto,
      r_cab_valorProdutosBruto,
      r_cab_valorProdutos,
      r_cab_valorDescontoProdutos,
      r_cab_valorAcrescimoProdutos,
      r_cab_valorServicosBruto,
      r_cab_valorServicos,
      r_cab_valorDescontoServicos,
      r_cab_valorAcrescimoServicos,
      v_cab_prazoMedioPonderado,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespTotal,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorAdicFreteMarTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpostosSomaPag,
      r_cab_valorImpostosDiminuiPag,
      r_cab_valorLiquidoItem,
      p_cab_valorTarifaCartao,
      r_cab_valorMargem,
      v_modDoc_capituloNatFiscal,
      v_modDoc_habilitaAmbiente,
      v_modDoc_tipoPreco,
      v_modDoc_tabelaPreco,
      v_modDoc_fatorMultipPreco,
      v_modDoc_tipoPrecoB,
      v_modDoc_tabelaPrecoB,
      v_modDoc_fatorMultipPrecoB,
      v_modDoc_diminuiDescontoPrUnit,
      v_modDoc_somaAcrescimosPrUnit,
      v_modDoc_somaFreteSeguroPrUnit,
      v_est_grupoFiscal,
      v_pessEst_regimeTributario,
      v_munEndEst_uf,
      v_pess_indicadorInscricaoEstad,
      v_munEndPess_uf,
      v_etOrc_situacaoOrcamento,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_movimentaEstoque,
      p_item_geraFinanceiro,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_dataEntrega,
      p_item_quantidade,
      p_item_controleEntrega,
      p_item_usarPrecoAVista,
      p_item_percDescontoItem,
      p_item_percAcrescimoItem,
      p_item_observacoesDigitadas,
      p_idEnderecoEstoque,
      p_item_ambiente,
      p_item_amb_observacoes,
      p_atualizarTempMargem,
      p_idItemOrcamentoReferenciado,
      p_idItemDocTransferencia,
      v_buffer_idItemOrcamento,
      /* Retornos */
      r_obrigaFinalizar,
      r_cab_quantidade,
      r_cab_pesoLiquido,
      r_cab_pesoBruto,
      r_cab_valorProdutosBruto,
      r_cab_valorProdutos,
      r_cab_valorDescontoProdutos,
      r_cab_valorAcrescimoProdutos,
      r_cab_valorServicosBruto,
      r_cab_valorServicos,
      r_cab_valorDescontoServicos,
      r_cab_valorAcrescimoServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespTotal,
      r_cab_valorImpostosSomaPag,
      r_cab_valorImpostosDiminuiPag,
      r_cab_valorLiquidoItem,
      r_cab_valorMargem,
      r_cab_percentualMargem,
      r_cab_imagemMargem,
      v_buffer_idItemOrcamento,
      v_item_valorTotalItemComb);
      ADD_CALCULA_TOTAIS_ITEM (
        p_uniqueMachineID,
        ' ',
        0,
        0,
        0,
        0,
        'O',
        v_cab_entradaSaida,
        0,
        v_cab_tipoPagamentoFrete,
        v_cab_tipoPagamentoFrete,
        0,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        0,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_precoUnitario,
        p_item_valorProdutoServicoBrut,
        p_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        p_item_valorDescontoTotal,
        p_item_valorOutrasDespTotal,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_valorTotalItem,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber);
    IF v_item_valorTotalItem <> 0 AND v_item_valorTotalItem <> v_item_valorTotalItemComb THEN
      v_residuoRateioDescontoItem  := 0;
      v_residuoRateioAcrescimoItem := 0;
      WHILE v_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(v_buffer_idItemOrcamento)) >= 14
      LOOP
        v_aj_idItemOrcamento     := TO_NUMBER(SUBSTR(v_buffer_idItemOrcamento, 1, 14));
        v_aj_valorTotalItem      := 0;
        v_buffer_idItemOrcamento := RTRIM(SUBSTR(v_buffer_idItemOrcamento,16,32000));
        SELECT
          a.servico,
          a.quantidade,
          a.quantidadeConvertida,
          a.precoUnitarioBruto,
          a.acrescimoUnitarioComposicao,
          a.precoUnitario,
          a.precoUnitarioConvertido,
          a.valorProdutoServicoBruto,
          a.valorProdutoServico,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorBasePagamento,
          a.valorFreteTotal,
          a.valorSeguroTotal,
          a.valorDescontoTotal,
          a.valorOutrasDespesasTotal,
          a.valorAdicFreteMarinhaMerTotal,
          a.valorDespesasAduaneirasTotal,
          a.valorImpostosSomaPagamento,
          a.valorImpostosDiminuiPagamento,
          a.valorLiquidoItem,
          a.usarPrecoAVista,
          a.geraFinanceiro,
          cfop.geraFinanceiro
        INTO
          v_aj_servico,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_acrescimoUnitarioCompos,
          v_aj_precoUnitario,
          v_aj_precoUnitarioConvertido,
          v_aj_valorProdutoServicoBrut,
          v_aj_valorProdutoServico,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          v_aj_valorFreteItem,
          v_aj_valorSeguroItem,
          v_aj_valorAdicFreteMarItem,
          v_aj_valorDespesasAduanItem,
          v_aj_valorFreteGeral,
          v_aj_valorSeguroGeral,
          v_aj_valorDescontoGeral,
          v_aj_valorOutrasDespGeral,
          v_aj_valorAdicFreteMarGeral,
          v_aj_valorDespesasAduanGeral,
          v_aj_valorBasePagamento,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_aj_valorImpostosSomaPag,
          v_aj_valorImpostosDiminuiPag,
          v_aj_valorLiquidoItem,
          v_aj_usarPrecoAVista,
          v_aj_geraFinanceiro,
          v_aj_cfop_geraFinanceiro
        FROM MOORCAMENTOXITENS a
        JOIN SICFOPS cfop ON cfop.cfop = a.cfop
        WHERE a.idItemOrcamento = v_aj_idItemOrcamento;        
        IF v_aj_servico = 1 THEN
          r_cab_valorServicosBruto       := r_cab_valorServicosBruto      - v_aj_valorProdutoServicoBrut;
          r_cab_valorServicos            := r_cab_valorServicos           - v_aj_valorProdutoServico;
          r_cab_valorDescontoServicos    := r_cab_valorDescontoServicos   - v_aj_valorDescontoItem;
          r_cab_valorAcrescimoServicos   := r_cab_valorAcrescimoServicos  - v_aj_valorAcrescimoItem;
        ELSE 
          r_cab_valorProdutosBruto       := r_cab_valorProdutosBruto      - v_aj_valorProdutoServicoBrut;
          r_cab_valorProdutos            := r_cab_valorProdutos           - v_aj_valorProdutoServico;
          r_cab_valorDescontoProdutos    := r_cab_valorDescontoProdutos   - v_aj_valorDescontoItem;
          r_cab_valorAcrescimoProdutos   := r_cab_valorAcrescimoProdutos  - v_aj_valorAcrescimoItem;
        END IF;
        r_cab_valorFreteItem           := r_cab_valorFreteItem          - v_aj_valorFreteItem;
        r_cab_valorSeguroItem          := r_cab_valorSeguroItem         - v_aj_valorSeguroItem;
        r_cab_valorAdicFreteMarItem    := r_cab_valorAdicFreteMarItem   - v_aj_valorAdicFreteMarItem;
        r_cab_valorDespesasAduanItem   := r_cab_valorDespesasAduanItem  - v_aj_valorDespesasAduanItem;
        r_cab_valorFreteGeral          := r_cab_valorFreteGeral         - v_aj_valorFreteGeral;
        r_cab_valorSeguroGeral         := r_cab_valorSeguroGeral        - v_aj_valorSeguroGeral;
        r_cab_valorDescontoGeral       := r_cab_valorDescontoGeral      - v_aj_valorDescontoGeral;
        r_cab_valorOutrasDespGeral     := r_cab_valorOutrasDespGeral    - v_aj_valorOutrasDespGeral;
        r_cab_valorAdicFreteMarGeral   := r_cab_valorAdicFreteMarGeral  - v_aj_valorAdicFreteMarGeral;
        r_cab_valorDespesasAduanGeral  := r_cab_valorDespesasAduanGeral - v_aj_valorDespesasAduanGeral;
        r_cab_valorBasePagamento       := r_cab_valorBasePagamento      - v_aj_valorBasePagamento;
        r_item_valorBasePagamento      := r_item_valorBasePagamento     - v_aj_valorBasePagamento;
        IF v_aj_usarPrecoAVista = 1 AND v_aj_geraFinanceiro = 1 AND v_aj_cfop_geraFinanceiro = 1 THEN
          r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo - v_aj_valorProdutoServico + v_aj_valorDescontoTotal - v_aj_valorOutrasDespTotal;
        END IF;
        r_cab_valorFreteTotal          := r_cab_valorFreteTotal         - v_aj_valorFreteTotal;
        r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal        - v_aj_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal      - v_aj_valorDescontoTotal;
        v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal    - v_aj_valorOutrasDespTotal;
        r_cab_valorAdicFreteMarTotal   := r_cab_valorAdicFreteMarTotal  - v_aj_valorAdicFreteMarTotal;
        r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal - v_aj_valorDespesasAduanTotal;
        r_cab_valorImpostosSomaPag     := r_cab_valorImpostosSomaPag    - v_aj_valorImpostosSomaPag;
        r_cab_valorImpostosDiminuiPag  := r_cab_valorImpostosDiminuiPag - v_aj_valorImpostosDiminuiPag;
        r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem        - v_aj_valorLiquidoItem;
        -- Total item original        
        ADD_CALCULA_TOTAIS_ITEM (
          p_uniqueMachineID,
          ' ',
          0,
          0,
          0,
          0,
          'O',
          v_cab_entradaSaida,
          0,
          v_cab_tipoPagamentoFrete,
          v_cab_tipoPagamentoFrete,
          0,
          v_modDoc_diminuiDescontoPrUnit,
          v_modDoc_somaAcrescimosPrUnit,
          v_modDoc_somaFreteSeguroPrUnit,
          0,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_precoUnitario,
          v_aj_valorProdutoServicoBrut,
          v_aj_valorProdutoServico,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          /* Retornos */
          v_aj_acrescimoUnitarioCompos,
          v_auxNumber,
          v_aj_precoUnitario,
          v_auxNumber,
          v_aj_precoUnitarioConvertido,
          v_auxNumber,
          v_aj_valorProdutoServico,
          v_auxNumber,
          v_aj_valorTotalItem,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber);
        v_aj_valorDescontoItem       := v_aj_valorDescontoItem
                                        + ROUND(
                                            CASE
                                              WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
                                              THEN v_item_valorTotalItemComb - v_item_valorTotalItem
                                              ELSE 0
                                            END
                                            * v_aj_valorTotalItem / v_item_valorTotalItemComb
                                            + v_residuoRateioDescontoItem,2);
        v_residuoRateioDescontoItem  := CASE
                                          WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
                                          THEN v_item_valorTotalItemComb - v_item_valorTotalItem
                                          ELSE 0
                                        END
                                        * v_aj_valorTotalItem / v_item_valorTotalItemComb
                                        + v_residuoRateioDescontoItem
                                        - ROUND(
                                            CASE
                                              WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
                                              THEN v_item_valorTotalItemComb - v_item_valorTotalItem
                                              ELSE 0
                                            END
                                            * v_aj_valorTotalItem / v_item_valorTotalItemComb
                                            + v_residuoRateioDescontoItem,2);
        v_aj_valorAcrescimoItem      := v_aj_valorAcrescimoItem
                                        + ROUND(
                                            CASE
                                              WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
                                              THEN v_item_valorTotalItem - v_item_valorTotalItemComb
                                              ELSE 0
                                            END
                                            * v_aj_valorTotalItem / v_item_valorTotalItemComb
                                            + v_residuoRateioAcrescimoItem,2);
        v_residuoRateioAcrescimoItem := CASE
                                          WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
                                          THEN v_item_valorTotalItem - v_item_valorTotalItemComb
                                          ELSE 0
                                        END
                                        * v_aj_valorTotalItem / v_item_valorTotalItemComb
                                        + v_residuoRateioAcrescimoItem
                                        - ROUND(
                                            CASE 
                                              WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
                                              THEN v_item_valorTotalItem - v_item_valorTotalItemComb
                                              ELSE 0
                                            END
                                            * v_aj_valorTotalItem / v_item_valorTotalItemComb
                                            + v_residuoRateioAcrescimoItem,2);
        -- Total item novo
        ADD_CALCULA_TOTAIS_ITEM (
          p_uniqueMachineID,
          ' ',
          0,
          0,
          0,
          0,
          'O',
          v_cab_entradaSaida,
          0,
          v_cab_tipoPagamentoFrete,
          v_cab_tipoPagamentoFrete,
          0,
          v_modDoc_diminuiDescontoPrUnit,
          v_modDoc_somaAcrescimosPrUnit,
          v_modDoc_somaFreteSeguroPrUnit,
          0,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_precoUnitario,
          v_aj_valorProdutoServicoBrut,
          v_aj_valorProdutoServico,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          /* Retornos */
          v_aj_acrescimoUnitarioCompos,
          v_auxNumber,
          v_aj_precoUnitario,
          v_auxNumber,
          v_aj_precoUnitarioConvertido,
          v_auxNumber,
          v_aj_valorProdutoServico,
          v_auxNumber,
          v_aj_valorTotalItem,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber);
        IF v_aj_servico = 1 THEN
          r_cab_valorServicosBruto       := r_cab_valorServicosBruto      + v_aj_valorProdutoServicoBrut;
          r_cab_valorServicos            := r_cab_valorServicos           + v_aj_valorProdutoServico;
          r_cab_valorDescontoServicos    := r_cab_valorDescontoServicos   + v_aj_valorDescontoItem;
          r_cab_valorAcrescimoServicos   := r_cab_valorAcrescimoServicos  + v_aj_valorAcrescimoItem;
        ELSE 
          r_cab_valorProdutosBruto       := r_cab_valorProdutosBruto      + v_aj_valorProdutoServicoBrut;
          r_cab_valorProdutos            := r_cab_valorProdutos           + v_aj_valorProdutoServico;
          r_cab_valorDescontoProdutos    := r_cab_valorDescontoProdutos   + v_aj_valorDescontoItem;
          r_cab_valorAcrescimoProdutos   := r_cab_valorAcrescimoProdutos  + v_aj_valorAcrescimoItem;
        END IF;
        r_cab_valorFreteItem           := r_cab_valorFreteItem          + v_aj_valorFreteItem;
        r_cab_valorSeguroItem          := r_cab_valorSeguroItem         + v_aj_valorSeguroItem;
        r_cab_valorAdicFreteMarItem    := r_cab_valorAdicFreteMarItem   + v_aj_valorAdicFreteMarItem;
        r_cab_valorDespesasAduanItem   := r_cab_valorDespesasAduanItem  + v_aj_valorDespesasAduanItem;
        r_cab_valorFreteGeral          := r_cab_valorFreteGeral         + v_aj_valorFreteGeral;
        r_cab_valorSeguroGeral         := r_cab_valorSeguroGeral        + v_aj_valorSeguroGeral;
        r_cab_valorDescontoGeral       := r_cab_valorDescontoGeral      + v_aj_valorDescontoGeral;
        r_cab_valorOutrasDespGeral     := r_cab_valorOutrasDespGeral    + v_aj_valorOutrasDespGeral;
        r_cab_valorAdicFreteMarGeral   := r_cab_valorAdicFreteMarGeral  + v_aj_valorAdicFreteMarGeral;
        r_cab_valorDespesasAduanGeral  := r_cab_valorDespesasAduanGeral + v_aj_valorDespesasAduanGeral;
        r_cab_valorBasePagamento       := r_cab_valorBasePagamento      + v_aj_valorBasePagamento;
        r_item_valorBasePagamento      := r_item_valorBasePagamento     + v_aj_valorBasePagamento;
        IF v_aj_usarPrecoAVista = 1 AND v_aj_geraFinanceiro = 1 AND v_aj_cfop_geraFinanceiro = 1 THEN
          r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_aj_valorProdutoServico - v_aj_valorDescontoTotal + v_aj_valorOutrasDespTotal;
        END IF;
        r_cab_valorFreteTotal          := r_cab_valorFreteTotal         + v_aj_valorFreteTotal;
        r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal        + v_aj_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal      + v_aj_valorDescontoTotal;
        v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal    + v_aj_valorOutrasDespTotal;
        r_cab_valorAdicFreteMarTotal   := r_cab_valorAdicFreteMarTotal  + v_aj_valorAdicFreteMarTotal;
        r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_aj_valorDespesasAduanTotal;
        r_cab_valorImpostosSomaPag     := r_cab_valorImpostosSomaPag    + v_aj_valorImpostosSomaPag;
        r_cab_valorImpostosDiminuiPag  := r_cab_valorImpostosDiminuiPag + v_aj_valorImpostosDiminuiPag;
        r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem        + v_aj_valorLiquidoItem;
        r_calculoImpostosPendente      := 1;
        UPDATE MOORCAMENTOXITENS SET
          acrescimoUnitarioComposicao   = v_aj_acrescimoUnitarioCompos,
          precoUnitario                 = v_aj_precoUnitario,
          precoUnitarioConvertido       = v_aj_precoUnitarioConvertido,
          valorProdutoServico           = v_aj_valorProdutoServico,
          percDescontoItem              = CASE WHEN v_aj_valorProdutoServicoBrut = 0 THEN 0 ELSE ROUND(100* v_aj_valorDescontoItem / v_aj_valorProdutoServicoBrut,4) END,
          valorDescontoItem             = v_aj_valorDescontoItem,
          percAcrescimoItem              = CASE WHEN v_aj_valorProdutoServicoBrut = 0 THEN 0 ELSE ROUND(100* v_aj_valorAcrescimoItem / v_aj_valorProdutoServicoBrut,4) END,
          valorAcrescimoItem            = v_aj_valorAcrescimoItem,
          valorFreteTotal               = v_aj_valorFreteTotal,
          valorSeguroTotal              = v_aj_valorSeguroTotal,
          valorDescontoTotal            = v_aj_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_aj_valorOutrasDespTotal,
          valorAdicFreteMarinhaMerTotal = v_aj_valorAdicFreteMarTotal,
          valorDespesasAduaneirasTotal  = v_aj_valorDespesasAduanTotal
        WHERE idItemOrcamento = v_aj_idItemOrcamento;
      END LOOP;
    END IF;
  ELSE
    r_item_valorBasePagamento      := 0;
    v_item_aliquotaEstImpFederais  := 0;
    v_item_aliquotaEstImpEstaduais := 0;
    v_item_aliquotaEstImpMunicipai := 0;
    IF v_cab_entradaSaida = 'S' THEN
      ADD_BUSCA_IBPT (
        v_cab_dataEmissao,
        v_munEndEst_uf,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        /* Retornos */
        v_auxNumber,
        v_auxNumber,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        v_auxVarchar,
        v_auxVarchar,
        v_auxVarchar
      );
    END IF;
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      v_cab_entradaSaida,
      0,
      v_cab_estabelecimento,
      0,
      v_cab_dataEmissao,
      v_cab_pessoa,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_cab_tipoPagamentoFrete,
      v_pess_indicadorInscricaoEstad,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoPautaTabelado,
      p_item_valorProdutoServico,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      p_item_valorAdicFreteMarTotal,
      p_item_valorDespesasAduanTotal,
      v_opFisc_cfop,
      1,
      v_opFisc_indicadorISSQN,
      v_opFisc_aliquotaISSQN,
      0,
      0,
      1,
      v_opFisc_aliquotaIRRF,
      0,
      0,
      1,
      v_opFisc_aliquotaINSS,
      0,
      0,
      1,
      v_opFisc_retencaoPIS,
      0,
      0,
      1,
      v_opFisc_retencaoCOFINS,
      0,
      0,
      1,
      v_opFisc_retencaoCSLL,
      0,
      0,
      1,
      v_opFisc_aliquotaII,
      0,
      0,
      1,
      v_opFisc_aliquotaIOF,
      0,
      0,
      1,
      v_opFisc_aliquotaIPI,
      v_opFisc_valorAliquotaIPI,
      0,
      0,
      0,
      1,
      v_opFisc_aliquotaPIS,
      v_opFisc_valorAliquotaPIS,
      0,
      0,
      1,
      v_opFisc_aliquotaPISST,
      v_opFisc_valorAliquotaPISST,
      0,
      0,
      1,
      v_opFisc_aliquotaCOFINS,
      v_opFisc_valorAliquotaCOFINS,
      0,
      0,
      1,
      v_opFisc_aliquotaCOFINSST,
      v_opFisc_valorAliquotaCOFINSST,
      0,
      0,
      1,
      v_opFisc_stSimplesNacional,
      v_opFisc_creditoSimplesNac,
      0,
      0,
      1,
      v_opFisc_stICMS,
      v_opFisc_modalBaseCalcICMS,
      v_opFisc_reducaoBaseICMS,
      v_opFisc_aliquotaICMS,
      v_opFisc_diferimentoICMS,
      0,
      0,
      0,
      0,
      0,
      1,
      v_opFisc_modalBaseCalcICMSST,
      v_opFisc_margemValorAdicST,
      v_opFisc_reducaoBaseST,
      v_opFisc_aliquotaICMSST,
      0,
      0,
      1,
      0,
      0,
      0,
      v_opFisc_reducaoBaseICMSEfetiv,
      v_opFisc_aliquotaICMSEfetivo,
      0,
      0,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_aliquotaICMSUFDestin ELSE 0 END),
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_aliquotaICMSInterest ELSE 0 END),
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_partilhaICMSInterest ELSE 0 END),
      0,
      0,
      0,
      0,
      1,
      v_opFisc_aliquotaFCP,
      0,
      0,
      v_opFisc_aliquotaFCPST,
      0,
      0,
      v_opFisc_aliquotaFCPSTAnterior,
      0,
      0,
      v_opFisc_aliquotaFCPUFDestin,
      0,
      0,
      1,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai,
      0,
      0,
      0,
      0,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_prod_controleEstoque,
      p_prod_tipoProduto,
      /* Retornos */
      v_item_baseISSQN,
      v_item_valorISSQN,
      v_item_baseIRRF,
      v_item_valorIRRF,
      v_item_baseINSS,
      v_item_valorINSS,
      v_item_baseRetPIS,
      v_item_valorRetPIS,
      v_item_baseRetCOFINS,
      v_item_valorRetCOFINS,
      v_item_baseRetCSLL,
      v_item_valorRetCSLL,
      v_item_baseII,
      v_item_valorII,
      v_item_baseIOF,
      v_item_valorIOF,
      v_item_baseIPI,
      v_item_valorIPI,
      v_item_basePIS,
      v_item_valorPIS,
      v_item_basePISST,
      v_item_valorPISST,
      v_item_baseCOFINS,
      v_item_valorCOFINS,
      v_item_baseCOFINSST,
      v_item_valorCOFINSST,
      v_item_baseCreditoSimplesNac,
      v_item_valorCreditoSimplesNac,
      v_item_baseICMS,
      v_item_valorICMSOperacao,
      v_item_valorICMSDiferido,
      v_item_valorICMS,
      v_item_valorICMSDesoneracao,
      v_item_baseICMSST,
      v_item_valorICMSST,
      v_item_baseICMSSTAnteriormente,
      v_item_valorICMSSTAnteriorment,
      v_item_valorICMSProprioSubstit,
      v_item_baseICMSEfetivo,
      v_item_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_item_baseICMSUFDestinatario,
      v_item_valorICMSUFDestinatario,
      v_item_baseICMSUFRemetente,
      v_item_valorICMSUFRemetente,
      v_item_baseFCP,
      v_item_valorFCP,
      v_item_baseFCPST,
      v_item_valorFCPST,
      v_item_baseFCPSTAnteriormente,
      v_item_valorFCPSTAnteriormente,
      v_item_baseFCPUFDestinatario,
      v_item_valorFCPUFDestinatario,
      v_item_baseEstimadaImpostos,
      v_item_valorEstImpFederais,
      v_item_valorEstImpEstaduais,
      v_item_valorEstImpMunicipais);
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      v_cab_tipoPagamentoFrete,
      CASE WHEN p_item_geraFinanceiro = 1 AND v_cfop_geraFinanceiro = 1 THEN 1 ELSE 0 END,
      p_item_valorProdutoServico,
      0,
      0,
      0,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      v_item_valorIRRF,
      v_item_valorINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      0,
      v_item_valorICMSST,
      0,
      0,
      0,
      /* Retornos */
      r_item_valorBasePagamento,
      v_item_valorImpostosSomaPag,
      v_item_valorImpostosDiminuiPag,
      v_item_valorLiquidoItem);
    r_cab_quantidade               := r_cab_quantidade + p_item_quantidadeConvertida;
    r_cab_pesoLiquido              := r_cab_pesoLiquido + p_item_pesoLiquido;
    r_cab_pesoBruto                := r_cab_pesoBruto + p_item_pesoBruto;
    IF p_item_servico = 1 THEN
      r_cab_valorServicosBruto       := r_cab_valorServicosBruto + p_item_valorProdutoServicoBrut;
      r_cab_valorServicos            := r_cab_valorServicos + p_item_valorProdutoServico;
      r_cab_valorDescontoServicos    := r_cab_valorDescontoServicos + p_item_valorDescontoItem;
      r_cab_valorAcrescimoServicos   := r_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
    ELSE 
      r_cab_valorProdutosBruto       := r_cab_valorProdutosBruto + p_item_valorProdutoServicoBrut;
      r_cab_valorProdutos            := r_cab_valorProdutos + p_item_valorProdutoServico;
      r_cab_valorDescontoProdutos    := r_cab_valorDescontoProdutos + p_item_valorDescontoItem;
      r_cab_valorAcrescimoProdutos   := r_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
    END IF;
    r_cab_valorFreteItem           := r_cab_valorFreteItem + p_item_valorFreteItem;
    r_cab_valorSeguroItem          := r_cab_valorSeguroItem + p_item_valorSeguroItem;
    r_cab_valorAdicFreteMarItem    := r_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
    r_cab_valorDespesasAduanItem   := r_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
    r_cab_valorFreteGeral          := r_cab_valorFreteGeral + p_item_valorFreteGeral;
    r_cab_valorSeguroGeral         := r_cab_valorSeguroGeral + p_item_valorSeguroGeral;
    r_cab_valorDescontoGeral       := r_cab_valorDescontoGeral + v_item_valorDescontoGeral;
    r_cab_valorOutrasDespGeral     := r_cab_valorOutrasDespGeral + v_item_valorOutrasDespGeral;
    r_cab_valorAdicFreteMarGeral   := r_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
    r_cab_valorDespesasAduanGeral  := r_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + r_item_valorBasePagamento;
    IF p_item_usarPrecoAVista = 1 AND p_item_geraFinanceiro = 1 AND v_cfop_geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + p_item_valorProdutoServico - p_item_valorDescontoTotal + p_item_valorOutrasDespTotal;
    END IF;
    IF r_cab_valorFreteTotal = 0 AND p_item_valorFreteTotal <> 0 AND NOT(p_person_190_modeloFrete IS NULL) AND p_person_190_modeloFrete <> ' ' THEN
      r_cab_modalidadeFrete          := p_person_190_modeloFrete;
    END IF;    
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + p_item_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + p_item_valorSeguroTotal;
    v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + p_item_valorDescontoTotal;
    v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal + p_item_valorOutrasDespTotal;
    r_cab_valorAdicFreteMarTotal   := r_cab_valorAdicFreteMarTotal + p_item_valorAdicFreteMarTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + p_item_valorDespesasAduanTotal;
    r_cab_valorImpostosSomaPag     := r_cab_valorImpostosSomaPag + v_item_valorImpostosSomaPag;
    r_cab_valorImpostosDiminuiPag  := r_cab_valorImpostosDiminuiPag + v_item_valorImpostosDiminuiPag;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    SELECT COALESCE (MAX (sequencia),0) + 1
    INTO v_item_sequencia
    FROM MOORCAMENTOXITENS
    WHERE orcamento = p_cab_orcamento;
    ADD_ORCAMENTO_ITEM_GRAVA (
      p_estabelecimentoAtivo,
      r_obrigaFinalizar,
      p_cab_orcamento,
      v_cab_modeloDocumento,
      v_cab_entradaSaida,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_etOrc_situacaoOrcamento,
      0,
      v_item_sequencia,
      0,
      0,
      p_item_vendedor,
      0,
      p_item_gradeProduto,
      p_item_servico,
      p_item_atividadeServico,
      'A',
      0,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      0,
      p_item_idLoteEstoque,
      p_item_vinculoItemDocumento,
      p_item_operacaoFiscal,
      0,
      p_item_movimentaEstoque,
      (CASE WHEN p_item_geraFinanceiro = 1 AND v_cfop_geraFinanceiro = 1 THEN 1 ELSE 0 END),
      0,
      p_item_localEstoque,
      0,
      p_item_pessoaParticipante,
      p_item_dataEntrega,
      p_item_controleQuantidade,
      p_item_unidadeMedidaConversao,
      p_item_conversorQuantidade,
      p_item_loteMinimo,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_pecas,
      p_item_quantidade,
      p_item_quantidadeConvertida,
      0,
      p_item_quantidade,
      p_item_controleEntrega,
      1,
      p_item_pesoLiquido,
      p_item_pesoBruto,
      p_item_tipoPreco,
      p_item_tabelaPreco,
      p_item_precoSugestaoAPrazo,
      p_item_precoSugestaoAVista,
      p_item_precoDesconto,
      p_item_precoMinimo,
      p_item_usarPrecoAVista,
      p_item_precoPautaTabelado,
      p_item_precoUnitarioBruto,
      p_item_acrescimoUnitarioCompos,
      p_item_precoUnitario,
      p_item_precoUnitarioConvertido,
      p_item_valorProdutoServicoBrut,
      p_item_valorProdutoServico,
      p_item_percDescontoItem,
      p_item_valorDescontoItem,
      p_item_percAcrescimoItem,
      p_item_valorAcrescimoItem,
      p_item_valorFreteItem,
      p_item_valorSeguroItem,
      p_item_valorAdicFreteMarItem,
      p_item_valorDespesasAduanItem,
      p_item_valorFreteGeral,
      p_item_valorSeguroGeral,
      v_item_valorDescontoGeral,
      v_item_valorOutrasDespGeral,
      p_item_valorAdicFreteMarGeral,
      p_item_valorDespesasAduanGeral,
      r_item_valorBasePagamento,
      0,
      0,
      0,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      p_item_valorAdicFreteMarTotal,
      p_item_valorDespesasAduanTotal,
      v_opFisc_cfop,
      v_opFisc_indicadorISSQN,
      v_opFisc_aliquotaISSQN,
      v_item_baseISSQN,
      v_item_valorISSQN,
      v_opFisc_aliquotaIRRF,
      v_item_baseIRRF,
      v_item_valorIRRF,
      v_opFisc_aliquotaINSS,
      v_item_baseINSS,
      v_item_valorINSS,
      v_opFisc_retencaoPIS,
      v_item_baseRetPIS,
      v_item_valorRetPIS,
      v_opFisc_retencaoCOFINS,
      v_item_baseRetCOFINS,
      v_item_valorRetCOFINS,
      v_opFisc_retencaoCSLL,
      v_item_baseRetCSLL,
      v_item_valorRetCSLL,
      v_opFisc_aliquotaII,
      v_item_baseII,
      v_item_valorII,
      v_opFisc_aliquotaIOF,
      v_item_baseIOF,
      v_item_valorIOF,
      v_opFisc_codigoEnquadramIPI,
      v_opFisc_stIPI,
      v_opFisc_aliquotaIPI,
      v_opFisc_valorAliquotaIPI,
      v_item_baseIPI,
      v_item_valorIPI,
      v_opFisc_stPIS,
      v_opFisc_aliquotaPIS,
      v_opFisc_valorAliquotaPIS,
      v_item_basePIS,
      v_item_valorPIS,
      v_opFisc_aliquotaPISST,
      v_opFisc_valorAliquotaPISST,
      v_item_basePISST,
      v_item_valorPISST,
      v_opFisc_stCOFINS,
      v_opFisc_aliquotaCOFINS,
      v_opFisc_valorAliquotaCOFINS,
      v_item_baseCOFINS,
      v_item_valorCOFINS,
      v_opFisc_aliquotaCOFINSST,
      v_opFisc_valorAliquotaCOFINSST,
      v_item_baseCOFINSST,
      v_item_valorCOFINSST,
      v_opFisc_stSimplesNacional,
      v_opFisc_creditoSimplesNac,
      v_item_baseCreditoSimplesNac,
      v_item_valorCreditoSimplesNac,
      v_opFisc_stICMS,
      v_opFisc_modalBaseCalcICMS,
      v_opFisc_reducaoBaseICMS,
      v_opFisc_aliquotaICMS,
      v_opFisc_diferimentoICMS,
      v_opFisc_motivoDesoneracaoICMS,
      v_item_baseICMS,
      v_item_valorICMSOperacao,
      v_item_valorICMSDiferido,
      v_item_valorICMS,
      v_item_valorICMSDesoneracao,
      v_opFisc_modalBaseCalcICMSST,
      v_opFisc_margemValorAdicST,
      v_opFisc_reducaoBaseST,
      v_opFisc_aliquotaICMSST,
      v_opFisc_aliquotaSTSuportConsF,
      v_item_baseICMSST,
      v_item_valorICMSST,
      v_item_baseICMSSTAnteriormente,
      v_item_valorICMSSTAnteriorment,
      v_item_valorICMSProprioSubstit,
      v_opFisc_reducaoBaseICMSEfetiv,
      v_opFisc_aliquotaICMSEfetivo,
      v_item_baseICMSEfetivo,
      v_item_valorICMSEfetivo,
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_aliquotaICMSUFDestin ELSE 0 END),
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_aliquotaICMSInterest ELSE 0 END),
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_partilhaICMSInterest ELSE 0 END),
      v_item_baseICMSUFDestinatario,
      v_item_valorICMSUFDestinatario,
      v_item_baseICMSUFRemetente,
      v_item_valorICMSUFRemetente,
      v_opFisc_aliquotaFCP,
      v_item_baseFCP,
      v_item_valorFCP,
      v_opFisc_aliquotaFCPST,
      v_item_baseFCPST,
      v_item_valorFCPST,
      v_opFisc_aliquotaFCPSTAnterior,
      v_item_baseFCPSTAnteriormente,
      v_item_valorFCPSTAnteriormente,
      v_opFisc_aliquotaFCPUFDestin,
      v_item_baseFCPUFDestinatario,
      v_item_valorFCPUFDestinatario,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai,
      v_item_baseEstimadaImpostos,
      v_item_valorEstImpFederais,
      v_item_valorEstImpEstaduais,
      v_item_valorEstImpMunicipais,
      v_item_valorImpostosSomaPag,
      v_item_valorImpostosDiminuiPag,
      v_item_valorLiquidoItem,
      p_item_observacoesDigitadas,
      p_item_observacoes,
      /* Retornos */
      r_obrigaFinalizar,
      r_idItemOrcamento
    );    
    IF v_modDoc_habilitaAmbiente = 1 THEN
      MERGE INTO MOORCAMENTOXAMBIENTES a
      USING (
        SELECT
          r_idItemOrcamento      idItemOrcamento,
          p_item_ambiente        ambiente,
          p_item_amb_observacoes observacoes
        FROM DUAL
      ) b ON (a.idItemOrcamento = b.idItemOrcamento)
      WHEN MATCHED THEN
        UPDATE SET
          a.ambiente    = b.ambiente,
          a.observacoes = b.observacoes
      WHEN NOT MATCHED THEN
        INSERT (
          idItemOrcamento,
          ambiente,
          observacoes)
        VALUES (
          b.idItemOrcamento,
          b.ambiente,
          b.observacoes);
    END IF;
    IF p_idItemOrcamentoReferenciado > 0 THEN
      ADD_ORCAMENTO_ITEM_ORC_GRAVA (
        p_estabelecimentoAtivo,
        r_idItemOrcamento,
        p_idItemOrcamentoReferenciado,
        p_item_quantidade);
    ELSE
      IF p_nomeTempComposicao <> ' ' THEN
        ADD_ORCAMENTO_ITEM_COMP_TEMP (
          p_uniqueMachineID,
          p_estabelecimentoAtivo,
          p_nomeTempComposicao,
          p_temp_sequencia,
          r_idItemOrcamento);
      END IF;
    END IF;
    IF p_idItemDocTransferencia > 0 THEN
      ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
        p_estabelecimentoAtivo,
        v_cab_entradaSaida,
        p_idItemDocTransferencia,
        r_idItemOrcamento,
        p_item_quantidade);
    END IF;
    v_idEnderecoEstoqueOrcamento := 0;
    IF p_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_idItemOrcamento,
        p_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        p_item_observacoes,
        /* Retornos */
        v_idEnderecoEstoqueOrcamento);
    END IF;
    IF p_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_idItemOrcamento,
        v_idEnderecoEstoqueOrcamento,
        p_item_gradeProduto,
        p_idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
    END IF;
    IF p_item_servico = 1 AND p_item_atividadeServico > 0 AND v_ativServ_habilitaAtivPrev = 1 THEN
      ADD_ORCAMENTO_ITEM_PREV_INSERE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        r_idItemOrcamento,
        p_item_atividadeServico,
        v_ativServ_validoPrevisto);
    END IF;
    IF p_atualizarTempMargem = 1
      AND (p_regMarg_exibPercMargemCab = 1
        OR p_regMarg_exibImagemMargemCab = 1
        OR p_regMarg_exibPercMargemItem = 1
        OR p_regMarg_exibImagemMargemItem = 1
        OR p_regMarg_exibDetMargemItem = 1)
      AND v_cab_tipoDocumento IN (101,102,301,501,503) THEN
      ADD_TEMP_MARGEM_ITEM_GRAVA (
        p_uniqueMachineID,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_regMarg_tipoPreco,
        p_regMarg_tabelaPreco,
        p_regMarg_fatorMultiplicador,
        p_regMarg_tipoPrecoB,
        p_regMarg_tabelaPrecoB,
        p_regMarg_fatorMultiplicadorB,
        p_regMarg_reduzirImpostos,
        p_regMarg_reduzirTarifaCartao,
        p_regMarg_taxaCapitacaoCustoFi,
        p_regMarg_exibImagemMargemCab,
        p_regMarg_regraImagemCab,
        p_regMarg_exibImagemMargemItem,
        p_regMarg_regraImagemItem,
        'O',
        p_cab_orcamento,
        v_cab_estabelecimento,
        v_cab_dataPreco,
        v_cab_prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        p_cab_valorTarifaCartao,
        r_cab_valorMargem,
        v_munEndEst_uf,
        v_item_sequencia,
        0,
        0,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_valorFreteTotal,
        p_item_valorSeguroTotal,
        p_item_valorAdicFreteMarTotal,
        p_item_valorDespesasAduanTotal,
        v_item_valorII,
        v_item_valorIOF,
        v_item_valorIPI,
        0,
        v_item_valorPIS,
        v_item_valorPISST,
        v_item_valorCOFINS,
        v_item_valorCOFINSST,
        v_item_valorCreditoSimplesNac,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSUFDestinatario,
        v_item_valorICMSUFRemetente,
        v_item_valorFCP,
        v_item_valorFCPST,
        v_item_valorFCPSTAnteriormente,
        v_item_valorFCPUFDestinatario,
        v_item_valorLiquidoItem,
        p_gradProd_produto,
        p_gradProd_cor,
        p_gradProd_tamanho,
        p_prod_controleEstoque,
        p_locEst_indicadorPropPosseIt,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem,
        r_item_valorLiquidoSemFreteSeg,
        r_item_valorCaptacao,
        r_item_valorTarifaCartao,
        r_item_valorImpostos,
        r_item_precoCusto,
        r_item_valorCusto,
        r_item_valorMargem,
        r_item_percentualMargem,
        r_item_imagemMargem);
    END IF;
  END IF;
  IF p_manterFinanceiro = 0
    AND (r_cab_valorFreteGeral <> 0
      OR r_cab_valorSeguroGeral <> 0
      OR r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR r_cab_valorAdicFreteMarGeral <> 0
      OR r_cab_valorDespesasAduanGeral <> 0) THEN
    r_calculoImpostosPendente := 1;
  END IF;
  UPDATE MOORCAMENTOS SET
    modalidadeFrete               = r_cab_modalidadeFrete,
    ultimoVendedorItem            = r_cab_ultimoVendedorItem,
    quantidade                    = r_cab_quantidade,
    pesoLiquido                   = r_cab_pesoLiquido,
    pesoBruto                     = r_cab_pesoBruto,
    valorProdutosBruto            = r_cab_valorProdutosBruto,
    valorProdutos                 = r_cab_valorProdutos,
    valorDescontoProdutos         = r_cab_valorDescontoProdutos,
    valorAcrescimoProdutos        = r_cab_valorAcrescimoProdutos,
    valorServicosBruto            = r_cab_valorServicosBruto,
    valorServicos                 = r_cab_valorServicos,
    valorDescontoServicos         = r_cab_valorDescontoServicos,
    valorAcrescimoServicos        = r_cab_valorAcrescimoServicos,
    valorFreteItem                = r_cab_valorFreteItem,
    valorSeguroItem               = r_cab_valorSeguroItem,
    valorAdicFreteMarinhaMerItem  = r_cab_valorAdicFreteMarItem,
    valorDespesasAduaneirasItem   = r_cab_valorDespesasAduanItem,
    valorFreteGeral               = r_cab_valorFreteGeral,
    valorSeguroGeral              = r_cab_valorSeguroGeral,
    valorDescontoGeral            = r_cab_valorDescontoGeral,
    valorOutrasDespesasGeral      = r_cab_valorOutrasDespGeral,
    valorAdicFreteMarinhaMerGeral = r_cab_valorAdicFreteMarGeral,
    valorDespesasAduaneirasGeral  = r_cab_valorDespesasAduanGeral,
    condicaoPagamento             = v_cab_condicaoPagamento,
    numeroParcelas                = v_cab_numeroParcelas,
    somaPrazoParcelas             = v_cab_somaPrazoParcelas,
    valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
    prazoMedio                    = v_cab_prazoMedio,
    prazoMedioPonderado           = v_cab_prazoMedioPonderado,
    valorBasePagamento            = r_cab_valorBasePagamento,
    valorAVistaMinimo             = r_cab_valorAVistaMinimo,
    valorEntradaMinima            = v_cab_valorEntradaMinima,
    valorAVistaEntrada            = v_cab_valorAVistaEntrada,
    valorPagamentoBruto           = r_cab_valorPagamentoBruto,
    valorDescontoPagamento        = v_cab_valorDescontoPagamento,
    valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPag,
    valorJurosPagamento           = v_cab_valorJurosPagamento,
    valorPagamentoLiquido         = r_cab_valorPagamentoLiquido,
    valorTroco                    = r_cab_valorTroco,
    valorFreteTotal               = r_cab_valorFreteTotal,
    valorSeguroTotal              = r_cab_valorSeguroTotal,
    valorDescontoTotal            = v_cab_valorDescontoTotal,
    valorOutrasDespesasTotal      = v_cab_valorOutrasDespTotal,
    valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarTotal,
    valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
    valorImpostosSomaPagamento    = r_cab_valorImpostosSomaPag,
    valorImpostosDiminuiPagamento = r_cab_valorImpostosDiminuiPag,
    valorLiquidoItem              = r_cab_valorLiquidoItem
  WHERE orcamento = p_cab_orcamento;
END ADD_ORCAMENTO_ITEM_INSERE;

/

ALTER TABLE SIIBPTS DROP CONSTRAINT SIIBPTS_FK1;
ALTER TABLE CAPRODUTOS DROP CONSTRAINT CAPRODUTOS_FK23;
ALTER TABLE PAFILTROPRODUTOXNCMS DROP CONSTRAINT PAFILTROPRODUTOXNCMS_FK2;
ALTER TABLE PAPRODUTOSXTINTAS DROP CONSTRAINT PAPRODUTOSXTINTAS_FK4;
ALTER TABLE PAPRODUTOSXTINTAS DROP CONSTRAINT PAPRODUTOSXTINTAS_FK6;
ALTER TABLE PAPRODUTOSXTINTAS DROP CONSTRAINT PAPRODUTOSXTINTAS_FK8;
ALTER TABLE PAOPERFISCALXNCMS DROP CONSTRAINT PAOPERFISCALXNCMS_FK2;
ALTER TABLE PAMVAS DROP CONSTRAINT PAMVAS_FK1;
ALTER TABLE PADESONERACOESFISCAIS DROP CONSTRAINT PADESONERACOESFISCAIS_FK1;

