SET DEFINE OFF;

INSERT INTO SIUNIDADESMEDIDA (unidadeMedida, descricao, ativo, casasDecimaisUnidadeMedida, casasDecimaisMinimoImpressao, permiteInformarTotalItem, observacoes) values ('NV', 'NV - Novelo', 1, 0, 0, 0, ' ');

COMMIT;

UPDATE SICFOPS SET cfopSt = 1410, cfopDevolucaoRetorno = 1201 WHERE cfop IN (5101,5105,5110,5113,5116,5118,5122,5129,5401,5402);
UPDATE SICFOPS SET cfopSt = 1411, cfopDevolucaoRetorno = 1202 WHERE cfop IN (5102,5106,5111,5112,5114,5115,5117,5119,5120,5123,5403,5405,5922);
UPDATE SICFOPS SET cfopSt = 2410, cfopDevolucaoRetorno = 2201 WHERE cfop IN (6101,6105,6107,6110,6113,6116,6118,6122,6129,6401,6402);
UPDATE SICFOPS SET cfopSt = 2411, cfopDevolucaoRetorno = 2202 WHERE cfop IN (6102,6106,6108,6111,6112,6114,6115,6117,6119,6120,6123,6403,6404,6922);

COMMIT;

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 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;

/

DROP PROCEDURE ADD_ORCAMENTO_ITEM_PREV_REABRE;

INSERT INTO SIMEIOSPAGAMENTO (meioPagamento, descricao, ativo, grupoPagamento, formaPagamentoNfe, indicadorFormaPagamento, integracaoCartaoDebCred, parcelado, validoRecebimento, validoPagamento, validoBaixa, observacoes) values (18, 'Cartão Débito Próprio T.E.F.', 1, '2', 5, '0', 1, 0, 1, 0, 0, 'Vista (Busca financeira e autorização do T.E.F.)');
INSERT INTO SIMEIOSPAGAMENTO (meioPagamento, descricao, ativo, grupoPagamento, formaPagamentoNfe, indicadorFormaPagamento, integracaoCartaoDebCred, parcelado, validoRecebimento, validoPagamento, validoBaixa, observacoes) values (19, 'Cartão Débito Próprio P.O.S.', 1, '2', 5, '0', 2, 0, 1, 0, 0, 'Vista (Solicita financeira e autorização)');
INSERT INTO SIMEIOSPAGAMENTO (meioPagamento, descricao, ativo, grupoPagamento, formaPagamentoNfe, indicadorFormaPagamento, integracaoCartaoDebCred, parcelado, validoRecebimento, validoPagamento, validoBaixa, observacoes) values (40, 'Link Pagamento', 1, '2', 99, '0', 1, 0, 1, 0, 0, 'Vista (Gera link com opções de pagamento para o usuário)');

COMMIT;

INSERT INTO SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo, descricao, ativo, categoriaProcDemonstrativo, observacoes) values (18, '(+) Venda Cartão Débito Próprio T.E.F.', 1, 1, ' ');
INSERT INTO SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo, descricao, ativo, categoriaProcDemonstrativo, observacoes) values (19, '(+) Venda Cartão Débito Próprio P.O.S.', 1, 1, ' ');
INSERT INTO SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo, descricao, ativo, categoriaProcDemonstrativo, observacoes) values (40, '(+) Venda Link Pagamento', 1, 1, ' ');

COMMIT;

UPDATE SIMEIOSPAGAMENTO SET formaPagamentoNfe = 99 WHERE meioPagamento = 38;

COMMIT;

DROP TABLE MOLINKPAGAMENTOXFINANC;

DELETE SITABELASSISTEMA WHERE tabelaSistema = 'MOLINKPAGAMENTOXFINANC';

COMMIT;

DROP TABLE MOLINKPAGAMENTOXFINANC;

DELETE SITABELASSISTEMA WHERE tabelaSistema = 'MOLINKPAGAMENTOXFINANC';

COMMIT;

CREATE TABLE MOLINKSPAGAMENTO_2501 AS SELECT * FROM MOLINKSPAGAMENTO;

ALTER TABLE MOLINKPAGAMENTOXBAIXAS DROP CONSTRAINT MOLINKPAGAMENTOXBAIXAS_FK1;
ALTER TABLE MOLINKPAGAMENTOXORCAMENTO DROP CONSTRAINT MOLINKPAGAMENTOXORCAMENTO_FK1;
ALTER TABLE MOLINKPAGAMENTOXPREDOCUM DROP CONSTRAINT MOLINKPAGAMENTOXPREDOCUM_FK1;
ALTER TABLE MOLINKPAGAMENTOXDOCFISCAL DROP CONSTRAINT MOLINKPAGAMENTOXDOCFISCAL_FK1;

DROP TABLE MOLINKSPAGAMENTO;

-- MOLINKSPAGAMENTO
CREATE TABLE MOLINKSPAGAMENTO
  (
    idLinkPagamento              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento              NUMERIC (4,0) DEFAULT 0 NOT NULL,
    data                         DATE,
    usuario                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    validade                     DATE,
    transacaoLinkPagamento       VARCHAR (12) DEFAULT ' ' NOT NULL,
    pedidoLinkPagamento          VARCHAR (40) DEFAULT ' ' NOT NULL,
    complemento                  VARCHAR (500) DEFAULT ' ' NOT NULL,
    cobranca                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    carteiraFinanceira           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    valorJurosTotal              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorMultaTotal              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoInformado       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoInformado      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    situacaoLinkPagamento        CHAR (1) DEFAULT ' ' NOT NULL,
    conteudoEnvio                NCLOB,
    conteudoRetorno              NCLOB,
    url                          VARCHAR (256) DEFAULT ' ' NOT NULL,
    nsuLinkPagamento             VARCHAR (15) DEFAULT ' ' NOT NULL,
    nitLinkPagamento             VARCHAR (64) DEFAULT ' ' NOT NULL,
    nsuaLinkPagamento            VARCHAR (15) DEFAULT ' ' NOT NULL,
    nitaLinkPagamento            VARCHAR (65) DEFAULT ' ' NOT NULL,
    nitTransacaoAssLinkPagamento VARCHAR (64) DEFAULT ' ' NOT NULL,
    idFinanceiroAdiantamento     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    observacoes                  VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_PK1 PRIMARY KEY (idLinkPagamento);
CREATE INDEX MOLINKSPAGAMENTO_K2 ON MOLINKSPAGAMENTO (estabelecimento);
CREATE INDEX MOLINKSPAGAMENTO_K3 ON MOLINKSPAGAMENTO (data);
CREATE INDEX MOLINKSPAGAMENTO_K4 ON MOLINKSPAGAMENTO (usuario);
CREATE INDEX MOLINKSPAGAMENTO_K5 ON MOLINKSPAGAMENTO (transacaoLinkPagamento);
CREATE INDEX MOLINKSPAGAMENTO_K6 ON MOLINKSPAGAMENTO (pedidoLinkPagamento);
CREATE INDEX MOLINKSPAGAMENTO_K7 ON MOLINKSPAGAMENTO (cobranca);
CREATE INDEX MOLINKSPAGAMENTO_K8 ON MOLINKSPAGAMENTO (carteiraFinanceira);
CREATE INDEX MOLINKSPAGAMENTO_K9 ON MOLINKSPAGAMENTO (situacaoLinkPagamento);
CREATE INDEX MOLINKSPAGAMENTO_K10 ON MOLINKSPAGAMENTO (idFinanceiroAdiantamento);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK2 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK3 FOREIGN KEY (cobranca) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK4 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK5 FOREIGN KEY (situacaoLinkPagamento) REFERENCES SISITUACOESLINKPAGAMENTO (situacaoLinkPagamento);
ALTER TABLE MOLINKSPAGAMENTO ADD CONSTRAINT MOLINKSPAGAMENTO_FK6 FOREIGN KEY (idFinanceiroAdiantamento) REFERENCES MOFINANCEIROS (idFinanceiro);

INSERT INTO MOLINKSPAGAMENTO (idLinkPagamento, estabelecimento, data, usuario, validade, transacaoLinkPagamento, pedidoLinkPagamento, complemento, cobranca, carteiraFinanceira, valorJurosTotal, valorMultaTotal, valorDescontoInformado, valorAcrescimoInformado, valor, situacaoLinkPagamento, conteudoEnvio, conteudoRetorno, url, nsuLinkPagamento, nitLinkPagamento, nsuaLinkPagamento, nitaLinkPagamento, nitTransacaoAssLinkPagamento, idFinanceiroAdiantamento, observacoes) VALUES (0, 0, NULL, 0, NULL, ' ', ' ', ' ',0, 0, 0, 0, 0, 0, 0, ' ', NULL, NULL, ' ', ' ', ' ', ' ', ' ', ' ', 0, ' ');
INSERT INTO MOLINKSPAGAMENTO (idLinkPagamento, estabelecimento, data, usuario, validade, transacaoLinkPagamento, pedidoLinkPagamento, complemento, cobranca, carteiraFinanceira, valorJurosTotal, valorMultaTotal, valorDescontoInformado, valorAcrescimoInformado, valor, situacaoLinkPagamento, conteudoEnvio, conteudoRetorno, url, nsuLinkPagamento, nitLinkPagamento, nsuaLinkPagamento, nitaLinkPagamento, nitTransacaoAssLinkPagamento, idFinanceiroAdiantamento, observacoes) SELECT idLinkPagamento, estabelecimento, data, usuario, validade, transacaoLinkPagamento, pedidoLinkPagamento, complemento, cobranca, 0, 0, 0, 0, 0, valor, situacaoLinkPagamento, NULL, NULL, url, nsuLinkPagamento, nitLinkPagamento, nsuaLinkPagamento, nitaLinkPagamento, nitTransacaoAssLinkPagamento, 0, observacoes FROM MOLINKSPAGAMENTO_2501 WHERE idLinkPagamento > 0;

COMMIT;

ALTER TABLE MOLINKPAGAMENTOXBAIXAS ADD CONSTRAINT MOLINKPAGAMENTOXBAIXAS_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);
ALTER TABLE MOLINKPAGAMENTOXORCAMENTO ADD CONSTRAINT MOLINKPAGAMENTOXORCAMENTO_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);
ALTER TABLE MOLINKPAGAMENTOXPREDOCUM ADD CONSTRAINT MOLINKPAGAMENTOXPREDOCUM_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);
ALTER TABLE MOLINKPAGAMENTOXDOCFISCAL ADD CONSTRAINT MOLINKPAGAMENTOXDOCFISCAL_FK1 FOREIGN KEY (idLinkPagamento) REFERENCES MOLINKSPAGAMENTO (idLinkPagamento);

DROP TABLE TEMPPAGAMENTOS;

-- TEMPPAGAMENTOS
CREATE GLOBAL TEMPORARY TABLE TEMPPAGAMENTOS
  (
    sessaoClient                VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    origem                      CHAR (1) DEFAULT ' ' NOT NULL,
    idCabecalho                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pagamentoTroco              CHAR (1) DEFAULT ' ' NOT NULL,
    sequencia                   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    pagamentoRecebimento        CHAR (1) DEFAULT ' ' NOT NULL,
    condicaoPagamento           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    cobranca                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    valorPagamentoLiquido       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    contratoCompra              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cartaoCredenciadoraCartao   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cartaoBandeiraCartaoDebCred NUMERIC (2,0) DEFAULT 0 NOT NULL,
    cartaoTransacaoCartaoNSU    VARCHAR (20) DEFAULT ' ' NOT NULL,
    cartaoAutorizacaoCartao     VARCHAR (100) DEFAULT ' ' NOT NULL,
    cartaoTarifaCartao          NUMERIC (15,8) DEFAULT 0 NOT NULL,
    cartaoProprio               VARCHAR (16) DEFAULT ' ' NOT NULL,
    idFinanceiroAdiantamento    NUMERIC (14,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPPAGAMENTOS_PK1 ON TEMPPAGAMENTOS (sessaoClient, contadorSessao, origem, idCabecalho, pagamentoTroco, sequencia);
CREATE INDEX TEMPPAGAMENTOS_K2 ON TEMPPAGAMENTOS (sessaoClient, contadorSessao, contratoCompra);

create or replace PROCEDURE ADD_FONE_GRAVA (
  p_fone               IN VARCHAR2,
  p_indicadorFone      IN NUMBER,
  p_operadoraTelefonia IN NUMBER,
  p_observacoes        IN VARCHAR2)
IS
BEGIN
  MERGE INTO CAFONES a 
  USING (
    SELECT
      p_fone               fone,
      p_indicadorFone      indicadorFone,
      p_operadoraTelefonia operadoraTelefonia,
      p_observacoes        observacoes
    FROM DUAL) b
  ON (a.fone = b.fone)
  WHEN MATCHED THEN UPDATE SET
    a.indicadorFone      = b.indicadorFone,
    a.operadoraTelefonia = b.operadoraTelefonia,
    a.observacoes        = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    fone,
    indicadorFone,
    operadoraTelefonia,
    observacoes)
  VALUES (
    b.fone,
    b.indicadorFone,
    b.operadoraTelefonia,
    b.observacoes);
END ADD_FONE_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_BAIXA_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idBaixaFinanceiro         IN NUMBER,
  p_sessaoCaixa               IN NUMBER,
  p_fatoContabil              IN NUMBER,
  p_idFinanceiro              IN NUMBER,
  p_estabelecimento           IN NUMBER,
  p_data                      IN DATE,
  p_contaFinanceira           IN VARCHAR2,
  p_pagamentoRecebimento      IN CHAR,
  p_operacaoFinanceira        IN NUMBER,
  p_cobranca                  IN NUMBER,
  p_meioPagamento             IN NUMBER,
  p_carteiraFinanceira        IN NUMBER,
  p_cotacao                   IN NUMBER,
  p_valorBrutoIndexado        IN NUMBER,
  p_valorBruto                IN NUMBER,
  p_valorVariacaoIndexador    IN NUMBER,
  p_valorJurosDeMora          IN NUMBER,
  p_valorMulta                IN NUMBER,
  p_valorTarifaCartao         IN NUMBER,
  p_valorDescontos            IN NUMBER,
  p_valorOutrosAcrescimos     IN NUMBER,
  p_valorLiquido              IN NUMBER,
  p_baixaAutomatica           IN NUMBER,
  p_unificadoReparcelado      IN NUMBER,
  p_observacoes               IN VARCHAR2,
  r_idBaixaFinanceiro         OUT NUMBER)
IS
BEGIN
  r_idBaixaFinanceiro := p_idBaixaFinanceiro;
  IF r_idBaixaFinanceiro = 0 THEN
    r_idBaixaFinanceiro := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOFINANCEIROXBAIXAS',
      'idBaixaFinanceiro',
      14);
  END IF;
  MERGE INTO MOFINANCEIROXBAIXAS a 
  USING (
    SELECT
      r_idBaixaFinanceiro      idBaixaFinanceiro,
      p_sessaoCaixa            sessaoCaixa,
      p_fatoContabil           fatoContabil,
      p_idFinanceiro           idFinanceiro,
      p_estabelecimento        estabelecimento,
      p_data                   data,
      p_contaFinanceira        contaFinanceira,
      p_pagamentoRecebimento   pagamentoRecebimento,
      p_operacaoFinanceira     operacaoFinanceira,
      p_cobranca               cobranca,
      p_meioPagamento          meioPagamento,
      p_carteiraFinanceira     carteiraFinanceira,
      p_cotacao                cotacao,
      p_valorBrutoIndexado     valorBrutoIndexado,
      p_valorBruto             valorBruto,
      p_valorVariacaoIndexador valorVariacaoIndexador,
      p_valorJurosDeMora       valorJurosDeMora,
      p_valorMulta             valorMulta,
      p_valorTarifaCartao      valorTarifaCartao,
      p_valorDescontos         valorDescontos,
      p_valorOutrosAcrescimos  valorOutrosAcrescimos,
      p_valorLiquido           valorLiquido,
      p_baixaAutomatica        baixaAutomatica,
      p_unificadoReparcelado   unificadoReparcelado,
      p_observacoes            observacoes
    FROM DUAL) b
  ON (a.idBaixaFinanceiro = b.idBaixaFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.sessaoCaixa            = b.sessaoCaixa,
    a.fatoContabil           = b.fatoContabil,
    a.idFinanceiro           = b.idFinanceiro,
    a.estabelecimento        = b.estabelecimento,
    a.data                   = b.data,
    a.contaFinanceira        = b.contaFinanceira,
    a.pagamentoRecebimento   = b.pagamentoRecebimento,
    a.operacaoFinanceira     = b.operacaoFinanceira,
    a.cobranca               = b.cobranca,
    a.meioPagamento          = b.meioPagamento,
    a.carteiraFinanceira     = b.carteiraFinanceira,
    a.cotacao                = b.cotacao,
    a.valorBrutoIndexado     = b.valorBrutoIndexado,
    a.valorBruto             = b.valorBruto,
    a.valorVariacaoIndexador = b.valorVariacaoIndexador,
    a.valorJurosDeMora       = b.valorJurosDeMora,
    a.valorMulta             = b.valorMulta,
    a.valorTarifaCartao      = b.valorTarifaCartao,
    a.valorDescontos         = b.valorDescontos,
    a.valorOutrosAcrescimos  = b.valorOutrosAcrescimos,
    a.valorLiquido           = b.valorLiquido,
    a.baixaAutomatica        = b.baixaAutomatica,
    a.unificadoReparcelado   = b.unificadoReparcelado,
    a.observacoes            = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idBaixaFinanceiro,
    sessaoCaixa,
    fatoContabil,
    idFinanceiro,
    estabelecimento,
    data,
    contaFinanceira,
    pagamentoRecebimento,
    operacaoFinanceira,
    cobranca,
    meioPagamento,
    carteiraFinanceira,
    cotacao,
    valorBrutoIndexado,
    valorBruto,
    valorVariacaoIndexador,
    valorJurosDeMora,
    valorMulta,
    valorTarifaCartao,
    valorDescontos,
    valorOutrosAcrescimos,
    valorLiquido,
    baixaAutomatica,
    unificadoReparcelado,
    observacoes)
  VALUES (
    b.idBaixaFinanceiro,
    b.sessaoCaixa,
    b.fatoContabil,
    b.idFinanceiro,
    b.estabelecimento,
    b.data,
    b.contaFinanceira,
    b.pagamentoRecebimento,
    b.operacaoFinanceira,
    b.cobranca,
    b.meioPagamento,
    b.carteiraFinanceira,
    b.cotacao,
    b.valorBrutoIndexado,
    b.valorBruto,
    b.valorVariacaoIndexador,
    b.valorJurosDeMora,
    b.valorMulta,
    b.valorTarifaCartao,
    b.valorDescontos,
    b.valorOutrosAcrescimos,
    b.valorLiquido,
    b.baixaAutomatica,
    b.unificadoReparcelado,
    b.observacoes);
END ADD_FINANC_BAIXA_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_BAIXA_NOVO_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idBaixaFinanceiro         IN NUMBER,
  p_idNovoFinanceiro          IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOBAIXAXNOVOFINANCEIRO
    WHERE idBaixaFinanceiro = p_idBaixaFinanceiro
    AND idNovoFinanceiro    = p_idNovoFinanceiro;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOBAIXAXNOVOFINANCEIRO',
      'id',
      14);
  END IF;
  MERGE INTO MOBAIXAXNOVOFINANCEIRO a 
  USING (
    SELECT
      r_id                id,
      p_idBaixaFinanceiro idBaixaFinanceiro,
      p_idNovoFinanceiro  idNovoFinanceiro
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idBaixaFinanceiro = b.idBaixaFinanceiro,
    a.idNovoFinanceiro  = b.idNovoFinanceiro
  WHEN NOT MATCHED THEN INSERT (
    id,
    idBaixaFinanceiro,
    idNovoFinanceiro)
  VALUES (
    b.id,
    b.idBaixaFinanceiro,
    b.idNovoFinanceiro);
END ADD_FINANC_BAIXA_NOVO_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_BAIXA_BAIXA_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idBaixaFinanceiro         IN NUMBER,
  p_idBaixaFinanceiroCorrel   IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOBAIXAXBAIXAFINANCEIRO
    WHERE idBaixaFinanceiro     = p_idBaixaFinanceiro
    AND idBaixaFinanceiroCorrel = p_idBaixaFinanceiroCorrel;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOBAIXAXBAIXAFINANCEIRO',
      'id',
      14);
  END IF;
  MERGE INTO MOBAIXAXBAIXAFINANCEIRO a 
  USING (
    SELECT
      r_id                      id,
      p_idBaixaFinanceiro       idBaixaFinanceiro,
      p_idBaixaFinanceiroCorrel idBaixaFinanceiroCorrel
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idBaixaFinanceiro       = b.idBaixaFinanceiro,
    a.idBaixaFinanceiroCorrel = b.idBaixaFinanceiroCorrel
  WHEN NOT MATCHED THEN INSERT (
    id,
    idBaixaFinanceiro,
    idBaixaFinanceiroCorrel)
  VALUES (
    b.id,
    b.idBaixaFinanceiro,
    b.idBaixaFinanceiroCorrel);
END ADD_FINANC_BAIXA_BAIXA_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_BAIXA_PRE_DOC_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idBaixaFinanceiro         IN NUMBER,
  p_preDocumento              IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOBAIXAFINANCXPREDOCUM
    WHERE idBaixaFinanceiro = p_idBaixaFinanceiro
    AND preDocumento        = p_preDocumento;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOBAIXAFINANCXPREDOCUM',
      'id',
      14);
  END IF;
  MERGE INTO MOBAIXAFINANCXPREDOCUM a 
  USING (
    SELECT
      r_id                id,
      p_idBaixaFinanceiro idBaixaFinanceiro,
      p_preDocumento      preDocumento
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idBaixaFinanceiro = b.idBaixaFinanceiro,
    a.preDocumento      = b.preDocumento
  WHEN NOT MATCHED THEN INSERT (
    id,
    idBaixaFinanceiro,
    preDocumento)
  VALUES (
    b.id,
    b.idBaixaFinanceiro,
    b.preDocumento);
END ADD_FINANC_BAIXA_PRE_DOC_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_BAIXA_DOC_FIS_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idBaixaFinanceiro         IN NUMBER,
  p_idDocumentoFiscal         IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOBAIXAFINANCXDOCFISCAL
    WHERE idBaixaFinanceiro = p_idBaixaFinanceiro
    AND idDocumentoFiscal   = p_idDocumentoFiscal;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOBAIXAFINANCXDOCFISCAL',
      'id',
      14);
  END IF;
  MERGE INTO MOBAIXAFINANCXDOCFISCAL a 
  USING (
    SELECT
      r_id                id,
      p_idBaixaFinanceiro idBaixaFinanceiro,
      p_idDocumentoFiscal idDocumentoFiscal
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idBaixaFinanceiro = b.idBaixaFinanceiro,
    a.idDocumentoFiscal = b.idDocumentoFiscal
  WHEN NOT MATCHED THEN INSERT (
    id,
    idBaixaFinanceiro,
    idDocumentoFiscal)
  VALUES (
    b.id,
    b.idBaixaFinanceiro,
    b.idDocumentoFiscal);
END ADD_FINANC_BAIXA_DOC_FIS_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_BAIXA_ATUALIZA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idBaixaFinanceiro            IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  p_fatoContabil                 IN NUMBER,
  p_idFinanceiro                 IN NUMBER,
  p_estabelecimento              IN NUMBER,
  p_data                         IN DATE,
  p_contaFinanceira              IN VARCHAR2,
  p_pagamentoRecebimento         IN CHAR,
  p_operacaoFinanceira           IN NUMBER,
  p_cobranca                     IN NUMBER,
  p_meioPagamento                IN NUMBER,
  p_carteiraFinanceira           IN NUMBER,
  p_cotacao                      IN NUMBER,
  p_valorBrutoIndexado           IN NUMBER,
  p_valorBruto                   IN NUMBER,
  p_valorVariacaoIndexador       IN NUMBER,
  p_valorJurosDeMora             IN NUMBER,
  p_valorMulta                   IN NUMBER,
  p_valorTarifaCartao            IN NUMBER,
  p_valorDescontos               IN NUMBER,
  p_valorOutrosAcrescimos        IN NUMBER,
  p_valorLiquido                 IN NUMBER,
  p_baixaAutomatica              IN NUMBER,
  p_unificadoReparcelado         IN NUMBER,
  p_observacoes                  IN VARCHAR2,
  p_idBaixaFinanceiroCorrel      IN VARCHAR2,
  p_idNovoFinanceiro             IN VARCHAR2,
  p_preDocumento                 IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  r_idBaixaFinanceiro            OUT NUMBER,
  r_financ_saldo                 OUT NUMBER,
  r_financ_saldoIndexado         OUT NUMBER,
  r_financ_efetivado             OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_FINANC_BAIXA_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idBaixaFinanceiro,
    p_sessaoCaixa,
    p_fatoContabil,
    p_idFinanceiro,
    p_estabelecimento,
    p_data,
    p_contaFinanceira,
    p_pagamentoRecebimento,
    p_operacaoFinanceira,
    p_cobranca,
    p_meioPagamento,
    p_carteiraFinanceira,
    p_cotacao,
    p_valorBrutoIndexado,
    p_valorBruto,
    p_valorVariacaoIndexador,
    p_valorJurosDeMora,
    p_valorMulta,
    p_valorTarifaCartao,
    p_valorDescontos,
    p_valorOutrosAcrescimos,
    p_valorLiquido,
    p_baixaAutomatica,
    p_unificadoReparcelado,
    p_observacoes,
    r_idBaixaFinanceiro);
  ADD_FINANC_SALDO_AJUSTA (
    p_config_349_prazoValidadePont,
    0, --p_excluindo
    r_idBaixaFinanceiro,
    p_idFinanceiro,
    p_data,
    p_cotacao,
    p_valorBrutoIndexado,
    p_valorBruto,
    p_valorTarifaCartao,
    r_financ_saldo,
    r_financ_saldoIndexado,
    r_financ_efetivado);
  IF p_idBaixaFinanceiroCorrel > 0 THEN
    ADD_FINANC_BAIXA_BAIXA_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      r_idBaixaFinanceiro,
      p_idBaixaFinanceiroCorrel,
      v_auxNumber);
  END IF;
  IF p_idNovoFinanceiro > 0 THEN
    ADD_FINANC_BAIXA_NOVO_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      r_idBaixaFinanceiro,
      p_idNovoFinanceiro,
      v_auxNumber);
  END IF;
  IF p_preDocumento > 0 THEN
    ADD_FINANC_BAIXA_PRE_DOC_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      r_idBaixaFinanceiro,
      p_preDocumento,
      v_auxNumber);
  END IF;
  IF p_idDocumentoFiscal > 0 THEN
    ADD_FINANC_BAIXA_DOC_FIS_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      r_idBaixaFinanceiro,
      p_idDocumentoFiscal,
      v_auxNumber);
  END IF;
END ADD_FINANC_BAIXA_ATUALIZA;

/

create or replace PROCEDURE ADD_FINANC_FINANC_CORREL_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idFinanceiro              IN NUMBER,
  p_idFinanceiroCorrelato     IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOFINANCEIROXCORRELATO
    WHERE idFinanceiro        = p_idFinanceiro
    AND idFinanceiroCorrelato = p_idFinanceiroCorrelato;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOFINANCEIROXCORRELATO',
      'id',
      14);
  END IF;
  MERGE INTO MOFINANCEIROXCORRELATO a 
  USING (
    SELECT
      r_id                    id,
      p_idFinanceiro          idFinanceiro,
      p_idFinanceiroCorrelato idFinanceiroCorrelato
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idFinanceiro          = b.idFinanceiro,
    a.idFinanceiroCorrelato = b.idFinanceiroCorrelato
  WHEN NOT MATCHED THEN INSERT (
    id,
    idFinanceiro,
    idFinanceiroCorrelato)
  VALUES (
    r_id,
    p_idFinanceiro,
    p_idFinanceiroCorrelato);
END ADD_FINANC_FINANC_CORREL_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_DOCUMENTO_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idDocumentoFinanceiro     IN NUMBER,
  p_idFinanceiro              IN NUMBER,
  p_preDocumento              IN NUMBER,
  p_idDocumentoFiscal         IN NUMBER,
  p_valor                     IN NUMBER,
  r_idDocumentoFinanceiro     OUT NUMBER)
IS
BEGIN
  r_idDocumentoFinanceiro := p_idDocumentoFinanceiro;
  IF r_idDocumentoFinanceiro = 0 THEN
    r_idDocumentoFinanceiro := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOFINANCEIROXDOCUMENTOS',
      'idDocumentoFinanceiro',
      14);
  END IF;
  MERGE INTO MOFINANCEIROXDOCUMENTOS a 
  USING (
    SELECT
      r_idDocumentoFinanceiro idDocumentoFinanceiro,
      p_idFinanceiro          idFinanceiro,
      p_preDocumento          preDocumento,
      p_idDocumentoFiscal     idDocumentoFiscal,
      p_valor                 valor
    FROM DUAL) b
  ON (a.idDocumentoFinanceiro = b.idDocumentoFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.idFinanceiro      = b.idFinanceiro,
    a.preDocumento      = b.preDocumento,
    a.idDocumentoFiscal = b.idDocumentoFiscal,
    a.valor             = b.valor
  WHEN NOT MATCHED THEN INSERT (
    idDocumentoFinanceiro,
    idFinanceiro,
    preDocumento,
    idDocumentoFiscal,
    valor)
  VALUES (
    b.idDocumentoFinanceiro,
    b.idFinanceiro,
    b.preDocumento,
    b.idDocumentoFiscal,
    b.valor);
END ADD_FINANC_DOCUMENTO_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_BOLETO_GRAVA (
  p_idFinanceiro           IN NUMBER,
  p_banco                  IN CHAR,
  p_nossoNumero            IN VARCHAR2,
  p_linhaDigitavelBoleto   IN VARCHAR2,
  p_codigoBarrasBoleto     IN VARCHAR2,
  p_contratoCobrancaBoleto IN VARCHAR2,
  p_boletoImpresso         IN NUMBER,
  p_remessaEnviada         IN NUMBER,
  p_retornoProcessado      IN NUMBER)
IS
BEGIN
  MERGE INTO MOFINANCEIROXBOLETO a 
  USING (
    SELECT
      p_idFinanceiro           idFinanceiro,
      p_banco                  banco,
      p_nossoNumero            nossoNumero,
      p_linhaDigitavelBoleto   linhaDigitavelBoleto,
      p_codigoBarrasBoleto     codigoBarrasBoleto,
      p_contratoCobrancaBoleto contratoCobrancaBoleto,
      p_boletoImpresso         boletoImpresso,
      p_remessaEnviada         remessaEnviada,
      p_retornoProcessado      retornoProcessado
    FROM DUAL) b
  ON (a.idFinanceiro = b.idFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.banco                  = b.banco,
    a.nossoNumero            = b.nossoNumero,
    a.linhaDigitavelBoleto   = b.linhaDigitavelBoleto,
    a.codigoBarrasBoleto     = b.codigoBarrasBoleto,
    a.contratoCobrancaBoleto = b.contratoCobrancaBoleto,
    a.boletoImpresso         = b.boletoImpresso,
    a.remessaEnviada         = b.remessaEnviada,
    a.retornoProcessado      = b.retornoProcessado
  WHEN NOT MATCHED THEN INSERT (
    idFinanceiro,
    banco,
    nossoNumero,
    linhaDigitavelBoleto,
    codigoBarrasBoleto,
    contratoCobrancaBoleto,
    boletoImpresso,
    remessaEnviada,
    retornoProcessado)
  VALUES (
    b.idFinanceiro,
    b.banco,
    b.nossoNumero,
    b.linhaDigitavelBoleto,
    b.codigoBarrasBoleto,
    b.contratoCobrancaBoleto,
    b.boletoImpresso,
    b.remessaEnviada,
    b.retornoProcessado);
END ADD_FINANC_BOLETO_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_CARTAO_GRAVA (
  p_idFinanceiro          IN NUMBER,
  p_credenciadoraCartao   IN NUMBER,
  p_bandeiraCartaoDebCred IN NUMBER,
  p_transacaoCartaoNSU    IN VARCHAR2,
  p_autorizacaoCartao     IN VARCHAR2,
  p_tarifaCartao          IN NUMBER,
  p_valorTarifaCartao     IN NUMBER)
IS
BEGIN
  MERGE INTO MOFINANCEIROXCARTAO a 
  USING (
    SELECT
      p_idFinanceiro          idFinanceiro,
      p_credenciadoraCartao   credenciadoraCartao,
      p_bandeiraCartaoDebCred bandeiraCartaoDebCred,
      p_transacaoCartaoNSU    transacaoCartaoNSU,
      p_autorizacaoCartao     autorizacaoCartao,
      p_tarifaCartao          tarifaCartao,
      p_valorTarifaCartao     valorTarifaCartao
    FROM DUAL) b
  ON (a.idFinanceiro = b.idFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.credenciadoraCartao   = b.credenciadoraCartao,
    a.bandeiraCartaoDebCred = b.bandeiraCartaoDebCred,
    a.transacaoCartaoNSU    = b.transacaoCartaoNSU,
    a.autorizacaoCartao     = b.autorizacaoCartao,
    a.tarifaCartao          = b.tarifaCartao,
    a.valorTarifaCartao     = b.valorTarifaCartao
  WHEN NOT MATCHED THEN INSERT (
    idFinanceiro,
    credenciadoraCartao,
    bandeiraCartaoDebCred,
    transacaoCartaoNSU,
    autorizacaoCartao,
    tarifaCartao,
    valorTarifaCartao)
  VALUES (
    b.idFinanceiro,
    b.credenciadoraCartao,
    b.bandeiraCartaoDebCred,
    b.transacaoCartaoNSU,
    b.autorizacaoCartao,
    b.tarifaCartao,
    b.valorTarifaCartao);
END ADD_FINANC_CARTAO_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_CARTAO_PROPR_GRAVA (
  p_idFinanceiro  IN NUMBER,
  p_cartaoProprio IN NUMBER)
IS
BEGIN
  MERGE INTO MOFINANCEIROXCARTPROPRIO a
  USING (
    SELECT
      p_idFinanceiro  idFinanceiro,
      p_cartaoProprio cartaoProprio
    FROM DUAL) b
  ON (a.idFinanceiro = b.idFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.cartaoProprio = b.cartaoProprio
  WHEN NOT MATCHED THEN INSERT (
    idFinanceiro,
    cartaoProprio)
  VALUES (
    b.idFinanceiro,
    b.cartaoProprio);
END ADD_FINANC_CARTAO_PROPR_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_CHEQUE_GRAVA (
  p_idFinanceiro              IN NUMBER,
  p_compensacao               IN CHAR,
  p_banco                     IN CHAR,
  p_agenciaBanco              IN VARCHAR2,
  p_c1                        IN NUMBER,
  p_contaBanco                IN VARCHAR2,
  p_c2                        IN NUMBER,
  p_cheque                    IN NUMBER,
  p_c3                        IN NUMBER,
  p_bomPara                   IN DATE,
  p_indicadorPessoa           IN CHAR,
  p_titular                   IN VARCHAR2,
  p_indicadorDocumentoPessoa  IN CHAR,
  p_cnpjCpfIdEstrangeiro      IN VARCHAR2,
  p_fone                      IN VARCHAR2,
  p_desde                     IN DATE,
  p_autenticacao              IN VARCHAR2,
  p_statusCheque              IN NUMBER,
  p_dataPrimeiroDeposito      IN DATE,
  p_dataCompensacaoDevolucao  IN DATE,
  p_dataSegundoDeposito       IN DATE,
  p_dataSegundaComponsacaoDev IN DATE)
IS
BEGIN
  MERGE INTO MOFINANCEIROXCHEQUE a 
  USING (
    SELECT
      p_idFinanceiro              idFinanceiro,
      p_compensacao               compensacao,
      p_banco                     banco,
      p_agenciaBanco              agenciaBanco,
      p_c1                        c1,
      p_contaBanco                contaBanco,
      p_c2                        c2,
      p_cheque                    cheque,
      p_c3                        c3,
      p_bomPara                   bomPara,
      p_indicadorPessoa           indicadorPessoa,
      p_titular                   titular,
      p_indicadorDocumentoPessoa  indicadorDocumentoPessoa,
      p_cnpjCpfIdEstrangeiro      cnpjCpfIdEstrangeiro,
      p_fone                      fone,
      p_desde                     desde,
      p_autenticacao              autenticacao,
      p_statusCheque              statusCheque,
      p_dataPrimeiroDeposito      dataPrimeiroDeposito,
      p_dataCompensacaoDevolucao  dataCompensacaoDevolucao,
      p_dataSegundoDeposito       dataSegundoDeposito,
      p_dataSegundaComponsacaoDev dataSegundaComponsacaoDev
    FROM DUAL) b
  ON (a.idFinanceiro = b.idFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.compensacao               = b.compensacao,
    a.banco                     = b.banco,
    a.agenciaBanco              = b.agenciaBanco,
    a.c1                        = b.c1,
    a.contaBanco                = b.contaBanco,
    a.c2                        = b.c2,
    a.cheque                    = b.cheque,
    a.c3                        = b.c3,
    a.bomPara                   = b.bomPara,
    a.indicadorPessoa           = b.indicadorPessoa,
    a.titular                   = b.titular,
    a.indicadorDocumentoPessoa  = b.indicadorDocumentoPessoa,
    a.cnpjCpfIdEstrangeiro      = b.cnpjCpfIdEstrangeiro,
    a.fone                      = b.fone,
    a.desde                     = b.desde,
    a.autenticacao              = b.autenticacao,
    a.statusCheque              = b.statusCheque,
    a.dataPrimeiroDeposito      = b.dataPrimeiroDeposito,
    a.dataCompensacaoDevolucao  = b.dataCompensacaoDevolucao,
    a.dataSegundoDeposito       = b.dataSegundoDeposito,
    a.dataSegundaComponsacaoDev = b.dataSegundaComponsacaoDev
  WHEN NOT MATCHED THEN INSERT (
    idFinanceiro,
    compensacao,
    banco,
    agenciaBanco,
    c1,
    contaBanco,
    c2,
    cheque,
    c3,
    bomPara,
    indicadorPessoa,
    titular,
    indicadorDocumentoPessoa,
    cnpjCpfIdEstrangeiro,
    fone,
    desde,
    autenticacao,
    statusCheque,
    dataPrimeiroDeposito,
    dataCompensacaoDevolucao,
    dataSegundoDeposito,
    dataSegundaComponsacaoDev)
  VALUES (
    b.idFinanceiro,
    b.compensacao,
    b.banco,
    b.agenciaBanco,
    b.c1,
    b.contaBanco,
    b.c2,
    b.cheque,
    b.c3,
    b.bomPara,
    b.indicadorPessoa,
    b.titular,
    b.indicadorDocumentoPessoa,
    b.cnpjCpfIdEstrangeiro,
    b.fone,
    b.desde,
    b.autenticacao,
    b.statusCheque,
    b.dataPrimeiroDeposito,
    b.dataCompensacaoDevolucao,
    b.dataSegundoDeposito,
    b.dataSegundaComponsacaoDev);
END ADD_FINANC_CHEQUE_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_PIX_GRAVA (
  p_idFinanceiro         IN NUMBER,
  p_banco                IN CHAR,
  p_txIdPix              IN VARCHAR2,
  p_locationPix          IN VARCHAR2,
  p_chavePix             IN VARCHAR2,
  p_qrCode               IN VARCHAR2,
  p_dataCriacao          IN DATE,
  p_timezoneCriacao      IN VARCHAR2,
  p_segundosExpiracao    IN NUMBER,
  p_nomeRazaoSocial      IN VARCHAR2,
  p_cnpjCpfIdEstrangeiro IN VARCHAR2,
  p_statusPix            IN CHAR,
  p_numeroRevisao        IN NUMBER,
  p_observacoes          IN VARCHAR2)
IS
BEGIN
  MERGE INTO MOFINANCEIROXPIX a 
  USING (
    SELECT
      p_idFinanceiro         idFinanceiro,
      p_banco                banco,
      p_txIdPix              txIdPix,
      p_locationPix          locationPix,
      p_chavePix             chavePix,
      p_qrCode               qrCode,
      p_dataCriacao          dataCriacao,
      p_timezoneCriacao      timezoneCriacao,
      p_segundosExpiracao    segundosExpiracao,
      p_nomeRazaoSocial      nomeRazaoSocial,
      p_cnpjCpfIdEstrangeiro cnpjCpfIdEstrangeiro,
      p_statusPix            statusPix,
      p_numeroRevisao        numeroRevisao,
      p_observacoes          observacoes
    FROM DUAL) b
  ON (a.idFinanceiro = b.idFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.banco                = b.banco,
    a.txIdPix              = b.txIdPix,
    a.locationPix          = b.locationPix,
    a.chavePix             = b.chavePix,
    a.qrCode               = b.qrCode,
    a.dataCriacao          = b.dataCriacao,
    a.timezoneCriacao      = b.timezoneCriacao,
    a.segundosExpiracao    = b.segundosExpiracao,
    a.nomeRazaoSocial      = b.nomeRazaoSocial,
    a.cnpjCpfIdEstrangeiro = b.cnpjCpfIdEstrangeiro,
    a.statusPix            = b.statusPix,
    a.numeroRevisao        = b.numeroRevisao,
    a.observacoes          = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idFinanceiro,
    banco,
    txIdPix,
    locationPix,
    chavePix,
    qrCode,
    dataCriacao,
    timezoneCriacao,
    segundosExpiracao,
    nomeRazaoSocial,
    cnpjCpfIdEstrangeiro,
    statusPix,
    numeroRevisao,
    observacoes)
  VALUES (
    b.idFinanceiro,
    b.banco,
    b.txIdPix,
    b.locationPix,
    b.chavePix,
    b.qrCode,
    b.dataCriacao,
    b.timezoneCriacao,
    b.segundosExpiracao,
    b.nomeRazaoSocial,
    b.cnpjCpfIdEstrangeiro,
    b.statusPix,
    b.numeroRevisao,
    b.observacoes);
END ADD_FINANC_PIX_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_GRAVA (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idFinanceiro                IN NUMBER,
  p_sessaoCaixa                 IN NUMBER,
  p_fatoContabil                IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_data                        IN DATE,
  p_dataEmissao                 IN DATE,
  p_prazoPadrao                 IN NUMBER,
  p_prazo                       IN NUMBER,
  p_vencimento                  IN DATE,
  p_vencimentoNegociado         IN DATE,
  p_naoCobrarJurosMultaAte      IN DATE,
  p_contaFinanceira             IN VARCHAR2,
  p_pagamentoRecebimento        IN CHAR,
  p_operacaoFinanceira          IN NUMBER,
  p_complemento                 IN VARCHAR2,
  p_contratoCompra              IN NUMBER,
  p_idPagamentoPreDocumento     IN NUMBER,
  p_idPagamentoDocFiscal        IN NUMBER,
  p_documento                   IN VARCHAR2,
  p_fatura                      IN VARCHAR2,
  p_parcelaAtual                IN NUMBER,
  p_parcelasTotais              IN NUMBER,
  p_pessoa                      IN NUMBER,
  p_autorizadoPessoa            IN NUMBER,
  p_cobranca                    IN NUMBER,
  p_meioPagamento               IN NUMBER,
  p_carteiraFinanceira          IN NUMBER,
  p_valor                       IN NUMBER,
  p_valorDesconto               IN NUMBER,
  p_valorAcrescimo              IN NUMBER,
  p_saldo                       IN NUMBER,
  p_indexador                   IN VARCHAR2,
  p_cotacao                     IN NUMBER,
  p_valorIndexado               IN NUMBER,
  p_saldoIndexado               IN NUMBER,
  p_efetivado                   IN NUMBER,
  p_tarifaDescontoAteVencimento IN NUMBER,
  p_tipoPagamentoAntecipado     IN CHAR,
  p_tarifaMensalDescontoAntecip IN NUMBER,
  p_tipoJuroDeMora              IN CHAR,
  p_tarifaMensalJuroDeMora      IN NUMBER,
  p_tarifaMulta                 IN NUMBER,
  p_valorFixoMulta              IN NUMBER,
  p_desconsiderarSPC            IN NUMBER,
  r_idFinanceiro                OUT NUMBER)
IS
BEGIN
  r_idFinanceiro := p_idFinanceiro;
  IF r_idFinanceiro = 0 THEN
    r_idFinanceiro := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOFINANCEIROS',
      'idFinanceiro',
      14);
  END IF;
  MERGE INTO MOFINANCEIROS a 
  USING (
    SELECT
      r_idFinanceiro                idFinanceiro,
      p_sessaoCaixa                 sessaoCaixa,
      p_fatoContabil                fatoContabil,
      p_estabelecimento             estabelecimento,
      p_data                        data,
      p_dataEmissao                 dataEmissao,
      p_prazoPadrao                 prazoPadrao,
      p_prazo                       prazo,
      p_vencimento                  vencimento,
      p_vencimentoNegociado         vencimentoNegociado,
      p_naoCobrarJurosMultaAte      naoCobrarJurosMultaAte,
      p_contaFinanceira             contaFinanceira,
      p_pagamentoRecebimento        pagamentoRecebimento,
      p_operacaoFinanceira          operacaoFinanceira,
      p_complemento                 complemento,
      p_contratoCompra              contratoCompra,
      p_idPagamentoPreDocumento     idPagamentoPreDocumento,
      p_idPagamentoDocFiscal        idPagamentoDocFiscal,
      p_documento                   documento,
      p_fatura                      fatura,
      p_parcelaAtual                parcelaAtual,
      p_parcelasTotais              parcelasTotais,
      p_pessoa                      pessoa,
      p_autorizadoPessoa            autorizadoPessoa,
      p_cobranca                    cobranca,
      p_meioPagamento               meioPagamento,
      p_carteiraFinanceira          carteiraFinanceira,
      p_valor                       valor,
      p_valorDesconto               valorDesconto,
      p_valorAcrescimo              valorAcrescimo,
      p_saldo                       saldo,
      p_indexador                   indexador,
      p_cotacao                     cotacao,
      p_valorIndexado               valorIndexado,
      p_saldoIndexado               saldoIndexado,
      p_efetivado                   efetivado,
      p_tarifaDescontoAteVencimento tarifaDescontoAteVencimento,
      p_tipoPagamentoAntecipado     tipoPagamentoAntecipado,
      p_tarifaMensalDescontoAntecip tarifaMensalDescontoAntecipado,
      p_tipoJuroDeMora              tipoJuroDeMora,
      p_tarifaMensalJuroDeMora      tarifaMensalJuroDeMora,
      p_tarifaMulta                 tarifaMulta,
      p_valorFixoMulta              valorFixoMulta,
      p_desconsiderarSPC            desconsiderarSPC
    FROM DUAL) b
  ON (a.idFinanceiro = b.idFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.sessaoCaixa                    = b.sessaoCaixa,
    a.fatoContabil                   = b.fatoContabil,
    a.estabelecimento                = b.estabelecimento,
    a.data                           = b.data,
    a.dataEmissao                    = b.dataEmissao,
    a.prazoPadrao                    = b.prazoPadrao,
    a.prazo                          = b.prazo,
    a.vencimento                     = b.vencimento,
    a.vencimentoNegociado            = b.vencimentoNegociado,
    a.naoCobrarJurosMultaAte         = b.naoCobrarJurosMultaAte,
    a.contaFinanceira                = b.contaFinanceira,
    a.pagamentoRecebimento           = b.pagamentoRecebimento,
    a.operacaoFinanceira             = b.operacaoFinanceira,
    a.complemento                    = b.complemento,
    a.contratoCompra                 = b.contratoCompra,
    a.idPagamentoPreDocumento        = b.idPagamentoPreDocumento,
    a.idPagamentoDocFiscal           = b.idPagamentoDocFiscal,
    a.documento                      = b.documento,
    a.fatura                         = b.fatura,
    a.parcelaAtual                   = b.parcelaAtual,
    a.parcelasTotais                 = b.parcelasTotais,
    a.pessoa                         = b.pessoa,
    a.autorizadoPessoa               = b.autorizadoPessoa,
    a.cobranca                       = b.cobranca,
    a.meioPagamento                  = b.meioPagamento,
    a.carteiraFinanceira             = b.carteiraFinanceira,
    a.valor                          = b.valor,
    a.valorDesconto                  = b.valorDesconto,
    a.valorAcrescimo                 = b.valorAcrescimo,
    a.saldo                          = b.saldo,
    a.indexador                      = b.indexador,
    a.cotacao                        = b.cotacao,
    a.valorIndexado                  = b.valorIndexado,
    a.saldoIndexado                  = b.saldoIndexado,
    a.efetivado                      = b.efetivado,
    a.tarifaDescontoAteVencimento    = b.tarifaDescontoAteVencimento,
    a.tipoPagamentoAntecipado        = b.tipoPagamentoAntecipado,
    a.tarifaMensalDescontoAntecipado = b.tarifaMensalDescontoAntecipado,
    a.tipoJuroDeMora                 = b.tipoJuroDeMora,
    a.tarifaMensalJuroDeMora         = b.tarifaMensalJuroDeMora,
    a.tarifaMulta                    = b.tarifaMulta,
    a.valorFixoMulta                 = b.valorFixoMulta,
    a.desconsiderarSPC               = b.desconsiderarSPC
  WHEN NOT MATCHED THEN INSERT (
    idFinanceiro,
    sessaoCaixa,
    fatoContabil,
    estabelecimento,
    data,
    dataEmissao,
    prazoPadrao,
    prazo,
    vencimento,
    vencimentoNegociado,
    naoCobrarJurosMultaAte,
    contaFinanceira,
    pagamentoRecebimento,
    operacaoFinanceira,
    complemento,
    contratoCompra,
    idPagamentoPreDocumento,
    idPagamentoDocFiscal,
    documento,
    fatura,
    parcelaAtual,
    parcelasTotais,
    pessoa,
    autorizadoPessoa,
    cobranca,
    meioPagamento,
    carteiraFinanceira,
    valor,
    valorDesconto,
    valorAcrescimo,
    saldo,
    indexador,
    cotacao,
    valorIndexado,
    saldoIndexado,
    efetivado,
    tarifaDescontoAteVencimento,
    tipoPagamentoAntecipado,
    tarifaMensalDescontoAntecipado,
    tipoJuroDeMora,
    tarifaMensalJuroDeMora,
    tarifaMulta,
    valorFixoMulta,
    desconsiderarSPC)
  VALUES (
    b.idFinanceiro,
    b.sessaoCaixa,
    b.fatoContabil,
    b.estabelecimento,
    b.data,
    b.dataEmissao,
    b.prazoPadrao,
    b.prazo,
    b.vencimento,
    b.vencimentoNegociado,
    b.naoCobrarJurosMultaAte,
    b.contaFinanceira,
    b.pagamentoRecebimento,
    b.operacaoFinanceira,
    b.complemento,
    b.contratoCompra,
    b.idPagamentoPreDocumento,
    b.idPagamentoDocFiscal,
    b.documento,
    b.fatura,
    b.parcelaAtual,
    b.parcelasTotais,
    b.pessoa,
    b.autorizadoPessoa,
    b.cobranca,
    b.meioPagamento,
    b.carteiraFinanceira,
    b.valor,
    b.valorDesconto,
    b.valorAcrescimo,
    b.saldo,
    b.indexador,
    b.cotacao,
    b.valorIndexado,
    b.saldoIndexado,
    b.efetivado,
    b.tarifaDescontoAteVencimento,
    b.tipoPagamentoAntecipado,
    b.tarifaMensalDescontoAntecipado,
    b.tipoJuroDeMora,
    b.tarifaMensalJuroDeMora,
    b.tarifaMulta,
    b.valorFixoMulta,
    b.desconsiderarSPC);
END ADD_FINANC_GRAVA;

/

create or replace PROCEDURE ADD_PREVFIN_FINANC_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idPrevisaoFinanceira      IN NUMBER,
  p_idFinanceiro              IN NUMBER,
  p_preDocumento              IN NUMBER,
  p_idDocumentoFiscal         IN NUMBER,
  p_valor                     IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOPREVFINANCXFINANCEIRO',
      'id',
      14);
  END IF;
  MERGE INTO MOPREVFINANCXFINANCEIRO a 
  USING (
    SELECT
      r_id                   id,
      p_idPrevisaoFinanceira idPrevisaoFinanceira,
      p_idFinanceiro         idFinanceiro,
      p_preDocumento         preDocumento,
      p_idDocumentoFiscal    idDocumentoFiscal,
      p_valor                valor
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idFinanceiro         = b.idFinanceiro,
    a.idPrevisaoFinanceira = b.idPrevisaoFinanceira,
    a.preDocumento         = b.preDocumento,
    a.idDocumentoFiscal    = b.idDocumentoFiscal,
    a.valor                = b.valor
  WHEN NOT MATCHED THEN INSERT (
    id,
    idPrevisaoFinanceira,
    idFinanceiro,
    preDocumento,
    idDocumentoFiscal,
    valor)
  VALUES (
    b.id,
    b.idPrevisaoFinanceira,
    b.idFinanceiro,
    b.preDocumento,
    b.idDocumentoFiscal,
    b.valor);
END ADD_PREVFIN_FINANC_GRAVA;

/

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

/

create or replace PROCEDURE ADD_FATO_CONTABIL_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_fatoContabil              IN NUMBER,
  p_estabelecimento           IN NUMBER,
  p_data                      IN DATE,
  p_situacaoContabilizacao    IN CHAR,
  r_fatoContabil              OUT NUMBER)
IS
BEGIN
  r_fatoContabil := p_fatoContabil;
  IF r_fatoContabil = 0 THEN
    r_fatoContabil := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOFATOSCONTABEIS',
      'fatoContabil',
      14);
  END IF;
  MERGE INTO MOFATOSCONTABEIS a
  USING (
    SELECT
      r_fatoContabil           fatoContabil,
      p_estabelecimento        estabelecimento,
      p_data                   data,
      p_situacaoContabilizacao situacaoContabilizacao
    FROM DUAL) b
  ON (a.fatoContabil = b.fatoContabil)
  WHEN MATCHED THEN UPDATE SET 
    a.estabelecimento        = b.estabelecimento,
    a.data                   = b.data,
    a.situacaoContabilizacao = b.situacaoContabilizacao
  WHEN NOT MATCHED THEN INSERT (
    fatoContabil,
    estabelecimento,
    data,
    ordenacao,
    situacaoTransacao,
    situacaoContabilizacao,
    sessao,
    observacoes)
  VALUES (
    b.fatoContabil,
    b.estabelecimento,
    b.data,
    0,
    'A',
    b.situacaoContabilizacao,
    0,
    ' '); 
END ADD_FATO_CONTABIL_GRAVA;

/

create or replace PROCEDURE ADD_LINKPAG_CABECALHO_GRAVA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idLinkPagamento              IN NUMBER,
  p_estabelecimento              IN NUMBER,
  p_data                         IN DATE,
  p_usuario                      IN NUMBER,
  p_validade                     IN DATE,
  p_transacaoLinkPagamento       IN VARCHAR2,
  p_pedidoLinkPagamento          IN VARCHAR2,
  p_complemento                  IN VARCHAR2,
  p_cobranca                     IN NUMBER,
  p_carteiraFinanceira           IN NUMBER,
  p_valorJurosTotal              IN NUMBER,
  p_valorMultaTotal              IN NUMBER,
  p_valorDescontoInformado       IN NUMBER,
  p_valorAcrescimoInformado      IN NUMBER,
  p_valor                        IN NUMBER,
  p_situacaoLinkPagamento        IN CHAR,
  p_conteudoEnvio                IN CLOB,
  p_conteudoRetorno              IN CLOB,
  p_url                          IN VARCHAR2,
  p_nsuLinkPagamento             IN VARCHAR2,
  p_nitLinkPagamento             IN VARCHAR2,
  p_nsuaLinkPagamento            IN VARCHAR2,
  p_nitaLinkPagamento            IN VARCHAR2,
  p_nitTransacaoAssLinkPagamento IN VARCHAR2,
  p_idFinanceiroAdiantamento     IN NUMBER,
  p_observacoes                  IN VARCHAR2,
  r_idLinkPagamento              OUT NUMBER)
IS
BEGIN
  r_idLinkPagamento := p_idLinkPagamento;
  IF r_idLinkPagamento = 0 THEN
    r_idLinkPagamento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOLINKSPAGAMENTO',
      'idLinkPagamento',
      14);
  END IF;
  MERGE INTO MOLINKSPAGAMENTO a 
  USING (
    SELECT
      r_idLinkPagamento              idLinkPagamento,
      p_estabelecimento              estabelecimento,
      p_data                         data,
      p_usuario                      usuario,
      p_validade                     validade,
      p_transacaoLinkPagamento       transacaoLinkPagamento,
      p_pedidoLinkPagamento          pedidoLinkPagamento,
      p_complemento                  complemento,
      p_cobranca                     cobranca,
      p_carteiraFinanceira           carteiraFinanceira,
      p_valorJurosTotal              valorJurosTotal,
      p_valorMultaTotal              valorMultaTotal,
      p_valorDescontoInformado       valorDescontoInformado,
      p_valorAcrescimoInformado      valorAcrescimoInformado,
      p_valor                        valor,
      p_situacaoLinkPagamento        situacaoLinkPagamento,
      p_conteudoEnvio                conteudoEnvio,
      p_conteudoRetorno              conteudoRetorno,
      p_url                          url,
      p_nsuLinkPagamento             nsuLinkPagamento,
      p_nitLinkPagamento             nitLinkPagamento,
      p_nsuaLinkPagamento            nsuaLinkPagamento,
      p_nitaLinkPagamento            nitaLinkPagamento,
      p_nitTransacaoAssLinkPagamento nitTransacaoAssLinkPagamento,
      p_idFinanceiroAdiantamento     idFinanceiroAdiantamento,
      p_observacoes                  observacoes
    FROM DUAL) b
  ON (a.idLinkPagamento = b.idLinkPagamento)
  WHEN MATCHED THEN UPDATE SET
    a.estabelecimento              = b.estabelecimento,
    a.data                         = b.data,
    a.usuario                      = b.usuario,
    a.validade                     = b.validade,
    a.transacaoLinkPagamento       = b.transacaoLinkPagamento,
    a.pedidoLinkPagamento          = b.pedidoLinkPagamento,
    a.complemento                  = b.complemento,
    a.cobranca                     = b.cobranca,
    a.carteiraFinanceira           = b.carteiraFinanceira,
    a.valorJurosTotal              = b.valorJurosTotal,
    a.valorMultaTotal              = b.valorMultaTotal,
    a.valorDescontoInformado       = b.valorDescontoInformado,
    a.valorAcrescimoInformado      = b.valorAcrescimoInformado,
    a.valor                        = b.valor,
    a.situacaoLinkPagamento        = b.situacaoLinkPagamento,
    a.conteudoEnvio                = b.conteudoEnvio,
    a.conteudoRetorno              = b.conteudoRetorno,
    a.url                          = b.url,
    a.nsuLinkPagamento             = b.nsuLinkPagamento,
    a.nitLinkPagamento             = b.nitLinkPagamento,
    a.nsuaLinkPagamento            = b.nsuaLinkPagamento,
    a.nitaLinkPagamento            = b.nitaLinkPagamento,
    a.nitTransacaoAssLinkPagamento = b.nitTransacaoAssLinkPagamento,
    a.idFinanceiroAdiantamento     = b.idFinanceiroAdiantamento,
    a.observacoes                  = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idLinkPagamento,
    estabelecimento,
    data,
    usuario,
    validade,
    transacaoLinkPagamento,
    pedidoLinkPagamento,
    complemento,
    cobranca,
    carteiraFinanceira,
    valorJurosTotal,
    valorMultaTotal,
    valorDescontoInformado,
    valorAcrescimoInformado,
    valor,
    situacaoLinkPagamento,
    conteudoEnvio,
    conteudoRetorno,
    url,
    nsuLinkPagamento,
    nitLinkPagamento,
    nsuaLinkPagamento,
    nitaLinkPagamento,
    nitTransacaoAssLinkPagamento,
    idFinanceiroAdiantamento,
    observacoes)
  VALUES (
    b.idLinkPagamento,
    b.estabelecimento,
    b.data,
    b.usuario,
    b.validade,
    b.transacaoLinkPagamento,
    b.pedidoLinkPagamento,
    b.complemento,
    b.cobranca,
    b.carteiraFinanceira,
    b.valorJurosTotal,
    b.valorMultaTotal,
    b.valorDescontoInformado,
    b.valorAcrescimoInformado,
    b.valor,
    b.situacaoLinkPagamento,
    b.conteudoEnvio,
    b.conteudoRetorno,
    b.url,
    b.nsuLinkPagamento,
    b.nitLinkPagamento,
    b.nsuaLinkPagamento,
    b.nitaLinkPagamento,
    b.nitTransacaoAssLinkPagamento,
    b.idFinanceiroAdiantamento,
    b.observacoes);
END ADD_LINKPAG_CABECALHO_GRAVA;

/

create or replace PROCEDURE ADD_LINKPAG_BAIXA_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idLinkPagamento           IN NUMBER,
  p_idFinanceiro              IN NUMBER,
  p_cotacao                   IN NUMBER,
  p_valor                     IN NUMBER,
  p_saldo                     IN NUMBER,
  p_saldoIndexado             IN NUMBER,
  p_valorVariacaoIndexador    IN NUMBER,
  p_valorJurosDeMora          IN NUMBER,
  p_valorMulta                IN NUMBER,
  p_valorTarifaCartao         IN NUMBER,
  p_valorDescontos            IN NUMBER,
  p_valorOutrosAcrescimos     IN NUMBER,
  p_valorLiquido              IN NUMBER,
  p_idBaixaFinanceiro         IN NUMBER,
  p_observacoes               IN VARCHAR2,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOLINKPAGAMENTOXBAIXAS',
      'id',
      14);
  END IF;
  MERGE INTO MOLINKPAGAMENTOXBAIXAS a 
  USING (
    SELECT
      r_id                     id,
      p_idLinkPagamento        idLinkPagamento,
      p_idFinanceiro           idFinanceiro,
      p_cotacao                cotacao,
      p_valor                  valor,
      p_saldo                  saldo,
      p_saldoIndexado          saldoIndexado,
      p_valorVariacaoIndexador valorVariacaoIndexador,
      p_valorJurosDeMora       valorJurosDeMora,
      p_valorMulta             valorMulta,
      p_valorTarifaCartao      valorTarifaCartao,
      p_valorDescontos         valorDescontos,
      p_valorOutrosAcrescimos  valorOutrosAcrescimos,
      p_valorLiquido           valorLiquido,
      p_idBaixaFinanceiro      idBaixaFinanceiro,
      p_observacoes            observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idLinkPagamento        = b.idLinkPagamento,
    a.idFinanceiro           = b.idFinanceiro,
    a.cotacao                = b.cotacao,
    a.valor                  = b.valor,
    a.saldo                  = b.saldo,
    a.saldoIndexado          = b.saldoIndexado,
    a.valorVariacaoIndexador = b.valorVariacaoIndexador,
    a.valorJurosDeMora       = b.valorJurosDeMora,
    a.valorMulta             = b.valorMulta,
    a.valorTarifaCartao      = b.valorTarifaCartao,
    a.valorDescontos         = b.valorDescontos,
    a.valorOutrosAcrescimos  = b.valorOutrosAcrescimos,
    a.valorLiquido           = b.valorLiquido,
    a.idBaixaFinanceiro      = b.idBaixaFinanceiro,
    a.observacoes            = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idLinkPagamento,
    idFinanceiro,
    cotacao,
    valor,
    saldo,
    saldoIndexado,
    valorVariacaoIndexador,
    valorJurosDeMora,
    valorMulta,
    valorTarifaCartao,
    valorDescontos,
    valorOutrosAcrescimos,
    valorLiquido,
    idBaixaFinanceiro,
    observacoes)
  VALUES (
    b.id,
    b.idLinkPagamento,
    b.idFinanceiro,
    b.cotacao,
    b.valor,
    b.saldo,
    b.saldoIndexado,
    b.valorVariacaoIndexador,
    b.valorJurosDeMora,
    b.valorMulta,
    b.valorTarifaCartao,
    b.valorDescontos,
    b.valorOutrosAcrescimos,
    b.valorLiquido,
    b.idBaixaFinanceiro,
    b.observacoes);
END ADD_LINKPAG_BAIXA_GRAVA;

/

create or replace PROCEDURE ADD_LINKPAG_ORCAMENTO_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idLinkPagamento           IN NUMBER,
  p_idPagamentoOrcamento      IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOLINKPAGAMENTOXORCAMENTO
    WHERE idLinkPagamento    = p_idLinkPagamento
    AND idPagamentoOrcamento = p_idPagamentoOrcamento;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOLINKPAGAMENTOXORCAMENTO',
      'id',
      14);
  END IF;
  MERGE INTO MOLINKPAGAMENTOXORCAMENTO a 
  USING (
    SELECT
      r_id                   id,
      p_idLinkPagamento      idLinkPagamento,
      p_idPagamentoOrcamento idPagamentoOrcamento
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idLinkPagamento      = b.idLinkPagamento,
    a.idPagamentoOrcamento = b.idPagamentoOrcamento
  WHEN NOT MATCHED THEN INSERT (
    id,
    idLinkPagamento,
    idPagamentoOrcamento)
  VALUES (
    b.id,
    b.idLinkPagamento,
    b.idPagamentoOrcamento);
END ADD_LINKPAG_ORCAMENTO_GRAVA;

/

create or replace PROCEDURE ADD_LINKPAG_PRE_DOC_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idLinkPagamento           IN NUMBER,
  p_idPagamentoPreDocumento   IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOLINKPAGAMENTOXPREDOCUM
    WHERE idLinkPagamento       = p_idLinkPagamento
    AND idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOLINKPAGAMENTOXPREDOCUM',
      'id',
      14);
  END IF;
  MERGE INTO MOLINKPAGAMENTOXPREDOCUM a 
  USING (
    SELECT
      r_id                      id,
      p_idLinkPagamento         idLinkPagamento,
      p_idPagamentoPreDocumento idPagamentoPreDocumento
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idLinkPagamento         = b.idLinkPagamento,
    a.idPagamentoPreDocumento = b.idPagamentoPreDocumento
  WHEN NOT MATCHED THEN INSERT (
    id,
    idLinkPagamento,
    idPagamentoPreDocumento)
  VALUES (
    b.id,
    b.idLinkPagamento,
    b.idPagamentoPreDocumento);
END ADD_LINKPAG_PRE_DOC_GRAVA;

/

create or replace PROCEDURE ADD_LINKPAG_DOC_FISC_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idLinkPagamento           IN NUMBER,
  p_idPagamentoDocFiscal      IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOLINKPAGAMENTOXDOCFISCAL
    WHERE idLinkPagamento    = p_idLinkPagamento
    AND idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOLINKPAGAMENTOXDOCFISCAL',
      'id',
      14);
  END IF;
  MERGE INTO MOLINKPAGAMENTOXDOCFISCAL a 
  USING (
    SELECT
      r_id                   id,
      p_idLinkPagamento      idLinkPagamento,
      p_idPagamentoDocFiscal idPagamentoDocFiscal
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idLinkPagamento      = b.idLinkPagamento,
    a.idPagamentoDocFiscal = b.idPagamentoDocFiscal
  WHEN NOT MATCHED THEN INSERT (
    id,
    idLinkPagamento,
    idPagamentoDocFiscal)
  VALUES (
    b.id,
    b.idLinkPagamento,
    b.idPagamentoDocFiscal);
END ADD_LINKPAG_DOC_FISC_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_PROMOCAO_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_orcamento                 IN NUMBER,
  p_cabecalhoItemPagamento    IN CHAR,
  p_sequencia                 IN NUMBER,
  p_idItemOrcamento           IN NUMBER,
  p_idPagamentoOrcamento      IN NUMBER,
  p_regraPromocao             IN NUMBER,
  p_tipoBeneficio             IN CHAR,
  p_multiplicador             IN NUMBER,
  p_percentualDesconto        IN NUMBER,
  p_valorDesconto             IN NUMBER,
  p_gerarPontuacao            IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOORCAMENTOXPROMOCOES',
      'id',
      14);
  END IF;
  MERGE INTO MOORCAMENTOXPROMOCOES a 
  USING (
    SELECT
      r_id                     id,
      p_orcamento              orcamento,
      p_cabecalhoItemPagamento cabecalhoItemPagamento,
      p_sequencia              sequencia,
      p_idItemOrcamento        idItemOrcamento,
      p_idPagamentoOrcamento   idPagamentoOrcamento,
      p_regraPromocao          regraPromocao,
      p_tipoBeneficio          tipoBeneficio,
      p_multiplicador          multiplicador,
      p_percentualDesconto     percentualDesconto,
      p_valorDesconto          valorDesconto,
      p_gerarPontuacao         gerarPontuacao
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.orcamento              = b.orcamento,
    a.cabecalhoItemPagamento = b.cabecalhoItemPagamento,
    a.sequencia              = b.sequencia,
    a.idItemOrcamento        = b.idItemOrcamento,
    a.idPagamentoOrcamento   = b.idPagamentoOrcamento,
    a.regraPromocao          = b.regraPromocao,
    a.tipoBeneficio          = b.tipoBeneficio,
    a.multiplicador          = b.multiplicador,
    a.percentualDesconto     = b.percentualDesconto,
    a.valorDesconto          = b.valorDesconto,
    a.gerarPontuacao         = b.gerarPontuacao
  WHEN NOT MATCHED THEN INSERT (
    id,
    orcamento,
    cabecalhoItemPagamento,
    sequencia,
    idItemOrcamento,
    idPagamentoOrcamento,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes)
  VALUES (
    b.id,
    b.orcamento,
    b.cabecalhoItemPagamento,
    b.sequencia,
    b.idItemOrcamento,
    b.idPagamentoOrcamento,
    b.regraPromocao,
    b.tipoBeneficio,
    b.multiplicador,
    0,
    0,
    0,
    0,
    b.percentualDesconto,
    b.valorDesconto,
    0,
    b.gerarPontuacao,
    ' ');
END ADD_ORCAMENTO_PROMOCAO_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_PROMOCAO_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_preDocumento              IN NUMBER,
  p_cabecalhoItemPagamento    IN CHAR,
  p_sequencia                 IN NUMBER,
  p_idItemPreDocumento        IN NUMBER,
  p_idPagamentoPreDocumento   IN NUMBER,
  p_regraPromocao             IN NUMBER,
  p_tipoBeneficio             IN CHAR,
  p_multiplicador             IN NUMBER,
  p_percentualDesconto        IN NUMBER,
  p_valorDesconto             IN NUMBER,
  p_gerarPontuacao            IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOPREDOCUMXPROMOCOES',
      'id',
      14);
  END IF;
  MERGE INTO MOPREDOCUMXPROMOCOES a 
  USING (
    SELECT
      r_id                      id,
      p_preDocumento            preDocumento,
      p_cabecalhoItemPagamento  cabecalhoItemPagamento,
      p_sequencia               sequencia,
      p_idItemPreDocumento      idItemPreDocumento,
      p_idPagamentoPreDocumento idPagamentoPreDocumento,
      p_regraPromocao           regraPromocao,
      p_tipoBeneficio           tipoBeneficio,
      p_multiplicador           multiplicador,
      p_percentualDesconto      percentualDesconto,
      p_valorDesconto           valorDesconto,
      p_gerarPontuacao          gerarPontuacao
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.preDocumento            = b.preDocumento,
    a.cabecalhoItemPagamento  = b.cabecalhoItemPagamento,
    a.sequencia               = b.sequencia,
    a.idItemPreDocumento      = b.idItemPreDocumento,
    a.idPagamentoPreDocumento = b.idPagamentoPreDocumento,
    a.regraPromocao           = b.regraPromocao,
    a.tipoBeneficio           = b.tipoBeneficio,
    a.multiplicador           = b.multiplicador,
    a.percentualDesconto      = b.percentualDesconto,
    a.valorDesconto           = b.valorDesconto,
    a.gerarPontuacao          = b.gerarPontuacao
  WHEN NOT MATCHED THEN INSERT (
    id,
    preDocumento,
    cabecalhoItemPagamento,
    sequencia,
    idItemPreDocumento,
    idPagamentoPreDocumento,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes)
  VALUES (
    b.id,
    b.preDocumento,
    b.cabecalhoItemPagamento,
    b.sequencia,
    b.idItemPreDocumento,
    b.idPagamentoPreDocumento,
    b.regraPromocao,
    b.tipoBeneficio,
    b.multiplicador,
    0,
    0,
    0,
    0,
    b.percentualDesconto,
    b.valorDesconto,
    0,
    b.gerarPontuacao,
    ' ');
END ADD_PRE_DOC_PROMOCAO_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_PROMOCAO_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idDocumentoFiscal         IN NUMBER,
  p_cabecalhoItemPagamento    IN CHAR,
  p_sequencia                 IN NUMBER,
  p_idItemDocFiscal           IN NUMBER,
  p_idPagamentoDocFiscal      IN NUMBER,
  p_regraPromocao             IN NUMBER,
  p_tipoBeneficio             IN CHAR,
  p_multiplicador             IN NUMBER,
  p_percentualDesconto        IN NUMBER,
  p_valorDesconto             IN NUMBER,
  p_gerarPontuacao            IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MODOCFISCALXPROMOCOES',
      'id',
      14);
  END IF;
  MERGE INTO MODOCFISCALXPROMOCOES a 
  USING (
    SELECT
      r_id                     id,
      p_idDocumentoFiscal      idDocumentoFiscal,
      p_cabecalhoItemPagamento cabecalhoItemPagamento,
      p_sequencia              sequencia,
      p_idItemDocFiscal        idItemDocFiscal,
      p_idPagamentoDocFiscal   idPagamentoDocFiscal,
      p_regraPromocao          regraPromocao,
      p_tipoBeneficio          tipoBeneficio,
      p_multiplicador          multiplicador,
      p_percentualDesconto     percentualDesconto,
      p_valorDesconto          valorDesconto,
      p_gerarPontuacao         gerarPontuacao
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idDocumentoFiscal      = b.idDocumentoFiscal,
    a.cabecalhoItemPagamento = b.cabecalhoItemPagamento,
    a.sequencia              = b.sequencia,
    a.idItemDocFiscal        = b.idItemDocFiscal,
    a.idPagamentoDocFiscal   = b.idPagamentoDocFiscal,
    a.regraPromocao          = b.regraPromocao,
    a.tipoBeneficio          = b.tipoBeneficio,
    a.multiplicador          = b.multiplicador,
    a.percentualDesconto     = b.percentualDesconto,
    a.valorDesconto          = b.valorDesconto,
    a.gerarPontuacao         = b.gerarPontuacao
  WHEN NOT MATCHED THEN INSERT (
    id,
    idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    idItemDocFiscal,
    idPagamentoDocFiscal,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes)
  VALUES (
    b.id,
    b.idDocumentoFiscal,
    b.cabecalhoItemPagamento,
    b.sequencia,
    b.idItemDocFiscal,
    b.idPagamentoDocFiscal,
    b.regraPromocao,
    b.tipoBeneficio,
    b.multiplicador,
    0,
    0,
    0,
    0,
    b.percentualDesconto,
    b.valorDesconto,
    0,
    b.gerarPontuacao,
    ' ');
END ADD_DOC_FISC_PROMOCAO_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_PAG_GRAVA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idPagamentoOrcamento         IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_pagamentoTroco               IN CHAR,
  p_sequencia                    IN NUMBER,
  p_indicadorFormaPagamento      IN CHAR,
  p_meioPagamento                IN NUMBER,
  p_condicaoPagamento            IN NUMBER,
  p_cobranca                     IN NUMBER,
  p_numeroParcelas               IN NUMBER,
  p_somaPrazoParcelas            IN NUMBER,
  p_valorXPrazoParcelas          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_saldoEfetivar                IN NUMBER,
  p_idFinanceiroAdiantamento     IN NUMBER,
  r_idPagamentoOrcamento         OUT NUMBER)
IS
BEGIN
  r_idPagamentoOrcamento := p_idPagamentoOrcamento;
  IF r_idPagamentoOrcamento = 0 THEN
    r_idPagamentoOrcamento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOORCAMENTOXPAGAMENTOS',
      'idPagamentoOrcamento',
      14);
  END IF;
  MERGE INTO MOORCAMENTOXPAGAMENTOS a 
  USING (
    SELECT
    r_idPagamentoOrcamento         idPagamentoOrcamento,
    p_orcamento                    orcamento,
    p_pagamentoTroco               pagamentoTroco,
    p_sequencia                    sequencia,
    p_indicadorFormaPagamento      indicadorFormaPagamento,
    p_meioPagamento                meioPagamento,
    p_condicaoPagamento            condicaoPagamento,
    p_cobranca                     cobranca,
    p_numeroParcelas               numeroParcelas,
    p_somaPrazoParcelas            somaPrazoParcelas,
    p_valorXPrazoParcelas          valorXPrazoParcelas,
    CASE
      WHEN p_numeroParcelas = 0
      THEN 0
      ELSE ROUND ((p_somaPrazoParcelas / p_numeroParcelas), 0)
    END                            prazoMedio,
    CASE
      WHEN p_valorPagamentoLiquido = 0
      THEN 0
      ELSE ROUND ((p_valorXPrazoParcelas / p_valorPagamentoLiquido), 0)
    END                            prazoMedioPonderado,
    p_valorEntradaMinima           valorEntradaMinima,
    p_valorPagamentoBruto          valorPagamentoBruto,
    p_valorDescontoPagamento       valorDescontoPagamento,
    p_valorOutrasDespesasPagamento valorOutrasDespesasPagamento,
    p_valorJurosPagamento          valorJurosPagamento,
    p_valorPagamentoLiquido        valorPagamentoLiquido,
    p_valorFinanceiro              valorFinanceiro,
    p_saldoEfetivar                saldoEfetivar,
    p_idFinanceiroAdiantamento     idFinanceiroAdiantamento
    FROM DUAL) b
  ON (a.idPagamentoOrcamento = b.idPagamentoOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.orcamento                    = b.orcamento,
    a.pagamentoTroco               = b.pagamentoTroco,
    a.sequencia                    = b.sequencia,
    a.indicadorFormaPagamento      = b.indicadorFormaPagamento,
    a.meioPagamento                = b.meioPagamento,
    a.condicaoPagamento            = b.condicaoPagamento,
    a.cobranca                     = b.cobranca,
    a.numeroParcelas               = b.numeroParcelas,
    a.somaPrazoParcelas            = b.somaPrazoParcelas,
    a.valorXPrazoParcelas          = b.valorXPrazoParcelas,
    a.prazoMedio                   = b.prazoMedio,
    a.prazoMedioPonderado          = b.prazoMedioPonderado,
    a.valorEntradaMinima           = b.valorEntradaMinima,
    a.valorPagamentoBruto          = b.valorPagamentoBruto,
    a.valorDescontoPagamento       = b.valorDescontoPagamento,
    a.valorOutrasDespesasPagamento = b.valorOutrasDespesasPagamento,
    a.valorJurosPagamento          = b.valorJurosPagamento,
    a.valorPagamentoLiquido        = b.valorPagamentoLiquido,
    a.valorFinanceiro              = b.valorFinanceiro,
    a.saldoEfetivar                = b.saldoEfetivar,
    a.idFinanceiroAdiantamento     = b.idFinanceiroAdiantamento
  WHEN NOT MATCHED THEN INSERT (
    idPagamentoOrcamento,
    orcamento,
    pagamentoTroco,
    sequencia,
    indicadorFormaPagamento,
    meioPagamento,
    condicaoPagamento,
    cobranca,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorEntradaMinima,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorFinanceiro,
    saldoEfetivar,
    idFinanceiroAdiantamento)
  VALUES (
    b.idPagamentoOrcamento,
    b.orcamento,
    b.pagamentoTroco,
    b.sequencia,
    b.indicadorFormaPagamento,
    b.meioPagamento,
    b.condicaoPagamento,
    b.cobranca,
    b.numeroParcelas,
    b.somaPrazoParcelas,
    b.valorXPrazoParcelas,
    b.prazoMedio,
    b.prazoMedioPonderado,
    b.valorEntradaMinima,
    b.valorPagamentoBruto,
    b.valorDescontoPagamento,
    b.valorOutrasDespesasPagamento,
    b.valorJurosPagamento,
    b.valorPagamentoLiquido,
    b.valorFinanceiro,
    b.saldoEfetivar,
    b.idFinanceiroAdiantamento);
END ADD_ORCAMENTO_PAG_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_GRAVA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idPagamentoPreDocumento      IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_pagamentoTroco               IN CHAR,
  p_sequencia                    IN NUMBER,
  p_indicadorFormaPagamento      IN CHAR,
  p_meioPagamento                IN NUMBER,
  p_condicaoPagamento            IN NUMBER,
  p_cobranca                     IN NUMBER,
  p_numeroParcelas               IN NUMBER,
  p_somaPrazoParcelas            IN NUMBER,
  p_valorXPrazoParcelas          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,
  r_idPagamentoPreDocumento      OUT NUMBER)
IS
BEGIN
  r_idPagamentoPreDocumento := p_idPagamentoPreDocumento;
  IF r_idPagamentoPreDocumento = 0 THEN
    r_idPagamentoPreDocumento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOPREDOCUMXPAGAMENTOS',
      'idPagamentoPreDocumento',
      14);
  END IF;
  MERGE INTO MOPREDOCUMXPAGAMENTOS a 
  USING (
    SELECT
    r_idPagamentoPreDocumento      idPagamentoPreDocumento,
    p_preDocumento                 preDocumento,
    p_pagamentoTroco               pagamentoTroco,
    p_sequencia                    sequencia,
    p_indicadorFormaPagamento      indicadorFormaPagamento,
    p_meioPagamento                meioPagamento,
    p_condicaoPagamento            condicaoPagamento,
    p_cobranca                     cobranca,
    p_numeroParcelas               numeroParcelas,
    p_somaPrazoParcelas            somaPrazoParcelas,
    p_valorXPrazoParcelas          valorXPrazoParcelas,
    CASE
      WHEN p_numeroParcelas = 0
      THEN 0
      ELSE ROUND ((p_somaPrazoParcelas / p_numeroParcelas), 0)
    END                            prazoMedio,
    CASE
      WHEN p_valorPagamentoLiquido = 0
      THEN 0
      ELSE ROUND ((p_valorXPrazoParcelas / p_valorPagamentoLiquido), 0)
    END                            prazoMedioPonderado,
    p_valorEntradaMinima           valorEntradaMinima,
    p_valorPagamentoBruto          valorPagamentoBruto,
    p_valorDescontoPagamento       valorDescontoPagamento,
    p_valorOutrasDespesasPagamento valorOutrasDespesasPagamento,
    p_valorJurosPagamento          valorJurosPagamento,
    p_valorPagamentoLiquido        valorPagamentoLiquido,
    p_valorFinanceiro              valorFinanceiro
    FROM DUAL) b
  ON (a.idPagamentoPreDocumento = b.idPagamentoPreDocumento)
  WHEN MATCHED THEN UPDATE SET
    a.preDocumento                 = b.preDocumento,
    a.pagamentoTroco               = b.pagamentoTroco,
    a.sequencia                    = b.sequencia,
    a.indicadorFormaPagamento      = b.indicadorFormaPagamento,
    a.meioPagamento                = b.meioPagamento,
    a.condicaoPagamento            = b.condicaoPagamento,
    a.cobranca                     = b.cobranca,
    a.numeroParcelas               = b.numeroParcelas,
    a.somaPrazoParcelas            = b.somaPrazoParcelas,
    a.valorXPrazoParcelas          = b.valorXPrazoParcelas,
    a.prazoMedio                   = b.prazoMedio,
    a.prazoMedioPonderado          = b.prazoMedioPonderado,
    a.valorEntradaMinima           = b.valorEntradaMinima,
    a.valorPagamentoBruto          = b.valorPagamentoBruto,
    a.valorDescontoPagamento       = b.valorDescontoPagamento,
    a.valorOutrasDespesasPagamento = b.valorOutrasDespesasPagamento,
    a.valorJurosPagamento          = b.valorJurosPagamento,
    a.valorPagamentoLiquido        = b.valorPagamentoLiquido,
    a.valorFinanceiro              = b.valorFinanceiro
  WHEN NOT MATCHED THEN INSERT (
    idPagamentoPreDocumento,
    preDocumento,
    pagamentoTroco,
    sequencia,
    indicadorFormaPagamento,
    meioPagamento,
    condicaoPagamento,
    cobranca,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorEntradaMinima,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorFinanceiro)
  VALUES (
    b.idPagamentoPreDocumento,
    b.preDocumento,
    b.pagamentoTroco,
    b.sequencia,
    b.indicadorFormaPagamento,
    b.meioPagamento,
    b.condicaoPagamento,
    b.cobranca,
    b.numeroParcelas,
    b.somaPrazoParcelas,
    b.valorXPrazoParcelas,
    b.prazoMedio,
    b.prazoMedioPonderado,
    b.valorEntradaMinima,
    b.valorPagamentoBruto,
    b.valorDescontoPagamento,
    b.valorOutrasDespesasPagamento,
    b.valorJurosPagamento,
    b.valorPagamentoLiquido,
    b.valorFinanceiro);
END ADD_PRE_DOC_PAG_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_GRAVA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idPagamentoDocFiscal         IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_pagamentoTroco               IN CHAR,
  p_sequencia                    IN NUMBER,
  p_indicadorFormaPagamento      IN CHAR,
  p_meioPagamento                IN NUMBER,
  p_condicaoPagamento            IN NUMBER,
  p_cobranca                     IN NUMBER,
  p_numeroParcelas               IN NUMBER,
  p_somaPrazoParcelas            IN NUMBER,
  p_valorXPrazoParcelas          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,
  r_idPagamentoDocFiscal         OUT NUMBER)
IS
BEGIN
  r_idPagamentoDocFiscal := p_idPagamentoDocFiscal;
  IF r_idPagamentoDocFiscal = 0 THEN
    r_idPagamentoDocFiscal := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MODOCFISCALXPAGAMENTOS',
      'idPagamentoDocFiscal',
      14);
  END IF;
  MERGE INTO MODOCFISCALXPAGAMENTOS a 
  USING (
    SELECT
    r_idPagamentoDocFiscal         idPagamentoDocFiscal,
    p_idDocumentoFiscal            idDocumentoFiscal,
    p_pagamentoTroco               pagamentoTroco,
    p_sequencia                    sequencia,
    p_indicadorFormaPagamento      indicadorFormaPagamento,
    p_meioPagamento                meioPagamento,
    p_condicaoPagamento            condicaoPagamento,
    p_cobranca                     cobranca,
    p_numeroParcelas               numeroParcelas,
    p_somaPrazoParcelas            somaPrazoParcelas,
    p_valorXPrazoParcelas          valorXPrazoParcelas,
    CASE
      WHEN p_numeroParcelas = 0
      THEN 0
      ELSE ROUND ((p_somaPrazoParcelas / p_numeroParcelas), 0)
    END                            prazoMedio,
    CASE
      WHEN p_valorPagamentoLiquido = 0
      THEN 0
      ELSE ROUND ((p_valorXPrazoParcelas / p_valorPagamentoLiquido), 0)
    END                            prazoMedioPonderado,
    p_valorEntradaMinima           valorEntradaMinima,
    p_valorPagamentoBruto          valorPagamentoBruto,
    p_valorDescontoPagamento       valorDescontoPagamento,
    p_valorOutrasDespesasPagamento valorOutrasDespesasPagamento,
    p_valorJurosPagamento          valorJurosPagamento,
    p_valorPagamentoLiquido        valorPagamentoLiquido,
    p_valorFinanceiro              valorFinanceiro
    FROM DUAL) b
  ON (a.idPagamentoDocFiscal = b.idPagamentoDocFiscal)
  WHEN MATCHED THEN UPDATE SET
    a.idDocumentoFiscal            = b.idDocumentoFiscal,
    a.pagamentoTroco               = b.pagamentoTroco,
    a.sequencia                    = b.sequencia,
    a.indicadorFormaPagamento      = b.indicadorFormaPagamento,
    a.meioPagamento                = b.meioPagamento,
    a.condicaoPagamento            = b.condicaoPagamento,
    a.cobranca                     = b.cobranca,
    a.numeroParcelas               = b.numeroParcelas,
    a.somaPrazoParcelas            = b.somaPrazoParcelas,
    a.valorXPrazoParcelas          = b.valorXPrazoParcelas,
    a.prazoMedio                   = b.prazoMedio,
    a.prazoMedioPonderado          = b.prazoMedioPonderado,
    a.valorEntradaMinima           = b.valorEntradaMinima,
    a.valorPagamentoBruto          = b.valorPagamentoBruto,
    a.valorDescontoPagamento       = b.valorDescontoPagamento,
    a.valorOutrasDespesasPagamento = b.valorOutrasDespesasPagamento,
    a.valorJurosPagamento          = b.valorJurosPagamento,
    a.valorPagamentoLiquido        = b.valorPagamentoLiquido,
    a.valorFinanceiro              = b.valorFinanceiro
  WHEN NOT MATCHED THEN INSERT (
    idPagamentoDocFiscal,
    idDocumentoFiscal,
    pagamentoTroco,
    sequencia,
    indicadorFormaPagamento,
    meioPagamento,
    condicaoPagamento,
    cobranca,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorEntradaMinima,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorFinanceiro)
  VALUES (
    b.idPagamentoDocFiscal,
    b.idDocumentoFiscal,
    b.pagamentoTroco,
    b.sequencia,
    b.indicadorFormaPagamento,
    b.meioPagamento,
    b.condicaoPagamento,
    b.cobranca,
    b.numeroParcelas,
    b.somaPrazoParcelas,
    b.valorXPrazoParcelas,
    b.prazoMedio,
    b.prazoMedioPonderado,
    b.valorEntradaMinima,
    b.valorPagamentoBruto,
    b.valorDescontoPagamento,
    b.valorOutrasDespesasPagamento,
    b.valorJurosPagamento,
    b.valorPagamentoLiquido,
    b.valorFinanceiro);
END ADD_DOC_FISC_PAG_GRAVA;

/

create or replace PROCEDURE ADD_PREVFIN_GRAVA (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idPrevisaoFinanceira        IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_dataEmissao                 IN DATE,
  p_prazoPadrao                 IN NUMBER,
  p_prazo                       IN NUMBER,
  p_vencimento                  IN DATE,
  p_contaFinanceira             IN VARCHAR2,
  p_pagamentoRecebimento        IN CHAR,
  p_operacaoFinanceira          IN NUMBER,
  p_complemento                 IN VARCHAR2,
  p_idPagamentoOrcamento        IN NUMBER,
  p_documento                   IN VARCHAR2,
  p_fatura                      IN VARCHAR2,
  p_parcelaAtual                IN NUMBER,
  p_parcelasTotais              IN NUMBER,
  p_pessoa                      IN NUMBER,
  p_autorizadoPessoa            IN NUMBER,
  p_cobranca                    IN NUMBER,
  p_meioPagamento               IN NUMBER,
  p_carteiraFinanceira          IN NUMBER,
  p_valor                       IN NUMBER,
  p_saldo                       IN NUMBER,
  p_indexador                   IN VARCHAR2,
  p_cotacao                     IN NUMBER,
  p_valorIndexado               IN NUMBER,
  p_saldoIndexado               IN NUMBER,
  p_efetivado                   IN NUMBER,
  p_tarifaDescontoAteVencimento IN NUMBER,
  p_tipoPagamentoAntecipado     IN CHAR,
  p_tarifaMensalDescAntecipado  IN NUMBER,
  p_tipoJuroDeMora              IN CHAR,
  p_tarifaMensalJuroDeMora      IN NUMBER,
  p_tarifaMulta                 IN NUMBER,
  p_valorFixoMulta              IN NUMBER,
  p_tarifaCartao                IN NUMBER,
  p_valorTarifaCartao           IN NUMBER,
  r_idPrevisaoFinanceira        OUT NUMBER)
IS
BEGIN
  r_idPrevisaoFinanceira := p_idPrevisaoFinanceira;
  IF r_idPrevisaoFinanceira = 0 THEN
    r_idPrevisaoFinanceira := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOPREVISOESFINANCEIRAS',
      'idPrevisaoFinanceira',
      14);
  END IF;
  MERGE INTO MOPREVISOESFINANCEIRAS a
  USING (
    SELECT
      r_idPrevisaoFinanceira        idPrevisaoFinanceira,
      p_estabelecimento             estabelecimento,
      p_dataEmissao                 dataEmissao,
      p_prazoPadrao                 prazoPadrao,
      p_prazo                       prazo,
      p_vencimento                  vencimento,
      p_contaFinanceira             contaFinanceira,
      p_pagamentoRecebimento        pagamentoRecebimento,
      p_operacaoFinanceira          operacaoFinanceira,
      p_complemento                 complemento,
      p_idPagamentoOrcamento        idPagamentoOrcamento,
      p_documento                   documento,
      p_fatura                      fatura,
      p_parcelaAtual                parcelaAtual,
      p_parcelasTotais              parcelasTotais,
      p_pessoa                      pessoa,
      p_autorizadoPessoa            autorizadoPessoa,
      p_cobranca                    cobranca,
      p_meioPagamento               meioPagamento,
      p_carteiraFinanceira          carteiraFinanceira,
      p_valor                       valor,
      p_saldo                       saldo,
      p_indexador                   indexador,
      p_cotacao                     cotacao,
      p_valorIndexado               valorIndexado,
      p_saldoIndexado               saldoIndexado,
      p_efetivado                   efetivado,
      p_tarifaDescontoAteVencimento tarifaDescontoAteVencimento,
      p_tipoPagamentoAntecipado     tipoPagamentoAntecipado,
      p_tarifaMensalDescAntecipado  tarifaMensalDescontoAntecipado,
      p_tipoJuroDeMora              tipoJuroDeMora,
      p_tarifaMensalJuroDeMora      tarifaMensalJuroDeMora,
      p_tarifaMulta                 tarifaMulta,
      p_valorFixoMulta              valorFixoMulta,
      p_tarifaCartao                tarifaCartao,
      p_valorTarifaCartao           valorTarifaCartao
    FROM DUAL) b
  ON (a.idPrevisaoFinanceira = b.idPrevisaoFinanceira)
  WHEN MATCHED THEN UPDATE SET 
    a.estabelecimento                = b.estabelecimento,
    a.dataEmissao                    = b.dataEmissao,
    a.prazoPadrao                    = b.prazoPadrao,
    a.prazo                          = b.prazo,
    a.vencimento                     = b.vencimento,
    a.contaFinanceira                = b.contaFinanceira,
    a.pagamentoRecebimento           = b.pagamentoRecebimento,
    a.operacaoFinanceira             = b.operacaoFinanceira,
    a.complemento                    = b.complemento,
    a.idPagamentoOrcamento           = b.idPagamentoOrcamento,
    a.documento                      = b.documento,
    a.fatura                         = b.fatura,
    a.parcelaAtual                   = b.parcelaAtual,
    a.parcelasTotais                 = b.parcelasTotais,
    a.pessoa                         = b.pessoa,
    a.autorizadoPessoa               = b.autorizadoPessoa,
    a.cobranca                       = b.cobranca,
    a.meioPagamento                  = b.meioPagamento,
    a.carteiraFinanceira             = b.carteiraFinanceira,
    a.valor                          = b.valor,
    a.saldo                          = b.saldo,
    a.indexador                      = b.indexador,
    a.cotacao                        = b.cotacao,
    a.valorIndexado                  = b.valorIndexado,
    a.saldoIndexado                  = b.saldoIndexado,
    a.efetivado                      = b.efetivado,
    a.tarifaDescontoAteVencimento    = b.tarifaDescontoAteVencimento,
    a.tipoPagamentoAntecipado        = b.tipoPagamentoAntecipado,
    a.tarifaMensalDescontoAntecipado = b.tarifaMensalDescontoAntecipado,
    a.tipoJuroDeMora                 = b.tipoJuroDeMora,
    a.tarifaMensalJuroDeMora         = b.tarifaMensalJuroDeMora,
    a.tarifaMulta                    = b.tarifaMulta,
    a.valorFixoMulta                 = b.valorFixoMulta,
    a.tarifaCartao                   = b.tarifaCartao,
    a.valorTarifaCartao              = b.valorTarifaCartao
  WHEN NOT MATCHED THEN INSERT (
    idPrevisaoFinanceira,
    estabelecimento,
    dataEmissao,
    prazoPadrao,
    prazo,
    vencimento,
    contaFinanceira,
    pagamentoRecebimento,
    operacaoFinanceira,
    complemento,
    idPagamentoOrcamento,
    documento,
    fatura,
    parcelaAtual,
    parcelasTotais,
    pessoa,
    autorizadoPessoa,
    cobranca,
    meioPagamento,
    carteiraFinanceira,
    valor,
    saldo,
    indexador,
    cotacao,
    valorIndexado,
    saldoIndexado,
    efetivado,
    tarifaDescontoAteVencimento,
    tipoPagamentoAntecipado,
    tarifaMensalDescontoAntecipado,
    tipoJuroDeMora,
    tarifaMensalJuroDeMora,
    tarifaMulta,
    valorFixoMulta,
    tarifaCartao,
    valorTarifaCartao)
  VALUES (
    b.idPrevisaoFinanceira,
    b.estabelecimento,
    b.dataEmissao,
    b.prazoPadrao,
    b.prazo,
    b.vencimento,
    b.contaFinanceira,
    b.pagamentoRecebimento,
    b.operacaoFinanceira,
    b.complemento,
    b.idPagamentoOrcamento,
    b.documento,
    b.fatura,
    b.parcelaAtual,
    b.parcelasTotais,
    b.pessoa,
    b.autorizadoPessoa,
    b.cobranca,
    b.meioPagamento,
    b.carteiraFinanceira,
    b.valor,
    b.saldo,
    b.indexador,
    b.cotacao,
    b.valorIndexado,
    b.saldoIndexado,
    b.efetivado,
    b.tarifaDescontoAteVencimento,
    b.tipoPagamentoAntecipado,
    b.tarifaMensalDescontoAntecipado,
    b.tipoJuroDeMora,
    b.tarifaMensalJuroDeMora,
    b.tarifaMulta,
    b.valorFixoMulta,
    b.tarifaCartao,
    b.valorTarifaCartao); 
END ADD_PREVFIN_GRAVA;

/

DROP PROCEDURE ADD_ORCAMENTO_PARCELAS_INSERE;
DROP PROCEDURE ADD_ORCAMENTO_PAGAMENTO_INSERE;
DROP PROCEDURE ADD_ORCAMENTO_TROCO_INSERE;

create or replace PROCEDURE ADD_ORCAMENTO_PAG_PRAZO_CALCUL (
  p_idPagamentoOrcamento IN NUMBER)
IS
  v_numeroParcelas      NUMBER;
  v_somaPrazoParcelas   NUMBER;
  v_valorXPrazoParcelas NUMBER;
BEGIN
  FOR a IN (
    SELECT
      orcamento,
      pagamentoTroco,
      numeroParcelas,
      somaPrazoParcelas,
      valorXPrazoParcelas
    FROM MOORCAMENTOXPAGAMENTOS
    WHERE idPagamentoOrcamento = p_idPagamentoOrcamento)
  LOOP
    SELECT
      COUNT (1),
      COALESCE (SUM (prazo), 0),
      COALESCE (SUM (prazo * valor), 0)
    INTO
      v_numeroParcelas,
      v_somaPrazoParcelas,
      v_valorXPrazoParcelas
    FROM MOPREVISOESFINANCEIRAS
    WHERE idPagamentoOrcamento = p_idPagamentoOrcamento;
    UPDATE MOORCAMENTOXPAGAMENTOS b SET
      b.numeroParcelas      = v_numeroParcelas,
      b.somaPrazoParcelas   = v_somaPrazoParcelas,
      b.valorXPrazoParcelas = v_valorXPrazoParcelas,
      b.prazoMedio =
        CASE
          WHEN v_numeroParcelas = 0
          THEN 0
          ELSE ROUND ((v_somaPrazoParcelas / v_numeroParcelas), 0)
        END,
      b.prazoMedioPonderado =
        CASE
          WHEN b.valorPagamentoLiquido = 0
          THEN 0
          ELSE ROUND ((v_valorXPrazoParcelas / b.valorPagamentoLiquido), 0)
        END
    WHERE b.idPagamentoOrcamento = p_idPagamentoOrcamento;
    IF a.pagamentoTroco = 'P' THEN
      UPDATE MOORCAMENTOS b SET
        b.numeroParcelas = b.numeroParcelas - a.numeroParcelas + v_numeroParcelas,
        b.somaPrazoParcelas = b.somaPrazoParcelas - a.somaPrazoParcelas + v_somaPrazoParcelas,
        b.valorXPrazoParcelas = b.valorXPrazoParcelas - a.valorXPrazoParcelas + v_valorXPrazoParcelas,
        b.prazoMedio =
          CASE
            WHEN (b.numeroParcelas - a.numeroParcelas + v_numeroParcelas) = 0
            THEN 0
            ELSE ROUND (((b.somaPrazoParcelas - a.somaPrazoParcelas + v_somaPrazoParcelas) / (b.numeroParcelas - a.numeroParcelas + v_numeroParcelas)), 0)
          END,
        b.prazoMedioPonderado =
          CASE
            WHEN b.valorPagamentoLiquido = 0
            THEN 0
            ELSE ROUND (((b.valorXPrazoParcelas - a.valorXPrazoParcelas + v_valorXPrazoParcelas) / b.valorPagamentoLiquido), 0)
          END
      WHERE b.orcamento = a.orcamento;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_PAG_PRAZO_CALCUL;

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_PRAZO_CALCULA (
  p_idPagamentoPreDocumento IN NUMBER)
IS
  v_numeroParcelas      NUMBER;
  v_somaPrazoParcelas   NUMBER;
  v_valorXPrazoParcelas NUMBER;
BEGIN
  FOR a IN (
    SELECT
      preDocumento,
      pagamentoTroco,
      numeroParcelas,
      somaPrazoParcelas,
      valorXPrazoParcelas
    FROM MOPREDOCUMXPAGAMENTOS
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento)
  LOOP
    SELECT
      COUNT (1),
      COALESCE (SUM (prazo), 0),
      COALESCE (SUM (prazo * valor), 0)
    INTO
      v_numeroParcelas,
      v_somaPrazoParcelas,
      v_valorXPrazoParcelas
    FROM MOFINANCEIROS
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
    UPDATE MOPREDOCUMXPAGAMENTOS b SET
      b.numeroParcelas      = v_numeroParcelas,
      b.somaPrazoParcelas   = v_somaPrazoParcelas,
      b.valorXPrazoParcelas = v_valorXPrazoParcelas,
      b.prazoMedio =
        CASE
          WHEN v_numeroParcelas = 0
          THEN 0
          ELSE ROUND ((v_somaPrazoParcelas / v_numeroParcelas), 0)
        END,
      b.prazoMedioPonderado =
        CASE
          WHEN b.valorPagamentoLiquido = 0
          THEN 0
          ELSE ROUND ((v_valorXPrazoParcelas / b.valorPagamentoLiquido), 0)
        END
    WHERE b.idPagamentoPreDocumento = p_idPagamentoPreDocumento;
    IF a.pagamentoTroco = 'P' THEN
      UPDATE MOPREDOCUMENTOS b SET
        b.numeroParcelas = b.numeroParcelas - a.numeroParcelas + v_numeroParcelas,
        b.somaPrazoParcelas = b.somaPrazoParcelas - a.somaPrazoParcelas + v_somaPrazoParcelas,
        b.valorXPrazoParcelas = b.valorXPrazoParcelas - a.valorXPrazoParcelas + v_valorXPrazoParcelas,
        b.prazoMedio =
          CASE
            WHEN (b.numeroParcelas - a.numeroParcelas + v_numeroParcelas) = 0
            THEN 0
            ELSE ROUND (((b.somaPrazoParcelas - a.somaPrazoParcelas + v_somaPrazoParcelas) / (b.numeroParcelas - a.numeroParcelas + v_numeroParcelas)), 0)
          END,
        b.prazoMedioPonderado =
          CASE
            WHEN b.valorPagamentoLiquido = 0
            THEN 0
            ELSE ROUND (((b.valorXPrazoParcelas - a.valorXPrazoParcelas + v_valorXPrazoParcelas) / b.valorPagamentoLiquido), 0)
          END
      WHERE b.preDocumento = a.preDocumento;
    END IF;
  END LOOP;
END ADD_PRE_DOC_PAG_PRAZO_CALCULA;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_PRAZO_CALCULA (
  p_idPagamentoDocFiscal IN NUMBER)
IS
  v_numeroParcelas      NUMBER;
  v_somaPrazoParcelas   NUMBER;
  v_valorXPrazoParcelas NUMBER;
BEGIN
  FOR a IN (
    SELECT
      idDocumentoFiscal,
      pagamentoTroco,
      numeroParcelas,
      somaPrazoParcelas,
      valorXPrazoParcelas
    FROM MODOCFISCALXPAGAMENTOS
    WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal)
  LOOP
    SELECT
      COUNT (1),
      COALESCE (SUM (prazo), 0),
      COALESCE (SUM (prazo * valor), 0)
    INTO
      v_numeroParcelas,
      v_somaPrazoParcelas,
      v_valorXPrazoParcelas
    FROM MOFINANCEIROS
    WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
    UPDATE MODOCFISCALXPAGAMENTOS b SET
      b.numeroParcelas      = v_numeroParcelas,
      b.somaPrazoParcelas   = v_somaPrazoParcelas,
      b.valorXPrazoParcelas = v_valorXPrazoParcelas,
      b.prazoMedio =
        CASE
          WHEN v_numeroParcelas = 0
          THEN 0
          ELSE ROUND ((v_somaPrazoParcelas / v_numeroParcelas), 0)
        END,
      b.prazoMedioPonderado =
        CASE
          WHEN b.valorPagamentoLiquido = 0
          THEN 0
          ELSE ROUND ((v_valorXPrazoParcelas / b.valorPagamentoLiquido), 0)
        END
    WHERE b.idPagamentoDocFiscal = p_idPagamentoDocFiscal;
    IF a.pagamentoTroco = 'P' THEN
      UPDATE MODOCUMENTOSFISCAIS b SET
        b.numeroParcelas = b.numeroParcelas - a.numeroParcelas + v_numeroParcelas,
        b.somaPrazoParcelas = b.somaPrazoParcelas - a.somaPrazoParcelas + v_somaPrazoParcelas,
        b.valorXPrazoParcelas = b.valorXPrazoParcelas - a.valorXPrazoParcelas + v_valorXPrazoParcelas,
        b.prazoMedio =
          CASE
            WHEN (b.numeroParcelas - a.numeroParcelas + v_numeroParcelas) = 0
            THEN 0
            ELSE ROUND (((b.somaPrazoParcelas - a.somaPrazoParcelas + v_somaPrazoParcelas) / (b.numeroParcelas - a.numeroParcelas + v_numeroParcelas)), 0)
          END,
        b.prazoMedioPonderado =
          CASE
            WHEN b.valorPagamentoLiquido = 0
            THEN 0
            ELSE ROUND (((b.valorXPrazoParcelas - a.valorXPrazoParcelas + v_valorXPrazoParcelas) / b.valorPagamentoLiquido), 0)
          END
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
  END LOOP;
END ADD_DOC_FISC_PAG_PRAZO_CALCULA;

/

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

/

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;
  v_parcela := 0;
  FOR a IN (
    SELECT
      parcela,
      prazoPadrao,
      prazo,
      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
    AND valor > 0
    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
      a.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
    SET idFinanceiro = v_idFinanceiro
    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 parcela = v_parcela;
  END LOOP;
END ADD_PRE_DOC_PAG_TEMPPAR_EFET;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_TEMPPAR_EFET (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_idPagamentoDocFiscal         IN NUMBER,
  p_cartao_credenciadoraCartao   IN NUMBER,
  p_cartao_bandeiraCartaoDebCred IN NUMBER,
  p_cartao_transacaoCartaoNSU    IN VARCHAR2,
  p_cartao_autorizacaoCartao     IN VARCHAR2,
  p_cartao_tarifaCartao          IN NUMBER,
  p_cartaoProprio_cartaoProprio  IN VARCHAR2,
  p_idFinanceiroAdiantamento     IN NUMBER)
IS
  v_pag_idDocumentoFiscal        NUMBER;
  v_pag_pagamentoTroco           CHAR (1);
  v_pag_sequencia                NUMBER;
  v_pag_meioPagamento            NUMBER;
  v_pag_cobranca                 NUMBER;
  v_pag_numeroParcelas           NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_sessaoCaixa              NUMBER;
  v_cab_fatoContabil             NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_autorizadoPessoa         NUMBER;
  v_cab_contratoCompra           NUMBER;
  v_cab_contaFinanceira          VARCHAR2 (60);
  v_cond_contaFinanceira         VARCHAR2 (60);
  v_cond_carteiraFinanceira      NUMBER;
  v_cond_tarifaDescontoAteVenc   NUMBER;
  v_cond_tipoPagamentoAntecipado CHAR (1);
  v_cond_tarifaMensalDescAntecip NUMBER;
  v_cond_tipoJuroDeMora          CHAR (1);
  v_cond_tarifaMensalJuroDeMora  NUMBER;
  v_cond_tarifaMulta             NUMBER;
  v_cond_valorFixoMulta          NUMBER;
  v_cond_diasToleranciaJurosMult NUMBER;
  v_orc_pessoa                   NUMBER;
  v_orc_autorizadoPessoa         NUMBER;
  v_parcela                      NUMBER;
  v_idFinanceiro                 NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  SELECT
    pag.idDocumentoFiscal,
    pag.pagamentoTroco,
    pag.sequencia,
    pag.meioPagamento,
    pag.cobranca,
    pag.numeroParcelas,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.sessaoCaixa,
    cab.fatoContabil,
    cab.estabelecimento,
    cab.documentoFiscal,
    cab.dataEmissao,
    cab.dataEntradaSaida,
    cab.pessoa,
    cab.autorizadoPessoa,
    cab.contratoCompra,
    cab.contaFinanceira,
    cond.contaFinanceira,
    cond.carteiraFinanceira,
    cond.tarifaDescontoAteVencimento,
    cond.tipoPagamentoAntecipado,
    cond.tarifaMensalDescontoAntecipado,
    cond.tipoJuroDeMora,
    cond.tarifaMensalJuroDeMora,
    cond.tarifaMulta,
    cond.valorFixoMulta,
    cond.diasToleranciaJurosMulta
  INTO
    v_pag_idDocumentoFiscal,
    v_pag_pagamentoTroco,
    v_pag_sequencia,
    v_pag_meioPagamento,
    v_pag_cobranca,
    v_pag_numeroParcelas,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_sessaoCaixa,
    v_cab_fatoContabil,
    v_cab_estabelecimento,
    v_cab_documentoFiscal,
    v_cab_dataEmissao,
    v_cab_dataEntradaSaida,
    v_cab_pessoa,
    v_cab_autorizadoPessoa,
    v_cab_contratoCompra,
    v_cab_contaFinanceira,
    v_cond_contaFinanceira,
    v_cond_carteiraFinanceira,
    v_cond_tarifaDescontoAteVenc,
    v_cond_tipoPagamentoAntecipado,
    v_cond_tarifaMensalDescAntecip,
    v_cond_tipoJuroDeMora,
    v_cond_tarifaMensalJuroDeMora,
    v_cond_tarifaMulta,
    v_cond_valorFixoMulta,
    v_cond_diasToleranciaJurosMult
  FROM MODOCFISCALXPAGAMENTOS pag
  JOIN MODOCUMENTOSFISCAIS cab
  ON cab.idDocumentoFiscal = pag.idDocumentoFiscal
  JOIN PACONDICOESPAGAMENTO cond
  ON cond.condicaoPagamento = pag.condicaoPagamento
  WHERE pag.idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  SELECT
    COALESCE (MAX (orc.pessoa), 0),
    COALESCE (MAX (orc.autorizadoPessoa), 0)
  INTO
    v_orc_pessoa,
    v_orc_autorizadoPessoa
  FROM MODOCFISCALXITENS itemDoc
  JOIN MODOCFISCALXORCAMENTOITEM docXOrc
  ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
  JOIN MOORCAMENTOXITENS itemOrc
  ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
  JOIN MOORCAMENTOS orc
  ON orc.orcamento = itemOrc.orcamento
  WHERE itemDoc.idDocumentoFiscal = v_pag_idDocumentoFiscal
  AND docXOrc.quantidade <> 0;
  v_parcela := 0;
  FOR a IN (
    SELECT
      parcela,
      prazoPadrao,
      prazo,
      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
    AND valor > 0
    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
      a.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
    SET idFinanceiro = v_idFinanceiro
    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 parcela = v_parcela;
  END LOOP;
END ADD_DOC_FISC_PAG_TEMPPAR_EFET;

/

create or replace PROCEDURE ADD_FINANC_PAG_TEMPPAR_EFET (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_pagamentoRecebimento         IN CHAR,
  p_operacaoFinanceira           IN NUMBER,
  p_documento                    IN VARCHAR2,
  p_carteiraFinanceira           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_idFinanceiroCorrelato        IN NUMBER,
  p_idFinanceiroAdiantamento     IN NUMBER,
  p_idPagamentoPreDocumento      IN NUMBER,
  p_idPagamentoDocFiscal         IN NUMBER,
  p_pag_pagamentoTroco           IN CHAR,
  p_pag_sequencia                IN NUMBER,
  p_pag_meioPagamento            IN NUMBER,
  p_pag_condicaoPagamento        IN NUMBER,
  p_pag_cobranca                 IN NUMBER,
  p_cab_sessaoCaixa              IN NUMBER,
  p_cab_fatoContabil             IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_autorizadoPessoa         IN NUMBER,
  p_cab_contratoCompra           IN NUMBER,
  p_cab_contaFinanceira          IN VARCHAR2,
  r_idsFinanceiroInseridos       OUT CLOB)
IS
  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_numeroParcelas               NUMBER;
  v_parcela                      NUMBER;
  v_idFinanceiro                 NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  r_idsFinanceiroInseridos := ' ';
  SELECT
    cond.contaFinanceira,
    cond.carteiraFinanceira,
    cond.tarifaDescontoAteVencimento,
    cond.tipoPagamentoAntecipado,
    cond.tarifaMensalDescontoAntecipado,
    cond.tipoJuroDeMora,
    cond.tarifaMensalJuroDeMora,
    cond.tarifaMulta,
    cond.valorFixoMulta,
    cond.diasToleranciaJurosMulta
  INTO
    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 PACONDICOESPAGAMENTO cond
  WHERE cond.condicaoPagamento = p_pag_condicaoPagamento;
  SELECT COUNT (1)
  INTO v_numeroParcelas
  FROM TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessaoTEMPPARCELAS
  AND origem = 'F'
  AND idCabecalho = 0
  AND pagamentoTroco = p_pag_pagamentoTroco
  AND sequencia = p_pag_sequencia
  AND valor > 0;
  v_parcela := 0;
  FOR a IN (
    SELECT
      parcela,
      prazoPadrao,
      prazo,
      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 = 'F'
    AND idCabecalho = 0
    AND pagamentoTroco = p_pag_pagamentoTroco
    AND sequencia = p_pag_sequencia
    AND valor > 0
    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
      p_cab_sessaoCaixa,
      p_cab_fatoContabil,
      p_cab_estabelecimento,
      CASE WHEN p_cab_dataEntradaSaida IS NULL THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_financ_data
      p_cab_dataEmissao,
      a.prazoPadrao,
      CASE WHEN p_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END - p_cab_dataEmissao, -- p_financ_prazo
      CASE WHEN p_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END, -- p_financ_vencimento
      CASE WHEN p_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END, -- p_financ_vencimentoNegociado
      CASE WHEN p_pag_meioPagamento IN (41,42,43) THEN a.chequeBomPara ELSE a.vencimento END + v_cond_diasToleranciaJurosMult, -- p_financ_naoCobrarJurosMultaAt
      CASE WHEN p_cab_contaFinanceira = ' ' THEN v_cond_contaFinanceira ELSE p_cab_contaFinanceira END, -- p_financ_contaFinanceira
      p_pagamentoRecebimento,
      p_operacaoFinanceira,
      a.complementoFinanceiro,
      p_cab_contratoCompra,
      p_idPagamentoPreDocumento,
      p_idPagamentoDocFiscal,     
      p_documento, -- p_financ_documento
      p_documento, -- p_financ_fatura
      a.parcela, -- p_financ_parcelaAtual
      v_numeroParcelas, -- p_financ_parcelasTotais
      p_cab_pessoa, -- p_financ_pessoa
      p_cab_autorizadoPessoa, -- p_financ_autorizadoPessoa
      p_pag_cobranca,
      p_pag_meioPagamento,
      CASE WHEN p_carteiraFinanceira = 0 THEN v_cond_carteiraFinanceira ELSE p_carteiraFinanceira END,
      a.valor,
      0, -- p_financ_valorDesconto
      0, -- p_financ_valorAcrescimo
      a.valor - CASE WHEN p_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
      p_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
    SET idFinanceiro = v_idFinanceiro
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND origem = 'F'
    AND idCabecalho = 0
    AND pagamentoTroco = p_pag_pagamentoTroco
    AND sequencia = p_pag_sequencia
    AND parcela = v_parcela;
    IF r_idsFinanceiroInseridos IS NULL
      OR r_idsFinanceiroInseridos = ' '
    THEN
      r_idsFinanceiroInseridos := LPAD(v_idFinanceiro, 14, '0');
    ELSE
      r_idsFinanceiroInseridos := r_idsFinanceiroInseridos || ',' || LPAD(v_idFinanceiro, 14, '0');
    END IF;
  END LOOP;
  IF p_idPagamentoPreDocumento > 0 THEN
    ADD_PRE_DOC_PAG_PRAZO_CALCULA (
      p_idPagamentoPreDocumento);
  END IF;
  IF p_idPagamentoDocFiscal > 0 THEN
    ADD_DOC_FISC_PAG_PRAZO_CALCULA (
      p_idPagamentoDocFiscal);
  END IF;
END ADD_FINANC_PAG_TEMPPAR_EFET;

/

create or replace PROCEDURE ADD_TEMPPARCELAS_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_origem                       IN CHAR,
  p_idCabecalho                  IN NUMBER,
  p_pagamentoTroco               IN CHAR,
  p_sequencia                    IN NUMBER,
  p_parcela                      IN NUMBER,
  p_prazoPadrao                  IN NUMBER,
  p_prazo                        IN NUMBER,
  p_vencimento                   IN DATE,
  p_baixaAutomatica              IN NUMBER,
  p_percentualRateioOriginal     IN NUMBER,
  p_valor                        IN NUMBER,
  p_complementoFinanceiro        IN VARCHAR,
  p_idPrevisaoFinanceira         IN NUMBER,
  p_idFinanceiro                 IN NUMBER,
  p_idTransacaoTef               IN NUMBER,
  p_chequeCompensacao            IN VARCHAR,
  p_chequeBanco                  IN VARCHAR,
  p_chequeAgenciaBanco           IN VARCHAR,
  p_chequeC1                     IN NUMBER,
  p_chequeContaBanco             IN VARCHAR,
  p_chequeC2                     IN NUMBER,
  p_cheque                       IN NUMBER,
  p_chequeC3                     IN NUMBER,
  p_chequeBomPara                IN DATE,
  p_chequeIndicadorPessoa        IN CHAR,
  p_chequeTitular                IN VARCHAR,
  p_chequeIndicadorDocumentoPess IN CHAR,
  p_chequeCnpjCpfIdEstrangeiro   IN VARCHAR,
  p_chequeFone                   IN VARCHAR,
  p_chequeDesde                  IN DATE,
  p_chequeAutenticacao           IN VARCHAR,
  p_chequeIndicadorFone          IN NUMBER,
  p_chequeOperacaoTelefonia      IN NUMBER,
  p_chequeObservacaoFone         IN VARCHAR,
  p_linhaDigitavelBoleto         IN VARCHAR2)
IS
BEGIN
  MERGE INTO TEMPPARCELAS a
  USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      p_contadorSessaoTEMPPARCELAS   contadorSessao,
      p_origem                       origem,
      p_idCabecalho                  idCabecalho,
      p_pagamentoTroco               pagamentoTroco,
      p_sequencia                    sequencia,
      p_parcela                      parcela,
      p_prazoPadrao                  prazoPadrao,
      p_prazo                        prazo,
      p_vencimento                   vencimento,
      p_baixaAutomatica              baixaAutomatica,
      p_percentualRateioOriginal     percentualRateioOriginal,
      p_valor                        valor,
      p_complementoFinanceiro        complementoFinanceiro,
      p_idPrevisaoFinanceira         idPrevisaoFinanceira,
      p_idFinanceiro                 idFinanceiro,
      p_idTransacaoTef               idTransacaoTef,
      p_chequeCompensacao            chequeCompensacao,
      p_chequeBanco                  chequeBanco,
      p_chequeAgenciaBanco           chequeAgenciaBanco,
      p_chequeC1                     chequeC1,
      p_chequeContaBanco             chequeContaBanco,
      p_chequeC2                     chequeC2,
      p_cheque                       cheque,
      p_chequeC3                     chequeC3,
      p_chequeBomPara                chequeBomPara,
      p_chequeIndicadorPessoa        chequeIndicadorPessoa,
      p_chequeTitular                chequeTitular,
      p_chequeIndicadorDocumentoPess chequeIndicadorDocumentoPessoa,
      p_chequeCnpjCpfIdEstrangeiro   chequeCnpjCpfIdEstrangeiro,
      p_chequeFone                   chequeFone,
      p_chequeDesde                  chequeDesde,
      p_chequeAutenticacao           chequeAutenticacao,
      p_chequeIndicadorFone          chequeIndicadorFone,
      p_chequeOperacaoTelefonia      chequeOperacaoTelefonia,
      p_chequeObservacaoFone         chequeObservacaoFone,
      p_linhaDigitavelBoleto         linhaDigitavelBoleto
    FROM DUAL) b
  ON (  a.sessaoClient   = b.sessaoClient
    AND a.contadorSessao = b.contadorSessao
    AND a.origem         = b.origem
    AND a.idCabecalho    = b.idCabecalho
    AND a.pagamentoTroco = b.pagamentoTroco
    AND a.sequencia      = b.sequencia
    AND a.parcela        = b.parcela)
  WHEN MATCHED THEN UPDATE SET
    a.prazoPadrao                    = b.prazoPadrao,
    a.prazo                          = b.prazo,
    a.vencimento                     = b.vencimento,
    a.baixaAutomatica                = b.baixaAutomatica,
    a.percentualRateioOriginal       = b.percentualRateioOriginal,
    a.valor                          = b.valor,
    a.complementoFinanceiro          = b.complementoFinanceiro,
    a.idPrevisaoFinanceira           = b.idPrevisaoFinanceira,
    a.idFinanceiro                   = b.idFinanceiro,
    a.idTransacaoTef                 = b.idTransacaoTef,
    a.chequeCompensacao              = b.chequeCompensacao,
    a.chequeBanco                    = b.chequeBanco,
    a.chequeAgenciaBanco             = b.chequeAgenciaBanco,
    a.chequeC1                       = b.chequeC1,
    a.chequeContaBanco               = b.chequeContaBanco,
    a.chequeC2                       = b.chequeC2,
    a.cheque                         = b.cheque,
    a.chequeC3                       = b.chequeC3,
    a.chequeBomPara                  = b.chequeBomPara,
    a.chequeIndicadorPessoa          = b.chequeIndicadorPessoa,
    a.chequeTitular                  = b.chequeTitular,
    a.chequeIndicadorDocumentoPessoa = b.chequeIndicadorDocumentoPessoa,
    a.chequeCnpjCpfIdEstrangeiro     = b.chequeCnpjCpfIdEstrangeiro,
    a.chequeFone                     = b.chequeFone,
    a.chequeDesde                    = b.chequeDesde,
    a.chequeAutenticacao             = b.chequeAutenticacao,
    a.chequeIndicadorFone            = b.chequeIndicadorFone,
    a.chequeOperacaoTelefonia        = b.chequeOperacaoTelefonia,
    a.chequeObservacaoFone           = b.chequeObservacaoFone,
    a.linhaDigitavelBoleto           = b.linhaDigitavelBoleto
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    contadorSessao,
    origem,
    idCabecalho,
    pagamentoTroco,
    sequencia,
    parcela,
    prazoPadrao,
    prazo,
    vencimento,
    baixaAutomatica,
    percentualRateioOriginal,
    valor,
    complementoFinanceiro,
    idPrevisaoFinanceira,
    idFinanceiro,
    idTransacaoTef,
    chequeCompensacao,
    chequeBanco,
    chequeAgenciaBanco,
    chequeC1,
    chequeContaBanco,
    chequeC2,
    cheque,
    chequeC3,
    chequeBomPara,
    chequeIndicadorPessoa,
    chequeTitular,
    chequeIndicadorDocumentoPessoa,
    chequeCnpjCpfIdEstrangeiro,
    chequeFone,
    chequeDesde,
    chequeAutenticacao,
    chequeIndicadorFone,
    chequeOperacaoTelefonia,
    chequeObservacaoFone,
    linhaDigitavelBoleto)
  VALUES (
    b.sessaoClient,
    b.contadorSessao,
    b.origem,
    b.idCabecalho,
    b.pagamentoTroco,
    b.sequencia,
    b.parcela,
    b.prazoPadrao,
    b.prazo,
    b.vencimento,
    b.baixaAutomatica,
    b.percentualRateioOriginal,
    b.valor,
    b.complementoFinanceiro,
    b.idPrevisaoFinanceira,
    b.idFinanceiro,
    b.idTransacaoTef,
    b.chequeCompensacao,
    b.chequeBanco,
    b.chequeAgenciaBanco,
    b.chequeC1,
    b.chequeContaBanco,
    b.chequeC2,
    b.cheque,
    b.chequeC3,
    b.chequeBomPara,
    b.chequeIndicadorPessoa,
    b.chequeTitular,
    b.chequeIndicadorDocumentoPessoa,
    b.chequeCnpjCpfIdEstrangeiro,
    b.chequeFone,
    b.chequeDesde,
    b.chequeAutenticacao,
    b.chequeIndicadorFone,
    b.chequeOperacaoTelefonia,
    b.chequeObservacaoFone,
    b.linhaDigitavelBoleto);
END ADD_TEMPPARCELAS_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_PAG_TEMPPAR_GERA (
  p_sessaoClient               IN VARCHAR2,
  p_contadorSessaoTEMPPARCELAS IN NUMBER,
  p_idPagamentoOrcamento       IN NUMBER)
IS
BEGIN
  FOR a IN (
    SELECT
      pag.orcamento,
      pag.pagamentoTroco,
      pag.sequencia,
      parc.parcelaAtual,
      parc.idPrevisaoFinanceira,
      parc.prazoPadrao,
      parc.prazo,
      parc.vencimento,
      parc.valor,
      parc.complemento
    FROM MOPREVISOESFINANCEIRAS parc
    JOIN MOORCAMENTOXPAGAMENTOS pag
    ON pag.idPagamentoOrcamento = parc.idPagamentoOrcamento
    WHERE parc.idPagamentoOrcamento = p_idPagamentoOrcamento
    ORDER BY parc.parcelaAtual)
  LOOP
    ADD_TEMPPARCELAS_GRAVA (
      p_sessaoClient,
      p_contadorSessaoTEMPPARCELAS,
      'O', -- p_origem
      a.orcamento, -- p_idCabecalho
      a.pagamentoTroco,
      a.sequencia,
      a.parcelaAtual,
      a.prazoPadrao,
      a.prazo,
      a.vencimento,
      0, -- p_baixaAutomatica
      0, -- p_percentualRateioOriginal
      a.valor,
      a.complemento,
      a.idPrevisaoFinanceira,
      0, -- p_idFinanceiro
      0, -- p_idTransacaoTef
      ' ', -- p_chequeCompensacao
      ' ', -- p_chequeBanco
      ' ', -- p_chequeAgenciaBanco
      0, -- p_chequeC1
      ' ', -- p_chequeContaBanco
      0, -- p_chequeC2
      0, -- p_cheque
      0, -- p_chequeC3
      a.vencimento, -- p_chequeBomPara
      'F', -- p_chequeIndicadorPessoa
      ' ', -- p_chequeTitular
      'C', -- p_chequeIndicadorDocumentoPess
      ' ', -- p_chequeCnpjCpfIdEstrangeiro
      ' ', -- p_chequeFone
      NULL, -- p_chequeDesde
      ' ', -- p_chequeAutenticacao
      0, -- p_chequeIndicadorFone
      0, -- p_chequeOperacaoTelefonia
      ' ', -- p_chequeObservacaoFone
      ' '); -- p_linhaDigitavelBoleto
  END LOOP;
END ADD_ORCAMENTO_PAG_TEMPPAR_GERA;

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_TEMPPAR_GERA (
  p_sessaoClient               IN VARCHAR2,
  p_contadorSessaoTEMPPARCELAS IN NUMBER,
  p_idPagamentoPreDocumento    IN NUMBER)
IS
BEGIN
  FOR a IN (
    SELECT
      pag.preDocumento,
      pag.pagamentoTroco,
      pag.sequencia,
      parc.parcelaAtual,
      parc.idFinanceiro,
      parc.prazoPadrao,
      parc.prazo,
      parc.vencimento,
      parc.valor,
      parc.complemento
    FROM MOFINANCEIROS parc
    JOIN MOPREDOCUMXPAGAMENTOS pag
    ON pag.idPagamentoPreDocumento = parc.idPagamentoPreDocumento
    WHERE parc.idPagamentoPreDocumento = p_idPagamentoPreDocumento
    ORDER BY parc.parcelaAtual)
  LOOP
    ADD_TEMPPARCELAS_GRAVA (
      p_sessaoClient,
      p_contadorSessaoTEMPPARCELAS,
      'P', -- p_origem
      a.preDocumento, -- p_idCabecalho
      a.pagamentoTroco,
      a.sequencia,
      a.parcelaAtual,
      a.prazoPadrao,
      a.prazo,
      a.vencimento,
      0, -- p_baixaAutomatica
      0, -- p_percentualRateioOriginal
      a.valor,
      a.complemento,
      0, -- p_idPrevisaoFinanceira,
      a.idFinanceiro,
      0, -- p_idTransacaoTef
      ' ', -- p_chequeCompensacao
      ' ', -- p_chequeBanco
      ' ', -- p_chequeAgenciaBanco
      0, -- p_chequeC1
      ' ', -- p_chequeContaBanco
      0, -- p_chequeC2
      0, -- p_cheque
      0, -- p_chequeC3
      a.vencimento, -- p_chequeBomPara
      'F', -- p_chequeIndicadorPessoa
      ' ', -- p_chequeTitular
      'C', -- p_chequeIndicadorDocumentoPess
      ' ', -- p_chequeCnpjCpfIdEstrangeiro
      ' ', -- p_chequeFone
      NULL, -- p_chequeDesde
      ' ', -- p_chequeAutenticacao
      0, -- p_chequeIndicadorFone
      0, -- p_chequeOperacaoTelefonia
      ' ', -- p_chequeObservacaoFone
      ' '); -- p_linhaDigitavelBoleto
  END LOOP;
END ADD_PRE_DOC_PAG_TEMPPAR_GERA;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_TEMPPAR_GERA (
  p_sessaoClient               IN VARCHAR2,
  p_contadorSessaoTEMPPARCELAS IN NUMBER,
  p_idPagamentoDocFiscal       IN NUMBER)
IS
BEGIN
  FOR a IN (
    SELECT
      pag.idDocumentoFiscal,
      pag.pagamentoTroco,
      pag.sequencia,
      parc.parcelaAtual,
      parc.idFinanceiro,
      parc.prazoPadrao,
      parc.prazo,
      parc.vencimento,
      parc.valor,
      parc.complemento
    FROM MOFINANCEIROS parc
    JOIN MODOCFISCALXPAGAMENTOS pag
    ON pag.idPagamentoDocFiscal = parc.idPagamentoDocFiscal
    WHERE parc.idPagamentoDocFiscal = p_idPagamentoDocFiscal
    ORDER BY parc.parcelaAtual)
  LOOP
    ADD_TEMPPARCELAS_GRAVA (
      p_sessaoClient,
      p_contadorSessaoTEMPPARCELAS,
      'D', -- p_origem
      a.idDocumentoFiscal, -- p_idCabecalho
      a.pagamentoTroco,
      a.sequencia,
      a.parcelaAtual,
      a.prazoPadrao,
      a.prazo,
      a.vencimento,
      0, -- p_baixaAutomatica
      0, -- p_percentualRateioOriginal
      a.valor,
      a.complemento,
      0, -- p_idPrevisaoFinanceira,
      a.idFinanceiro,
      0, -- p_idTransacaoTef
      ' ', -- p_chequeCompensacao
      ' ', -- p_chequeBanco
      ' ', -- p_chequeAgenciaBanco
      0, -- p_chequeC1
      ' ', -- p_chequeContaBanco
      0, -- p_chequeC2
      0, -- p_cheque
      0, -- p_chequeC3
      a.vencimento, -- p_chequeBomPara
      'F', -- p_chequeIndicadorPessoa
      ' ', -- p_chequeTitular
      'C', -- p_chequeIndicadorDocumentoPess
      ' ', -- p_chequeCnpjCpfIdEstrangeiro
      ' ', -- p_chequeFone
      NULL, -- p_chequeDesde
      ' ', -- p_chequeAutenticacao
      0, -- p_chequeIndicadorFone
      0, -- p_chequeOperacaoTelefonia
      ' ', -- p_chequeObservacaoFone
      ' '); -- p_linhaDigitavelBoleto
  END LOOP;
END ADD_DOC_FISC_PAG_TEMPPAR_GERA;

/

create or replace PROCEDURE ADD_ORCAMENTO_PAG_TEMPPAR_CAB (
  p_sessaoClient               IN VARCHAR2,
  p_contadorSessaoTEMPPARCELAS IN NUMBER,
  p_orcamento                  IN NUMBER)
IS
BEGIN
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessaoTEMPPARCELAS
  AND origem = 'O'
  AND idCabecalho = p_orcamento;
  FOR a IN (
    SELECT idPagamentoOrcamento
    FROM MOORCAMENTOXPAGAMENTOS
    WHERE orcamento = p_orcamento
    ORDER BY
      pagamentoTroco,
      sequencia)
  LOOP
    ADD_ORCAMENTO_PAG_TEMPPAR_GERA (
      p_sessaoClient,
      p_contadorSessaoTEMPPARCELAS,
      a.idPagamentoOrcamento);
  END LOOP;
END ADD_ORCAMENTO_PAG_TEMPPAR_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_TEMPPAR_CAB (
  p_sessaoClient               IN VARCHAR2,
  p_contadorSessaoTEMPPARCELAS IN NUMBER,
  p_preDocumento               IN NUMBER)
IS
BEGIN
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessaoTEMPPARCELAS
  AND origem = 'P'
  AND idCabecalho = p_preDocumento;
  FOR a IN (
    SELECT idPagamentoPreDocumento
    FROM MOPREDOCUMXPAGAMENTOS
    WHERE preDocumento = p_preDocumento
    ORDER BY
      pagamentoTroco,
      sequencia)
  LOOP
    ADD_PRE_DOC_PAG_TEMPPAR_GERA (
      p_sessaoClient,
      p_contadorSessaoTEMPPARCELAS,
      a.idPagamentoPreDocumento);
  END LOOP;
END ADD_PRE_DOC_PAG_TEMPPAR_CAB;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_TEMPPAR_CAB (
  p_sessaoClient               IN VARCHAR2,
  p_contadorSessaoTEMPPARCELAS IN NUMBER,
  p_idDocumentoFiscal          IN NUMBER)
IS
BEGIN
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessaoTEMPPARCELAS
  AND origem = 'D'
  AND idCabecalho = p_idDocumentoFiscal;
  FOR a IN (
    SELECT idPagamentoDocFiscal
    FROM MODOCFISCALXPAGAMENTOS
    WHERE idDocumentoFiscal = p_idDocumentoFiscal
    ORDER BY
      pagamentoTroco,
      sequencia)
  LOOP
    ADD_DOC_FISC_PAG_TEMPPAR_GERA (
      p_sessaoClient,
      p_contadorSessaoTEMPPARCELAS,
      a.idPagamentoDocFiscal);
  END LOOP;
END ADD_DOC_FISC_PAG_TEMPPAR_CAB;

/

create or replace PROCEDURE ADD_TEMPPARCELAS_RECALCULA (
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_origem                       IN CHAR,
  p_idCabecalho                  IN NUMBER,
  p_pagamentoTroco               IN CHAR,
  p_sequencia                    IN NUMBER,
  p_condicaoPagamento            IN NUMBER,
  p_valorFinanceiro              IN NUMBER,
  r_somaValorParcelas            OUT NUMBER)
IS
  v_cond_casasDecimaisArredondam NUMBER;
  v_cond_residuoParcela          CHAR (1);
  v_numeroParcelas               NUMBER;
  v_valorResiduoPorParcela       NUMBER;
  v_numeroParcelasSomarUmCentavo NUMBER;
  v_valorSomar                   NUMBER;
BEGIN
  r_somaValorParcelas := 0;
  v_numeroParcelas    := 0;
  SELECT
    COALESCE ( MAX (casasDecimaisArredondamento), 0),
    COALESCE ( MAX (residuoParcela), ' ')
  INTO
    v_cond_casasDecimaisArredondam,
    v_cond_residuoParcela
  FROM PACONDICOESPAGAMENTO
  WHERE condicaoPagamento = p_condicaoPagamento;
  FOR a IN (
    SELECT
      parcela,
      prazo,
      percentualRateioOriginal
    FROM TEMPPARCELAS
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND origem = p_origem
    AND idCabecalho = p_idCabecalho
    AND pagamentoTroco = p_pagamentoTroco
    AND sequencia = p_sequencia
    ORDER BY parcela)
  LOOP
    UPDATE TEMPPARCELAS b
    SET b.valor = TRUNC (p_valorFinanceiro * a.percentualRateioOriginal / 100, 2 - v_cond_casasDecimaisArredondam)
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessaoTEMPPARCELAS
    AND b.origem = p_origem
    AND b.idCabecalho = p_idCabecalho
    AND b.pagamentoTroco = p_pagamentoTroco
    AND b.sequencia = p_sequencia
    AND b.parcela = a.parcela;
    r_somaValorParcelas := r_somaValorParcelas + TRUNC (p_valorFinanceiro * a.percentualRateioOriginal / 100, 2 - v_cond_casasDecimaisArredondam);
    v_numeroParcelas := v_numeroParcelas + 1;
  END LOOP;
  IF p_valorFinanceiro <> r_somaValorParcelas
    AND v_numeroParcelas > 0
  THEN
    IF v_cond_residuoParcela IN ('P','U') THEN
      UPDATE TEMPPARCELAS
      SET valor = valor + p_valorFinanceiro - r_somaValorParcelas
      WHERE sessaoClient = p_sessaoClient
      AND contadorSessao = p_contadorSessaoTEMPPARCELAS
      AND origem = p_origem
      AND idCabecalho = p_idCabecalho
      AND pagamentoTroco = p_pagamentoTroco
      AND sequencia = p_sequencia
      AND parcela = CASE WHEN v_cond_residuoParcela = 'P' THEN 1 ELSE v_numeroParcelas END;
      r_somaValorParcelas := p_valorFinanceiro;
    ELSE
      v_valorResiduoPorParcela := TRUNC ((p_valorFinanceiro - r_somaValorParcelas ) / v_numeroParcelas, 2) +
        CASE
          WHEN ((p_valorFinanceiro - r_somaValorParcelas ) / v_numeroParcelas) >
            TRUNC ((p_valorFinanceiro - r_somaValorParcelas ) / v_numeroParcelas, 2)
          THEN 0.01
          ELSE 0
        END;
      v_numeroParcelasSomarUmCentavo := (p_valorFinanceiro - r_somaValorParcelas - v_valorResiduoPorParcela) * 100;
      FOR a IN (
        SELECT
          parcela,
          prazo
        FROM TEMPPARCELAS
        WHERE sessaoClient = p_sessaoClient
        AND contadorSessao = p_contadorSessaoTEMPPARCELAS
        AND origem = p_origem
        AND idCabecalho = p_idCabecalho
        AND pagamentoTroco = p_pagamentoTroco
        AND sequencia = p_sequencia
        ORDER BY parcela)
      LOOP
        v_valorSomar := v_valorResiduoPorParcela;
        IF a.parcela <= v_numeroParcelasSomarUmCentavo THEN
          v_valorSomar := v_valorSomar + 0.01;
        END IF;
        IF v_valorSomar > p_valorFinanceiro - r_somaValorParcelas
        OR a.parcela = v_numeroParcelas
        THEN
          v_valorSomar := p_valorFinanceiro - r_somaValorParcelas;
        END IF;
        IF v_valorSomar <> 0 THEN
          UPDATE TEMPPARCELAS b
          SET b.valor = b.valor + v_valorSomar
          WHERE b.sessaoClient = p_sessaoClient
          AND b.contadorSessao = p_contadorSessaoTEMPPARCELAS
          AND b.origem = p_origem
          AND b.idCabecalho = p_idCabecalho
          AND b.pagamentoTroco = p_pagamentoTroco
          AND b.sequencia = p_sequencia
          AND b.parcela = a.parcela;
          r_somaValorParcelas := r_somaValorParcelas + v_valorSomar;
        END IF;
      END LOOP;
    END IF;
  END IF;
END ADD_TEMPPARCELAS_RECALCULA;

/

create or replace PROCEDURE ADD_ORCAMENTO_PAG_INSERE (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_171_apenasDinheiroAVi IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_contadorSessaoTEMPPROMOCOES  IN NUMBER,
  p_orcamento                    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_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_idPagamentoOrcamento         OUT NUMBER,
  r_mensagemErro                 OUT VARCHAR2)
IS
  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_sequencia                  NUMBER;
  v_indicadorFormaPagamento    CHAR (1);
  v_meioPagamento              NUMBER;
  v_numeroParcelas             NUMBER;
  v_somaPrazoParcelas          NUMBER;
  v_valorXPrazoParcelas        NUMBER;
  v_troco_valorFinanceiro      NUMBER;
  v_auxNumber                  NUMBER;
BEGIN
  r_idPagamentoOrcamento := 0;
  r_mensagemErro := ' ';
  IF p_sequencia > 0 THEN
    SELECT COALESCE (MAX (sequencia), 0) + 1
    INTO v_sequencia
    FROM MOORCAMENTOXPAGAMENTOS
    WHERE orcamento = p_orcamento
    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 = 'O'
        AND idCabecalho = p_orcamento
        AND pagamentoTroco = p_pagamentoTroco
        AND sequencia = p_sequencia
        AND valor > 0;
      ELSE
        v_numeroParcelas      := 0;
        v_somaPrazoParcelas   := 0;
        v_valorXPrazoParcelas := 0;
      END IF;
      ADD_ORCAMENTO_PAG_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_idPagamentoOrcamento
        p_orcamento,
        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,
        p_valorFinanceiro,
        p_idFinanceiroAdiantamento,
        r_idPagamentoOrcamento);
      IF p_idLinkPagamento > 0 THEN
        ADD_LINKPAG_ORCAMENTO_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          p_idLinkPagamento,
          r_idPagamentoOrcamento,
          v_auxNumber); -- r_id
      END IF;
      IF p_pagamentoTroco = 'P' THEN
        SELECT 
          contratoCompra,
          condicaoPagamento,
          numeroParcelas,
          somaPrazoParcelas,
          valorXPrazoParcelas,
          prazoMedio,
          prazoMedioPonderado,
          valorBasePagamento,
          valorEntradaMinima,
          valorAVistaEntrada,
          valorPagamentoBruto,
          valorDescontoPagamento,
          valorOutrasDespesasPagamento,
          valorJurosPagamento,
          valorPagamentoLiquido
        INTO
          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 MOORCAMENTOS
        WHERE orcamento = p_orcamento;
        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_ORCAMENTO_PROMOCAO_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_id
              p_orcamento,
              'P', -- p_cabecalhoItemPagamento
              p_sequencia,
              a.idItem, -- p_idItemOrcamento
              r_idPagamentoOrcamento,
              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;
        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 MOORCAMENTOS 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 orcamento = p_orcamento;
      ELSE
        UPDATE MOORCAMENTOS
        SET valorTroco = valorTroco + p_valorPagamentoBruto
        WHERE orcamento = p_orcamento;
      END IF;
      IF p_contadorSessaoTEMPPARCELAS > 0
        AND p_valorFinanceiro > 0
      THEN
        ADD_ORCAMENTO_PAG_TEMPPAR_EFET (
          p_sessaoClient,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          p_contadorSessaoTEMPPARCELAS,
          r_idPagamentoOrcamento);
      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_ORCAMENTO_CALCULA_IMPOSTOS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_orcamento,
        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.idPagamentoOrcamento
        FROM (
          SELECT
            ROW_NUMBER() OVER (ORDER BY sequencia DESC) ordenacao,
            idPagamentoOrcamento,
            sequencia,
            meioPagamento,
            valorFinanceiro,
            saldoEfetivar,
            idFinanceiroAdiantamento
          FROM MOORCAMENTOXPAGAMENTOS
          WHERE orcamento = p_orcamento
          AND pagamentoTroco = 'P') a
        WHERE a.ordenacao = 1
        AND a.meioPagamento = 11
        AND a.valorFinanceiro >= v_troco_valorFinanceiro
        AND a.valorFinanceiro = a.saldoEfetivar
        AND a.idFinanceiroAdiantamento = 0)
      LOOP
        FOR b IN (
          SELECT
            b.idPrevisaoFinanceira,
            b.saldo
          FROM MOPREVISOESFINANCEIRAS b
          WHERE b.idPagamentoOrcamento = a.idPagamentoOrcamento
          ORDER BY b.parcelaAtual)
        LOOP
          v_auxNumber := 0;
          IF b.saldo >= v_troco_valorFinanceiro THEN
            v_auxNumber := v_troco_valorFinanceiro;
          ELSE
            v_auxNumber := b.saldo;
          END IF;
          IF v_auxNumber > 0 THEN
            UPDATE MOORCAMENTOXPAGAMENTOS c SET
              c.valorFinanceiro = c.valorFinanceiro - v_auxNumber,
              c.saldoEfetivar = c.saldoEfetivar - v_auxNumber
            WHERE c.idPagamentoOrcamento = a.idPagamentoOrcamento;
            UPDATE MOPREVISOESFINANCEIRAS c SET
              c.valor = c.valor - v_auxNumber,
              c.saldo = c.saldo - v_auxNumber
            WHERE c.idPrevisaoFinanceira = b.idPrevisaoFinanceira;
            v_troco_valorFinanceiro := v_troco_valorFinanceiro - v_auxNumber;
          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,
          'O', -- p_origem
          p_orcamento, -- p_idCabecalho
          'T', -- p_pagamentoTroco
          p_troco_sequencia,
          p_troco_condicaoPagamento,
          v_troco_valorFinanceiro,
          v_auxNumber);
      END IF;
    END IF;
    ADD_ORCAMENTO_PAG_INSERE (
      p_sessaoClient,
      p_sys_estabelecimentoAtivo,
      p_config_171_apenasDinheiroAVi,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_contadorSessaoTEMPPARCELAS,
      p_contadorSessaoTEMPPROMOCOES,
      p_orcamento,
      '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_idFinanceiroAdiantamento
      0, -- p_idLinkPagamento
      0, -- p_troco_sequencia
      0, -- p_troco_condicaoPagamento
      0, -- p_troco_cobranca
      0, -- p_troco_valor
      v_auxNumber, -- r_idPagamentoOrcamento
      r_mensagemErro);
    IF p_troco_valor <> v_troco_valorFinanceiro
      AND p_contadorSessaoTEMPPARCELAS > 0
    THEN
      ADD_ORCAMENTO_PAG_TEMPPAR_CAB (
        p_sessaoClient,
        p_contadorSessaoTEMPPARCELAS,
        p_orcamento);
    END IF;
  END IF;
END ADD_ORCAMENTO_PAG_INSERE;

/

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 = (d.valorBruto - v_auxNumber) / d.cotacao,
                      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 ROUND (((- v_auxNumber) / d.cotacao), 6) ELSE 0 END
                  WHERE d.idFinanceiro = b.idFinanceiro;
                END IF;
              END LOOP;
            END IF;
          END IF;
        END LOOP;
      END LOOP;
      IF p_troco_valor <> v_troco_valorFinanceiro
        AND p_contadorSessaoTEMPPARCELAS > 0
      THEN
        ADD_TEMPPARCELAS_RECALCULA (
          p_sessaoClient,
          p_contadorSessaoTEMPPARCELAS,
          'P', -- p_origem
          p_preDocumento, -- p_idCabecalho
          'T', -- p_pagamentoTroco
          p_troco_sequencia,
          p_troco_condicaoPagamento,
          v_troco_valorFinanceiro,
          v_auxNumber);
      END IF;
    END IF;
    ADD_PRE_DOC_PAG_INSERE (
      p_sessaoClient,
      p_sys_estabelecimentoAtivo,
      p_config_103_modFinResgatePont,
      p_config_171_apenasDinheiroAVi,
      p_config_209_filtrarGrupoEcon,
      p_config_227_manterPessoaOrcam,
      p_config_349_prazoValidadePont,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_contadorSessaoTEMPPARCELAS,
      p_contadorSessaoTEMPPROMOCOES,
      p_preDocumento,
      'T', -- p_pagamentoTroco
      p_troco_sequencia,
      p_troco_condicaoPagamento,
      p_troco_cobranca,
      0, -- p_valorEntradaMinima
      p_troco_valor, -- p_valorPagamentoBruto
      0, -- p_valorDescontoPagamento
      0, -- p_valorOutrasDespesasPagamento
      0, -- p_valorJurosPagamento
      p_troco_valor,
      v_troco_valorFinanceiro,
      0, -- p_cartao_credenciadoraCartao
      0, -- p_cartao_bandeiraCartaoDebCred
      ' ', -- p_cartao_transacaoCartaoNSU
      ' ', -- p_cartao_autorizacaoCartao
      0, -- p_cartao_tarifaCartao
      ' ', -- p_cartaoProprio_cartaoProprio
      0, -- p_idFinanceiroAdiantamento
      0, -- p_idLinkPagamento
      0, -- p_troco_sequencia
      0, -- p_troco_condicaoPagamento
      0, -- p_troco_cobranca
      0, -- p_troco_valor
      v_auxNumber, -- r_idPagamentoPreDocumento
      r_mensagemErro);
    IF p_troco_valor <> v_troco_valorFinanceiro
      AND p_contadorSessaoTEMPPARCELAS > 0
    THEN
      ADD_PRE_DOC_PAG_TEMPPAR_CAB (
        p_sessaoClient,
        p_contadorSessaoTEMPPARCELAS,
        p_preDocumento);
    END IF;
  END IF;
END ADD_PRE_DOC_PAG_INSERE;

/

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

/

create or replace PROCEDURE ADD_FINANC_BAIXA_EXCLUI_CORREL (
  p_idBaixaFinanceiro IN NUMBER)
IS
BEGIN
  -- Desvincula Financeiro
  UPDATE MOARQUIVOSCONCILIACOES a
  SET a.situacaoConciliacao = 'I'
  WHERE a.situacaoConciliacao = 'F'
  AND EXISTS (
    SELECT 1
    FROM MOCONCILIACOESCARTOES b
    WHERE b.idArquivoConciliacao = a.idArquivoConciliacao
    AND b.idBaixaFinanceiro = p_idBaixaFinanceiro);
  UPDATE MOARQUIVOCOBRANCAXFINANC SET
    idFinanceiro = 0,
    idBaixaFinanceiro = 0
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  UPDATE MOCONCILIACOESCARTOES SET
    idFinanceiro = 0,
    idBaixaFinanceiro = 0
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  UPDATE MOLINKPAGAMENTOXBAIXAS SET
    idBaixaFinanceiro = 0
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  -- Exclui correlatos
  DELETE MOBAIXAFINANCXPREDOCUM
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  DELETE MOBAIXAFINANCXDOCFISCAL
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  DELETE MOREPARCXBAIXAFINANC
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  -- Exclui correlatos com outra perna correlata que já deve ter sido excluída
  DELETE MOBAIXAXBAIXAFINANCEIRO
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  DELETE MOBAIXAXBAIXAFINANCEIRO
  WHERE idBaixaFinanceiroCorrel = p_idBaixaFinanceiro;
  DELETE MOBAIXAXNOVOFINANCEIRO
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  -- Exclui financeiro x baixa principal
  DELETE MOFINANCEIROXBAIXAS
  WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
END ADD_FINANC_BAIXA_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_FINANC_TEMPRECEBIMENTO_EF (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_195_umReciboParaCadaR IN NUMBER,
  p_config_226_baixarFinEstabOri IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_contadorSessaoTEMPRECEBIMENT IN NUMBER,
  p_contadorSessaoTEMPSELECIONAD IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  p_dataBaixa                    IN DATE,
  p_somaSel_valorJurosDeMora     IN NUMBER,
  p_somaSel_valorMulta           IN NUMBER,
  p_confirm_valorSelecionado     IN NUMBER,
  p_confirm_valorJurosTotal      IN NUMBER,
  p_confirm_valorMultaTotal      IN NUMBER,
  p_confirm_valorDescontoInform  IN NUMBER,
  p_confirm_valorAcrescimoInform IN NUMBER,
  p_confirm_valorTotal           IN NUMBER,
  p_confirm_valorTotalPago       IN NUMBER,
  p_fatoContabilContabilizar     IN NUMBER,
  p_fatoContabilNaoContabilizar  IN NUMBER,
  p_tempSel_observacoes          IN VARCHAR2,
  p_tempSel_meioPagamento        IN NUMBER,
  p_tempSel_carteiraFinanceira   IN NUMBER,
  p_tempSel_idFinanceiroAdiantam IN NUMBER,
  p_tempSel_valorPago            IN NUMBER,
  p_adiant_carteiraFinanceira    IN NUMBER,
  p_idBaixaFinanceiroAdiantament IN NUMBER,
  p_idsBaixaFinanceiroCheque     IN CLOB,
  p_idsFinanceiroPagto           IN CLOB,
  p_idsFinanceiroTroco           IN CLOB,
  p_somaValorLiquidado           IN NUMBER,
  p_saldoJurosTotal              IN NUMBER,
  p_saldoMultaTotal              IN NUMBER,
  p_saldoDescontoInformado       IN NUMBER,
  p_saldoAcrescimoInformado      IN NUMBER,
  p_residuoValorBrutoIndexado    IN NUMBER,
  p_residuoVariacaoIndexador     IN NUMBER,
  p_residuoJurosDeMora           IN NUMBER,
  p_residuoMulta                 IN NUMBER,
  p_residuoTarifaCartao          IN NUMBER,
  p_residuoDescontos             IN NUMBER,
  p_residuoOutrosAcrescimos      IN NUMBER,
  p_residuoDescontoInformado     IN NUMBER,
  p_residuoAcrescimoInformado    IN NUMBER,
  r_fatoContabilContabilizar     OUT NUMBER,
  r_fatoContabilNaoContabilizar  OUT NUMBER,
  r_somaValorLiquidado           OUT NUMBER,
  r_saldoJurosTotal              OUT NUMBER,
  r_saldoMultaTotal              OUT NUMBER,
  r_saldoDescontoInformado       OUT NUMBER,
  r_saldoAcrescimoInformado      OUT NUMBER,
  r_residuoValorBrutoIndexado    OUT NUMBER,
  r_residuoVariacaoIndexador     OUT NUMBER,
  r_residuoJurosDeMora           OUT NUMBER,
  r_residuoMulta                 OUT NUMBER,
  r_residuoTarifaCartao          OUT NUMBER,
  r_residuoDescontos             OUT NUMBER,
  r_residuoOutrosAcrescimos      OUT NUMBER,
  r_residuoDescontoInformado     OUT NUMBER,
  r_residuoAcrescimoInformado    OUT NUMBER)
IS
  v_carteiraFinanceiraPagto      NUMBER;
  v_saldoBaixarPagamento         NUMBER;
  v_baixa_idBaixaFinanceiro      NUMBER;
  v_baixa_valorBrutoIndexado     NUMBER;
  v_baixa_valorBruto             NUMBER;
  v_baixa_valorVariacaoIndexador NUMBER;
  v_baixa_valorJurosTotal        NUMBER;
  v_baixa_valorMultaTotal        NUMBER;
  v_baixa_valorTarifaCartao      NUMBER;
  v_baixa_valorDescontos         NUMBER;
  v_baixa_valorOutrosAcrescimos  NUMBER;
  v_baixa_valorDescontoInformado NUMBER;
  v_baixa_valorAcrescimoInformad NUMBER;
  v_baixa_valorLiquido           NUMBER;
  v_novoResiduoValorBrutoIndexad NUMBER (16, 15);
  v_novoResiduoVariacaoIndexador NUMBER (16, 15);
  v_novoResiduoJurosDeMora       NUMBER (16, 15);
  v_novoResiduoMulta             NUMBER (16, 15);
  v_novoResiduoTarifaCartao      NUMBER (16, 15);
  v_novoResiduoDescontos         NUMBER (16, 15);
  v_novoResiduoOutrosAcrescimos  NUMBER (16, 15);
  v_novoResiduoDescontoInformado NUMBER (16, 15);
  v_novoResiduoAcrescimoInformad NUMBER (16, 15);
  v_auxNumber                    NUMBER;
BEGIN
  r_fatoContabilContabilizar    := p_fatoContabilContabilizar;
  r_fatoContabilNaoContabilizar := p_fatoContabilNaoContabilizar;
  r_somaValorLiquidado          := p_somaValorLiquidado;
  r_saldoJurosTotal             := p_saldoJurosTotal;
  r_saldoMultaTotal             := p_saldoMultaTotal;
  r_saldoDescontoInformado      := p_saldoDescontoInformado;
  r_saldoAcrescimoInformado     := p_saldoAcrescimoInformado;
  r_residuoValorBrutoIndexado   := p_residuoValorBrutoIndexado;
  r_residuoVariacaoIndexador    := p_residuoVariacaoIndexador;
  r_residuoJurosDeMora          := p_residuoJurosDeMora;
  r_residuoMulta                := p_residuoMulta;
  r_residuoTarifaCartao         := p_residuoTarifaCartao;
  r_residuoDescontos            := p_residuoDescontos;
  r_residuoOutrosAcrescimos     := p_residuoOutrosAcrescimos;
  r_residuoDescontoInformado    := p_residuoDescontoInformado;
  r_residuoAcrescimoInformado   := p_residuoAcrescimoInformado;
  v_carteiraFinanceiraPagto     := 0;
  IF p_tempSel_carteiraFinanceira = 0
    AND p_idsFinanceiroPagto IS NOT NULL
    AND p_idsFinanceiroPagto <> ' '
  THEN
    SELECT COALESCE ( MAX (carteiraFinanceira), 0)
    INTO v_carteiraFinanceiraPagto
    FROM MOFINANCEIROS
    WHERE idFinanceiro = TO_NUMBER (REGEXP_SUBSTR (p_idsFinanceiroPagto, '[^,]+'));
  END IF;
  v_saldoBaixarPagamento :=
    CASE
      WHEN r_somaValorLiquidado
        + p_tempSel_valorPago
        > p_confirm_valorSelecionado
        + p_confirm_valorJurosTotal
        + p_confirm_valorMultaTotal
        - p_somaSel_valorJurosDeMora
        + p_somaSel_valorMulta
        + p_confirm_valorAcrescimoInform
        - p_confirm_valorDescontoInform
      THEN p_confirm_valorSelecionado
        + p_confirm_valorJurosTotal
        + p_confirm_valorMultaTotal
        - p_somaSel_valorJurosDeMora
        + p_somaSel_valorMulta
        + p_confirm_valorAcrescimoInform
        - p_confirm_valorDescontoInform
        - r_somaValorLiquidado
      ELSE p_tempSel_valorPago
    END;
  FOR a IN (
    SELECT
      tempRec.id,
      tempRec.cotacao,
      tempRec.saldo,
      tempRec.saldoIndexado,
      tempRec.valorVariacaoIndexador,
      tempRec.valorJurosDeMora,
      tempRec.valorMulta,
      tempRec.valorTarifaCartao,
      tempRec.valorDescontos,
      tempRec.valorOutrosAcrescimos,
      tempRec.valorLiquido,
      tempRec.saldoVariacaoIndexador,
      tempRec.saldoJurosDeMora,
      tempRec.saldoMulta,
      tempRec.saldoTarifaCartao,
      tempRec.saldoDescontos,
      tempRec.saldoOutrosAcrescimos,
      tempRec.saldoLiquido,
      financ.estabelecimento,
      financ.contaFinanceira,
      financ.pagamentoRecebimento,
      financ.operacaoFinanceira,
      financ.pessoa,
      financ.cobranca,
      financ.carteiraFinanceira,
      fatCont.situacaoContabilizacao
    FROM TEMPRECEBIMENTO tempRec
    JOIN MOFINANCEIROS financ
    ON financ.idFinanceiro = tempRec.id
    JOIN MOFATOSCONTABEIS fatCont
    ON fatCont.fatoContabil = financ.fatoContabil
    WHERE tempRec.sessaoClient = p_sessaoClient
    AND tempRec.contadorSessao = p_contadorSessaoTEMPRECEBIMENT
    AND tempRec.origem = 'F'
    AND tempRec.selecionado = 1
    AND tempRec.saldo > 0
    ORDER BY tempRec.ordenacao)
  LOOP
    IF v_saldoBaixarPagamento > 0
    THEN
      v_baixa_valorBruto             := a.saldo;
      v_novoResiduoValorBrutoIndexad := r_residuoValorBrutoIndexado;
      v_baixa_valorBrutoIndexado     := a.saldoIndexado;
      v_novoResiduoVariacaoIndexador := r_residuoVariacaoIndexador;
      v_baixa_valorVariacaoIndexador := a.saldoVariacaoIndexador;
      v_novoResiduoJurosDeMora := ROUND ((
        CASE
          WHEN p_somaSel_valorJurosDeMora = 0
          THEN 0
          ELSE a.saldoJurosDeMora
            * p_confirm_valorJurosTotal
            / p_somaSel_valorJurosDeMora
        END
        + r_residuoJurosDeMora
        - ROUND (
          CASE
            WHEN p_somaSel_valorJurosDeMora = 0
            THEN 0
            ELSE a.saldoJurosDeMora
              * p_confirm_valorJurosTotal
              / p_somaSel_valorJurosDeMora
          END
          + r_residuoJurosDeMora, 2)), 15);
      v_baixa_valorJurosTotal := ROUND (
        CASE
          WHEN p_somaSel_valorJurosDeMora = 0
          THEN 0
          ELSE a.saldoJurosDeMora
            * p_confirm_valorJurosTotal
            / p_somaSel_valorJurosDeMora
        END
        + r_residuoJurosDeMora, 2);
      IF v_baixa_valorJurosTotal > r_saldoJurosTotal
      THEN
        v_novoResiduoJurosDeMora := r_residuoJurosDeMora;
        v_baixa_valorJurosTotal  := r_saldoJurosTotal;
      END IF;
      v_novoResiduoMulta := ROUND ((
        CASE
          WHEN p_somaSel_valorMulta = 0
          THEN 0
          ELSE a.saldoMulta
            * p_confirm_valorMultaTotal
            / p_somaSel_valorMulta
        END
        + r_residuoMulta
        - ROUND (
          CASE
            WHEN p_somaSel_valorMulta = 0
            THEN 0
            ELSE a.saldoMulta
              * p_confirm_valorMultaTotal
              / p_somaSel_valorMulta
          END
          + r_residuoMulta, 2)), 15);
      v_baixa_valorMultaTotal := ROUND (
        CASE
          WHEN p_somaSel_valorMulta = 0
          THEN 0
          ELSE a.saldoMulta
            * p_confirm_valorMultaTotal
            / p_somaSel_valorMulta
        END
        + r_residuoMulta, 2);
      IF v_baixa_valorMultaTotal > r_saldoMultaTotal
      THEN
        v_novoResiduoMulta      := r_residuoMulta;
        v_baixa_valorMultaTotal := r_saldoMultaTotal;
      END IF;
      v_novoResiduoTarifaCartao     := r_residuoTarifaCartao;
      v_baixa_valorTarifaCartao     := a.saldoTarifaCartao;
      v_novoResiduoDescontos        := r_residuoDescontos;
      v_baixa_valorDescontos        := a.saldoDescontos;
      v_novoResiduoOutrosAcrescimos := r_residuoOutrosAcrescimos;
      v_baixa_valorOutrosAcrescimos := a.saldoOutrosAcrescimos;
      -- Calculo 1 - Liquidação Normal
      IF r_somaValorLiquidado
        + v_baixa_valorBruto
        + v_baixa_valorVariacaoIndexador
        + v_baixa_valorJurosTotal
        + v_baixa_valorMultaTotal
        - v_baixa_valorTarifaCartao
        - v_baixa_valorDescontos
        + v_baixa_valorOutrosAcrescimos
        - r_saldoDescontoInformado
        + r_saldoAcrescimoInformado
        = p_confirm_valorTotalPago
      THEN
        v_novoResiduoDescontoInformado := r_residuoDescontoInformado;
        v_baixa_valorDescontoInformado := r_saldoDescontoInformado;
        v_novoResiduoAcrescimoInformad := r_residuoAcrescimoInformado;
        v_baixa_valorAcrescimoInformad := r_saldoAcrescimoInformado;
      -- 2 Liquida título total, mas descontos e acréscimos proporcional
      ELSE
        v_novoResiduoDescontoInformado := ROUND ((
          CASE
            WHEN (
              CASE
                WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                THEN p_confirm_valorTotal
                ELSE p_confirm_valorTotalPago
              END
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
          THEN 0
          ELSE p_confirm_valorDescontoInform
            * (v_baixa_valorBruto
              + v_baixa_valorVariacaoIndexador
              + v_baixa_valorJurosTotal
              + v_baixa_valorMultaTotal
              - v_baixa_valorTarifaCartao
              - v_baixa_valorDescontos
              + v_baixa_valorOutrosAcrescimos) / (
              CASE
                WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                THEN p_confirm_valorTotal
                ELSE p_confirm_valorTotalPago
              END
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform)
          END + r_residuoDescontoInformado
          - ROUND (
            CASE
              WHEN (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE p_confirm_valorDescontoInform
                * (v_baixa_valorBruto
                  + v_baixa_valorVariacaoIndexador
                  + v_baixa_valorJurosTotal
                  + v_baixa_valorMultaTotal
                  - v_baixa_valorTarifaCartao
                  - v_baixa_valorDescontos
                  + v_baixa_valorOutrosAcrescimos) / (
                  CASE
                    WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                    THEN p_confirm_valorTotal
                    ELSE p_confirm_valorTotalPago
                  END
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoDescontoInformado, 2)), 15);
        v_baixa_valorDescontoInformado := ROUND (
          CASE
            WHEN (
              CASE
                WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                THEN p_confirm_valorTotal
                ELSE p_confirm_valorTotalPago
              END
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE p_confirm_valorDescontoInform
              * (v_baixa_valorBruto
                + v_baixa_valorVariacaoIndexador
                + v_baixa_valorJurosTotal
                + v_baixa_valorMultaTotal
                - v_baixa_valorTarifaCartao
                - v_baixa_valorDescontos
                + v_baixa_valorOutrosAcrescimos) / (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoDescontoInformado, 2);
        v_novoResiduoAcrescimoInformad := ROUND ((
          CASE
            WHEN (
              CASE
                WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                THEN p_confirm_valorTotal
                ELSE p_confirm_valorTotalPago
              END
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE p_confirm_valorAcrescimoInform
              * (v_baixa_valorBruto
                + v_baixa_valorVariacaoIndexador
                + v_baixa_valorJurosTotal
                + v_baixa_valorMultaTotal
                - v_baixa_valorTarifaCartao
                - v_baixa_valorDescontos
                + v_baixa_valorOutrosAcrescimos) / (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoAcrescimoInformado
          - ROUND (
            CASE
              WHEN (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE p_confirm_valorAcrescimoInform
                * (v_baixa_valorBruto
                  + v_baixa_valorVariacaoIndexador
                  + v_baixa_valorJurosTotal
                  + v_baixa_valorMultaTotal
                  - v_baixa_valorTarifaCartao
                  - v_baixa_valorDescontos
                  + v_baixa_valorOutrosAcrescimos) / (
                  CASE
                    WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                    THEN p_confirm_valorTotal
                    ELSE p_confirm_valorTotalPago
                  END
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoAcrescimoInformado, 2)), 15);
        v_baixa_valorAcrescimoInformad := ROUND (
          CASE
            WHEN (
              CASE
                WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                THEN p_confirm_valorTotal
                ELSE p_confirm_valorTotalPago
              END
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE p_confirm_valorAcrescimoInform
              * (v_baixa_valorBruto
                + v_baixa_valorVariacaoIndexador
                + v_baixa_valorJurosTotal
                + v_baixa_valorMultaTotal
                - v_baixa_valorTarifaCartao
                - v_baixa_valorDescontos
                + v_baixa_valorOutrosAcrescimos) / (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoAcrescimoInformado, 2);
      END IF;
      v_baixa_valorLiquido := v_baixa_valorBruto
        + v_baixa_valorVariacaoIndexador
        + v_baixa_valorJurosTotal
        + v_baixa_valorMultaTotal
        - v_baixa_valorTarifaCartao
        - v_baixa_valorDescontos
        + v_baixa_valorOutrosAcrescimos
        - v_baixa_valorDescontoInformado
        + v_baixa_valorAcrescimoInformad;
      -- 3 Liquida Saldo Pagamento
      IF v_saldoBaixarPagamento < v_baixa_valorLiquido
      THEN
        v_novoResiduoVariacaoIndexador := ROUND ((
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorVariacaoIndexador
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoVariacaoIndexador
          - ROUND (
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorVariacaoIndexador
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + r_residuoVariacaoIndexador, 2)), 15);
        v_baixa_valorVariacaoIndexador := ROUND (
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorVariacaoIndexador
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoVariacaoIndexador, 2);
        v_novoResiduoJurosDeMora := ROUND ((
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorJurosTotal
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoJurosDeMora
          - ROUND (
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorJurosTotal
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + r_residuoJurosDeMora, 2)), 15);
        v_baixa_valorJurosTotal := ROUND (
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorJurosTotal
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoJurosDeMora, 2);
        IF v_baixa_valorJurosTotal > r_saldoJurosTotal
        THEN
          v_novoResiduoJurosDeMora := r_residuoJurosDeMora;
          v_baixa_valorJurosTotal  := r_saldoJurosTotal;
        END IF;
        v_novoResiduoMulta := ROUND ((
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorMultaTotal
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoMulta
          - ROUND (
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorMultaTotal
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + r_residuoMulta, 2)), 15);
        v_baixa_valorMultaTotal := ROUND (
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorMultaTotal
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoMulta, 2);
        IF v_baixa_valorMultaTotal > r_saldoMultaTotal
        THEN
          v_novoResiduoMulta      := r_residuoMulta;
          v_baixa_valorMultaTotal := r_saldoMultaTotal;
        END IF;
        v_novoResiduoTarifaCartao := ROUND ((
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0 ELSE v_baixa_valorTarifaCartao
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoTarifaCartao
          - ROUND (
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorTarifaCartao
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + r_residuoTarifaCartao, 2)), 15);
        v_baixa_valorTarifaCartao := ROUND (
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorTarifaCartao
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoTarifaCartao, 2);
        v_novoResiduoDescontos := ROUND ((
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorDescontos
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoDescontos
          - ROUND (
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorDescontos
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
            END
            + r_residuoDescontos, 2)), 15);
        v_baixa_valorDescontos := ROUND (
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorDescontos
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoDescontos, 2);
        v_novoResiduoOutrosAcrescimos := ROUND ((
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorOutrosAcrescimos
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoOutrosAcrescimos
          - ROUND (
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorOutrosAcrescimos
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
            END
            + r_residuoOutrosAcrescimos, 2)), 15);
        v_baixa_valorOutrosAcrescimos := ROUND (
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorOutrosAcrescimos
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoOutrosAcrescimos, 2);
        v_novoResiduoDescontoInformado := ROUND ((
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorDescontoInformado
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoDescontoInformado
          - ROUND (
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorDescontoInformado
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
            END
            + r_residuoDescontoInformado, 2)), 15);
        v_baixa_valorDescontoInformado := ROUND (
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorDescontoInformado
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoDescontoInformado, 2);
        v_novoResiduoAcrescimoInformad := ROUND ((
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorAcrescimoInformad
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoAcrescimoInformado
          - ROUND (
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorAcrescimoInformad
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
            END
            + r_residuoAcrescimoInformado, 2)), 15);
        v_baixa_valorAcrescimoInformad := ROUND (
          CASE
            WHEN v_baixa_valorLiquido = 0
            THEN 0
            ELSE v_baixa_valorAcrescimoInformad
              * v_saldoBaixarPagamento
              / v_baixa_valorLiquido
          END
          + r_residuoAcrescimoInformado, 2);
        v_baixa_valorBruto := v_saldoBaixarPagamento
          - v_baixa_valorVariacaoIndexador
          - v_baixa_valorJurosTotal
          - v_baixa_valorMultaTotal
          + v_baixa_valorTarifaCartao
          + v_baixa_valorDescontos
          - v_baixa_valorOutrosAcrescimos
          + v_baixa_valorDescontoInformado
          - v_baixa_valorAcrescimoInformad;
        v_novoResiduoValorBrutoIndexad := ROUND ((
          CASE
            WHEN a.saldo = 0
            THEN 0
            ELSE a.saldoIndexado
              * v_baixa_valorBruto
              / a.saldo
          END
          + r_residuoValorBrutoIndexado
          -  ROUND (
            CASE
              WHEN a.saldo = 0
              THEN 0
              ELSE a.saldoIndexado
                * v_baixa_valorBruto
                / a.saldo
            END
            + r_residuoValorBrutoIndexado, 6)), 15);
        v_baixa_valorBrutoIndexado := ROUND (
          CASE
            WHEN a.saldo = 0
            THEN 0
            ELSE a.saldoIndexado
              * v_baixa_valorBruto
              / a.saldo
          END
          + r_residuoValorBrutoIndexado, 6);
        v_baixa_valorLiquido := v_baixa_valorBruto
          + v_baixa_valorVariacaoIndexador
          + v_baixa_valorJurosTotal
          + v_baixa_valorMultaTotal
          - v_baixa_valorTarifaCartao
          - v_baixa_valorDescontos
          + v_baixa_valorOutrosAcrescimos
          - v_baixa_valorDescontoInformado
          + v_baixa_valorAcrescimoInformad;
      -- 4 Liquida Saldo Pagamento
      ELSIF r_somaValorLiquidado + v_baixa_valorLiquido > p_confirm_valorTotalPago
        OR v_baixa_valorBruto > a.saldo
        OR v_baixa_valorLiquido > v_saldoBaixarPagamento
        OR v_baixa_valorJurosTotal > r_saldoJurosTotal
        OR v_baixa_valorMultaTotal > r_saldoMultaTotal
        OR v_baixa_valorDescontoInformado > r_saldoDescontoInformado
        OR v_baixa_valorAcrescimoInformad > r_saldoAcrescimoInformado
      THEN
        v_novoResiduoVariacaoIndexador :=  ROUND ((a.valorVariacaoIndexador * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoVariacaoIndexador
          - ROUND (
            a.valorVariacaoIndexador * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado) > (a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2))
                  THEN a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoVariacaoIndexador, 2)), 15);
        v_baixa_valorVariacaoIndexador := ROUND (
          a.valorVariacaoIndexador * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoVariacaoIndexador, 2);
        v_novoResiduoJurosDeMora :=  ROUND ((a.valorJurosDeMora * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoJurosDeMora
          - ROUND (
            a.valorJurosDeMora * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado) > (a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2))
                  THEN a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoJurosDeMora, 2)), 15);
        v_baixa_valorJurosTotal := ROUND (
          a.valorJurosDeMora * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoJurosDeMora, 2);
        IF v_baixa_valorJurosTotal > r_saldoJurosTotal
        THEN
          v_novoResiduoJurosDeMora := r_residuoJurosDeMora;
          v_baixa_valorJurosTotal  := r_saldoJurosTotal;
        END IF;
        v_novoResiduoMulta :=  ROUND ((a.valorMulta * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoMulta
          - ROUND (
            a.valorMulta * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado) > (a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2))
                  THEN a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoMulta, 2)), 15);
        v_baixa_valorMultaTotal := ROUND (
          a.valorMulta * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoMulta, 2);
        IF v_baixa_valorMultaTotal > r_saldoMultaTotal
        THEN
          v_novoResiduoMulta      := r_residuoMulta;
          v_baixa_valorMultaTotal := r_saldoMultaTotal;
        END IF;
        v_novoResiduoTarifaCartao :=  ROUND ((a.valorTarifaCartao * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoTarifaCartao
          - ROUND (
            a.valorTarifaCartao * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado) > (a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2))
                  THEN a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoTarifaCartao, 2)), 15);
        v_baixa_valorTarifaCartao :=  ROUND (
          a.valorTarifaCartao * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoTarifaCartao, 2);
        v_novoResiduoDescontos :=  ROUND ((a.valorDescontos * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoDescontos
          - ROUND (
            a.valorDescontos * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado) > (a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2))
                  THEN a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoDescontos, 2)), 15);
        v_baixa_valorDescontos :=  ROUND (
          a.valorDescontos * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoDescontos, 2);
        v_novoResiduoOutrosAcrescimos :=  ROUND ((a.valorOutrosAcrescimos * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoOutrosAcrescimos
          - ROUND (
            a.valorOutrosAcrescimos * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado) > (a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2))
                  THEN a.valorLiquido
                    - ROUND (a.valorJurosDeMora
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + r_residuoJurosDeMora, 2)
                    - ROUND (a.valorMulta
                      * a.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + r_saldoDescontoInformado
                    - r_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoOutrosAcrescimos, 2)), 15);
        v_baixa_valorOutrosAcrescimos := ROUND (
          a.valorOutrosAcrescimos * 
          CASE
            WHEN (p_confirm_valorTotalPago
            + p_confirm_valorDescontoInform
            - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE
              CASE
                WHEN (v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado) > (a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2))
                THEN a.valorLiquido
                  - ROUND (a.valorJurosDeMora
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + r_residuoJurosDeMora, 2)
                  - ROUND (a.valorMulta
                    * a.valorLiquido
                    / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
                    + r_residuoMulta, 2)
                ELSE v_saldoBaixarPagamento
                  + r_saldoDescontoInformado
                  - r_saldoAcrescimoInformado
              END
              / (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
          END
          + r_residuoOutrosAcrescimos, 2);
        v_novoResiduoDescontoInformado := r_residuoDescontoInformado;
        v_baixa_valorDescontoInformado := r_saldoDescontoInformado;
        v_novoResiduoAcrescimoInformad := r_residuoAcrescimoInformado;
        v_baixa_valorAcrescimoInformad := r_saldoAcrescimoInformado;
        v_baixa_valorBruto := v_saldoBaixarPagamento
          - v_baixa_valorVariacaoIndexador
          - v_baixa_valorJurosTotal
          - v_baixa_valorMultaTotal
          + v_baixa_valorTarifaCartao
          + v_baixa_valorDescontos
          - v_baixa_valorOutrosAcrescimos
          + v_baixa_valorDescontoInformado
          - v_baixa_valorAcrescimoInformad;
        v_novoResiduoValorBrutoIndexad := ROUND ((
          CASE
            WHEN a.saldo = 0
            THEN 0
            ELSE a.saldoIndexado
              * v_baixa_valorBruto
              / a.saldo
          END
          + r_residuoValorBrutoIndexado
          -  ROUND (
            CASE
              WHEN a.saldo = 0
              THEN 0
              ELSE a.saldoIndexado
                * v_baixa_valorBruto
                / a.saldo
            END
            + r_residuoValorBrutoIndexado, 6)), 15);
        v_baixa_valorBrutoIndexado := ROUND (
          CASE
            WHEN a.saldo = 0
            THEN 0
            ELSE a.saldoIndexado
              * v_baixa_valorBruto
              / a.saldo
          END
          + r_residuoValorBrutoIndexado, 6);
        v_baixa_valorLiquido := v_baixa_valorBruto
          + v_baixa_valorVariacaoIndexador
          + v_baixa_valorJurosTotal
          + v_baixa_valorMultaTotal
          - v_baixa_valorTarifaCartao
          - v_baixa_valorDescontos
          + v_baixa_valorOutrosAcrescimos
          - v_baixa_valorDescontoInformado
          + v_baixa_valorAcrescimoInformad;
        -- 5 Liquida Saldo Pagamento, mas descontos e acréscimos proporcional
        IF r_somaValorLiquidado + v_baixa_valorLiquido <> p_confirm_valorTotalPago
          OR v_baixa_valorBruto > a.saldo
          OR v_baixa_valorLiquido <> v_saldoBaixarPagamento
          OR v_baixa_valorJurosTotal <> r_saldoJurosTotal
          OR v_baixa_valorMultaTotal <> r_saldoMultaTotal
          OR v_baixa_valorDescontoInformado <> r_saldoDescontoInformado
          OR v_baixa_valorAcrescimoInformad <> r_saldoAcrescimoInformado
        THEN
          v_novoResiduoDescontoInformado := ROUND ((
            CASE
              WHEN (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
            THEN 0
            ELSE p_confirm_valorDescontoInform
              * (v_baixa_valorBruto
                + v_baixa_valorVariacaoIndexador
                + v_baixa_valorJurosTotal
                + v_baixa_valorMultaTotal
                - v_baixa_valorTarifaCartao
                - v_baixa_valorDescontos
                + v_baixa_valorOutrosAcrescimos) / (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform)
            END + r_residuoDescontoInformado
            - ROUND (
              CASE
                WHEN (
                  CASE
                    WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                    THEN p_confirm_valorTotal
                    ELSE p_confirm_valorTotalPago
                  END
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform) = 0
                THEN 0
                ELSE p_confirm_valorDescontoInform
                  * (v_baixa_valorBruto
                    + v_baixa_valorVariacaoIndexador
                    + v_baixa_valorJurosTotal
                    + v_baixa_valorMultaTotal
                    - v_baixa_valorTarifaCartao
                    - v_baixa_valorDescontos
                    + v_baixa_valorOutrosAcrescimos) / (
                    CASE
                      WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                      THEN p_confirm_valorTotal
                      ELSE p_confirm_valorTotalPago
                    END
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
              END
              + r_residuoDescontoInformado, 2)), 15);
          v_baixa_valorDescontoInformado := ROUND (
            CASE
              WHEN (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE p_confirm_valorDescontoInform
                * (v_baixa_valorBruto
                  + v_baixa_valorVariacaoIndexador
                  + v_baixa_valorJurosTotal
                  + v_baixa_valorMultaTotal
                  - v_baixa_valorTarifaCartao
                  - v_baixa_valorDescontos
                  + v_baixa_valorOutrosAcrescimos) / (
                  CASE
                    WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                    THEN p_confirm_valorTotal
                    ELSE p_confirm_valorTotalPago
                  END
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoDescontoInformado, 2);
          v_novoResiduoAcrescimoInformad := ROUND ((
            CASE
              WHEN (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE p_confirm_valorAcrescimoInform
                * (v_baixa_valorBruto
                  + v_baixa_valorVariacaoIndexador
                  + v_baixa_valorJurosTotal
                  + v_baixa_valorMultaTotal
                  - v_baixa_valorTarifaCartao
                  - v_baixa_valorDescontos
                  + v_baixa_valorOutrosAcrescimos) / (
                  CASE
                    WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                    THEN p_confirm_valorTotal
                    ELSE p_confirm_valorTotalPago
                  END
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoAcrescimoInformado
            - ROUND (
              CASE
                WHEN (
                  CASE
                    WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                    THEN p_confirm_valorTotal
                    ELSE p_confirm_valorTotalPago
                  END
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform) = 0
                THEN 0
                ELSE p_confirm_valorAcrescimoInform
                  * (v_baixa_valorBruto
                    + v_baixa_valorVariacaoIndexador
                    + v_baixa_valorJurosTotal
                    + v_baixa_valorMultaTotal
                    - v_baixa_valorTarifaCartao
                    - v_baixa_valorDescontos
                    + v_baixa_valorOutrosAcrescimos) / (
                    CASE
                      WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                      THEN p_confirm_valorTotal
                      ELSE p_confirm_valorTotalPago
                    END
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
              END
              + r_residuoAcrescimoInformado, 2)), 15);
          v_baixa_valorAcrescimoInformad := ROUND (
            CASE
              WHEN (
                CASE
                  WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                  THEN p_confirm_valorTotal
                  ELSE p_confirm_valorTotalPago
                END
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE p_confirm_valorAcrescimoInform
                * (v_baixa_valorBruto
                  + v_baixa_valorVariacaoIndexador
                  + v_baixa_valorJurosTotal
                  + v_baixa_valorMultaTotal
                  - v_baixa_valorTarifaCartao
                  - v_baixa_valorDescontos
                  + v_baixa_valorOutrosAcrescimos) / (
                  CASE
                    WHEN p_confirm_valorTotalPago > p_confirm_valorTotal
                    THEN p_confirm_valorTotal
                    ELSE p_confirm_valorTotalPago
                  END
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + r_residuoAcrescimoInformado, 2);
          v_baixa_valorLiquido := v_baixa_valorBruto
            + v_baixa_valorVariacaoIndexador
            + v_baixa_valorJurosTotal
            + v_baixa_valorMultaTotal
            - v_baixa_valorTarifaCartao
            - v_baixa_valorDescontos
            + v_baixa_valorOutrosAcrescimos
            - v_baixa_valorDescontoInformado
            + v_baixa_valorAcrescimoInformad;
        END IF;
      END IF;
      -- 6 Se valor bruto maior que saldo, ajusta
      IF v_baixa_valorBruto > a.saldo
      THEN
        v_baixa_valorDescontoInformado := v_baixa_valorDescontoInformado - v_baixa_valorBruto + a.saldo;
        v_baixa_valorBruto := a.saldo;
        IF v_baixa_valorDescontoInformado < 0
        THEN
          v_baixa_valorAcrescimoInformad := v_baixa_valorAcrescimoInformad - v_baixa_valorDescontoInformado;
          v_baixa_valorDescontoInformado := 0;
        END IF;
        v_novoResiduoValorBrutoIndexad := ROUND ((
          CASE
            WHEN a.saldo = 0
            THEN 0
            ELSE a.saldoIndexado
              * v_baixa_valorBruto
              / a.saldo
          END
          + r_residuoValorBrutoIndexado
          -  ROUND (
            CASE
              WHEN a.saldo = 0
              THEN 0
              ELSE a.saldoIndexado
                * v_baixa_valorBruto
                / a.saldo
            END
            + r_residuoValorBrutoIndexado, 6)), 15);
        v_baixa_valorBrutoIndexado := ROUND (
          CASE
            WHEN a.saldo = 0
            THEN 0
            ELSE a.saldoIndexado
              * v_baixa_valorBruto
              / a.saldo
          END
          + r_residuoValorBrutoIndexado, 6);
        v_baixa_valorLiquido := v_baixa_valorBruto
          + v_baixa_valorVariacaoIndexador
          + v_baixa_valorJurosTotal
          + v_baixa_valorMultaTotal
          - v_baixa_valorTarifaCartao
          - v_baixa_valorDescontos
          + v_baixa_valorOutrosAcrescimos
          - v_baixa_valorDescontoInformado
          + v_baixa_valorAcrescimoInformad;
      END IF;
      IF v_baixa_valorBruto <> 0
        OR v_baixa_valorLiquido <> 0
      THEN
        IF a.situacaoContabilizacao = 'N'
        THEN
          IF r_fatoContabilNaoContabilizar = 0
          THEN
            ADD_FATO_CONTABIL_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_fatoContabil,
              CASE
                WHEN p_config_226_baixarFinEstabOri = 1
                THEN a.estabelecimento
                ELSE p_sys_estabelecimentoAtivo
              END, -- p_estabelecimento
              p_dataBaixa,
              'N', -- p_situacaoContabilizacao
              r_fatoContabilNaoContabilizar);
          END IF;
        ELSE
          IF r_fatoContabilContabilizar = 0
          THEN
            ADD_FATO_CONTABIL_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_fatoContabil,
              CASE
                WHEN p_config_226_baixarFinEstabOri = 1
                THEN a.estabelecimento
                ELSE p_sys_estabelecimentoAtivo
              END, -- p_estabelecimento
              p_dataBaixa,
              'A', -- p_situacaoContabilizacao
              r_fatoContabilContabilizar);
          END IF;
        END IF;
        ADD_FINANC_BAIXA_ATUALIZA (
          p_sys_estabelecimentoAtivo,
          p_config_349_prazoValidadePont,
          p_config_354_estabProximoId,
          0, -- p_idBaixaFinanceiro
          p_sessaoCaixa,
          CASE
            WHEN a.situacaoContabilizacao = 'N'
            THEN r_fatoContabilNaoContabilizar
            ELSE r_fatoContabilContabilizar
          END, -- p_fatoContabil
          a.id, -- p_idFinanceiro
          CASE
            WHEN p_config_226_baixarFinEstabOri = 1
            THEN a.estabelecimento
            ELSE p_sys_estabelecimentoAtivo
          END, -- p_estabelecimento
          p_dataBaixa,
          a.contaFinanceira,
          a.pagamentoRecebimento,
          CASE
            WHEN a.pagamentoRecebimento = 'P'
            THEN
              CASE
                WHEN a.operacaoFinanceira = 31
                THEN 74
                ELSE 73
              END
            ELSE
              CASE
                WHEN a.operacaoFinanceira = 71
                THEN 34
                ELSE 33
              END
          END, -- p_operacaoFinanceira
          a.cobranca,
          p_tempSel_meioPagamento,
          CASE
            WHEN p_tempSel_carteiraFinanceira > 0
            THEN p_tempSel_carteiraFinanceira
            WHEN p_idsFinanceiroPagto IS NOT NULL
              AND p_idsFinanceiroPagto <> ' '
              AND v_carteiraFinanceiraPagto > 0
            THEN v_carteiraFinanceiraPagto
            WHEN p_tempSel_idFinanceiroAdiantam > 0
            THEN p_adiant_carteiraFinanceira
            ELSE a.carteiraFinanceira
          END, -- p_carteiraFinanceira
          a.cotacao,
          v_baixa_valorBrutoIndexado,
          v_baixa_valorBruto,
          v_baixa_valorVariacaoIndexador,
          v_baixa_valorJurosTotal,
          v_baixa_valorMultaTotal,
          v_baixa_valorTarifaCartao,
          v_baixa_valorDescontos + v_baixa_valorDescontoInformado,
          v_baixa_valorOutrosAcrescimos + v_baixa_valorAcrescimoInformad,
          v_baixa_valorLiquido,
          0, -- p_baixaAutomatica,
          CASE
            WHEN p_idsFinanceiroPagto IS NOT NULL
              AND p_idsFinanceiroPagto <> ' '
            THEN 1
            ELSE 0
          END, -- p_unificadoReparcelado
          p_tempSel_observacoes,
          p_idBaixaFinanceiroAdiantament, -- p_idBaixaFinanceiroCorrel
          0, -- p_idNovoFinanceiro
          0, -- p_preDocumento
          0, -- p_idDocumentoFiscal
          v_baixa_idBaixaFinanceiro,
          v_auxNumber, -- r_financ_saldo
          v_auxNumber, -- r_financ_saldoIndexado
          v_auxNumber); -- r_financ_efetivado
        INSERT INTO TEMPSELECIONADOS (
          sessaoClient,
          contadorSessao,
          ordenacao,
          selecionado,
          id,
          codigo,
          id2,
          codigo2,
          descricao,
          quebra,
          registros)
        VALUES (
          p_sessaoClient,
          p_contadorSessaoTEMPSELECIONAD,
          0,
          1,
          v_baixa_idBaixaFinanceiro,
          ' ',
          0,
          ' ',
          LPAD (v_baixa_valorLiquido * 100, 14, '0'),          
          LPAD (CASE WHEN p_config_195_umReciboParaCadaR = 1 AND p_tempSel_meioPagamento < 50 THEN v_baixa_idBaixaFinanceiro ELSE a.pessoa END, 14, '0'),
          1);
        IF p_idsFinanceiroPagto IS NOT NULL
          AND p_idsFinanceiroPagto <> ' '
        THEN
          FOR b IN (
            SELECT TO_NUMBER (REGEXP_SUBSTR(p_idsFinanceiroPagto, '[^,]+', 1, LEVEL)) AS idFinanceiro
            FROM DUAL
            CONNECT BY LEVEL <= REGEXP_COUNT (p_idsFinanceiroPagto, ',') + 1)
          LOOP
            ADD_FINANC_BAIXA_NOVO_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_id
              v_baixa_idBaixaFinanceiro, -- p_idBaixaFinanceiro
              b.idFinanceiro, -- p_idNovoFinanceiro
              v_auxNumber); -- r_id
          END LOOP;
        END IF;
        IF p_idsFinanceiroTroco IS NOT NULL
          AND p_idsFinanceiroTroco <> ' '
        THEN
          FOR b IN (
            SELECT TO_NUMBER (REGEXP_SUBSTR(p_idsFinanceiroTroco, '[^,]+', 1, LEVEL)) AS idFinanceiro
            FROM DUAL
            CONNECT BY LEVEL <= REGEXP_COUNT (p_idsFinanceiroTroco, ',') + 1)
          LOOP
            ADD_FINANC_BAIXA_NOVO_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_id
              v_baixa_idBaixaFinanceiro, -- p_idBaixaFinanceiro
              b.idFinanceiro, -- p_idNovoFinanceiro
              v_auxNumber); -- r_id
          END LOOP;
        END IF;
        IF p_idsBaixaFinanceiroCheque IS NOT NULL
          AND p_idsBaixaFinanceiroCheque <> ' '
        THEN
          FOR b IN (
            SELECT TO_NUMBER (REGEXP_SUBSTR(p_idsBaixaFinanceiroCheque, '[^,]+', 1, LEVEL)) AS idBaixaFinanceiro
            FROM DUAL
            CONNECT BY LEVEL <= REGEXP_COUNT (p_idsBaixaFinanceiroCheque, ',') + 1)
          LOOP
            ADD_FINANC_BAIXA_BAIXA_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_id
              v_baixa_idBaixaFinanceiro, -- p_idBaixaFinanceiro
              b.idBaixaFinanceiro, -- p_idBaixaFinanceiroCorrel
              v_auxNumber); -- r_id
          END LOOP;
        END IF;
        UPDATE TEMPRECEBIMENTO tempRec SET
          tempRec.saldo = tempRec.saldo - v_baixa_valorBruto,
          tempRec.saldoIndexado = tempRec.saldoIndexado - v_baixa_valorBrutoIndexado,
          tempRec.saldoVariacaoIndexador = tempRec.saldoVariacaoIndexador - v_baixa_valorVariacaoIndexador,
          tempRec.saldoJurosDeMora = tempRec.saldoJurosDeMora - ROUND (v_baixa_valorJurosTotal * CASE WHEN p_confirm_valorJurosTotal > p_somaSel_valorJurosDeMora AND p_confirm_valorJurosTotal <> 0 THEN p_somaSel_valorJurosDeMora / p_confirm_valorJurosTotal ELSE 1 END, 2),
          tempRec.saldoMulta = tempRec.saldoMulta - ROUND (v_baixa_valorMultaTotal * CASE WHEN p_confirm_valorMultaTotal > p_somaSel_valorMulta AND p_confirm_valorMultaTotal <> 0 THEN p_somaSel_valorMulta / p_confirm_valorMultaTotal ELSE 1 END, 2),
          tempRec.saldoTarifaCartao = tempRec.saldoTarifaCartao - v_baixa_valorTarifaCartao,
          tempRec.saldoDescontos = tempRec.saldoDescontos - v_baixa_valorDescontos,
          tempRec.saldoOutrosAcrescimos = tempRec.saldoOutrosAcrescimos - v_baixa_valorOutrosAcrescimos,
          tempRec.saldoLiquido = tempRec.saldoLiquido - v_baixa_valorLiquido - v_baixa_valorDescontoInformado + v_baixa_valorAcrescimoInformad,
          tempRec.selecionado = CASE WHEN ROUND (tempRec.saldoLiquido - v_baixa_valorLiquido - v_baixa_valorDescontoInformado + v_baixa_valorAcrescimoInformad, 2) < =0 THEN 0 ELSE 1 END
        WHERE tempRec.sessaoClient = p_sessaoClient
        AND tempRec.contadorSessao = p_contadorSessaoTEMPRECEBIMENT
        AND tempRec.origem = 'F'
        AND tempRec.id = a.id;
        v_saldoBaixarPagamento      := v_saldoBaixarPagamento - v_baixa_valorLiquido;
        r_somaValorLiquidado        := r_somaValorLiquidado + v_baixa_valorLiquido;
        r_saldoJurosTotal           := r_saldoJurosTotal - v_baixa_valorJurosTotal;
        r_saldoMultaTotal           := r_saldoMultaTotal - v_baixa_valorMultaTotal;
        r_saldoDescontoInformado    := r_saldoDescontoInformado - v_baixa_valorDescontoInformado;
        r_saldoAcrescimoInformado   := r_saldoAcrescimoInformado - v_baixa_valorAcrescimoInformad;
        r_residuoValorBrutoIndexado := v_novoResiduoValorBrutoIndexad;
        r_residuoVariacaoIndexador  := v_novoResiduoVariacaoIndexador;
        r_residuoJurosDeMora        := v_novoResiduoJurosDeMora;
        r_residuoMulta              := v_novoResiduoMulta;
        r_residuoTarifaCartao       := v_novoResiduoTarifaCartao;
        r_residuoDescontos          := v_novoResiduoDescontos;
        r_residuoOutrosAcrescimos   := v_novoResiduoOutrosAcrescimos;
        r_residuoDescontoInformado  := v_novoResiduoDescontoInformado;
        r_residuoAcrescimoInformado := v_novoResiduoAcrescimoInformad;
      END IF;
    END IF;
  END LOOP;
END ADD_FINANC_TEMPRECEBIMENTO_EF;

/

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (990, 'Link´s Pagamento', 1, 5010009900, 50, 'MOV', 0, 990, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'PesqLinksPagamento', 'DetLinkPagamento', 0, 0, NULL, ' ');

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (436, 'Modelo financeiro link pagamento', 1, 60001, 'N', '4', 'E', 0, '0', 'PAMODELOSFINANCEIRO', ' ');

COMMIT;

