      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    IF v_item_valorISSQN <> v_ini_valorISSQN
      OR v_item_valorRetIRRF <> v_ini_valorRetIRRF
      OR v_item_valorRetINSS <> v_ini_valorRetINSS
      OR v_item_valorRetPIS <> v_ini_valorRetPIS
      OR v_item_valorRetCOFINS <> v_ini_valorRetCOFINS
      OR v_item_valorRetCSLL <> v_ini_valorRetCSLL
      OR v_item_valorRetOutros <> v_ini_valorRetOutros
    THEN
      r_calcularImpostos := 1;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        FOR b IN (
          SELECT
            b.idItemOrcamento,
            b.quantidadeSaldo,
            b.quantidadeBaixar,
            b.zerarSaldo,
            c.orcamento
          FROM MODISTRIBUICAODFEXORCAM b
          JOIN MOORCAMENTOXITENS c
          ON c.idItemOrcamento = b.idItemOrcamento
          WHERE b.gradeDistribuicaoDFe = p_idItemReferenciado
          AND b.quantidadeBaixar > 0
          ORDER BY b.sequencia)
        LOOP
          UPDATE MODISTRIBUICAODFEXGRADE
          SET idItemDocFiscal = r_item_idItemDocFiscal
          WHERE gradeDistribuicaoDFe = p_idItemReferenciado;
          ADD_DOC_FISC_ITEM_REF_ORCAMEN (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_227_manterPessoaOrcam,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_item_idDocumentoFiscal,
            v_cab_tipoDocumento,
            v_cab_documentoFiscal,
            v_cab_estabelecimento,
            v_cab_pessoa,
            r_item_idItemDocFiscal,
            v_item_sequencia,
            p_item_vendedor,
            p_item_gradeProduto,
            p_item_unidadeMedidaConversao,
            p_item_quantidadeConvertida,
            p_item_quantidade,
            v_item_valorLiquidoItem,
            b.idItemOrcamento,
            CASE
              WHEN b.zerarSaldo = 1
              THEN b.quantidadeSaldo
              ELSE b.quantidadeBaixar
            END,
            0, -- p_atualizarObservacoes,
            v_auxNumber);  
          SELECT COALESCE (SUM(c.quantidadeSaldo),0)
          INTO v_quantidadeSaldo
          FROM MOORCAMENTOXITENS c
          WHERE c.orcamento = b.orcamento
          AND c.cancelado = 0;
          IF v_quantidadeSaldo <= 0 THEN
            SELECT COALESCE (MAX (etapaOrcamento), 0)
            INTO v_novaEtapaOrcamento
            FROM PAETAPASORCAMENTO
            WHERE etapaOrcamento > 0
            AND ativo = 1
            AND situacaoOrcamento = 80;      
            ADD_ORCAMENTO_CAB_ETAPA_TROCA (
              p_sys_usuarioLogado,
              p_sys_estabelecimentoAtivo,
              p_person_138_etapOrcEmProcesso,
              p_person_139_etapOrcLiberado,
              p_person_190_modeloFrete,
              p_config_209_filtrarGrupoEcon,
              p_config_354_estabProximoId,
              p_config_362_calcCustoPorGrade,
              p_config_378_calcularVolumes,
              b.orcamento,
              p_sys_usuarioLogado,
              v_novaEtapaOrcamento,
              ' ',
              0,
              0);
          ELSE
            v_novaEtapaOrcamento := p_config_230_etapaPedComprParc;
          END IF;  
          IF v_novaEtapaOrcamento <> 0 THEN
            ADD_ORCAMENTO_CAB_ETAPA_TROCA (
              p_sys_usuarioLogado,
              p_sys_estabelecimentoAtivo,
              p_person_138_etapOrcEmProcesso,
              p_person_139_etapOrcLiberado,
              p_person_190_modeloFrete,
              p_config_209_filtrarGrupoEcon,
              p_config_354_estabProximoId,
              p_config_362_calcCustoPorGrade,
              p_config_378_calcularVolumes,
              b.orcamento,
              p_sys_usuarioLogado,
              v_novaEtapaOrcamento,
              ' ',
              0,
              0);
          END IF;
        END LOOP;
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_227_manterPessoaOrcam,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    ELSE
    ADD_DOC_ATUALIZA_RESERVAS (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      v_cab_devolucaoAnulacaoRetorno,
      0, -- p_idItemPreDocumento
      r_item_idItemDocFiscal);
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'D',
      r_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MODOCFISCALXITENS
    SET observacoes = v_observacoes
    WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_ESTOQUE_DOC_FISC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_LINKPAG_SITUACAO_TROCA (
  p_sessaoClient                 IN VARCHAR,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_195_umReciboParaCadaR IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_226_baixarFinEstabOri IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_441_etapaOrcamLinkPag IN NUMBER,
  p_config_442_etapaOrSerLinkPag IN NUMBER,
  p_idLinkPagamento              IN NUMBER,
  p_situacaoLinkPagamento        IN CHAR,
  p_codigoStatusPagamento        IN VARCHAR2,
  p_mensagemStatusPagamento      IN VARCHAR2,
  p_conteudoCancelamentoEnvio    IN CLOB,
  p_conteudoCancelamentoRetorno  IN CLOB,
  p_codigoStatusCancelamento     IN VARCHAR2,
  p_mensagemStatusCancelamento   IN VARCHAR2,
  p_observacoes                  IN VARCHAR)
IS
  v_contadorSessaoTEMPRECEBIMENT NUMBER;
  v_contadorSessaoTEMPPAGAMENTOS NUMBER;
  v_contadorSessaoTEMPPARCELAS   NUMBER;
  v_contadorSessaoTEMPSELECIONAD NUMBER;
  v_sessaoCaixa                  NUMBER;
  v_fatoContabil                 NUMBER;
  v_dataAtual                    DATE;
  v_idFinanceiroAdiantamento     NUMBER;
  v_adiantamentoSaldo            NUMBER;
  v_valorLiquidar                NUMBER;
  v_parc_contador                NUMBER;
  v_parc_valorJurosDeMora        NUMBER;
  v_parc_valorMulta              NUMBER;
  v_parc_valorLiquido            NUMBER;
  v_2_contratosCompra            CLOB;
  v_3_contratosCompra            CLOB;
  v_23_idsFinanceiro             CLOB;
  v_29_contratosCompra           CLOB;
  v_36_contratosCompra           CLOB;
  v_46_idsFinanceiro             CLOB;
  v_idBaixaFinanceiroAdiantament NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  v_contadorSessaoTEMPRECEBIMENT := 1;
  v_contadorSessaoTEMPPAGAMENTOS := 1;
  v_contadorSessaoTEMPPARCELAS   := 1;
  v_contadorSessaoTEMPSELECIONAD := 1;
  v_sessaoCaixa                  := 0;
  v_fatoContabil                 := 0;
  v_dataAtual                    := SYSDATE;
  v_2_contratosCompra            := ' ';
  v_3_contratosCompra            := ' ';
  v_23_idsFinanceiro             := ' ';
  v_29_contratosCompra           := ' ';
  v_36_contratosCompra           := ' ';
  v_46_idsFinanceiro             := ' ';
  DELETE TEMPRECEBIMENTO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPRECEBIMENT;
  DELETE TEMPPAGAMENTOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPAGAMENTOS;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPARCELAS;
  DELETE TEMPSELECIONADOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPSELECIONAD; 
  DELETE TEMPSELECAODOCUMENTO
  WHERE sessaoClient = p_sessaoClient
  AND nomePublico = 'PagamentosRecebimentos';
  FOR linkPag IN (
    SELECT
      linkPag.idLinkPagamento,
      linkPag.estabelecimento,
      linkPag.pedidoLinkPagamento,
      linkPag.complemento,
      linkPag.cobranca,
      linkPag.carteiraFinanceira,
      linkPag.valorJurosTotal,
      linkPag.valorMultaTotal,
      linkPag.valorDescontoInformado,
      linkPag.valorAcrescimoInformado,
      linkPag.valor,
      linkPag.modeloFinanceiro,
      linkPag.idFinanceiroAdiantamento,
      est.pessoaEstabelecimento est_pessoaEstabelecimento
    FROM MOLINKSPAGAMENTO linkPag
    JOIN PAESTABELECIMENTOS est
    ON linkPag.estabelecimento = est.estabelecimento
    WHERE linkPag.idLinkPagamento = p_idLinkPagamento)
  LOOP
    v_idFinanceiroAdiantamento := linkPag.idFinanceiroAdiantamento;
    -- SUCESSO
    IF p_situacaoLinkPagamento = 'S' THEN
      -- GERA CRÉDITO
      IF linkPag.idFinanceiroAdiantamento = 0
        AND linkPag.modeloFinanceiro <> 0
      THEN
        FOR modDoc IN (
          SELECT
            modDoc.operacaoFinanceira,
            modDoc.meioPagamento,
            modDoc.contaFinanceira,
            modDoc.carteiraFinanceira,
            modDoc.pessoa,
            modDoc.diasSomarData,
            modDoc.prazoPadrao,
            opFin.pagamentoRecebimento
          FROM PAMODELOSFINANCEIRO modDoc
          JOIN SIOPERACOESFINANCEIRAS opFin
          ON opFin.operacaoFinanceira = modDoc.operacaoFinanceira
          WHERE modDoc.modeloFinanceiro = linkPag.modeloFinanceiro)
        LOOP
          ADD_FATO_CONTABIL_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_fatoContabil,
            CASE
              WHEN p_config_226_baixarFinEstabOri = 1
              THEN linkPag.estabelecimento
              ELSE p_sys_estabelecimentoAtivo
            END, -- p_estabelecimento
            v_dataAtual,
            'A', -- p_situacaoContabilizacao
            v_fatoContabil);
          ADD_FINANC_ATUALIZA (
            p_sys_estabelecimentoAtivo,
            p_config_349_prazoValidadePont,
            p_config_354_estabProximoId,
            0, -- p_financ_idFinanceiro,
            v_sessaoCaixa,
            v_fatoContabil,
            linkPag.estabelecimento,
            v_dataAtual, -- p_financ_data
            v_dataAtual, -- p_financ_dataEmissao
            modDoc.prazoPadrao, -- p_financ_prazoPadrao,
            modDoc.prazoPadrao, -- p_financ_prazo,
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_vencimento
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_vencimentoNegociado
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_naoCobrarJurosMultaAt
            modDoc.contaFinanceira,
            modDoc.pagamentoRecebimento,
            modDoc.operacaoFinanceira,
            linkPag.complemento, -- p_financ_complemento
            0, -- p_financ_contratoCompra
            0, -- p_financ_idPagamentoPreDocumen
            0, -- p_financ_idPagamentoDocFiscal
            linkPag.pedidoLinkPagamento, -- p_financ_documento
            linkPag.pedidoLinkPagamento, -- p_financ_fatura
            1, -- p_financ_parcelaAtual
            1, -- p_financ_parcelasTotais
            CASE
              WHEN linkPag.cobranca > 0
              THEN linkPag.cobranca
              WHEN modDoc.pessoa > 0
              THEN modDoc.pessoa
              ELSE linkPag.est_pessoaEstabelecimento
            END, -- p_financ_pessoa
            0, -- p_financ_autorizadoPessoa
            CASE
              WHEN linkPag.cobranca > 0
              THEN linkPag.cobranca
              WHEN modDoc.pessoa > 0
              THEN modDoc.pessoa
              ELSE linkPag.est_pessoaEstabelecimento
            END, -- p_financ_cobranca
            modDoc.meioPagamento,
            modDoc.carteiraFinanceira,
            linkPag.valor, -- p_financ_valor
            0, -- p_financ_valorDesconto
            0, -- p_financ_valorAcrescimo
            linkPag.valor, -- 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 (v_dataAtual) + modDoc.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 modDoc.operacaoFinanceira IN (34,74)
                AND modDoc.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, -- v_financ_saldo
            v_auxNumber, -- v_financ_saldoIndexado
            v_auxNumber, -- v_financ_efetivado
            v_auxNumber, -- v_correl_id
            v_auxNumber); -- v_idBaixaFinanceiroAdiantament
        END LOOP;
        -- Lê Adiantamento para Liquidar parcelas
        FOR adiant IN (
          SELECT
            adiant.idFinanceiro,
            adiant.complemento,
            adiant.documento,
            adiant.meioPagamento,
            adiant.carteiraFinanceira,
            adiant.saldo
          FROM MOFINANCEIROS adiant
          WHERE adiant.idFinanceiro = v_idFinanceiroAdiantamento
          AND adiant.saldo > 0
          AND adiant.efetivado = 0)
        LOOP
          -- Gera Temporário Parcelas
          v_parc_contador         := 0;
          v_parc_valorJurosDeMora := 0;
          v_parc_valorMulta       := 0;
          v_parc_valorLiquido     := 0;
          FOR linkParc IN (
            SELECT
              linkParc.id,
              linkParc.idLinkPagamento,
              linkParc.idFinanceiro,
              linkParc.cotacao,
              linkParc.valor,
              linkParc.saldo,
              linkParc.saldoIndexado,
              linkParc.valorVariacaoIndexador,
              linkParc.valorJurosDeMora,
              linkParc.valorMulta,
              linkParc.valorTarifaCartao,
              linkParc.valorDescontos,
              linkParc.valorOutrosAcrescimos,
              linkParc.valorLiquido,
              financ.pagamentoRecebimento
            FROM MOLINKPAGAMENTOXBAIXAS linkParc
            JOIN MOFINANCEIROS financ
            ON financ.idFinanceiro = linkParc.idFinanceiro
            WHERE linkParc.idLinkPagamento = linkPag.idLinkPagamento
            AND linkParc.idBaixaFinanceiro = 0
            ORDER BY linkParc.id)
          LOOP
            v_parc_contador         := v_parc_contador + 1;
            v_parc_valorJurosDeMora := v_parc_valorJurosDeMora + linkParc.valorJurosDeMora;
            v_parc_valorMulta       := v_parc_valorMulta + linkParc.valorMulta;
            v_parc_valorLiquido     := v_parc_valorLiquido + linkParc.valorLiquido;
            INSERT INTO TEMPRECEBIMENTO (
              sessaoClient,
              contadorSessao,
              origem,
              id,
              ordenacao,
              quebra,
              selecionado,
              legenda,
              pagamentoRecebimento,
              cotacao,
              valor,
              saldo,
              saldoIndexado,
              valorVariacaoIndexador,
              valorJurosDeMora,
              valorMulta,
              valorTarifaCartao,
              valorDescontos,
              valorOutrosAcrescimos,
              valorLiquido)
            VALUES (
              p_sessaoClient,
              v_contadorSessaoTEMPRECEBIMENT,
              'F',
              linkParc.idFinanceiro,
              LPAD (v_parc_contador, 14, '0'),
              LPAD (linkParc.id, 14, '0'),
              1,
              0,
              linkParc.pagamentoRecebimento,
              linkParc.cotacao,
              linkParc.valor,
              linkParc.saldo,
              linkParc.saldoIndexado,
              linkParc.valorVariacaoIndexador,
              linkParc.valorJurosDeMora,
              linkParc.valorMulta,
              linkParc.valorTarifaCartao,
              linkParc.valorDescontos,
              linkParc.valorOutrosAcrescimos,
              linkParc.valorLiquido);
          END LOOP;
          IF v_parc_contador > 0 THEN
            INSERT INTO TEMPSELECAODOCUMENTO (
              sessaoClient,
              nomePublico,
              quebra,
              origem,
              idCabecalho,
              sequencia,
              idItem,
              quebraB,
              linhaA,
              campoA,
              idA,
              idB,
              idC,
              idD,
              valorA,
              simNaoA,
              BLOB)
            VALUES (
              p_sessaoClient,
              'PagamentosRecebimentos',
              ' ',
              ' ',
              0,
              1,
              0,
              ' ',
              adiant.complemento,
              adiant.documento,
              adiant.meioPagamento,
              adiant.carteiraFinanceira,
              adiant.idFinanceiro,
              0,
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END,
              0,
              NULL);
            -- Efetua Liquidação
            ADD_FINANC_TEMPRECEBIMENTO_EF (
              p_sessaoClient,
              p_sys_estabelecimentoAtivo,
              p_config_195_umReciboParaCadaR,
              p_config_226_baixarFinEstabOri,
              p_config_349_prazoValidadePont,
              p_config_354_estabProximoId,
              v_contadorSessaoTEMPRECEBIMENT,
              v_contadorSessaoTEMPPAGAMENTOS,
              v_contadorSessaoTEMPPARCELAS,
              v_contadorSessaoTEMPSELECIONAD,
              0, -- p_idNegociacaoDivida
              v_sessaoCaixa,
              v_dataAtual, -- p_dataBaixa
              v_parc_valorJurosDeMora,
              v_parc_valorMulta,
              'R', -- p_confirm_pagamentoRecebimento
              v_parc_valorLiquido,
              linkPag.valorJurosTotal,
              linkPag.valorMultaTotal,
              linkPag.valorDescontoInformado,
              linkPag.valorAcrescimoInformado,
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END, -- p_confirm_valorTotal
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END, -- p_confirm_valorTotalPago
              0, -- p_confirm_troco_meioPagamento
              0, -- p_confirm_troco_condicaoPagam
              v_auxNumber,
              v_2_contratosCompra,
              v_3_contratosCompra,
              v_23_idsFinanceiro,
              v_29_contratosCompra,
              v_36_contratosCompra,
              v_46_idsFinanceiro);
          END IF;
          FOR tempSel IN (
            SELECT
              tempSel.id idBaixaFinanceiro,
              finXBaix.idFinanceiro
            FROM TEMPSELECIONADOS tempSel
            JOIN MOFINANCEIROXBAIXAS finXBaix
            ON finXBaix.idBaixaFinanceiro = tempSel.id
            WHERE tempSel.sessaoClient = p_sessaoClient
            AND tempSel.contadorSessao = v_contadorSessaoTEMPSELECIONAD
            AND tempSel.id > 0)
          LOOP
            UPDATE MOLINKPAGAMENTOXBAIXAS x
            SET x.idBaixaFinanceiro = tempSel.idBaixaFinanceiro
            WHERE x.idLinkPagamento = linkPag.idLinkPagamento
            AND x.idFinanceiro = tempSel.idFinanceiro
            AND x.idBaixaFinanceiro = 0;
          END LOOP;
        END LOOP;
      END IF;
      FOR orc IN (
        SELECT
          orc.orcamento,
          orc.tipoDocumento,
          orc.etapaOrcamento
        FROM MOLINKPAGAMENTOXORCAMENTO linkXDoc
        JOIN MOORCAMENTOXPAGAMENTOS orcXPag
        ON orcXPag.idPagamentoOrcamento = linkXDoc.idPagamentoOrcamento
        JOIN MOORCAMENTOS orc
        ON orc.orcamento = orcXPag.orcamento
        WHERE linkXDoc.idLinkPagamento = linkPag.idLinkPagamento)
      LOOP
        IF orc.tipoDocumento = 102
          AND p_config_442_etapaOrSerLinkPag <> 0
          AND orc.etapaOrcamento <> p_config_442_etapaOrSerLinkPag
        THEN
          ADD_ORCAMENTO_CAB_ETAPA_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_138_etapOrcEmProcesso,
            p_person_139_etapOrcLiberado,
            p_person_190_modeloFrete,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            orc.orcamento,
            p_sys_usuarioLogado, -- p_usuario
            p_config_442_etapaOrSerLinkPag, -- p_novaEtapaOrcamento
            ' ', -- p_justificativaCancelamento
            0, -- p_cancelandoOrcamento
            0); -- p_colaboradorRespRecebimento
        ELSIF (orc.tipoDocumento <> 102
          OR p_config_442_etapaOrSerLinkPag = 0)
          AND p_config_441_etapaOrcamLinkPag <> 0
          AND orc.etapaOrcamento <> p_config_441_etapaOrcamLinkPag
        THEN
          ADD_ORCAMENTO_CAB_ETAPA_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_138_etapOrcEmProcesso,
            p_person_139_etapOrcLiberado,
            p_person_190_modeloFrete,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            orc.orcamento,
            p_sys_usuarioLogado, -- p_usuario
            p_config_441_etapaOrcamLinkPag, -- p_novaEtapaOrcamento
            ' ', -- p_justificativaCancelamento
            0, -- p_cancelandoOrcamento
            0); -- p_colaboradorRespRecebimento
        END IF;
      END LOOP;
      IF v_idFinanceiroAdiantamento > 0 THEN
        -- Lê Adiantamento para Liquidar parcelas
        FOR adiant IN (
          SELECT
            adiant.idFinanceiro,
            adiant.complemento,
            adiant.documento,
            adiant.meioPagamento,
            adiant.carteiraFinanceira,
            adiant.saldo
          FROM MOFINANCEIROS adiant
          WHERE adiant.idFinanceiro = v_idFinanceiroAdiantamento
          AND adiant.saldo > 0
          AND adiant.efetivado = 0)
        LOOP
          v_adiantamentoSaldo := adiant.saldo;
          FOR financ IN (
            SELECT
              financ.idFinanceiro,
              financ.sessaoCaixa,
              financ.fatoContabil,
              financ.estabelecimento,
              financ.data,
              financ.vencimento,
              financ.contaFinanceira,
              financ.pagamentoRecebimento,
              financ.operacaoFinanceira,
              financ.cobranca,
              financ.cotacao,
              financ.saldo,
              financ.saldoIndexado
            FROM MOLINKPAGAMENTOXPREDOCUM linkXDoc
            JOIN MOFINANCEIROS financ
            ON financ.idPagamentoPreDocumento = linkXDoc.idPagamentoPreDocumento
            WHERE linkXDoc.idLinkPagamento = linkPag.idLinkPagamento
            AND linkXDoc.idPagamentoPreDocumento > 0
            AND financ.saldo > 0
            AND financ.efetivado = 0
            UNION ALL
            SELECT
              financ.idFinanceiro,
              financ.sessaoCaixa,
              financ.fatoContabil,
              financ.estabelecimento,
              financ.data,
              financ.vencimento,
              financ.contaFinanceira,
              financ.pagamentoRecebimento,
              financ.operacaoFinanceira,
              financ.cobranca,
              financ.cotacao,
              financ.saldo,
              financ.saldoIndexado
            FROM MOLINKPAGAMENTOXDOCFISCAL linkXDoc
            JOIN MOFINANCEIROS financ
            ON financ.idPagamentoDocFiscal = linkXDoc.idPagamentoDocFiscal
            WHERE linkXDoc.idLinkPagamento = linkPag.idLinkPagamento
            AND linkXDoc.idPagamentoDocFiscal > 0
            AND financ.saldo > 0
            AND financ.efetivado = 0)
          LOOP
            v_valorLiquidar :=
              CASE
                WHEN v_adiantamentoSaldo > financ.saldo
                THEN financ.saldo
                ELSE v_adiantamentoSaldo
              END;
            IF v_valorLiquidar > 0 THEN
              ADD_FINANC_BAIXA_ATUALIZA (
                p_sys_estabelecimentoAtivo,
                p_config_349_prazoValidadePont,
                p_config_354_estabProximoId,
                0, -- p_idBaixaFinanceiro,
                0, -- p_sessaoCaixa,
                financ.fatoContabil,
                v_idFinanceiroAdiantamento,
                financ.estabelecimento,
                financ.data,
                financ.contaFinanceira,
                CASE WHEN financ.pagamentoRecebimento = 'P' THEN 'R' ELSE 'P' END, -- p_pagamentoRecebimento
                financ.operacaoFinanceira,
                financ.cobranca,
                adiant.meioPagamento,
                adiant.carteiraFinanceira,
                financ.cotacao,
                CASE
                  WHEN financ.saldoIndexado = 0
                  THEN 0
                  WHEN v_valorLiquidar = financ.saldo
                  THEN financ.saldoIndexado
                  ELSE financ.saldoIndexado * v_valorLiquidar / financ.saldo
                END, -- p_valorBrutoIndexado
                v_valorLiquidar, -- p_valorBruto
                0, -- p_valorVariacaoIndexador
                0, -- p_valorJurosDeMora
                0, -- p_valorMulta
                0, -- p_valorTarifaCartao
                0, -- p_valorDescontos
                0, -- p_valorOutrosAcrescimos
                v_valorLiquidar, -- p_valorLiquido
                0, -- p_baixaAutomatica
                0, -- p_unificadoReparcelado
                ' ', -- p_observacoes
                0, -- p_idBaixaFinanceiroCorrel
                0, -- p_idNovoFinanceiro
                0, -- p_preDocumento
                0, -- p_idDocumentoFiscal
                v_idBaixaFinanceiroAdiantament, -- r_idBaixaFinanceiro
                v_auxNumber, -- r_financ_saldo
                v_auxNumber, -- r_financ_saldoIndexado
                v_auxNumber); -- r_financ_efetivado
              ADD_FINANC_BAIXA_ATUALIZA (
                p_sys_estabelecimentoAtivo,
                p_config_349_prazoValidadePont,
                p_config_354_estabProximoId,
                0, -- p_idBaixaFinanceiro,
                financ.sessaoCaixa,
                financ.fatoContabil,
                financ.idFinanceiro,
                financ.estabelecimento,
                CASE
                  WHEN v_idFinanceiroAdiantamento > 0
                    OR financ.vencimento IS NULL
                    OR financ.data >= financ.vencimento
                  THEN financ.data
                  ELSE financ.vencimento
                END, -- p_data
                financ.contaFinanceira,
                financ.pagamentoRecebimento,
                financ.operacaoFinanceira,
                financ.cobranca,
                adiant.meioPagamento,
                adiant.carteiraFinanceira,
                financ.cotacao,
                CASE
                  WHEN financ.saldoIndexado = 0
                  THEN 0
                  WHEN v_valorLiquidar = financ.saldo
                  THEN financ.saldoIndexado
                  ELSE financ.saldoIndexado * v_valorLiquidar / financ.saldo
                END, -- p_valorBrutoIndexado
                v_valorLiquidar, -- p_valorBruto
                0, -- p_valorVariacaoIndexador
                0, -- p_valorJurosDeMora
                0, -- p_valorMulta
                0, -- p_valorTarifaCartao
                0, -- p_valorDescontos
                0, -- p_valorOutrosAcrescimos
                v_valorLiquidar, -- p_valorLiquido
                1, -- p_baixaAutomatica
                0, -- p_unificadoReparcelado,
                ' ', -- p_observacoes
                v_idBaixaFinanceiroAdiantament, -- p_idBaixaFinanceiroCorrel
                0, -- p_idNovoFinanceiro
                0, -- p_preDocumento
                0, -- p_idDocumentoFiscal
                v_auxNumber, -- r_idBaixaFinanceiro
                v_auxNumber, -- r_financ_saldo
                v_auxNumber, -- r_financ_saldoIndexado
                v_auxNumber); -- r_financ_efetivado
                v_adiantamentoSaldo := v_adiantamentoSaldo - v_valorLiquidar;
            END IF;
          END LOOP;
        END LOOP;
      END IF;
    -- CANCELAMENTO
    ELSIF p_situacaoLinkPagamento = 'C' THEN
      -- EXCLUI CRÉDITO
      IF linkPag.idFinanceiroAdiantamento > 0 THEN
        ADD_FINANC_EXCLUI (linkPag.idFinanceiroAdiantamento);
        v_idFinanceiroAdiantamento :=0;
      END IF;
      FOR linkParc IN (
        SELECT linkParc.idBaixaFinanceiro
        FROM MOLINKPAGAMENTOXBAIXAS linkParc
        WHERE linkParc.idLinkPagamento = linkPag.idLinkPagamento
        AND linkParc.idBaixaFinanceiro > 0
        ORDER BY linkParc.idBaixaFinanceiro)
      LOOP
        ADD_FINANC_BAIXA_EXCLUI (linkParc.idBaixaFinanceiro);
      END LOOP;
    END IF;
    UPDATE MOLINKSPAGAMENTO x SET
      x.situacaoLinkPagamento = p_situacaoLinkPagamento,
      x.idFinanceiroAdiantamento = v_idFinanceiroAdiantamento,
      x.codigoStatusPagamento = p_codigoStatusPagamento,
      x.mensagemStatusPagamento = p_mensagemStatusPagamento,
      x.conteudoCancelamentoEnvio = p_conteudoCancelamentoEnvio,
      x.conteudoCancelamentoRetorno = p_conteudoCancelamentoRetorno,
      x.codigoStatusCancelamento = p_codigoStatusCancelamento,
      x.mensagemStatusCancelamento = p_mensagemStatusCancelamento,
      x.observacoes = p_observacoes
    WHERE x.idLinkPagamento = p_idLinkPagamento;
  END LOOP;
  DELETE TEMPRECEBIMENTO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPRECEBIMENT;
  DELETE TEMPPAGAMENTOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPAGAMENTOS;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPARCELAS;
  DELETE TEMPSELECIONADOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPSELECIONAD; 
  DELETE TEMPSELECAODOCUMENTO
  WHERE sessaoClient = p_sessaoClient
  AND nomePublico = 'PagamentosRecebimentos';
END ADD_LINKPAG_SITUACAO_TROCA;

/

create or replace PROCEDURE ADD_WS_SITEF_LINK_PAGAMENTO (
  p_conteudo           IN CLOB,
  r_situacaoWebService OUT CHAR,
  r_observacoes        OUT VARCHAR)
IS
  v_rede                        VARCHAR (300);
  v_tipoFinanciamento           VARCHAR (300);
  v_valor                       VARCHAR (300);
  v_binCartao                   VARCHAR (300);
  v_acquirerdId                 VARCHAR (300);
  v_nsuesitef                   VARCHAR (300);
  v_parcelas                    VARCHAR (300);
  v_nsu                         VARCHAR (300);
  v_autorizadora                VARCHAR (300);
  v_nit                         VARCHAR (300);
  v_pedido                      VARCHAR (300);
  v_tipoPagamento               VARCHAR (300);
  v_finalCartao                 VARCHAR (300);
  v_idLinkPagamento             NUMBER;
  v_situacaoLinkPagamentoAtual  CHAR (1);
  v_situacaoLinkPagamentoNova   CHAR (1);
  v_codigoStatusPagamento       VARCHAR (30);
  v_mensagemStatusPagamento     VARCHAR (256);
  v_transacaoLinkCancelamento   VARCHAR (12);
  v_conteudoCancelamentoEnvio   CLOB;
  v_conteudoCancelamentoRetorno CLOB;
  v_codigoStatusCancelamento    VARCHAR (30);
  v_mensagemStatusCancelamento  VARCHAR (256);
  v_observacoesLinkPagamento    VARCHAR (4000);
  sessaoClient                  VARCHAR (30);
  sys_usuarioLogado             NUMBER;
  sys_perfilUsuarioLogado       NUMBER;
  sys_estabelecimentoAtivo      NUMBER;
  person_138_etapOrcEmProcesso  NUMBER;
  person_139_etapOrcLiberado    NUMBER;
  person_190_modeloFrete        CHAR (1);
  config_195_umReciboParaCadaR  NUMBER;
  config_209_filtrarGrupoEcon   NUMBER;
  config_226_baixarFinEstabOri  NUMBER;
  config_349_prazoValidadePont  NUMBER;
  config_354_estabProximoId     NUMBER;
  config_362_calcCustoPorGrade  NUMBER;
  config_378_calcularVolumes    NUMBER;
  config_441_etapaOrcamLinkPag  NUMBER;
  config_442_etapaOrSerLinkPag  NUMBER;
BEGIN
  r_situacaoWebService          := 'F';
  r_observacoes                 := 'Erro genérico.';
  v_rede                        := ' ';
  v_tipoFinanciamento           := ' ';
  v_valor                       := ' ';
  v_binCartao                   := ' ';
  v_acquirerdId                 := ' ';
  v_nsuesitef                   := ' ';
  v_parcelas                    := ' ';
  v_nsu                         := ' ';
  v_autorizadora                := ' ';
  v_nit                         := ' ';
  v_pedido                      := ' ';
  v_tipoPagamento               := ' ';
  v_finalCartao                 := ' ';
  v_idLinkPagamento             := 0;
  v_situacaoLinkPagamentoAtual  := ' ';
  v_situacaoLinkPagamentoNova   := ' ';
  v_codigoStatusPagamento       := ' ';
  v_mensagemStatusPagamento     := ' ';
  v_transacaoLinkCancelamento   := ' ';
  v_conteudoCancelamentoEnvio   := NULL;
  v_conteudoCancelamentoRetorno := NULL;
  v_codigoStatusCancelamento    := ' ';
  v_mensagemStatusCancelamento  := ' ';
  sessaoClient                  := 'ADD_WS_SITEF_LINK_PAGAMENTO';
  FOR linhas IN (
    SELECT
      REGEXP_SUBSTR (REGEXP_SUBSTR (p_conteudo, '[^,]+', 1, LEVEL), '[^":"]+', 1, 1) AS nomeCampo,
      REGEXP_SUBSTR (REGEXP_SUBSTR (p_conteudo, '[^,]+', 1, LEVEL), '[^":"]+', 1, 2) AS conteudo
    FROM DUAL
    CONNECT BY LEVEL <= REGEXP_COUNT (p_conteudo, ',') + 1)
  LOOP
    IF linhas.nomeCampo = 'rede' THEN
      v_rede := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'tipoFinanciamento' THEN
      v_tipoFinanciamento := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'valor' THEN
      v_valor := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'binCartao' THEN
      v_binCartao := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'acquirerdId' THEN
      v_acquirerdId := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'nsuesitef' THEN
      v_nsuesitef := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'parcelas' THEN
      v_parcelas := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'nsu' THEN
      v_nsu := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'autorizadora' THEN
      v_autorizadora := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'nit' THEN
      v_nit := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'pedido' THEN
      v_pedido := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'tipoPagamento' THEN
      v_tipoPagamento := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'finalCartao' THEN
      v_finalCartao := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'status' THEN
      v_codigoStatusPagamento := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'mensagem' THEN
      v_mensagemStatusPagamento := linhas.conteudo;
    END IF;
  END LOOP;
  IF v_nit <> ' ' THEN
    SELECT
      COALESCE (MAX (idLinkPagamento), 0),
      COALESCE (MAX (situacaoLinkPagamento), ' ')
    INTO
      v_idLinkPagamento,
      v_situacaoLinkPagamentoAtual
    FROM MOLINKSPAGAMENTO
    WHERE nitLinkPagamento = v_nit;
    IF v_idLinkPagamento > 0 THEN
      v_observacoesLinkPagamento := COALESCE (RTRIM (SUBSTR (CAST (p_conteudo AS VARCHAR), 1, 4000)), ' ');
      IF v_codigoStatusPagamento = 'CAN' THEN
        v_situacaoLinkPagamentoNova := 'C';
        v_codigoStatusCancelamento := v_codigoStatusPagamento;
        v_mensagemStatusCancelamento := v_mensagemStatusPagamento;
        v_codigoStatusPagamento := ' ';
        v_mensagemStatusPagamento := ' ';
      ELSIF v_codigoStatusPagamento = 'CON' THEN
        v_situacaoLinkPagamentoNova := 'S';
      ELSIF v_codigoStatusPagamento IN ('NOV', 'PPV', 'PEN', 'AGU', 'RET') THEN
        v_situacaoLinkPagamentoNova := 'A';
      ELSE
        v_situacaoLinkPagamentoNova := 'F';
      END IF;
      IF v_situacaoLinkPagamentoAtual <> 'A'
        AND v_situacaoLinkPagamentoNova <> 'A'
      THEN
        r_situacaoWebService := 'F';
        r_observacoes        := 'Situação Link Pagamento atual (' || v_situacaoLinkPagamentoAtual || ') não pode ser alterada.';
      ELSIF v_situacaoLinkPagamentoNova = 'A' THEN
        UPDATE MOLINKSPAGAMENTO x
        SET x.observacoes = v_observacoesLinkPagamento
        WHERE x.idLinkPagamento = v_idLinkPagamento;
        r_situacaoWebService := 'S';
        r_observacoes        := 'Situação Link Pagamento não alterada.';
      ELSE
        sys_usuarioLogado := 99999999999999;
        SELECT COALESCE (MAX (perfilUsuario), 0)
        INTO sys_perfilUsuarioLogado
        FROM CAUSUARIOS
        WHERE usuario = sys_usuarioLogado;
        SELECT COALESCE (MAX (estabelecimento), 0)
        INTO sys_estabelecimentoAtivo
        FROM MOLINKSPAGAMENTO
        WHERE idLinkPagamento = v_idLinkPagamento;
        person_138_etapOrcEmProcesso := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_PERSON_CONTEUDO (138, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        person_139_etapOrcLiberado   := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_PERSON_CONTEUDO (139, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        person_190_modeloFrete       := COALESCE (FUNC_ADD_BUSCA_PERSON_CONTEUDO (190, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo), ' ');
        config_195_umReciboParaCadaR := CASE WHEN FUNC_ADD_BUSCA_CONFIG (195, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_209_filtrarGrupoEcon  := CASE WHEN FUNC_ADD_BUSCA_CONFIG (209, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_226_baixarFinEstabOri := CASE WHEN FUNC_ADD_BUSCA_CONFIG (226, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_349_prazoValidadePont := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (349, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        config_354_estabProximoId    := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (354, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        config_362_calcCustoPorGrade := CASE WHEN FUNC_ADD_BUSCA_CONFIG (362, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_378_calcularVolumes   := CASE WHEN FUNC_ADD_BUSCA_CONFIG (378, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_441_etapaOrcamLinkPag := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (441, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        config_442_etapaOrSerLinkPag := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (442, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        ADD_LINKPAG_SITUACAO_TROCA (
          sessaoClient,
          sys_usuarioLogado,
          sys_estabelecimentoAtivo,
          person_138_etapOrcEmProcesso,
          person_139_etapOrcLiberado,
          person_190_modeloFrete,
          config_195_umReciboParaCadaR,
          config_209_filtrarGrupoEcon,
          config_226_baixarFinEstabOri,
          config_349_prazoValidadePont,
          config_354_estabProximoId,
          config_362_calcCustoPorGrade,
          config_378_calcularVolumes,
          config_441_etapaOrcamLinkPag,
          config_442_etapaOrSerLinkPag,
          v_idLinkPagamento,
          v_situacaoLinkPagamentoNova,
          v_codigoStatusPagamento,
          v_mensagemStatusPagamento,
          v_conteudoCancelamentoEnvio,
          v_conteudoCancelamentoRetorno,
          v_codigoStatusCancelamento,
          v_mensagemStatusCancelamento,
          v_observacoesLinkPagamento); -- p_observacoes
        r_situacaoWebService := 'S';
        r_observacoes        := ' ';
      END IF;
    ELSE
      r_situacaoWebService := 'F';
      r_observacoes        := 'Link Pagamento não localizado NIT "' || v_nit || '".';
    END IF;
  ELSE
    r_situacaoWebService := 'F';
    r_observacoes        := 'Campo "NIT" não localizado.';
  END IF;
END ADD_WS_SITEF_LINK_PAGAMENTO;

/

create or replace PROCEDURE ADD_WS_SITEF_LINK_CANCELAMENTO (
  p_conteudo           IN CLOB,
  r_situacaoWebService OUT CHAR,
  r_observacoes        OUT VARCHAR)
IS
  v_idLinkPagamento             NUMBER;
  v_situacaoLinkPagamentoAtual  CHAR (1);
  v_transacaoLinkPagamento      VARCHAR (12);
  v_nitLinkCancelamento         VARCHAR (64);
  v_observacoes                 VARCHAR (4000);
BEGIN
  r_situacaoWebService          := 'F';
  r_observacoes                 := 'Erro genérico.';
  v_situacaoLinkPagamentoAtual  := ' ';
  v_transacaoLinkPagamento      := ' ';
  v_nitLinkCancelamento         := ' ';
  v_observacoes                 := ' ';
  FOR linhas IN (
    SELECT
      REGEXP_SUBSTR (REGEXP_SUBSTR (p_conteudo, '[^,]+', 1, LEVEL), '[^":"]+', 1, 1) AS nomeCampo,
      REGEXP_SUBSTR (REGEXP_SUBSTR (p_conteudo, '[^,]+', 1, LEVEL), '[^":"]+', 1, 2) AS conteudo
    FROM DUAL
    CONNECT BY LEVEL <= REGEXP_COUNT (p_conteudo, ',') + 1)
  LOOP
    IF linhas.nomeCampo = 'nsu' THEN
      v_transacaoLinkPagamento := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'nit' THEN
      v_nitLinkCancelamento := linhas.conteudo;
    END IF;
  END LOOP;
  IF v_transacaoLinkPagamento = ' ' THEN
    r_situacaoWebService := 'F';
    r_observacoes        := 'Campo "orderId" não localizado.';
  ELSIF v_nitLinkCancelamento = ' ' THEN
    r_situacaoWebService := 'F';
    r_observacoes        := 'Campo "NIT" não localizado.';
  ELSE
    SELECT
      COALESCE (MAX (idLinkPagamento), 0),
      COALESCE (MAX (situacaoLinkPagamento), ' ')
    INTO
      v_idLinkPagamento,
      v_situacaoLinkPagamentoAtual
    FROM MOLINKSPAGAMENTO
    WHERE transacaoLinkPagamento = v_transacaoLinkPagamento;
    IF v_idLinkPagamento <= 0 THEN
      r_situacaoWebService := 'F';
      r_observacoes        := 'Link Pagamento não localizado Transacao Link Cancelamento (nsu) "' || v_transacaoLinkPagamento || '".';
    ELSIF v_situacaoLinkPagamentoAtual <> 'S' THEN
      r_situacaoWebService := 'F';
      r_observacoes        := 'Situação Link Pagamento atual (' || v_situacaoLinkPagamentoAtual || ') não pode ser alterada.';
    ELSE
      v_observacoes := COALESCE (RTRIM (SUBSTR (CAST (p_conteudo AS VARCHAR), 1, 4000)), ' ');
      UPDATE MOLINKSPAGAMENTO x SET
        x.situacaoLinkPagamento = 'E',
        x.nitLinkCancelamento = v_nitLinkCancelamento,
        x.observacoes = v_observacoes
      WHERE x.idLinkPagamento = v_idLinkPagamento;
      r_situacaoWebService := 'S';
      r_observacoes        := ' ';
    END IF;
  END IF;
END ADD_WS_SITEF_LINK_CANCELAMENTO;

/

create or replace PROCEDURE ADD_WEB_SERVICE_REQUIS_PROCESS (
  p_idWebServiceRequisicao IN NUMBER)
IS
  v_situacaoWebService CHAR (1);
  v_observacoes        VARCHAR (4000);
BEGIN
  FOR a IN (
    SELECT
      servicoWebService,
      conteudo
    FROM MOWEBSERVICEREQUISICOES
    WHERE idWebServiceRequisicao = p_idWebServiceRequisicao
    AND situacaoWebService in ('P','F'))
  LOOP
    -- PROCESSA REQUISIÇÃO
    v_situacaoWebService := 'F';
    v_observacoes := 'Serviço não localizado.';
    IF a.servicoWebService = 'SiTefLinkPagamento' THEN
      ADD_WS_SITEF_LINK_PAGAMENTO (
        a.conteudo,
        v_situacaoWebService,
        v_observacoes);
    ELSIF a.servicoWebService = 'SiTefLinkCancelamento' THEN
      ADD_WS_SITEF_LINK_CANCELAMENTO (
        a.conteudo,
        v_situacaoWebService,
        v_observacoes);
    END IF;
    UPDATE MOWEBSERVICEREQUISICOES SET
      situacaoWebService = v_situacaoWebService,
      observacoes = v_observacoes
    WHERE idWebServiceRequisicao = p_idWebServiceRequisicao;
  END LOOP;
END ADD_WEB_SERVICE_REQUIS_PROCESS;

/

create or replace PROCEDURE ADD_WEB_SERVICE (
  p_servicoWebService IN VARCHAR,
  p_conteudo          IN CLOB)
IS
  sys_estabelecimentoAtivo  NUMBER;
  config_354_estabProximoId NUMBER;
  v_idWebServiceRequisicao  NUMBER;
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  -- CRIA REQUISIÇÃO
  sys_estabelecimentoAtivo  := 0;
  config_354_estabProximoId := 0;
  ADD_WEB_SERVICE_REQUIS_GRAVA (
    sys_estabelecimentoAtivo,
    config_354_estabProximoId,
    0, -- p_idWebServiceRequisicao
    SYSDATE, -- p_dataCriacao
    p_servicoWebService,
    'P', -- p_situacaoWebService,
    NULL, -- p_dataProcessamento
    ' ', -- p_observacoes
    p_conteudo,
  v_idWebServiceRequisicao);
  COMMIT;
  -- PROCESSA REQUISIÇÃO
  ADD_WEB_SERVICE_REQUIS_PROCESS (
    v_idWebServiceRequisicao);
  COMMIT;
END ADD_WEB_SERVICE;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_idAtividadePrevOrcam IN NUMBER,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantSaldoFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER,
  r_real_idAtividadeRealPerda    OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_aux_idAtividadeRealOrcament NUMBER;
  v_aux_sequencia               NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
  v_auxNumber                   NUMBER;
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  r_real_idAtividadeRealPerda    := 0;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF p_previsto_realizado = 'R'
    OR p_real_idAtividadeRealOrcament > 0
    OR p_prev_statusAtividadeServico IN ('C','E','I')
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0
      OR p_encProd_idAtividadePrevOrcam > 0
      AND p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
      AND p_encProd_quantidadeFabricada = 0
      AND p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
            OR p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
            OR p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
          THEN 0
          ELSE 1
        END;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico IN ('C','E')
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico NOT IN ('C','E'))
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_idAtividadePrevOrcam > 0
        AND p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
        AND p_encProd_quantidadePerdida > 0
      THEN
        FOR a IN (
          SELECT
            a.idAtividadePrevOrcamento,
            a.atividadeServico,
            a.dataInicio,
            a.dataTermino,
            COALESCE (realPend.idAtividadeRealOrcamento, 0) idAtividadeRealOrcamento,
            COALESCE (realPend.sequencia, COALESCE (real.sequencia, 0) + 1) sequencia
          FROM MOORCAMENTOXATIVIDADEPREV a
          LEFT JOIN MOORCAMENTOXATIVIDADEREAL realPend
          ON realPend.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
          AND realPend.statusAtividadeServico IN ('A','I','P')
          LEFT JOIN MOORCAMENTOXATIVIDADEREAL real
          ON real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
          WHERE a.idItemOrcamento = p_prev_idItemOrcamento
          AND a.sequencia BETWEEN p_prev_sequencia + 1 AND COALESCE ((
            SELECT MAX (prev.sequencia)
            FROM MOORCAMENTOXATIVIDADEPREV prev
            WHERE prev.idAtividadePrevOrcamento = p_encProd_idAtividadePrevOrcam), 0)
          AND (realPend.idAtividadeRealOrcamento IS NULL
            OR realPend.sequencia = COALESCE ((
              SELECT MAX (realPend2.sequencia)
              FROM MOORCAMENTOXATIVIDADEREAL realPend2
              WHERE realPend2.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
              AND realPend2.statusAtividadeServico IN ('A','I','P')), 0))
          AND (real.idAtividadeRealOrcamento IS NULL
            OR real.sequencia = COALESCE ((
              SELECT MAX (real2.sequencia)
              FROM MOORCAMENTOXATIVIDADEREAL real2
              WHERE real2.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento), 0)))
        LOOP
          ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            v_cab_estabelecimento,
            v_cab_dataEmissao,
            v_cab_dataEntrega,
            v_item_modeloDocumento,
            a.idAtividadePrevOrcamento,
            a.dataInicio,
            a.dataTermino,
            r_real_idAtividadeRealOrcament,
            p_real_dataTermino,
            v_real_modeloDocumento,
            v_real_motivoEstoque,
            v_real_proporcao,
            v_real_quantidadeEntrada,
            v_real_zerarSaldo,
            v_bufferIdReservaEstoque,
            v_bufferIdEstoque,
            v_bufferIdReservaEstoque,
            v_bufferIdEstoque);
          IF p_encProd_quantidadePerdida >= p_encProd_quantSaldoFabricar THEN
            v_aux_idAtividadeRealOrcament := a.idAtividadeRealOrcamento;
            v_aux_sequencia := a.sequencia;
            ADD_ORCAMENTO_ITEM_REAL_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              v_aux_idAtividadeRealOrcament,
              a.idAtividadePrevOrcamento,
              v_aux_sequencia,
              a.atividadeServico,
              p_real_descricao,
              p_real_tecnico,
              'C', -- p_real_statusAtividadeServico
              p_real_dataInicio,
              p_real_dataTermino,
              v_real_modeloDocumento,
              v_real_motivoEstoque,
              p_real_quantidade,
              p_real_observacoes,
              v_aux_idAtividadeRealOrcament);
            ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
              a.idAtividadePrevOrcamento);
            v_atualizarStatusPrevisto := 1;
          END IF;
        END LOOP;
      END IF;
      IF p_encProd_quantidadeFabricada > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          r_real_idAtividadeRealPerda,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealPerda);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealPerda,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        v_atualizarStatusPrevisto := 1;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        NULL, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        0, -- p_real_modeloDocumento,
        0, -- p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        v_auxNumber);
      v_atualizarStatusPrevisto := 1;
    ELSIF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico = 'C'
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico <> 'C')
      AND p_encProd_quantidadeFabricar > 0
      AND p_encProd_idAtividadePrevOrcam > 0
      AND p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
      AND p_encProd_quantidadePerdida > 0
      AND p_encProd_quantidadePerdida < p_encProd_quantSaldoFabricar
    THEN
      r_real_idAtividadeRealPerda := r_real_idAtividadeRealOrcament;
      r_real_idAtividadeRealOrcament := 0;
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao := 1;
      v_real_quantidadeEntrada := p_encProd_quantSaldoFabricar - p_encProd_quantidadePerdida;
      v_real_zerarSaldo := 1;
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        r_real_idAtividadeRealOrcament,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        p_real_descricao,
        p_real_tecnico,
        p_real_statusAtividadeServico,
        p_real_dataInicio,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        p_real_quantidade,
        p_real_observacoes,
        r_real_idAtividadeRealOrcament);
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
    END IF;
  END IF;
  IF p_servico_producao = 'P'
    AND (p_previsto_realizado = 'P'
      AND i_real_statusAtividadeServico IN ('C','E')
      AND p_real_statusAtividadeServico NOT IN ('C','E')
      OR p_previsto_realizado = 'R'
      AND i_prev_statusAtividadeServico IN ('C','E')
      AND p_prev_statusAtividadeServico NOT IN ('C','E'))
  THEN
    FOR ativPrev IN (
    SELECT ativPrev.idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV ativPrev
    WHERE ativPrev.idItemOrcamento = p_prev_idItemOrcamento
    AND ativPrev.statusAtividadeServico = 'P'
    AND ativPrev.sequencia > p_prev_sequencia    
    AND ativPrev.idAtividadePrevOrcamento <> r_prev_idAtividadePrevOrcament)
    LOOP
      FOR ativReal IN (
        SELECT ativReal.idAtividadeRealOrcamento
        FROM MOORCAMENTOXATIVIDADEREAL ativReal
        WHERE ativReal.idAtividadePrevOrcamento = ativPrev.idAtividadePrevOrcamento
        AND ativReal.idAtividadeRealOrcamento > 0)
      LOOP
        ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
          ativReal.idAtividadeRealOrcamento,
          v_bufferIdEstoque,
          v_bufferIdEstoque);
      END LOOP;
      UPDATE MOORCAMENTOXATIVIDADEPREV ativPrev2
      SET ativPrev2.statusAtividadeServico = 'A'
      WHERE ativPrev2.idAtividadePrevOrcamento = ativPrev.idAtividadePrevOrcamento;
    END LOOP;
  END IF;
   IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    FOR a IN (
      SELECT idAtividadeRealOrcamento
      FROM MOORCAMENTOXATIVIDADEREAL
      WHERE idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament
      AND idAtividadeRealOrcamento > 0)
    LOOP
      ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
        a.idAtividadeRealOrcamento,
        v_bufferIdEstoque,
        v_bufferIdEstoque);
    END LOOP;
    FOR a IN (
      SELECT
        a.idFichaProdutoPrevOrcamento,
        a.entradaSaida,
        a.quantidade,
        ativPrev.idItemOrcamento
      FROM MOORCAMENTOXFICHAPRODPREV a
      JOIN MOORCAMENTOXATIVIDADEPREV ativPrev
      ON ativPrev.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
      WHERE a.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament
      AND a.idFichaProdutoPrevOrcamento > 0)
    LOOP
      FOR b IN (
        SELECT b.idFichaProdutoRealOrcamento
        FROM MOORCAMENTOXFICHAPRODREAL b
        WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento
        AND b.idFichaProdutoRealOrcamento > 0)
      LOOP
        ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
          b.idFichaProdutoRealOrcamento,
          v_bufferIdEstoque,
          v_bufferIdEstoque);
      END LOOP;
      UPDATE MOORCAMENTOXFICHAPRODPREV b
      SET b.quantidadeSaldo = a.quantidade
      WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento;
      IF a.entradaSaida = 'E' THEN
        UPDATE MOORCAMENTOXITENS b
        SET b.quantidadeSaldo = COALESCE ((
          SELECT SUM (fichPrev.quantidadeSaldo)
          FROM MOORCAMENTOXATIVIDADEPREV ativPrev
          JOIN MOORCAMENTOXFICHAPRODPREV fichPrev
          ON fichPrev.idAtividadePrevOrcamento = ativPrev.idAtividadePrevOrcamento
          WHERE ativPrev.idItemOrcamento = b.idItemOrcamento
          AND fichPrev.entradaSaida = 'E'), 0)
        WHERE b.idItemOrcamento = a.idItemOrcamento;  
      END IF;
      ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
        a.idFichaProdutoPrevOrcamento,
        v_bufferIdReservaEstoque,
        v_bufferIdReservaEstoque);
    END LOOP;
    ADD_RESERVA_ESTOQUE_ORC_FICHA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      v_bufferIdReservaEstoque,
      v_bufferIdReservaEstoque);
  END IF;
  IF p_servico_producao = 'S'
    AND (i_prev_faturarAtividade <> p_prev_faturarAtividade
      OR i_prev_precoUnitario <> p_prev_precoUnitario
      OR i_prev_statusAtividadeServico = 'C'
      AND p_prev_statusAtividadeServico <> 'C'
      OR i_prev_statusAtividadeServico <> 'C'
      AND p_prev_statusAtividadeServico = 'C'
      OR p_prev_faturarAtividade = 'R'
      AND (p_previsto_realizado = 'R'
        AND (i_real_statusAtividadeServico = 'C'
          AND p_real_statusAtividadeServico <> 'C'
          OR i_real_statusAtividadeServico <> 'C'
          AND p_real_statusAtividadeServico = 'C')
        OR i_real_quantidade <> p_real_quantidade)
      OR p_prev_faturarAtividade <> 'R'
      AND i_prev_quantidade <> p_prev_quantidade)
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/


INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (445, 'Considerar campo "Estabelecimento Faturamento" do cadastro de produto', 1, 30001, 'L', '1', 'E', 0, 'S', ' ', ' ');

COMMIT;

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_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 ROUND (((d.valorBruto - v_auxNumber) / d.cotacao), 6) 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_PRE_DOC_PAG_ORCAMENTO_EFET (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_149_manterVencimentos 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_contadorSessaoTEMPPAGAMENTOS IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_preDocumento                 IN NUMBER)
IS
  v_calcularImpostos             NUMBER;
  v_valorEntradaMinima           NUMBER;
  v_residuoEntradaMinima         NUMBER;
  v_valorPagamentoBruto          NUMBER;
  v_residuoPagamentoBruto        NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_residuoOutrasDespesasPagamen NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_valorPagamentoLiquido        NUMBER;
  v_residuoPagamentoLiquido      NUMBER;
  v_valorFinanceiro              NUMBER;
  v_residuoFinanceiro            NUMBER;
  v_sequencia                    NUMBER;
  v_idPagamentoPreDocumento      NUMBER;
  v_idMotivoBloqueioDocumento    NUMBER;
  v_idFinanceiro                 NUMBER;
  v_parcela                      NUMBER;
  v_vencimentoAjustado           DATE;
  v_auxNumber                    NUMBER;
BEGIN
  v_calcularImpostos             := 0;
  v_valorEntradaMinima           := 0;
  v_residuoEntradaMinima         := 0;
  v_valorPagamentoBruto          := 0;
  v_residuoPagamentoBruto        := 0;
  v_valorDescontoPagamento       := 0;
  v_residuoDescontoPagamento     := 0;
  v_valorOutrasDespesasPagamento := 0;
  v_residuoOutrasDespesasPagamen := 0;
  v_valorJurosPagamento          := 0;
  v_residuoJurosPagamento        := 0;
  v_valorPagamentoLiquido        := 0;
  v_residuoPagamentoLiquido      := 0;
  v_valorFinanceiro              := 0;
  v_residuoFinanceiro            := 0;
  FOR a IN (
    SELECT
      cab.tipoDocumento,
      cab.sessaoCaixa,
      cab.fatoContabil,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.contratoCompra,
      cab.valorDescontoProdutos,
      cab.valorDescontoServicos,
      cab.valorDescontoGeral,
      cab.valorBasePagamento,
      COALESCE ((
        SELECT MAX (docFisc.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 = cab.preDocumento
        AND docFisc.origemDocumento = 13), 0) docFisc_documentoFiscal
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = p_preDocumento
    AND cab.valorBasePagamento > 0)
  LOOP
    FOR b IN (
      SELECT
        b.orcamento,
        b.pessoa,
        b.valorBasePagamento,
        b.valorBasePagamentoEfetivar
      FROM (
        SELECT
          orc.orcamento,
          orc.pessoa,
          orc.valorBasePagamento,
          SUM (
            CASE
              WHEN itemDoc.valorBasePagamento * docXOrc.quantidade / itemDoc.quantidade
                < itemOrc.valorBasePagamento * docXOrc.quantidade / itemOrc.quantidade
              THEN itemDoc.valorBasePagamento * docXOrc.quantidade / itemDoc.quantidade
              ELSE itemOrc.valorBasePagamento * docXOrc.quantidade / itemOrc.quantidade
            END) valorBasePagamentoEfetivar
        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 itemDoc.valorBasePagamento > 0
        AND itemDoc.quantidade > 0
        AND itemOrc.valorBasePagamento > 0
        AND itemOrc.quantidade > 0
        AND docXOrc.quantidade > 0
        AND orc.valorBasePagamento > 0
        GROUP BY
          orc.orcamento,
          orc.pessoa,
          orc.valorBasePagamento) b
      WHERE b.valorBasePagamentoEfetivar > 0)
    LOOP
      FOR c IN (
        SELECT
          c.idPagamentoOrcamento,
          c.pagamentoTroco,
          c.sequencia,
          c.indicadorFormaPagamento,
          c.meioPagamento,
          c.condicaoPagamento,
          c.cobranca,
          c.valorEntradaMinima,
          c.valorPagamentoBruto,
          c.valorDescontoPagamento,
          c.valorOutrasDespesasPagamento,
          c.valorJurosPagamento,
          c.valorPagamentoLiquido,
          c.valorFinanceiro,
          cond.diasToleranciaJurosMulta,
          cond.tipoVencimento,
          COALESCE (tempPag.cartaoCredenciadoraCartao, 0) cartaoCredenciadoraCartao,
          COALESCE (tempPag.cartaoBandeiraCartaoDebCred, 0) cartaoBandeiraCartaoDebCred,
          COALESCE (tempPag.cartaoTransacaoCartaoNSU, ' ') cartaoTransacaoCartaoNSU,
          COALESCE (tempPag.cartaoAutorizacaoCartao, ' ') cartaoAutorizacaoCartao,
          COALESCE (tempPag.cartaoTarifaCartao, 0) cartaoTarifaCartao,
          COALESCE (tempPag.cartaoProprio, ' ') cartaoProprio,
          COALESCE (tempPag.idFinanceiroAdiantamento, c.idFinanceiroAdiantamento) idFinanceiroAdiantamento,
          COALESCE ((
            SELECT COUNT (1)
            FROM MOPREVISOESFINANCEIRAS prevFin
            WHERE prevFin.idPagamentoOrcamento = c.idPagamentoOrcamento
            AND prevFin.saldo > 0
            AND prevFin.efetivado = 0), 0) numeroParcelas
        FROM MOORCAMENTOXPAGAMENTOS c
        JOIN PACONDICOESPAGAMENTO cond
        ON cond.condicaoPagamento = c.condicaoPagamento
        LEFT JOIN TEMPPAGAMENTOS tempPag
        ON tempPag.sessaoClient = p_sessaoClient
        AND tempPag.contadorSessao = p_contadorSessaoTEMPPAGAMENTOS
        AND tempPag.origem = 'O'
        AND tempPag.idCabecalho = c.orcamento
        AND tempPag.pagamentoTroco = c.pagamentoTroco
        AND tempPag.sequencia = c.sequencia
        WHERE c.orcamento = b.orcamento
        AND (c.saldoEfetivar > 0
          OR c.valorFinanceiro = 0)
        ORDER BY
          c.pagamentoTroco,
          c.sequencia)
      LOOP
        IF c.valorDescontoPagamento <> 0
          OR c.valorOutrasDespesasPagamento <> 0
          OR c.valorJurosPagamento <> 0
        THEN
          v_calcularImpostos := 1;
        END IF;
        v_valorEntradaMinima           := ROUND (c.valorEntradaMinima * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoEntradaMinima * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoEntradaMinima         := (c.valorEntradaMinima * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoEntradaMinima * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorEntradaMinima * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoEntradaMinima * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2));
        v_valorPagamentoBruto          := ROUND (c.valorPagamentoBruto * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoBruto * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoPagamentoBruto        := (c.valorPagamentoBruto * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoBruto * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorPagamentoBruto * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoBruto * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        v_valorDescontoPagamento       := ROUND (c.valorDescontoPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoDescontoPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoDescontoPagamento     := (c.valorDescontoPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoDescontoPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorDescontoPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoDescontoPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        v_valorOutrasDespesasPagamento := ROUND (c.valorOutrasDespesasPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoOutrasDespesasPagamen * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoOutrasDespesasPagamen := (c.valorOutrasDespesasPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoOutrasDespesasPagamen * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorOutrasDespesasPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoOutrasDespesasPagamen * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        v_valorJurosPagamento          := ROUND (c.valorJurosPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoJurosPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoJurosPagamento        := (c.valorJurosPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoJurosPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorJurosPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoJurosPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        v_valorPagamentoLiquido        := ROUND (c.valorPagamentoLiquido * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoLiquido * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoPagamentoLiquido      := (c.valorPagamentoLiquido * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoLiquido * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorPagamentoLiquido * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoLiquido * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        SELECT COALESCE (MAX (1), 0)
        INTO v_auxNumber
        FROM MOLINKPAGAMENTOXORCAMENTO d
        WHERE d.idPagamentoOrcamento = c.idPagamentoOrcamento;
        IF c.idFinanceiroAdiantamento = 0
          AND v_auxNumber = 0
        THEN
          SELECT COALESCE (MIN (d.idPagamentoPreDocumento), 0)
          INTO v_idPagamentoPreDocumento
          FROM (
            SELECT
              d.idPagamentoPreDocumento,
              ROW_NUMBER() OVER (ORDER BY d.sequencia) ordenacao
            FROM MOPREDOCUMXPAGAMENTOS d
            WHERE d.preDocumento = p_predocumento
            AND d.pagamentoTroco = c.pagamentoTroco
            AND d.indicadorFormaPagamento = c.indicadorFormaPagamento
            AND d.meioPagamento = c.meioPagamento
            AND d.condicaoPagamento = c.condicaoPagamento
            AND d.cobranca = c.cobranca
            AND NOT EXISTS (
              SELECT 1
              FROM MOFINANCEIROS financ
              JOIN MOPREVFINANCXFINANCEIRO prevXFinanc
              ON prevXFinanc.idFinanceiro = financ.idFinanceiro
              JOIN MOPREVISOESFINANCEIRAS prevFinanc
              ON prevFinanc.idPrevisaoFinanceira = prevXFinanc.idPrevisaoFinanceira
              JOIN MOORCAMENTOXPAGAMENTOS pagOrc
              ON pagOrc.idPagamentoOrcamento = prevFinanc.idPagamentoOrcamento
              WHERE financ.idPagamentoPreDocumento = d.idPagamentoPreDocumento
              AND pagOrc.orcamento = b.orcamento)
            AND COALESCE ((
              SELECT COUNT (1)
              FROM MOPREVISOESFINANCEIRAS prevFin
              LEFT JOIN TEMPPARCELAS tempParc
              ON tempParc.sessaoClient = p_sessaoClient
              AND tempParc.contadorSessao = p_contadorSessaoTEMPPARCELAS
              AND tempParc.origem = 'O'
              AND tempParc.idCabecalho = b.orcamento
              AND tempParc.pagamentoTroco = c.pagamentoTroco
              AND tempParc.sequencia = c.sequencia
              AND tempParc.parcela = prevFin.parcelaAtual
              WHERE prevFin.idPagamentoOrcamento = c.idPagamentoOrcamento
              AND prevFin.saldo > 0
              AND prevFin.efetivado = 0
              AND COALESCE (tempParc.cheque, 0) = 0
              AND EXISTS (
                SELECT 1
                FROM MOFINANCEIROS financ
                WHERE financ.idPagamentoPreDocumento = d.idPagamentoPreDocumento
                AND financ.vencimento = FUNC_ADD_AJUSTA_VENC_CONDICAO (
                  c.tipoVencimento,
                  a.dataEmissao,
                  CASE
                    WHEN p_config_149_manterVencimentos = 1
                    THEN
                      CASE
                        WHEN
                          CASE
                            WHEN tempParc.parcela IS NOT NULL
                              AND prevFin.meioPagamento IN (41,42,43)
                            THEN tempParc.chequeBomPara
                            ELSE prevFin.vencimento
                          END < a.dataEmissao
                        THEN a.dataEmissao
                        ELSE
                          CASE
                            WHEN tempParc.parcela IS NOT NULL
                              AND prevFin.meioPagamento IN (41,42,43)
                            THEN tempParc.chequeBomPara
                            ELSE prevFin.vencimento
                          END
                      END
                    ELSE a.dataEmissao
                      + prevFin.prazo
                      + CASE
                          WHEN tempParc.parcela IS NOT NULL
                            AND prevFin.meioPagamento IN (41,42,43)
                          THEN tempParc.chequeBomPara - prevFin.vencimento
                          ELSE 0
                        END
                  END))), 0) = d.numeroParcelas) d
          WHERE d.ordenacao = 1;
        ELSE
          v_idPagamentoPreDocumento := 0;
        END IF;
        IF v_idPagamentoPreDocumento = 0 THEN
          SELECT COALESCE (MAX (d.sequencia), 0) + 1
          INTO v_sequencia
          FROM MOPREDOCUMXPAGAMENTOS d
          WHERE d.preDocumento = p_preDocumento
          AND d.pagamentoTroco = c.pagamentoTroco;
          ADD_PRE_DOC_PAG_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idPagamentoPreDocumento
            p_preDocumento,
            c.pagamentoTroco,
            v_sequencia,
            c.indicadorFormaPagamento,
            c.meioPagamento,
            c.condicaoPagamento,
            CASE
              WHEN c.cartaoCredenciadoraCartao = 0
              THEN c.cobranca
              ELSE c.cartaoCredenciadoraCartao
            END, -- p_cobranca
            c.numeroParcelas,
            0, -- somaPrazoParcelas,
            0, -- valorXPrazoParcelas,
            v_valorEntradaMinima,
            v_valorPagamentoBruto,
            v_valorDescontoPagamento,
            v_valorOutrasDespesasPagamento,
            v_valorJurosPagamento,
            v_valorPagamentoLiquido,
            0, --valorFinanceiro
            v_idPagamentoPreDocumento);
        ELSE
          SELECT COALESCE (MAX (d.sequencia), 0)
          INTO v_sequencia
          FROM MOPREDOCUMXPAGAMENTOS d
          WHERE d.idPagamentoPreDocumento = v_idPagamentoPreDocumento;
          UPDATE MOPREDOCUMXPAGAMENTOS d SET
            d.valorEntradaMinima = d.valorEntradaMinima + v_valorEntradaMinima,
            d.valorPagamentoBruto = d.valorPagamentoBruto + v_valorPagamentoBruto,
            d.valorDescontoPagamento = d.valorDescontoPagamento + v_valorDescontoPagamento,
            d.valorOutrasDespesasPagamento = d.valorOutrasDespesasPagamento + v_valorOutrasDespesasPagamento,
            d.valorJurosPagamento = d.valorJurosPagamento + v_valorJurosPagamento,
            d.valorPagamentoLiquido = d.valorPagamentoLiquido + v_valorPagamentoLiquido
          WHERE d.idPagamentoPreDocumento = v_idPagamentoPreDocumento;
        END IF;
        IF c.pagamentoTroco = 'P' THEN
          UPDATE MOPREDOCUMENTOS d SET
            d.valorEntradaMinima = d.valorEntradaMinima + v_valorEntradaMinima,
            d.valorPagamentoBruto = d.valorPagamentoBruto + v_valorPagamentoBruto,
            d.valorDescontoPagamento = d.valorDescontoPagamento + v_valorDescontoPagamento,
            d.valorOutrasDespesasPagamento = d.valorOutrasDespesasPagamento + v_valorOutrasDespesasPagamento,
            d.valorJurosPagamento = d.valorJurosPagamento + v_valorJurosPagamento,
            d.valorPagamentoLiquido = d.valorPagamentoLiquido + v_valorPagamentoLiquido
          WHERE d.preDocumento = p_preDocumento;
        ELSE
          UPDATE MOPREDOCUMENTOS d
          SET d.valorTroco = d.valorTroco + v_valorPagamentoBruto
          WHERE d.preDocumento = p_preDocumento;
        END IF;
        FOR d IN (
          SELECT
            d.regraPromocao,
            d.tipoBeneficio,
            d.multiplicador,
            d.percentualDesconto,
            d.valorDesconto,
            d.gerarPontuacao
          FROM MOORCAMENTOXPROMOCOES d
          WHERE d.idPagamentoOrcamento = c.idPagamentoOrcamento)
        LOOP
          SELECT COALESCE (MAX (e.id), 0)
          INTO v_auxNumber
          FROM MOPREDOCUMXPROMOCOES e
          WHERE e.preDocumento = p_predocumento
          AND e.cabecalhoItemPagamento = 'P'
          AND e.sequencia = v_sequencia
          AND e.regraPromocao = d.regraPromocao;
          IF v_auxNumber = 0 THEN
            ADD_PRE_DOC_PROMOCAO_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_id
              p_preDocumento,
              'P', -- p_cabecalhoItemPagamento
              v_sequencia,
              0, -- p_idItemPreDocumento
              v_idPagamentoPreDocumento,
              d.regraPromocao,
              d.tipoBeneficio,
              d.multiplicador,
              d.percentualDesconto,
              ROUND (d.valorDesconto * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2),
              d.gerarPontuacao,
              v_auxNumber); -- r_id
          ELSE
            UPDATE MOPREDOCUMXPROMOCOES e
            SET e.valorDesconto = ROUND (d.valorDesconto * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2)
            WHERE e.id = v_auxNumber;
          END IF;
        END LOOP;
        FOR d IN (
          SELECT
            motBloc.idMotivoBloqueioDocumento,
            motBloc.vendedor,
            motBloc.gradeProduto,
            motBloc.unidadeMedidaConversao,
            motBloc.quantidadeConvertida,
            motBloc.valorLiquido,
            motBloc.motivoBloqueioDocumento,
            motBloc.dataBloqueio,
            motBloc.baseBloqueado,
            motBloc.valorBloqueado,
            motBloc.percentualBloqueado,
            motBloc.situacaoLiberacao,
            motBloc.observacoes
          FROM MOMOTBLOQXORCAMENTOPAGAM bloqXOrc
          JOIN MOMOTIVOSBLOQUEIOS motBloc
          ON motBloc.idMotivoBloqueioDocumento = bloqXOrc.idMotivoBloqueioDocumento
          WHERE bloqXOrc.idPagamentoOrcamento = c.idPagamentoOrcamento)
        LOOP
          SELECT COALESCE (MAX (e.idMotivoBloqueioDocumento), 0)
          INTO v_idMotivoBloqueioDocumento
          FROM MOMOTBLOQXPREDOCUMPAGAM e
          JOIN MOMOTIVOSBLOQUEIOS motBloc
          ON motBloc.idMotivoBloqueioDocumento = e.idMotivoBloqueioDocumento
          WHERE e.idPagamentoPreDocumento = v_idPagamentoPreDocumento
          AND motBloc.motivoBloqueioDocumento = d.motivoBloqueioDocumento;
          IF v_idMotivoBloqueioDocumento = 0 THEN
            ADD_MOTIVO_BLOQUEIO_GRAVA (
              p_sys_estabelecimentoAtivo,
              0, -- p_idMotivoBloqueioDocumento
              'P', -- p_origem
              p_preDocumento, -- p_idCabecalho
              a.tipoDocumento,
              CASE
                WHEN a.documentoFiscal > 0
                THEN a.documentoFiscal
                ELSE p_preDocumento
              END, -- p_idDocumento
              a.estabelecimento,
              CASE
                WHEN b.pessoa = 0
                  OR p_config_227_manterPessoaOrcam = 0
                THEN a.pessoa
                ELSE b.pessoa
              END, -- p_pessoa
              'P', -- p_cabecalhoItemPagamento
              c.sequencia,
              c.condicaoPagamento,
              d.vendedor,
              0, -- p_gradeProduto,
              ' ', -- p_unidadeMedidaConversao,
              0, -- p_quantidadeConvertida,
              v_valorPagamentoLiquido, -- p_valorLiquido,
              d.motivoBloqueioDocumento,
              d.dataBloqueio,
              ROUND (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2), -- baseBloqueado,
              ROUND (
                CASE
                  WHEN d.motivoBloqueioDocumento = 1
                    AND d.situacaoLiberacao='L'
                    AND (a.valorDescontoProdutos <> 0
                      OR a.valorDescontoServicos <> 0)
                    AND (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      > (d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  THEN (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  ELSE d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento
                END, 2), -- p_valorBloqueado,
              ROUND (
                CASE
                  WHEN d.motivoBloqueioDocumento = 1
                    AND d.situacaoLiberacao='L'
                    AND (a.valorDescontoProdutos <> 0
                      OR a.valorDescontoServicos <> 0)
                    AND (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      > (d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  THEN 100 *
                    CASE
                      WHEN d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento = 0
                      THEN 0
                      ELSE (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento) / (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                    END
                  ELSE d.percentualBloqueado
                END, 7), -- p_percentualBloqueado,
              d.situacaoLiberacao,
              d.observacoes,
              0, -- p_usuarioLiberacao
              ' ', -- p_observacoesLiberacao
              0, -- p_orcamento
              0, -- p_idItemOrcamento
              0, -- p_idPagamentoOrcamento
              0, -- p_preDocumento
              0, -- p_idItemPreDocumento
              v_idPagamentoPreDocumento,
              0, -- p_idDocumentoFiscal
              0, -- p_idItemDocFiscal
              0, -- p_idPagamentoDocFiscal
              0, -- p_idFinanceiro
              0, -- p_idPrevisaoFinanceira
              0, -- p_idItemDocTransferencia
              v_idMotivoBloqueioDocumento,
              v_auxNumber); -- r_idLiberacao
          ELSE
            UPDATE MOMOTIVOSBLOQUEIOS e SET
              e.valorLiquido  = e.valorLiquido + v_valorPagamentoLiquido,
              e.baseBloqueado = e.baseBloqueado + ROUND (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2),
              e.valorBloqueado = e.valorBloqueado + ROUND (
                CASE
                  WHEN d.motivoBloqueioDocumento = 1
                    AND d.situacaoLiberacao='L'
                    AND (a.valorDescontoProdutos <> 0
                      OR a.valorDescontoServicos <> 0)
                    AND (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      > (d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  THEN (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  ELSE d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento
                END, 2),
              e.percentualBloqueado = ROUND (
                CASE
                  WHEN e.baseBloqueado + ROUND (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2) = 0
                  THEN 0
                  ELSE 100 * (e.valorBloqueado + ROUND (
                    CASE
                      WHEN d.motivoBloqueioDocumento = 1
                        AND d.situacaoLiberacao='L'
                        AND (a.valorDescontoProdutos <> 0
                          OR a.valorDescontoServicos <> 0)
                        AND (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                          > (d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      THEN (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      ELSE d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento
                    END, 2)) / (e.baseBloqueado + ROUND (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2))
                END, 7),
              e.situacaoLiberacao =
                CASE
                  WHEN d.situacaoLiberacao = 'P' OR e.situacaoLiberacao = 'P'
                  THEN 'P'
                  WHEN d.situacaoLiberacao = 'A' OR e.situacaoLiberacao = 'A'
                  THEN 'A'
                  WHEN d.situacaoLiberacao = 'N' OR e.situacaoLiberacao = 'N'
                  THEN 'N'
                  WHEN d.situacaoLiberacao = 'L' OR e.situacaoLiberacao = 'L'
                  THEN 'L'
                  ELSE d.situacaoLiberacao
                END
            WHERE e.idMotivoBloqueioDocumento = v_idMotivoBloqueioDocumento;
          END IF;
          FOR e IN (
            SELECT
              e.usuario,
              e.dataLiberacao,
              e.valorLiberado,
              e.percentualLiberado,
              e.percentualAlcada,
              e.situacaoLiberacao,
              e.observacoes
            FROM MOMOTBLOQXLIBERACOES e
            WHERE e.idMotivoBloqueioDocumento = d.idMotivoBloqueioDocumento)
          LOOP
            SELECT COALESCE (MAX (f.id), 0)
            INTO v_auxNumber
            FROM MOMOTBLOQXLIBERACOES f
            WHERE f.idMotivoBloqueioDocumento = v_idMotivoBloqueioDocumento
            AND f.usuario = e.usuario;
            IF v_auxNumber = 0 THEN
              ADD_MOTIVO_LIBERACAO_GRAVA (
                p_sys_estabelecimentoAtivo,
                0, -- p_id
                v_idMotivoBloqueioDocumento,
                e.usuario,
                e.dataLiberacao,
                e.valorLiberado,
                e.percentualLiberado,
                e.percentualAlcada,
                e.situacaoLiberacao,
                e.observacoes,
                0, -- p_gravarPeloMotivo,
                v_auxNumber); -- r_id
            ELSE
              UPDATE MOMOTBLOQXLIBERACOES f
              SET f.valorLiberado = ROUND (e.valorLiberado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2)
              WHERE f.id = v_auxNumber;
            END IF;
          END LOOP;
        END LOOP;
        FOR d IN (
          SELECT d.idLinkPagamento
          FROM MOLINKPAGAMENTOXORCAMENTO d
          WHERE d.idPagamentoOrcamento = c.idPagamentoOrcamento)
        LOOP
          ADD_LINKPAG_PRE_DOC_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_id
            d.idLinkPagamento,
            v_idPagamentoPreDocumento,
            v_auxNumber); -- r_id
        END LOOP;
        FOR d IN (
          SELECT
            prevFin.idPrevisaoFinanceira,
            prevFin.contaFinanceira,
            prevFin.pagamentoRecebimento,
            prevFin.operacaoFinanceira,
            prevFin.parcelaAtual,
            prevFin.prazoPadrao,
            prevFin.prazo,
            prevFin.vencimento,
            prevFin.pessoa,
            prevFin.autorizadoPessoa,
            prevFin.cobranca,
            prevFin.meioPagamento,
            prevFin.carteiraFinanceira,
            prevFin.valor,
            prevFin.complemento,
            prevFin.tarifaDescontoAteVencimento,
            prevFin.tipoPagamentoAntecipado,
            prevFin.tarifaMensalDescontoAntecipado,
            prevFin.tipoJuroDeMora,
            prevFin.tarifaMensalJuroDeMora,
            prevFin.tarifaMulta,
            prevFin.valorFixoMulta,
            COALESCE (condXParc.baixaAutomatica, 0) baixaAutomatica,
            CASE WHEN tempParc.parcela IS NULL THEN 0 ELSE 1 END existeTempParcelas,
            COALESCE (tempParc.chequeCompensacao, ' ') chequeCompensacao,
            COALESCE (tempParc.chequeBanco, ' ') chequeBanco,
            COALESCE (tempParc.chequeAgenciaBanco, ' ') chequeAgenciaBanco,
            COALESCE (tempParc.chequeC1, 0) chequeC1,
            COALESCE (tempParc.chequeContaBanco, ' ') chequeContaBanco,
            COALESCE (tempParc.chequeC2, 0) chequeC2,
            COALESCE (tempParc.cheque, 0) cheque,
            COALESCE (tempParc.chequeC3, 0) chequeC3,
            tempParc.chequeBomPara,
            COALESCE (tempParc.chequeIndicadorPessoa, ' ') chequeIndicadorPessoa,
            COALESCE (tempParc.chequeTitular, ' ') chequeTitular,
            COALESCE (tempParc.chequeIndicadorDocumentoPessoa, ' ') chequeIndicadorDocumentoPessoa,
            COALESCE (tempParc.chequeCnpjCpfIdEstrangeiro, ' ') chequeCnpjCpfIdEstrangeiro,
            COALESCE (tempParc.chequeFone, ' ') chequeFone,
            tempParc.chequeDesde,
            COALESCE (tempParc.chequeIndicadorFone, 0) chequeIndicadorFone,
            COALESCE (tempParc.chequeOperacaoTelefonia, 0) chequeOperacaoTelefonia,
            COALESCE (tempParc.chequeObservacaoFone, ' ') chequeObservacaoFone,
            COALESCE (tempParc.chequeAutenticacao, ' ') chequeAutenticacao,
            COALESCE (tempParc.linhaDigitavelBoleto, ' ') linhaDigitavelBoleto
          FROM MOPREVISOESFINANCEIRAS prevFin
          LEFT JOIN PACONDPAGAMXPARCELAS condXParc
          ON condXParc.condicaoPagamento = c.condicaoPagamento
          AND condXParc.parcela = prevFin.parcelaAtual
          LEFT JOIN TEMPPARCELAS tempParc
          ON tempParc.sessaoClient = p_sessaoClient
          AND tempParc.contadorSessao = p_contadorSessaoTEMPPARCELAS
          AND tempParc.origem = 'O'
          AND tempParc.idCabecalho = b.orcamento
          AND tempParc.pagamentoTroco = c.pagamentoTroco
          AND tempParc.sequencia = c.sequencia
          AND tempParc.parcela = prevFin.parcelaAtual
          WHERE prevFin.idPagamentoOrcamento = c.idPagamentoOrcamento
          AND prevFin.saldo > 0
          AND prevFin.efetivado = 0
          ORDER BY tempParc.parcela)
        LOOP
          v_valorFinanceiro := ROUND (d.valor * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoFinanceiro * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
          IF v_valorFinanceiro > 0 THEN
            v_residuoFinanceiro := (d.valor * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoFinanceiro * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (d.valor * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoFinanceiro * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
            v_vencimentoAjustado := FUNC_ADD_AJUSTA_VENC_CONDICAO (
              c.tipoVencimento,
              a.dataEmissao,
              CASE
                WHEN p_config_149_manterVencimentos = 1
                THEN
                  CASE
                    WHEN
                      CASE
                        WHEN d.existeTempParcelas = 1
                          AND d.meioPagamento IN (41,42,43)
                        THEN d.chequeBomPara
                        ELSE d.vencimento
                      END < a.dataEmissao
                    THEN a.dataEmissao
                    ELSE
                      CASE
                        WHEN d.existeTempParcelas = 1
                          AND d.meioPagamento IN (41,42,43)
                        THEN d.chequeBomPara
                        ELSE d.vencimento
                      END
                  END
                ELSE a.dataEmissao
                  + d.prazo
                  + CASE
                      WHEN d.existeTempParcelas = 1
                        AND d.meioPagamento IN (41,42,43)
                      THEN d.chequeBomPara - d.vencimento
                      ELSE 0
                    END
              END);
            SELECT COALESCE (MAX (1), 0)
            INTO v_auxNumber
            FROM MOLINKPAGAMENTOXORCAMENTO d
            WHERE d.idPagamentoOrcamento = c.idPagamentoOrcamento;
            IF c.idFinanceiroAdiantamento = 0
              AND v_auxNumber = 0
              AND d.cheque = 0
            THEN
              SELECT COALESCE (MAX (e.idFinanceiro), 0)
              INTO v_idFinanceiro
              FROM MOFINANCEIROS e
              WHERE e.idPagamentoPreDocumento = v_idPagamentoPreDocumento
              AND e.vencimento = v_vencimentoAjustado;
            ELSE
              v_idFinanceiro := 0;
            END IF;
            IF v_idFinanceiro = 0 THEN
              SELECT COALESCE (MAX (e.parcelaAtual), 0) + 1
              INTO v_parcela
              FROM MOFINANCEIROS e
              WHERE e.idPagamentoPreDocumento = v_idPagamentoPreDocumento;
              ADD_FINANC_ATUALIZA (
                p_sys_estabelecimentoAtivo,
                p_config_349_prazoValidadePont,
                p_config_354_estabProximoId,
                0, -- p_financ_idFinanceiro
                a.sessaoCaixa,
                a.fatoContabil,
                a.estabelecimento,
                CASE
                  WHEN a.dataEntradaSaida IS NULL
                  THEN a.dataEmissao
                  ELSE a.dataEntradaSaida
                END, -- p_financ_data
                a.dataEmissao,
                d.prazoPadrao,
                v_vencimentoAjustado - a.dataEmissao, -- p_financ_prazo
                v_vencimentoAjustado, -- p_financ_vencimento
                v_vencimentoAjustado, -- p_financ_vencimentoNegociado
                v_vencimentoAjustado + c.diasToleranciaJurosMulta, -- p_financ_naoCobrarJurosMultaAt
                d.contaFinanceira,
                d.pagamentoRecebimento,
                d.operacaoFinanceira,
                d.complemento,
                CASE
                  WHEN c.pagamentoTroco = 'P'
                    AND d.meioPagamento BETWEEN 53 AND 64
                  THEN a.contratoCompra
                  ELSE 0
                END, -- p_financ_contratoCompra
                v_idPagamentoPreDocumento,
                0, -- p_financ_idPagamentoDocFiscal     
                TO_CHAR (
                  CASE
                    WHEN a.docFisc_documentoFiscal > 0
                    THEN a.docFisc_documentoFiscal
                    WHEN a.documentoFiscal > 0
                    THEN a.documentoFiscal
                    ELSE p_preDocumento
                  END), -- p_financ_documento
                TO_CHAR (
                  CASE
                    WHEN a.docFisc_documentoFiscal > 0
                    THEN a.docFisc_documentoFiscal
                    WHEN a.documentoFiscal > 0
                    THEN a.documentoFiscal
                    ELSE p_preDocumento
                  END), -- p_financ_fatura
                v_parcela, -- p_financ_parcelaAtual
                c.numeroParcelas, -- p_financ_parcelasTotais
                d.pessoa,
                d.autorizadoPessoa,
                CASE
                  WHEN c.cartaoCredenciadoraCartao = 0
                  THEN d.cobranca
                  ELSE c.cartaoCredenciadoraCartao
                END, -- p_financ_cobranca,
                d.meioPagamento,
                d.carteiraFinanceira,
                v_valorFinanceiro, -- p_financ_valor
                0, -- p_financ_valorDesconto
                0, -- p_financ_valorAcrescimo
                v_valorFinanceiro
                  - CASE
                      WHEN d.meioPagamento IN (17,20,18,19,21,22,23,24,25,26,27,28,34,35,36,37,40,44,45,46)
                      THEN ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 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
                d.tarifaDescontoAteVencimento,
                d.tipoPagamentoAntecipado,
                d.tarifaMensalDescontoAntecipado,
                d.tipoJuroDeMora,
                d.tarifaMensalJuroDeMora,
                d.tarifaMulta,
                d.valorFixoMulta,
                0, -- p_financ_desconsiderarSPC
                '   ', -- b_boleto_banco
                ' ', -- b_boleto_nossoNumero
                d.linhaDigitavelBoleto,
                ' ', -- b_boleto_codigoBarrasBoleto
                ' ', -- b_boleto_contratoCobrancaBolet
                0, -- b_boleto_boletoImpresso
                0, -- b_boleto_remessaEnviada
                0, -- b_boleto_retornoProcessado
                c.cartaoCredenciadoraCartao,
                c.cartaoBandeiraCartaoDebCred,
                c.cartaoTransacaoCartaoNSU,
                c.cartaoAutorizacaoCartao,
                c.cartaoTarifaCartao,
                ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 100, 2), -- p_valorcartaoTarifaCartao
                c.cartaoProprio,
                d.chequeCompensacao,
                d.chequeBanco,
                d.chequeAgenciaBanco,
                d.chequeC1,
                d.chequeContaBanco,
                d.chequeC2,
                d.cheque,
                d.chequeC3,
                v_vencimentoAjustado,
                d.chequeIndicadorPessoa,
                d.chequeTitular,
                d.chequeIndicadorDocumentoPessoa,
                d.chequeCnpjCpfIdEstrangeiro,
                d.chequeFone,
                d.chequeDesde,
                d.chequeAutenticacao,
                1, -- p_cheque_statusCheque
                NULL, -- p_cheque_dataPrimeiroDeposito
                NULL, -- p_cheque_dataCompensacaoDevolu
                NULL, -- p_cheque_dataSegundoDeposito
                NULL, -- p_cheque_dataSegundaComponsaca
                d.chequeIndicadorFone,
                d.chequeOperacaoTelefonia,
                d.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
                d.baixaAutomatica,
                c.idFinanceiroAdiantamento,
                d.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
            ELSE
              UPDATE MOFINANCEIROS e SET
                e.valor = e.valor + v_valorFinanceiro,
                e.saldo = e.saldo + v_valorFinanceiro
                  - CASE
                      WHEN d.meioPagamento IN (17,20,18,19,21,22,23,24,25,26,27,28,34,35,36,37,40,44,45,46)
                      THEN ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 100, 2)
                      ELSE 0
                    END,
                e.efetivado = CASE WHEN e.saldo + v_valorFinanceiro
                  - CASE
                      WHEN d.meioPagamento IN (17,20,18,19,21,22,23,24,25,26,27,28,34,35,36,37,40,44,45,46)
                      THEN ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 100, 2)
                      ELSE 0
                    END <= 0 THEN 1 ELSE 0 END
              WHERE e.idFinanceiro = v_idFinanceiro;
              UPDATE MOFINANCEIROXCARTAO e
              SET e.valorTarifaCartao = e.valorTarifaCartao + ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 100, 2)
              WHERE e.idFinanceiro = v_idFinanceiro;
              FOR e IN (
                SELECT
                  e.idBaixaFinanceiro
                FROM (
                  SELECT
                    e.idBaixaFinanceiro,
                    ROW_NUMBER() OVER (ORDER BY e.data DESC) ordenacao
                  FROM MOFINANCEIROXBAIXAS e
                  WHERE e.idFinanceiro = v_idFinanceiro) e
                WHERE e.ordenacao = 1)
              LOOP
                UPDATE MOFINANCEIROXBAIXAS f SET
                  f.valorBruto = f.valorBruto + v_valorFinanceiro,
                  f.valorLiquido = f.valorLiquido + v_valorFinanceiro
                WHERE f.idBaixaFinanceiro = e.idBaixaFinanceiro;
                UPDATE MOFINANCEIROS f SET
                  f.saldo = f.saldo - v_valorFinanceiro,
                  f.efetivado = CASE WHEN f.saldo - v_valorFinanceiro <= 0 THEN 1 ELSE 0 END
                WHERE f.idFinanceiro = v_idFinanceiro;
              END LOOP;
              ADD_PREVFIN_FINANC_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_id,
                d.idPrevisaoFinanceira,
                v_idFinanceiro,
                0, -- p_preDocumento
                0, -- p_idDocumentoFiscal
                v_valorFinanceiro,
                v_auxNumber); --r_id
            END IF;
            UPDATE MOPREVISOESFINANCEIRAS e SET
              e.saldo = e.saldo - v_valorFinanceiro,
              e.efetivado = CASE WHEN e.saldo - v_valorFinanceiro <= 0 THEN 1 ELSE 0 END
            WHERE e.idPrevisaoFinanceira = d.idPrevisaoFinanceira;
            UPDATE MOORCAMENTOXPAGAMENTOS e
            SET e.saldoEfetivar = e.saldoEfetivar - v_valorFinanceiro
            WHERE e.idPagamentoOrcamento = c.idPagamentoOrcamento;
            UPDATE MOPREDOCUMXPAGAMENTOS e
            SET e.valorFinanceiro = e.valorFinanceiro + v_valorFinanceiro
            WHERE e.idPagamentoPreDocumento = v_idPagamentoPreDocumento;
          END IF;
        END LOOP;
        ADD_PRE_DOC_PAG_PRAZO_CALCULA (
          v_idPagamentoPreDocumento);
      END LOOP;
    END LOOP;
  END LOOP;
  IF v_calcularImpostos = 1 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 ADD_PRE_DOC_PAG_ORCAMENTO_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_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 ROUND (((d.valorBruto - v_auxNumber) / d.cotacao), 6) 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_DOC_FISC_PAG_ORCAMENT_EFET (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_149_manterVencimentos 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_contadorSessaoTEMPPAGAMENTOS IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER)
IS
  v_calcularImpostos             NUMBER;
  v_valorEntradaMinima           NUMBER;
  v_residuoEntradaMinima         NUMBER;
  v_valorPagamentoBruto          NUMBER;
  v_residuoPagamentoBruto        NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_residuoOutrasDespesasPagamen NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_valorPagamentoLiquido        NUMBER;
  v_residuoPagamentoLiquido      NUMBER;
  v_valorFinanceiro              NUMBER;
  v_residuoFinanceiro            NUMBER;
  v_sequencia                    NUMBER;
  v_idPagamentoDocFiscal      NUMBER;
  v_idMotivoBloqueioDocumento    NUMBER;
  v_idFinanceiro                 NUMBER;
  v_parcela                      NUMBER;
  v_vencimentoAjustado           DATE;
  v_auxNumber                    NUMBER;
BEGIN
  v_calcularImpostos             := 0;
  v_valorEntradaMinima           := 0;
  v_residuoEntradaMinima         := 0;
  v_valorPagamentoBruto          := 0;
  v_residuoPagamentoBruto        := 0;
  v_valorDescontoPagamento       := 0;
  v_residuoDescontoPagamento     := 0;
  v_valorOutrasDespesasPagamento := 0;
  v_residuoOutrasDespesasPagamen := 0;
  v_valorJurosPagamento          := 0;
  v_residuoJurosPagamento        := 0;
  v_valorPagamentoLiquido        := 0;
  v_residuoPagamentoLiquido      := 0;
  v_valorFinanceiro              := 0;
  v_residuoFinanceiro            := 0;
  FOR a IN (
    SELECT
      cab.tipoDocumento,
      cab.sessaoCaixa,
      cab.fatoContabil,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.contratoCompra,
      cab.valorDescontoProdutos,
      cab.valorDescontoServicos,
      cab.valorDescontoGeral,
      cab.valorBasePagamento
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = p_idDocumentoFiscal
    AND cab.valorBasePagamento > 0)
  LOOP
    FOR b IN (
      SELECT
        b.orcamento,
        b.pessoa,
        b.valorBasePagamento,
        b.valorBasePagamentoEfetivar
      FROM (
        SELECT
          orc.orcamento,
          orc.pessoa,
          orc.valorBasePagamento,
          SUM (
            CASE
              WHEN itemDoc.valorBasePagamento * docXOrc.quantidade / itemDoc.quantidade
                < itemOrc.valorBasePagamento * docXOrc.quantidade / itemOrc.quantidade
              THEN itemDoc.valorBasePagamento * docXOrc.quantidade / itemDoc.quantidade
              ELSE itemOrc.valorBasePagamento * docXOrc.quantidade / itemOrc.quantidade
            END) valorBasePagamentoEfetivar
        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 itemDoc.valorBasePagamento > 0
        AND itemDoc.quantidade > 0
        AND itemOrc.valorBasePagamento > 0
        AND itemOrc.quantidade > 0
        AND docXOrc.quantidade > 0
        AND orc.valorBasePagamento > 0
        GROUP BY
          orc.orcamento,
          orc.pessoa,
          orc.valorBasePagamento) b
      WHERE b.valorBasePagamentoEfetivar > 0)
    LOOP
      FOR c IN (
        SELECT
          c.idPagamentoOrcamento,
          c.pagamentoTroco,
          c.sequencia,
          c.indicadorFormaPagamento,
          c.meioPagamento,
          c.condicaoPagamento,
          c.cobranca,
          c.valorEntradaMinima,
          c.valorPagamentoBruto,
          c.valorDescontoPagamento,
          c.valorOutrasDespesasPagamento,
          c.valorJurosPagamento,
          c.valorPagamentoLiquido,
          c.valorFinanceiro,
          cond.diasToleranciaJurosMulta,
          cond.tipoVencimento,
          COALESCE (tempPag.cartaoCredenciadoraCartao, 0) cartaoCredenciadoraCartao,
          COALESCE (tempPag.cartaoBandeiraCartaoDebCred, 0) cartaoBandeiraCartaoDebCred,
          COALESCE (tempPag.cartaoTransacaoCartaoNSU, ' ') cartaoTransacaoCartaoNSU,
          COALESCE (tempPag.cartaoAutorizacaoCartao, ' ') cartaoAutorizacaoCartao,
          COALESCE (tempPag.cartaoTarifaCartao, 0) cartaoTarifaCartao,
          COALESCE (tempPag.cartaoProprio, ' ') cartaoProprio,
          COALESCE (tempPag.idFinanceiroAdiantamento, c.idFinanceiroAdiantamento) idFinanceiroAdiantamento,
          COALESCE ((
            SELECT COUNT (1)
            FROM MOPREVISOESFINANCEIRAS prevFin
            WHERE prevFin.idPagamentoOrcamento = c.idPagamentoOrcamento
            AND prevFin.saldo > 0
            AND prevFin.efetivado = 0), 0) numeroParcelas
        FROM MOORCAMENTOXPAGAMENTOS c
        JOIN PACONDICOESPAGAMENTO cond
        ON cond.condicaoPagamento = c.condicaoPagamento
        LEFT JOIN TEMPPAGAMENTOS tempPag
        ON tempPag.sessaoClient = p_sessaoClient
        AND tempPag.contadorSessao = p_contadorSessaoTEMPPAGAMENTOS
        AND tempPag.origem = 'O'
        AND tempPag.idCabecalho = c.orcamento
        AND tempPag.pagamentoTroco = c.pagamentoTroco
        AND tempPag.sequencia = c.sequencia
        WHERE c.orcamento = b.orcamento
        AND (c.saldoEfetivar > 0
          OR c.valorFinanceiro = 0)
        ORDER BY
          c.pagamentoTroco,
          c.sequencia)
      LOOP
        IF c.valorDescontoPagamento <> 0
          OR c.valorOutrasDespesasPagamento <> 0
          OR c.valorJurosPagamento <> 0
        THEN
          v_calcularImpostos := 1;
        END IF;
        v_valorEntradaMinima           := ROUND (c.valorEntradaMinima * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoEntradaMinima * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoEntradaMinima         := (c.valorEntradaMinima * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoEntradaMinima * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorEntradaMinima * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoEntradaMinima * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2));
        v_valorPagamentoBruto          := ROUND (c.valorPagamentoBruto * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoBruto * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoPagamentoBruto        := (c.valorPagamentoBruto * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoBruto * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorPagamentoBruto * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoBruto * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        v_valorDescontoPagamento       := ROUND (c.valorDescontoPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoDescontoPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoDescontoPagamento     := (c.valorDescontoPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoDescontoPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorDescontoPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoDescontoPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        v_valorOutrasDespesasPagamento := ROUND (c.valorOutrasDespesasPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoOutrasDespesasPagamen * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoOutrasDespesasPagamen := (c.valorOutrasDespesasPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoOutrasDespesasPagamen * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorOutrasDespesasPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoOutrasDespesasPagamen * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        v_valorJurosPagamento          := ROUND (c.valorJurosPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoJurosPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoJurosPagamento        := (c.valorJurosPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoJurosPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorJurosPagamento * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoJurosPagamento * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        v_valorPagamentoLiquido        := ROUND (c.valorPagamentoLiquido * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoLiquido * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
        v_residuoPagamentoLiquido      := (c.valorPagamentoLiquido * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoLiquido * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (c.valorPagamentoLiquido * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoPagamentoLiquido * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
        SELECT COALESCE (MAX (1), 0)
        INTO v_auxNumber
        FROM MOLINKPAGAMENTOXORCAMENTO d
        WHERE d.idPagamentoOrcamento = c.idPagamentoOrcamento;
        IF c.idFinanceiroAdiantamento = 0
          AND v_auxNumber = 0
        THEN
          SELECT COALESCE (MIN (d.idPagamentoDocFiscal), 0)
          INTO v_idPagamentoDocFiscal
          FROM (
            SELECT
              d.idPagamentoDocFiscal,
              ROW_NUMBER() OVER (ORDER BY d.sequencia) ordenacao
            FROM MODOCFISCALXPAGAMENTOS d
            WHERE d.idDocumentoFiscal = p_idDocumentoFiscal
            AND d.pagamentoTroco = c.pagamentoTroco
            AND d.indicadorFormaPagamento = c.indicadorFormaPagamento
            AND d.meioPagamento = c.meioPagamento
            AND d.condicaoPagamento = c.condicaoPagamento
            AND d.cobranca = c.cobranca
            AND NOT EXISTS (
              SELECT 1
              FROM MOFINANCEIROS financ
              JOIN MOPREVFINANCXFINANCEIRO prevXFinanc
              ON prevXFinanc.idFinanceiro = financ.idFinanceiro
              JOIN MOPREVISOESFINANCEIRAS prevFinanc
              ON prevFinanc.idPrevisaoFinanceira = prevXFinanc.idPrevisaoFinanceira
              JOIN MOORCAMENTOXPAGAMENTOS pagOrc
              ON pagOrc.idPagamentoOrcamento = prevFinanc.idPagamentoOrcamento
              WHERE financ.idPagamentoDocFiscal = d.idPagamentoDocFiscal
              AND pagOrc.orcamento = b.orcamento)
            AND COALESCE ((
              SELECT COUNT (1)
              FROM MOPREVISOESFINANCEIRAS prevFin
              LEFT JOIN TEMPPARCELAS tempParc
              ON tempParc.sessaoClient = p_sessaoClient
              AND tempParc.contadorSessao = p_contadorSessaoTEMPPARCELAS
              AND tempParc.origem = 'O'
              AND tempParc.idCabecalho = b.orcamento
              AND tempParc.pagamentoTroco = c.pagamentoTroco
              AND tempParc.sequencia = c.sequencia
              AND tempParc.parcela = prevFin.parcelaAtual
              WHERE prevFin.idPagamentoOrcamento = c.idPagamentoOrcamento
              AND prevFin.saldo > 0
              AND prevFin.efetivado = 0
              AND COALESCE (tempParc.cheque, 0) = 0
              AND EXISTS (
                SELECT 1
                FROM MOFINANCEIROS financ
                WHERE financ.idPagamentoDocFiscal = d.idPagamentoDocFiscal
                AND financ.vencimento = FUNC_ADD_AJUSTA_VENC_CONDICAO (
                  c.tipoVencimento,
                  a.dataEmissao,
                  CASE
                    WHEN p_config_149_manterVencimentos = 1
                    THEN
                      CASE
                        WHEN
                          CASE
                            WHEN tempParc.parcela IS NOT NULL
                              AND prevFin.meioPagamento IN (41,42,43)
                            THEN tempParc.chequeBomPara
                            ELSE prevFin.vencimento
                          END < a.dataEmissao
                        THEN a.dataEmissao
                        ELSE
                          CASE
                            WHEN tempParc.parcela IS NOT NULL
                              AND prevFin.meioPagamento IN (41,42,43)
                            THEN tempParc.chequeBomPara
                            ELSE prevFin.vencimento
                          END
                      END
                    ELSE a.dataEmissao
                      + prevFin.prazo
                      + CASE
                          WHEN tempParc.parcela IS NOT NULL
                            AND prevFin.meioPagamento IN (41,42,43)
                          THEN tempParc.chequeBomPara - prevFin.vencimento
                          ELSE 0
                        END
                  END))), 0) = d.numeroParcelas) d
          WHERE d.ordenacao = 1;
        ELSE
          v_idPagamentoDocFiscal := 0;
        END IF;
        IF v_idPagamentoDocFiscal = 0 THEN
          SELECT COALESCE (MAX (d.sequencia), 0) + 1
          INTO v_sequencia
          FROM MODOCFISCALXPAGAMENTOS d
          WHERE d.idDocumentoFiscal = p_idDocumentoFiscal
          AND d.pagamentoTroco = c.pagamentoTroco;
          ADD_DOC_FISC_PAG_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idPagamentoDocFiscal
            p_idDocumentoFiscal,
            c.pagamentoTroco,
            v_sequencia,
            c.indicadorFormaPagamento,
            c.meioPagamento,
            c.condicaoPagamento,
            CASE
              WHEN c.cartaoCredenciadoraCartao = 0
              THEN c.cobranca
              ELSE c.cartaoCredenciadoraCartao
            END, -- p_cobranca
            c.numeroParcelas,
            0, -- somaPrazoParcelas,
            0, -- valorXPrazoParcelas,
            v_valorEntradaMinima,
            v_valorPagamentoBruto,
            v_valorDescontoPagamento,
            v_valorOutrasDespesasPagamento,
            v_valorJurosPagamento,
            v_valorPagamentoLiquido,
            0, --valorFinanceiro
            v_idPagamentoDocFiscal);
        ELSE
          SELECT COALESCE (MAX (d.sequencia), 0)
          INTO v_sequencia
          FROM MODOCFISCALXPAGAMENTOS d
          WHERE d.idPagamentoDocFiscal = v_idPagamentoDocFiscal;
          UPDATE MODOCFISCALXPAGAMENTOS d SET
            d.valorEntradaMinima = d.valorEntradaMinima + v_valorEntradaMinima,
            d.valorPagamentoBruto = d.valorPagamentoBruto + v_valorPagamentoBruto,
            d.valorDescontoPagamento = d.valorDescontoPagamento + v_valorDescontoPagamento,
            d.valorOutrasDespesasPagamento = d.valorOutrasDespesasPagamento + v_valorOutrasDespesasPagamento,
            d.valorJurosPagamento = d.valorJurosPagamento + v_valorJurosPagamento,
            d.valorPagamentoLiquido = d.valorPagamentoLiquido + v_valorPagamentoLiquido
          WHERE d.idPagamentoDocFiscal = v_idPagamentoDocFiscal;
        END IF;
        IF c.pagamentoTroco = 'P' THEN
          UPDATE MODOCUMENTOSFISCAIS d SET
            d.valorEntradaMinima = d.valorEntradaMinima + v_valorEntradaMinima,
            d.valorPagamentoBruto = d.valorPagamentoBruto + v_valorPagamentoBruto,
            d.valorDescontoPagamento = d.valorDescontoPagamento + v_valorDescontoPagamento,
            d.valorOutrasDespesasPagamento = d.valorOutrasDespesasPagamento + v_valorOutrasDespesasPagamento,
            d.valorJurosPagamento = d.valorJurosPagamento + v_valorJurosPagamento,
            d.valorPagamentoLiquido = d.valorPagamentoLiquido + v_valorPagamentoLiquido
          WHERE d.idDocumentoFiscal = p_idDocumentoFiscal;
        ELSE
          UPDATE MODOCUMENTOSFISCAIS d
          SET d.valorTroco = d.valorTroco + v_valorPagamentoBruto
          WHERE d.idDocumentoFiscal = p_idDocumentoFiscal;
        END IF;
        FOR d IN (
          SELECT
            d.regraPromocao,
            d.tipoBeneficio,
            d.multiplicador,
            d.percentualDesconto,
            d.valorDesconto,
            d.gerarPontuacao
          FROM MOORCAMENTOXPROMOCOES d
          WHERE d.idPagamentoOrcamento = c.idPagamentoOrcamento)
        LOOP
          SELECT COALESCE (MAX (e.id), 0)
          INTO v_auxNumber
          FROM MODOCFISCALXPROMOCOES e
          WHERE e.idDocumentoFiscal = p_idDocumentoFiscal
          AND e.cabecalhoItemPagamento = 'P'
          AND e.sequencia = v_sequencia
          AND e.regraPromocao = d.regraPromocao;
          IF v_auxNumber = 0 THEN
            ADD_DOC_FISC_PROMOCAO_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_id
              p_idDocumentoFiscal,
              'P', -- p_cabecalhoItemPagamento
              v_sequencia,
              0, -- p_idItemDocFiscal
              v_idPagamentoDocFiscal,
              d.regraPromocao,
              d.tipoBeneficio,
              d.multiplicador,
              d.percentualDesconto,
              ROUND (d.valorDesconto * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2),
              d.gerarPontuacao,
              v_auxNumber); -- r_id
          ELSE
            UPDATE MODOCFISCALXPROMOCOES e
            SET e.valorDesconto = ROUND (d.valorDesconto * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2)
            WHERE e.id = v_auxNumber;
          END IF;
        END LOOP;
        FOR d IN (
          SELECT
            motBloc.idMotivoBloqueioDocumento,
            motBloc.vendedor,
            motBloc.gradeProduto,
            motBloc.unidadeMedidaConversao,
            motBloc.quantidadeConvertida,
            motBloc.valorLiquido,
            motBloc.motivoBloqueioDocumento,
            motBloc.dataBloqueio,
            motBloc.baseBloqueado,
            motBloc.valorBloqueado,
            motBloc.percentualBloqueado,
            motBloc.situacaoLiberacao,
            motBloc.observacoes
          FROM MOMOTBLOQXORCAMENTOPAGAM bloqXOrc
          JOIN MOMOTIVOSBLOQUEIOS motBloc
          ON motBloc.idMotivoBloqueioDocumento = bloqXOrc.idMotivoBloqueioDocumento
          WHERE bloqXOrc.idPagamentoOrcamento = c.idPagamentoOrcamento)
        LOOP
          SELECT COALESCE (MAX (e.idMotivoBloqueioDocumento), 0)
          INTO v_idMotivoBloqueioDocumento
          FROM MOMOTBLOQXDOCFISCALPAGAM e
          JOIN MOMOTIVOSBLOQUEIOS motBloc
          ON motBloc.idMotivoBloqueioDocumento = e.idMotivoBloqueioDocumento
          WHERE e.idPagamentoDocFiscal = v_idPagamentoDocFiscal
          AND motBloc.motivoBloqueioDocumento = d.motivoBloqueioDocumento;
          IF v_idMotivoBloqueioDocumento = 0 THEN
            ADD_MOTIVO_BLOQUEIO_GRAVA (
              p_sys_estabelecimentoAtivo,
              0, -- p_idMotivoBloqueioDocumento
              'D', -- p_origem
              p_idDocumentoFiscal, -- p_idCabecalho
              a.tipoDocumento,
              a.documentoFiscal, -- p_idDocumento
              a.estabelecimento,
              CASE
                WHEN b.pessoa = 0
                  OR p_config_227_manterPessoaOrcam = 0
                THEN a.pessoa
                ELSE b.pessoa
              END, -- p_pessoa
              'P', -- p_cabecalhoItemPagamento
              c.sequencia,
              c.condicaoPagamento,
              d.vendedor,
              0, -- p_gradeProduto,
              ' ', -- p_unidadeMedidaConversao,
              0, -- p_quantidadeConvertida,
              v_valorPagamentoLiquido, -- p_valorLiquido,
              d.motivoBloqueioDocumento,
              d.dataBloqueio,
              ROUND (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2), -- baseBloqueado,
              ROUND (
                CASE
                  WHEN d.motivoBloqueioDocumento = 1
                    AND d.situacaoLiberacao='L'
                    AND (a.valorDescontoProdutos <> 0
                      OR a.valorDescontoServicos <> 0)
                    AND (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      > (d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  THEN (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  ELSE d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento
                END, 2), -- p_valorBloqueado,
              ROUND (
                CASE
                  WHEN d.motivoBloqueioDocumento = 1
                    AND d.situacaoLiberacao='L'
                    AND (a.valorDescontoProdutos <> 0
                      OR a.valorDescontoServicos <> 0)
                    AND (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      > (d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  THEN 100 *
                    CASE
                      WHEN d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento = 0
                      THEN 0
                      ELSE (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento) / (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                    END
                  ELSE d.percentualBloqueado
                END, 7), -- p_percentualBloqueado,
              d.situacaoLiberacao,
              d.observacoes,
              0, -- p_usuarioLiberacao
              ' ', -- p_observacoesLiberacao
              0, -- p_orcamento
              0, -- p_idItemOrcamento
              0, -- p_idPagamentoOrcamento
              0, -- p_preDocumento
              0, -- p_idItemDocFiscal
              0, -- p_idPagamentoPreDocumento
              0, -- p_idDocumentoFiscal
              0, -- p_idItemDocFiscal
              v_idPagamentoDocFiscal,
              0, -- p_idFinanceiro
              0, -- p_idPrevisaoFinanceira
              0, -- p_idItemDocTransferencia
              v_idMotivoBloqueioDocumento,
              v_auxNumber); -- r_idLiberacao
          ELSE
            UPDATE MOMOTIVOSBLOQUEIOS e SET
              e.valorLiquido  = e.valorLiquido + v_valorPagamentoLiquido,
              e.baseBloqueado = e.baseBloqueado + ROUND (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2),
              e.valorBloqueado = e.valorBloqueado + ROUND (
                CASE
                  WHEN d.motivoBloqueioDocumento = 1
                    AND d.situacaoLiberacao='L'
                    AND (a.valorDescontoProdutos <> 0
                      OR a.valorDescontoServicos <> 0)
                    AND (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      > (d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  THEN (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                  ELSE d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento
                END, 2),
              e.percentualBloqueado = ROUND (
                CASE
                  WHEN e.baseBloqueado + ROUND (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2) = 0
                  THEN 0
                  ELSE 100 * (e.valorBloqueado + ROUND (
                    CASE
                      WHEN d.motivoBloqueioDocumento = 1
                        AND d.situacaoLiberacao='L'
                        AND (a.valorDescontoProdutos <> 0
                          OR a.valorDescontoServicos <> 0)
                        AND (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                          > (d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      THEN (v_valorDescontoPagamento + (a.valorDescontoProdutos + a.valorDescontoServicos + a.valorDescontoGeral) * b.valorBasePagamentoEfetivar / b.valorBasePagamento)
                      ELSE d.valorBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento
                    END, 2)) / (e.baseBloqueado + ROUND (d.baseBloqueado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2))
                END, 7),
              e.situacaoLiberacao =
                CASE
                  WHEN d.situacaoLiberacao = 'P' OR e.situacaoLiberacao = 'P'
                  THEN 'P'
                  WHEN d.situacaoLiberacao = 'A' OR e.situacaoLiberacao = 'A'
                  THEN 'A'
                  WHEN d.situacaoLiberacao = 'N' OR e.situacaoLiberacao = 'N'
                  THEN 'N'
                  WHEN d.situacaoLiberacao = 'L' OR e.situacaoLiberacao = 'L'
                  THEN 'L'
                  ELSE d.situacaoLiberacao
                END
            WHERE e.idMotivoBloqueioDocumento = v_idMotivoBloqueioDocumento;
          END IF;
          FOR e IN (
            SELECT
              e.usuario,
              e.dataLiberacao,
              e.valorLiberado,
              e.percentualLiberado,
              e.percentualAlcada,
              e.situacaoLiberacao,
              e.observacoes
            FROM MOMOTBLOQXLIBERACOES e
            WHERE e.idMotivoBloqueioDocumento = d.idMotivoBloqueioDocumento)
          LOOP
            SELECT COALESCE (MAX (f.id), 0)
            INTO v_auxNumber
            FROM MOMOTBLOQXLIBERACOES f
            WHERE f.idMotivoBloqueioDocumento = v_idMotivoBloqueioDocumento
            AND f.usuario = e.usuario;
            IF v_auxNumber = 0 THEN
              ADD_MOTIVO_LIBERACAO_GRAVA (
                p_sys_estabelecimentoAtivo,
                0, -- p_id
                v_idMotivoBloqueioDocumento,
                e.usuario,
                e.dataLiberacao,
                e.valorLiberado,
                e.percentualLiberado,
                e.percentualAlcada,
                e.situacaoLiberacao,
                e.observacoes,
                0, -- p_gravarPeloMotivo,
                v_auxNumber); -- r_id
            ELSE
              UPDATE MOMOTBLOQXLIBERACOES f
              SET f.valorLiberado = ROUND (e.valorLiberado * b.valorBasePagamentoEfetivar / b.valorBasePagamento, 2)
              WHERE f.id = v_auxNumber;
            END IF;
          END LOOP;
        END LOOP;
        FOR d IN (
          SELECT d.idLinkPagamento
          FROM MOLINKPAGAMENTOXORCAMENTO d
          WHERE d.idPagamentoOrcamento = c.idPagamentoOrcamento)
        LOOP
          ADD_LINKPAG_DOC_FISC_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_id
            d.idLinkPagamento,
            v_idPagamentoDocFiscal,
            v_auxNumber); -- r_id
        END LOOP;
        FOR d IN (
          SELECT
            prevFin.idPrevisaoFinanceira,
            prevFin.contaFinanceira,
            prevFin.pagamentoRecebimento,
            prevFin.operacaoFinanceira,
            prevFin.parcelaAtual,
            prevFin.prazoPadrao,
            prevFin.prazo,
            prevFin.vencimento,
            prevFin.pessoa,
            prevFin.autorizadoPessoa,
            prevFin.cobranca,
            prevFin.meioPagamento,
            prevFin.carteiraFinanceira,
            prevFin.valor,
            prevFin.complemento,
            prevFin.tarifaDescontoAteVencimento,
            prevFin.tipoPagamentoAntecipado,
            prevFin.tarifaMensalDescontoAntecipado,
            prevFin.tipoJuroDeMora,
            prevFin.tarifaMensalJuroDeMora,
            prevFin.tarifaMulta,
            prevFin.valorFixoMulta,
            COALESCE (condXParc.baixaAutomatica, 0) baixaAutomatica,
            CASE WHEN tempParc.parcela IS NULL THEN 0 ELSE 1 END existeTempParcelas,
            COALESCE (tempParc.chequeCompensacao, ' ') chequeCompensacao,
            COALESCE (tempParc.chequeBanco, ' ') chequeBanco,
            COALESCE (tempParc.chequeAgenciaBanco, ' ') chequeAgenciaBanco,
            COALESCE (tempParc.chequeC1, 0) chequeC1,
            COALESCE (tempParc.chequeContaBanco, ' ') chequeContaBanco,
            COALESCE (tempParc.chequeC2, 0) chequeC2,
            COALESCE (tempParc.cheque, 0) cheque,
            COALESCE (tempParc.chequeC3, 0) chequeC3,
            tempParc.chequeBomPara,
            COALESCE (tempParc.chequeIndicadorPessoa, ' ') chequeIndicadorPessoa,
            COALESCE (tempParc.chequeTitular, ' ') chequeTitular,
            COALESCE (tempParc.chequeIndicadorDocumentoPessoa, ' ') chequeIndicadorDocumentoPessoa,
            COALESCE (tempParc.chequeCnpjCpfIdEstrangeiro, ' ') chequeCnpjCpfIdEstrangeiro,
            COALESCE (tempParc.chequeFone, ' ') chequeFone,
            tempParc.chequeDesde,
            COALESCE (tempParc.chequeIndicadorFone, 0) chequeIndicadorFone,
            COALESCE (tempParc.chequeOperacaoTelefonia, 0) chequeOperacaoTelefonia,
            COALESCE (tempParc.chequeObservacaoFone, ' ') chequeObservacaoFone,
            COALESCE (tempParc.chequeAutenticacao, ' ') chequeAutenticacao,
            COALESCE (tempParc.linhaDigitavelBoleto, ' ') linhaDigitavelBoleto
          FROM MOPREVISOESFINANCEIRAS prevFin
          LEFT JOIN PACONDPAGAMXPARCELAS condXParc
          ON condXParc.condicaoPagamento = c.condicaoPagamento
          AND condXParc.parcela = prevFin.parcelaAtual
          LEFT JOIN TEMPPARCELAS tempParc
          ON tempParc.sessaoClient = p_sessaoClient
          AND tempParc.contadorSessao = p_contadorSessaoTEMPPARCELAS
          AND tempParc.origem = 'O'
          AND tempParc.idCabecalho = b.orcamento
          AND tempParc.pagamentoTroco = c.pagamentoTroco
          AND tempParc.sequencia = c.sequencia
          AND tempParc.parcela = prevFin.parcelaAtual
          WHERE prevFin.idPagamentoOrcamento = c.idPagamentoOrcamento
          AND prevFin.saldo > 0
          AND prevFin.efetivado = 0
          ORDER BY tempParc.parcela)
        LOOP
          v_valorFinanceiro := ROUND (d.valor * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoFinanceiro * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2);
          IF v_valorFinanceiro > 0 THEN
            v_residuoFinanceiro := (d.valor * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoFinanceiro * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END - ROUND (d.valor * b.valorBasePagamentoEfetivar / b.valorBasePagamento + v_residuoFinanceiro * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END, 2)) * CASE WHEN c.pagamentoTroco = 'P' THEN 1 ELSE -1 END;
            v_vencimentoAjustado := FUNC_ADD_AJUSTA_VENC_CONDICAO (
              c.tipoVencimento,
              a.dataEmissao,
              CASE
                WHEN p_config_149_manterVencimentos = 1
                THEN
                  CASE
                    WHEN
                      CASE
                        WHEN d.existeTempParcelas = 1
                          AND d.meioPagamento IN (41,42,43)
                        THEN d.chequeBomPara
                        ELSE d.vencimento
                      END < a.dataEmissao
                    THEN a.dataEmissao
                    ELSE
                      CASE
                        WHEN d.existeTempParcelas = 1
                          AND d.meioPagamento IN (41,42,43)
                        THEN d.chequeBomPara
                        ELSE d.vencimento
                      END
                  END
                ELSE a.dataEmissao
                  + d.prazo
                  + CASE
                      WHEN d.existeTempParcelas = 1
                        AND d.meioPagamento IN (41,42,43)
                      THEN d.chequeBomPara - d.vencimento
                      ELSE 0
                    END
              END);
            SELECT COALESCE (MAX (1), 0)
            INTO v_auxNumber
            FROM MOLINKPAGAMENTOXORCAMENTO d
            WHERE d.idPagamentoOrcamento = c.idPagamentoOrcamento;
            IF c.idFinanceiroAdiantamento = 0
              AND v_auxNumber = 0
              AND d.cheque = 0
            THEN
              SELECT COALESCE (MAX (e.idFinanceiro), 0)
              INTO v_idFinanceiro
              FROM MOFINANCEIROS e
              WHERE e.idPagamentoDocFiscal = v_idPagamentoDocFiscal
              AND e.vencimento = v_vencimentoAjustado;
            ELSE
              v_idFinanceiro := 0;
            END IF;
            IF v_idFinanceiro = 0 THEN
              SELECT COALESCE (MAX (e.parcelaAtual), 0) + 1
              INTO v_parcela
              FROM MOFINANCEIROS e
              WHERE e.idPagamentoDocFiscal = v_idPagamentoDocFiscal;
              ADD_FINANC_ATUALIZA (
                p_sys_estabelecimentoAtivo,
                p_config_349_prazoValidadePont,
                p_config_354_estabProximoId,
                0, -- p_financ_idFinanceiro
                a.sessaoCaixa,
                a.fatoContabil,
                a.estabelecimento,
                CASE
                  WHEN a.dataEntradaSaida IS NULL
                  THEN a.dataEmissao
                  ELSE a.dataEntradaSaida
                END, -- p_financ_data
                a.dataEmissao,
                d.prazoPadrao,
                v_vencimentoAjustado - a.dataEmissao, -- p_financ_prazo
                v_vencimentoAjustado, -- p_financ_vencimento
                v_vencimentoAjustado, -- p_financ_vencimentoNegociado
                v_vencimentoAjustado + c.diasToleranciaJurosMulta, -- p_financ_naoCobrarJurosMultaAt
                d.contaFinanceira,
                d.pagamentoRecebimento,
                d.operacaoFinanceira,
                d.complemento,
                CASE
                  WHEN c.pagamentoTroco = 'P'
                    AND d.meioPagamento BETWEEN 53 AND 64
                  THEN a.contratoCompra
                  ELSE 0
                END, -- p_financ_contratoCompra
                0, -- p_idPagamentoPreDocumento
                v_idPagamentoDocFiscal,
                TO_CHAR (a.documentoFiscal), -- p_financ_documento
                TO_CHAR (a.documentoFiscal), -- p_financ_fatura
                v_parcela, -- p_financ_parcelaAtual
                c.numeroParcelas, -- p_financ_parcelasTotais
                d.pessoa,
                d.autorizadoPessoa,
                CASE
                  WHEN c.cartaoCredenciadoraCartao = 0
                  THEN d.cobranca
                  ELSE c.cartaoCredenciadoraCartao
                END, -- p_financ_cobranca,
                d.meioPagamento,
                d.carteiraFinanceira,
                v_valorFinanceiro, -- p_financ_valor
                0, -- p_financ_valorDesconto
                0, -- p_financ_valorAcrescimo
                v_valorFinanceiro
                  - CASE
                      WHEN d.meioPagamento IN (17,20,18,19,21,22,23,24,25,26,27,28,34,35,36,37,40,44,45,46)
                      THEN ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 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
                d.tarifaDescontoAteVencimento,
                d.tipoPagamentoAntecipado,
                d.tarifaMensalDescontoAntecipado,
                d.tipoJuroDeMora,
                d.tarifaMensalJuroDeMora,
                d.tarifaMulta,
                d.valorFixoMulta,
                0, -- p_financ_desconsiderarSPC
                '   ', -- b_boleto_banco
                ' ', -- b_boleto_nossoNumero
                d.linhaDigitavelBoleto,
                ' ', -- b_boleto_codigoBarrasBoleto
                ' ', -- b_boleto_contratoCobrancaBolet
                0, -- b_boleto_boletoImpresso
                0, -- b_boleto_remessaEnviada
                0, -- b_boleto_retornoProcessado
                c.cartaoCredenciadoraCartao,
                c.cartaoBandeiraCartaoDebCred,
                c.cartaoTransacaoCartaoNSU,
                c.cartaoAutorizacaoCartao,
                c.cartaoTarifaCartao,
                ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 100, 2), -- p_valorcartaoTarifaCartao
                c.cartaoProprio,
                d.chequeCompensacao,
                d.chequeBanco,
                d.chequeAgenciaBanco,
                d.chequeC1,
                d.chequeContaBanco,
                d.chequeC2,
                d.cheque,
                d.chequeC3,
                v_vencimentoAjustado,
                d.chequeIndicadorPessoa,
                d.chequeTitular,
                d.chequeIndicadorDocumentoPessoa,
                d.chequeCnpjCpfIdEstrangeiro,
                d.chequeFone,
                d.chequeDesde,
                d.chequeAutenticacao,
                1, -- p_cheque_statusCheque
                NULL, -- p_cheque_dataPrimeiroDeposito
                NULL, -- p_cheque_dataCompensacaoDevolu
                NULL, -- p_cheque_dataSegundoDeposito
                NULL, -- p_cheque_dataSegundaComponsaca
                d.chequeIndicadorFone,
                d.chequeOperacaoTelefonia,
                d.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
                d.baixaAutomatica,
                c.idFinanceiroAdiantamento,
                d.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
            ELSE
              UPDATE MOFINANCEIROS e SET
                e.valor = e.valor + v_valorFinanceiro,
                e.saldo = e.saldo + v_valorFinanceiro
                  - CASE
                      WHEN d.meioPagamento IN (17,20,18,19,21,22,23,24,25,26,27,28,34,35,36,37,40,44,45,46)
                      THEN ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 100, 2)
                      ELSE 0
                    END,
                e.efetivado = CASE WHEN e.saldo + v_valorFinanceiro
                  - CASE
                      WHEN d.meioPagamento IN (17,20,18,19,21,22,23,24,25,26,27,28,34,35,36,37,40,44,45,46)
                      THEN ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 100, 2)
                      ELSE 0
                    END <= 0 THEN 1 ELSE 0 END
              WHERE e.idFinanceiro = v_idFinanceiro;
              UPDATE MOFINANCEIROXCARTAO e
              SET e.valorTarifaCartao = e.valorTarifaCartao + ROUND (v_valorFinanceiro * c.cartaoTarifaCartao / 100, 2)
              WHERE e.idFinanceiro = v_idFinanceiro;
              FOR e IN (
                SELECT
                  e.idBaixaFinanceiro
                FROM (
                  SELECT
                    e.idBaixaFinanceiro,
                    ROW_NUMBER() OVER (ORDER BY e.data DESC) ordenacao
                  FROM MOFINANCEIROXBAIXAS e
                  WHERE e.idFinanceiro = v_idFinanceiro) e
                WHERE e.ordenacao = 1)
              LOOP
                UPDATE MOFINANCEIROXBAIXAS f SET
                  f.valorBruto = f.valorBruto + v_valorFinanceiro,
                  f.valorLiquido = f.valorLiquido + v_valorFinanceiro
                WHERE f.idBaixaFinanceiro = e.idBaixaFinanceiro;
                UPDATE MOFINANCEIROS f SET
                  f.saldo = f.saldo - v_valorFinanceiro,
                  f.efetivado = CASE WHEN f.saldo - v_valorFinanceiro <= 0 THEN 1 ELSE 0 END
                WHERE f.idFinanceiro = v_idFinanceiro;
              END LOOP;
              ADD_PREVFIN_FINANC_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_id,
                d.idPrevisaoFinanceira,
                v_idFinanceiro,
                0, -- p_preDocumento
                0, -- p_idDocumentoFiscal
                v_valorFinanceiro,
                v_auxNumber); --r_id
            END IF;
            UPDATE MOPREVISOESFINANCEIRAS e SET
              e.saldo = e.saldo - v_valorFinanceiro,
              e.efetivado = CASE WHEN e.saldo - v_valorFinanceiro <= 0 THEN 1 ELSE 0 END
            WHERE e.idPrevisaoFinanceira = d.idPrevisaoFinanceira;
            UPDATE MOORCAMENTOXPAGAMENTOS e
            SET e.saldoEfetivar = e.saldoEfetivar - v_valorFinanceiro
            WHERE e.idPagamentoOrcamento = c.idPagamentoOrcamento;
            UPDATE MODOCFISCALXPAGAMENTOS e
            SET e.valorFinanceiro = e.valorFinanceiro + v_valorFinanceiro
            WHERE e.idPagamentoDocFiscal = v_idPagamentoDocFiscal;
          END IF;
        END LOOP;
        ADD_DOC_FISC_PAG_PRAZO_CALCULA (
          v_idPagamentoDocFiscal);
      END LOOP;
    END LOOP;
  END LOOP;
  IF v_calcularImpostos = 1 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 ADD_DOC_FISC_PAG_ORCAMENT_EFET;

/

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('14/07/2025', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 3' WHERE idVersaoSistema = 2025001004;

COMMIT;

-- FIM BETA 3 - 14/07/2025

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