  INSERT INTO MOPREDOCUMXPROMOCOES (id, preDocumento, cabecalhoItemPagamento, sequencia, idItemPreDocumento, idPagamentoPreDocumento, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.cabecalhoItemPagamento, x.sequencia, 0, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes FROM MOORCAMENTOXPROMOCOES x WHERE x.orcamento = p_orcamento AND x.idItemOrcamento = 0 AND x.idPagamentoOrcamento = 0;
  FOR itens IN c_itens
  LOOP
    IF itens.cancelado = 0
    THEN
      INSERT INTO MOPREDOCUMXITENS (idItemPreDocumento, preDocumento, sequencia, cancelado, pedidoCompraFornecedor, sequenciaPedidoCompraFornec, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorDescontoCustoOpItem, valorAcrescimoCustoOpItem, observacoesDigitadas, observacoes, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorAcrescimoExtempGeral, valorDescontoCustoOpGeral, valorAcrescimoCustoOpGeral, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, valorAcrescimoExtempTotal, valorDescontoCustoOpTotal, valorAcrescimoCustoOpTotal, percentualDevolucao, valorIPIDevolucao, operacaoFiscal, movimentaEstoque, geraFinanceiro, cfop, indicadorISSQN, aliquotaISSQN, retidoISSQN, tributadoForaMunicipio, incentivoFiscal, listaServicos, cnae, idServicoMunicipio, numeroProcessoAdministrativo, retencaoIRRF, retencaoINSS, retencaoPIS, retencaoCOFINS, retencaoCSLL, retencaoOutros, aliquotaII, aliquotaIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, stPIS, aliquotaPIS, valorAliquotaPIS, aliquotaPISST, valorAliquotaPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, stSimplesNacional, creditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, idBeneficio, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, aliquotaFCP, aliquotaFCPST, aliquotaFCPSTAnteriormente, aliquotaFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseISSQN, valorISSQN, baseRetIRRF, valorRetIRRF, baseRetINSS, valorRetINSS, baseRetPIS, valorRetPIS, baseRetCOFINS, valorRetCOFINS, baseRetCSLL, valorRetCSLL, baseRetOutros, valorRetOutros, baseII, valorII, baseIOF, valorIOF, baseIPI, valorIPI, basePIS, valorPIS, basePISST, valorPISST, baseCOFINS, valorCOFINS, baseCOFINSST, valorCOFINSST, baseCreditoSimplesNacional, valorCreditoSimplesNacional, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, baseICMSEfetivo, valorICMSEfetivo, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, baseFCP, valorFCP, baseFCPST, valorFCPST, baseFCPSTAnteriormente, valorFCPSTAnteriormente, baseFCPUFDestinatario, valorFCPUFDestinatario, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorBasePagamento, valorLiquidoItem, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV) VALUES (itens.idItemPreDocumento, v_preDocumento, itens.sequencia, itens.cancelado, itens.pedidoCompraFornecedor, itens.sequenciaPedidoCompraFornec, itens.modeloDocumento, v_estabelecimento, CASE WHEN itens.vendedor = 0 THEN v_colaboradorResponsavel ELSE itens.vendedor END, itens.gradeProduto, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.localEstoque, itens.pessoaParticipante, itens.controleQuantidade, itens.unidadeMedidaConversao, itens.conversorQuantidade, itens.loteMinimo, itens.loteMultiplo, itens.altura, itens.largura, itens.comprimento, itens.pecas, itens.quantidade, itens.quantidadeConvertida, 0, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoUnitarioBruto, itens.acrescimoUnitarioComposicao, itens.precoUnitario, itens.precoUnitarioConvertido, itens.valorProdutoServicoBruto, itens.valorProdutoServico, itens.percDescontoItem, itens.valorDescontoItem, itens.percAcrescimoItem, itens.valorAcrescimoItem, itens.valorFreteItem, itens.valorSeguroItem, itens.valorAdicFreteMarinhaMerItem, itens.valorDespesasAduaneirasItem, 0, 0, 0, 0, 0, 0, itens.observacoesDigitadas, itens.observacoes, itens.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, 0, 0, 0, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, 0, 0, 0, 0, 0, itens.operacaoFiscal, itens.movimentaEstoque, itens.geraFinanceiro, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.retidoISSQN, itens.tributadoForaMunicipio, itens.incentivoFiscal, itens.listaServicos, itens.cnae, itens.idServicoMunicipio, itens.numeroProcessoAdministrativo, itens.retencaoIRRF, itens.retencaoINSS, itens.retencaoPIS, itens.retencaoCOFINS, itens.retencaoCSLL, itens.retencaoOutros, itens.aliquotaII, itens.aliquotaIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.idBeneficio, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.aliquotaFCP, itens.aliquotaFCPST, itens.aliquotaFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseISSQN, itens.valorISSQN, itens.baseRetIRRF, itens.valorRetIRRF, itens.baseRetINSS, itens.valorRetINSS, itens.baseRetPIS, itens.valorRetPIS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.baseRetCSLL, itens.valorRetCSLL, itens.baseRetOutros, itens.valorRetOutros, itens.baseII, itens.valorII, itens.baseIOF, itens.valorIOF, itens.baseIPI, itens.valorIPI, itens.basePIS, itens.valorPIS, itens.basePISST, itens.valorPISST, itens.baseCOFINS, itens.valorCOFINS, itens.baseCOFINSST, itens.valorCOFINSST, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.baseFCP, itens.valorFCP, itens.baseFCPST, itens.valorFCPST, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorBasePagamento, itens.valorLiquidoItem, 0, 0, 0, 0);
      INSERT INTO MOPREDOCUMXCOMPOSICOESPR (id, idItemPreDocumento, composicaoPreco, selecionado, quantidade, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXCOMPOSICOESPR', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.composicaoPreco, x.selecionado, x.quantidade, x.observacoes FROM MOORCAMENTOXCOMPOSICOESPR x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXEMBALAGENSTIN (idEmbalagemTintaPreDocumento, idItemPreDocumento, embalagemTinta, quantidade, quantidadeSaldo, quantidadeConferida, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXEMBALAGENSTIN', 'idEmbalagemTintaPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.embalagemTinta, x.quantidade, x.quantidadeSaldo, x.quantidadeConferida, x.observacoes FROM MOORCAMENTOXEMBALAGENSTIN x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXNUMEROSSERIE (idNumeroSeriePreDocumento, idItemPreDocumento, gradeProduto, idNumeroSerie, devolvidoRetornado) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXNUMEROSSERIE', 'idNumeroSeriePreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.gradeProduto, x.idNumeroSerie, 0 FROM MOORCAMENTOXNUMEROSSERIE x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXCENTROSCUSTOS (idCentroCustoPreDocumento, idItemPreDocumento, idCentroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXCENTROSCUSTOS', 'idCentroCustoPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.idCentroCusto, x.percentualRateio FROM MOORCAMENTOXCENTROSCUSTOS x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXORCAMENTOITEM (id, idItemPreDocumento, idItemOrcamento, quantidade, efetivacao) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXORCAMENTOITEM', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, itens.idItemOrcamento, itens.quantidade, 1);
      INSERT INTO MOPREDOCUMXPROMOCOES (id, preDocumento, cabecalhoItemPagamento, sequencia, idItemPreDocumento, idPagamentoPreDocumento, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.cabecalhoItemPagamento, itens.sequencia, itens.idItemPreDocumento, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes FROM MOORCAMENTOXPROMOCOES x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOAVALIAMARGEMPRODXPREDOC (id, idAvaliaMargemProduto, idItemPreDocumento) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOAVALIAMARGEMPRODXPREDOC', 'id', 0, p_sys_estabelecimentoAtivo, NULL), x.idAvaliaMargemProduto, itens.idItemPreDocumento FROM MOAVALIAMARGEMPRODXORCAM x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      UPDATE MOCONSERTOS cons SET cons.situacaoConserto = 'R' WHERE cons.documentoTransferenciaFornec > 0 AND cons.situacaoConserto = 'E' AND EXISTS (SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec AND transfXDoc.entradaSaidaOriginal = 'E' AND transfXDoc.idItemOrcamento = itens.idItemOrcamento);
      FOR mot IN c_mot_item
      LOOP
        IF mot.idItemOrcamento = itens.idItemOrcamento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, itens.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXPREDOCUMITENS (id, idMotivoBloqueioDocumento, idItemPreDocumento) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXPREDOCUMITENS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, itens.idItemPreDocumento);
          INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END IF;
  END LOOP;
  UPDATE MOORCAMENTOXITENS SET quantidadeSaldo = 0 WHERE orcamento = p_orcamento AND cancelado = 0;
  FOR mot IN c_mot_cab
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, 0, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXPREDOCUMENTOS (id, idMotivoBloqueioDocumento, preDocumento) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXPREDOCUMENTOS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, v_preDocumento);
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  FOR mot IN c_mot_pag
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, a.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  ADD_RESERVA_ESTOQUE_ORC_CAB (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    p_orcamento);
  r_preDocumento := v_preDocumento;
END ADD_PRE_DOC_ROT_EFET_ORCAMENTO;

/

create or replace PROCEDURE ADD_DOC_FISC_ROT_EFET_ORCAMENT (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_sessao                       IN NUMBER,
  p_idTerminalSiTef              IN VARCHAR2,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_1_NFCe_2_ConsFinal_3_NF      IN VARCHAR2,
  p_orcamento                    IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  p_nfFornecedor                 IN NUMBER,
  p_idSerieFiscal                IN NUMBER,
  p_serieFiscal                  IN VARCHAR2,
  p_subSerieFiscal               IN NUMBER,
  p_modeloDocumentoFiscal        IN VARCHAR2,
  p_documentoFiscal              IN NUMBER,
  p_dataEmissao                  IN DATE,
  p_timezone                     IN VARCHAR2,
  p_dataEntradaSaida             IN DATE,
  p_comissionadoB                IN NUMBER,
  p_comissionadoC                IN NUMBER,
  p_chaveNfe                     IN VARCHAR2,
  p_novaEtapaOrcamento           IN NUMBER,
  p_versaoAplicativo             IN VARCHAR2,
  r_idDocumentoFiscal            OUT NUMBER)
IS
  v_tipoDocumento          NUMBER;
  v_fatoContabil           NUMBER;
  v_idDocumentoFiscal      NUMBER;
  v_estabelecimento        NUMBER;
  v_pessoa                 NUMBER;
  v_colaboradorResponsavel NUMBER;
  v_documentoFiscal        NUMBER;
  CURSOR c_itens IS
    SELECT
      item.idItemOrcamento,
      CASE
        WHEN cancelado = 0
        THEN FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXITENS', 'idItemDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL)
        ELSE 0
      END idItemDocFiscal,
      item.sequencia,
      item.cancelado,
      item.pedidoCompraFornecedor,
      item.sequenciaPedidoCompraFornec,
      item.modeloDocumento,
      item.vendedor,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.controleQuantidade,
      item.unidadeMedidaConversao,
      item.conversorQuantidade,
      item.loteMinimo,
      item.loteMultiplo,
      item.altura,
      item.largura,
      item.comprimento,
      item.pecas,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.tipoPreco,
      item.tabelaPreco,
      item.precoSugestaoAPrazo,
      item.precoSugestaoAVista,
      item.precoDesconto,
      item.precoMinimo,
      item.usarPrecoAVista,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.precoUnitarioConvertido,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.percDescontoItem,
      item.valorDescontoItem,
      item.percAcrescimoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.observacoesDigitadas,
      item.observacoes,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.operacaoFiscal,
      item.movimentaEstoque,
      item.movimentaEstoque movimentaEstoqueFiscal,
      item.geraFinanceiro,
      item.cfop,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      item.retidoISSQN,
      item.tributadoForaMunicipio,
      item.incentivoFiscal,
      item.listaServicos,
      item.cnae,
      item.idServicoMunicipio,
      item.numeroProcessoAdministrativo,
      item.retencaoIRRF,
      item.retencaoINSS,
      item.retencaoPIS,
      item.retencaoCOFINS,
      item.retencaoCSLL,
      item.retencaoOutros,
      item.aliquotaII,
      item.aliquotaIOF,
      item.codigoEnquadramentoIPI,
      item.stIPI,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      item.stPIS,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      item.stCOFINS,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      item.motivoDesoneracaoICMS,
      item.idBeneficio,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      item.aliquotaSTSuportConsFinal,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND prod.tipoProduto IN('07','08')
        THEN '90'
        WHEN p_nfFornecedor = 1 AND item.stICMS IN('10','30','70')
          OR p_nfFornecedor = 1 AND item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203')
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN '60'
        WHEN item.stICMS <> ' '
        THEN item.stICMS
        WHEN item.stSimplesNacional IN ('101','102') AND item.reducaoBaseICMS = 0
        THEN '00'
        WHEN item.stSimplesNacional IN ('101','102')
        THEN '20'
        WHEN item.stSimplesNacional IN ('103','300')
        THEN '40'
        WHEN item.stSimplesNacional IN ('201','202','203') AND item.reducaoBaseICMS = 0
        THEN '10' WHEN item.stSimplesNacional IN ('201','202','203')
        THEN '70' WHEN item.stSimplesNacional = '400'
        THEN '41'
        ELSE '90'
      END stICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.reducaoBaseICMS
        ELSE 0
      END reducaoBaseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.aliquotaICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.creditoSimplesNacional
        ELSE 0
      END aliquotaICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.diferimentoICMS
        ELSE 0
      END diferimentoICMSEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.margemValorAdicionadoST
      END margemValorAdicSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.reducaoBaseST
      END reducaoBaseSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.aliquotaICMSST
      END aliquotaICMSSTEscrituracao,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      item.aliquotaFCP,
      item.aliquotaFCPST,
      item.aliquotaFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      item.baseISSQN,
      item.valorISSQN,
      item.baseRetIRRF,
      item.valorRetIRRF,
      item.baseRetINSS,
      item.valorRetINSS,
      item.baseRetPIS,
      item.valorRetPIS,
      item.baseRetCOFINS,
      item.valorRetCOFINS,
      item.baseRetCSLL,
      item.valorRetCSLL,
      item.baseRetOutros,
      item.valorRetOutros,
      item.baseII,
      item.valorII,
      item.baseIOF,
      item.valorIOF,
      item.baseIPI,
      item.valorIPI,
      item.basePIS,
      item.valorPIS,
      item.basePISST,
      item.valorPISST,
      item.baseCOFINS,
      item.valorCOFINS,
      item.baseCOFINSST,
      item.valorCOFINSST,
      item.baseCreditoSimplesNacional,
      item.valorCreditoSimplesNacional,
      item.baseICMS,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.baseICMSST,
      item.valorICMSST,
      item.baseICMSSTAnteriormente,
      item.valorICMSSTAnteriormente,
      item.valorICMSProprioSubstituto,
      item.baseICMSEfetivo,
      item.valorICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' ' AND p_nfFornecedor = 1
        THEN ROUND(item.baseICMS *(1-item.diferimentoICMS/100),2)
        WHEN item.stICMS <> ' '
        THEN item.baseICMS
        WHEN item.stSimplesNacional IN ('101','201') AND item.baseCreditoSimplesNacional = 0
        THEN item.valorProdutoServico
          - item.valorDescontoTotal
          + item.valorOutrasDespesasTotal
          + item.valorAdicFreteMarinhaMerTotal
          + item.valorDespesasAduaneirasTotal
          + item.valorII
          + item.valorIOF
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.baseCreditoSimplesNacional
        ELSE 0
      END baseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.valorCreditoSimplesNacional
        ELSE 0
      END valorICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMSDesoneracao
        ELSE 0
      END valorICMSDesonEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.baseICMSST
      END baseICMSSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.valorICMSST
      END valorICMSSTEscrituracao,
      1 somarICMSST,
      item.baseICMSUFDestinatario,
      item.valorICMSUFDestinatario,
      item.baseICMSUFRemetente,
      item.valorICMSUFRemetente,
      item.baseFCP,
      item.valorFCP,
      item.baseFCPST,
      item.valorFCPST,
      item.baseFCPSTAnteriormente,
      item.valorFCPSTAnteriormente,
      item.baseFCPUFDestinatario,
      item.valorFCPUFDestinatario,
      item.baseEstimadaImpostos,
      item.valorEstimadoImpFederais,
      item.valorEstimadoImpEstaduais,
      item.valorEstimadoImpMunicipais,
      item.valorBasePagamento,
      item.valorLiquidoItem
    FROM MOORCAMENTOXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.orcamento = p_orcamento
    ORDER BY item.sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOS
    WHERE orcamento = p_orcamento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemOrcamento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOITENS a
    JOIN MOORCAMENTOXITENS b ON b.idItemOrcamento = a.idItemOrcamento
    WHERE b.orcamento = p_orcamento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'O'
      AND a.idCabecalho = p_orcamento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT (EXISTS(
        SELECT 1
        FROM MOMOTBLOQXORCAMENTOPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento));
BEGIN
SELECT
  CASE
    WHEN orc.entradaSaida='E'
    THEN 601
    WHEN p_1_NFCe_2_ConsFinal_3_NF = '1'
    OR p_1_NFCe_2_ConsFinal_3_NF   = '2'
    THEN 503
    ELSE 501
  END,
  orc.estabelecimento,
  CASE
    WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
    THEN 0
    ELSE orc.pessoa
  END,
  CASE
    WHEN orc.tipoDocumento = 102
      AND orc.colaboradorResponsavel <> 0
      AND EXISTS (
        SELECT 1
        FROM CAVENDEDORES
        WHERE vendedor = orc.colaboradorResponsavel
        AND ativo = 1)
    THEN orc.colaboradorResponsavel
    ELSE 0
  END,
  CASE
    WHEN p_nfFornecedor = 1
    THEN p_documentoFiscal
    ELSE FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS|'
      || LPAD (orc.estabelecimento,4,'0')
      || '|'
      || LPAD (p_idSerieFiscal,14,'0'), ' ', 0, 0,TRUNC(p_dataEmissao))
  END
INTO v_tipoDocumento,
  v_estabelecimento,
  v_pessoa,
  v_colaboradorResponsavel,
  v_documentoFiscal
FROM MOORCAMENTOS orc
WHERE orcamento = p_orcamento;
  v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MOFATOSCONTABEIS (
    fatoContabil,
    estabelecimento,
    data,
    ordenacao,
    situacaoTransacao,
    situacaoContabilizacao,
    sessao,
    observacoes)
  VALUES (
    v_fatoContabil,
    v_estabelecimento,
    p_dataEmissao,
    0,
    'A',
    'A',
    p_sessao,
    ' ');
  v_idDocumentoFiscal := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS', 'idDocumentoFiscal', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MODOCUMENTOSFISCAIS (
    idDocumentoFiscal,
    origemDocumento,
    tipoDocumento,
    tipoVenda,
    modeloDocumento,
    entradaSaida,
    devolucaoAnulacaoRetorno,
    finalidadeNota,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    validoFaturamento,
    usarPrecoAVista,
    sessao,
    sessaoCaixa,
    fatoContabil,
    idTerminalSiTef,
    estabelecimentoOriginal,
    estabelecimento,
    enderecoRetiradaEstabeleciment,
    indicadorPresencaComprador,
    controlaSeparacaoConferencia,
    nfFornecedor,
    idSerieFiscal,
    serieFiscal,
    subserieFiscal,
    modeloDocumentoFiscal,
    documentoFiscal,
    dataEmissao,
    timezoneEmissao,
    dataEntradaSaida,
    pessoa,
    vendaConsumidor,
    indicadorPessoa,
    indicadorDocumentoPessoa,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    fone,
    indicadorFone,
    operadoraTelefonia,
    autorizadoPessoa,
    enderecoEntregaPessoa,
    municipioFatoGerador,
    localDestinoOperacao,
    indicadorConsumidorFinal,
    projeto,
    contratoCompra,
    comissionadoB,
    comissionadoC,
    modalidadeFrete,
    tipoPagamentoFrete,
    transportadora,
    enderecoTransportadora,
    motorista,
    placa,
    vagao,
    balsa,
    quantidadeVolume,
    especieVolume,
    descricaoMarca,
    numeracaoVolume,
    codigoIntegracao,
    atendimento,
    tipoCTe,
    idContingenciaNfe,
    codigoNumericoNfe,
    digitoVerificadorNfe,
    formaEmissaoNfe,
    indicadorAmbienteNfe,
    qrCode,
    chaveNfe,
    situacaoDocumentoFiscal,
    ultimoVendedorItem,
    quantidade,
    pesoLiquido,
    pesoBruto,
    valorProdutosBruto,
    valorProdutos,
    valorDescontoProdutos,
    valorAcrescimoProdutos,
    valorServicosBruto,
    valorServicos,
    valorDescontoServicos,
    valorAcrescimoServicos,
    valorFreteItem,
    valorSeguroItem,
    valorAdicFreteMarinhaMerItem,
    valorDespesasAduaneirasItem,
    valorFreteGeral,
    valorSeguroGeral,
    valorDescontoGeral,
    valorOutrasDespesasGeral,
    valorAdicFreteMarinhaMerGeral,
    valorDespesasAduaneirasGeral,
    condicaoPagamento,
    contaFinanceira,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorBasePagamento,
    valorAVistaMinimo,
    valorEntradaMinima,
    valorAVistaEntrada,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorTroco,
    valorFreteTotal,
    valorSeguroTotal,
    valorDescontoTotal,
    valorOutrasDespesasTotal,
    valorAdicFreteMarinhaMerTotal,
    valorDespesasAduaneirasTotal,
    impostosEditados,
    valorImpostosSomaPagamento,
    valorImpostosDiminuiPagamento,
    valorLiquidoItem,
    valorDescontoCustoOpItem,
    valorDescontoCustoOpGeral,
    valorDescontoCustoOpTotal,
    valorAcrescimoCustoOpItem,
    valorAcrescimoCustoOpGeral,
    valorAcrescimoCustoOpTotal,
    valorCustoOperacao,
    valorCMV,
    versaoAplicativo)
  SELECT
    v_idDocumentoFiscal,
    2,
    v_tipoDocumento,
    orc.tipoVenda,
    orc.modeloDocumento,
    orc.entradaSaida,
    0 devolucaoAnulacaoRetorno,
    orc.finalidadeNota,
    orc.atualizaCustoMedio,
    orc.atualizaUltimaCompra,
    orc.validoFaturamento,
    orc.usarPrecoAVista,
    p_sessao,
    p_sessaoCaixa,
    v_fatoContabil,
    p_idTerminalSiTef,
    orc.estabelecimento,
    orc.estabelecimento,
    orc.enderecoRetiradaEstabeleciment,
    orc.indicadorPresencaComprador,
    orc.controlaSeparacaoConferencia,
    p_nfFornecedor,
    p_idSerieFiscal,
    p_serieFiscal,
    p_subserieFiscal,
    p_modeloDocumentoFiscal,
    v_documentoFiscal,
    p_dataEmissao dataEmissao,
    p_timezone timezoneEmissao,
    p_dataEntradaSaida dataEntradaSaida,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE orc.pessoa END pessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 1 ELSE 0 END vendaConsumidor,
    'F' indicadorPessoa,
    'C' indicadorDocumentoPessoa,
    ' ' cnpjCpfIdEstrangeiro,
    ' ' nomeRazaoSocial,
    ' ' fone,
    0 indicadorFone,
    0 operadoraTelefonia,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE orc.autorizadoPessoa END autorizadoPessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE orc.enderecoEntregaPessoa END enderecoEntregaPessoa,
    CASE
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN COALESCE ((SELECT MAX(endEst.municipio) FROM CAENDERECOSPESSOA endEst WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1),0)
      ELSE orc.municipioFatoGerador
    END municipioFatoGerador,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE orc.localDestinoOperacao END localDestinoOperacao,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE orc.indicadorConsumidorFinal END indicadorConsumidorFinal,
    orc.projeto,
    orc.contratoCompra,
    p_comissionadoB comissionadoB,
    p_comissionadoC comissionadoC,
    CASE WHEN orc.modalidadeFrete = ' ' THEN '9' ELSE orc.modalidadeFrete END,
    CASE WHEN orc.tipoPagamentoFrete = ' ' THEN 'N' ELSE orc.tipoPagamentoFrete END,
    orc.transportadora,
    orc.enderecoTransportadora,
    orc.motorista,
    orc.placa,
    orc.vagao,
    orc.balsa,
    orc.quantidadeVolume,
    orc.especieVolume,
    orc.descricaoMarca,
    orc.numeracaoVolume,
    orc.codigoIntegracao,
    orc.atendimento,
    '0' tipoCTe,
    0 idContingenciaNfe,
    0 codigoNumericoNfe,
    0 digitoVerificadorNfe,
    ' ' formaEmissaoNfe,
    est.indicadorAmbienteNfe,
    ' ' qrCode,
    p_chaveNfe chaveNfe,
    11 situacaoDocumentoFiscal,
    CASE WHEN orc.ultimoVendedorItem = 0 THEN v_colaboradorResponsavel ELSE orc.ultimoVendedorItem END,
    orc.quantidade,
    orc.pesoLiquido,
    orc.pesoBruto,
    orc.valorProdutosBruto,
    orc.valorProdutos,
    orc.valorDescontoProdutos,
    orc.valorAcrescimoProdutos,
    orc.valorServicosBruto,
    orc.valorServicos,
    orc.valorDescontoServicos,
    orc.valorAcrescimoServicos,
    orc.valorFreteItem,
    orc.valorSeguroItem,
    orc.valorAdicFreteMarinhaMerItem,
    orc.valorDespesasAduaneirasItem,
    orc.valorFreteGeral,
    orc.valorSeguroGeral,
    orc.valorDescontoGeral,
    orc.valorOutrasDespesasGeral,
    orc.valorAdicFreteMarinhaMerGeral,
    orc.valorDespesasAduaneirasGeral,
    orc.condicaoPagamento,
    orc.contaFinanceira,
    0 numeroParcelas,
    0 somaPrazoParcelas,
    0 valorXPrazoParcelas,
    0 prazoMedio,
    0 prazoMedioPonderado,
    orc.valorBasePagamento,
    orc.valorAVistaMinimo,
    0 valorEntradaMinima,
    0 valorAVistaEntrada,
    0 valorPagamentoBruto,
    0 valorDescontoPagamento,
    0 valorOutrasDespesasPagamento,
    0 valorJurosPagamento,
    0 valorPagamentoLiquido,
    0 valorTroco,
    orc.valorFreteTotal,
    orc.valorSeguroTotal,
    orc.valorDescontoTotal - CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END,
    orc.valorOutrasDespesasTotal - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    orc.valorAdicFreteMarinhaMerTotal,
    orc.valorDespesasAduaneirasTotal,
    orc.impostosEditados,
    orc.valorImpostosSomaPagamento,
    orc.valorImpostosDiminuiPagamento,
    orc.valorLiquidoItem + CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    p_versaoAplicativo
  FROM MOORCAMENTOS orc
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = orc.estabelecimento
  WHERE orcamento = p_orcamento;
  UPDATE MOORCAMENTOS SET etapaOrcamento = p_novaEtapaOrcamento WHERE orcamento = p_orcamento;
  INSERT INTO MOORCAMENTOXETAPAS (id, orcamento, data, usuario, etapaOrcamento, observacoes) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOORCAMENTOXETAPAS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), p_orcamento, sysdate, p_sys_usuarioLogado, p_novaEtapaOrcamento, ' ');
  INSERT INTO MODOCFISCALXPERSPROJETO (idPersonProjetoDocFiscal, idDocumentoFiscal, personalizacaoProjeto, conteudo) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPERSPROJETO', 'idPersonProjetoDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL), v_idDocumentoFiscal, x.personalizacaoProjeto, x.conteudo FROM MOORCAMENTOXPERSPROJETO x WHERE x.orcamento = p_orcamento;
  INSERT INTO MODOCFISCALXINFOCOMPLEMEN (id, idDocumentoFiscal, sequencia, geradoPeloSistema, imprimir, destaque, informacaoComplementar, descInformacaoComplementar) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXINFOCOMPLEMEN', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_idDocumentoFiscal, x.sequencia, x.geradoPeloSistema, x.imprimir, x.destaque, x.informacaoComplementar, x.descInformacaoComplementar FROM MOORCAMENTOXINFOCOMPLENT x WHERE x.orcamento = p_orcamento;
  INSERT INTO MODOCFISCALXPROMOCOES (id, idDocumentoFiscal, cabecalhoItemPagamento, sequencia, idItemDocFiscal, idPagamentoDocFiscal, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_idDocumentoFiscal, x.cabecalhoItemPagamento, x.sequencia, 0, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes
  FROM MOORCAMENTOXPROMOCOES x WHERE x.orcamento = p_orcamento AND x.idItemOrcamento = 0 AND x.idPagamentoOrcamento = 0;
  FOR itens IN c_itens
  LOOP
    IF itens.cancelado = 0
    THEN
      INSERT INTO MODOCFISCALXITENS (idItemDocFiscal, idDocumentoFiscal, sequencia, cancelado, pedidoCompraFornecedor, sequenciaPedidoCompraFornec, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorDescontoCustoOpItem, valorAcrescimoCustoOpItem, observacoesDigitadas, observacoes, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorAcrescimoExtempGeral, valorDescontoCustoOpGeral, valorAcrescimoCustoOpGeral, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, valorAcrescimoExtempTotal, valorDescontoCustoOpTotal, valorAcrescimoCustoOpTotal, percentualDevolucao, valorIPIDevolucao, operacaoFiscal, movimentaEstoque, movimentaEstoqueFiscal, geraFinanceiro, cfop, indicadorISSQN, aliquotaISSQN, retidoISSQN, tributadoForaMunicipio, incentivoFiscal, listaServicos, cnae, idServicoMunicipio, numeroProcessoAdministrativo, retencaoIRRF, retencaoINSS, retencaoPIS, retencaoCOFINS, retencaoCSLL, retencaoOutros, aliquotaII, aliquotaIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, stPIS, aliquotaPIS, valorAliquotaPIS, aliquotaPISST, valorAliquotaPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, stSimplesNacional, creditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, idBeneficio, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, diferimentoICMSEscrituracao, margemValorAdicSTEscrituracao, reducaoBaseSTEscrituracao, aliquotaICMSSTEscrituracao, somarICMSST, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, aliquotaFCP, aliquotaFCPST, aliquotaFCPSTAnteriormente, aliquotaFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseISSQN, valorISSQN, baseRetIRRF, valorRetIRRF, baseRetINSS, valorRetINSS, baseRetPIS, valorRetPIS, baseRetCOFINS, valorRetCOFINS, baseRetCSLL, valorRetCSLL, baseRetOutros, valorRetOutros, baseII, valorII, baseIOF, valorIOF, baseIPI, valorIPI, basePIS, valorPIS, basePISST, valorPISST, baseCOFINS, valorCOFINS, baseCOFINSST, valorCOFINSST, baseCreditoSimplesNacional, valorCreditoSimplesNacional, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, baseICMSEfetivo, valorICMSEfetivo, baseICMSEscrituracao, valorICMSEscrituracao, valorICMSDesonEscrituracao, baseICMSSTEscrituracao, valorICMSSTEscrituracao, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, baseFCP, valorFCP, baseFCPST, valorFCPST, baseFCPSTAnteriormente, valorFCPSTAnteriormente, baseFCPUFDestinatario, valorFCPUFDestinatario, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorBasePagamento, valorLiquidoItem, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV) VALUES (itens.idItemDocFiscal, v_idDocumentoFiscal, itens.sequencia, itens.cancelado, itens.pedidoCompraFornecedor, itens.sequenciaPedidoCompraFornec, itens.modeloDocumento, v_estabelecimento, CASE WHEN itens.vendedor = 0 THEN v_colaboradorResponsavel ELSE itens.vendedor END, itens.gradeProduto, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.localEstoque, itens.pessoaParticipante, itens.controleQuantidade, itens.unidadeMedidaConversao, itens.conversorQuantidade, itens.loteMinimo, itens.loteMultiplo, itens.altura, itens.largura, itens.comprimento, itens.pecas, itens.quantidade, itens.quantidadeConvertida, 0, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoUnitarioBruto, itens.acrescimoUnitarioComposicao, itens.precoUnitario, itens.precoUnitarioConvertido, itens.valorProdutoServicoBruto, itens.valorProdutoServico, itens.percDescontoItem, itens.valorDescontoItem, itens.percAcrescimoItem, itens.valorAcrescimoItem, itens.valorFreteItem, itens.valorSeguroItem, itens.valorAdicFreteMarinhaMerItem, itens.valorDespesasAduaneirasItem, 0, 0, 0, 0, 0, 0, itens.observacoesDigitadas, itens.observacoes, itens.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, 0, 0, 0, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, 0, 0, 0, 0, 0, itens.operacaoFiscal, itens.movimentaEstoque, itens. movimentaEstoqueFiscal,itens.geraFinanceiro, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.retidoISSQN, itens.tributadoForaMunicipio, itens.incentivoFiscal, itens.listaServicos, itens.cnae, itens.idServicoMunicipio, itens.numeroProcessoAdministrativo, itens.retencaoIRRF, itens.retencaoINSS, itens.retencaoPIS, itens.retencaoCOFINS, itens.retencaoCSLL, itens.retencaoOutros, itens.aliquotaII, itens.aliquotaIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.idBeneficio, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.stICMSEscrituracao, itens.reducaoBaseICMSEscrituracao, itens.aliquotaICMSEscrituracao, itens.diferimentoICMSEscrituracao, itens.margemValorAdicSTEscrituracao, itens.reducaoBaseSTEscrituracao, itens.aliquotaICMSSTEscrituracao, itens.somarICMSST, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.aliquotaFCP, itens.aliquotaFCPST, itens.aliquotaFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseISSQN, itens.valorISSQN, itens.baseRetIRRF, itens.valorRetIRRF, itens.baseRetINSS, itens.valorRetINSS, itens.baseRetPIS, itens.valorRetPIS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.baseRetCSLL, itens.valorRetCSLL, itens.baseRetOutros, itens.valorRetOutros, itens.baseII, itens.valorII, itens.baseIOF, itens.valorIOF, itens.baseIPI, itens.valorIPI, itens.basePIS, itens.valorPIS, itens.basePISST, itens.valorPISST, itens.baseCOFINS, itens.valorCOFINS, itens.baseCOFINSST, itens.valorCOFINSST, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.baseICMSEscrituracao, itens.valorICMSEscrituracao, itens.valorICMSDesonEscrituracao, itens.baseICMSSTEscrituracao, itens.valorICMSSTEscrituracao, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.baseFCP, itens.valorFCP, itens.baseFCPST, itens.valorFCPST, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorBasePagamento, itens.valorLiquidoItem, 0, 0, 0, 0);
      INSERT INTO MODOCFISCALXCOMPOSICOESPR (id, idItemDocFiscal, composicaoPreco, selecionado, quantidade, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCOMPOSICOESPR', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.composicaoPreco, x.selecionado, x.quantidade, x.observacoes FROM MOORCAMENTOXCOMPOSICOESPR x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXEMBALAGENSTIN (idEmbalagemTintaDocFiscal, idItemDocFiscal, embalagemTinta, quantidade, quantidadeSaldo, quantidadeConferida, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXEMBALAGENSTIN', 'idEmbalagemTintaDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.embalagemTinta, x.quantidade, x.quantidadeSaldo, x.quantidadeConferida, x.observacoes FROM MOORCAMENTOXEMBALAGENSTIN x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXNUMEROSSERIE (idNumeroSerieDocFiscal, idItemDocFiscal, gradeProduto, idNumeroSerie, devolvidoRetornado) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.gradeProduto, x.idNumeroSerie, 0 FROM MOORCAMENTOXNUMEROSSERIE x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXCENTROSCUSTOS (idCentroCustoDocFiscal, idItemDocFiscal, idCentroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.idCentroCusto, x.percentualRateio FROM MOORCAMENTOXCENTROSCUSTOS x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXORCAMENTOITEM (id, idItemDocFiscal, idItemOrcamento, quantidade, efetivacao) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, itens.idItemOrcamento, itens.quantidade, 1);
      INSERT INTO MODOCFISCALXPROMOCOES (id, idDocumentoFiscal, cabecalhoItemPagamento, sequencia, idItemDocFiscal, idPagamentoDocFiscal, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_idDocumentoFiscal, x.cabecalhoItemPagamento, itens.sequencia, itens.idItemDocFiscal, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes FROM MOORCAMENTOXPROMOCOES x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOAVALIAMARGEMPRODXDOCFISC (id, idAvaliaMargemProduto, idItemDocFiscal) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOAVALIAMARGEMPRODXDOCFISC', 'id', 0, p_sys_estabelecimentoAtivo, NULL), x.idAvaliaMargemProduto, itens.idItemDocFiscal FROM MOAVALIAMARGEMPRODXORCAM x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      UPDATE MOCONSERTOS cons SET cons.situacaoConserto = 'R' WHERE cons.documentoTransferenciaFornec > 0 AND cons.situacaoConserto = 'E' AND EXISTS (SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec AND transfXDoc.entradaSaidaOriginal = 'E' AND transfXDoc.idItemOrcamento = itens.idItemOrcamento);
    FOR mot IN c_mot_item
      LOOP
        IF mot.idItemOrcamento = itens.idItemOrcamento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'D', v_idDocumentoFiscal, v_tipoDocumento, v_documentoFiscal, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, itens.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXDOCFISCALITENS (id, idMotivoBloqueioDocumento, idItemDocFiscal) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALITENS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, itens.idItemDocFiscal);
          INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END IF;
  END LOOP;
  UPDATE MOORCAMENTOXITENS SET quantidadeSaldo = 0 WHERE orcamento = p_orcamento AND cancelado = 0;
  FOR mot IN c_mot_cab
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'D', v_idDocumentoFiscal, v_tipoDocumento, v_documentoFiscal, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, 0, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXDOCUMENTOSFISC (id, idMotivoBloqueioDocumento, idDocumentoFiscal) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCUMENTOSFISC', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, v_idDocumentoFiscal);
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  FOR mot IN c_mot_pag
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'D', v_idDocumentoFiscal, v_tipoDocumento, v_documentoFiscal, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, a.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  ADD_RESERVA_ESTOQUE_ORC_CAB (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    p_orcamento);
  r_idDocumentoFiscal := v_idDocumentoFiscal;
END ADD_DOC_FISC_ROT_EFET_ORCAMENT;

/

create or replace PROCEDURE ADD_DOC_FISC_ROT_EFET_PRE_DOC (
  p_exclusivo                  IN VARCHAR2,
  p_1NFCe_2ConsFinal_3NF_4NFSe IN VARCHAR2,
  p_preDocumento               IN NUMBER,
  p_sys_estabelecimentoAtivo   IN NUMBER,
  p_nfFornecedor               IN NUMBER,
  p_idSerieFiscal              IN NUMBER,
  p_serieFiscal                IN VARCHAR2,
  p_subSerieFiscal             IN NUMBER,
  p_modeloDocumentoFiscal      IN VARCHAR2,
  p_documentoFiscal            IN NUMBER,
  p_data                       IN DATE,
  p_timezone                   IN VARCHAR2,
  p_versaoAplicativo           IN VARCHAR2,
  r_idDocumentoFiscal          OUT NUMBER)
IS
  v_excluirPreDoc     NUMBER;
  v_tipoDocumento     NUMBER;
  v_fatocontabil      NUMBER;
  v_estabelecimento   NUMBER;
  v_pessoa            NUMBER;
  v_sequenciaItem     NUMBER;
  v_documentoFiscal   NUMBER;
BEGIN
  r_idDocumentoFiscal := FUNC_ADD_BUSCA_PROXIMO_ID (
    'MODOCUMENTOSFISCAIS',
    'idDocumentoFiscal',
    0,
    p_sys_estabelecimentoAtivo,
    NULL);
  SELECT 
    CASE
      WHEN COALESCE (TRUNC (preDoc.dataEmissao), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
         = COALESCE (TRUNC (p_data), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
      THEN 1
      ELSE 0
    END,
    CASE
      WHEN preDoc.entradaSaida='E'
        AND preDoc.devolucaoAnulacaoRetorno = 1
      THEN 602
      WHEN preDoc.entradaSaida='E'
      THEN 601
      WHEN preDoc.devolucaoAnulacaoRetorno = 1
      THEN 502
      WHEN p_1NFCe_2ConsFinal_3NF_4NFSe IN ('1','2')
      THEN 503
      WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '4'
      THEN 506
      ELSE 501
    END,
    preDoc.fatocontabil,
    preDoc.estabelecimento,
    CASE
      WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '2'
      THEN 0
      ELSE preDoc.pessoa
    END,
    CASE
      WHEN p_nfFornecedor = 1
      THEN p_documentoFiscal
      ELSE FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS|' || LPAD (preDoc.estabelecimento,4,'0') || '|' || LPAD (p_idSerieFiscal,14,'0'), ' ', 0, 0,TRUNC(p_data))
    END
  INTO
    v_excluirPreDoc,
    v_tipoDocumento,
    v_fatocontabil,
    v_estabelecimento,
    v_pessoa,
    v_documentoFiscal
  FROM MOPREDOCUMENTOS preDoc
  WHERE preDoc.preDocumento = p_preDocumento;
  IF v_excluirPreDoc = 1 THEN
    IF v_fatocontabil > 0 THEN
      UPDATE MOFATOSCONTABEIS a SET a.situacaoContabilizacao = 'A' WHERE a.fatocontabil = v_fatocontabil AND a.situacaoContabilizacao = 'N';
    END IF;
  ELSE
    v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_sys_estabelecimentoAtivo, NULL);
    INSERT INTO MOFATOSCONTABEIS (
      fatoContabil,
      estabelecimento,
      data,
      ordenacao,
      situacaoTransacao,
      situacaoContabilizacao,
      sessao,
      observacoes)
    VALUES (
      v_fatoContabil,
      v_estabelecimento,
      p_data,
      0,
      'A',
      'A',
      0,
      ' ');
  END IF;
  INSERT INTO MODOCUMENTOSFISCAIS (
    idDocumentoFiscal,
    origemDocumento,
    tipoDocumento,
    tipoVenda,
    modeloDocumento,
    entradaSaida,
    devolucaoAnulacaoRetorno,
    finalidadeNota,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    validoFaturamento,
    usarPrecoAVista,
    sessao,
    sessaoCaixa,
    fatoContabil,
    idTerminalSiTef,
    estabelecimentoOriginal,
    estabelecimento,
    enderecoRetiradaEstabeleciment,
    indicadorPresencaComprador,
    controlaSeparacaoConferencia,
    nfFornecedor,
    idSerieFiscal,
    serieFiscal,
    subserieFiscal,
    modeloDocumentoFiscal,
    documentoFiscal,
    dataEmissao,
    timezoneEmissao,
    dataEntradaSaida,
    pessoa,
    vendaConsumidor,
    indicadorPessoa,
    indicadorDocumentoPessoa,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    fone,
    indicadorFone,
    operadoraTelefonia,
    autorizadoPessoa,
    enderecoEntregaPessoa,
    municipioFatoGerador,
    localDestinoOperacao,
    indicadorConsumidorFinal,
    projeto,
    contratoCompra,
    comissionadoB,
    comissionadoC,
    modalidadeFrete,
    tipoPagamentoFrete,
    transportadora,
    enderecoTransportadora,
    motorista,
    placa,
    vagao,
    balsa,
    quantidadeVolume,
    especieVolume,
    descricaoMarca,
    numeracaoVolume,
    codigoIntegracao,
    atendimento,
    tipoCTe,
    idContingenciaNfe,
    codigoNumericoNfe,
    digitoVerificadorNfe,
    formaEmissaoNfe,
    indicadorAmbienteNfe,
    qrCode,
    chaveNfe,
    situacaoDocumentoFiscal,
    ultimoVendedorItem,
    quantidade,
    pesoLiquido,
    pesoBruto,
    valorProdutosBruto,
    valorProdutos,
    valorDescontoProdutos,
    valorAcrescimoProdutos,
    valorServicosBruto,
    valorServicos,
    valorDescontoServicos,
    valorAcrescimoServicos,
    valorFreteItem,
    valorSeguroItem,
    valorAdicFreteMarinhaMerItem,
    valorDespesasAduaneirasItem,
    valorFreteGeral,
    valorSeguroGeral,
    valorDescontoGeral,
    valorOutrasDespesasGeral,
    valorAdicFreteMarinhaMerGeral,
    valorDespesasAduaneirasGeral,
    condicaoPagamento,
    contaFinanceira,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorBasePagamento,
    valorAVistaMinimo,
    valorEntradaMinima,
    valorAVistaEntrada,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorTroco,
    valorFreteTotal,
    valorSeguroTotal,
    valorDescontoTotal,
    valorOutrasDespesasTotal,
    valorAdicFreteMarinhaMerTotal,
    valorDespesasAduaneirasTotal,
    impostosEditados,
    valorImpostosSomaPagamento,
    valorImpostosDiminuiPagamento,
    valorLiquidoItem,
    valorDescontoCustoOpItem,
    valorDescontoCustoOpGeral,
    valorDescontoCustoOpTotal,
    valorAcrescimoCustoOpItem,
    valorAcrescimoCustoOpGeral,
    valorAcrescimoCustoOpTotal,
    valorCustoOperacao,
    valorCMV,
    quantidadeExtemporanea,
    valorAcrescimoExtempSubtotal,
    valorAcrescimoExtempItem,
    valorAcrescimoExtempGeral,
    valorAcrescimoExtempTotal,
    versaoAplicativo)
  SELECT
    r_idDocumentoFiscal,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.origemDocumento ELSE 13 END,
    v_tipoDocumento,
    preDoc.tipoVenda,
    preDoc.modeloDocumento,
    preDoc.entradaSaida,
    preDoc.devolucaoAnulacaoRetorno,
    preDoc.finalidadeNota,
    preDoc.atualizaCustoMedio,
    preDoc.atualizaUltimaCompra,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.validoFaturamento ELSE 0 END,
    preDoc.usarPrecoAVista,
    preDoc.sessao,
    preDoc.sessaoCaixa,
    v_fatoContabil,
    preDoc.idTerminalSiTef,
    preDoc.estabelecimentoOriginal,
    v_estabelecimento,
    preDoc.enderecoRetiradaEstabeleciment,
    preDoc.indicadorPresencaComprador,
    preDoc.controlaSeparacaoConferencia,
    p_nfFornecedor,
    p_idSerieFiscal,
    p_serieFiscal,
    p_subserieFiscal,
    p_modeloDocumentoFiscal,
    v_documentoFiscal,
    p_data dataEmissao,
    p_timezone timezoneEmissao,
    p_data dataEntradaSaida,
    CASE WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '2' THEN 0 ELSE preDoc.pessoa END pessoa,
    CASE WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '2' THEN 1 ELSE 0 END vendaConsumidor,
    preDoc.indicadorPessoa,
    preDoc.indicadorDocumentoPessoa,
    preDoc.cnpjCpfIdEstrangeiro,
    preDoc.nomeRazaoSocial,
    preDoc.fone,
    preDoc.indicadorFone,
    preDoc.operadoraTelefonia,
    CASE WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '2' THEN 0 ELSE preDoc.autorizadoPessoa END autorizadoPessoa,
    CASE WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '2' THEN 0 ELSE preDoc.enderecoEntregaPessoa END enderecoEntregaPessoa,
    CASE
      WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '2'
      THEN COALESCE ((SELECT MAX(endEst.municipio) FROM CAENDERECOSPESSOA endEst WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1),0)
      ELSE preDoc.municipioFatoGerador
    END municipioFatoGerador,
    CASE WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '2' THEN '1' ELSE preDoc.localDestinoOperacao END localDestinoOperacao,
    CASE WHEN p_1NFCe_2ConsFinal_3NF_4NFSe = '2' THEN '1' ELSE preDoc.indicadorConsumidorFinal END indicadorConsumidorFinal,
    preDoc.projeto,
    preDoc.contratoCompra,
    preDoc.comissionadoB,
    preDoc.comissionadoC,
    CASE WHEN preDoc.modalidadeFrete = ' ' THEN '9' ELSE preDoc.modalidadeFrete END,
    CASE WHEN preDoc.tipoPagamentoFrete = ' ' THEN 'N' ELSE preDoc.tipoPagamentoFrete END,
    preDoc.transportadora,
    preDoc.enderecoTransportadora,
    preDoc.motorista,
    preDoc.placa,
    preDoc.vagao,
    preDoc.balsa,
    preDoc.quantidadeVolume,
    preDoc.especieVolume,
    preDoc.descricaoMarca,
    preDoc.numeracaoVolume,
    preDoc.codigoIntegracao,
    preDoc.atendimento,
    '0' tipoCTe,
    0 idContingenciaNfe,
    0 codigoNumericoNfe,
    0 digitoVerificadorNfe,
    ' ' formaEmissaoNfe,
    est.indicadorAmbienteNfe,
    ' ' qrCode,
    ' ' chaveNfe,
    11 situacaoDocumentoFiscal,
    preDoc.ultimoVendedorItem,
    preDoc.quantidade,
    preDoc.pesoLiquido,
    preDoc.pesoBruto,
    preDoc.valorProdutosBruto,
    preDoc.valorProdutos,
    preDoc.valorDescontoProdutos,
    preDoc.valorAcrescimoProdutos,
    preDoc.valorServicosBruto,
    preDoc.valorServicos,
    preDoc.valorDescontoServicos,
    preDoc.valorAcrescimoServicos,
    preDoc.valorFreteItem,
    preDoc.valorSeguroItem,
    preDoc.valorAdicFreteMarinhaMerItem,
    preDoc.valorDespesasAduaneirasItem,
    preDoc.valorFreteGeral,
    preDoc.valorSeguroGeral,
    preDoc.valorDescontoGeral + CASE WHEN v_excluirPreDoc = 1 THEN 0 ELSE preDoc.valorDescontoPagamento END,
    preDoc.valorOutrasDespesasGeral + CASE WHEN v_excluirPreDoc = 1 THEN 0 ELSE preDoc.valorOutrasDespesasPagamento + preDoc.valorJurosPagamento END,
    preDoc.valorAdicFreteMarinhaMerGeral,
    preDoc.valorDespesasAduaneirasGeral,
    preDoc.condicaoPagamento,
    preDoc.contaFinanceira,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.numeroParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.somaPrazoParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorXPrazoParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.prazoMedio ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.prazoMedioPonderado ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorBasePagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorAVistaMinimo ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorEntradaMinima ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorAVistaEntrada ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorPagamentoBruto ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorDescontoPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorOutrasDespesasPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorJurosPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorPagamentoLiquido ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorTroco ELSE 0 END,
    preDoc.valorFreteTotal,
    preDoc.valorSeguroTotal,
    preDoc.valorDescontoTotal,
    preDoc.valorOutrasDespesasTotal,
    preDoc.valorAdicFreteMarinhaMerTotal,
    preDoc.valorDespesasAduaneirasTotal,
    preDoc.impostosEditados,
    preDoc.valorImpostosSomaPagamento,
    preDoc.valorImpostosDiminuiPagamento,
    preDoc.valorLiquidoItem,
    preDoc.valorDescontoCustoOpItem,
    preDoc.valorDescontoCustoOpGeral,
    preDoc.valorDescontoCustoOpTotal,
    preDoc.valorAcrescimoCustoOpItem,
    preDoc.valorAcrescimoCustoOpGeral,
    preDoc.valorAcrescimoCustoOpTotal,
    preDoc.valorCustoOperacao,
    preDoc.valorCMV,
    preDoc.quantidadeExtemporanea,
    preDoc.valorAcrescimoExtempSubtotal,
    preDoc.valorAcrescimoExtempItem,
    preDoc.valorAcrescimoExtempGeral,
    preDoc.valorAcrescimoExtempTotal,
    p_versaoAplicativo
  FROM MOPREDOCUMENTOS preDoc
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = preDoc.estabelecimento
  WHERE preDoc.preDocumento = p_preDocumento;
  IF p_1NFCe_2ConsFinal_3NF_4NFSe = '4'
  THEN
    INSERT INTO MODOCFISCALXSERVICO (
      idDocumentoFiscal,
      dataCompetencia,
      intermediario,
      idObra,
      numeroRPS,
      numeroNFSe,
      codigoVerificacaoNFSe,
      descricaoServico)
    VALUES (
      r_idDocumentoFiscal,
      TRUNC(p_data),
      0,
      0,
      TO_CHAR (v_documentoFiscal),
      ' ',
      ' ',
      ' ');
  END IF;
  INSERT INTO MODOCFISCALXPERSPROJETO (
    idPersonProjetoDocFiscal,
    idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPERSPROJETO', 'idPersonProjetoDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo
  FROM MOPREDOCUMXPERSPROJETO
  WHERE preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXINFOCOMPLEMEN (
    id,
    idDocumentoFiscal,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXINFOCOMPLEMEN', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar
  FROM MOPREDOCUMXINFOCOMPLENT
  WHERE preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXPROMOCOES (
    id,
    idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    idItemDocFiscal,
    idPagamentoDocFiscal,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    0,
    0,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes
  FROM MOPREDOCUMXPROMOCOES
  WHERE preDocumento = p_preDocumento
  AND idItemPreDocumento = 0
  AND idPagamentoPreDocumento = 0;
  v_sequenciaItem := 0;
  FOR itens IN (
    SELECT
      item.idItemPreDocumento,
      CASE
        WHEN cancelado = 0
        THEN FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXITENS', 'idItemDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL)
        ELSE 0
      END idItemDocFiscal,
      item.sequencia,
      item.cancelado,
      item.pedidoCompraFornecedor,
      item.sequenciaPedidoCompraFornec,
      item.estabelecimentoOriginal,
      item.modeloDocumento,
      item.vendedor,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.controleQuantidade,
      item.unidadeMedidaConversao,
      item.conversorQuantidade,
      item.loteMinimo,
      item.loteMultiplo,
      item.altura,
      item.largura,
      item.comprimento,
      item.pecas,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.tipoPreco,
      item.tabelaPreco,
      item.precoSugestaoAPrazo,
      item.precoSugestaoAVista,
      item.precoDesconto,
      item.precoMinimo,
      item.usarPrecoAVista,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.precoUnitarioConvertido,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.percDescontoItem,
      item.valorDescontoItem,
      item.percAcrescimoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorDescontoCustoOpItem,
      item.valorAcrescimoCustoOpItem, 
      item.observacoesDigitadas,
      item.observacoes,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorAcrescimoExtempGeral,
      item.valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorAcrescimoExtempTotal,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpTotal,
      item.percentualDevolucao,
      item.valorIPIDevolucao, 
      item.operacaoFiscal,
      item.movimentaEstoque,
      item.geraFinanceiro,
      item.cfop,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      item.retidoISSQN,
      item.tributadoForaMunicipio,
      item.incentivoFiscal,
      item.listaServicos,
      item.cnae,
      item.idServicoMunicipio,
      item.numeroProcessoAdministrativo,
      item.retencaoIRRF,
      item.retencaoINSS,
      item.retencaoPIS,
      item.retencaoCOFINS,
      item.retencaoCSLL,
      item.retencaoOutros,
      item.aliquotaII,
      item.aliquotaIOF,
      item.codigoEnquadramentoIPI,
      item.stIPI,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      item.stPIS,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      item.stCOFINS,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      item.motivoDesoneracaoICMS,
      item.idBeneficio,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      item.aliquotaSTSuportConsFinal,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND prod.tipoProduto IN('07','08')
        THEN '90'
        WHEN p_nfFornecedor = 1 AND item.stICMS IN('10','30','70')
          OR p_nfFornecedor = 1 AND item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203')
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN '60'
        WHEN item.stICMS <> ' '
        THEN item.stICMS
        WHEN item.stSimplesNacional IN ('101','102') AND item.reducaoBaseICMS = 0
        THEN '00'
        WHEN item.stSimplesNacional IN ('101','102')
        THEN '20'
        WHEN item.stSimplesNacional IN ('103','300')
        THEN '40'
        WHEN item.stSimplesNacional IN ('201','202','203') AND item.reducaoBaseICMS = 0
        THEN '10' WHEN item.stSimplesNacional IN ('201','202','203')
        THEN '70' WHEN item.stSimplesNacional = '400'
        THEN '41'
        ELSE '90'
      END stICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.reducaoBaseICMS
        ELSE 0
      END reducaoBaseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.aliquotaICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.creditoSimplesNacional
        ELSE 0
      END aliquotaICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.diferimentoICMS
        ELSE 0
      END diferimentoICMSEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.margemValorAdicionadoST
      END margemValorAdicSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.reducaoBaseST
      END reducaoBaseSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.aliquotaICMSST
      END aliquotaICMSSTEscrituracao,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      item.aliquotaFCP,
      item.aliquotaFCPST,
      item.aliquotaFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      item.baseISSQN,
      item.valorISSQN,
      item.baseRetIRRF,
      item.valorRetIRRF,
      item.baseRetINSS,
      item.valorRetINSS,
      item.baseRetPIS,
      item.valorRetPIS,
      item.baseRetCOFINS,
      item.valorRetCOFINS,
      item.baseRetCSLL,
      item.valorRetCSLL,
      item.baseRetOutros,
      item.valorRetOutros,
      item.baseII,
      item.valorII,
      item.baseIOF,
      item.valorIOF,
      item.baseIPI,
      item.valorIPI,
      item.basePIS,
      item.valorPIS,
      item.basePISST,
      item.valorPISST,
      item.baseCOFINS,
      item.valorCOFINS,
      item.baseCOFINSST,
      item.valorCOFINSST,
      item.baseCreditoSimplesNacional,
      item.valorCreditoSimplesNacional,
      item.baseICMS,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.baseICMSST,
      item.valorICMSST,
      item.baseICMSSTAnteriormente,
      item.valorICMSSTAnteriormente,
      item.valorICMSProprioSubstituto,
      item.baseICMSEfetivo,
      item.valorICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' ' AND p_nfFornecedor = 1
        THEN ROUND(item.baseICMS *(1-item.diferimentoICMS/100),2)
        WHEN item.stICMS <> ' '
        THEN item.baseICMS
        WHEN item.stSimplesNacional IN ('101','201') AND item.baseCreditoSimplesNacional = 0
        THEN item.valorProdutoServico
          - item.valorDescontoTotal
          + item.valorOutrasDespesasTotal
          + item.valorAdicFreteMarinhaMerTotal
          + item.valorDespesasAduaneirasTotal
          + item.valorII
          + item.valorIOF
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.baseCreditoSimplesNacional
        ELSE 0
      END baseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.valorCreditoSimplesNacional
        ELSE 0
      END valorICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMSDesoneracao
        ELSE 0
      END valorICMSDesonEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.baseICMSST
      END baseICMSSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.valorICMSST
      END valorICMSSTEscrituracao,
      1 somarICMSST,
      item.baseICMSUFDestinatario,
      item.valorICMSUFDestinatario,
      item.baseICMSUFRemetente,
      item.valorICMSUFRemetente,
      item.baseFCP,
      item.valorFCP,
      item.baseFCPST,
      item.valorFCPST,
      item.baseFCPSTAnteriormente,
      item.valorFCPSTAnteriormente,
      item.baseFCPUFDestinatario,
      item.valorFCPUFDestinatario,
      item.baseEstimadaImpostos,
      item.valorEstimadoImpFederais,
      item.valorEstimadoImpEstaduais,
      item.valorEstimadoImpMunicipais,
      item.valorBasePagamento,
      item.valorLiquidoItem,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV
     FROM MOPREDOCUMXITENS item
     JOIN CAGRADESPRODUTO gradProd
     ON gradProd.gradeProduto = item.gradeProduto
     JOIN CAPRODUTOS prod
     ON prod.produto = gradProd.produto
     WHERE item.preDocumento = p_preDocumento
     ORDER BY item.sequencia)
  LOOP
    IF itens.cancelado = 0 THEN
      v_sequenciaItem := v_sequenciaItem + 1;
        INSERT INTO MODOCFISCALXITENS (
        idItemDocFiscal,
        idDocumentoFiscal,
        sequencia,
        cancelado,
        pedidoCompraFornecedor,
        sequenciaPedidoCompraFornec,
        modeloDocumento,
        estabelecimentoOriginal,
        vendedor,
        gradeProduto,
        idFormulaTinta,
        personalizacao,
        idLoteEstoque,
        localEstoque,
        pessoaParticipante,
        controleQuantidade,
        unidadeMedidaConversao,
        conversorQuantidade,
        loteMinimo,
        loteMultiplo,
        altura,
        largura,
        comprimento,
        pecas,
        quantidade,
        quantidadeConvertida,
        quantidadeDevolvidaRetornada,
        pesoLiquido,
        pesoBruto,
        tipoPreco,
        tabelaPreco,
        precoSugestaoAPrazo,
        precoSugestaoAVista,
        precoDesconto,
        precoMinimo,
        usarPrecoAVista,
        precoUnitarioBruto,
        acrescimoUnitarioComposicao,
        precoUnitario,
        precoUnitarioConvertido,
        valorProdutoServicoBruto,
        valorProdutoServico,
        percDescontoItem,
        valorDescontoItem,
        percAcrescimoItem,
        valorAcrescimoItem,
        valorFreteItem,
        valorSeguroItem,
        valorAdicFreteMarinhaMerItem,
        valorDespesasAduaneirasItem,
        quantidadeExtemporanea,
        acrescimoUnitarioExtemporaneo,
        valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempItem,
        valorDescontoCustoOpItem,
        valorAcrescimoCustoOpItem,
        observacoesDigitadas,
        observacoes,
        valorFreteGeral,
        valorSeguroGeral,
        valorDescontoGeral,
        valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral,
        valorDespesasAduaneirasGeral,
        valorAcrescimoExtempGeral,
        valorDescontoCustoOpGeral,
        valorAcrescimoCustoOpGeral,
        valorDescontoPagamento,
        valorOutrasDespesasPagamento,
        valorJurosPagamento,
        valorFreteTotal,
        valorSeguroTotal,
        valorDescontoTotal,
        valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal,
        valorDespesasAduaneirasTotal,
        valorAcrescimoExtempTotal,
        valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpTotal,
        percentualDevolucao,
        valorIPIDevolucao,
        operacaoFiscal,
        movimentaEstoque,
        movimentaEstoqueFiscal,
        geraFinanceiro,
        cfop,
        indicadorISSQN,
        aliquotaISSQN,
        retidoISSQN,
        tributadoForaMunicipio,
        incentivoFiscal,
        listaServicos,
        cnae,
        idServicoMunicipio,
        numeroProcessoAdministrativo,
        retencaoIRRF,
        retencaoINSS,
        retencaoPIS,
        retencaoCOFINS,
        retencaoCSLL,
        retencaoOutros,
        aliquotaII,
        aliquotaIOF,
        codigoEnquadramentoIPI,
        stIPI,
        aliquotaIPI,
        valorAliquotaIPI,
        stPIS,
        aliquotaPIS,
        valorAliquotaPIS,
        aliquotaPISST,
        valorAliquotaPISST,
        stCOFINS,
        aliquotaCOFINS,
        valorAliquotaCOFINS,
        aliquotaCOFINSST,
        valorAliquotaCOFINSST,
        stSimplesNacional,
        creditoSimplesNacional,
        stICMS,
        modalidadeBaseCalcICMS,
        reducaoBaseICMS,
        aliquotaICMS,
        diferimentoICMS,
        motivoDesoneracaoICMS,
        idBeneficio,
        modalidadeBaseCalcICMSST,
        margemValorAdicionadoST,
        reducaoBaseST,
        aliquotaICMSST,
        aliquotaSTSuportConsFinal,
        reducaoBaseICMSEfetivo,
        aliquotaICMSEfetivo,
        stICMSEscrituracao,
        reducaoBaseICMSEscrituracao,
        aliquotaICMSEscrituracao,
        diferimentoICMSEscrituracao,
        margemValorAdicSTEscrituracao,
        reducaoBaseSTEscrituracao,
        aliquotaICMSSTEscrituracao,
        somarICMSST,
        aliquotaICMSUFDestinatario,
        aliquotaICMSInterestadual,
        partilhaICMSInterestadual,
        aliquotaFCP,
        aliquotaFCPST,
        aliquotaFCPSTAnteriormente,
        aliquotaFCPUFDestinatario,
        aliquotaEstimadaImpFederais,
        aliquotaEstimadaImpEstaduais,
        aliquotaEstimadaImpMunicipais,
        baseISSQN,
        valorISSQN,
        baseRetIRRF,
        valorRetIRRF,
        baseRetINSS,
        valorRetINSS,
        baseRetPIS,
        valorRetPIS,
        baseRetCOFINS,
        valorRetCOFINS,
        baseRetCSLL,
        valorRetCSLL,
        baseRetOutros,
        valorRetOutros,
        baseII,
        valorII,
        baseIOF,
        valorIOF,
        baseIPI,
        valorIPI,
        basePIS,
        valorPIS,
        basePISST,
        valorPISST,
        baseCOFINS,
        valorCOFINS,
        baseCOFINSST,
        valorCOFINSST,
        baseCreditoSimplesNacional,
        valorCreditoSimplesNacional,
        baseICMS,
        valorICMSOperacao,
        valorICMSDiferido,
        valorICMS,
        valorICMSDesoneracao,
        baseICMSST,
        valorICMSST,
        baseICMSSTAnteriormente,
        valorICMSSTAnteriormente,
        valorICMSProprioSubstituto,
        baseICMSEfetivo,
        valorICMSEfetivo,
        baseICMSEscrituracao,
        valorICMSEscrituracao,
        valorICMSDesonEscrituracao,
        baseICMSSTEscrituracao,
        valorICMSSTEscrituracao,
        baseICMSUFDestinatario,
        valorICMSUFDestinatario,
        baseICMSUFRemetente,
        valorICMSUFRemetente,
        baseFCP,
        valorFCP,
        baseFCPST,
        valorFCPST,
        baseFCPSTAnteriormente,
        valorFCPSTAnteriormente,
        baseFCPUFDestinatario,
        valorFCPUFDestinatario,
        baseEstimadaImpostos,
        valorEstimadoImpFederais,
        valorEstimadoImpEstaduais,
        valorEstimadoImpMunicipais,
        valorBasePagamento,
        valorLiquidoItem,
        precoCustoOperacao,
        valorCustoOperacao,
        precoCMV,
        valorCMV)
      VALUES (
        itens.idItemDocFiscal,
        r_idDocumentoFiscal,
        itens.sequencia,
        itens.cancelado,
        itens.pedidoCompraFornecedor,
        itens.sequenciaPedidoCompraFornec,
        itens.modeloDocumento,
        itens.estabelecimentoOriginal,
        itens.vendedor,
        itens.gradeProduto,
        itens.idFormulaTinta,
        itens.personalizacao,
        itens.idLoteEstoque,
        itens.localEstoque,
        itens.pessoaParticipante,
        itens.controleQuantidade,
        itens.unidadeMedidaConversao,
        itens.conversorQuantidade,
        itens.loteMinimo,
        itens.loteMultiplo,
        itens.altura,
        itens.largura,
        itens.comprimento,
        itens.pecas,
        itens.quantidade,
        itens.quantidadeConvertida,
        0,
        itens.pesoLiquido,
        itens.pesoBruto,
        itens.tipoPreco,
        itens.tabelaPreco,
        itens.precoSugestaoAPrazo,
        itens.precoSugestaoAVista,
        itens.precoDesconto,
        itens.precoMinimo,
        itens.usarPrecoAVista,
        itens.precoUnitarioBruto,
        itens.acrescimoUnitarioComposicao,
        itens.precoUnitario,
        itens.precoUnitarioConvertido,
        itens.valorProdutoServicoBruto,
        itens.valorProdutoServico,
        itens.percDescontoItem,
        itens.valorDescontoItem,
        itens.percAcrescimoItem,
        itens.valorAcrescimoItem,
        itens.valorFreteItem,
        itens.valorSeguroItem,
        itens.valorAdicFreteMarinhaMerItem,
        itens.valorDespesasAduaneirasItem,
        itens.quantidadeExtemporanea,
        itens.acrescimoUnitarioExtemporaneo,
        itens.valorAcrescimoExtempSubtotal,
        itens.valorAcrescimoExtempItem,
        itens.valorDescontoCustoOpItem,
        itens.valorAcrescimoCustoOpItem,
        itens.observacoesDigitadas,
        itens.observacoes,
        itens.valorFreteGeral,
        itens.valorSeguroGeral,
        itens.valorDescontoGeral +
        CASE
          WHEN v_excluirPreDoc = 1
          THEN 0
          ELSE itens.valorDescontoPagamento
        END,
        itens.valorOutrasDespesasGeral +
        CASE
          WHEN v_excluirPreDoc = 1
          THEN 0
          ELSE itens.valorOutrasDespesasPagamento + itens.valorJurosPagamento
        END,
        itens.valorAdicFreteMarinhaMerGeral,
        itens.valorDespesasAduaneirasGeral,
        itens.valorAcrescimoExtempGeral,
        itens.valorDescontoCustoOpGeral,
        itens.valorAcrescimoCustoOpGeral,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorDescontoPagamento
          ELSE 0
        END,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorOutrasDespesasPagamento
          ELSE 0
        END,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorJurosPagamento
          ELSE 0
        END,
        itens.valorFreteTotal,
        itens.valorSeguroTotal,
        itens.valorDescontoTotal,
        itens.valorOutrasDespesasTotal,
        itens.valorAdicFreteMarinhaMerTotal,
        itens.valorDespesasAduaneirasTotal,
        itens.valorAcrescimoExtempTotal,
        itens.valorDescontoCustoOpTotal,
        itens.valorAcrescimoCustoOpTotal,
        itens.percentualDevolucao,
        itens.valorIPIDevolucao,
        itens.operacaoFiscal,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.movimentaEstoque
          ELSE 0
        END,
        itens.movimentaEstoque,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.geraFinanceiro
          ELSE 0
        END,
        itens.cfop,
        itens.indicadorISSQN,
        itens.aliquotaISSQN,
        itens.retidoISSQN,
        itens.tributadoForaMunicipio,
        itens.incentivoFiscal,
        itens.listaServicos,
        itens.cnae,
        itens.idServicoMunicipio,
        itens.numeroProcessoAdministrativo,
        itens.retencaoIRRF,
        itens.retencaoINSS,
        itens.retencaoPIS,
        itens.retencaoCOFINS,
        itens.retencaoCSLL,
        itens.retencaoOutros,
        itens.aliquotaII,
        itens.aliquotaIOF,
        itens.codigoEnquadramentoIPI,
        itens.stIPI,
        itens.aliquotaIPI,
        itens.valorAliquotaIPI,
        itens.stPIS,
        itens.aliquotaPIS,
        itens.valorAliquotaPIS,
        itens.aliquotaPISST,
        itens.valorAliquotaPISST,
        itens.stCOFINS,
        itens.aliquotaCOFINS,
        itens.valorAliquotaCOFINS,
        itens.aliquotaCOFINSST,
        itens.valorAliquotaCOFINSST,
        itens.stSimplesNacional,
        itens.creditoSimplesNacional,
        itens.stICMS,
        itens.modalidadeBaseCalcICMS,
        itens.reducaoBaseICMS,
        itens.aliquotaICMS,
        itens.diferimentoICMS,
        itens.motivoDesoneracaoICMS,
        itens.idBeneficio,
        itens.modalidadeBaseCalcICMSST,
        itens.margemValorAdicionadoST,
        itens.reducaoBaseST,
        itens.aliquotaICMSST,
        itens.aliquotaSTSuportConsFinal,
        itens.reducaoBaseICMSEfetivo,
        itens.aliquotaICMSEfetivo,
        itens.stICMSEscrituracao,
        itens.reducaoBaseICMSEscrituracao,
        itens.aliquotaICMSEscrituracao,
        itens.diferimentoICMSEscrituracao,
        itens.margemValorAdicSTEscrituracao,
        itens.reducaoBaseSTEscrituracao,
        itens.aliquotaICMSSTEscrituracao,
        itens.somarICMSST,
        itens.aliquotaICMSUFDestinatario,
        itens.aliquotaICMSInterestadual,
        itens.partilhaICMSInterestadual,
        itens.aliquotaFCP,
        itens.aliquotaFCPST,
        itens.aliquotaFCPSTAnteriormente,
        itens.aliquotaFCPUFDestinatario,
        itens.aliquotaEstimadaImpFederais,
        itens.aliquotaEstimadaImpEstaduais,
        itens.aliquotaEstimadaImpMunicipais,
        itens.baseISSQN,
        itens.valorISSQN,
        itens.baseRetIRRF,
        itens.valorRetIRRF,
        itens.baseRetINSS,
        itens.valorRetINSS,
        itens.baseRetPIS,
        itens.valorRetPIS,
        itens.baseRetCOFINS,
        itens.valorRetCOFINS,
        itens.baseRetCSLL,
        itens.valorRetCSLL,
        itens.baseRetOutros,
        itens.valorRetOutros,
        itens.baseII,
        itens.valorII,
        itens.baseIOF,
        itens.valorIOF,
        itens.baseIPI,
        itens.valorIPI,
        itens.basePIS,
        itens.valorPIS,
        itens.basePISST,
        itens.valorPISST,
        itens.baseCOFINS,
        itens.valorCOFINS,
        itens.baseCOFINSST,
        itens.valorCOFINSST,
        itens.baseCreditoSimplesNacional,
        itens.valorCreditoSimplesNacional,
        itens.baseICMS,
        itens.valorICMSOperacao,
        itens.valorICMSDiferido,
        itens.valorICMS,
        itens.valorICMSDesoneracao,
        itens.baseICMSST,
        itens.valorICMSST,
        itens.baseICMSSTAnteriormente,
        itens.valorICMSSTAnteriormente,
        itens.valorICMSProprioSubstituto,
        itens.baseICMSEfetivo,
        itens.valorICMSEfetivo,
        itens.baseICMSEscrituracao,
        itens.valorICMSEscrituracao,
        itens.valorICMSDesonEscrituracao,
        itens.baseICMSSTEscrituracao,
        itens.valorICMSSTEscrituracao,
        itens.baseICMSUFDestinatario,
        itens.valorICMSUFDestinatario,
        itens.baseICMSUFRemetente,
        itens.valorICMSUFRemetente,
        itens.baseFCP,
        itens.valorFCP,
        itens.baseFCPST,
        itens.valorFCPST,
        itens.baseFCPSTAnteriormente,
        itens.valorFCPSTAnteriormente,
        itens.baseFCPUFDestinatario,
        itens.valorFCPUFDestinatario,
        itens.baseEstimadaImpostos,
        itens.valorEstimadoImpFederais,
        itens.valorEstimadoImpEstaduais,
        itens.valorEstimadoImpMunicipais,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorBasePagamento
          ELSE 0
        END,
        itens.valorLiquidoItem,
        itens.precoCustoOperacao,
        itens.valorCustoOperacao,
        itens.precoCMV,
        itens.valorCMV);
      INSERT INTO MODOCFISCALXCOMPOSICOESPR (
        id,
        idItemDocFiscal,
        composicaoPreco,
        selecionado,
        quantidade,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCOMPOSICOESPR', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.composicaoPreco,
        x.selecionado,
        x.quantidade,
        x.observacoes
      FROM MOPREDOCUMXCOMPOSICOESPR x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXEMBALAGENSTIN (
        idEmbalagemTintaDocFiscal,
        idItemDocFiscal,
        embalagemTinta,
        quantidade,
        quantidadeSaldo,
        quantidadeConferida,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXEMBALAGENSTIN', 'idEmbalagemTintaDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.embalagemTinta,
        x.quantidade,
        x.quantidadeSaldo,
        x.quantidadeConferida,
        x.observacoes
      FROM MOPREDOCUMXEMBALAGENSTIN x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXNUMEROSSERIE (
        idNumeroSerieDocFiscal,
        idItemDocFiscal,
        gradeProduto,
        idNumeroSerie,
        devolvidoRetornado)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.gradeProduto,
        x.idNumeroSerie,
        x.devolvidoRetornado
      FROM MOPREDOCUMXNUMEROSSERIE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXCENTROSCUSTOS (
        idCentroCustoDocFiscal,
        idItemDocFiscal,
        idCentroCusto,
        percentualRateio)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.idCentroCusto,
        x.percentualRateio
      FROM MOPREDOCUMXCENTROSCUSTOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXPROJETOS (id,
        idItemDocFiscal,
        projeto)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROJETOS', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.projeto
      FROM MOPREDOCUMXPROJETOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXPROMOCOES (
        id,
        idDocumentoFiscal,
        cabecalhoItemPagamento,
        sequencia,
        idItemDocFiscal,
        idPagamentoDocFiscal,
        regraPromocao,
        tipoBeneficio,
        multiplicador,
        precoUnitarioDe,
        precoUnitarioPor,
        precoDesconto,
        precoMinimo,
        percentualDesconto,
        valorDesconto,
        pontuacao,
        gerarPontuacao,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
        r_idDocumentoFiscal,
        x.cabecalhoItemPagamento,
        itens.sequencia,
        itens.idItemDocFiscal,
        0,
        x.regraPromocao,
        x.tipoBeneficio,
        x.multiplicador,
        x.precoUnitarioDe,
        x.precoUnitarioPor,
        x.precoDesconto,
        x.precoMinimo,
        x.percentualDesconto,
        x.valorDesconto,
        x.pontuacao,
        x.gerarPontuacao,
        x.observacoes
      FROM MOPREDOCUMXPROMOCOES x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MOAVALIAMARGEMPRODXDOCFISC (
        id,
        idAvaliaMargemProduto,
        idItemDocFiscal)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MOAVALIAMARGEMPRODXDOCFISC', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
        x.idAvaliaMargemProduto,
        itens.idItemDocFiscal
      FROM MOAVALIAMARGEMPRODXPREDOC x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
    END IF;
    FOR mot IN (
    SELECT
      a.idMotivoBloqueioDocumento,
      a.idItemPreDocumento,
      FUNC_ADD_BUSCA_PROXIMO_ID (
        'MOMOTIVOSBLOQUEIOS',
        'idMotivoBloqueioDocumento',
        0,
        p_sys_estabelecimentoAtivo,
        NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOPREDOCUMXITENS b
    ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    AND b.cancelado = 0)
    LOOP
      IF mot.idItemPreDocumento = itens.idItemPreDocumento THEN
        INSERT INTO MOMOTIVOSBLOQUEIOS (
          idMotivoBloqueioDocumento,
          origem,
          idCabecalho,
          tipoDocumento,
          idDocumento,
          estabelecimento,
          pessoa,
          cabecalhoItemPagamento,
          sequencia,
          condicaoPagamento,
          vendedor,
          gradeProduto,
          unidadeMedidaConversao,
          quantidadeConvertida,
          valorLiquido,
          motivoBloqueioDocumento,
          dataBloqueio,
          baseBloqueado,
          valorBloqueado,
          percentualBloqueado,
          situacaoLiberacao,
          observacoes)
        SELECT
          mot.idMotivoBloqueioNovo,
          'D',
          r_idDocumentoFiscal,
          v_tipoDocumento,
          v_documentoFiscal,
          v_estabelecimento,
          v_pessoa,
          a.cabecalhoItemPagamento,
          itens.sequencia,
          a.condicaoPagamento,
          a.vendedor,
          a.gradeProduto,
          a.unidadeMedidaConversao,
          a.quantidadeConvertida,
          a.valorLiquido,
          a.motivoBloqueioDocumento,
          a.dataBloqueio,
          a.baseBloqueado,
          a.valorBloqueado,
          a.percentualBloqueado,
          a.situacaoLiberacao, a.observacoes
        FROM MOMOTIVOSBLOQUEIOS a
        WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        INSERT INTO MOMOTBLOQXDOCFISCALITENS (
          id,
          idMotivoBloqueioDocumento,
          idItemDocFiscal)
        VALUES (
          FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALITENS', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          mot.idMotivoBloqueioNovo,
          itens.idItemDocFiscal);
        INSERT INTO MOMOTBLOQXLIBERACOES (
          id,
          idMotivoBloqueioDocumento,
          usuario,
          dataLiberacao,
          valorLiberado,
          percentualLiberado,
          percentualAlcada,
          situacaoLiberacao,
          observacoes)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          mot.idMotivoBloqueioNovo,
          a.usuario,
          a.dataLiberacao,
          a.valorLiberado,
          a.percentualLiberado,
          a.percentualAlcada,
          a.situacaoLiberacao, a.observacoes
        FROM MOMOTBLOQXLIBERACOES a
        WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        IF v_excluirPreDoc = 1 THEN
          DELETE MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXPREDOCUMITENS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTIVOSBLOQUEIOS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END IF;
    END LOOP;
    IF v_excluirPreDoc = 1 THEN
      IF itens.cancelado = 0 THEN
        INSERT INTO MODOCFISCALXORCAMENTOITEM (
          id,
          idItemDocFiscal,
          idItemOrcamento,
          quantidade,
          efetivacao)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemOrcamento,
          x.quantidade,
          x.efetivacao
        FROM MOPREDOCUMXORCAMENTOITEM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MOPREDOCUMXDOCFISCAL (
          id,
          idItemPreDocumento,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXDOCFISCAL', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          x.idItemPreDocumento,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MOPREDOCUMXPREDOCUM x
        WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXPREDOCUM (
          id,
          idItemDocFiscal,
          idItemPreDocReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPREDOCUM', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemPreDocReferenciado,
          x.quantidade
        FROM MOPREDOCUMXPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXDOCFISCAL (
          id,
          idItemDocFiscal,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXDOCFISCAL', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          x.idItemDocFiscal,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MODOCFISCALXPREDOCUM x
        WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXDOCFISCAL (
          id,
          idItemDocFiscal,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXDOCFISCAL', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemDocFiscalReferenciado,
          x.quantidade
        FROM MOPREDOCUMXDOCFISCAL x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCTRANSFXDOCFISCAL (
          id,
          entradaSaidaOriginal,
          idItemDocTransferencia,
          idItemDocFiscal,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCTRANSFXDOCFISCAL', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          x.entradaSaidaOriginal,
          x.idItemDocTransferencia,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MODOCTRANSFXPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXESTOQUE (
          id,
          idItemDocFiscal,
          idEstoque)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXESTOQUE', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idEstoque
        FROM MOPREDOCUMXESTOQUE x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MOVALEDESCXITEMDOCFISCAL (
          id,
          idValeDesconto,
          idItemDocFiscal)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXITEMDOCFISCAL', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
          x.idValeDesconto,
          itens.idItemDocFiscal
        FROM MOVALEDESCXITEMPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      END IF;
      UPDATE MODOCTROCAXITENS x SET
        x.idItemPreDocumentoSaida = 0,
        x.idItemDocFiscalSaida = itens.idItemDocFiscal
      WHERE x.idItemPreDocumentoSaida = itens.idItemPreDocumento;
      UPDATE MOENTREGAS x SET
        x.idItemPreDocumentoRemessa = 0,
        x.idItemDocFiscalRemessa = itens.idItemDocFiscal
      WHERE x.idItemPreDocumentoRemessa = itens.idItemPreDocumento;
      UPDATE MOINGRESSOS x SET
        x.idItemPreDocumento = 0,
        x.idItemDocFiscal = itens.idItemDocFiscal
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXESTOQUE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPRODUTOFILHO x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPROMOCOES x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MODOCFISCALXPREDOCUM x
      WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXDOCFISCAL x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPREDOCUM x
      WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
      DELETE MODOCTRANSFXPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXORCAMENTOITEM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXCOMPOSICOESPR x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOVALEDESCXITEMPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
    ELSIF itens.cancelado = 0 THEN
      INSERT INTO MODOCFISCALXPREDOCUM (
        id,
        idItemDocFiscal,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPREDOCUM', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        itens.idItemPreDocumento,
        itens.quantidade);
    END IF;
  END LOOP;
  FOR mot IN (
    SELECT
      idMotivoBloqueioDocumento,
      FUNC_ADD_BUSCA_PROXIMO_ID (
        'MOMOTIVOSBLOQUEIOS',
        'idMotivoBloqueioDocumento',
        0,
        p_sys_estabelecimentoAtivo,
        NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento)
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (
      idMotivoBloqueioDocumento,
      origem,
      idCabecalho,
      tipoDocumento,
      idDocumento,
      estabelecimento,
      pessoa,
      cabecalhoItemPagamento,
      sequencia,
      condicaoPagamento,
      vendedor,
      gradeProduto,
      unidadeMedidaConversao,
      quantidadeConvertida,
      valorLiquido,
      motivoBloqueioDocumento,
      dataBloqueio,
      baseBloqueado,
      valorBloqueado,
      percentualBloqueado,
      situacaoLiberacao,
      observacoes)
    SELECT
      mot.idMotivoBloqueioNovo,
      'D',
      r_idDocumentoFiscal,
      v_tipoDocumento,
      v_documentoFiscal,
      v_estabelecimento,
      v_pessoa,
      a.cabecalhoItemPagamento,
      0,
      a.condicaoPagamento,
      a.vendedor,
      a.gradeProduto,
      a.unidadeMedidaConversao,
      a.quantidadeConvertida,
      a.valorLiquido,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTIVOSBLOQUEIOS a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXDOCUMENTOSFISC (
      id,
      idMotivoBloqueioDocumento,
      idDocumentoFiscal)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCUMENTOSFISC', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      r_idDocumentoFiscal);
    INSERT INTO MOMOTBLOQXLIBERACOES (
      id,
      idMotivoBloqueioDocumento,
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTBLOQXLIBERACOES a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    IF v_excluirPreDoc = 1 THEN
      DELETE MOMOTBLOQXLIBERACOES a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTBLOQXPREDOCUMENTOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTIVOSBLOQUEIOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    END IF;
  END LOOP;
  FOR mot IN (
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID (
        'MOMOTIVOSBLOQUEIOS',
        'idMotivoBloqueioDocumento',
        0,
        p_sys_estabelecimentoAtivo,
        NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'P'
      AND a.idCabecalho = p_preDocumento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT EXISTS (
        SELECT 1
        FROM MOMOTBLOQXPREDOCUMPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento))
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (
      idMotivoBloqueioDocumento,
      origem,
      idCabecalho,
      tipoDocumento,
      idDocumento,
      estabelecimento,
      pessoa,
      cabecalhoItemPagamento,
      sequencia,
      condicaoPagamento,
      vendedor,
      gradeProduto,
      unidadeMedidaConversao,
      quantidadeConvertida,
      valorLiquido,
      motivoBloqueioDocumento,
      dataBloqueio,
      baseBloqueado,
      valorBloqueado,
      percentualBloqueado,
      situacaoLiberacao,
      observacoes)
    SELECT
      mot.idMotivoBloqueioNovo,
      'D',
      r_idDocumentoFiscal,
      v_tipoDocumento,
      v_documentoFiscal,
      v_estabelecimento,
      v_pessoa,
      a.cabecalhoItemPagamento,
      a.sequencia,
      a.condicaoPagamento,
      a.vendedor,
      a.gradeProduto,
      a.unidadeMedidaConversao,
      a.quantidadeConvertida,
      a.valorLiquido,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTIVOSBLOQUEIOS a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (
      id,
      idMotivoBloqueioDocumento,
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTBLOQXLIBERACOES a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    IF v_excluirPreDoc = 1 THEN
      DELETE MOMOTBLOQXLIBERACOES a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTIVOSBLOQUEIOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    END IF;
  END LOOP;
  IF v_excluirPreDoc = 1 THEN
    FOR pagtos IN (
      SELECT
        idPagamentoPreDocumento,
        FUNC_ADD_BUSCA_PROXIMO_ID (
          'MODOCFISCALXPAGAMENTOS',
          'idPagamentoDocFiscal',
          0,
          p_sys_estabelecimentoAtivo,
          NULL) idPagamentoDocFiscal,
        pagamentoTroco,
        sequencia,
        indicadorFormaPagamento,
        meioPagamento,
        condicaoPagamento,
        cobranca,
        numeroParcelas,
        somaPrazoParcelas,
        valorXPrazoParcelas,
        prazoMedio,
        prazoMedioPonderado,
        valorEntradaMinima,
        valorPagamentoBruto,
        percDescontoPagamento,
        valorDescontoPagamento,
        percOutrasDespesasPagamento,
        valorOutrasDespesasPagamento,
        fatorJurosPagamento,
        valorJurosPagamento,
        valorPagamentoImpostosSoma,
        valorPagamentoImpostosDiminui,
        valorPagamentoLiquido,
        valorFinanceiro,
        observacoes
      FROM MOPREDOCUMXPAGAMENTOS
      WHERE preDocumento = p_preDocumento
      ORDER BY
        pagamentoTroco,
        sequencia)
    LOOP
      INSERT INTO MODOCFISCALXPAGAMENTOS (
        idPagamentoDocFiscal,
        idDocumentoFiscal,
        pagamentoTroco,
        sequencia,
        indicadorFormaPagamento,
        meioPagamento,
        condicaoPagamento,
        cobranca,
        numeroParcelas,
        somaPrazoParcelas,
        valorXPrazoParcelas,
        prazoMedio,
        prazoMedioPonderado,
        valorEntradaMinima,
        valorPagamentoBruto,
        percDescontoPagamento,
        valorDescontoPagamento,
        percOutrasDespesasPagamento,
        valorOutrasDespesasPagamento,
        fatorJurosPagamento,
        valorJurosPagamento,
        valorPagamentoImpostosSoma,
        valorPagamentoImpostosDiminui,
        valorPagamentoLiquido,
        valorFinanceiro,
        observacoes)
      VALUES (
        pagtos.idPagamentoDocFiscal,
        r_idDocumentoFiscal,
        pagtos.pagamentoTroco,
        pagtos.sequencia,
        pagtos.indicadorFormaPagamento,
        pagtos.meioPagamento,
        pagtos.condicaoPagamento,
        pagtos.cobranca,
        pagtos.numeroParcelas,
        pagtos.somaPrazoParcelas,
        pagtos.valorXPrazoParcelas,
        pagtos.prazoMedio,
        pagtos.prazoMedioPonderado,
        pagtos.valorEntradaMinima,
        pagtos.valorPagamentoBruto,
        pagtos.percDescontoPagamento,
        pagtos.valorDescontoPagamento,
        pagtos.percOutrasDespesasPagamento,
        pagtos.valorOutrasDespesasPagamento,
        pagtos.fatorJurosPagamento,
        pagtos.valorJurosPagamento,
        pagtos.valorPagamentoImpostosSoma,
        pagtos.valorPagamentoImpostosDiminui,
        pagtos.valorPagamentoLiquido,
        pagtos.valorFinanceiro,
        pagtos.observacoes);
      UPDATE MOPREVFINANCXFINANCEIRO x SET
      x.preDocumento = 0,
      x.idDocumentoFiscal = r_idDocumentoFiscal
      WHERE EXISTS (
        SELECT 1
        FROM MOFINANCEIROS y
        WHERE y.idFinanceiro = x.idFinanceiro
        AND y.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento);
      UPDATE MOFINANCEIROS x SET
        x.documento = TO_CHAR(v_documentoFiscal),
        x.fatura = TO_CHAR(v_documentoFiscal),
        x.idPagamentoPreDocumento = 0,
        x.idPagamentoDocFiscal = pagtos.idPagamentoDocFiscal
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      UPDATE MOTRANSACOESTEF x SET
        x.idPagamentoPreDocumento = 0,
        x.idPagamentoDocFiscal = pagtos.idPagamentoDocFiscal
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      INSERT INTO MODOCFISCALXPROMOCOES (
        id,
        idDocumentoFiscal,
        cabecalhoItemPagamento,
        sequencia,
        idItemDocFiscal,
        idPagamentoDocFiscal,
        regraPromocao,
        tipoBeneficio,
        multiplicador,
        precoUnitarioDe,
        precoUnitarioPor,
        precoDesconto,
        precoMinimo,
        percentualDesconto,
        valorDesconto,
        pontuacao,
        gerarPontuacao,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
        r_idDocumentoFiscal,
        x.cabecalhoItemPagamento,
        x.sequencia,
        0,
        pagtos.idPagamentoDocFiscal,
        x.regraPromocao,
        x.tipoBeneficio,
        x.multiplicador,
        x.precoUnitarioDe,
        x.precoUnitarioPor,
        x.precoDesconto,
        x.precoMinimo,
        x.percentualDesconto,
        x.valorDesconto,
        x.pontuacao,
        x.gerarPontuacao,
        x.observacoes
      FROM MOPREDOCUMXPROMOCOES x
      WHERE x.preDocumento = p_preDocumento
      AND x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      DELETE MOPREDOCUMXPROMOCOES x
      WHERE x.preDocumento = p_preDocumento
      AND x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      FOR mot IN (
        SELECT
          a.idMotivoBloqueioDocumento,
          a.idPagamentoPreDocumento,
          FUNC_ADD_BUSCA_PROXIMO_ID (
            'MOMOTIVOSBLOQUEIOS',
            'idMotivoBloqueioDocumento',
            0,
            p_sys_estabelecimentoAtivo,
            NULL) idMotivoBloqueioNovo
        FROM MOMOTBLOQXPREDOCUMPAGAM a
        JOIN MOPREDOCUMXPAGAMENTOS b
        ON b.idPagamentoPreDocumento = a.idPagamentoPreDocumento
        WHERE b.preDocumento = p_preDocumento)
      LOOP
        IF mot.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (
            idMotivoBloqueioDocumento,
            origem,
            idCabecalho,
            tipoDocumento,
            idDocumento,
            estabelecimento,
            pessoa,
            cabecalhoItemPagamento,
            sequencia,
            condicaoPagamento,
            vendedor,
            gradeProduto,
            unidadeMedidaConversao,
            quantidadeConvertida,
            valorLiquido,
            motivoBloqueioDocumento,
            dataBloqueio,
            baseBloqueado,
            valorBloqueado,
            percentualBloqueado,
            situacaoLiberacao,
            observacoes)
          SELECT
            mot.idMotivoBloqueioNovo,
            'D',
            r_idDocumentoFiscal,
            v_tipoDocumento,
            v_documentoFiscal,
            v_estabelecimento,
            v_pessoa,
            a.cabecalhoItemPagamento,
            pagtos.sequencia,
            a.condicaoPagamento,
            a.vendedor,
            a.gradeProduto,
            a.unidadeMedidaConversao,
            a.quantidadeConvertida,
            a.valorLiquido,
            a.motivoBloqueioDocumento,
            a.dataBloqueio,
            a.baseBloqueado,
            a.valorBloqueado,
            a.percentualBloqueado,
            a.situacaoLiberacao,
            a.observacoes
          FROM MOMOTIVOSBLOQUEIOS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXDOCFISCALPAGAM (
            id,
            idMotivoBloqueioDocumento,
            idPagamentoDocFiscal)
          VALUES (
            FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALPAGAM', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
            mot.idMotivoBloqueioNovo,
            pagtos.idPagamentoDocFiscal);
          INSERT INTO MOMOTBLOQXLIBERACOES (
            id,
            idMotivoBloqueioDocumento,
            usuario,
            dataLiberacao,
            valorLiberado,
            percentualLiberado,
            percentualAlcada,
            situacaoLiberacao,
            observacoes)
          SELECT
            FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
            mot.idMotivoBloqueioNovo,
            a.usuario,
            a.dataLiberacao,
            a.valorLiberado,
            a.percentualLiberado,
            a.percentualAlcada,
            a.situacaoLiberacao,
            a.observacoes
          FROM MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXPREDOCUMPAGAM a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTIVOSBLOQUEIOS a WHERE
          a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END LOOP;
    INSERT INTO MOBAIXAFINANCXDOCFISCAL (
      id,
      idBaixaFinanceiro,
      idDocumentoFiscal)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOBAIXAFINANCXDOCFISCAL', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
      x.idBaixaFinanceiro,
      r_idDocumentoFiscal
    FROM MOBAIXAFINANCXPREDOCUM x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MOVALEDESCXDOCFISCAL (
      id,
      idValeDesconto,
      idDocumentoFiscal,
      valor)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXDOCFISCAL', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
      x.idValeDesconto,
      r_idDocumentoFiscal,
      x.valor
    FROM MOVALEDESCXPREDOCUM x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MODOCFISCALXBLOQUEIOSEST (
      id,
      idDocumentoFiscal,
      sequencia,
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXBLOQUEIOSEST', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
      r_idDocumentoFiscal,
      x.sequencia,
      x.dataBloqueio,
      x.estabelecimento,
      x.localEstoque,
      x.pessoaParticipante,
      x.gradeProduto,
      x.personalizacao,
      x.idLoteEstoque,
      x.idNumeroSerie,
      x.quantidade,
      x.quantidadeEstoque,
      x.quantidadeReservas,
      x.situacaoLiberacao,
      x.usuarioLiberacao,
      x.dataLiberacao,
      x.observacoes
    FROM MOPREDOCUMXBLOQUEIOSEST x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MODOCFISCALXCONFERENCIAS (
      id,
      idDocumentoFiscal,
      documentoTransferencia,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      codigoErro,
      quantidadeConferida,
      encerrado,
      idItemDocTransferencia,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCONFERENCIAS', 'id', 0, p_sys_estabelecimentoAtivo, NULL),
      r_idDocumentoFiscal,
      x.documentoTransferencia,
      x.gradeProduto,
      x.idFormulaTinta,
      x.personalizacao,
      x.idLoteEstoque,
      x.idNumeroSerie,
      x.codigoErro,
      x.quantidadeConferida,
      x.encerrado,
      x.idItemDocTransferencia,
      x.observacoes
    FROM MOPREDOCUMXCONFERENCIAS x
    WHERE x.preDocumento = p_preDocumento;
    DELETE MOBAIXAFINANCXPREDOCUM
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPERSPROJETO
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXINFOCOMPLENT
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_preDocumento
    AND idItemPreDocumento = 0
    AND idPagamentoPreDocumento = 0;
    DELETE MOVALEDESCXPREDOCUM
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXBLOQUEIOSEST
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXCONFERENCIAS
    WHERE preDocumento = p_preDocumento;
    UPDATE MOPREVFINANCXFINANCEIRO SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOFINANCEIROXCOMISSOES SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOFINANCEIROXDOCUMENTOS SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOEVENTOS SET
      tabelaSistema = 'MODOCUMENTOSFISCAIS',
      id = r_idDocumentoFiscal
    WHERE tabelaSistema = 'MOPREDOCUMENTOS'
    AND id = p_preDocumento;
    DELETE MOPREDOCUMXPAGAMENTOS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXITENS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXSTATUS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  ELSE
    UPDATE MOPREDOCUMENTOS
    SET statusPreDocumento = 'F'
    WHERE preDocumento = p_preDocumento;
    FOR pagtos IN (
      SELECT idPagamentoPreDocumento
      FROM MOPREDOCUMXPAGAMENTOS
      WHERE preDocumento = p_preDocumento)
    LOOP
      UPDATE MOFINANCEIROS x SET
        x.documento = TO_CHAR(v_documentoFiscal),
        x.fatura = TO_CHAR(v_documentoFiscal)
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ROT_EFET_PRE_DOC;

/

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('03/06/2025', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 2' WHERE idVersaoSistema = 2025001003;

COMMIT;

-- FIM BETA 2 - 03/06/2025

create or replace PROCEDURE ADD_ORCAMENTO_CAB_PROJ_GRAVA (
  p_estabelecimentoAtivo     IN NUMBER,
  p_idPersonProjetoOrcamento IN NUMBER,
  p_orcamento                IN NUMBER,
  p_personalizacaoProjeto    IN NUMBER,
  p_conteudo                 IN VARCHAR2,
  r_idPersonProjetoOrcamento OUT NUMBER)
IS
BEGIN
  r_idPersonProjetoOrcamento := p_idPersonProjetoOrcamento;
  IF r_idPersonProjetoOrcamento = 0 THEN
    SELECT COALESCE (MAX (idPersonProjetoOrcamento), 0)
    INTO r_idPersonProjetoOrcamento
    FROM MOORCAMENTOXPERSPROJETO
    WHERE orcamento           = p_orcamento
    AND personalizacaoProjeto = p_personalizacaoProjeto;
  END IF;
  IF r_idPersonProjetoOrcamento = 0 THEN
    r_idPersonProjetoOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID (
      'MOORCAMENTOXPERSPROJETO',
      'idPersonProjetoOrcamento',
      14,
      p_estabelecimentoAtivo,
      NULL);
  END IF;
  MERGE INTO MOORCAMENTOXPERSPROJETO a 
  USING (
    SELECT
      r_idPersonProjetoOrcamento idPersonProjetoOrcamento,
      p_orcamento                orcamento,
      p_personalizacaoProjeto    personalizacaoProjeto,
      p_conteudo                 conteudo
    FROM DUAL) b
  ON (a.idPersonProjetoOrcamento = b.idPersonProjetoOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.orcamento             = b.orcamento,
    a.personalizacaoProjeto = b.personalizacaoProjeto,
   a.conteudo               = b.conteudo
  WHEN NOT MATCHED THEN INSERT (
    idPersonProjetoOrcamento,
    orcamento,
    personalizacaoProjeto,
    conteudo)
  VALUES (
    b.idPersonProjetoOrcamento,
    b.orcamento,
    b.personalizacaoProjeto,
    b.conteudo);
END ADD_ORCAMENTO_CAB_PROJ_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_PROJ_GRAVA (
  p_estabelecimentoAtivo        IN NUMBER,
  p_idPersonProjetoPreDocumento IN NUMBER,
  p_preDocumento                IN NUMBER,
  p_personalizacaoProjeto       IN NUMBER,
  p_conteudo                    IN VARCHAR2,
  r_idPersonProjetoPreDocumento OUT NUMBER)
IS
BEGIN
  r_idPersonProjetoPreDocumento := p_idPersonProjetoPreDocumento;
  IF r_idPersonProjetoPreDocumento = 0 THEN
    SELECT COALESCE (MAX (idPersonProjetoPreDocumento), 0)
    INTO r_idPersonProjetoPreDocumento
    FROM MOPREDOCUMXPERSPROJETO
    WHERE preDocumento        = p_preDocumento
    AND personalizacaoProjeto = p_personalizacaoProjeto;
  END IF;
  IF r_idPersonProjetoPreDocumento = 0 THEN
    r_idPersonProjetoPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID (
      'MOPREDOCUMXPERSPROJETO',
      'idPersonProjetoPreDocumento',
      14,
      p_estabelecimentoAtivo,
      NULL);
  END IF;
  MERGE INTO MOPREDOCUMXPERSPROJETO a 
  USING (
    SELECT
      r_idPersonProjetoPreDocumento idPersonProjetoPreDocumento,
      p_preDocumento                preDocumento,
      p_personalizacaoProjeto       personalizacaoProjeto,
      p_conteudo                    conteudo
    FROM DUAL) b
  ON (a.idPersonProjetoPreDocumento = b.idPersonProjetoPreDocumento)
  WHEN MATCHED THEN UPDATE SET
    a.preDocumento          = b.preDocumento,
    a.personalizacaoProjeto = b.personalizacaoProjeto,
   a.conteudo               = b.conteudo
  WHEN NOT MATCHED THEN INSERT (
    idPersonProjetoPreDocumento,
    preDocumento,
    personalizacaoProjeto,
    conteudo)
  VALUES (
    b.idPersonProjetoPreDocumento,
    b.preDocumento,
    b.personalizacaoProjeto,
    b.conteudo);
END ADD_PRE_DOC_CAB_PROJ_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_PROJ_GRAVA (
  p_estabelecimentoAtivo     IN NUMBER,
  p_idPersonProjetoDocFiscal IN NUMBER,
  p_idDocumentoFiscal        IN NUMBER,
  p_personalizacaoProjeto    IN NUMBER,
  p_conteudo                 IN VARCHAR2,
  r_idPersonProjetoDocFiscal OUT NUMBER)
IS
BEGIN
  r_idPersonProjetoDocFiscal := p_idPersonProjetoDocFiscal;
  IF r_idPersonProjetoDocFiscal = 0 THEN
    SELECT COALESCE (MAX (idPersonProjetoDocFiscal), 0)
    INTO r_idPersonProjetoDocFiscal
    FROM MODOCFISCALXPERSPROJETO
    WHERE idDocumentoFiscal   = p_idDocumentoFiscal
    AND personalizacaoProjeto = p_personalizacaoProjeto;
  END IF;
  IF r_idPersonProjetoDocFiscal = 0 THEN
    r_idPersonProjetoDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID (
      'MODOCFISCALXPERSPROJETO',
      'idPersonProjetoDocFiscal',
      14,
      p_estabelecimentoAtivo,
      NULL);
  END IF;
  MERGE INTO MODOCFISCALXPERSPROJETO a 
  USING (
    SELECT
      r_idPersonProjetoDocFiscal idPersonProjetoDocFiscal,
      p_idDocumentoFiscal        idDocumentoFiscal,
      p_personalizacaoProjeto    personalizacaoProjeto,
      p_conteudo                 conteudo
    FROM DUAL) b
  ON (a.idPersonProjetoDocFiscal = b.idPersonProjetoDocFiscal)
  WHEN MATCHED THEN UPDATE SET
    a.idDocumentoFiscal     = b.idDocumentoFiscal,
    a.personalizacaoProjeto = b.personalizacaoProjeto,
   a.conteudo               = b.conteudo
  WHEN NOT MATCHED THEN INSERT (
    idPersonProjetoDocFiscal,
    idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo)
  VALUES (
    b.idPersonProjetoDocFiscal,
    b.idDocumentoFiscal,
    b.personalizacaoProjeto,
    b.conteudo);
END ADD_DOC_FISC_CAB_PROJ_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idTarefaOrcamento         IN NUMBER,
  p_idAtividadePrevOrcamento  IN NUMBER,
  p_idCheckListXTarefas       IN NUMBER,
  p_ordenacao                 IN NUMBER,
  p_conteudo                  IN VARCHAR2,
  p_observacoes               IN VARCHAR2,
  r_idTarefaOrcamento         OUT NUMBER)
IS
BEGIN
  r_idTarefaOrcamento := p_idTarefaOrcamento;
  IF r_idTarefaOrcamento = 0 THEN
    SELECT COALESCE (MAX (idTarefaOrcamento), 0)
    INTO r_idTarefaOrcamento
    FROM MOORCAMENTOXTAREFAS
    WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
    AND idCheckListXTarefas        = p_idCheckListXTarefas
    AND ordenacao                  = p_ordenacao;
  END IF;
  IF r_idTarefaOrcamento = 0 THEN
    r_idTarefaOrcamento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOORCAMENTOXTAREFAS',
      'idTarefaOrcamento',
      14);
  END IF;
  MERGE INTO MOORCAMENTOXTAREFAS a 
  USING (
    SELECT
      r_idTarefaOrcamento        idTarefaOrcamento,
      p_idAtividadePrevOrcamento idAtividadePrevOrcamento,
      p_idCheckListXTarefas      idCheckListXTarefas,
      p_ordenacao                ordenacao,
      p_conteudo                 conteudo,
      p_observacoes              observacoes
    FROM DUAL) b
  ON (a.idTarefaOrcamento = b.idTarefaOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento,
    a.idCheckListXTarefas      = b.idCheckListXTarefas,
    a.ordenacao                = b.ordenacao,
    a.conteudo                 = b.conteudo,
    a.observacoes              = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idTarefaOrcamento,
    idAtividadePrevOrcamento,
    idCheckListXTarefas,
    ordenacao,
    conteudo,
    observacoes)
  VALUES (
    b.idTarefaOrcamento,
    b.idAtividadePrevOrcamento,
    b.idCheckListXTarefas,
    b.ordenacao,
    b.conteudo,
    b.observacoes);
END ADD_ORCAMENTO_ITEM_TAREF_GRAVA;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_EFETIVA (
  p_sessaoClient                IN VARCHAR,
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_contadorSessao              IN NUMERIC,
  p_DocFisc_PreDoc_Orcam_Tarefa IN CHAR,
  p_idPai                       IN NUMBER)
IS
  v_idSalvar  NUMBER;
  v_ordenacao NUMBER;
BEGIN
  FOR a IN (
    SELECT
      contador,
      idSalvar
    FROM TEMPQUESTIONARIO
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessao
    AND excluido = 1
    AND idSalvar > 0)
  LOOP
    IF p_DocFisc_PreDoc_Orcam_Tarefa = 'D' THEN
      DELETE MODOCFISCALXPERSPROJETO b
      WHERE b.idPersonProjetoDocFiscal = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'P' THEN
      DELETE MOPREDOCUMXPERSPROJETO b
      WHERE b.idPersonProjetoPreDocumento = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'O' THEN
      DELETE MOORCAMENTOXPERSPROJETO b
      WHERE b.idPersonProjetoOrcamento = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'T' THEN
      DELETE MOORCAMENTOXTAREFAS b
      WHERE b.idTarefaOrcamento = a.idSalvar;
    END IF;
  END LOOP;
  FOR a IN (
    SELECT
      a.contador,
      a.idSalvar,
      a.idQuestionario,
      CASE
        WHEN a.tabelaSistema <> ' '
        THEN
          CASE
            WHEN tabSist.nomeCampoIdSeDiferenteCodigo <> ' '
              OR tabSist.tipoCampoCodigo = 'N'
            THEN
              CASE
                WHEN a.conteudoId = 0
                THEN ' '
                ELSE TRIM (TO_CHAR (a.conteudoId))
              END
            ELSE a.conteudoCodigo
          END
        WHEN a.tipoCampo = 'D'
        THEN
          CASE
            WHEN COALESCE (TO_CHAR (a.conteudoData, 'DD/MM/YYYY'), '00/00/0000') = '00/00/0000'
            THEN ' '
            ELSE COALESCE (TO_CHAR (a.conteudoData, 'DD/MM/YYYY'), '00/00/0000')
          END
        WHEN a.tipoCampo = 'H'
        THEN
          CASE
            WHEN COALESCE (conteudoHora, '000000') = '000000'
            THEN ' '
            ELSE COALESCE (SUBSTR (a.conteudoHora, 1, 2) || ':' || SUBSTR (a.conteudoHora, 3, 2) || ':' || SUBSTR (a.conteudoHora, 5, 2), '00:00:00')
          END
        WHEN a.tipoCampo = 'L'
        THEN
          CASE
            WHEN a.conteudoLogico = '1'
            THEN 'S'
            ELSE ' '
          END
        WHEN a.tipoCampo = 'N'
        THEN
          CASE
            WHEN a.conteudoNumerico = 0
            THEN ' '
            ELSE REPLACE (TRIM (TO_CHAR (a.conteudoNumerico, 'FM99999999999999999990D99999999999999999990')), '.', ',')
          END
        WHEN a.exibirCampo = 'P'
        THEN a.conteudoCombo
        ELSE a.conteudoEdit
      END conteudo,
      a.observacoes
    FROM TEMPQUESTIONARIO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    WHERE a.sessaoClient = p_sessaoClient
    AND a.contadorSessao = p_contadorSessao
    AND a.excluido = 0
    ORDER BY
      a.ordenacao,
      a.subOrdenacao)
  LOOP
    v_idSalvar  := a.idSalvar;
    IF p_DocFisc_PreDoc_Orcam_Tarefa = 'D' THEN
      ADD_DOC_FISC_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoDocFiscal
        p_idPai, -- p_idDocumentoFiscal
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'P' THEN
      ADD_PRE_DOC_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoPreDocumento
        p_idPai, -- p_preDocumento
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'O' THEN
      ADD_ORCAMENTO_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoOrcamento
        p_idPai, -- p_orcamento
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'T' THEN
      v_ordenacao := 0;
      IF v_idSalvar > 0 THEN
        SELECT COALESCE (MAX (ordenacao), 0)
        INTO v_ordenacao
        FROM MOORCAMENTOXTAREFAS
        WHERE idTarefaOrcamento = v_idSalvar;
      END IF;
      IF v_ordenacao <= 0 THEN
        SELECT COALESCE (MAX (ordenacao), 0) + 1
        INTO v_ordenacao
        FROM MOORCAMENTOXTAREFAS
        WHERE idAtividadePrevOrcamento = p_idPai
        AND idCheckListXTarefas = a.idQuestionario;
      END IF;
      ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        v_idSalvar, -- p_idTarefaOrcamento
        p_idPai, -- p_idAtividadePrevOrcamento
        a.idQuestionario, -- p_idCheckListXTarefas
        v_ordenacao,
        a.conteudo,
        a.observacoes,
        v_idSalvar); -- r_idTarefaOrcamento
    END IF;
  END LOOP;
  DELETE TEMPQUESTIONARIO b
  WHERE b.sessaoClient = p_sessaoClient
  AND b.contadorSessao = p_contadorSessao;
END ADD_TEMPQUESTIONARIO_EFETIVA;

/

DELETE PACONFIGURACAOXCONTEUDOS WHERE configuracao IN (130,131);
DELETE SIOPCOESCOMBOCONFIGURACAO WHERE configuracao IN (130,131);
DELETE SICONFIGURACOES WHERE configuracao IN (130,131);

COMMIT;

UPDATE SITIPOSDOCUMENTOIMPRESSO SET permiteMerge = 1, arquivoModeloMerge = '%SYS_DIR_ARQ_MODELOS%EspelhoEntrada.rtf' WHERE tipoDocumentoImpresso = 38;

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('03/06/2025', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 3' WHERE idVersaoSistema = 2025001003;

COMMIT;

-- FIM BETA 3 - 04/06/2025

UPDATE SICONFIGURACOES SET conteudoSugestao = '2' WHERE configuracao = 290;

COMMIT;

create or replace PROCEDURE ADD_PRE_DOC_PAG_INSERE (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_103_modFinResgatePont IN NUMBER,
  p_config_171_apenasDinheiroAVi IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_contadorSessaoTEMPPROMOCOES  IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_pagamentoTroco               IN CHAR,
  p_sequencia                    IN NUMBER,
  p_condicaoPagamento            IN NUMBER,
  p_cobranca                     IN NUMBER,
  p_valorEntradaMinima           IN NUMBER,
  p_valorPagamentoBruto          IN NUMBER,
  p_valorDescontoPagamento       IN NUMBER,
  p_valorOutrasDespesasPagamento IN NUMBER,
  p_valorJurosPagamento          IN NUMBER,
  p_valorPagamentoLiquido        IN NUMBER,
  p_valorFinanceiro              IN NUMBER,
  p_cartao_credenciadoraCartao   IN NUMBER,
  p_cartao_bandeiraCartaoDebCred IN NUMBER,
  p_cartao_transacaoCartaoNSU    IN VARCHAR2,
  p_cartao_autorizacaoCartao     IN VARCHAR2,
  p_cartao_tarifaCartao          IN NUMBER,
  p_cartaoProprio_cartaoProprio  IN VARCHAR2,
  p_idFinanceiroAdiantamento     IN NUMBER,
  p_idLinkPagamento              IN NUMBER,
  p_troco_sequencia              IN NUMBER,
  p_troco_condicaoPagamento      IN NUMBER,
  p_troco_cobranca               IN NUMBER,
  p_troco_valor                  IN NUMBER,
  r_idPagamentoPreDocumento      OUT NUMBER,
  r_mensagemErro                 OUT VARCHAR2)
IS
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_sessaoCaixa              NUMBER;
  v_cab_fatoContabil             NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_autorizadoPessoa         NUMBER;
  v_cab_contratoCompra           NUMBER;
  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_valorBasePagamento       NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespesasPag   NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_est_pessoaEstabelecimento    NUMBER;
  v_orc_pessoa                   NUMBER;
  v_orc_autorizadoPessoa         NUMBER;
  v_fisc_documentoFiscal         NUMBER;
  v_sequencia                    NUMBER;
  v_indicadorFormaPagamento      CHAR (1);
  v_meioPagamento                NUMBER;
  v_numeroParcelas               NUMBER;
  v_somaPrazoParcelas            NUMBER;
  v_valorXPrazoParcelas          NUMBER;
  v_idFinanceiroAdiantamento     NUMBER;
  v_troco_valorFinanceiro        NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  r_idPagamentoPreDocumento := 0;
  r_mensagemErro := ' ';
  IF p_sequencia > 0 THEN
    v_idFinanceiroAdiantamento := p_idFinanceiroAdiantamento;
    SELECT COALESCE (MAX (sequencia), 0) + 1
    INTO v_sequencia
    FROM MOPREDOCUMXPAGAMENTOS
    WHERE preDocumento = p_preDocumento
    AND p_pagamentoTroco = pagamentoTroco;
    IF p_sequencia <> v_sequencia THEN
      r_mensagemErro := 'Pagamento já inserido.';
    ELSE
      IF p_idFinanceiroAdiantamento > 0 THEN
        SELECT COALESCE (MAX (meioPagamento), 0)
        INTO v_meioPagamento
        FROM MOFINANCEIROS
        WHERE idFinanceiro = p_idFinanceiroAdiantamento;
      ELSE
        SELECT COALESCE (MAX (meioPagamento), 0)
        INTO v_meioPagamento
        FROM PACONDICOESPAGAMENTO
        WHERE condicaoPagamento = p_condicaoPagamento;
      END IF;
      SELECT COALESCE (MAX (indicadorFormaPagamento), ' ')
      INTO v_indicadorFormaPagamento
      FROM SIMEIOSPAGAMENTO
      WHERE meioPagamento = v_meioPagamento;
      IF p_contadorSessaoTEMPPARCELAS > 0 THEN
        SELECT
          COUNT (1),
          COALESCE (SUM (prazo), 0),
          COALESCE (SUM (prazo * valor), 0)
        INTO
          v_numeroParcelas,
          v_somaPrazoParcelas,
          v_valorXPrazoParcelas
        FROM TEMPPARCELAS
        WHERE sessaoClient = p_sessaoClient
        AND contadorSessao = p_contadorSessaoTEMPPARCELAS
        AND origem = 'P'
        AND idCabecalho = p_preDocumento
        AND pagamentoTroco = p_pagamentoTroco
        AND sequencia = p_sequencia
        AND valor > 0;
      ELSE
        v_numeroParcelas      := 0;
        v_somaPrazoParcelas   := 0;
        v_valorXPrazoParcelas := 0;
      END IF;
      ADD_PRE_DOC_PAG_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_idPagamentoPreDocumento
        p_preDocumento,
        p_pagamentoTroco,
        p_sequencia,
        v_indicadorFormaPagamento,
        v_meioPagamento,
        p_condicaoPagamento,
        p_cobranca,
        v_numeroParcelas,
        v_somaPrazoParcelas,
        v_valorXPrazoParcelas,
        p_valorEntradaMinima,
        p_valorPagamentoBruto,
        p_valorDescontoPagamento,
        p_valorOutrasDespesasPagamento,
        p_valorJurosPagamento,
        p_valorPagamentoLiquido,
        p_valorFinanceiro,
        r_idPagamentoPreDocumento);
      IF p_idLinkPagamento > 0 THEN
        ADD_LINKPAG_PRE_DOC_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          p_idLinkPagamento,
          r_idPagamentoPreDocumento,
          v_auxNumber); -- r_id
      END IF;
      IF p_pagamentoTroco = 'P' THEN
        SELECT 
          entradaSaida,
          devolucaoAnulacaoRetorno,
          sessaoCaixa,
          fatoContabil,
          estabelecimento,
          documentoFiscal,
          dataEmissao,
          dataEntradaSaida,
          pessoa,
          autorizadoPessoa,
          contratoCompra,
          condicaoPagamento,
          numeroParcelas,
          somaPrazoParcelas,
          valorXPrazoParcelas,
          prazoMedio,
          prazoMedioPonderado,
          valorBasePagamento,
          valorEntradaMinima,
          valorAVistaEntrada,
          valorPagamentoBruto,
          valorDescontoPagamento,
          valorOutrasDespesasPagamento,
          valorJurosPagamento,
          valorPagamentoLiquido
        INTO
          v_cab_entradaSaida,
          v_cab_devolucaoAnulacaoRetorno,
          v_cab_sessaoCaixa,
          v_cab_fatoContabil,
          v_cab_estabelecimento,
          v_cab_documentoFiscal,
          v_cab_dataEmissao,
          v_cab_dataEntradaSaida,
          v_cab_pessoa,
          v_cab_autorizadoPessoa,
          v_cab_contratoCompra,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorBasePagamento,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespesasPag,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido
        FROM MOPREDOCUMENTOS
        WHERE preDocumento = p_preDocumento;
        IF p_contadorSessaoTEMPPROMOCOES > 0 THEN
          FOR a IN (
            SELECT
              idItem,
              regraPromocao,
              tipoBeneficio,
              multiplicador,
              percentualDesconto,
              valorDesconto,
              gerarPontuacao
            FROM TEMPPROMOCOES
            WHERE sessaoClient = p_sessaoClient
            AND contadorSessao = p_contadorSessaoTEMPPROMOCOES)
          LOOP
            ADD_PRE_DOC_PROMOCAO_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_id
              p_preDocumento,
              'P', -- p_cabecalhoItemPagamento
              p_sequencia,
              a.idItem, -- p_idItempreDocumento
              r_idPagamentoPreDocumento,
              a.regraPromocao,
              a.tipoBeneficio,
              a.multiplicador,
              a.percentualDesconto,
              ROUND (a.valorDesconto * CASE WHEN (v_cab_valorBasePagamento - v_cab_valorPagamentoBruto) <= 0 OR p_valorPagamentoBruto / (v_cab_valorBasePagamento - v_cab_valorPagamentoBruto) > 1 THEN 1 ELSE p_valorPagamentoBruto / (v_cab_valorBasePagamento - v_cab_valorPagamentoBruto) END, 2), -- p_valorDesconto
              a.gerarPontuacao,
              v_auxNumber); -- r_id
          END LOOP;
        END IF;
        IF v_idFinanceiroAdiantamento = 0
          AND p_valorPagamentoLiquido > 0
          AND v_cab_entradaSaida = 'S'
          AND v_cab_devolucaoAnulacaoRetorno = 0
          AND v_meioPagamento = 30
          AND p_config_103_modFinResgatePont <> 0
        THEN
          FOR a IN (
            SELECT
              a.operacaoFinanceira,
              a.meioPagamento,
              a.contaFinanceira,
              a.carteiraFinanceira,
              a.pessoa,
              a.diasSomarData,
              a.prazoPadrao,
              opFin.pagamentoRecebimento
            FROM PAMODELOSFINANCEIRO a
            JOIN SIOPERACOESFINANCEIRAS opFin
            ON opFin.operacaoFinanceira = a.operacaoFinanceira
            WHERE a.modeloFinanceiro = p_config_103_modFinResgatePont)
          LOOP
            SELECT
              COALESCE (MAX (orc.pessoa), 0),
              COALESCE (MAX (orc.autorizadoPessoa), 0)
            INTO
              v_orc_pessoa,
              v_orc_autorizadoPessoa
            FROM MOPREDOCUMXITENS itemDoc
            JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
            ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
            JOIN MOORCAMENTOXITENS itemOrc
            ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
            JOIN MOORCAMENTOS orc
            ON orc.orcamento = itemOrc.orcamento
            WHERE itemDoc.preDocumento = p_preDocumento
            AND docXOrc.quantidade <> 0;
            SELECT COALESCE (MAX (pessoaEstabelecimento), 0)
            INTO v_est_pessoaEstabelecimento
            FROM PAESTABELECIMENTOS
            WHERE estabelecimento = v_cab_estabelecimento;
            SELECT COALESCE (MAX (docFisc.documentoFiscal), 0)
            INTO v_fisc_documentoFiscal
            FROM MODOCUMENTOSFISCAIS docFisc
            JOIN MODOCFISCALXITENS itemDoc
            ON itemDoc.idDocumentoFiscal = docFisc.idDocumentoFiscal
            JOIN MODOCFISCALXPREDOCUM docXPre
            ON docXPre.idItemDocFiscal = itemDoc.idItemDocFiscal
            JOIN MOPREDOCUMXITENS itemPre
            ON itemPre.idItemPreDocumento = docXPre.idItemPreDocReferenciado
            WHERE itemPre.preDocumento = p_preDocumento
            AND docFisc.origemDocumento = 13;
            ADD_FINANC_ATUALIZA (
              p_sys_estabelecimentoAtivo,
              p_config_349_prazoValidadePont,
              p_config_354_estabProximoId,
              0, -- p_financ_idFinanceiro,
              v_cab_sessaoCaixa,
              v_cab_fatoContabil,
              v_cab_estabelecimento,
              CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END, -- p_financ_data
              CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END, -- p_financ_dataEmissao
              a.prazoPadrao, -- p_financ_prazoPadrao,
              a.prazoPadrao, -- p_financ_prazo,
              TRUNC (CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END) + a.prazoPadrao, -- p_financ_vencimento
              TRUNC (CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END) + a.prazoPadrao, -- p_financ_vencimentoNegociado
              TRUNC (CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END) + a.prazoPadrao, -- p_financ_naoCobrarJurosMultaAt
              a.contaFinanceira,
              a.pagamentoRecebimento,
              a.operacaoFinanceira,
              ' ', -- p_financ_complemento
              0, -- p_financ_contratoCompra
              0, -- p_financ_idPagamentoPreDocumen
              0, -- p_financ_idPagamentoDocFiscal
              TO_CHAR (CASE WHEN v_fisc_documentoFiscal > 0 THEN v_fisc_documentoFiscal WHEN v_cab_documentoFiscal > 0 THEN v_cab_documentoFiscal ELSE p_preDocumento END), -- p_financ_documento
              TO_CHAR (CASE WHEN v_fisc_documentoFiscal > 0 THEN v_fisc_documentoFiscal WHEN v_cab_documentoFiscal > 0 THEN v_cab_documentoFiscal ELSE p_preDocumento END), -- p_financ_fatura
              1, -- p_financ_parcelaAtual
              1, -- p_financ_parcelasTotais
              CASE WHEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END > 0 THEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END WHEN a.pessoa > 0 THEN a.pessoa ELSE v_est_pessoaEstabelecimento END, -- p_financ_pessoa
              CASE WHEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END > 0 THEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_autorizadoPessoa ELSE v_orc_autorizadoPessoa END ELSE 0 END, -- p_financ_autorizadoPessoa
              CASE WHEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END > 0 THEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END WHEN a.pessoa > 0 THEN a.pessoa ELSE v_est_pessoaEstabelecimento END, -- p_financ_cobranca
              a.meioPagamento,
              a.carteiraFinanceira,
              p_valorPagamentoLiquido, -- p_financ_valor
              0, -- p_financ_valorDesconto
              0, -- p_financ_valorAcrescimo
              p_valorPagamentoLiquido, -- p_financ_saldo
              ' ', -- p_financ_indexador
              0, -- p_financ_cotacao
              0, -- p_financ_valorIndexado
              0, -- p_financ_saldoIndexado
              0, -- p_financ_efetivado
              0, -- p_financ_tarifaDescontoAteVenc
              'S', -- p_financ_tipoPagamentoAntecipa
              0, -- p_financ_tarifaMensalDescontoA
              'S', -- p_financ_tipoJuroDeMora
              0, -- p_financ_tarifaMensalJuroDeMor
              0, -- p_financ_tarifaMulta
              0, -- p_financ_valorFixoMulta
              0, -- p_financ_desconsiderarSPC
              '   ', -- b_boleto_banco
              ' ', -- b_boleto_nossoNumero
              ' ', -- b_boleto_linhaDigitavelBoleto
              ' ', -- b_boleto_codigoBarrasBoleto
              ' ', -- b_boleto_contratoCobrancaBolet
              0, -- b_boleto_boletoImpresso
              0, -- b_boleto_remessaEnviada
              0, -- b_boleto_retornoProcessado
              0, -- p_cartao_credenciadoraCartao
              0, -- p_cartao_bandeiraCartaoDebCred
              ' ', -- p_cartao_transacaoCartaoNSU
              ' ', -- p_cartao_autorizacaoCartao
              0, -- p_cartao_tarifaCartao
              0, -- p_cartao_valorTarifaCartao
              ' ', -- p_cartaoProprio_cartaoProprio
              ' ', -- p_cheque_compensacao
              '   ', -- p_cheque_banco
              ' ', -- p_cheque_agenciaBanco
              0, -- p_cheque_c1
              ' ', -- p_cheque_contaBanco
              0, -- p_cheque_c2
              0, -- p_cheque_cheque
              0, -- p_cheque_c3
              TRUNC (CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END) + a.prazoPadrao, -- p_cheque_bomPara
              ' ', -- p_cheque_indicadorPessoa
              ' ', -- p_cheque_titular
              ' ', -- p_cheque_indicadorDocumentoPes
              ' ', -- p_cheque_cnpjCpfIdEstrangeiro
              ' ', -- p_cheque_fone
              NULL, -- p_cheque_desde
              ' ', -- p_cheque_autenticacao
              1, -- p_cheque_statusCheque
              NULL, -- p_cheque_dataPrimeiroDeposito
              NULL, -- p_cheque_dataCompensacaoDevolu
              NULL, -- p_cheque_dataSegundoDeposito
              NULL, -- p_cheque_dataSegundaComponsaca
              0, -- p_cheque_indicadorFone
              0, -- p_cheque_operadoraTelefonia
              ' ', -- p_cheque_observacoesFone
              0, -- p_pix_salvar
              ' ', -- p_pix_banco
              ' ', -- p_pix_txIdPix
              ' ', -- p_pix_locationPix
              ' ', -- p_pix_chavePix
              ' ', -- p_pix_qrCode
              NULL, -- p_pix_dataCriacao
              ' ', -- p_pix_timezoneCriacao
              0, -- p_pix_segundosExpiracao
              ' ', -- p_pix_nomeRazaoSocial
              ' ', -- p_pix_cnpjCpfIdEstrangeiro
              ' ', -- p_pix_statusPix
              0, -- p_pix_numeroRevisao
              ' ', -- p_pix_observacoes
              0, -- p_correl_id
              0, -- p_correl_idFinanceiroCorrelato
              CASE WHEN a.operacaoFinanceira IN (34,74) AND a.meioPagamento NOT IN (30,31,32,33,38,39,40) THEN 1 ELSE 0 END, -- p_baixaAutomatica
              0, -- p_idFinanceiroAdiantamento
              0, -- p_idPrevisaoFinanceira
              0, -- p_preDocumento
              0, -- p_idDocumentoFiscal 
              v_idFinanceiroAdiantamento,
              v_auxNumber, -- r_financ_saldo
              v_auxNumber, -- r_financ_saldoIndexado
              v_auxNumber, -- r_financ_efetivado
              v_auxNumber, -- r_correl_id
              v_auxNumber); -- r_idBaixaFinanceiroAdiantament
          END LOOP;
        END IF;
        v_cab_numeroParcelas := v_cab_numeroParcelas + v_numeroParcelas;
        v_cab_somaPrazoParcelas := v_cab_somaPrazoParcelas + v_somaPrazoParcelas;
        v_cab_valorXPrazoParcelas := v_cab_valorXPrazoParcelas + v_valorXPrazoParcelas;
        v_cab_valorEntradaMinima := v_cab_valorEntradaMinima + p_valorEntradaMinima;
        IF p_config_171_apenasDinheiroAVi = 1
          AND v_meioPagamento IN (11,13,16,17,20,58)
          OR p_config_171_apenasDinheiroAVi = 0
          AND v_indicadorFormaPagamento = '0'
        THEN
          v_cab_valorAVistaEntrada := v_cab_valorAVistaEntrada + p_valorPagamentoLiquido;
        END IF;
        v_cab_valorPagamentoBruto := v_cab_valorPagamentoBruto + p_valorPagamentoBruto;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + p_valorDescontoPagamento;
        v_cab_valorOutrasDespesasPag := v_cab_valorOutrasDespesasPag + p_valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + p_valorJurosPagamento;
        v_cab_valorPagamentoLiquido := v_cab_valorPagamentoLiquido + p_valorPagamentoLiquido;
        v_cab_prazoMedio := CASE WHEN v_cab_numeroParcelas = 0 THEN 0 ELSE ROUND ((v_cab_somaPrazoParcelas / v_cab_numeroParcelas), 0) END;
        v_cab_prazoMedioPonderado := CASE WHEN v_cab_valorPagamentoLiquido = 0 THEN 0 ELSE ROUND ((v_cab_valorXPrazoParcelas / v_cab_valorPagamentoLiquido), 0) END;
        IF v_cab_valorPagamentoLiquido = p_valorPagamentoLiquido THEN
          v_cab_condicaoPagamento := p_condicaoPagamento;
        ELSE
          v_cab_condicaoPagamento := 0;
        END IF;
        IF v_cab_contratoCompra <= 0
          AND v_meioPagamento BETWEEN 53 AND 64
        THEN
          v_cab_contratoCompra := FUNC_ADD_PROXIMO_ID (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            'MOCONTRATOSCOMPRA',
            ' ',
            14);
        END IF;
        UPDATE MOPREDOCUMENTOS SET 
          contratoCompra = v_cab_contratoCompra,
          condicaoPagamento = v_cab_condicaoPagamento,
          numeroParcelas = v_cab_numeroParcelas,
          somaPrazoParcelas = v_cab_somaPrazoParcelas,
          valorXPrazoParcelas = v_cab_valorXPrazoParcelas,
          prazoMedio = v_cab_prazoMedio,
          prazoMedioPonderado = v_cab_prazoMedioPonderado,
          valorEntradaMinima = v_cab_valorEntradaMinima,
          valorAVistaEntrada = v_cab_valorAVistaEntrada,
          valorPagamentoBruto = v_cab_valorPagamentoBruto,
          valorDescontoPagamento = v_cab_valorDescontoPagamento,
          valorOutrasDespesasPagamento = v_cab_valorOutrasDespesasPag,
          valorJurosPagamento = v_cab_valorJurosPagamento,
          valorPagamentoLiquido = v_cab_valorPagamentoLiquido
        WHERE preDocumento = p_preDocumento;
      ELSE
        UPDATE MOPREDOCUMENTOS
        SET valorTroco = valorTroco + p_valorPagamentoBruto
        WHERE preDocumento = p_preDocumento;
      END IF;
      IF p_contadorSessaoTEMPPARCELAS > 0
        AND p_valorFinanceiro > 0
      THEN
        ADD_PRE_DOC_PAG_TEMPPAR_EFET (
          p_sessaoClient,
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_config_349_prazoValidadePont,
          p_config_354_estabProximoId,
          p_contadorSessaoTEMPPARCELAS,
          r_idPagamentoPreDocumento,
          p_cartao_credenciadoraCartao,
          p_cartao_bandeiraCartaoDebCred,
          p_cartao_transacaoCartaoNSU,
          p_cartao_autorizacaoCartao,
          p_cartao_tarifaCartao,
          p_cartaoProprio_cartaoProprio,
          v_idFinanceiroAdiantamento);
      END IF;
    END IF;
    IF p_contadorSessaoTEMPPARCELAS <> 0
      AND p_pagamentoTroco = 'P'
      AND (p_valorDescontoPagamento <> 0
        OR p_valorOutrasDespesasPagamento <> 0
        OR p_valorJurosPagamento <> 0)
      AND r_mensagemErro = ' '
    THEN 
      ADD_PRE_DOC_CALCULA_IMPOSTOS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_preDocumento,
        0, -- p_troca_tipoPagamentoFrete
        ' '); -- p_a_cab_tipoPagamentoFrete
    END IF;
  END IF;
  IF p_troco_sequencia > 0
    AND r_mensagemErro = ' '
  THEN
    v_troco_valorFinanceiro := p_troco_valor;
    IF v_troco_valorFinanceiro > 0 THEN 
      FOR a IN (
        SELECT
          a.idPagamentoPreDocumento
        FROM (
          SELECT
            ROW_NUMBER() OVER (ORDER BY sequencia DESC) ordenacao,
            idPagamentoPreDocumento,
            sequencia,
            meioPagamento,
            valorFinanceiro
          FROM MOPREDOCUMXPAGAMENTOS
          WHERE preDocumento = p_preDocumento
          AND pagamentoTroco = 'P') a
        WHERE a.ordenacao = 1
        AND a.meioPagamento = 11
        AND a.valorFinanceiro >= v_troco_valorFinanceiro)
      LOOP
        FOR b IN (
          SELECT
            b.idFinanceiro,
            b.valor,
            b.saldo
          FROM MOFINANCEIROS b
          WHERE b.idPagamentoPreDocumento = a.idPagamentoPreDocumento
          ORDER BY b.parcelaAtual)
        LOOP
          v_auxNumber := 0;
          IF b.valor >= v_troco_valorFinanceiro THEN
            v_auxNumber := v_troco_valorFinanceiro;
          ELSE
            v_auxNumber := b.valor;
          END IF;
          IF v_auxNumber > 0 THEN
            UPDATE MOPREDOCUMXPAGAMENTOS c SET
              c.valorFinanceiro = c.valorFinanceiro - v_auxNumber
            WHERE c.idPagamentoPreDocumento = a.idPagamentoPreDocumento;
            UPDATE MOFINANCEIROS c SET
              c.valor = c.valor - v_auxNumber,
              c.saldo = c.saldo - v_auxNumber,
              c.valorIndexado = CASE WHEN c.cotacao > 0 THEN ROUND (((c.valor - v_auxNumber) / c.cotacao), 6) ELSE 0 END,
              c.saldoIndexado = CASE WHEN c.cotacao > 0 THEN ROUND (((c.saldo - v_auxNumber) / c.cotacao), 6) ELSE 0 END
            WHERE c.idFinanceiro = b.idFinanceiro;
            v_troco_valorFinanceiro := v_troco_valorFinanceiro - v_auxNumber;
            IF v_auxNumber > b.saldo THEN
              v_auxNumber := v_auxNumber - b.saldo;
              FOR c IN (
                SELECT
                  c.idBaixaFinanceiro,
                  c.cotacao,
                  c.valorBrutoIndexado,
                  c.valorBruto,
                  c.valorLiquido
                FROM MOFINANCEIROXBAIXAS c
                WHERE c.idFinanceiro = b.idFinanceiro
                AND c.valorBruto > 0
                ORDER BY c.idBaixaFinanceiro)
              LOOP
                IF v_auxNumber > 0 THEN
                  IF c.valorBruto >= v_auxNumber THEN
                    UPDATE MOFINANCEIROXBAIXAS d SET
                      d.valorBrutoIndexado = CASE WHEN d.cotacao = 0 THEN 0 ELSE (d.valorBruto - v_auxNumber) / d.cotacao END,
                      d.valorBruto = d.valorBruto - v_auxNumber,
                      d.valorLiquido = d.valorLiquido - v_auxNumber
                    WHERE d.idBaixaFinanceiro = c.idBaixaFinanceiro;
                    v_auxNumber := 0;
                  ELSE
                    UPDATE MOFINANCEIROXBAIXAS d SET
                      d.valorLiquido = d.valorLiquido - d.valorBruto,
                      d.valorBrutoIndexado = 0,
                      d.valorBruto = 0
                    WHERE d.idBaixaFinanceiro = c.idBaixaFinanceiro;
                    v_auxNumber := v_auxNumber - c.valorBruto;
                  END IF;
                  UPDATE MOFINANCEIROS d SET
                    d.saldo = (- v_auxNumber),
                    d.saldoIndexado = CASE WHEN d.cotacao = 0 THEN 0 ELSE ROUND (((- v_auxNumber) / d.cotacao), 6) END
                  WHERE d.idFinanceiro = b.idFinanceiro;
                END IF;
              END LOOP;
            END IF;
          END IF;
        END LOOP;
      END LOOP;
      IF p_troco_valor <> v_troco_valorFinanceiro
        AND p_contadorSessaoTEMPPARCELAS > 0
      THEN
        ADD_TEMPPARCELAS_RECALCULA (
          p_sessaoClient,
          p_contadorSessaoTEMPPARCELAS,
          'P', -- p_origem
          p_preDocumento, -- p_idCabecalho
          'T', -- p_pagamentoTroco
          p_troco_sequencia,
          p_troco_condicaoPagamento,
          v_troco_valorFinanceiro,
          v_auxNumber);
      END IF;
    END IF;
    ADD_PRE_DOC_PAG_INSERE (
      p_sessaoClient,
      p_sys_estabelecimentoAtivo,
      p_config_103_modFinResgatePont,
      p_config_171_apenasDinheiroAVi,
      p_config_209_filtrarGrupoEcon,
      p_config_227_manterPessoaOrcam,
      p_config_349_prazoValidadePont,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_contadorSessaoTEMPPARCELAS,
      p_contadorSessaoTEMPPROMOCOES,
      p_preDocumento,
      'T', -- p_pagamentoTroco
      p_troco_sequencia,
      p_troco_condicaoPagamento,
      p_troco_cobranca,
      0, -- p_valorEntradaMinima
      p_troco_valor, -- p_valorPagamentoBruto
      0, -- p_valorDescontoPagamento
      0, -- p_valorOutrasDespesasPagamento
      0, -- p_valorJurosPagamento
      p_troco_valor,
      v_troco_valorFinanceiro,
      0, -- p_cartao_credenciadoraCartao
      0, -- p_cartao_bandeiraCartaoDebCred
      ' ', -- p_cartao_transacaoCartaoNSU
      ' ', -- p_cartao_autorizacaoCartao
      0, -- p_cartao_tarifaCartao
      ' ', -- p_cartaoProprio_cartaoProprio
      0, -- p_idFinanceiroAdiantamento
      0, -- p_idLinkPagamento
      0, -- p_troco_sequencia
      0, -- p_troco_condicaoPagamento
      0, -- p_troco_cobranca
      0, -- p_troco_valor
      v_auxNumber, -- r_idPagamentoPreDocumento
      r_mensagemErro);
    IF p_troco_valor <> v_troco_valorFinanceiro
      AND p_contadorSessaoTEMPPARCELAS > 0
    THEN
      ADD_PRE_DOC_PAG_TEMPPAR_CAB (
        p_sessaoClient,
        p_contadorSessaoTEMPPARCELAS,
        p_preDocumento);
    END IF;
  END IF;
END ADD_PRE_DOC_PAG_INSERE;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_INSERE (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_103_modFinResgatePont IN NUMBER,
  p_config_171_apenasDinheiroAVi IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_contadorSessaoTEMPPROMOCOES  IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_pagamentoTroco               IN CHAR,
  p_sequencia                    IN NUMBER,
  p_condicaoPagamento            IN NUMBER,
  p_cobranca                     IN NUMBER,
  p_valorEntradaMinima           IN NUMBER,
  p_valorPagamentoBruto          IN NUMBER,
  p_valorDescontoPagamento       IN NUMBER,
  p_valorOutrasDespesasPagamento IN NUMBER,
  p_valorJurosPagamento          IN NUMBER,
  p_valorPagamentoLiquido        IN NUMBER,
  p_valorFinanceiro              IN NUMBER,
  p_cartao_credenciadoraCartao   IN NUMBER,
  p_cartao_bandeiraCartaoDebCred IN NUMBER,
  p_cartao_transacaoCartaoNSU    IN VARCHAR2,
  p_cartao_autorizacaoCartao     IN VARCHAR2,
  p_cartao_tarifaCartao          IN NUMBER,
  p_cartaoProprio_cartaoProprio  IN VARCHAR2,
  p_idFinanceiroAdiantamento     IN NUMBER,
  p_idLinkPagamento              IN NUMBER,
  p_troco_sequencia              IN NUMBER,
  p_troco_condicaoPagamento      IN NUMBER,
  p_troco_cobranca               IN NUMBER,
  p_troco_valor                  IN NUMBER,
  r_idPagamentoDocFiscal         OUT NUMBER,
  r_mensagemErro                 OUT VARCHAR2)
IS
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_sessaoCaixa              NUMBER;
  v_cab_fatoContabil             NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_autorizadoPessoa         NUMBER;
  v_cab_contratoCompra           NUMBER;
  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_valorBasePagamento       NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespesasPag   NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_est_pessoaEstabelecimento    NUMBER;
  v_orc_pessoa                   NUMBER;
  v_orc_autorizadoPessoa         NUMBER;
  v_sequencia                    NUMBER;
  v_indicadorFormaPagamento      CHAR (1);
  v_meioPagamento                NUMBER;
  v_numeroParcelas               NUMBER;
  v_somaPrazoParcelas            NUMBER;
  v_valorXPrazoParcelas          NUMBER;
  v_idFinanceiroAdiantamento     NUMBER;
  v_troco_valorFinanceiro        NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  r_idPagamentoDocFiscal := 0;
  r_mensagemErro := ' ';
  IF p_sequencia > 0 THEN
    v_idFinanceiroAdiantamento := p_idFinanceiroAdiantamento;
    SELECT COALESCE (MAX (sequencia), 0) + 1
    INTO v_sequencia
    FROM MODOCFISCALXPAGAMENTOS
    WHERE idDocumentoFiscal = p_idDocumentoFiscal
    AND p_pagamentoTroco = pagamentoTroco;
    IF p_sequencia <> v_sequencia THEN
      r_mensagemErro := 'Pagamento já inserido.';
    ELSE
      IF p_idFinanceiroAdiantamento > 0 THEN
        SELECT COALESCE (MAX (meioPagamento), 0)
        INTO v_meioPagamento
        FROM MOFINANCEIROS
        WHERE idFinanceiro = p_idFinanceiroAdiantamento;
      ELSE
        SELECT COALESCE (MAX (meioPagamento), 0)
        INTO v_meioPagamento
        FROM PACONDICOESPAGAMENTO
        WHERE condicaoPagamento = p_condicaoPagamento;
      END IF;
      SELECT COALESCE (MAX (indicadorFormaPagamento), ' ')
      INTO v_indicadorFormaPagamento
      FROM SIMEIOSPAGAMENTO
      WHERE meioPagamento = v_meioPagamento;
      IF p_contadorSessaoTEMPPARCELAS > 0 THEN
        SELECT
          COUNT (1),
          COALESCE (SUM (prazo), 0),
          COALESCE (SUM (prazo * valor), 0)
        INTO
          v_numeroParcelas,
          v_somaPrazoParcelas,
          v_valorXPrazoParcelas
        FROM TEMPPARCELAS
        WHERE sessaoClient = p_sessaoClient
        AND contadorSessao = p_contadorSessaoTEMPPARCELAS
        AND origem = 'D'
        AND idCabecalho = p_idDocumentoFiscal
        AND pagamentoTroco = p_pagamentoTroco
        AND sequencia = p_sequencia
        AND valor > 0;
      ELSE
        v_numeroParcelas      := 0;
        v_somaPrazoParcelas   := 0;
        v_valorXPrazoParcelas := 0;
      END IF;
      ADD_DOC_FISC_PAG_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_idPagamentoDocFiscal
        p_idDocumentoFiscal,
        p_pagamentoTroco,
        p_sequencia,
        v_indicadorFormaPagamento,
        v_meioPagamento,
        p_condicaoPagamento,
        p_cobranca,
        v_numeroParcelas,
        v_somaPrazoParcelas,
        v_valorXPrazoParcelas,
        p_valorEntradaMinima,
        p_valorPagamentoBruto,
        p_valorDescontoPagamento,
        p_valorOutrasDespesasPagamento,
        p_valorJurosPagamento,
        p_valorPagamentoLiquido,
        p_valorFinanceiro,
        r_idPagamentoDocFiscal);
      IF p_idLinkPagamento > 0 THEN
        ADD_LINKPAG_DOC_FISC_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          p_idLinkPagamento,
          r_idPagamentoDocFiscal,
          v_auxNumber); -- r_id
      END IF;
      IF p_pagamentoTroco = 'P' THEN
        SELECT 
          entradaSaida,
          devolucaoAnulacaoRetorno,
          sessaoCaixa,
          fatoContabil,
          estabelecimento,
          documentoFiscal,
          dataEmissao,
          dataEntradaSaida,
          pessoa,
          autorizadoPessoa,
          contratoCompra,
          condicaoPagamento,
          numeroParcelas,
          somaPrazoParcelas,
          valorXPrazoParcelas,
          prazoMedio,
          prazoMedioPonderado,
          valorBasePagamento,
          valorEntradaMinima,
          valorAVistaEntrada,
          valorPagamentoBruto,
          valorDescontoPagamento,
          valorOutrasDespesasPagamento,
          valorJurosPagamento,
          valorPagamentoLiquido
        INTO
          v_cab_entradaSaida,
          v_cab_devolucaoAnulacaoRetorno,
          v_cab_sessaoCaixa,
          v_cab_fatoContabil,
          v_cab_estabelecimento,
          v_cab_documentoFiscal,
          v_cab_dataEmissao,
          v_cab_dataEntradaSaida,
          v_cab_pessoa,
          v_cab_autorizadoPessoa,
          v_cab_contratoCompra,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorBasePagamento,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespesasPag,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido
        FROM MODOCUMENTOSFISCAIS
        WHERE idDocumentoFiscal = p_idDocumentoFiscal;
        IF p_contadorSessaoTEMPPROMOCOES <> 0 THEN
          FOR a IN (
            SELECT
              idItem,
              regraPromocao,
              tipoBeneficio,
              multiplicador,
              percentualDesconto,
              valorDesconto,
              gerarPontuacao
            FROM TEMPPROMOCOES
            WHERE sessaoClient = p_sessaoClient
            AND contadorSessao = p_contadorSessaoTEMPPROMOCOES)
          LOOP
            ADD_DOC_FISC_PROMOCAO_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_id
              p_idDocumentoFiscal,
              'P', -- p_cabecalhoItemPagamento
              p_sequencia,
              a.idItem, -- p_idItemDocFiscal
              r_idPagamentoDocFiscal,
              a.regraPromocao,
              a.tipoBeneficio,
              a.multiplicador,
              a.percentualDesconto,
              ROUND (a.valorDesconto * CASE WHEN (v_cab_valorBasePagamento - v_cab_valorPagamentoBruto) <= 0 OR p_valorPagamentoBruto / (v_cab_valorBasePagamento - v_cab_valorPagamentoBruto) > 1 THEN 1 ELSE p_valorPagamentoBruto / (v_cab_valorBasePagamento - v_cab_valorPagamentoBruto) END, 2), -- p_valorDesconto
              a.gerarPontuacao,
              v_auxNumber); -- r_id
          END LOOP;
        END IF;
        IF v_idFinanceiroAdiantamento = 0
          AND p_valorPagamentoLiquido > 0
          AND v_cab_entradaSaida = 'S'
          AND v_cab_devolucaoAnulacaoRetorno = 0
          AND v_meioPagamento = 30
          AND p_config_103_modFinResgatePont <> 0
        THEN
          FOR a IN (
            SELECT
              a.operacaoFinanceira,
              a.meioPagamento,
              a.contaFinanceira,
              a.carteiraFinanceira,
              a.pessoa,
              a.diasSomarData,
              a.prazoPadrao,
              opFin.pagamentoRecebimento
            FROM PAMODELOSFINANCEIRO a
            JOIN SIOPERACOESFINANCEIRAS opFin
            ON opFin.operacaoFinanceira = a.operacaoFinanceira
            WHERE a.modeloFinanceiro = p_config_103_modFinResgatePont)
          LOOP
            SELECT
              COALESCE (MAX (orc.pessoa), 0),
              COALESCE (MAX (orc.autorizadoPessoa), 0)
            INTO
              v_orc_pessoa,
              v_orc_autorizadoPessoa
            FROM MODOCFISCALXITENS itemDoc
            JOIN MODOCFISCALXORCAMENTOITEM docXOrc
            ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
            JOIN MOORCAMENTOXITENS itemOrc
            ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
            JOIN MOORCAMENTOS orc
            ON orc.orcamento = itemOrc.orcamento
            WHERE itemDoc.idDocumentoFiscal = p_idDocumentoFiscal
            AND docXOrc.quantidade <> 0;
            SELECT COALESCE (MAX (pessoaEstabelecimento), 0)
            INTO v_est_pessoaEstabelecimento
            FROM PAESTABELECIMENTOS
            WHERE estabelecimento = v_cab_estabelecimento;
            ADD_FINANC_ATUALIZA (
              p_sys_estabelecimentoAtivo,
              p_config_349_prazoValidadePont,
              p_config_354_estabProximoId,
              0, -- p_financ_idFinanceiro,
              v_cab_sessaoCaixa,
              v_cab_fatoContabil,
              v_cab_estabelecimento,
              CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END, -- p_financ_data
              CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END, -- p_financ_dataEmissao
              a.prazoPadrao, -- p_financ_prazoPadrao,
              a.prazoPadrao, -- p_financ_prazo,
              TRUNC (CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END) + a.prazoPadrao, -- p_financ_vencimento
              TRUNC (CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END) + a.prazoPadrao, -- p_financ_vencimentoNegociado
              TRUNC (CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END) + a.prazoPadrao, -- p_financ_naoCobrarJurosMultaAt
              a.contaFinanceira,
              a.pagamentoRecebimento,
              a.operacaoFinanceira,
              ' ', -- p_financ_complemento
              0, -- p_financ_contratoCompra
              0, -- p_financ_idPagamentoPreDocumen
              0, -- p_financ_idPagamentoDocFiscal
              TO_CHAR (CASE WHEN v_cab_documentoFiscal > 0 THEN v_cab_documentoFiscal ELSE p_idDocumentoFiscal END), -- p_financ_documento
              TO_CHAR (CASE WHEN v_cab_documentoFiscal > 0 THEN v_cab_documentoFiscal ELSE p_idDocumentoFiscal END), -- p_financ_fatura
              1, -- p_financ_parcelaAtual
              1, -- p_financ_parcelasTotais
              CASE WHEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END > 0 THEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END WHEN a.pessoa > 0 THEN a.pessoa ELSE v_est_pessoaEstabelecimento END, -- p_financ_pessoa
              CASE WHEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END > 0 THEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_autorizadoPessoa ELSE v_orc_autorizadoPessoa END ELSE 0 END, -- p_financ_autorizadoPessoa
              CASE WHEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END > 0 THEN CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END WHEN a.pessoa > 0 THEN a.pessoa ELSE v_est_pessoaEstabelecimento END, -- p_financ_cobranca
              a.meioPagamento,
              a.carteiraFinanceira,
              p_valorPagamentoLiquido, -- p_financ_valor
              0, -- p_financ_valorDesconto
              0, -- p_financ_valorAcrescimo
              p_valorPagamentoLiquido, -- p_financ_saldo
              ' ', -- p_financ_indexador
              0, -- p_financ_cotacao
              0, -- p_financ_valorIndexado
              0, -- p_financ_saldoIndexado
              0, -- p_financ_efetivado
              0, -- p_financ_tarifaDescontoAteVenc
              'S', -- p_financ_tipoPagamentoAntecipa
              0, -- p_financ_tarifaMensalDescontoA
              'S', -- p_financ_tipoJuroDeMora
              0, -- p_financ_tarifaMensalJuroDeMor
              0, -- p_financ_tarifaMulta
              0, -- p_financ_valorFixoMulta
              0, -- p_financ_desconsiderarSPC
              '   ', -- b_boleto_banco
              ' ', -- b_boleto_nossoNumero
              ' ', -- b_boleto_linhaDigitavelBoleto
              ' ', -- b_boleto_codigoBarrasBoleto
              ' ', -- b_boleto_contratoCobrancaBolet
              0, -- b_boleto_boletoImpresso
              0, -- b_boleto_remessaEnviada
              0, -- b_boleto_retornoProcessado
              0, -- p_cartao_credenciadoraCartao
              0, -- p_cartao_bandeiraCartaoDebCred
              ' ', -- p_cartao_transacaoCartaoNSU
              ' ', -- p_cartao_autorizacaoCartao
              0, -- p_cartao_tarifaCartao
              0, -- p_cartao_valorTarifaCartao
              ' ', -- p_cartaoProprio_cartaoProprio
              ' ', -- p_cheque_compensacao
              '   ', -- p_cheque_banco
              ' ', -- p_cheque_agenciaBanco
              0, -- p_cheque_c1
              ' ', -- p_cheque_contaBanco
              0, -- p_cheque_c2
              0, -- p_cheque_cheque
              0, -- p_cheque_c3
              TRUNC (CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END) + a.prazoPadrao, -- p_cheque_bomPara
              ' ', -- p_cheque_indicadorPessoa
              ' ', -- p_cheque_titular
              ' ', -- p_cheque_indicadorDocumentoPes
              ' ', -- p_cheque_cnpjCpfIdEstrangeiro
              ' ', -- p_cheque_fone
              NULL, -- p_cheque_desde
              ' ', -- p_cheque_autenticacao
              1, -- p_cheque_statusCheque
              NULL, -- p_cheque_dataPrimeiroDeposito
              NULL, -- p_cheque_dataCompensacaoDevolu
              NULL, -- p_cheque_dataSegundoDeposito
              NULL, -- p_cheque_dataSegundaComponsaca
              0, -- p_cheque_indicadorFone
              0, -- p_cheque_operadoraTelefonia
              ' ', -- p_cheque_observacoesFone
              0, -- p_pix_salvar
              '   ', -- p_pix_banco
              ' ', -- p_pix_txIdPix
              ' ', -- p_pix_locationPix
              ' ', -- p_pix_chavePix
              ' ', -- p_pix_qrCode
              NULL, -- p_pix_dataCriacao
              ' ', -- p_pix_timezoneCriacao
              0, -- p_pix_segundosExpiracao
              ' ', -- p_pix_nomeRazaoSocial
              ' ', -- p_pix_cnpjCpfIdEstrangeiro
              ' ', -- p_pix_statusPix
              0, -- p_pix_numeroRevisao
              ' ', -- p_pix_observacoes
              0, -- p_correl_id
              0, -- p_correl_idFinanceiroCorrelato
              CASE WHEN a.operacaoFinanceira IN (34,74) AND a.meioPagamento NOT IN (30,31,32,33,38,39,40) THEN 1 ELSE 0 END, -- p_baixaAutomatica
              0, -- p_idFinanceiroAdiantamento
              0, -- p_idPrevisaoFinanceira
              0, -- p_preDocumento
              0, -- p_idDocumentoFiscal 
              v_idFinanceiroAdiantamento,
              v_auxNumber, -- r_financ_saldo
              v_auxNumber, -- r_financ_saldoIndexado
              v_auxNumber, -- r_financ_efetivado
              v_auxNumber, -- r_correl_id
              v_auxNumber); -- r_idBaixaFinanceiroAdiantament
          END LOOP;
        END IF;
        v_cab_numeroParcelas := v_cab_numeroParcelas + v_numeroParcelas;
        v_cab_somaPrazoParcelas := v_cab_somaPrazoParcelas + v_somaPrazoParcelas;
        v_cab_valorXPrazoParcelas := v_cab_valorXPrazoParcelas + v_valorXPrazoParcelas;
        v_cab_valorEntradaMinima := v_cab_valorEntradaMinima + p_valorEntradaMinima;
        IF p_config_171_apenasDinheiroAVi = 1
          AND v_meioPagamento IN (11,13,16,17,20,58)
          OR p_config_171_apenasDinheiroAVi = 0
          AND v_indicadorFormaPagamento = '0'
        THEN
          v_cab_valorAVistaEntrada := v_cab_valorAVistaEntrada + p_valorPagamentoLiquido;
        END IF;
        v_cab_valorPagamentoBruto := v_cab_valorPagamentoBruto + p_valorPagamentoBruto;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + p_valorDescontoPagamento;
        v_cab_valorOutrasDespesasPag := v_cab_valorOutrasDespesasPag + p_valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + p_valorJurosPagamento;
        v_cab_valorPagamentoLiquido := v_cab_valorPagamentoLiquido + p_valorPagamentoLiquido;
        v_cab_prazoMedio := CASE WHEN v_cab_numeroParcelas = 0 THEN 0 ELSE ROUND ((v_cab_somaPrazoParcelas / v_cab_numeroParcelas), 0) END;
        v_cab_prazoMedioPonderado := CASE WHEN v_cab_valorPagamentoLiquido = 0 THEN 0 ELSE ROUND ((v_cab_valorXPrazoParcelas / v_cab_valorPagamentoLiquido), 0) END;
        IF v_cab_valorPagamentoLiquido = p_valorPagamentoLiquido THEN
          v_cab_condicaoPagamento := p_condicaoPagamento;
        ELSE
          v_cab_condicaoPagamento := 0;
        END IF;
        IF v_cab_contratoCompra <= 0
          AND v_meioPagamento BETWEEN 53 AND 64
        THEN
          v_cab_contratoCompra := FUNC_ADD_PROXIMO_ID (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            'MOCONTRATOSCOMPRA',
            ' ',
            14);
        END IF;
        UPDATE MODOCUMENTOSFISCAIS SET 
          contratoCompra = v_cab_contratoCompra,
          condicaoPagamento = v_cab_condicaoPagamento,
          numeroParcelas = v_cab_numeroParcelas,
          somaPrazoParcelas = v_cab_somaPrazoParcelas,
          valorXPrazoParcelas = v_cab_valorXPrazoParcelas,
          prazoMedio = v_cab_prazoMedio,
          prazoMedioPonderado = v_cab_prazoMedioPonderado,
          valorEntradaMinima = v_cab_valorEntradaMinima,
          valorAVistaEntrada = v_cab_valorAVistaEntrada,
          valorPagamentoBruto = v_cab_valorPagamentoBruto,
          valorDescontoPagamento = v_cab_valorDescontoPagamento,
          valorOutrasDespesasPagamento = v_cab_valorOutrasDespesasPag,
          valorJurosPagamento = v_cab_valorJurosPagamento,
          valorPagamentoLiquido = v_cab_valorPagamentoLiquido
        WHERE idDocumentoFiscal = p_idDocumentoFiscal;
      ELSE
        UPDATE MODOCUMENTOSFISCAIS
        SET valorTroco  = valorTroco + p_valorPagamentoBruto
        WHERE idDocumentoFiscal = p_idDocumentoFiscal;
      END IF;
      IF p_contadorSessaoTEMPPARCELAS <> 0
        AND p_valorFinanceiro > 0
      THEN
        ADD_DOC_FISC_PAG_TEMPPAR_EFET (
          p_sessaoClient,
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_config_349_prazoValidadePont,
          p_config_354_estabProximoId,
          p_contadorSessaoTEMPPARCELAS,
          r_idPagamentoDocFiscal,
          p_cartao_credenciadoraCartao,
          p_cartao_bandeiraCartaoDebCred,
          p_cartao_transacaoCartaoNSU,
          p_cartao_autorizacaoCartao,
          p_cartao_tarifaCartao,
          p_cartaoProprio_cartaoProprio,
          v_idFinanceiroAdiantamento);
      END IF;
    END IF;
    IF p_contadorSessaoTEMPPARCELAS <> 0
      AND p_pagamentoTroco = 'P'
      AND (p_valorDescontoPagamento <> 0
        OR p_valorOutrasDespesasPagamento <> 0
        OR p_valorJurosPagamento <> 0)
      AND r_mensagemErro = ' '
    THEN 
      ADD_DOC_FISC_CALCULA_IMPOSTOS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_idDocumentoFiscal,
        0, -- p_troca_tipoPagamentoFrete
        ' '); -- p_a_cab_tipoPagamentoFrete
    END IF;
  END IF;
  IF p_troco_sequencia > 0
    AND r_mensagemErro = ' '
  THEN
    v_troco_valorFinanceiro := p_troco_valor;
    IF v_troco_valorFinanceiro > 0 THEN 
      FOR a IN (
        SELECT
          a.idPagamentoDocFiscal
        FROM (
          SELECT
            ROW_NUMBER() OVER (ORDER BY sequencia DESC) ordenacao,
            idPagamentoDocFiscal,
            sequencia,
            meioPagamento,
            valorFinanceiro
          FROM MODOCFISCALXPAGAMENTOS
          WHERE idDocumentoFiscal = p_idDocumentoFiscal
          AND pagamentoTroco = 'P') a
        WHERE a.ordenacao = 1
        AND a.meioPagamento = 11
        AND a.valorFinanceiro >= v_troco_valorFinanceiro)
      LOOP
        FOR b IN (
          SELECT
            b.idFinanceiro,
            b.valor,
            b.saldo
          FROM MOFINANCEIROS b
          WHERE b.idPagamentoDocFiscal = a.idPagamentoDocFiscal
          ORDER BY b.parcelaAtual)
        LOOP
          v_auxNumber := 0;
          IF b.valor >= v_troco_valorFinanceiro THEN
            v_auxNumber := v_troco_valorFinanceiro;
          ELSE
            v_auxNumber := b.valor;
          END IF;
          IF v_auxNumber > 0 THEN
            UPDATE MODOCFISCALXPAGAMENTOS c SET
              c.valorFinanceiro = c.valorFinanceiro - v_auxNumber
            WHERE c.idPagamentoDocFiscal = a.idPagamentoDocFiscal;
            UPDATE MOFINANCEIROS c SET
              c.valor = c.valor - v_auxNumber,
              c.saldo = c.saldo - v_auxNumber,
              c.valorIndexado = CASE WHEN c.cotacao > 0 THEN ROUND (((c.valor - v_auxNumber) / c.cotacao), 6) ELSE 0 END,
              c.saldoIndexado = CASE WHEN c.cotacao > 0 THEN ROUND (((c.saldo - v_auxNumber) / c.cotacao), 6) ELSE 0 END
            WHERE c.idFinanceiro = b.idFinanceiro;
            v_troco_valorFinanceiro := v_troco_valorFinanceiro - v_auxNumber;
            IF v_auxNumber > b.saldo THEN
              v_auxNumber := v_auxNumber - b.saldo;
              FOR c IN (
                SELECT
                  c.idBaixaFinanceiro,
                  c.cotacao,
                  c.valorBrutoIndexado,
                  c.valorBruto,
                  c.valorLiquido
                FROM MOFINANCEIROXBAIXAS c
                WHERE c.idFinanceiro = b.idFinanceiro
                AND c.valorBruto > 0
                ORDER BY c.idBaixaFinanceiro)
              LOOP
                IF v_auxNumber > 0 THEN
                  IF c.valorBruto >= v_auxNumber THEN
                    UPDATE MOFINANCEIROXBAIXAS d SET
                      d.valorBrutoIndexado = CASE WHEN d.cotacao = 0 THEN 0 ELSE (d.valorBruto - v_auxNumber) / d.cotacao END,
                      d.valorBruto = d.valorBruto - v_auxNumber,
                      d.valorLiquido = d.valorLiquido - v_auxNumber
                    WHERE d.idBaixaFinanceiro = c.idBaixaFinanceiro;
                    v_auxNumber := 0;
                  ELSE
                    UPDATE MOFINANCEIROXBAIXAS d SET
                      d.valorLiquido = d.valorLiquido - d.valorBruto,
                      d.valorBrutoIndexado = 0,
                      d.valorBruto = 0
                    WHERE d.idBaixaFinanceiro = c.idBaixaFinanceiro;
                    v_auxNumber := v_auxNumber - c.valorBruto;
                  END IF;
                  UPDATE MOFINANCEIROS d SET
                    d.saldo = (- v_auxNumber),
                    d.saldoIndexado = CASE WHEN d.cotacao = 0 THEN 0 ELSE ROUND (((- v_auxNumber) / d.cotacao), 6) END
                  WHERE d.idFinanceiro = b.idFinanceiro;
                END IF;
              END LOOP;
            END IF;
          END IF;
        END LOOP;
      END LOOP;
      IF p_troco_valor <> v_troco_valorFinanceiro
        AND p_contadorSessaoTEMPPARCELAS > 0
      THEN
        ADD_TEMPPARCELAS_RECALCULA (
          p_sessaoClient,
          p_contadorSessaoTEMPPARCELAS,
          'D', -- p_origem
          p_idDocumentoFiscal, -- p_idCabecalho
          'T', -- p_pagamentoTroco
          p_troco_sequencia,
          p_troco_condicaoPagamento,
          v_troco_valorFinanceiro,
          v_auxNumber);
      END IF;
    END IF;
    ADD_DOC_FISC_PAG_INSERE (
      p_sessaoClient,
      p_sys_estabelecimentoAtivo,
      p_config_103_modFinResgatePont,
      p_config_171_apenasDinheiroAVi,
      p_config_209_filtrarGrupoEcon,
      p_config_227_manterPessoaOrcam,
      p_config_349_prazoValidadePont,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_contadorSessaoTEMPPARCELAS,
      p_contadorSessaoTEMPPROMOCOES,
      p_idDocumentoFiscal,
      'T', -- p_pagamentoTroco
      p_troco_sequencia,
      p_troco_condicaoPagamento,
      p_troco_cobranca,
      0, -- p_valorEntradaMinima
      p_troco_valor, -- p_valorPagamentoBruto
      0, -- p_valorDescontoPagamento
      0, -- p_valorOutrasDespesasPagamento
      0, -- p_valorJurosPagamento
      p_troco_valor,
      v_troco_valorFinanceiro,
      0, -- p_cartao_credenciadoraCartao
      0, -- p_cartao_bandeiraCartaoDebCred
      ' ', -- p_cartao_transacaoCartaoNSU
      ' ', -- p_cartao_autorizacaoCartao
      0, -- p_cartao_tarifaCartao
      ' ', -- p_cartaoProprio_cartaoProprio
      0, -- p_idFinanceiroAdiantamento
      0, -- p_idLinkPagamento
      0, -- p_troco_sequencia
      0, -- p_troco_condicaoPagamento
      0, -- p_troco_cobranca
      0, -- p_troco_valor
      v_auxNumber, -- r_idPagamentoDocFiscal
      r_mensagemErro);
    IF p_troco_valor <> v_troco_valorFinanceiro
      AND p_contadorSessaoTEMPPARCELAS > 0
    THEN
      ADD_DOC_FISC_PAG_TEMPPAR_CAB (
        p_sessaoClient,
        p_contadorSessaoTEMPPARCELAS,
        p_idDocumentoFiscal);
    END IF;
  END IF;
END ADD_DOC_FISC_PAG_INSERE;

/

create or replace PROCEDURE ADD_FINANC_ATUALIZA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_financ_idFinanceiro          IN NUMBER,
  p_financ_sessaoCaixa           IN NUMBER,
  p_financ_fatoContabil          IN NUMBER,
  p_financ_estabelecimento       IN NUMBER,
  p_financ_data                  IN DATE,
  p_financ_dataEmissao           IN DATE,
  p_financ_prazoPadrao           IN NUMBER,
  p_financ_prazo                 IN NUMBER,
  p_financ_vencimento            IN DATE,
  p_financ_vencimentoNegociado   IN DATE,
  p_financ_naoCobrarJurosMultaAt IN DATE,
  p_financ_contaFinanceira       IN VARCHAR2,
  p_financ_pagamentoRecebimento  IN CHAR,
  p_financ_operacaoFinanceira    IN NUMBER,
  p_financ_complemento           IN VARCHAR2,
  p_financ_contratoCompra        IN NUMBER,
  p_financ_idPagamentoPreDocumen IN NUMBER,
  p_financ_idPagamentoDocFiscal  IN NUMBER,
  p_financ_documento             IN VARCHAR2,
  p_financ_fatura                IN VARCHAR2,
  p_financ_parcelaAtual          IN NUMBER,
  p_financ_parcelasTotais        IN NUMBER,
  p_financ_pessoa                IN NUMBER,
  p_financ_autorizadoPessoa      IN NUMBER,
  p_financ_cobranca              IN NUMBER,
  p_financ_meioPagamento         IN NUMBER,
  p_financ_carteiraFinanceira    IN NUMBER,
  p_financ_valor                 IN NUMBER,
  p_financ_valorDesconto         IN NUMBER,
  p_financ_valorAcrescimo        IN NUMBER,
  p_financ_saldo                 IN NUMBER,
  p_financ_indexador             IN VARCHAR2,
  p_financ_cotacao               IN NUMBER,
  p_financ_valorIndexado         IN NUMBER,
  p_financ_saldoIndexado         IN NUMBER,
  p_financ_efetivado             IN NUMBER,
  p_financ_tarifaDescontoAteVenc IN NUMBER,
  p_financ_tipoPagamentoAntecipa IN CHAR,
  p_financ_tarifaMensalDescontoA IN NUMBER,
  p_financ_tipoJuroDeMora        IN CHAR,
  p_financ_tarifaMensalJuroDeMor IN NUMBER,
  p_financ_tarifaMulta           IN NUMBER,
  p_financ_valorFixoMulta        IN NUMBER,
  p_financ_desconsiderarSPC      IN NUMBER,
  b_boleto_banco                 IN CHAR,
  b_boleto_nossoNumero           IN VARCHAR2,
  b_boleto_linhaDigitavelBoleto  IN VARCHAR2,
  b_boleto_codigoBarrasBoleto    IN VARCHAR2,
  b_boleto_contratoCobrancaBolet IN VARCHAR2,
  b_boleto_boletoImpresso        IN NUMBER,
  b_boleto_remessaEnviada        IN NUMBER,
  b_boleto_retornoProcessado     IN NUMBER,
  p_cartao_credenciadoraCartao   IN NUMBER,
  p_cartao_bandeiraCartaoDebCred IN NUMBER,
  p_cartao_transacaoCartaoNSU    IN VARCHAR2,
  p_cartao_autorizacaoCartao     IN VARCHAR2,
  p_cartao_tarifaCartao          IN NUMBER,
  p_cartao_valorTarifaCartao     IN NUMBER,
  p_cartaoProprio_cartaoProprio  IN VARCHAR2,
  p_cheque_compensacao           IN CHAR,
  p_cheque_banco                 IN CHAR,
  p_cheque_agenciaBanco          IN VARCHAR2,
  p_cheque_c1                    IN NUMBER,
  p_cheque_contaBanco            IN VARCHAR2,
  p_cheque_c2                    IN NUMBER,
  p_cheque_cheque                IN NUMBER,
  p_cheque_c3                    IN NUMBER,
  p_cheque_bomPara               IN DATE,
  p_cheque_indicadorPessoa       IN CHAR,
  p_cheque_titular               IN VARCHAR2,
  p_cheque_indicadorDocumentoPes IN CHAR,
  p_cheque_cnpjCpfIdEstrangeiro  IN VARCHAR2,
  p_cheque_fone                  IN VARCHAR2,
  p_cheque_desde                 IN DATE,
  p_cheque_autenticacao          IN VARCHAR2,
  p_cheque_statusCheque          IN NUMBER,
  p_cheque_dataPrimeiroDeposito  IN DATE,
  p_cheque_dataCompensacaoDevolu IN DATE,
  p_cheque_dataSegundoDeposito   IN DATE,
  p_cheque_dataSegundaComponsaca IN DATE,
  p_cheque_indicadorFone         IN NUMBER,
  p_cheque_operadoraTelefonia    IN NUMBER,
  p_cheque_observacoesFone       IN VARCHAR2,
  p_pix_salvar                   IN NUMBER,
  p_pix_banco                    IN CHAR,
  p_pix_txIdPix                  IN VARCHAR2,
  p_pix_locationPix              IN VARCHAR2,
  p_pix_chavePix                 IN VARCHAR2,
  p_pix_qrCode                   IN VARCHAR2,
  p_pix_dataCriacao              IN DATE,
  p_pix_timezoneCriacao          IN VARCHAR2,
  p_pix_segundosExpiracao        IN NUMBER,
  p_pix_nomeRazaoSocial          IN VARCHAR2,
  p_pix_cnpjCpfIdEstrangeiro     IN VARCHAR2,
  p_pix_statusPix                IN CHAR,
  p_pix_numeroRevisao            IN NUMBER,
  p_pix_observacoes              IN VARCHAR2,
  p_correl_id                    IN NUMBER,
  p_correl_idFinanceiroCorrelato IN NUMBER,
  p_baixaAutomatica              IN NUMBER,
  p_idFinanceiroAdiantamento     IN NUMBER,
  p_idPrevisaoFinanceira         IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  r_financ_idFinanceiro          OUT NUMBER,
  r_financ_saldo                 OUT NUMBER,
  r_financ_saldoIndexado         OUT NUMBER,
  r_financ_efetivado             OUT NUMBER,
  r_correl_id                    OUT NUMBER,
  r_idBaixaFinanceiroAdiantament OUT NUMBER)
IS
  v_financ_sessaoCaixa        NUMBER;
  v_financ_fatoContabil       NUMBER;
  v_financ_estabelecimento    NUMBER;
  v_financ_data               DATE;
  v_financ_pessoa             NUMBER;
  v_financ_autorizadoPessoa   NUMBER;
  v_financ_cobranca           NUMBER;
  v_cheque_fone               VARCHAR2 (14);
  v_adiant_meioPagamento      NUMBER;
  v_adiant_carteiraFinanceira NUMBER;
  v_auxNumber                 NUMBER;
BEGIN
  r_financ_idFinanceiro          := p_financ_idFinanceiro;
  r_financ_saldo                 := p_financ_saldo;
  r_financ_saldoIndexado         := p_financ_saldoIndexado;
  r_financ_efetivado             := p_financ_efetivado;
  r_correl_id                    := p_correl_id;
  r_idBaixaFinanceiroAdiantament := 0;
  v_financ_sessaoCaixa           := 0;
  v_financ_fatoContabil          := 0;
  v_financ_estabelecimento       := 0;
  v_financ_data                  := NULL;
  v_financ_pessoa                := 0;
  v_financ_autorizadoPessoa      := 0;
  v_financ_cobranca              := 0;
  v_cheque_fone                  := ' ';
  v_auxNumber                    := 0;
  IF p_financ_idFinanceiro > 0 THEN
    SELECT
      COALESCE (MAX (1), 0),
      COALESCE (MAX (sessaoCaixa), 0),
      COALESCE (MAX (fatoContabil), 0),
      COALESCE (MAX (estabelecimento), 0),
      MAX (data),
      COALESCE (MAX (pessoa), 0),
      COALESCE (MAX (autorizadoPessoa), 0),
      COALESCE (MAX (cobranca), 0)
    INTO
      v_auxNumber,
      v_financ_sessaoCaixa,
      v_financ_fatoContabil,
      v_financ_estabelecimento,
      v_financ_data,
      v_financ_pessoa,
      v_financ_autorizadoPessoa,
      v_financ_cobranca
    FROM MOFINANCEIROS
    WHERE idFinanceiro = p_financ_idFinanceiro;
    IF v_auxNumber = 1 THEN
      IF p_financ_sessaoCaixa <> v_financ_sessaoCaixa
        OR p_financ_fatoContabil <> v_financ_fatoContabil
        OR p_financ_estabelecimento <> v_financ_estabelecimento
        OR p_financ_data IS NULL
        AND v_financ_data IS NOT NULL
        OR p_financ_data IS NOT NULL
        AND v_financ_data IS NULL
        OR p_financ_data <> v_financ_data
      THEN
        UPDATE MOFINANCEIROXBAIXAS SET
          sessaoCaixa = v_financ_sessaoCaixa,
          fatoContabil = v_financ_fatoContabil,
          estabelecimento = v_financ_estabelecimento,
          data = v_financ_data
        WHERE idFinanceiro = p_financ_idFinanceiro
        AND baixaAutomatica = 1;
      END IF;
      IF p_financ_pessoa <> v_financ_pessoa THEN
        UPDATE MOFINANCEIROS a
        SET a.pessoa = v_financ_pessoa
        WHERE a.idPagamentoPreDocumento = 0
        AND a.idPagamentoDocFiscal = 0
        AND EXISTS (
           SELECT 1
           FROM MOFINANCEIROXCORRELATO b
           WHERE b.idFinanceiro = a.idFinanceiro
           AND b.idFinanceiroCorrelato = p_financ_idFinanceiro);
        UPDATE MOFINANCEIROS a
        SET a.pessoa = v_financ_pessoa
        WHERE a.idPagamentoPreDocumento = 0
        AND a.idPagamentoDocFiscal = 0
        AND EXISTS (
           SELECT 1
           FROM MOFINANCEIROXCORRELATO b
           WHERE b.idFinanceiroCorrelato = a.idFinanceiro
           AND b.idFinanceiro = p_financ_idFinanceiro);
      END IF;
      IF p_financ_autorizadoPessoa <> v_financ_autorizadoPessoa THEN
        UPDATE MOFINANCEIROS a
        SET a.autorizadoPessoa = v_financ_autorizadoPessoa
        WHERE a.idPagamentoPreDocumento = 0
        AND a.idPagamentoDocFiscal = 0
        AND EXISTS (
           SELECT 1
           FROM MOFINANCEIROXCORRELATO b
           WHERE b.idFinanceiro = a.idFinanceiro
           AND b.idFinanceiroCorrelato = p_financ_idFinanceiro);
        UPDATE MOFINANCEIROS a
        SET a.autorizadoPessoa = v_financ_autorizadoPessoa
        WHERE a.idPagamentoPreDocumento = 0
        AND a.idPagamentoDocFiscal = 0
        AND EXISTS (
           SELECT 1
           FROM MOFINANCEIROXCORRELATO b
           WHERE b.idFinanceiroCorrelato = a.idFinanceiro
           AND b.idFinanceiro = p_financ_idFinanceiro);
      END IF;
      IF p_financ_cobranca <> v_financ_cobranca THEN
        UPDATE MOFINANCEIROS a
        SET a.cobranca = v_financ_cobranca
        WHERE EXISTS (
           SELECT 1
           FROM MOFINANCEIROXCORRELATO b
           WHERE b.idFinanceiro = a.idFinanceiro
           AND b.idFinanceiroCorrelato = p_financ_idFinanceiro);
        UPDATE MOFINANCEIROS a
        SET a.cobranca = v_financ_cobranca
        WHERE EXISTS (
           SELECT 1
           FROM MOFINANCEIROXCORRELATO b
           WHERE b.idFinanceiroCorrelato = a.idFinanceiro
           AND b.idFinanceiro = p_financ_idFinanceiro);
      END IF;
    END IF;
  END IF;
  ADD_FINANC_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_financ_idFinanceiro,
    p_financ_sessaoCaixa,
    p_financ_fatoContabil,
    p_financ_estabelecimento,
    p_financ_data,
    p_financ_dataEmissao,
    p_financ_prazoPadrao,
    p_financ_prazo,
    p_financ_vencimento,
    p_financ_vencimentoNegociado,
    p_financ_naoCobrarJurosMultaAt,
    p_financ_contaFinanceira,
    p_financ_pagamentoRecebimento,
    p_financ_operacaoFinanceira,
    p_financ_complemento,
    p_financ_contratoCompra,
    p_financ_idPagamentoPreDocumen,
    p_financ_idPagamentoDocFiscal,
    p_financ_documento,
    p_financ_fatura,
    p_financ_parcelaAtual,
    p_financ_parcelasTotais,
    p_financ_pessoa,
    p_financ_autorizadoPessoa,
    p_financ_cobranca,
    p_financ_meioPagamento,
    p_financ_carteiraFinanceira,
    p_financ_valor,
    p_financ_valorDesconto,
    p_financ_valorAcrescimo,
    p_financ_saldo,
    p_financ_indexador,
    p_financ_cotacao,
    p_financ_valorIndexado,
    p_financ_saldoIndexado,
    p_financ_efetivado,
    p_financ_tarifaDescontoAteVenc,
    p_financ_tipoPagamentoAntecipa,
    p_financ_tarifaMensalDescontoA,
    p_financ_tipoJuroDeMora,
    p_financ_tarifaMensalJuroDeMor,
    p_financ_tarifaMulta,
    p_financ_valorFixoMulta,
    p_financ_desconsiderarSPC,
    r_financ_idFinanceiro);
  IF p_financ_meioPagamento IN (51,52) THEN
    ADD_FINANC_BOLETO_GRAVA (
      r_financ_idFinanceiro,
      b_boleto_banco,
      b_boleto_nossoNumero,
      b_boleto_linhaDigitavelBoleto,
      b_boleto_codigoBarrasBoleto,
      b_boleto_contratoCobrancaBolet,
      b_boleto_boletoImpresso,
      b_boleto_remessaEnviada,
      b_boleto_retornoProcessado);
  ELSIF p_financ_meioPagamento IN (17,18,19,20,21,22,23,24,25,26,27,28,40) THEN
    ADD_FINANC_CARTAO_GRAVA (
      r_financ_idFinanceiro,
      p_cartao_credenciadoraCartao,
      p_cartao_bandeiraCartaoDebCred,
      p_cartao_transacaoCartaoNSU,
      p_cartao_autorizacaoCartao,
      p_cartao_tarifaCartao,
      p_cartao_valorTarifaCartao);
  ELSIF p_financ_meioPagamento IN (39) THEN
    ADD_FINANC_CARTAO_PROPR_GRAVA (
      r_financ_idFinanceiro,
      p_cartaoProprio_cartaoProprio);
  ELSIF p_financ_meioPagamento IN (41,42,43,44,45,46) THEN
    SELECT COALESCE (MAX (fone), ' ')
    INTO v_cheque_fone
    FROM MOFINANCEIROXCHEQUE
    WHERE idFinanceiro = r_financ_idFinanceiro;
    IF p_cheque_fone <> ' ' THEN
      ADD_FONE_GRAVA (
        p_cheque_fone,
        p_cheque_indicadorFone,
        p_cheque_operadoraTelefonia,
        p_cheque_observacoesFone);
    END IF;
    ADD_FINANC_CHEQUE_GRAVA (
      r_financ_idFinanceiro,
      p_cheque_compensacao,
      p_cheque_banco,
      p_cheque_agenciaBanco,
      p_cheque_c1,
      p_cheque_contaBanco,
      p_cheque_c2,
      p_cheque_cheque,
      p_cheque_c3,
      p_cheque_bomPara,
      p_cheque_indicadorPessoa,
      p_cheque_titular,
      p_cheque_indicadorDocumentoPes,
      p_cheque_cnpjCpfIdEstrangeiro,
      p_cheque_fone,
      p_cheque_desde,
      p_cheque_autenticacao,
      p_cheque_statusCheque,
      p_cheque_dataPrimeiroDeposito,
      p_cheque_dataCompensacaoDevolu,
      p_cheque_dataSegundoDeposito,
      p_cheque_dataSegundaComponsaca);
    IF v_cheque_fone <> ' '
      AND v_cheque_fone <> p_cheque_fone
    THEN
      v_auxNumber := 1;
      IF v_auxNumber = 1 THEN
        SELECT COALESCE (MAX (0), 1)
        INTO v_auxNumber
        FROM CAPESSOASFISICAS
        WHERE empregoFone = v_cheque_fone;
      END IF;
      IF v_auxNumber = 1 THEN
        SELECT COALESCE (MAX (0), 1)
        INTO v_auxNumber
        FROM CAPESSOASFISICAS
        WHERE conjugeFone = v_cheque_fone;
      END IF;
      IF v_auxNumber = 1 THEN
        SELECT COALESCE (MAX (0), 1)
        INTO v_auxNumber
        FROM CAFONESPESSOA
        WHERE fone = v_cheque_fone;
      END IF;
      IF v_auxNumber = 1 THEN
        SELECT COALESCE (MAX (0), 1)
        INTO v_auxNumber
        FROM CAREFERBANCARIASPESSOA
        WHERE fone = v_cheque_fone;
      END IF;
      IF v_auxNumber = 1 THEN
        SELECT COALESCE (MAX (0), 1)
        INTO v_auxNumber
        FROM CAREFERCOMERCIAISPESSOA
        WHERE fone = v_cheque_fone;
      END IF;
      IF v_auxNumber = 1 THEN
        SELECT COALESCE (MAX (0), 1)
        INTO v_auxNumber
        FROM CAREFERPESSOAISPESSOA
        WHERE fone = v_cheque_fone;
      END IF;
      IF v_auxNumber = 1 THEN
        SELECT COALESCE (MAX (0), 1)
        INTO v_auxNumber
        FROM MOFINANCEIROXCHEQUE
        WHERE fone = v_cheque_fone;
      END IF;
      IF v_auxNumber = 1 THEN
        DELETE CAFONES WHERE fone = v_cheque_fone;
      END IF;
    END IF;
  END IF;
  IF p_pix_salvar = 1 THEN
    ADD_FINANC_PIX_GRAVA (
      r_financ_idFinanceiro,
      p_pix_banco,
      p_pix_txIdPix,
      p_pix_locationPix,
      p_pix_chavePix,
      p_pix_qrCode,
      p_pix_dataCriacao,
      p_pix_timezoneCriacao,
      p_pix_segundosExpiracao,
      p_pix_nomeRazaoSocial,
      p_pix_cnpjCpfIdEstrangeiro,
      p_pix_statusPix,
      p_pix_numeroRevisao,
      p_pix_observacoes);
  END IF;
  IF p_correl_idFinanceiroCorrelato > 0 THEN
    ADD_FINANC_FINANC_CORREL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_correl_id,
      r_financ_idFinanceiro,
      p_correl_idFinanceiroCorrelato,
      r_correl_id);
  END IF;
  IF p_idFinanceiroAdiantamento > 0
    AND r_financ_saldo > 0
  THEN
    SELECT
      COALESCE (MAX (meioPagamento), 0),
      COALESCE (MAX (carteiraFinanceira), 0)
    INTO
      v_adiant_meioPagamento,
      v_adiant_carteiraFinanceira
    FROM MOFINANCEIROS
    WHERE idFinanceiro = p_idFinanceiroAdiantamento;
    ADD_FINANC_BAIXA_ATUALIZA (
      p_sys_estabelecimentoAtivo,
      p_config_349_prazoValidadePont,
      p_config_354_estabProximoId,
      0, -- p_idBaixaFinanceiro,
      0, -- p_sessaoCaixa,
      p_financ_fatoContabil,
      p_idFinanceiroAdiantamento,
      p_financ_estabelecimento,
      p_financ_data,
      p_financ_contaFinanceira,
      CASE WHEN p_financ_pagamentoRecebimento = 'P' THEN 'R' ELSE 'P' END, -- p_pagamentoRecebimento
      p_financ_operacaoFinanceira,
      p_financ_cobranca,
      v_adiant_meioPagamento,
      v_adiant_carteiraFinanceira,
      p_financ_cotacao,
      r_financ_saldoIndexado, -- p_valorBrutoIndexado
      r_financ_saldo, -- p_valorBruto
      0, -- p_valorVariacaoIndexador
      0, -- p_valorJurosDeMora
      0, -- p_valorMulta
      0, -- p_valorTarifaCartao
      0, -- p_valorDescontos
      0, -- p_valorOutrosAcrescimos
      r_financ_saldo, -- p_valorLiquido
      0, -- p_baixaAutomatica
      0, -- p_unificadoReparcelado
      ' ', -- p_observacoes
      0, -- p_idBaixaFinanceiroCorrel
      0, -- p_idNovoFinanceiro
      0, -- p_preDocumento
      0, -- p_idDocumentoFiscal
      r_idBaixaFinanceiroAdiantament, -- r_idBaixaFinanceiro
      v_auxNumber, -- r_financ_saldo
      v_auxNumber, -- r_financ_saldoIndexado
      v_auxNumber); -- r_financ_efetivado
  END IF;
  IF (p_baixaAutomatica = 1
      OR p_idFinanceiroAdiantamento > 0)
    AND r_financ_saldo > 0
  THEN
    ADD_FINANC_BAIXA_ATUALIZA (
      p_sys_estabelecimentoAtivo,
      p_config_349_prazoValidadePont,
      p_config_354_estabProximoId,
      0, -- p_idBaixaFinanceiro,
      p_financ_sessaoCaixa,
      p_financ_fatoContabil,
      r_financ_idFinanceiro,
      p_financ_estabelecimento,
      CASE
        WHEN p_idFinanceiroAdiantamento > 0
          OR p_financ_vencimento IS NULL
          OR p_financ_data >= p_financ_vencimento
        THEN p_financ_data
        ELSE p_financ_vencimento
      END, -- p_data
      p_financ_contaFinanceira,
      p_financ_pagamentoRecebimento,
      p_financ_operacaoFinanceira,
      p_financ_cobranca,
      CASE
        WHEN p_idFinanceiroAdiantamento > 0
        THEN v_adiant_meioPagamento
        ELSE p_financ_meioPagamento
      END, -- p_meioPagamento
      CASE
        WHEN p_idFinanceiroAdiantamento > 0
        THEN v_adiant_carteiraFinanceira
        ELSE p_financ_carteiraFinanceira
      END, -- p_carteiraFinanceira
      p_financ_cotacao,
      r_financ_saldoIndexado, -- p_valorBrutoIndexado
      r_financ_saldo, -- p_valorBruto
      0, -- p_valorVariacaoIndexador
      0, -- p_valorJurosDeMora
      0, -- p_valorMulta
      0, -- p_valorTarifaCartao
      0, -- p_valorDescontos
      0, -- p_valorOutrosAcrescimos
      r_financ_saldo, -- p_valorLiquido
      1, -- p_baixaAutomatica
      0, -- p_unificadoReparcelado,
      ' ', -- p_observacoes
      r_idBaixaFinanceiroAdiantament, -- p_idBaixaFinanceiroCorrel
      0, -- p_idNovoFinanceiro
      0, -- p_preDocumento
      0, -- p_idDocumentoFiscal
      v_auxNumber, -- r_idBaixaFinanceiro
      r_financ_saldo,
      r_financ_saldoIndexado,
      r_financ_efetivado);
  END IF;
  IF p_idPrevisaoFinanceira > 0 THEN
    ADD_PREVFIN_FINANC_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id,
      p_idPrevisaoFinanceira,
      r_financ_idFinanceiro,
      p_preDocumento,
      p_idDocumentoFiscal,
      p_financ_valor,
      v_auxNumber); --r_id
  END IF;
END ADD_FINANC_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_TEMPPAR_EFET (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_idPagamentoPreDocumento      IN NUMBER,
  p_cartao_credenciadoraCartao   IN NUMBER,
  p_cartao_bandeiraCartaoDebCred IN NUMBER,
  p_cartao_transacaoCartaoNSU    IN VARCHAR2,
  p_cartao_autorizacaoCartao     IN VARCHAR2,
  p_cartao_tarifaCartao          IN NUMBER,
  p_cartaoProprio_cartaoProprio  IN VARCHAR2,
  p_idFinanceiroAdiantamento     IN NUMBER)
IS
  v_pag_preDocumento             NUMBER;
  v_pag_pagamentoTroco           CHAR (1);
  v_pag_sequencia                NUMBER;
  v_pag_meioPagamento            NUMBER;
  v_pag_cobranca                 NUMBER;
  v_pag_numeroParcelas           NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_sessaoCaixa              NUMBER;
  v_cab_fatoContabil             NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_autorizadoPessoa         NUMBER;
  v_cab_contratoCompra           NUMBER;
  v_cab_contaFinanceira          VARCHAR2 (60);
  v_cond_contaFinanceira         VARCHAR2 (60);
  v_cond_carteiraFinanceira      NUMBER;
  v_cond_tarifaDescontoAteVenc   NUMBER;
  v_cond_tipoPagamentoAntecipado CHAR (1);
  v_cond_tarifaMensalDescAntecip NUMBER;
  v_cond_tipoJuroDeMora          CHAR (1);
  v_cond_tarifaMensalJuroDeMora  NUMBER;
  v_cond_tarifaMulta             NUMBER;
  v_cond_valorFixoMulta          NUMBER;
  v_cond_diasToleranciaJurosMult NUMBER;
  v_orc_pessoa                   NUMBER;
  v_orc_autorizadoPessoa         NUMBER;
  v_fisc_documentoFiscal         NUMBER;
  v_parcela                      NUMBER;
  v_idFinanceiro                 NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  SELECT
    pag.preDocumento,
    pag.pagamentoTroco,
    pag.sequencia,
    pag.meioPagamento,
    pag.cobranca,
    pag.numeroParcelas,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.sessaoCaixa,
    cab.fatoContabil,
    cab.estabelecimento,
    cab.documentoFiscal,
    cab.dataEmissao,
    cab.dataEntradaSaida,
    cab.pessoa,
    cab.autorizadoPessoa,
    cab.contratoCompra,
    cab.contaFinanceira,
    cond.contaFinanceira,
    cond.carteiraFinanceira,
    cond.tarifaDescontoAteVencimento,
    cond.tipoPagamentoAntecipado,
    cond.tarifaMensalDescontoAntecipado,
    cond.tipoJuroDeMora,
    cond.tarifaMensalJuroDeMora,
    cond.tarifaMulta,
    cond.valorFixoMulta,
    cond.diasToleranciaJurosMulta
  INTO
    v_pag_preDocumento,
    v_pag_pagamentoTroco,
    v_pag_sequencia,
    v_pag_meioPagamento,
    v_pag_cobranca,
    v_pag_numeroParcelas,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_sessaoCaixa,
    v_cab_fatoContabil,
    v_cab_estabelecimento,
    v_cab_documentoFiscal,
    v_cab_dataEmissao,
    v_cab_dataEntradaSaida,
    v_cab_pessoa,
    v_cab_autorizadoPessoa,
    v_cab_contratoCompra,
    v_cab_contaFinanceira,
    v_cond_contaFinanceira,
    v_cond_carteiraFinanceira,
    v_cond_tarifaDescontoAteVenc,
    v_cond_tipoPagamentoAntecipado,
    v_cond_tarifaMensalDescAntecip,
    v_cond_tipoJuroDeMora,
    v_cond_tarifaMensalJuroDeMora,
    v_cond_tarifaMulta,
    v_cond_valorFixoMulta,
    v_cond_diasToleranciaJurosMult
  FROM MOPREDOCUMXPAGAMENTOS pag
  JOIN MOPREDOCUMENTOS cab
  ON cab.preDocumento = pag.preDocumento
  JOIN PACONDICOESPAGAMENTO cond
  ON cond.condicaoPagamento = pag.condicaoPagamento
  WHERE pag.idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  SELECT
    COALESCE (MAX (orc.pessoa), 0),
    COALESCE (MAX (orc.autorizadoPessoa), 0)
  INTO
    v_orc_pessoa,
    v_orc_autorizadoPessoa
  FROM MOPREDOCUMXITENS itemDoc
  JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
  ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
  JOIN MOORCAMENTOXITENS itemOrc
  ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
  JOIN MOORCAMENTOS orc
  ON orc.orcamento = itemOrc.orcamento
  WHERE itemDoc.preDocumento = v_pag_preDocumento
  AND docXOrc.quantidade <> 0;
  SELECT COALESCE (MAX (docFisc.documentoFiscal), 0)
  INTO v_fisc_documentoFiscal
  FROM MODOCUMENTOSFISCAIS docFisc
  JOIN MODOCFISCALXITENS itemDoc
  ON itemDoc.idDocumentoFiscal = docFisc.idDocumentoFiscal
  JOIN MODOCFISCALXPREDOCUM docXPre
  ON docXPre.idItemDocFiscal = itemDoc.idItemDocFiscal
  JOIN MOPREDOCUMXITENS itemPre
  ON itemPre.idItemPreDocumento = docXPre.idItemPreDocReferenciado
  WHERE itemPre.preDocumento = v_pag_preDocumento
  AND docFisc.origemDocumento = 13;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessaoTEMPPARCELAS
  AND origem = 'P'
  AND idCabecalho = v_pag_preDocumento
  AND pagamentoTroco = v_pag_pagamentoTroco
  AND sequencia = v_pag_sequencia
  AND valor <= 0;
  v_parcela := 0;
  FOR a IN (
    SELECT
      parcela,
      prazoPadrao,
      vencimento,
      baixaAutomatica,
      valor,
      complementoFinanceiro,
      idTransacaoTef,
      chequeCompensacao,
      chequeBanco,
      chequeAgenciaBanco,
      chequeC1,
      chequeContaBanco,
      chequeC2,
      cheque,
      chequeC3,
      chequeBomPara,
      chequeIndicadorPessoa,
      chequeTitular,
      chequeIndicadorDocumentoPessoa,
      chequeCnpjCpfIdEstrangeiro,
      chequeFone,
      chequeDesde,
      chequeIndicadorFone,
      chequeOperacaoTelefonia,
      chequeObservacaoFone,
      chequeAutenticacao,
      linhaDigitavelBoleto
    FROM TEMPPARCELAS
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND origem = 'P'
    AND idCabecalho = v_pag_preDocumento
    AND pagamentoTroco = v_pag_pagamentoTroco
    AND sequencia = v_pag_sequencia
    ORDER BY parcela)
  LOOP
    v_parcela := v_parcela + 1;
    ADD_FINANC_ATUALIZA (
      p_sys_estabelecimentoAtivo,
      p_config_349_prazoValidadePont,
      p_config_354_estabProximoId,
      0, -- p_financ_idFinanceiro
      v_cab_sessaoCaixa,
      v_cab_fatoContabil,
      v_cab_estabelecimento,
      CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END, -- p_financ_data
      v_cab_dataEmissao,
      a.prazoPadrao,
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END - v_cab_dataEmissao, -- p_financ_prazo
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END, -- p_financ_vencimento
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END, -- p_financ_vencimentoNegociado
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END + v_cond_diasToleranciaJurosMult, -- p_financ_naoCobrarJurosMultaAt
      CASE WHEN v_cab_contaFinanceira = ' ' THEN v_cond_contaFinanceira ELSE v_cab_contaFinanceira END, -- p_financ_contaFinanceira
      CASE WHEN v_pag_pagamentoTroco = 'T' THEN 'P' WHEN v_cab_entradaSaida='E' THEN 'P' ELSE 'R' END, -- p_financ_pagamentoRecebimento
      CASE WHEN v_pag_pagamentoTroco = 'T' THEN 22 WHEN v_cab_entradaSaida='E' AND v_cab_finalidadeNota='4' THEN 31 WHEN v_cab_entradaSaida='E' THEN 51 WHEN v_cab_finalidadeNota='4' THEN 71 ELSE 21 END, -- p_financ_operacaoFinanceira
      a.complementoFinanceiro,
      v_cab_contratoCompra,
      p_idPagamentoPreDocumento,
      0, -- p_financ_idPagamentoDocFiscal     
      TO_CHAR (CASE WHEN v_fisc_documentoFiscal > 0 THEN v_fisc_documentoFiscal WHEN v_cab_documentoFiscal > 0 THEN v_cab_documentoFiscal ELSE v_pag_preDocumento END), -- p_financ_documento
      TO_CHAR (CASE WHEN v_fisc_documentoFiscal > 0 THEN v_fisc_documentoFiscal WHEN v_cab_documentoFiscal > 0 THEN v_cab_documentoFiscal ELSE v_pag_preDocumento END), -- p_financ_fatura
      v_parcela, -- p_financ_parcelaAtual
      v_pag_numeroParcelas, -- p_financ_parcelasTotais
      CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END, -- p_financ_pessoa
      CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_autorizadoPessoa ELSE v_orc_autorizadoPessoa END, -- p_financ_autorizadoPessoa
      v_pag_cobranca,
      v_pag_meioPagamento,
      v_cond_carteiraFinanceira,
      a.valor,
      0, -- p_financ_valorDesconto
      0, -- p_financ_valorAcrescimo
      a.valor - CASE WHEN v_pag_meioPagamento IN(17,20,18,19,21,22,23,24,25,26,27,28,34,35,36,37,40,44,45,46) THEN ROUND (a.valor * p_cartao_tarifaCartao /100, 2) ELSE 0 END, -- p_financ_saldo
      ' ', -- p_financ_indexador
      0, -- p_financ_cotacao
      0, -- p_financ_valorIndexado
      0, -- p_financ_saldoIndexado
      0, -- p_financ_efetivado
      v_cond_tarifaDescontoAteVenc,
      v_cond_tipoPagamentoAntecipado,
      v_cond_tarifaMensalDescAntecip,
      v_cond_tipoJuroDeMora,
      v_cond_tarifaMensalJuroDeMora,
      v_cond_tarifaMulta,
      v_cond_valorFixoMulta,
      0, -- p_financ_desconsiderarSPC
      '   ', -- b_boleto_banco
      ' ', -- b_boleto_nossoNumero
      a.linhaDigitavelBoleto,
      ' ', -- b_boleto_codigoBarrasBoleto
      ' ', -- b_boleto_contratoCobrancaBolet
      0, -- b_boleto_boletoImpresso
      0, -- b_boleto_remessaEnviada
      0, -- b_boleto_retornoProcessado
      p_cartao_credenciadoraCartao,
      p_cartao_bandeiraCartaoDebCred,
      p_cartao_transacaoCartaoNSU,
      p_cartao_autorizacaoCartao,
      p_cartao_tarifaCartao,
      ROUND (a.valor * p_cartao_tarifaCartao /100, 2), -- p_cartao_valorTarifaCartao
      p_cartaoProprio_cartaoProprio,
      a.chequeCompensacao,
      a.chequeBanco,
      a.chequeAgenciaBanco,
      a.chequeC1,
      a.chequeContaBanco,
      a.chequeC2,
      a.cheque,
      a.chequeC3,
      a.chequeBomPara,
      a.chequeIndicadorPessoa,
      a.chequeTitular,
      a.chequeIndicadorDocumentoPessoa,
      a.chequeCnpjCpfIdEstrangeiro,
      a.chequeFone,
      a.chequeDesde,
      a.chequeAutenticacao,
      1, -- p_cheque_statusCheque
      NULL, -- p_cheque_dataPrimeiroDeposito
      NULL, -- p_cheque_dataCompensacaoDevolu
      NULL, -- p_cheque_dataSegundoDeposito
      NULL, -- p_cheque_dataSegundaComponsaca
      a.chequeIndicadorFone,
      a.chequeOperacaoTelefonia,
      a.chequeObservacaoFone,
      0, -- p_pix_salvar
      '   ', -- p_pix_banco
      ' ', -- p_pix_txIdPix
      ' ', -- p_pix_locationPix
      ' ', -- p_pix_chavePix
      ' ', -- p_pix_qrCode
      NULL, -- p_pix_dataCriacao
      ' ', -- p_pix_timezoneCriacao
      0, -- p_pix_segundosExpiracao
      ' ', -- p_pix_nomeRazaoSocial
      ' ', -- p_pix_cnpjCpfIdEstrangeiro
      ' ', -- p_pix_statusPix
      0, -- p_pix_numeroRevisao
      ' ', -- p_pix_observacoes
      0, -- p_correl_id
      0, -- p_correl_idFinanceiroCorrelato
      a.baixaAutomatica,
      p_idFinanceiroAdiantamento,
      0, -- p_idPrevisaoFinanceira
      0, -- p_preDocumento
      0, -- p_idDocumentoFiscal
      v_idFinanceiro,
      v_auxNumber, -- r_financ_saldo
      v_auxNumber, -- r_financ_saldoIndexado
      v_auxNumber, -- r_financ_efetivado
      v_auxNumber, -- r_correl_id
      v_auxNumber); -- r_idBaixaFinanceiroAdiantament;
    IF a.idTransacaoTef > 0 THEN
      UPDATE MOTRANSACOESTEF b
      SET b.idFinanceiro = v_idFinanceiro
      WHERE b.idTransacaoTef = a.idTransacaoTef;
    END IF;
    UPDATE TEMPPARCELAS b SET
      b.parcela = v_parcela,
      b.idFinanceiro = v_idFinanceiro
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND b.origem = 'P'
    AND b.idCabecalho = v_pag_preDocumento
    AND b.pagamentoTroco = v_pag_pagamentoTroco
    AND b.sequencia = v_pag_sequencia
    AND b.parcela = a.parcela;
  END LOOP;
END ADD_PRE_DOC_PAG_TEMPPAR_EFET;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_TEMPPAR_EFET (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_idPagamentoDocFiscal         IN NUMBER,
  p_cartao_credenciadoraCartao   IN NUMBER,
  p_cartao_bandeiraCartaoDebCred IN NUMBER,
  p_cartao_transacaoCartaoNSU    IN VARCHAR2,
  p_cartao_autorizacaoCartao     IN VARCHAR2,
  p_cartao_tarifaCartao          IN NUMBER,
  p_cartaoProprio_cartaoProprio  IN VARCHAR2,
  p_idFinanceiroAdiantamento     IN NUMBER)
IS
  v_pag_idDocumentoFiscal        NUMBER;
  v_pag_pagamentoTroco           CHAR (1);
  v_pag_sequencia                NUMBER;
  v_pag_meioPagamento            NUMBER;
  v_pag_cobranca                 NUMBER;
  v_pag_numeroParcelas           NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_sessaoCaixa              NUMBER;
  v_cab_fatoContabil             NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_autorizadoPessoa         NUMBER;
  v_cab_contratoCompra           NUMBER;
  v_cab_contaFinanceira          VARCHAR2 (60);
  v_cond_contaFinanceira         VARCHAR2 (60);
  v_cond_carteiraFinanceira      NUMBER;
  v_cond_tarifaDescontoAteVenc   NUMBER;
  v_cond_tipoPagamentoAntecipado CHAR (1);
  v_cond_tarifaMensalDescAntecip NUMBER;
  v_cond_tipoJuroDeMora          CHAR (1);
  v_cond_tarifaMensalJuroDeMora  NUMBER;
  v_cond_tarifaMulta             NUMBER;
  v_cond_valorFixoMulta          NUMBER;
  v_cond_diasToleranciaJurosMult NUMBER;
  v_orc_pessoa                   NUMBER;
  v_orc_autorizadoPessoa         NUMBER;
  v_parcela                      NUMBER;
  v_idFinanceiro                 NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  SELECT
    pag.idDocumentoFiscal,
    pag.pagamentoTroco,
    pag.sequencia,
    pag.meioPagamento,
    pag.cobranca,
    pag.numeroParcelas,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.sessaoCaixa,
    cab.fatoContabil,
    cab.estabelecimento,
    cab.documentoFiscal,
    cab.dataEmissao,
    cab.dataEntradaSaida,
    cab.pessoa,
    cab.autorizadoPessoa,
    cab.contratoCompra,
    cab.contaFinanceira,
    cond.contaFinanceira,
    cond.carteiraFinanceira,
    cond.tarifaDescontoAteVencimento,
    cond.tipoPagamentoAntecipado,
    cond.tarifaMensalDescontoAntecipado,
    cond.tipoJuroDeMora,
    cond.tarifaMensalJuroDeMora,
    cond.tarifaMulta,
    cond.valorFixoMulta,
    cond.diasToleranciaJurosMulta
  INTO
    v_pag_idDocumentoFiscal,
    v_pag_pagamentoTroco,
    v_pag_sequencia,
    v_pag_meioPagamento,
    v_pag_cobranca,
    v_pag_numeroParcelas,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_sessaoCaixa,
    v_cab_fatoContabil,
    v_cab_estabelecimento,
    v_cab_documentoFiscal,
    v_cab_dataEmissao,
    v_cab_dataEntradaSaida,
    v_cab_pessoa,
    v_cab_autorizadoPessoa,
    v_cab_contratoCompra,
    v_cab_contaFinanceira,
    v_cond_contaFinanceira,
    v_cond_carteiraFinanceira,
    v_cond_tarifaDescontoAteVenc,
    v_cond_tipoPagamentoAntecipado,
    v_cond_tarifaMensalDescAntecip,
    v_cond_tipoJuroDeMora,
    v_cond_tarifaMensalJuroDeMora,
    v_cond_tarifaMulta,
    v_cond_valorFixoMulta,
    v_cond_diasToleranciaJurosMult
  FROM MODOCFISCALXPAGAMENTOS pag
  JOIN MODOCUMENTOSFISCAIS cab
  ON cab.idDocumentoFiscal = pag.idDocumentoFiscal
  JOIN PACONDICOESPAGAMENTO cond
  ON cond.condicaoPagamento = pag.condicaoPagamento
  WHERE pag.idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  SELECT
    COALESCE (MAX (orc.pessoa), 0),
    COALESCE (MAX (orc.autorizadoPessoa), 0)
  INTO
    v_orc_pessoa,
    v_orc_autorizadoPessoa
  FROM MODOCFISCALXITENS itemDoc
  JOIN MODOCFISCALXORCAMENTOITEM docXOrc
  ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
  JOIN MOORCAMENTOXITENS itemOrc
  ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
  JOIN MOORCAMENTOS orc
  ON orc.orcamento = itemOrc.orcamento
  WHERE itemDoc.idDocumentoFiscal = v_pag_idDocumentoFiscal
  AND docXOrc.quantidade <> 0;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessaoTEMPPARCELAS
  AND origem = 'D'
  AND idCabecalho = v_pag_idDocumentoFiscal
  AND pagamentoTroco = v_pag_pagamentoTroco
  AND sequencia = v_pag_sequencia
  AND valor <= 0;
  v_parcela := 0;
  FOR a IN (
    SELECT
      parcela,
      prazoPadrao,
      vencimento,
      baixaAutomatica,
      valor,
      complementoFinanceiro,
      idTransacaoTef,
      chequeCompensacao,
      chequeBanco,
      chequeAgenciaBanco,
      chequeC1,
      chequeContaBanco,
      chequeC2,
      cheque,
      chequeC3,
      chequeBomPara,
      chequeIndicadorPessoa,
      chequeTitular,
      chequeIndicadorDocumentoPessoa,
      chequeCnpjCpfIdEstrangeiro,
      chequeFone,
      chequeDesde,
      chequeIndicadorFone,
      chequeOperacaoTelefonia,
      chequeObservacaoFone,
      chequeAutenticacao,
      linhaDigitavelBoleto
    FROM TEMPPARCELAS
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND origem = 'D'
    AND idCabecalho = v_pag_idDocumentoFiscal
    AND pagamentoTroco = v_pag_pagamentoTroco
    AND sequencia = v_pag_sequencia
    ORDER BY parcela)
  LOOP
    v_parcela := v_parcela + 1;
    ADD_FINANC_ATUALIZA (
      p_sys_estabelecimentoAtivo,
      p_config_349_prazoValidadePont,
      p_config_354_estabProximoId,
      0, -- p_financ_idFinanceiro
      v_cab_sessaoCaixa,
      v_cab_fatoContabil,
      v_cab_estabelecimento,
      CASE WHEN v_cab_dataEntradaSaida IS NULL THEN v_cab_dataEmissao ELSE v_cab_dataEntradaSaida END, -- p_financ_data
      v_cab_dataEmissao,
      a.prazoPadrao,
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END - v_cab_dataEmissao, -- p_financ_prazo
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END, -- p_financ_vencimento
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END, -- p_financ_vencimentoNegociado
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END + v_cond_diasToleranciaJurosMult, -- p_financ_naoCobrarJurosMultaAt
      CASE WHEN v_cab_contaFinanceira = ' ' THEN v_cond_contaFinanceira ELSE v_cab_contaFinanceira END, -- p_financ_contaFinanceira
      CASE WHEN v_pag_pagamentoTroco = 'T' THEN 'P' WHEN v_cab_entradaSaida='E' THEN 'P' ELSE 'R' END, -- p_financ_pagamentoRecebimento
      CASE WHEN v_pag_pagamentoTroco = 'T' THEN 22 WHEN v_cab_entradaSaida='E' AND v_cab_finalidadeNota='4' THEN 31 WHEN v_cab_entradaSaida='E' THEN 51 WHEN v_cab_finalidadeNota='4' THEN 71 ELSE 21 END, -- p_financ_operacaoFinanceira
      a.complementoFinanceiro,
      v_cab_contratoCompra,
      0, -- p_financ_idPagamentoPreDocumen     
      p_idPagamentoDocFiscal,
      TO_CHAR (CASE WHEN v_cab_documentoFiscal > 0 THEN v_cab_documentoFiscal ELSE v_pag_idDocumentoFiscal END), -- p_financ_documento
      TO_CHAR (CASE WHEN v_cab_documentoFiscal > 0 THEN v_cab_documentoFiscal ELSE v_pag_idDocumentoFiscal END), -- p_financ_fatura
      v_parcela, -- p_financ_parcelaAtual
      v_pag_numeroParcelas, -- p_financ_parcelasTotais
      CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_pessoa ELSE v_orc_pessoa END, -- p_financ_pessoa
      CASE WHEN v_cab_entradaSaida = 'E' OR v_cab_devolucaoAnulacaoRetorno = 0 OR v_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN v_cab_autorizadoPessoa ELSE v_orc_autorizadoPessoa END, -- p_financ_autorizadoPessoa
      v_pag_cobranca,
      v_pag_meioPagamento,
      v_cond_carteiraFinanceira,
      a.valor,
      0, -- p_financ_valorDesconto
      0, -- p_financ_valorAcrescimo
      a.valor - CASE WHEN v_pag_meioPagamento IN(17,20,18,19,21,22,23,24,25,26,27,28,34,35,36,37,40,44,45,46) THEN ROUND (a.valor * p_cartao_tarifaCartao /100, 2) ELSE 0 END, -- p_financ_saldo
      ' ', -- p_financ_indexador
      0, -- p_financ_cotacao
      0, -- p_financ_valorIndexado
      0, -- p_financ_saldoIndexado
      0, -- p_financ_efetivado
      v_cond_tarifaDescontoAteVenc,
      v_cond_tipoPagamentoAntecipado,
      v_cond_tarifaMensalDescAntecip,
      v_cond_tipoJuroDeMora,
      v_cond_tarifaMensalJuroDeMora,
      v_cond_tarifaMulta,
      v_cond_valorFixoMulta,
      0, -- p_financ_desconsiderarSPC
      '   ', -- b_boleto_banco
      ' ', -- b_boleto_nossoNumero
      a.linhaDigitavelBoleto,
      ' ', -- b_boleto_codigoBarrasBoleto
      ' ', -- b_boleto_contratoCobrancaBolet
      0, -- b_boleto_boletoImpresso
      0, -- b_boleto_remessaEnviada
      0, -- b_boleto_retornoProcessado
      p_cartao_credenciadoraCartao,
      p_cartao_bandeiraCartaoDebCred,
      p_cartao_transacaoCartaoNSU,
      p_cartao_autorizacaoCartao,
      p_cartao_tarifaCartao,
      ROUND (a.valor * p_cartao_tarifaCartao /100, 2), -- p_cartao_valorTarifaCartao
      p_cartaoProprio_cartaoProprio,
      a.chequeCompensacao,
      a.chequeBanco,
      a.chequeAgenciaBanco,
      a.chequeC1,
      a.chequeContaBanco,
      a.chequeC2,
      a.cheque,
      a.chequeC3,
      a.chequeBomPara,
      a.chequeIndicadorPessoa,
      a.chequeTitular,
      a.chequeIndicadorDocumentoPessoa,
      a.chequeCnpjCpfIdEstrangeiro,
      a.chequeFone,
      a.chequeDesde,
      a.chequeAutenticacao,
      1, -- p_cheque_statusCheque
      NULL, -- p_cheque_dataPrimeiroDeposito
      NULL, -- p_cheque_dataCompensacaoDevolu
      NULL, -- p_cheque_dataSegundoDeposito
      NULL, -- p_cheque_dataSegundaComponsaca
      a.chequeIndicadorFone,
      a.chequeOperacaoTelefonia,
      a.chequeObservacaoFone,
      0, -- p_pix_salvar
      '   ', -- p_pix_banco
      ' ', -- p_pix_txIdPix
      ' ', -- p_pix_locationPix
      ' ', -- p_pix_chavePix
      ' ', -- p_pix_qrCode
      NULL, -- p_pix_dataCriacao
      ' ', -- p_pix_timezoneCriacao
      0, -- p_pix_segundosExpiracao
      ' ', -- p_pix_nomeRazaoSocial
      ' ', -- p_pix_cnpjCpfIdEstrangeiro
      ' ', -- p_pix_statusPix
      0, -- p_pix_numeroRevisao
      ' ', -- p_pix_observacoes
      0, -- p_correl_id
      0, -- p_correl_idFinanceiroCorrelato
      a.baixaAutomatica,
      p_idFinanceiroAdiantamento,
      0, -- p_idPrevisaoFinanceira
      0, -- p_idDocumentoFiscal
      0, -- p_idDocumentoFiscal
      v_idFinanceiro,
      v_auxNumber, -- r_financ_saldo
      v_auxNumber, -- r_financ_saldoIndexado
      v_auxNumber, -- r_financ_efetivado
      v_auxNumber, -- r_correl_id
      v_auxNumber); -- r_idBaixaFinanceiroAdiantament;
    IF a.idTransacaoTef > 0 THEN
      UPDATE MOTRANSACOESTEF b
      SET b.idFinanceiro = v_idFinanceiro
      WHERE b.idTransacaoTef = a.idTransacaoTef;
    END IF;
    UPDATE TEMPPARCELAS b SET
      b.parcela = v_parcela,
      b.idFinanceiro = v_idFinanceiro
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND b.origem = 'D'
    AND b.idCabecalho = v_pag_idDocumentoFiscal
    AND b.pagamentoTroco = v_pag_pagamentoTroco
    AND b.sequencia = v_pag_sequencia
    AND b.parcela = a.parcela;
  END LOOP;
END ADD_DOC_FISC_PAG_TEMPPAR_EFET;

/

create or replace PROCEDURE ADD_ORCAMENTO_PAG_TEMPPAR_EFET (
  p_sessaoClient               IN VARCHAR2,
  p_sys_estabelecimentoAtivo   IN NUMBER,
  p_config_354_estabProximoId  IN NUMBER,
  p_contadorSessaoTEMPPARCELAS IN NUMBER,
  p_idPagamentoOrcamento       IN NUMBER)
IS
  v_pag_orcamento                NUMBER;
  v_pag_pagamentoTroco           CHAR (1);
  v_pag_sequencia                NUMBER;
  v_pag_meioPagamento            NUMBER;
  v_pag_cobranca                 NUMBER;
  v_pag_numeroParcelas           NUMBER;
  v_cab_idDocumento              NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_autorizadoPessoa         NUMBER;
  v_cab_contaFinanceira          VARCHAR2 (60);
  v_cond_contaFinanceira         VARCHAR2 (60);
  v_cond_carteiraFinanceira      NUMBER;
  v_cond_tarifaDescontoAteVenc   NUMBER;
  v_cond_tipoPagamentoAntecipado CHAR (1);
  v_cond_tarifaMensalDescAntecip NUMBER;
  v_cond_tipoJuroDeMora          CHAR (1);
  v_cond_tarifaMensalJuroDeMora  NUMBER;
  v_cond_tarifaMulta             NUMBER;
  v_cond_valorFixoMulta          NUMBER;
  v_parcela                      NUMBER;
  v_idPrevisaoFinanceira         NUMBER;
BEGIN
  SELECT
    pag.orcamento,
    pag.pagamentoTroco,
    pag.sequencia,
    pag.meioPagamento,
    pag.cobranca,
    pag.numeroParcelas,
    orc.idDocumento,
    orc.entradaSaida,
    orc.estabelecimento,
    orc.dataEmissao,
    orc.pessoa,
    orc.autorizadoPessoa,
    orc.contaFinanceira,
    cond.contaFinanceira,
    cond.carteiraFinanceira,
    cond.tarifaDescontoAteVencimento,
    cond.tipoPagamentoAntecipado,
    cond.tarifaMensalDescontoAntecipado,
    cond.tipoJuroDeMora,
    cond.tarifaMensalJuroDeMora,
    cond.tarifaMulta,
    cond.valorFixoMulta
  INTO
    v_pag_orcamento,
    v_pag_pagamentoTroco,
    v_pag_sequencia,
    v_pag_meioPagamento,
    v_pag_cobranca,
    v_pag_numeroParcelas,
    v_cab_idDocumento,
    v_cab_entradaSaida,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_autorizadoPessoa,
    v_cab_contaFinanceira,
    v_cond_contaFinanceira,
    v_cond_carteiraFinanceira,
    v_cond_tarifaDescontoAteVenc,
    v_cond_tipoPagamentoAntecipado,
    v_cond_tarifaMensalDescAntecip,
    v_cond_tipoJuroDeMora,
    v_cond_tarifaMensalJuroDeMora,
    v_cond_tarifaMulta,
    v_cond_valorFixoMulta
  FROM MOORCAMENTOXPAGAMENTOS pag
  JOIN MOORCAMENTOS orc
  ON orc.orcamento = pag.orcamento
  JOIN PACONDICOESPAGAMENTO cond
  ON cond.condicaoPagamento = pag.condicaoPagamento
  WHERE pag.idPagamentoOrcamento = p_idPagamentoOrcamento;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessaoTEMPPARCELAS
  AND origem = 'O'
  AND idCabecalho = v_pag_orcamento
  AND pagamentoTroco = v_pag_pagamentoTroco
  AND sequencia = v_pag_sequencia
  AND valor <= 0;
  v_parcela := 0;
  FOR a IN (
    SELECT
      parcela,
      prazoPadrao,
      vencimento,
      valor,
      complementoFinanceiro,
      chequeBomPara
    FROM TEMPPARCELAS
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND origem = 'O'
    AND idCabecalho = v_pag_orcamento
    AND pagamentoTroco = v_pag_pagamentoTroco
    AND sequencia = v_pag_sequencia
    ORDER BY parcela)
  LOOP
    v_parcela := v_parcela + 1;
    ADD_PREVFIN_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_idPrevisaoFinanceira
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      a.prazoPadrao,
      TRUNC(CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END) - TRUNC(v_cab_dataEmissao),
      CASE WHEN v_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END,
      CASE WHEN v_cab_contaFinanceira = ' ' THEN v_cond_contaFinanceira ELSE v_cab_contaFinanceira END,
      CASE WHEN v_pag_pagamentoTroco = 'T' THEN 'P' ELSE (CASE WHEN v_cab_entradaSaida = 'E' THEN 'P' ELSE 'R' END) END,
      CASE WHEN v_pag_pagamentoTroco = 'T' THEN 22 ELSE (CASE WHEN v_cab_entradaSaida = 'E' THEN 51 ELSE 21 END) END,
      a.complementoFinanceiro,
      p_idPagamentoOrcamento,
      TO_CHAR (v_cab_idDocumento),
      TO_CHAR (v_cab_idDocumento),
      v_parcela,
      v_pag_numeroParcelas,
      v_cab_pessoa,
      v_cab_autorizadoPessoa,
      v_pag_cobranca,
      v_pag_meioPagamento,
      v_cond_carteiraFinanceira,
      a.valor,
      a.valor,
      ' ',
      0,
      0,
      0,
      0,
      v_cond_tarifaDescontoAteVenc,
      v_cond_tipoPagamentoAntecipado,
      v_cond_tarifaMensalDescAntecip,
      v_cond_tipoJuroDeMora,
      v_cond_tarifaMensalJuroDeMora,
      v_cond_tarifaMulta,
      v_cond_valorFixoMulta,
      0,
      0,
      v_idPrevisaoFinanceira);
    UPDATE TEMPPARCELAS b SET
      b.parcela = v_parcela,
      b.idPrevisaoFinanceira = v_idPrevisaoFinanceira
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND b.origem = 'O'
    AND b.idCabecalho = v_pag_orcamento
    AND b.pagamentoTroco = v_pag_pagamentoTroco
    AND b.sequencia = v_pag_sequencia
    AND b.parcela = a.parcela;
  END LOOP;
END ADD_ORCAMENTO_PAG_TEMPPAR_EFET;

/

BEGIN
  FOR a IN (
    SELECT
      baixa.idBaixaFinanceiro,
      financ.operacaoFinanceira,
      baixa.pagamentoRecebimento,
      bxXbx.idBaixaFinanceiroCorrel
    FROM MOFINANCEIROXBAIXAS baixa
    JOIN MOFINANCEIROS financ
    ON financ.idFinanceiro = baixa.idFinanceiro
    JOIN MOBAIXAXBAIXAFINANCEIRO bxXbx
    ON bxXbx.idBaixaFinanceiro = baixa.idBaixaFinanceiro
    JOIN MOFINANCEIROXBAIXAS baixa2
    ON baixa2.idBaixaFinanceiro = bxXbx.idBaixaFinanceiroCorrel
    JOIN MOFINANCEIROS financ2
    ON financ2.idFinanceiro = baixa2.idFinanceiro
    WHERE baixa.idBaixaFinanceiro > 0
    AND baixa.baixaAutomatica = 1
    AND baixa.data >= TO_DATE ('01/01/2025', 'DD/MM/YYYY')
    AND financ2.meioPagamento IN (30,31,32,33,38,39)
    AND (baixa.operacaoFinanceira <> financ.operacaoFinanceira
      OR baixa2.operacaoFinanceira <> financ.operacaoFinanceira
      OR baixa2.pagamentoRecebimento <> CASE WHEN baixa.pagamentoRecebimento = 'R' THEN 'P' ELSE 'R' END
      OR baixa2.sessaoCaixa <> 0))
  LOOP
    UPDATE MOFINANCEIROXBAIXAS b
    SET b.operacaoFinanceira = a.operacaoFinanceira
    WHERE b.idBaixaFinanceiro = a.idBaixaFinanceiro;
    UPDATE MOFINANCEIROXBAIXAS b SET
      b.operacaoFinanceira = a.operacaoFinanceira,
      b.pagamentoRecebimento = CASE WHEN a.pagamentoRecebimento = 'R' THEN 'P' ELSE 'R' END,
      b.sessaoCaixa = 0
    WHERE b.idBaixaFinanceiro = a.idBaixaFinanceiroCorrel;    
  END LOOP;
END;

/

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('10/06/2025', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 4' WHERE idVersaoSistema = 2025001003;

COMMIT;

-- FIM BETA 4 - 10/06/2025

-- exec dbms_utility.compile_schema('ADDERI');
-- exec dbms_stats.gather_schema_stats('ADDERI');
