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;

DROP TABLE TEMPFORMPRECOPRODUTOS;

-- TEMPFORMPRECOPRODUTOS
CREATE GLOBAL TEMPORARY TABLE TEMPFORMPRECOPRODUTOS
  (
    sessaoClient                   VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id                             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPai                          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    legenda                        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    selecionado                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imagem                         VARCHAR (256) DEFAULT ' ' NOT NULL,
    gradeProduto                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto                        NUMERIC (7,0) DEFAULT 0 NOT NULL,
    cor                            NUMERIC (7,0) DEFAULT 0 NOT NULL,
    tamanho                        VARCHAR (10) DEFAULT ' ' NOT NULL,
    personalizacao                 NUMERIC (7,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    quantidade                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoque              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    idProdutoXCustoAnterior        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoCustoAnterior             NUMERIC (15,7) DEFAULT 0 NOT NULL,
    idProdutoXCustoAtualizado      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoCustoAtualizado           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUltimaCompraNovo          NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCustoNovo                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percentualVariacao             NUMERIC (15,8) DEFAULT 0 NOT NULL,
    preDocumento                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idDocumentoFiscal              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoDocumento                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    idDocumento                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pessoa                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloDocumento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEntrada                    DATE,
    idCenarioCalculoPreco          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    compraComST                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    retidoISSQN                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    valorISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetIRRF                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetINSS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetOutros                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMercantil NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesaAduaneira          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFrete                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDesconto                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJuros                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesas            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOperacional  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOperacional NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtemporaneo     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    prazoMedioPonderado            NUMERIC (6,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPFORMPRECOPRODUTOS_PK1 ON TEMPFORMPRECOPRODUTOS (sessaoClient, contadorSessao, id);
CREATE INDEX TEMPFORMPRECOPRODUTOS_K2 ON TEMPFORMPRECOPRODUTOS (sessaoClient, contadorSessao, idPai, id);

DROP TABLE TEMPFORMPRECOTABELAS;

-- TEMPFORMPRECOTABELAS
CREATE GLOBAL TEMPORARY TABLE TEMPFORMPRECOTABELAS
  (
    sessaoClient              VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPai                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tabelaPreco               VARCHAR (10) DEFAULT ' ' NOT NULL,
    selecionado               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    idCenarioCalculoPreco     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    operacaoFiscal            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFormacaoPrecoTabela     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPrecoTabelaAtual        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoUnitarioAtual        NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percMargemAdicionalAtual  NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorMargemAdicionalAtual NUMERIC (15,7) DEFAULT 0 NOT NULL,
    margemMarkupAtual         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    idPrecoTabelaNovo         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoUnitarioNovo         NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percMargemAdicionalNovo   NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorMargemAdicionalNovo  NUMERIC (15,7) DEFAULT 0 NOT NULL,
    margemMarkupNovo          NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percentualVariacao        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    margemMarkupIdeal         NUMERIC (15,8) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPFORMPRECOTABELAS_PK1 ON TEMPFORMPRECOTABELAS (sessaoClient, contadorSessao, id);
CREATE INDEX TEMPFORMPRECOTABELAS_K2 ON TEMPFORMPRECOTABELAS (sessaoClient, contadorSessao, idPai, id);

DROP TABLE TEMPFORMPRECOINCIDENCIAS;

-- TEMPFORMPRECOINCIDENCIAS
CREATE GLOBAL TEMPORARY TABLE TEMPFORMPRECOINCIDENCIAS
  (
    sessaoClient            VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPai                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao               NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao               VARCHAR (120) DEFAULT ' ' NOT NULL,
    somaDiminuiIgnora       CHAR (1) DEFAULT ' ' NOT NULL,
    percentualBase          NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBase               NUMERIC (15,7) DEFAULT 0 NOT NULL,
    indicadorConta          CHAR (1) DEFAULT ' ' NOT NULL,
    valor                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percSobreReceita        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percSobreReceitaLiquida NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percSobreCusto          NUMERIC (15,8) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPFORMPRECOINCIDENCIAS_PK1 ON TEMPFORMPRECOINCIDENCIAS (sessaoClient, contadorSessao, idPai, ordenacao);

UPDATE SIINCIDENCIASFORMACAOPREC SET descricao = 'ISSQN não Retido' WHERE incidenciaFormacaoPreco = 2008;
UPDATE SIINCIDENCIASFORMACAOPREC SET descricao = 'ISSQN Retido' WHERE incidenciaFormacaoPreco = 2009;
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2010, 'IRRF Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2011, 'INSS Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2012, 'COFINS Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2013, 'PIS Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2014, 'CSLL Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2015, 'Outras Retenções', 1, 20, 1, 1, 0, ' ');
UPDATE PACENARIOCALCPRECOINCID SET incidenciaFormacaoPreco = 2010 WHERE incidenciaFormacaoPreco = 2008;
UPDATE PACENARIOCALCPRECOINCID SET incidenciaFormacaoPreco = 2014 WHERE incidenciaFormacaoPreco = 2009;
UPDATE CAPRODUTOXCUSTOXALIQUOTAS SET incidenciaFormacaoPreco = 2010 WHERE incidenciaFormacaoPreco = 2008;
UPDATE CAPRODUTOXCUSTOXALIQUOTAS SET incidenciaFormacaoPreco = 2014 WHERE incidenciaFormacaoPreco = 2009;

COMMIT;

-- SIENTRADASAIDADRE
CREATE TABLE SIENTRADASAIDADRE
  (
    entradaSaidaDre CHAR (1) DEFAULT ' ' NOT NULL,
    descricao       VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes     VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIENTRADASAIDADRE ADD CONSTRAINT SIENTRADASAIDADRE_PK1 PRIMARY KEY (entradaSaidaDre);
CREATE INDEX SIENTRADASAIDADRE_K2 ON SIENTRADASAIDADRE (descricao);

INSERT INTO SIENTRADASAIDADRE (entradaSaidaDre, descricao, ativo, observacoes) values (' ','SELECIONE', 1, ' ');
INSERT INTO SIENTRADASAIDADRE (entradaSaidaDre, descricao, ativo, observacoes) values ('D','DRE', 1, ' ');
INSERT INTO SIENTRADASAIDADRE (entradaSaidaDre, descricao, ativo, observacoes) values ('E','Entrada', 1, ' ');
INSERT INTO SIENTRADASAIDADRE (entradaSaidaDre, descricao, ativo, observacoes) values ('S','Saída', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIENTRADASAIDADRE', 'Entrada / Saída / DRE', 1, 803, 'SI', 'entradaSaidaDre', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqEntradaSaidaDre', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (991, 'Entrada / Saída / DRE', 1, 9090009910, 90, 'SIS', 0, 991, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqEntradaSaidaDre', ' ', 0, 0, NULL, ' ');

COMMIT;

-- MOAVALIAMARGENSPRODUTOS
CREATE TABLE MOAVALIAMARGENSPRODUTOS
  (
    idAvaliaMargemProduto          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,
    modeloDocumentoEntrada         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    fornecedor                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    indicadorPessoaFornecedor      CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorInscricaoEstadFornec  CHAR (1) DEFAULT ' ' NOT NULL,
    ufFornecedor                   CHAR (2) DEFAULT '  ' NOT NULL,
    condicaoPagamentoEntrada       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    modeloDocumentoSaida           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    cliente                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    indicadorPessoaCliente         CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorInscricaoEstadCliente CHAR (1) DEFAULT ' ' NOT NULL,
    ufCliente                      CHAR (2) DEFAULT '  ' NOT NULL,
    condicaoPagamentoSaida         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradeProduto                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNcm                          NUMERIC (11,0) DEFAULT 0 NOT NULL,
    quantidade                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tabelaPreco                    VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoUnitario                  NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCompra                    NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCusto                     NUMERIC (15,7) DEFAULT 0 NOT NULL,
    operacaoFiscalEntrada          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    operacaoFiscalSaida            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    margemSobreReceitaBruta        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    markup                         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    margemSobreReceitaLiquida      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percMargemAdicional            NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorMargemAdicional           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    margemMarkup                   NUMERIC (15,8) DEFAULT 0 NOT NULL,
    observacoes                    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_PK1 PRIMARY KEY (idAvaliaMargemProduto);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K2 ON MOAVALIAMARGENSPRODUTOS (estabelecimento);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K3 ON MOAVALIAMARGENSPRODUTOS (data);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K4 ON MOAVALIAMARGENSPRODUTOS (usuario);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K5 ON MOAVALIAMARGENSPRODUTOS (modeloDocumentoEntrada);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K6 ON MOAVALIAMARGENSPRODUTOS (fornecedor);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K7 ON MOAVALIAMARGENSPRODUTOS (indicadorPessoaFornecedor);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K8 ON MOAVALIAMARGENSPRODUTOS (indicadorInscricaoEstadFornec);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K9 ON MOAVALIAMARGENSPRODUTOS (ufFornecedor);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K10 ON MOAVALIAMARGENSPRODUTOS (condicaoPagamentoEntrada);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K11 ON MOAVALIAMARGENSPRODUTOS (modeloDocumentoSaida);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K12 ON MOAVALIAMARGENSPRODUTOS (cliente);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K13 ON MOAVALIAMARGENSPRODUTOS (indicadorPessoaCliente);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K14 ON MOAVALIAMARGENSPRODUTOS (indicadorInscricaoEstadCliente);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K15 ON MOAVALIAMARGENSPRODUTOS (ufCliente);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K16 ON MOAVALIAMARGENSPRODUTOS (condicaoPagamentoSaida);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K17 ON MOAVALIAMARGENSPRODUTOS (gradeProduto);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K18 ON MOAVALIAMARGENSPRODUTOS (idNcm);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K19 ON MOAVALIAMARGENSPRODUTOS (tabelaPreco);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K20 ON MOAVALIAMARGENSPRODUTOS (operacaoFiscalEntrada);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K21 ON MOAVALIAMARGENSPRODUTOS (operacaoFiscalSaida);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK2 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK3 FOREIGN KEY (modeloDocumentoEntrada) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK4 FOREIGN KEY (fornecedor) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK5 FOREIGN KEY (indicadorPessoaFornecedor) REFERENCES SIINDICPESSOA (indicadorPessoa);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK6 FOREIGN KEY (indicadorInscricaoEstadFornec) REFERENCES SIINDICINSCRICAOESTADUAL (indicadorInscricaoEstadual);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK7 FOREIGN KEY (ufFornecedor) REFERENCES SIUFS (uf);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK8 FOREIGN KEY (condicaoPagamentoEntrada) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK9 FOREIGN KEY (modeloDocumentoSaida) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK10 FOREIGN KEY (cliente) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK11 FOREIGN KEY (indicadorPessoaCliente) REFERENCES SIINDICPESSOA (indicadorPessoa);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK12 FOREIGN KEY (indicadorInscricaoEstadCliente) REFERENCES SIINDICINSCRICAOESTADUAL (indicadorInscricaoEstadual);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK13 FOREIGN KEY (ufCliente) REFERENCES SIUFS (uf);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK14 FOREIGN KEY (condicaoPagamentoSaida) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK15 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK16 FOREIGN KEY (idNcm) REFERENCES SINCMS (idNcm);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK17 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK18 FOREIGN KEY (operacaoFiscalEntrada) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK19 FOREIGN KEY (operacaoFiscalSaida) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);

INSERT INTO MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto, estabelecimento, data, usuario, modeloDocumentoEntrada, fornecedor, indicadorPessoaFornecedor, indicadorInscricaoEstadFornec, ufFornecedor, condicaoPagamentoEntrada, modeloDocumentoSaida, cliente, indicadorPessoaCliente, indicadorInscricaoEstadCliente, ufCliente, condicaoPagamentoSaida, gradeProduto, idNcm, quantidade, tabelaPreco, precoUnitario, precoCompra, precoCusto, operacaoFiscalEntrada, operacaoFiscalSaida, margemSobreReceitaBruta, markup, margemSobreReceitaLiquida, percMargemAdicional, valorMargemAdicional, margemMarkup, observacoes) VALUES (0, 0, NULL, 0, 0, 0, ' ', ' ', '  ', 0, 0, 0, ' ', ' ', '  ', 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');

COMMIT;

-- MOAVALIAMARGEMPRODXINCID
CREATE TABLE MOAVALIAMARGEMPRODXINCID
  (
    id                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAvaliaMargemProduto   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    entradaSaidaDre         CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao               NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao               VARCHAR (120) DEFAULT ' ' NOT NULL,
    somaDiminuiIgnora       CHAR (1) DEFAULT ' ' NOT NULL,
    percentualBase          NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBase               NUMERIC (15,7) DEFAULT 0 NOT NULL,
    indicadorConta          CHAR (1) DEFAULT ' ' NOT NULL,
    valor                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percSobreReceita        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percSobreReceitaLiquida NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percSobreCusto          NUMERIC (15,8) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOAVALIAMARGEMPRODXINCID_K2 ON MOAVALIAMARGEMPRODXINCID (idAvaliaMargemProduto, entradaSaidaDre, ordenacao);
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK2 FOREIGN KEY (entradaSaidaDre) REFERENCES SIENTRADASAIDADRE (entradaSaidaDre);
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK3 FOREIGN KEY (somaDiminuiIgnora) REFERENCES SISOMADIMINUIIGNORA (somaDiminuiIgnora);
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK4 FOREIGN KEY (indicadorConta) REFERENCES SIINDICADORCONTA (indicadorConta);

INSERT INTO MOAVALIAMARGEMPRODXINCID (id, idAvaliaMargemProduto, entradaSaidaDre, ordenacao, descricao, somaDiminuiIgnora, percentualBase, valorBase, indicadorConta, valor, percSobreReceita, percSobreReceitaLiquida, percSobreCusto) VALUES (0, 0, ' ', 0, ' ', ' ', 0, 0, ' ', 0, 0, 0, 0);

COMMIT;

-- MOAVALIAMARGEMPRODXORCAM
CREATE TABLE MOAVALIAMARGEMPRODXORCAM
  (
    id                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAvaliaMargemProduto NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento       NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOAVALIAMARGEMPRODXORCAM ADD CONSTRAINT MOAVALIAMARGEMPRODXORCAM_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOAVALIAMARGEMPRODXORCAM_K2 ON MOAVALIAMARGEMPRODXORCAM (idAvaliaMargemProduto, idItemOrcamento);
CREATE INDEX MOAVALIAMARGEMPRODXORCAM_K3 ON MOAVALIAMARGEMPRODXORCAM (idAvaliaMargemProduto);
CREATE INDEX MOAVALIAMARGEMPRODXORCAM_K4 ON MOAVALIAMARGEMPRODXORCAM (idItemOrcamento);
ALTER TABLE MOAVALIAMARGEMPRODXORCAM ADD CONSTRAINT MOAVALIAMARGEMPRODXORCAM_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXORCAM ADD CONSTRAINT MOAVALIAMARGEMPRODXORCAM_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);

INSERT INTO MOAVALIAMARGEMPRODXORCAM (id, idAvaliaMargemProduto, idItemOrcamento) VALUES (0, 0, 0);

COMMIT;

-- MOAVALIAMARGEMPRODXPREDOC
CREATE TABLE MOAVALIAMARGEMPRODXPREDOC
  (
    id                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAvaliaMargemProduto NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento    NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOAVALIAMARGEMPRODXPREDOC ADD CONSTRAINT MOAVALIAMARGEMPRODXPREDOC_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOAVALIAMARGEMPRODXPREDOC_K2 ON MOAVALIAMARGEMPRODXPREDOC (idAvaliaMargemProduto, idItemPreDocumento);
CREATE INDEX MOAVALIAMARGEMPRODXPREDOC_K3 ON MOAVALIAMARGEMPRODXPREDOC (idAvaliaMargemProduto);
CREATE INDEX MOAVALIAMARGEMPRODXPREDOC_K4 ON MOAVALIAMARGEMPRODXPREDOC (idItemPreDocumento);
ALTER TABLE MOAVALIAMARGEMPRODXPREDOC ADD CONSTRAINT MOAVALIAMARGEMPRODXPREDOC_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXPREDOC ADD CONSTRAINT MOAVALIAMARGEMPRODXPREDOC_FK2 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);

INSERT INTO MOAVALIAMARGEMPRODXPREDOC (id, idAvaliaMargemProduto, idItemPreDocumento) VALUES (0, 0, 0);

COMMIT;

-- MOAVALIAMARGEMPRODXDOCFISC
CREATE TABLE MOAVALIAMARGEMPRODXDOCFISC
  (
    id                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAvaliaMargemProduto NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal       NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOAVALIAMARGEMPRODXDOCFISC ADD CONSTRAINT MOAVALIAMARGEMPRODXDOCFISC_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOAVALIAMARGEMPRODXDOCFISC_K2 ON MOAVALIAMARGEMPRODXDOCFISC (idAvaliaMargemProduto, idItemDocFiscal);
CREATE INDEX MOAVALIAMARGEMPRODXDOCFISC_K3 ON MOAVALIAMARGEMPRODXDOCFISC (idAvaliaMargemProduto);
CREATE INDEX MOAVALIAMARGEMPRODXDOCFISC_K4 ON MOAVALIAMARGEMPRODXDOCFISC (idItemDocFiscal);
ALTER TABLE MOAVALIAMARGEMPRODXDOCFISC ADD CONSTRAINT MOAVALIAMARGEMPRODXDOCFISC_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXDOCFISC ADD CONSTRAINT MOAVALIAMARGEMPRODXDOCFISC_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);

INSERT INTO MOAVALIAMARGEMPRODXDOCFISC (id, idAvaliaMargemProduto, idItemDocFiscal) VALUES (0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGENSPRODUTOS', 'Avalia Margens Produtos', 1, 50509, 'MO', 'idAvaliaMargemProduto', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGEMPRODXINCID', 'Avalia Margem Produto X Índices', 1, 50510, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGEMPRODXORCAM', 'Avalia Margem Produto X Orçamentos', 1, 50511, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGEMPRODXPREDOC', 'Avalia Margem Produto X Pré-Documentos', 1, 50512, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGEMPRODXDOCFISC', 'Avalia Margem Produto X Documentos Fiscais', 1, 50513, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 

UPDATE SITABELASSISTEMA SET ordenacao = 50515 WHERE tabelaSistema= 'MOLINKSPAGAMENTO'; 
UPDATE SITABELASSISTEMA SET ordenacao = 50516 WHERE tabelaSistema= 'MOLINKPAGAMENTOXBAIXAS'; 
UPDATE SITABELASSISTEMA SET ordenacao = 50517 WHERE tabelaSistema= 'MOLINKPAGAMENTOXORCAMENTO'; 
UPDATE SITABELASSISTEMA SET ordenacao = 50518 WHERE tabelaSistema= 'MOLINKPAGAMENTOXPREDOCUM'; 
UPDATE SITABELASSISTEMA SET ordenacao = 50519 WHERE tabelaSistema= 'MOLINKPAGAMENTOXDOCFISCAL'; 

COMMIT;

create or replace PROCEDURE ADD_AVALMARG_CABECALHO_GRAVA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idAvaliaMargemProduto        IN NUMBER,
  p_estabelecimento              IN NUMBER,
  p_data                         IN DATE,
  p_usuario                      IN NUMBER,
  p_modeloDocumentoEntrada       IN NUMBER,
  p_fornecedor                   IN NUMBER,
  p_indicadorPessoaFornecedor    IN CHAR,
  p_indicadorInscricaoEstadForn  IN CHAR,
  p_ufFornecedor                 IN CHAR,
  p_condicaoPagamentoEntrada     IN NUMBER,
  p_modeloDocumentoSaida         IN NUMBER,
  p_cliente                      IN NUMBER,
  p_indicadorPessoaCliente       IN CHAR,
  p_indicadorInscricaoEstadClien IN CHAR,
  p_ufCliente                    IN CHAR,
  p_condicaoPagamentoSaida       IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_idNcm                        IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_tabelaPreco                  IN VARCHAR2,
  p_precoUnitario                IN NUMBER,
  p_precoCompra                  IN NUMBER,
  p_precoCusto                   IN NUMBER,
  p_operacaoFiscalEntrada        IN NUMBER,
  p_operacaoFiscalSaida          IN NUMBER,
  p_margemSobreReceitaBruta      IN NUMBER,
  p_markup                       IN NUMBER,
  p_margemSobreReceitaLiquida    IN NUMBER,
  p_percMargemAdicional          IN NUMBER,
  p_valorMargemAdicional         IN NUMBER,
  p_margemMarkup                 IN NUMBER,
  p_observacoes                  IN VARCHAR2,
  r_idAvaliaMargemProduto        OUT NUMBER)
IS
BEGIN
  r_idAvaliaMargemProduto := p_idAvaliaMargemProduto;
  IF r_idAvaliaMargemProduto = 0 THEN
    r_idAvaliaMargemProduto := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGENSPRODUTOS',
      'idAvaliaMargemProduto',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGENSPRODUTOS a 
  USING (
    SELECT
      r_idAvaliaMargemProduto        idAvaliaMargemProduto,
      p_estabelecimento              estabelecimento,
      p_data                         data,
      p_usuario                      usuario,
      p_modeloDocumentoEntrada       modeloDocumentoEntrada,
      p_fornecedor                   fornecedor,
      p_indicadorPessoaFornecedor    indicadorPessoaFornecedor,
      p_indicadorInscricaoEstadForn  indicadorInscricaoEstadFornec,
      p_ufFornecedor                 ufFornecedor,
      p_condicaoPagamentoEntrada     condicaoPagamentoEntrada,
      p_modeloDocumentoSaida         modeloDocumentoSaida,
      p_cliente                      cliente,
      p_indicadorPessoaCliente       indicadorPessoaCliente,
      p_indicadorInscricaoEstadClien indicadorInscricaoEstadCliente,
      p_ufCliente                    ufCliente,
      p_condicaoPagamentoSaida       condicaoPagamentoSaida,
      p_gradeProduto                 gradeProduto,
      p_idNcm                        idNcm,
      p_quantidade                   quantidade,
      p_tabelaPreco                  tabelaPreco,
      p_precoUnitario                precoUnitario,
      p_precoCompra                  precoCompra,
      p_precoCusto                   precoCusto,
      p_operacaoFiscalEntrada        operacaoFiscalEntrada,
      p_operacaoFiscalSaida          operacaoFiscalSaida,
      p_margemSobreReceitaBruta      margemSobreReceitaBruta,
      p_markup                       markup,
      p_margemSobreReceitaLiquida    margemSobreReceitaLiquida,
      p_percMargemAdicional          percMargemAdicional,
      p_valorMargemAdicional         valorMargemAdicional,
      p_margemMarkup                 margemMarkup,
      p_observacoes                  observacoes
    FROM DUAL) b
  ON (a.idAvaliaMargemProduto = b.idAvaliaMargemProduto)
  WHEN MATCHED THEN UPDATE SET
    a.estabelecimento                = b.estabelecimento,
    a.data                           = b.data,
    a.usuario                        = b.usuario,
    a.modeloDocumentoEntrada         = b.modeloDocumentoEntrada,
    a.fornecedor                     = b.fornecedor,
    a.indicadorPessoaFornecedor      = b.indicadorPessoaFornecedor,
    a.indicadorInscricaoEstadFornec  = b.indicadorInscricaoEstadFornec,
    a.ufFornecedor                   = b.ufFornecedor,
    a.condicaoPagamentoEntrada       = b.condicaoPagamentoEntrada,
    a.modeloDocumentoSaida           = b.modeloDocumentoSaida,
    a.cliente                        = b.cliente,
    a.indicadorPessoaCliente         = b.indicadorPessoaCliente,
    a.indicadorInscricaoEstadCliente = b.indicadorInscricaoEstadCliente,
    a.ufCliente                      = b.ufCliente,
    a.condicaoPagamentoSaida         = b.condicaoPagamentoSaida,
    a.gradeProduto                   = b.gradeProduto,
    a.idNcm                          = b.idNcm,
    a.quantidade                     = b.quantidade,
    a.tabelaPreco                    = b.tabelaPreco,
    a.precoUnitario                  = b.precoUnitario,
    a.precoCompra                    = b.precoCompra,
    a.precoCusto                     = b.precoCusto,
    a.operacaoFiscalEntrada          = b.operacaoFiscalEntrada,
    a.operacaoFiscalSaida            = b.operacaoFiscalSaida,
    a.margemSobreReceitaBruta        = b.margemSobreReceitaBruta,
    a.markup                         = b.markup,
    a.margemSobreReceitaLiquida      = b.margemSobreReceitaLiquida,
    a.percMargemAdicional            = b.percMargemAdicional,
    a.valorMargemAdicional           = b.valorMargemAdicional,
    a.margemMarkup                   = b.margemMarkup,
    a.observacoes                    = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idAvaliaMargemProduto,
    estabelecimento,
    data,
    usuario,
    modeloDocumentoEntrada,
    fornecedor,
    indicadorPessoaFornecedor,
    indicadorInscricaoEstadFornec,
    ufFornecedor,
    condicaoPagamentoEntrada,
    modeloDocumentoSaida,
    cliente,
    indicadorPessoaCliente,
    indicadorInscricaoEstadCliente,
    ufCliente,
    condicaoPagamentoSaida,
    gradeProduto,
    idNcm,
    quantidade,
    tabelaPreco,
    precoUnitario,
    precoCompra,
    precoCusto,
    operacaoFiscalEntrada,
    operacaoFiscalSaida,
    margemSobreReceitaBruta,
    markup,
    margemSobreReceitaLiquida,
    percMargemAdicional,
    valorMargemAdicional,
    margemMarkup,
    observacoes)
  VALUES (
    b.idAvaliaMargemProduto,
    b.estabelecimento,
    b.data,
    b.usuario,
    b.modeloDocumentoEntrada,
    b.fornecedor,
    b.indicadorPessoaFornecedor,
    b.indicadorInscricaoEstadFornec,
    b.ufFornecedor,
    b.condicaoPagamentoEntrada,
    b.modeloDocumentoSaida,
    b.cliente,
    b.indicadorPessoaCliente,
    b.indicadorInscricaoEstadCliente,
    b.ufCliente,
    b.condicaoPagamentoSaida,
    b.gradeProduto,
    b.idNcm,
    b.quantidade,
    b.tabelaPreco,
    b.precoUnitario,
    b.precoCompra,
    b.precoCusto,
    b.operacaoFiscalEntrada,
    b.operacaoFiscalSaida,
    b.margemSobreReceitaBruta,
    b.markup,
    b.margemSobreReceitaLiquida,
    b.percMargemAdicional,
    b.valorMargemAdicional,
    b.margemMarkup,
    b.observacoes);
END ADD_AVALMARG_CABECALHO_GRAVA;

/

create or replace PROCEDURE ADD_AVALMARG_INCIDENCIA_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idAvaliaMargemProduto     IN NUMBER,
  p_entradaSaidaDre           IN CHAR,
  p_ordenacao                 IN NUMBER,
  p_descricao                 IN VARCHAR,
  p_somaDiminuiIgnora         IN CHAR,
  p_percentualBase            IN NUMBER,
  p_valorBase                 IN NUMBER,
  p_indicadorConta            IN CHAR,
  p_valor                     IN NUMBER,
  p_percSobreReceita          IN NUMBER,
  p_percSobreReceitaLiquida   IN NUMBER,
  p_percSobreCusto            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 MOAVALIAMARGEMPRODXINCID
    WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto
    AND entradaSaidaDre         = p_entradaSaidaDre
    AND ordenacao               = p_ordenacao;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGEMPRODXINCID',
      'id',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGEMPRODXINCID a 
  USING (
    SELECT
      r_id                      id,
      p_idAvaliaMargemProduto   idAvaliaMargemProduto,
      p_entradaSaidaDre         entradaSaidaDre,
      p_ordenacao               ordenacao,
      p_descricao               descricao,
      p_somaDiminuiIgnora       somaDiminuiIgnora,
      p_percentualBase          percentualBase,
      p_valorBase               valorBase,
      p_indicadorConta          indicadorConta,
      p_valor                   valor,
      p_percSobreReceita        percSobreReceita,
      p_percSobreReceitaLiquida percSobreReceitaLiquida,
      p_percSobreCusto          percSobreCusto
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idAvaliaMargemProduto   = b.idAvaliaMargemProduto,
    a.entradaSaidaDre         = b.entradaSaidaDre,
    a.ordenacao               = b.ordenacao,
    a.descricao               = b.descricao,
    a.somaDiminuiIgnora       = b.somaDiminuiIgnora,
    a.percentualBase          = b.percentualBase,
    a.valorBase               = b.valorBase,
    a.indicadorConta          = b.indicadorConta,
    a.valor                   = b.valor,
    a.percSobreReceita        = b.percSobreReceita,
    a.percSobreReceitaLiquida = b.percSobreReceitaLiquida,
    a.percSobreCusto          = b.percSobreCusto
  WHEN NOT MATCHED THEN INSERT (
    id,
    idAvaliaMargemProduto,
    entradaSaidaDre,
    ordenacao,
    descricao,
    somaDiminuiIgnora,
    percentualBase,
    valorBase,
    indicadorConta,
    valor,
    percSobreReceita,
    percSobreReceitaLiquida,
    percSobreCusto)
  VALUES (
    b.id,
    b.idAvaliaMargemProduto,
    b.entradaSaidaDre,
    b.ordenacao,
    b.descricao,
    b.somaDiminuiIgnora,
    b.percentualBase,
    b.valorBase,
    b.indicadorConta,
    b.valor,
    b.percSobreReceita,
    b.percSobreReceitaLiquida,
    b.percSobreCusto);
END ADD_AVALMARG_INCIDENCIA_GRAVA;

/

create or replace PROCEDURE ADD_AVALMARG_ORCAMENTO_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idAvaliaMargemProduto     IN NUMBER,
  p_idItemOrcamento           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 MOAVALIAMARGEMPRODXORCAM
    WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto
    AND idItemOrcamento         = p_idItemOrcamento;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGEMPRODXORCAM',
      'id',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGEMPRODXORCAM a 
  USING (
    SELECT
      r_id                    id,
      p_idAvaliaMargemProduto idAvaliaMargemProduto,
      p_idItemOrcamento       idItemOrcamento
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idAvaliaMargemProduto = b.idAvaliaMargemProduto,
    a.idItemOrcamento       = b.idItemOrcamento
  WHEN NOT MATCHED THEN INSERT (
    id,
    idAvaliaMargemProduto,
    idItemOrcamento)
  VALUES (
    b.id,
    b.idAvaliaMargemProduto,
    b.idItemOrcamento);
END ADD_AVALMARG_ORCAMENTO_GRAVA;

/

create or replace PROCEDURE ADD_AVALMARG_PRE_DOC_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idAvaliaMargemProduto     IN NUMBER,
  p_idItemPreDocumento        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 MOAVALIAMARGEMPRODXPREDOC
    WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto
    AND idItemPreDocumento      = p_idItemPreDocumento;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGEMPRODXPREDOC',
      'id',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGEMPRODXPREDOC a 
  USING (
    SELECT
      r_id                    id,
      p_idAvaliaMargemProduto idAvaliaMargemProduto,
      p_idItemPreDocumento    idItemPreDocumento
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idAvaliaMargemProduto = b.idAvaliaMargemProduto,
    a.idItemPreDocumento    = b.idItemPreDocumento
  WHEN NOT MATCHED THEN INSERT (
    id,
    idAvaliaMargemProduto,
    idItemPreDocumento)
  VALUES (
    b.id,
    b.idAvaliaMargemProduto,
    b.idItemPreDocumento);
END ADD_AVALMARG_PRE_DOC_GRAVA;

/

create or replace PROCEDURE ADD_AVALMARG_DOC_FISC_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idAvaliaMargemProduto     IN NUMBER,
  p_idItemDocFiscal           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 MOAVALIAMARGEMPRODXDOCFISC
    WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto
    AND idItemDocFiscal         = p_idItemDocFiscal;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGEMPRODXDOCFISC',
      'id',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGEMPRODXDOCFISC a 
  USING (
    SELECT
      r_id                    id,
      p_idAvaliaMargemProduto idAvaliaMargemProduto,
      p_idItemDocFiscal       idItemDocFiscal
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idAvaliaMargemProduto = b.idAvaliaMargemProduto,
    a.idItemDocFiscal       = b.idItemDocFiscal
  WHEN NOT MATCHED THEN INSERT (
    id,
    idAvaliaMargemProduto,
    idItemDocFiscal)
  VALUES (
    b.id,
    b.idAvaliaMargemProduto,
    b.idItemDocFiscal);
END ADD_AVALMARG_DOC_FISC_GRAVA;

/

UPDATE SICATEGORIASFORMACAOPRECO SET descricao = '(=) Margem Bruta' WHERE categoriaFormacaoPreco = 50;
UPDATE SICATEGORIASFORMACAOPRECO SET descricao = '(=) Margem Antes Desp./Rec. Financ.' WHERE categoriaFormacaoPreco = 75;
UPDATE SICATEGORIASFORMACAOPRECO SET descricao = '(=) Margem Contribuição' WHERE categoriaFormacaoPreco = 90;

COMMIT;

UPDATE SIINCIDENCIASFORMACAOPREC SET descricao = 'Comissão Média' WHERE incidenciaFormacaoPreco = 6503;

COMMIT;

create or replace FUNCTION FUNC_ADD_BUSCA_OPERAC_FISC_NCM (
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_pessoa                   IN NUMBER,
  p_cab_vendaConsumidor          IN NUMBER,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_est_grupoFiscal              IN NUMBER,
  p_pessEst_regimeTributario     IN CHAR,
  p_endPessEstMun_uf             IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  p_endPessMun_uf                IN CHAR,
  p_produto                      IN NUMBER,
  p_prod_idNcm                   IN NUMBER)
  RETURN NUMBER
IS
  v_operacaoFiscal NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT a.operacaoFiscal
    FROM (
      SELECT a.operacaoFiscal,
        ROW_NUMBER() OVER (
          ORDER BY
            a.filtrarPessoas DESC,
            CASE
              WHEN a.agrupadorFiscal = 0
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM PAAGRUPFISCXPRODUTOS opX
                WHERE opX.agrupadorFiscal = a.agrupadorFiscal
                AND opX.produto = p_produto
                AND opX.ativo = 1)
              THEN 2
              ELSE 1
            END DESC,
            CASE
              WHEN filtrProd.filtroProduto = 0
              THEN 0
              WHEN filtrProd.filtrarProdutos = 1
              AND EXISTS (
                SELECT 1
                FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
                WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
                AND filtrProdX.produto = p_produto
                AND filtrProdX.ativo = 1)
              THEN 2
              ELSE 1
            END DESC,
            a.ufDestino DESC,
            a.ufOrigem DESC,
            a.regimeTributario DESC,
            a.indicadorInscricaoEstadual DESC,
            a.indicadorConsumidorFinal DESC,
            a.grupoFiscal DESC,
            a.origemMercadoria DESC,
            a.tipoProduto DESC,
            a.operacaoFiscal DESC) ordenacao
      FROM PAOPERACOESFISCAIS a
      JOIN CAPRODUTOS prod
      ON prod.produto = p_produto
      JOIN PASUBCATEGORIASPRODUTO subCat
      ON subCat.subcategoriaProduto = prod.subcategoriaProduto
      JOIN SICFOPS cfop
      ON cfop.cfop = a.cfop
      JOIN SINATUREZASOPERACAO natOp
      ON natOp.naturezaOperacao = cfop.naturezaOperacao
      JOIN SICAPITULOSNATUREZAOPERAC capNatFisc
      ON capNatFisc.capituloNaturezaOperacao = natOp.capituloNaturezaOperacao
      JOIN PAFILTROSPRODUTO filtrProd
      ON filtrProd.filtroProduto = a.filtroProduto
      WHERE a.operacaoFiscal > 0
      AND a.ativo = 1
      AND a.cfop BETWEEN
        CASE
          WHEN p_endPessMun_uf = 'EX'
            AND p_cab_vendaConsumidor = 0
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 3000 ELSE 7000 END
          WHEN p_endPessMun_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_endPessEstMun_uf = p_endPessMun_uf
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 1000 ELSE 5000 END
          ELSE CASE WHEN p_cab_entradaSaida = 'E' THEN 2000 ELSE 6000 END
        END
        AND
        CASE
          WHEN p_endPessMun_uf = 'EX'
            AND p_cab_vendaConsumidor = 0
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 3999 ELSE 7999 END
          WHEN p_endPessMun_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_endPessEstMun_uf = p_endPessMun_uf
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 1999 ELSE 5999 END
          ELSE CASE WHEN p_cab_entradaSaida = 'E' THEN 2999 ELSE 6999 END
        END
      AND TRUNC(a.dataValidadeInicial) <= TRUNC(SYSDATE)
      AND TRUNC(a.dataValidadeFinal)   >= TRUNC(SYSDATE)
      AND capNatFisc.entradaSaida = p_cab_entradaSaida
      AND (a.regimeTributario = ' '
        OR a.regimeTributario = p_pessEst_regimeTributario)
      AND (a.tipoProduto = '  '
        OR a.tipoProduto = prod.tipoProduto)
      AND (a.origemMercadoria = ' '
        OR a.origemMercadoria = prod.origemMercadoria)
      AND (a.grupoFiscal = 0
        OR a.grupoFiscal = p_est_grupoFiscal)
      AND (a.ufOrigem = '  '
        OR a.ufOrigem =
          CASE
            WHEN p_cab_entradaSaida = 'S'
            OR p_endPessMun_uf = '  '
            OR p_cab_vendaConsumidor = 1
            THEN p_endPessEstMun_uf
            ELSE p_endPessMun_uf
          END)
      AND (a.ufDestino = '  '
        OR a.ufDestino =
          CASE
            WHEN p_cab_entradaSaida = 'E'
            OR p_endPessMun_uf = '  '
            OR p_cab_vendaConsumidor = 1
            THEN p_endPessEstMun_uf
            ELSE p_endPessMun_uf
          END)
      AND (a.indicadorConsumidorFinal = ' '
        OR p_cab_indicadorConsumidorFinal = ' '
        OR a.indicadorConsumidorFinal = p_cab_indicadorConsumidorFinal)
      AND (a.indicadorInscricaoEstadual = ' '
        OR p_pess_indicadorInscricaoEstad = ' '
        OR a.indicadorInscricaoEstadual = p_pess_indicadorInscricaoEstad)
      AND (p_cab_modeloDocumento = 0
        OR EXISTS (
          SELECT 1
          FROM PAOPERFISCALXMODELOSDOCUM opX
          WHERE opX.operacaoFiscal = a.operacaoFiscal
          AND opX.modeloDocumento = p_cab_modeloDocumento
          AND opX.ativo = 1))
      AND (a.filtrarPessoas = 0
        OR p_cab_vendaConsumidor = 0 
        AND EXISTS (
          SELECT 1
          FROM PAOPERFISCALXPESSOAS opX
          WHERE opX.operacaoFiscal = a.operacaoFiscal
          AND opX.pessoa = p_cab_pessoa
          AND opX.ativo = 1))
      AND (a.agrupadorFiscal = 0
        OR EXISTS (
          SELECT 1
          FROM PAAGRUPFISCXPRODUTOS opX
          WHERE opX.agrupadorFiscal = a.agrupadorFiscal
          AND opX.produto = p_produto
          AND opX.ativo = 1)
        OR EXISTS (
          SELECT 1
          FROM PAAGRUPFISCXNCMS opX
          WHERE opX.agrupadorFiscal = a.agrupadorFiscal
          AND opX.idNcm = p_prod_idNcm
          AND opX.ativo = 1))
      AND (a.filtroProduto = 0
        OR filtrProd.filtrarProdutos = 0
        AND filtrProd.filtrarCategoriasProdutos = 0
        AND filtrProd.filtrarSubcategoriasProdutos = 0
        AND filtrProd.filtrarMarcas = 0
        AND filtrProd.filtrarCaracteristicasA = 0
        AND filtrProd.filtrarCaracteristicasB = 0
        AND filtrProd.filtrarCaracteristicasC = 0
        AND filtrProd.filtrarCaracteristicasD = 0
        AND filtrProd.filtrarCaracteristicasE = 0
        AND filtrProd.filtrarCores = 0
        AND filtrProd.filtrarTamanhos = 0
        AND filtrProd.filtrarNCMs = 0
        AND filtrProd.filtrarListasServicos = 0
        OR filtrProd.filtrarProdutos = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.produto = p_produto
          AND filtrProdX.ativo = 1)
        OR (filtrProd.filtrarCategoriasProdutos = 1
          OR filtrProd.filtrarSubcategoriasProdutos = 1
          OR filtrProd.filtrarMarcas = 1
          OR filtrProd.filtrarCaracteristicasA = 1
          OR filtrProd.filtrarCaracteristicasB = 1
          OR filtrProd.filtrarCaracteristicasC = 1
          OR filtrProd.filtrarCaracteristicasD = 1
          OR filtrProd.filtrarCaracteristicasE = 1
          OR filtrProd.filtrarCores = 1
          OR filtrProd.filtrarTamanhos = 1
          OR filtrProd.filtrarNCMs = 1
          OR filtrProd.filtrarListasServicos = 1)
        AND (filtrProd.filtrarCategoriasProdutos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCATEGPROD filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.categoriaProduto = subCat.categoriaProduto
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarSubcategoriasProdutos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXSUBCAPROD filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.subcategoriaProduto = prod.subcategoriaProduto
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarMarcas = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXMARCAS filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.marca = prod.marca
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasA = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERA filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaA = prod.caracteristicaA
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasB = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERB filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaB = prod.caracteristicaB
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasC = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERC filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaC = prod.caracteristicaC
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasD = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERD filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaD = prod.caracteristicaD
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasE = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERE filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaE = prod.caracteristicaE
            AND filtrProdX.ativo = 1))
        AND filtrProd.filtrarCores = 0
        AND filtrProd.filtrarTamanhos = 0
        AND (filtrProd.filtrarNCMs = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXNCMS filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.idNcm = p_prod_idNcm
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarListasServicos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXLISTASSE filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.listaServicos = prod.listaServicos
            AND filtrProdX.ativo = 1)))) a
    WHERE a.ordenacao = 1), 0)
  INTO v_operacaoFiscal
  FROM DUAL;
  RETURN v_operacaoFiscal;
END;

/

DROP TABLE TEMPQUESTIONARIO;

-- TEMPQUESTIONARIO
CREATE GLOBAL TEMPORARY TABLE TEMPQUESTIONARIO
  (
    sessaoClient                 VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contador                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    excluido                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    subOrdenacao                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idSalvar                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idQuestionario               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nomeCampo                    VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoCampo                    CHAR (1) DEFAULT ' ' NOT NULL,
    mascara                      VARCHAR (30) DEFAULT ' ' NOT NULL,
    exibirCampo                  CHAR (1) DEFAULT ' ' NOT NULL,
    obrigatorio                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tabelaSistema                VARCHAR (30) DEFAULT ' ' NOT NULL,
    numeroDigitosCampoId         NUMERIC (6,0) DEFAULT 0 NOT NULL,
    conteudoId                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    conteudoCodigo               VARCHAR (256) DEFAULT ' ' NOT NULL,
    conteudoCodigoDescricao      VARCHAR (300) DEFAULT ' ' NOT NULL,
    conteudoCombo                VARCHAR (256) DEFAULT ' ' NOT NULL,
    conteudoComboItemList        CLOB,
    conteudoComboDisplayList     CLOB,
    conteudoData                 DATE,
    conteudoHora                 CHAR (6),
    conteudoLogico               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    conteudoNumerico             NUMERIC (16,8) DEFAULT 0 NOT NULL,
    conteudoEdit                 VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                  VARCHAR (4000) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPQUESTIONARIO_PK1 ON TEMPQUESTIONARIO (sessaoClient, contadorSessao, contador);
CREATE INDEX TEMPQUESTIONARIO_K2 ON TEMPQUESTIONARIO (sessaoClient, contadorSessao, excluido, ordenacao, subOrdenacao);

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

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_GERA_DOC (
  p_sessaoClient                 IN VARCHAR,
  p_contadorSessao               IN NUMERIC,
  p_idDocumentoFiscal            IN NUMBER,
  p_categoriaProjeto             IN NUMBER,
  r_numeroPersonalizacoesProjeto OUT NUMBER)
IS
  v_contadorCriar            NUMBER;
  v_contadorSalvar           NUMBER;
  v_conteudoComboItemList    CLOB;
  v_conteudoComboDisplayList CLOB;
BEGIN
  r_numeroPersonalizacoesProjeto := 0;
  UPDATE TEMPQUESTIONARIO
  SET excluido = 1
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  SELECT COALESCE (MAX (contador), 0)
  INTO v_contadorCriar
  FROM TEMPQUESTIONARIO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  FOR a IN (
    SELECT
      a.personalizacaoProjeto,
      a.sequencia,
      a.descricao,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.obrigatorio,
      a.tabelaSistema,
      tabSist.nomeCampoCodigo,
      tabSist.tipoCampoCodigo,
      tabSist.numeroDigitosCodigo,
      tabSist.nomeCampoDescricao,
      tabSist.adicionarCodigoNaDescricao,
      tabSist.nomeCampoIdSeDiferenteCodigo,
      tabSist.numeroDigitosCampoId,
      COALESCE (b.idPersonProjetoDocFiscal, 0) idPersonProjetoDocFiscal,
      COALESCE (b.conteudo, a.conteudoSugestao) conteudo
    FROM PAPERSONALIZACOESPROJETO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    LEFT JOIN MODOCFISCALXPERSPROJETO b
    ON b.personalizacaoProjeto = a.personalizacaoProjeto
    AND b.idDocumentoFiscal = p_idDocumentoFiscal
    WHERE a.categoriaProjeto = p_categoriaProjeto
    AND (a.ativo = 1
      OR b.idPersonProjetoDocFiscal IS NOT NULL)
    ORDER BY
      a.sequencia,
      COALESCE (b.idPersonProjetoDocFiscal, 0))
  LOOP
    r_numeroPersonalizacoesProjeto := r_numeroPersonalizacoesProjeto + 1;
    SELECT COALESCE (MAX (b.contador), 0)
    INTO v_contadorSalvar
    FROM TEMPQUESTIONARIO b
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessao
    AND b.idQuestionario = a.personalizacaoProjeto
    AND b.idSalvar = a.idPersonProjetoDocFiscal;
    IF v_contadorSalvar > 0 THEN
      UPDATE TEMPQUESTIONARIO b
      SET b.excluido = 0
      WHERE b.sessaoClient = p_sessaoClient
      AND b.contadorSessao = p_contadorSessao
      AND b.contador = v_contadorSalvar;
    ELSE
      v_contadorCriar            := v_contadorCriar + 1;
      v_conteudoComboItemList    := NULL;
      v_conteudoComboDisplayList := NULL;
      IF a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo = 'P'
      THEN
        SELECT
          TO_CLOB (LISTAGG (opcoes.conteudo, ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',',''))),
          TO_CLOB (LISTAGG (REPLACE(opcoes.descricao,',',''), ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',','')))
        INTO
          v_conteudoComboItemList,
          v_conteudoComboDisplayList
        FROM PAOPCOESCOMBOPERSPROJETO opcoes
        WHERE opcoes.personalizacaoProjeto = a.personalizacaoProjeto
        AND opcoes.ativo = 1;
      END IF;
      INSERT INTO TEMPQUESTIONARIO (
        sessaoClient,
        contadorSessao,
        contador,
        excluido,
        ordenacao,
        subOrdenacao,
        idSalvar,
        idQuestionario,
        nomeCampo,
        tipoCampo,
        mascara,
        exibirCampo,
        obrigatorio,
        tabelaSistema,
        conteudoId,
        conteudoCodigo,
        conteudoCodigoDescricao,
        conteudoCombo,
        conteudoComboItemList,
        conteudoComboDisplayList,
        conteudoData,
        conteudoHora,
        conteudoLogico,
        conteudoNumerico,
        conteudoEdit,
        observacoes)
      VALUES (
        p_sessaoClient,
        p_contadorSessao,
        v_contadorCriar,
        0, -- excluido
        a.sequencia, -- ordenacao
        a.idPersonProjetoDocFiscal, -- subOrdenacao
        a.idPersonProjetoDocFiscal, -- idSalvar
        a.personalizacaoProjeto, -- idQuestionario
        a.descricao, -- nomeCampo,
        a.tipoCampo,
        a.mascara,
        a.exibirCampo,
        a.obrigatorio,
        a.tabelaSistema,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND (a.nomeCampoIdSeDiferenteCodigo <> ' '
            OR a.tipoCampoCodigo = 'N')
          AND a.conteudo <> ' '
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoId
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.nomeCampoIdSeDiferenteCodigo = ' '
          AND a.tipoCampoCodigo <> 'N'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCodigo,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.conteudo <> ' '
          THEN BUSCA_CODIGO_DESCRICAO_CAMPO (
            a.tabelaSistema,
            a.conteudo,
            a.nomeCampoCodigo,
            a.tipoCampoCodigo,
            a.numeroDigitosCodigo,
            a.nomeCampoDescricao,
            a.adicionarCodigoNaDescricao,
            a.nomeCampoIdSeDiferenteCodigo,
            a.numeroDigitosCampoId)
          ELSE ' '
        END, -- conteudoCodigoDescricao,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo = 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCombo,
        v_conteudoComboItemList,
        v_conteudoComboDisplayList,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'D'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00/00/0000'
          THEN TO_DATE (a.conteudo, 'DD/MM/YYYY')
          ELSE NULL
        END, -- conteudoData,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'H'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00:00:00'
          THEN REPLACE (a.conteudo, ':', '')
          ELSE '000000'
        END, -- conteudoHora,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'L'
          AND a.conteudo = 'S'
          THEN 1
          ELSE 0
        END, -- conteudoLogico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'N'
          AND a.conteudo <> ' '
          AND a.conteudo <> '0'
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoNumerico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo <> 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoEdit,
        ' '); -- observacoes
    END IF;
  END LOOP;
END ADD_TEMPQUESTIONARIO_GERA_DOC;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_GERA_ORC (
  p_sessaoClient                 IN VARCHAR,
  p_contadorSessao               IN NUMERIC,
  p_orcamento                    IN NUMBER,
  p_categoriaProjeto             IN NUMBER,
  r_numeroPersonalizacoesProjeto OUT NUMBER)
IS
  v_contadorCriar            NUMBER;
  v_contadorSalvar           NUMBER;
  v_conteudoComboItemList    CLOB;
  v_conteudoComboDisplayList CLOB;
BEGIN
  r_numeroPersonalizacoesProjeto := 0;
  UPDATE TEMPQUESTIONARIO
  SET excluido = 1
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  SELECT COALESCE (MAX (contador), 0)
  INTO v_contadorCriar
  FROM TEMPQUESTIONARIO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  FOR a IN (
    SELECT
      a.personalizacaoProjeto,
      a.sequencia,
      a.descricao,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.tipoArquivo,
      a.obrigatorio,
      a.tabelaSistema,
      tabSist.nomeCampoCodigo,
      tabSist.tipoCampoCodigo,
      tabSist.numeroDigitosCodigo,
      tabSist.nomeCampoDescricao,
      tabSist.adicionarCodigoNaDescricao,
      tabSist.nomeCampoIdSeDiferenteCodigo,
      tabSist.numeroDigitosCampoId,
      COALESCE (b.idPersonProjetoOrcamento, 0) idPersonProjetoOrcamento,
      COALESCE (b.conteudo, a.conteudoSugestao) conteudo
    FROM PAPERSONALIZACOESPROJETO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    LEFT JOIN MOORCAMENTOXPERSPROJETO b
    ON b.personalizacaoProjeto = a.personalizacaoProjeto
    AND b.orcamento = p_orcamento
    WHERE a.categoriaProjeto = p_categoriaProjeto
    AND (a.ativo = 1
      OR b.idPersonProjetoOrcamento IS NOT NULL)
    ORDER BY
      a.sequencia,
      COALESCE (b.idPersonProjetoOrcamento, 0))
  LOOP
    r_numeroPersonalizacoesProjeto := r_numeroPersonalizacoesProjeto + 1;
    SELECT COALESCE (MAX (b.contador), 0)
    INTO v_contadorSalvar
    FROM TEMPQUESTIONARIO b
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessao
    AND b.idQuestionario = a.personalizacaoProjeto
    AND b.idSalvar = a.idPersonProjetoOrcamento;
    IF v_contadorSalvar > 0 THEN
      UPDATE TEMPQUESTIONARIO b
      SET b.excluido = 0
      WHERE b.sessaoClient = p_sessaoClient
      AND b.contadorSessao = p_contadorSessao
      AND b.contador = v_contadorSalvar;
    ELSE
      v_contadorCriar            := v_contadorCriar + 1;
      v_conteudoComboItemList    := NULL;
      v_conteudoComboDisplayList := NULL;
      IF a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo = 'P'
      THEN
        SELECT
          TO_CLOB (LISTAGG (opcoes.conteudo, ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',',''))),
          TO_CLOB (LISTAGG (REPLACE(opcoes.descricao,',',''), ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',','')))
        INTO
          v_conteudoComboItemList,
          v_conteudoComboDisplayList
        FROM PAOPCOESCOMBOPERSPROJETO opcoes
        WHERE opcoes.personalizacaoProjeto = a.personalizacaoProjeto
        AND opcoes.ativo = 1;
      END IF;
      INSERT INTO TEMPQUESTIONARIO (
        sessaoClient,
        contadorSessao,
        contador,
        excluido,
        ordenacao,
        subOrdenacao,
        idSalvar,
        idQuestionario,
        nomeCampo,
        tipoCampo,
        mascara,
        exibirCampo,
        obrigatorio,
        tabelaSistema,
        conteudoId,
        conteudoCodigo,
        conteudoCodigoDescricao,
        conteudoCombo,
        conteudoComboItemList,
        conteudoComboDisplayList,
        conteudoData,
        conteudoHora,
        conteudoLogico,
        conteudoNumerico,
        conteudoEdit,
        observacoes)
      VALUES (
        p_sessaoClient,
        p_contadorSessao,
        v_contadorCriar,
        0, -- excluido
        a.sequencia, -- ordenacao
        a.idPersonProjetoOrcamento, -- subOrdenacao
        a.idPersonProjetoOrcamento, -- idSalvar
        a.personalizacaoProjeto, -- idQuestionario
        a.descricao, -- nomeCampo,
        a.tipoCampo,
        a.mascara,
        a.exibirCampo,
        a.obrigatorio,
        a.tabelaSistema,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND (a.nomeCampoIdSeDiferenteCodigo <> ' '
            OR a.tipoCampoCodigo = 'N')
          AND a.conteudo <> ' '
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoId
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.nomeCampoIdSeDiferenteCodigo = ' '
          AND a.tipoCampoCodigo <> 'N'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCodigo,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.conteudo <> ' '
          THEN BUSCA_CODIGO_DESCRICAO_CAMPO (
            a.tabelaSistema,
            a.conteudo,
            a.nomeCampoCodigo,
            a.tipoCampoCodigo,
            a.numeroDigitosCodigo,
            a.nomeCampoDescricao,
            a.adicionarCodigoNaDescricao,
            a.nomeCampoIdSeDiferenteCodigo,
            a.numeroDigitosCampoId)
          ELSE ' '
        END, -- conteudoCodigoDescricao,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo = 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCombo,
        v_conteudoComboItemList,
        v_conteudoComboDisplayList,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'D'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00/00/0000'
          THEN TO_DATE (a.conteudo, 'DD/MM/YYYY')
          ELSE NULL
        END, -- conteudoData,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'H'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00:00:00'
          THEN REPLACE (a.conteudo, ':', '')
          ELSE '000000'
        END, -- conteudoHora,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'L'
          AND a.conteudo = 'S'
          THEN 1
          ELSE 0
        END, -- conteudoLogico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'N'
          AND a.conteudo <> ' '
          AND a.conteudo <> '0'
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoNumerico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo <> 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoEdit,
        ' '); -- observacoes
    END IF;
  END LOOP;
END ADD_TEMPQUESTIONARIO_GERA_ORC;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_GERA_PRE (
  p_sessaoClient                 IN VARCHAR,
  p_contadorSessao               IN NUMERIC,
  p_preDocumento                 IN NUMBER,
  p_categoriaProjeto             IN NUMBER,
  r_numeroPersonalizacoesProjeto OUT NUMBER)
IS
  v_contadorCriar            NUMBER;
  v_contadorSalvar           NUMBER;
  v_conteudoComboItemList    CLOB;
  v_conteudoComboDisplayList CLOB;
BEGIN
  r_numeroPersonalizacoesProjeto := 0;
  UPDATE TEMPQUESTIONARIO
  SET excluido = 1
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  SELECT COALESCE (MAX (contador), 0)
  INTO v_contadorCriar
  FROM TEMPQUESTIONARIO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  FOR a IN (
    SELECT
      a.personalizacaoProjeto,
      a.sequencia,
      a.descricao,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.obrigatorio,
      a.tabelaSistema,
      tabSist.nomeCampoCodigo,
      tabSist.tipoCampoCodigo,
      tabSist.numeroDigitosCodigo,
      tabSist.nomeCampoDescricao,
      tabSist.adicionarCodigoNaDescricao,
      tabSist.nomeCampoIdSeDiferenteCodigo,
      tabSist.numeroDigitosCampoId,
      COALESCE (b.idPersonProjetoPreDocumento, 0) idPersonProjetoPreDocumento,
      COALESCE (b.conteudo, a.conteudoSugestao) conteudo
    FROM PAPERSONALIZACOESPROJETO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    LEFT JOIN MOPREDOCUMXPERSPROJETO b
    ON b.personalizacaoProjeto = a.personalizacaoProjeto
    AND b.preDocumento = p_preDocumento
    WHERE a.categoriaProjeto = p_categoriaProjeto
    AND (a.ativo = 1
      OR b.idPersonProjetoPreDocumento IS NOT NULL)
    ORDER BY
      a.sequencia,
      COALESCE (b.idPersonProjetoPreDocumento, 0))
  LOOP
    r_numeroPersonalizacoesProjeto := r_numeroPersonalizacoesProjeto + 1;
    SELECT COALESCE (MAX (b.contador), 0)
    INTO v_contadorSalvar
    FROM TEMPQUESTIONARIO b
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessao
    AND b.idQuestionario = a.personalizacaoProjeto
    AND b.idSalvar = a.idPersonProjetoPreDocumento;
    IF v_contadorSalvar > 0 THEN
      UPDATE TEMPQUESTIONARIO b
      SET b.excluido = 0
      WHERE b.sessaoClient = p_sessaoClient
      AND b.contadorSessao = p_contadorSessao
      AND b.contador = v_contadorSalvar;
    ELSE
      v_contadorCriar            := v_contadorCriar + 1;
      v_conteudoComboItemList    := NULL;
      v_conteudoComboDisplayList := NULL;
      IF a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo = 'P'
      THEN
        SELECT
          TO_CLOB (LISTAGG (opcoes.conteudo, ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',',''))),
          TO_CLOB (LISTAGG (REPLACE(opcoes.descricao,',',''), ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',','')))
        INTO
          v_conteudoComboItemList,
          v_conteudoComboDisplayList
        FROM PAOPCOESCOMBOPERSPROJETO opcoes
        WHERE opcoes.personalizacaoProjeto = a.personalizacaoProjeto
        AND opcoes.ativo = 1;
      END IF;
      INSERT INTO TEMPQUESTIONARIO (
        sessaoClient,
        contadorSessao,
        contador,
        excluido,
        ordenacao,
        subOrdenacao,
        idSalvar,
        idQuestionario,
        nomeCampo,
        tipoCampo,
        mascara,
        exibirCampo,
        obrigatorio,
        tabelaSistema,
        conteudoId,
        conteudoCodigo,
        conteudoCodigoDescricao,
        conteudoCombo,
        conteudoComboItemList,
        conteudoComboDisplayList,
        conteudoData,
        conteudoHora,
        conteudoLogico,
        conteudoNumerico,
        conteudoEdit,
        observacoes)
      VALUES (
        p_sessaoClient,
        p_contadorSessao,
        v_contadorCriar,
        0, -- excluido
        a.sequencia, -- ordenacao
        a.idPersonProjetoPreDocumento, -- subOrdenacao
        a.idPersonProjetoPreDocumento, -- idSalvar
        a.personalizacaoProjeto, -- idQuestionario
        a.descricao, -- nomeCampo,
        a.tipoCampo,
        a.mascara,
        a.exibirCampo,
        a.obrigatorio,
        a.tabelaSistema,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND (a.nomeCampoIdSeDiferenteCodigo <> ' '
            OR a.tipoCampoCodigo = 'N')
          AND a.conteudo <> ' '
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoId
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.nomeCampoIdSeDiferenteCodigo = ' '
          AND a.tipoCampoCodigo <> 'N'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCodigo,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.conteudo <> ' '
          THEN BUSCA_CODIGO_DESCRICAO_CAMPO (
            a.tabelaSistema,
            a.conteudo,
            a.nomeCampoCodigo,
            a.tipoCampoCodigo,
            a.numeroDigitosCodigo,
            a.nomeCampoDescricao,
            a.adicionarCodigoNaDescricao,
            a.nomeCampoIdSeDiferenteCodigo,
            a.numeroDigitosCampoId)
          ELSE ' '
        END, -- conteudoCodigoDescricao,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo = 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCombo,
        v_conteudoComboItemList,
        v_conteudoComboDisplayList,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'D'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00/00/0000'
          THEN TO_DATE (a.conteudo, 'DD/MM/YYYY')
          ELSE NULL
        END, -- conteudoData,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'H'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00:00:00'
          THEN REPLACE (a.conteudo, ':', '')
          ELSE '000000'
        END, -- conteudoHora,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'L'
          AND a.conteudo = 'S'
          THEN 1
          ELSE 0
        END, -- conteudoLogico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'N'
          AND a.conteudo <> ' '
          AND a.conteudo <> '0'
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoNumerico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo <> 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoEdit,
        ' '); -- observacoes
    END IF;
  END LOOP;
END ADD_TEMPQUESTIONARIO_GERA_PRE;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_GERA_TAR (
  p_sessaoClient             IN VARCHAR,
  p_contadorSessao           IN NUMERIC,
  p_idAtividadePrevOrcamento IN NUMBER,
  p_checkList                IN NUMBER)
IS
  v_contador                 NUMBER;
  v_conteudoComboItemList    CLOB;
  v_conteudoComboDisplayList CLOB;
BEGIN
  DELETE TEMPQUESTIONARIO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  v_contador := 0;
  FOR a IN (
    SELECT
      a.idCheckListXTarefas,
      a.sequencia,
      a.descricao,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.obrigatorio,
      a.tabelaSistema,
      tabSist.nomeCampoCodigo,
      tabSist.tipoCampoCodigo,
      tabSist.numeroDigitosCodigo,
      tabSist.nomeCampoDescricao,
      tabSist.adicionarCodigoNaDescricao,
      tabSist.nomeCampoIdSeDiferenteCodigo,
      tabSist.numeroDigitosCampoId,
      COALESCE (b.idTarefaOrcamento, 0) idTarefaOrcamento,
      COALESCE (b.conteudo, a.conteudoSugestao) conteudo,
      COALESCE (b.observacoes, ' ') observacoes
    FROM PACHECKLISTXTAREFAS a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    LEFT JOIN MOORCAMENTOXTAREFAS b
    ON b.idCheckListXTarefas = a.idCheckListXTarefas
    AND b.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
    WHERE a.checkList = p_checkList
    AND (a.ativo = 1
      OR b.idTarefaOrcamento IS NOT NULL)
    ORDER BY
      a.sequencia,
      COALESCE (b.idTarefaOrcamento, 0))
  LOOP
    v_contador                 := v_contador + 1;
    v_conteudoComboItemList    := NULL;
    v_conteudoComboDisplayList := NULL;
    IF a.tabelaSistema = ' '
      AND a.tipoCampo = 'A'
      AND a.exibirCampo = 'P'
    THEN
      SELECT
        TO_CLOB (LISTAGG (opcoes.conteudo, ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',',''))),
        TO_CLOB (LISTAGG (REPLACE(opcoes.descricao,',',''), ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',','')))
      INTO
        v_conteudoComboItemList,
        v_conteudoComboDisplayList
      FROM PACHECKLISTXTAREFAXOPCOES opcoes
      WHERE opcoes.idCheckListXTarefas = a.idCheckListXTarefas
      AND opcoes.ativo = 1;
    END IF;
    INSERT INTO TEMPQUESTIONARIO (
      sessaoClient,
      contadorSessao,
      contador,
      excluido,
      ordenacao,
      subOrdenacao,
      idSalvar,
      idQuestionario,
      nomeCampo,
      tipoCampo,
      mascara,
      exibirCampo,
      obrigatorio,
      tabelaSistema,
      conteudoId,
      conteudoCodigo,
      conteudoCodigoDescricao,
      conteudoCombo,
      conteudoComboItemList,
      conteudoComboDisplayList,
      conteudoData,
      conteudoHora,
      conteudoLogico,
      conteudoNumerico,
      conteudoEdit,
      observacoes)
    VALUES (
      p_sessaoClient,
      p_contadorSessao,
      v_contador,
      0, -- excluido
      a.sequencia, -- ordenacao
      a.idTarefaOrcamento, -- subOrdenacao
      a.idTarefaOrcamento, -- idSalvar
      a.idCheckListXTarefas, -- idQuestionario
      a.descricao, -- nomeCampo,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.obrigatorio,
      a.tabelaSistema,
      CASE
        WHEN a.tabelaSistema <> ' '
        AND (a.nomeCampoIdSeDiferenteCodigo <> ' '
          OR a.tipoCampoCodigo = 'N')
        AND a.conteudo <> ' '
        THEN TO_NUMBER (a.conteudo)
        ELSE 0
      END, -- conteudoId
      CASE
        WHEN a.tabelaSistema <> ' '
        AND a.nomeCampoIdSeDiferenteCodigo = ' '
        AND a.tipoCampoCodigo <> 'N'
        AND a.conteudo <> ' '
        THEN a.conteudo
        ELSE ' '
      END, -- conteudoCodigo,
      CASE
        WHEN a.tabelaSistema <> ' '
        AND a.conteudo <> ' '
        THEN BUSCA_CODIGO_DESCRICAO_CAMPO (
          a.tabelaSistema,
          a.conteudo,
          a.nomeCampoCodigo,
          a.tipoCampoCodigo,
          a.numeroDigitosCodigo,
          a.nomeCampoDescricao,
          a.adicionarCodigoNaDescricao,
          a.nomeCampoIdSeDiferenteCodigo,
          a.numeroDigitosCampoId)
        ELSE ' '
      END, -- conteudoCodigoDescricao,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo = 'P'
        AND a.conteudo <> ' '
        THEN a.conteudo
        ELSE ' '
      END, -- conteudoCombo,
      v_conteudoComboItemList,
      v_conteudoComboDisplayList,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'D'
        AND a.conteudo <> ' '
        AND a.conteudo <> '00/00/0000'
        THEN TO_DATE (a.conteudo, 'DD/MM/YYYY')
        ELSE NULL
      END, -- conteudoData,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'H'
        AND a.conteudo <> ' '
        AND a.conteudo <> '00:00:00'
        THEN REPLACE (a.conteudo, ':', '')
        ELSE '000000'
      END, -- conteudoHora,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'L'
        AND a.conteudo = 'S'
        THEN 1
        ELSE 0
      END, -- conteudoLogico,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'N'
        AND a.conteudo <> ' '
        AND a.conteudo <> '0'
        THEN TO_NUMBER (a.conteudo)
        ELSE 0
      END, -- conteudoNumerico,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo <> 'P'
        AND a.conteudo <> ' '
        THEN a.conteudo
        ELSE ' '
      END, -- conteudoEdit,
      a.observacoes);
  END LOOP;
END ADD_TEMPQUESTIONARIO_GERA_TAR;

/

create or replace FUNCTION FUNC_ADD_TEMPQUESTION_VALIDA (
  p_sessaoClient   IN VARCHAR,
  p_contadorSessao IN NUMERIC)
  RETURN CLOB
IS
  v_mensagemErro           CLOB;
  v_mensagemMultiplosErros CLOB;
  v_contador               NUMBER;
BEGIN
  v_mensagemErro := '';
  v_mensagemMultiplosErros := 'Os seguintes campos devem ser informados:';
  v_contador := 0;
  FOR a IN (
    SELECT a.nomeCampo
    FROM TEMPQUESTIONARIO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    WHERE a.sessaoClient = p_sessaoClient
    AND a.contadorSessao = p_contadorSessao
    AND a.excluido = 0
    AND a.obrigatorio = 1
    AND (a.tabelaSistema <> ' '
      AND ((tabSist.nomeCampoIdSeDiferenteCodigo <> ' '
          OR tabSist.tipoCampoCodigo = 'N')
        AND a.conteudoId = 0
        OR  tabSist.nomeCampoIdSeDiferenteCodigo = ' '
        AND tabSist.tipoCampoCodigo = 'N'
        AND a.conteudoCodigo = ' ')
      OR a.tabelaSistema = ' '
      AND (a.tipoCampo = 'D'
        AND (a.conteudoData IS NULL
          OR TO_CHAR (a.conteudoData, 'DD/MM/YYYY') = '00/00/0000')
        OR a.tipoCampo = 'H'
        AND (a.conteudoHora IS NULL
          OR a.conteudoHora = '000000')
        OR a.tipoCampo = 'N'
        AND a.conteudoNumerico = 0
        OR a.tipoCampo = 'A'
        AND (a.exibirCampo = 'P'
          AND a.conteudoCombo = ' '
          OR a.exibirCampo <> 'P'
          AND a.conteudoEdit = ' ')))
    ORDER BY
      a.ordenacao,
      a.subOrdenacao)
  LOOP
    v_mensagemErro := 'O campo "' || TRIM(a.nomeCampo) || '" deve ser informado.';
    v_mensagemMultiplosErros := v_mensagemMultiplosErros || '
' || TRIM(a.nomeCampo);
    v_contador := v_contador + 1;
  END LOOP;
  RETURN CASE WHEN v_contador > 2 THEN v_mensagemMultiplosErros ELSE v_mensagemErro END;
END;

/

create or replace FUNCTION FUNC_ADD_GERA_XML_ENVIO (
  p_config_425_addInfoComplNFSe IN NUMBER,
  p_idDocumentoFiscal           IN NUMBER,
  p_seqLoteWebServiceEnvio      IN NUMBER,
  p_loteWebService              IN VARCHAR)
  RETURN CLOB
IS
  v_xml                         CLOB;
  v_estab_nomeRazaoSocial       VARCHAR (60);
  v_estab_apelidoFantasia       VARCHAR (60);
  v_estab_indicadorPessoa       CHAR (1);
  v_estab_tipo                  VARCHAR (4);
  v_estab_cnpjCpfIdEstrangeiro  VARCHAR (20);
  v_estab_inscricaoEstadual     VARCHAR (14);
  v_estab_inscricaoMunicipal    VARCHAR (15);
  v_estab_logradouro            VARCHAR (60);
  v_estab_numero                VARCHAR (60);
  v_estab_complemento           VARCHAR (60);
  v_estab_bairroDistrito        VARCHAR (60);
  v_estab_municipio             VARCHAR (7);
  v_estab_municipioDescricao    VARCHAR (60);
  v_estab_uf                    CHAR (2);
  v_estab_cep                   CHAR (8);
  v_estab_pais                  VARCHAR (4);
  v_estab_paisDescricao         VARCHAR (60);
  v_estab_tecnologiaNfse        NUMBER;
  v_estab_fone                  VARCHAR (14);
  v_estab_fone2                 VARCHAR (14);
  v_estab_email                 VARCHAR (60);
  v_estab_site                  VARCHAR (60);
  v_estab_senhaWS               VARCHAR (256);
  v_regimeEspecialTributacao    CHAR (1);
  v_indicadorIssqn              CHAR (1);
  v_estab_regimeTributario      CHAR (1);
  v_optanteSimplesNacional      CHAR (1);
  v_incentivadorCultural        CHAR (1);
  v_indicadorAmbienteNfse       CHAR (1);
  v_incentivoFiscal             CHAR (1);
  v_intermediario               NUMBER;
  v_pess_nomeRazaoSocial        VARCHAR (60);
  v_pess_apelidoFantasia        VARCHAR (60);
  v_pess_indicadorPessoa        CHAR (1);
  v_pess_tipo                   VARCHAR (4);
  v_pess_cnpjCpfIdEstrangeiro   VARCHAR (20);
  v_pess_inscricaoEstadual      VARCHAR (14);
  v_pess_inscricaoMunicipal     VARCHAR (15);
  v_pess_logradouro             VARCHAR (60);
  v_pess_numero                 VARCHAR (60);
  v_pess_complemento            VARCHAR (60);
  v_pess_bairroDistrito         VARCHAR (60);
  v_pess_municipio              VARCHAR (7);
  v_pess_municipioDescricao    VARCHAR (60);
  v_pess_uf                    CHAR (2);
  v_pess_cep                   CHAR (8);
  v_pess_pais                  VARCHAR (4);
  v_pess_paisDescricao         VARCHAR (60);
  v_pess_observacoesEndereco    VARCHAR (4000);
  v_pess_fone                   VARCHAR (14);
  v_pess_fone2                  VARCHAR (14);
  v_pess_email                  VARCHAR (60);
  v_entr_logradouro             VARCHAR (60);
  v_entr_numero                 VARCHAR (60);
  v_entr_complemento            VARCHAR (60);
  v_entr_bairroDistrito         VARCHAR (60);
  v_entr_municipio              VARCHAR (7);
  v_entr_municipioDescricao     VARCHAR (60);
  v_entr_cep                    CHAR (8);
  v_entr_uf                     CHAR (2);
  v_entr_pais                   VARCHAR (4);
  v_entr_paisDescricao          VARCHAR (60);
  v_interm_nomeRazaoSocial      VARCHAR (60);
  v_interm_indicadorPessoa      CHAR (1);
  v_interm_cnpjCpfIdEstrangeiro VARCHAR (20);
  v_interm_inscricaoMunicipal   VARCHAR (15);
  v_interm_logradouro           VARCHAR (60);
  v_interm_numero               VARCHAR (60);
  v_interm_complemento          VARCHAR (60);
  v_interm_bairroDistrito       VARCHAR (60);
  v_interm_municipio            VARCHAR (7);
  v_interm_cep                  CHAR (8);
  v_interm_fone                 VARCHAR (14);
  v_interm_email                VARCHAR (60);
  v_numeroRPS                   VARCHAR (15);
  v_serieFiscal                 VARCHAR (4);
  v_municipioFatoGerador        NUMBER;
  v_dataEmissao                 DATE;
  v_dataHoraEmissao             VARCHAR (20);
  v_dataCompetencia             VARCHAR (20);
  v_dataCompetenciaDDMMYYYY     VARCHAR (20);
  v_dataHoraCompetencia         VARCHAR (20);
  v_chaveNFe                    VARCHAR (60);
  v_numeroProcesso              VARCHAR (60);
  v_codigoObra                  VARCHAR (60);
  v_art                         VARCHAR (60);
  v_outrasInformacoes           VARCHAR (4000);
  v_descricaoServico            VARCHAR (4000);
  v_valorServicos               VARCHAR (20);
  v_valorTotal                  VARCHAR (20);
  v_valorLiquidoItem            NUMBER;
  v_aliquotaIssqn               VARCHAR (20);
  v_baseIssqn                   VARCHAR (20);
  v_valorIssqn                  VARCHAR (20);
  v_retencaoInss                VARCHAR (20);
  v_baseRetInss                 VARCHAR (20);
  v_valorRetInss                VARCHAR (20);
  v_retencaoIrrf                VARCHAR (20);
  v_baseRetIrrf                 VARCHAR (20);
  v_valorRetIrrf                VARCHAR (20);
  v_retencaoPis                 VARCHAR (20);
  v_baseRetPis                  VARCHAR (20);
  v_valorRetPis                 VARCHAR (20);
  v_retencaoCofins              VARCHAR (20);
  v_baseRetCofins               VARCHAR (20);
  v_valorRetCofins              VARCHAR (20);
  v_retencaoCsll                VARCHAR (20);
  v_baseRetCsll                 VARCHAR (20);
  v_valorRetCsll                VARCHAR (20);
  v_valorOutrasRetencoes        VARCHAR (20);
  v_stPis                       CHAR (2);
  v_aliquotaPis                 VARCHAR (20);
  v_basePis                     VARCHAR (20);
  v_valorPis                    VARCHAR (20);
  v_aliquotaCofins              VARCHAR (20);
  v_valorCofins                 VARCHAR (20);
  v_pisCofinsRetido             CHAR (1);
  v_percentualCargaTributariaFe VARCHAR (20);
  v_valorCargaTributariaFederal VARCHAR (20);
  v_percentualCargaTributariaEs VARCHAR (20);
  v_valorCargaTributariaEstad   VARCHAR (20);
  v_percentualCargaTributariaMu VARCHAR (20);
  v_valorCargaTributariaMunicip VARCHAR (20);
  v_valorDescontoTotal          VARCHAR (20);
  v_issRetido                   CHAR (1);
  v_tributadoForaMunicipio      CHAR (1);
  v_municipioIncidencia         VARCHAR (7);
  v_listaServicos               CHAR (5);
  v_cnae                        CHAR (7);
  v_codigoServicoMunicipio      VARCHAR (60);
  v_sequencia                   NUMBER;
  v_valor                       NUMBER;
  v_saldo                       NUMBER;
BEGIN
  WITH DOC AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      a.serieFiscal,
      a.documentoFiscal,
      a.dataEmissao,
      a.qrCode,
      a.enderecoEntregaPessoa,
      a.municipioFatoGerador,
      a.chaveNFe,
      est.pessoaEstabelecimento,
      docXServ.dataCompetencia,
      docxServ.intermediario,
      docxServ.numeroRPS,
      docxServ.numeroNFSe,
      docxServ.codigoVerificacaoNFSe,
      docXServ.idObra,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = est.pessoaEstabelecimento
        AND end.ativo = 1
        AND end.principal = 1), 0) endEst_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = est.pessoaEstabelecimento
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonEst_idFonePessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = est.pessoaEstabelecimento
        AND fon.ativo = 1
        AND fon.principal = 0), 0) fonEst2_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = est.pessoaEstabelecimento
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailEst_idEmailPessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = est.pessoaEstabelecimento
        AND email.ativo = 1
        AND email.tipoEmailSite = 2), 0) siteEst_idEmailPessoa,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = COALESCE (docXServ.intermediario, 0)
        AND end.ativo = 1
        AND end.principal = 1), 0) endInterm_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = COALESCE (docXServ.intermediario, 0)
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonInterm_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = COALESCE (docXServ.intermediario, 0)
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailInterm_idEmailPessoa,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = a.pessoa
        AND end.ativo = 1
        AND end.principal = 1), 0) endPess_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = a.pessoa
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonPess_idFonePessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = a.pessoa
        AND fon.ativo = 1
        AND fon.principal = 0), 0) fonPess2_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = a.pessoa
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailPess_idEmailPessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = a.pessoa
        AND email.ativo = 1
        AND email.tipoEmailSite = 2), 0) sitePess_idEmailPessoa
    FROM MODOCUMENTOSFISCAIS a
    LEFT JOIN MODOCFISCALXSERVICO docXServ
    ON docXServ.idDocumentoFiscal = a.idDocumentoFiscal
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal),
  ITEM AS (
    SELECT
      COALESCE (MAX (a.incentivoFiscal), 0) incentivoFiscal,
      COALESCE (MAX (a.cnae), 0) cnae,
      COALESCE (MAX (a.numeroProcessoAdministrativo), ' ') numeroProcessoAdministrativo,
      COALESCE (MAX (a.tributadoForaMunicipio), 0) tributadoForaMunicipio,
      COALESCE (MAX (a.unidadeMedidaConversao), ' ') unidadeMedidaConversao,
      COALESCE (SUM (a.quantidadeConvertida), 0) quantidadeConvertida,
      COALESCE ((SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END) / CASE WHEN SUM (a.quantidadeConvertida) = 0 THEN 1 ELSE SUM (a.quantidadeConvertida) END), 0) precoUnitarioConvertido,
      COALESCE (SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END), 0) valorProdutoServico,
      COALESCE (SUM (CASE WHEN endEst.municipio = 4309407 THEN 0 ELSE a.valorDescontoTotal END), 0) valorDescontoTotal,
      COALESCE (SUM (a.valorOutrasDespesasTotal), 0) valorOutrasDespesasTotal,
      COALESCE (SUM (a.valorLiquidoItem), 0) valorLiquidoItem,
      COALESCE (MAX (a.indicadorIssqn), ' ') indicadorIssqn,
      COALESCE (MAX (a.aliquotaIssqn), 0) aliquotaIssqn,
      COALESCE (MAX (a.retidoIssqn), 0) retidoIssqn,
      COALESCE (MAX (a.listaServicos), 0) listaServicos,
      COALESCE (SUM (a.baseIssqn), 0) baseIssqn,
      COALESCE (SUM (a.valorIssqn), 0) valorIssqn,
      COALESCE (MAX (a.retencaoIrrf), 0) retencaoIrrf,
      COALESCE (SUM (a.baseRetIrrf), 0) baseRetIrrf,
      COALESCE (SUM (a.valorRetIrrf), 0) valorRetIrrf,
      COALESCE (MAX (a.retencaoInss), 0) retencaoInss,
      COALESCE (SUM (a.baseRetInss), 0) baseRetInss,
      COALESCE (SUM (a.valorRetInss), 0) valorRetInss,
      COALESCE (MAX (a.retencaoPis), 0) retencaoPis,
      COALESCE (SUM (a.baseRetPis), 0) baseRetPis,
      COALESCE (SUM (a.valorRetPis), 0) valorRetPis,
      COALESCE (MAX (a.retencaoCofins), 0) retencaoCofins,
      COALESCE (SUM (a.baseRetCofins), 0) baseRetCofins,
      COALESCE (SUM (a.valorRetCofins), 0) valorRetCofins,
      COALESCE (MAX (a.retencaoCsll), 0) retencaoCsll,
      COALESCE (SUM (a.baseRetCsll), 0) baseRetCsll,
      COALESCE (SUM (a.valorRetCsll), 0) valorRetCsll,
      COALESCE (SUM (a.valorRetOutros), 0) valorRetOutros,
      COALESCE (SUM (a.valorIof), 0) valorIof,
      COALESCE (SUM (a.valorIpi), 0) valorIpi,
      COALESCE (MAX (a.stPis), '00') stPis,
      COALESCE (MAX (a.aliquotaPis), 0) aliquotaPis,
      COALESCE (SUM (a.basePis), 0) basePis,
      COALESCE (SUM (a.valorPis), 0) valorPis,
      COALESCE (MAX (a.aliquotaCofins), 0) aliquotaCofins,
      COALESCE (SUM (a.valorCofins), 0) valorCofins,
      COALESCE (SUM (a.valorIcms), 0) valorIcms,
      CASE WHEN COALESCE (SUM (a.valorRetPis), 0) + COALESCE (SUM (a.valorRetCofins), 0) > 0 THEN 1 ELSE 0 END pisCofinsRetido,
      COALESCE (MAX (a.aliquotaEstimadaImpFederais), 0) aliquotaEstimadaImpFederais,
      COALESCE (SUM (a.valorEstimadoImpFederais), 0) valorEstimadoImpFederais,
      COALESCE (MAX (a.aliquotaEstimadaImpEstaduais), 0) aliquotaEstimadaImpEstaduais,
      COALESCE (SUM (a.valorEstimadoImpEstaduais), 0) valorEstimadoImpEstaduais,
      COALESCE (MAX (a.aliquotaEstimadaImpMunicipais), 0) aliquotaEstimadaImpMunicipais,
      COALESCE (SUM (a.valorEstimadoImpMunicipais), 0) valorEstimadoImpMunicipais,
      COALESCE (MAX (CASE WHEN servMun.codigoServicoMunicipio = ' ' THEN '0' ELSE servMun.codigoServicoMunicipio END), '0') codigoServicoMunicipio,
      COALESCE (MAX (servMun.descricao), ' ') servMun_descricao,
      COALESCE (MAX (listServ.descricao), ' ') listServ_descricao,
      COALESCE (MAX (indicIssqn.descricao), ' ') indicIssqn_descricao
    FROM MODOCFISCALXITENS a
    JOIN PASERVICOSMUNICIPIOS servMun
    ON servMun.idServicoMunicipio = a.idServicoMunicipio
    JOIN SILISTASERVICOS listServ
    ON listServ.listaServicos = a.listaServicos
    JOIN SIINDICISSQN indicIssqn
    ON indicIssqn.indicadorISSQN = a.indicadorISSQN
    JOIN DOC doc
    ON 1=1
    JOIN CAENDERECOSPESSOA endEst
    ON endEst.enderecoPessoa = doc.endEst_enderecoPessoa
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND a.cancelado = 0)
  SELECT
    CASE
      WHEN endEst.municipio = 4314902
        AND munEst.tecnologiaNfse <> 4
      THEN TO_CHAR (a.dataEmissao, 'YYYY')
        || LPAD (a.documentoFiscal, 11, '0')
      ELSE TO_CHAR (a.documentoFiscal)
    END,
    a.serieFiscal,
    a.municipioFatoGerador,
    a.dataEmissao,
    CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataEmissao, 'HH24:MI:SS') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') END ELSE TO_CHAR (a.dataCompetencia, 'YYYY-MM-DD') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '00/00/00000' ELSE TO_CHAR (a.dataEmissao, 'DD/MM/YYYY') END ELSE TO_CHAR (a.dataCompetencia, 'DD/MM/YYYY') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataEmissao, 'HH24:MI:SS') END ELSE TO_CHAR (a.dataCompetencia, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataCompetencia, 'HH24:MI:SS') END,
    a.chaveNFe,
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.codigoObra),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.art),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.nomeRazaoSocial),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.apelidoFantasia),
    pessEst.indicadorPessoa,
    CASE WHEN pessEst.indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END,
    CASE
      WHEN pessEst.cnpjCpfIdEstrangeiro <> ' '
      THEN pessEst.cnpjCpfIdEstrangeiro
      WHEN pessEst.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoMunicipal),
    pessEst.regimeTributario,
    CASE WHEN pessEst.regimeTributario IN ('1', '2', '4') THEN '1' ELSE '2' END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.bairroDistrito),
    TO_CHAR (endEst.municipio),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munEst.descricao),
    munEst.uf,
    LPAD (endEst.cep, 8 , '0'),
    paisEst.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisEst.descricao),
    munEst.tecnologiaNfse,
    CASE WHEN fonEst.idFonePessoa = 0 THEN ' ' ELSE fonEst.fone END,
    CASE WHEN fonEst2.idFonePessoa = 0 THEN ' ' ELSE fonEst2.fone END,
    CASE WHEN emailEst.idEmailPessoa = 0 THEN ' ' ELSE emailEst.email END,
    CASE WHEN siteEst.idEmailPessoa = 0 THEN ' ' ELSE siteEst.email END,
    COALESCE (estXnfse.senhaWS, ' '),
    COALESCE (estXnfse.regimeEspecialTributacao, ' '),
    CASE WHEN COALESCE (estXnfse.incentivadorCultural, 0) = 1 THEN '1' ELSE '2' END,
    COALESCE (estXnfse.indicadorAmbienteNfse, '0'),
    a.intermediario,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.nomeRazaoSocial) END,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.apelidoFantasia) END,
    pess.indicadorPessoa,
    CASE WHEN pess.indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END,
    CASE
      WHEN pess.cnpjCpfIdEstrangeiro <> ' '
      THEN pess.cnpjCpfIdEstrangeiro
      WHEN pess.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.bairroDistrito),
    TO_CHAR (endPess.municipio),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munPess.descricao),
    munPess.uf,
    LPAD (endPess.cep, 8 , '0'),
    paisPess.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisPess.descricao),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.observacoes),
    CASE WHEN fonPess.idFonePessoa = 0 THEN ' ' ELSE fonPess.fone END,
    CASE WHEN fonPess2.idFonePessoa = 0 THEN ' ' ELSE fonPess2.fone END,
    CASE WHEN emailPess.idEmailPessoa = 0 THEN ' ' ELSE emailPess.email END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.bairroDistrito),
    TO_CHAR (endEntr.municipio),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munEntr.descricao),
    munEntr.uf,
    LPAD (endEntr.cep, 8 , '0'),
    endEntr.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisEntr.descricao),
    CASE WHEN COALESCE (a.intermediario, 0) = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (interm.nomeRazaoSocial) END,
    interm.indicadorPessoa,
    CASE
      WHEN interm.cnpjCpfIdEstrangeiro <> ' '
      THEN interm.cnpjCpfIdEstrangeiro
      WHEN interm.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (interm.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.bairroDistrito),
    TO_CHAR (endInterm.municipio),
    LPAD (endInterm.cep, 8 , '0'),
    CASE WHEN fonInterm.idFonePessoa = 0 THEN ' ' ELSE fonInterm.fone END,
    CASE WHEN emailInterm.idEmailPessoa = 0 THEN ' ' ELSE emailInterm.email END,
    COALESCE (SUBSTR ( TRIM (FUNC_ADD_REMOVE_CARACT_ESPEC (REPLACE (FUNC_ADD_BUSCA_DESCR_SERVICO (p_idDocumentoFiscal) ||
      CASE
        WHEN endEst.municipio IN (4202008,4209102,4314902)
        THEN '
Trib. Aprox.: R$ ' || TO_CHAR (item.valorEstimadoImpFederais, 'FM9999999999990D00') || ' Federal e R$ '
        || TO_CHAR (item.valorEstimadoImpMunicipais, 'FM9999999999990D00') || ' Municipal'
        ELSE ''
      END ||
      CASE
        WHEN p_config_425_addInfoComplNFSe = 1
        AND munEst.versaoNFSe <> '2.00'
        AND endEst.municipio NOT IN (4304606, 4305108, 4308607)
        AND EXISTS (
          SELECT 1
          FROM MODOCFISCALXINFOCOMPLEMEN infCompl
          WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
          AND infCompl.geradoPeloSistema = 1
          AND infCompl.descInformacaoComplementar <> ' ')
        THEN '
        ' || COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.geradoPeloSistema = 1
      AND infCompl.descInformacaoComplementar <> ' '), '')
        ELSE ''
      END, '
', '&#xD&#xA'))), 1, 2000), ' '),
    COALESCE (SUBSTR ( TRIM (FUNC_ADD_REMOVE_CARACT_ESPEC (COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.descInformacaoComplementar <> ' '), ' '))), 1, 2000), ' '),
    REPLACE (TO_CHAR (item.valorProdutoServico, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorProdutoServico - item.valorDescontoTotal + item.valorOutrasDespesasTotal, 'FM9999999999990D00'), ',', '.'),
    item.valorLiquidoItem,
    REPLACE (TO_CHAR (item.valorDescontoTotal, 'FM9999999999990D00'), ',', '.'),
    item.indicadorIssqn,
    REPLACE (CASE WHEN endEst.municipio = 4318705 THEN TO_CHAR (item.aliquotaIssqn / 100, 'FM0D0000') ELSE TO_CHAR (item.aliquotaIssqn, 'FM9999999999990D00') END, ',', '.'),
    REPLACE (TO_CHAR (item.baseIssqn, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorIssqn, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.retidoIssqn = 1 THEN '1' ELSE '2' END,
    CASE WHEN item.tributadoForaMunicipio = 1 THEN '1' ELSE '2' END,
    TO_CHAR (CASE WHEN item.tributadoForaMunicipio = 1 THEN a.municipioFatoGerador ELSE endEst.municipio END),
    CASE WHEN item.incentivoFiscal = 1 THEN '1' ELSE '2' END,
    SUBSTR (LPAD (item.listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (item.listaServicos, 4, '0'), 3, 2),
    LPAD (item.cnae, 7, '0'),
    item.codigoServicoMunicipio,
    item.numeroProcessoAdministrativo,
    REPLACE (TO_CHAR (item.retencaoInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetOutros, 'FM9999999999990D00'), ',', '.'),
    item.stPis,
    REPLACE (TO_CHAR (item.aliquotaPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.basePis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorCofins, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.pisCofinsRetido = 1 THEN '1' ELSE '2' END,
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpFederais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpFederais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpEstaduais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpEstaduais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpMunicipais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpMunicipais, 'FM9999999999990D00'), ',', '.')
  INTO
    v_numeroRPS,
    v_serieFiscal,
    v_municipioFatoGerador,
    v_dataEmissao,
    v_dataHoraEmissao,
    v_dataCompetencia,
    v_dataCompetenciaDDMMYYYY,
    v_dataHoraCompetencia,
    v_chaveNFe,
    v_codigoObra,
    v_art,
    v_estab_nomeRazaoSocial,
    v_estab_apelidoFantasia,
    v_estab_indicadorPessoa,
    v_estab_tipo,
    v_estab_cnpjCpfIdEstrangeiro,
    v_estab_inscricaoEstadual,
    v_estab_inscricaoMunicipal,
    v_estab_regimeTributario,
    v_optanteSimplesNacional,
    v_estab_logradouro,
    v_estab_numero,
    v_estab_complemento,
    v_estab_bairroDistrito,
    v_estab_municipio,
    v_estab_municipioDescricao,
    v_estab_uf,
    v_estab_cep,
    v_estab_pais,
    v_estab_paisDescricao,
    v_estab_tecnologiaNfse,
    v_estab_fone,
    v_estab_fone2,
    v_estab_email,
    v_estab_site,
    v_estab_senhaWS,
    v_regimeEspecialTributacao,
    v_incentivadorCultural,
    v_indicadorAmbienteNfse,
    v_intermediario,
    v_pess_nomeRazaoSocial,
    v_pess_apelidoFantasia,
    v_pess_indicadorPessoa,
    v_pess_tipo,
    v_pess_cnpjCpfIdEstrangeiro,
    v_pess_inscricaoEstadual,
    v_pess_inscricaoMunicipal,
    v_pess_logradouro,
    v_pess_numero,
    v_pess_complemento,
    v_pess_bairroDistrito,
    v_pess_municipio,
    v_pess_municipioDescricao,
    v_pess_uf,
    v_pess_cep,
    v_pess_pais,
    v_pess_paisDescricao,
    v_pess_observacoesEndereco,
    v_pess_fone,
    v_pess_fone2,
    v_pess_email,
    v_entr_logradouro,
    v_entr_numero,
    v_entr_complemento,
    v_entr_bairroDistrito,
    v_entr_municipio,
    v_entr_municipioDescricao,
    v_entr_uf,
    v_entr_cep,
    v_entr_pais,
    v_entr_paisDescricao,
    v_interm_nomeRazaoSocial,
    v_interm_indicadorPessoa,
    v_interm_cnpjCpfIdEstrangeiro,
    v_interm_inscricaoMunicipal,
    v_interm_logradouro,
    v_interm_numero,
    v_interm_complemento,
    v_interm_bairroDistrito,
    v_interm_municipio,
    v_interm_cep,
    v_interm_fone,
    v_interm_email,
    v_descricaoServico,
    v_outrasInformacoes,
    v_valorServicos,
    v_valorTotal,
    v_valorLiquidoItem,
    v_valorDescontoTotal,
    v_indicadorIssqn,
    v_aliquotaIssqn,
    v_baseIssqn,
    v_valorIssqn,
    v_issRetido,
    v_tributadoForaMunicipio,
    v_municipioIncidencia,
    v_incentivoFiscal,
    v_listaServicos,
    v_cnae,
    v_codigoServicoMunicipio,
    v_numeroProcesso,
    v_retencaoInss,
    v_baseRetInss,
    v_valorRetInss,
    v_retencaoIrrf,
    v_baseRetIrrf,
    v_valorRetIrrf,
    v_retencaoPis,
    v_baseRetPis,
    v_valorRetPis,
    v_retencaoCofins,
    v_baseRetCofins,
    v_valorRetCofins,
    v_retencaoCsll,
    v_baseRetCsll,
    v_valorRetCsll,
    v_valorOutrasRetencoes,
    v_stPis,
    v_aliquotaPis,
    v_basePis,
    v_valorPis,
    v_aliquotaCofins,
    v_valorCofins,
    v_pisCofinsRetido,
    v_percentualCargaTributariaFe,
    v_valorCargaTributariaFederal,
    v_percentualCargaTributariaEs,
    v_valorCargaTributariaEstad,
    v_percentualCargaTributariaMu,
    v_valorCargaTributariaMunicip
  FROM DOC a
  JOIN ITEM item
  ON 1=1
  JOIN PAOBRAS obra
  ON obra.idObra = a.idObra
  JOIN PAESTABELECIMENTOXNFSE estXnfse
  ON estXnfse.estabelecimento = a.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = a.pessoaEstabelecimento
  JOIN SIREGIMESTRIBUTARIO regTrib
  ON regTrib.regimeTributario = pessEst.regimeTributario
  JOIN CAENDERECOSPESSOA endEst
  ON endEst.enderecoPessoa = a.endEst_enderecoPessoa
  JOIN SIMUNICIPIOS munEst
  ON munEst.municipio = endEst.municipio
  JOIN SIPAISES paisEst
  ON paisEst.pais = CASE WHEN endEst.pais = ' ' THEN '1058' ELSE endEst.pais END
  JOIN CAFONESPESSOA fonEst
  ON fonEst.idFonePessoa = a.fonEst_idFonePessoa
  JOIN CAFONESPESSOA fonEst2
  ON fonEst2.idFonePessoa = a.fonEst2_idFonePessoa
  JOIN CAEMAILSPESSOA emailEst
  ON emailEst.idEmailPessoa = a.emailEst_idEmailPessoa
  JOIN CAEMAILSPESSOA siteEst
  ON siteEst.idEmailPessoa = a.siteEst_idEmailPessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = a.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEntr
  ON munEntr.municipio = endEntr.municipio
  JOIN SIPAISES paisEntr
  ON paisEntr.pais = CASE WHEN endEntr.pais = ' ' THEN '1058' ELSE endEntr.pais END
  JOIN CAPESSOAS interm
  ON interm.pessoa = a.intermediario
  JOIN CAENDERECOSPESSOA endInterm
  ON endInterm.enderecoPessoa = a.endInterm_enderecoPessoa
  JOIN SIMUNICIPIOS munInterm
  ON munInterm.municipio = endInterm.municipio
  JOIN CAFONESPESSOA fonInterm
  ON fonInterm.idFonePessoa = a.fonInterm_idFonePessoa
  JOIN CAEMAILSPESSOA emailInterm
  ON emailInterm.idEmailPessoa = a.emailInterm_idEmailPessoa
  JOIN CAPESSOAS pess
  ON pess.pessoa = a.pessoa
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.enderecoPessoa = a.endPess_enderecoPessoa
  JOIN SIMUNICIPIOS munPess
  ON munPess.municipio = endPess.municipio
  JOIN SIPAISES paisPess
  ON paisPess.pais = CASE WHEN endPess.pais = ' ' THEN '1058' ELSE endPess.pais END
  JOIN CAFONESPESSOA fonPess
  ON fonPess.idFonePessoa = a.fonPess_idFonePessoa
  JOIN CAFONESPESSOA fonPess2
  ON fonPess2.idFonePessoa = a.fonPess2_idFonePessoa
  JOIN CAEMAILSPESSOA emailPess
  ON emailPess.idEmailPessoa = a.emailPess_idEmailPessoa
  JOIN CAEMAILSPESSOA sitePess
  ON sitePess.idEmailPessoa = a.sitePess_idEmailPessoa
  JOIN SIMUNICIPIOS munServ
  ON munServ.municipio =
    CASE
      WHEN item.tributadoForaMunicipio = 1
      THEN a.municipioFatoGerador
      ELSE endEst.municipio
    END
  JOIN SIUNIDADESMEDIDA unid
  ON unid.unidadeMedida = item.unidadeMedidaConversao;
  IF v_estab_tecnologiaNfse = 4 THEN
    -- NFS-e
    v_xml := '<NFSe xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00">'
  || '<infNFSe id="NFS' || v_chaveNFe || '">'
    || '<DPS xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00">'
      || '<infDPS id="DPS'
      || v_estab_municipio
      || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '2' ELSE '1' END
      || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
      || SUBSTR ('00000' || TRIM (v_serieFiscal), -5)
      || SUBSTR ('000000000000000' || TRIM (v_numeroRPS), -15)
      || '">'
-- 1 - Producao, 2 - Homologacao
        || '<tpAmb>' || v_indicadorAmbienteNfse || '</tpAmb>'
-- Formato AAAA-MM-DDThh:mm:ssTZD
        || '<dhEmi>' || v_dataHoraEmissao || '</dhEmi>'
-- Versão do aplicativo que gerou o DPS
        || '<verAplic>ADDERI 2024</verAplic>'
-- Número do equipamento emissor do DPS ou série do DPS</serie>'
        || '<serie>' || v_serieFiscal || '</serie>'
        || '<nDPS>' || v_numeroRPS || '</nDPS>'
-- Data em que se iniciou a prestação do serviço: Dia, mês e ano (AAAAMMDD)
        || '<dCompet>' || v_dataCompetencia || '</dCompet>'
-- Emitente da DPS: 1 - Prestador; 2 - Tomador; 3 - Intermediário
        || '<tpEmit>1</tpEmit>'
        || '<cLocEmi>' || v_estab_municipio || '</cLocEmi>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
        || '<prest>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_estab_indicadorPessoa = 'J' THEN v_estab_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_estab_indicadorPessoa = 'F' THEN v_estab_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_estab_inscricaoMunicipal)
          || '<xNome>' || v_estab_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_estab_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_estab_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_estab_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_estab_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_estab_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_estab_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_estab_fone)
          || FUNC_ADD_TAG_XML ('email', v_estab_email)
        || '</prest>';

    -- Tomador (Cliente)
    v_xml := v_xml
        || '<toma>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_pess_indicadorPessoa = 'J' THEN v_pess_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_pess_indicadorPessoa = 'F' THEN v_pess_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_pess_inscricaoMunicipal)
          || '<xNome>' || v_pess_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_pess_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_pess_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_pess_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_pess_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_pess_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_pess_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_pess_fone)
          || FUNC_ADD_TAG_XML ('email', v_pess_email)
        || '</toma>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
        || '<interm>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_interm_indicadorPessoa = 'J' THEN v_interm_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_interm_indicadorPessoa = 'F' THEN v_interm_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_interm_inscricaoMunicipal)
          || '<xNome>' || v_interm_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_interm_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_interm_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_interm_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_interm_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_interm_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_interm_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_interm_fone)
          || FUNC_ADD_TAG_XML ('email', v_interm_email)
        || '</interm>';
    END IF;

-- Serviço
    v_xml := v_xml
        || '<serv>'
          || '<locPrest>'
-- Codigo ibge do municipio onde o servico e prestado</locPrest>
            || '<locPrest>' || v_municipioIncidencia || '</locPrest>'
-- Pais onde ocorreu a prestacao do servico
            || '<cPaisPrestacao>1058</cPaisPrestacao>'
          || '</locPrest>'
          || '<cServ>'
-- Código de tributação nacional do ISSQN.
            || '<cTribNac>' || v_indicadorIssqn || '</cTribNac>'
-- Descrição completa do serviço prestado
            || '<xDescServ>' || v_descricaoServico || '</xDescServ>'
          || '</cServ>'
          || '<obra>'
-- numero identificacao da obra
            || '<cObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</cObra>'
            || '<end>'
              || FUNC_ADD_TAG_XML ('CEP', v_entr_cep)
              || FUNC_ADD_TAG_XML ('xLgr', v_entr_logradouro)
              || FUNC_ADD_TAG_XML ('nro', v_entr_numero)
              || FUNC_ADD_TAG_XML ('xCpl', v_entr_complemento)
              || FUNC_ADD_TAG_XML ('xBairro', v_entr_bairroDistrito)
            || '</end>'
          || '</obra>'
        || '</serv>';

-- Valores
    v_xml := v_xml
        || '<valores>'
          || '<vServPrest>'
-- Valor monetário recebido pelo intermediário do serviço (R$)
            || '<vReceb>0.00</vReceb>'
-- Valor do serviço (R$)
            || '<vServ>' || v_valorServicos || '</vServ>'
          || '</vServPrest>'
          || '<vDescCondIncond>'
            || '<vDescIncond>' || v_valorDescontoTotal || '</vDescIncond>'
            || '<vDescCond>0.00</vDescCond>'
          || '</vDescCondIncond>'
          || '<trib>'
            || '<tribFed>'
              || '<piscofins>'
-- Código de Situação Tributária do PIS/COFINS (CST):
-- 00 - Nenhum;
-- 01 - Operação Tributável com Alíquota Básica;
-- 02 - Operação Tributável com Alíquota Diferenciada;
-- 03 - Operação Tributável com Alíquota por Unidade de Medida de Produto;
-- 04 - Operação Tributável monofásica - Revenda a Alíquota Zero;
-- 05 - Operação Tributável por Substituição Tributária;
-- 06 - Operação Tributável a Alíquota Zero;
-- 07 - Operação Tributável da Contribuição;
-- 08 - Operação sem Incidência da Contribuição;
-- 09 - Operação com Suspensão da Contribuição;
            || '<CST>' || CASE WHEN v_pisCofinsRetido = '1' THEN '01' ELSE v_stPis END || '</CST>'
-- Valor da Base de Cálculo do PIS/COFINS (R$)
            || '<vBCPisCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_baseRetPis ELSE v_basePis END || '</vBCPisCofins>'
-- Valor da Alíquota do PIS (%).
            || '<pAliqPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoPis ELSE v_aliquotaPis END || '</pAliqPis>'
-- Valor da Alíquota da COFINS (%).
            || '<pAliqCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoCofins ELSE v_aliquotaCofins END || '</pAliqCofins>'
-- Valor monetário do PIS (R$).
            || '<vPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetPis ELSE v_valorPis END || '</vPis>'
-- Valor monetário do COFINS (R$).
            || '<vCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetCofins ELSE v_valorCofins END || '</vCofins>'
-- Tipo de retencao do Pis/Cofins:1 - Retido;2 - Não Retido;
            || '<tpRetPisCofins>' || v_pisCofinsRetido || '</tpRetPisCofins>' 
              || '</piscofins>'
-- Valor monetário do CP(R$).
              || '<vRetCP>0.00</vRetCP>'
-- Valor monetário do IRRF (R$).
              || '<vRetIRRF>' || v_valorRetIrrf || '</vRetIRRF>'
-- Valor monetário do CSLL (R$).
              || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
            || '</tribFed>'
            || '<tribMun>'
-- Tributação do ISSQN sobre o serviço prestado: 1 - Operação tributável; 2 - Exportação de serviço; 3 - Não Incidência; 4 - Imunidade;
              || '<tribISSQN>' || CASE v_indicadorIssqn WHEN '2' THEN '3' WHEN '4' THEN '2' WHEN '5' THEN '4' ELSE '1' END ||'</tribISSQN>'
-- Tipo de retencao do ISSQN: 1 - Não Retido; 2 - Retido pelo Tomador; 3 - Retido pelo Intermediario;
              || '<tpRetISSQN>' || CASE WHEN v_issRetido = '1' THEN '2' ELSE '1' END || '</tpRetISSQN>'
            || '</tribMun>'
            || '<totTrib>'
-- Valor monetário total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012
              || '<vTotTrib>0</vTotTrib>'
-- Valor percentual total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012
              || '<pTotTrib>0</pTotTrib>'
-- Indicador de informação de valor total de tributos. Possui valor fixo igual a zero (indTotTrib=0). Não informar nenhum valor estimado para os Tributos (Decreto 8.264/2014). 0 - Não;
              || '<indTotTrib>0</indTotTrib>'
-- Valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%)
              || '<pTotTribSN>0</pTotTribSN>'
            || '</totTrib>'
          || '</trib>'
        || '</valores>'
      || '</infDPS>'
    || '</DPS>'
  || '</infNFSe>'
|| '</NFSe>';

-- Município: 4202008 - Balneário Camboriú - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4202008' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.publica.inf.br">'
      || '<LoteRps id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' ||
                CASE v_indicadorIssqn
                  -- 118 ISS NÃO TRIBUTÁVEL
                  WHEN '2' THEN '118'
                  -- 103 ISENTO
                  WHEN '3' THEN '103'
                  -- 119 NÃO INCIDÊNCIA DE ISS - TOMADOR INTERNACIONAL
                  WHEN '4' THEN '119'
                  -- 104 IMUNE
                  WHEN '5' THEN '104'
                  -- 111 Exigibilidade suspensa por decisão judicial
                  WHEN '6' THEN '111'
                  -- 112 Exigibilidade suspensa por Processo Administrativo
                  WHEN '7' THEN '112'
                  ELSE
                    CASE
                      -- 114 ISS retido pelo tomador, devido para Outros Municípios (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '114'
                      -- 110 ISS retido pelo tomador (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                      THEN '110'  
                      -- 108 ISS devido para outro Município (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '108'
                      -- 116 ISS devido em Balneário Camboriú, prestado fora (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '116'
                      -- 107 ISS devido para Balneário Camboriú (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                      THEN '107'
                      -- 113 ISS retido pelo tomador - Devido para Outros Municípios
                      WHEN v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '113'
                      -- 105 ISS retido pelo tomador
                      WHEN v_issRetido = '1'
                      THEN '105'
                      -- 102 ISS devido para outro Município
                      WHEN v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '102'
                      -- 115 ISS devido em Balneário Camboriú, prestado fora
                      WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '115'
                      -- 101 ISS devido para Balneário Camboriú
                      ELSE '101'
                      -- NÃO TRATADOS:
                      -- 106 ISS FIXO Prestado em Balneário Camboriú
                      -- 117 ISS Fixo Devido em Balneário Camboriú Prestado Fora
                      -- 150 NOTA AVULSA
                    END
                END || '</NaturezaOperacao>'
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || TO_CHAR (v_municipioFatoGerador) || '</CodigoMunicipio>'
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
                  || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || '<Cep>' || v_pess_cep || '</Cep>'
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
    || '</EnviarLoteRpsEnvio>';

-- Município: 4209102 - Joinville - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4209102' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.publica.inf.br">'
      || '<LoteRps id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' ||
                CASE v_indicadorIssqn
                  -- ISS NÃO TRIBUTÁVEL (NÃO TRATADO)
                  WHEN '2' THEN '000'
                  -- ISENTO (NÃO TRATADO)
                  WHEN '3' THEN '000'
                  -- 113 Não incidência de ISS - Tomador internacional
                  WHEN '4' THEN '113'
                  -- 104 IMUNE
                  WHEN '5' THEN '104'
                  -- Exigibilidade suspensa por decisão judicial (NÃO TRATADO)
                  WHEN '6' THEN '000'
                  -- Exigibilidade suspensa por Processo Administrativo (NÃO TRATADO)
                  WHEN '7' THEN '000'
                  ELSE
                    CASE
                      -- ISS retido pelo tomador, devido para Outros Municípios (Simples Nacional)
--                      WHEN v_optanteSimplesNacional = '1'
--                        AND v_issRetido = '1'
--                        AND v_tributadoForaMunicipio = 1
--                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                      THEN '000'
                      -- 110 ISS retido pelo tomador (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                      THEN '110'  
                      -- 108 ISS devido para outro Município (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '108'
                      -- 115 ISS devido em Joinville, prestado fora (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '115'
                      -- 107 ISS devido para Joinville (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                      THEN '107'
                      -- 114 ISS retido pelo tomador - Devido para Outros Municípios
                      WHEN v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '114'
                      -- 105 ISS retido pelo tomador
                      WHEN v_issRetido = '1'
                      THEN '105'
                      -- 102 ISS devido para outro Município
                      WHEN v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '102'
                      -- 112  ISS devido em Joinville, prestado fora
                      WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '112'
                      -- 101 ISS devido para Joinville
                      ELSE '101'
                      -- NÃO TRATADOS:
                      -- 106  Prestador enquadrado como ISS Fixo ou estimado
                      -- 112 ISS Retido pelo prestador 
                      -- 116 ISS devido para Joinville - Tomador internacional
                      -- 117 Não incidência de ISS (Simples Nacional) - Tomador internacional
                      -- 118 ISS devido para Joinville (Simples Nacional) - Tomador internacional
                      -- 119 ISS retido pelo tomador (Poder Publico) 
                      -- 150 NOTA AVULSA
                    END
                END || '</NaturezaOperacao>'
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || TO_CHAR (v_municipioFatoGerador) || '</CodigoMunicipio>'
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' OR v_pess_municipio <> '4209102' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
                  || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || '<Cep>' || v_pess_cep || '</Cep>'
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
    || '</EnviarLoteRpsEnvio>';

-- Município: 4218004 - Tijucas - SC
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: PRÓPRIA
-- Assinar: itens
-- Síncrono
  ELSIF v_estab_municipio = '4218004' THEN
    -- NFS-e
    v_xml := '<nfse>'
  || '<rps>'
    || '<nro_recibo_provisorio>' || v_numeroRPS || '</nro_recibo_provisorio>'
    || '<serie_recibo_provisorio>1</serie_recibo_provisorio>'
    || '<data_emissao_recibo_provisorio>' || CASE WHEN v_dataEmissao IS NULL THEN '00/00/0000' ELSE TO_CHAR (v_dataEmissao, 'DD/MM/YYYY') END || '</data_emissao_recibo_provisorio>'
    || '<hora_emissao_recibo_provisorio>' || CASE WHEN v_dataEmissao IS NULL THEN '00:00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END || '</hora_emissao_recibo_provisorio>'
  || '</rps>';

    -- NF
    v_xml := v_xml
  || '<nf>'
--    || '<serie_nfse>' || v_serieFiscal || '</serie_nfse>'
--    || '<data_fato_gerador>' || v_dataCompetenciaDDMMYYYY || '</data_fato_gerador>'
    || '<valor_total>' || REPLACE (v_valorTotal, '.', ',') || '</valor_total>'
    || '<valor_desconto>0,00</valor_desconto>'
    || '<valor_ir>' || REPLACE (v_valorRetIrrf, '.', ',') || '</valor_ir>'
    || '<valor_inss>' || REPLACE (v_valorRetInss, '.', ',') || '</valor_inss>'
    || '<valor_contribuicao_social>' || REPLACE (v_valorRetCsll, '.', ',') || '</valor_contribuicao_social>'
    || '<valor_rps>0,00</valor_rps>'
    || '<valor_pis>' || REPLACE (v_valorPis, '.', ',') || '</valor_pis>'
    || '<valor_cofins>' || REPLACE (v_valorCofins, '.', ',') || '</valor_cofins>'
    || FUNC_ADD_TAG_XML ('observacao', v_outrasInformacoes)
  || '</nf>';

    -- Prestador
    v_xml := v_xml
  || '<prestador>'
    || '<cpfcnpj>' || v_estab_cnpjCpfIdEstrangeiro || '</cpfcnpj>'
    || '<cidade>' || v_estab_municipio || '</cidade>'
  || '</prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
  || '<tomador>'
--    || '<endereco_informado>' || CASE WHEN v_pess_logradouro = ' ' THEN '0' ELSE '1' END || '</endereco_informado>'
    || '<tipo>' || v_pess_indicadorPessoa || '</tipo>'
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_pess_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('ie', v_pess_inscricaoEstadual)
    || FUNC_ADD_TAG_XML ('nome_razao_social', v_pess_nomeRazaoSocial)
    || '<sobrenome_nome_fantasia/>'
--    || FUNC_ADD_TAG_XML ('sobrenome_nome_fantasia', v_pess_apelidoFantasia)
    || FUNC_ADD_TAG_XML ('logradouro', v_pess_logradouro || ', ' || v_pess_numero)
    || FUNC_ADD_TAG_XML ('email', v_pess_email)
--    || FUNC_ADD_TAG_XML ('numero_residencia', v_pess_numero)
    || FUNC_ADD_TAG_XML ('complemento', v_pess_complemento)
    || FUNC_ADD_TAG_XML ('ponto_referencia', v_pess_observacoesEndereco)
    || FUNC_ADD_TAG_XML ('bairro', v_pess_bairroDistrito)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_pess_municipio))
    || FUNC_ADD_TAG_XML ('cep', TO_CHAR (v_pess_cep))
    || '<ddd_fone_comercial/>'
    || FUNC_ADD_TAG_XML ('fone_comercial', v_pess_fone)
    || '<ddd_fone_residencial/>'
    || '<fone_residencial/>'
    || '<ddd_fax/>'
    || '<fone_fax/>'
  || '</tomador>';

    -- Itens
    v_xml := v_xml
  || '<itens>'
    || '<lista>'
      || '<codigo_local_prestacao_servico>' || v_municipioIncidencia || '</codigo_local_prestacao_servico>'
      || FUNC_ADD_TAG_XML ('codigo_item_lista_servico', REPLACE (v_listaServicos, '.', ''))
      || FUNC_ADD_TAG_XML ('descritivo', v_descricaoServico)
      || '<aliquota_item_lista_servico>' || REPLACE (v_aliquotaIssqn, '.', ',') || '</aliquota_item_lista_servico>'
      || '<situacao_tributaria>00</situacao_tributaria>'
      || '<valor_tributavel>' || REPLACE (v_valorTotal, '.', ',') || '</valor_tributavel>'
      || '<valor_deducao>0,00</valor_deducao>'
      || '<valor_issrf>' || CASE WHEN v_issRetido = '1' THEN REPLACE (v_valorIssqn, '.', ',') ELSE '0,00' END || '</valor_issrf>'
      || '<tributa_municipio_prestador>' || CASE WHEN v_tributadoForaMunicipio = '1' THEN 'N' ELSE 'S' END|| '</tributa_municipio_prestador>'
      || '<unidade_codigo>1</unidade_codigo>'
      || '<unidade_quantidade>1,00</unidade_quantidade>'
      || '<unidade_valor_unitario>' || REPLACE (v_valorTotal, '.', ',') || '</unidade_valor_unitario>'
--      || '<codigo_atividade>0</codigo_atividade>'
--      || FUNC_ADD_TAG_XML ('cno', v_codigoObra)
    || '</lista>'
  || '</itens>'
  || '<produtos> </produtos>'
  -- Assinar Aqui
|| '</nfse>';

-- Município: 4300703 - Anta Gorda - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4300703' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4300703</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4300703</IdCidade>'
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4301404 - Arvorezinha - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4301404' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || CASE WHEN v_issRetido = '1' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' ELSE '' END
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
              || '<CodigoMunicipio>' || v_interm_municipio || '</CodigoMunicipio>'
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
          || '<ConstrucaoCivil>'
            || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
            || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
          || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4302105 - Bento Gonçalves - RS
-- Empresa: Elotech
-- Tecnologia: 5 - Elotech
-- Versão: 2.03
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4302105' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns="http://shad.elotech.com.br/schemas/iss/nfse_v2_03.xsd">'
  || '<IdentificacaoRequerente>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<Senha>' || v_estab_senhaWS || '</Senha>'
    || '<Homologa>false</Homologa>'
  || '</IdentificacaoRequerente>'
  || '<LoteRps versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>RPS</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<AliquotaPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoPis ELSE v_aliquotaPis END || '</AliquotaPis>'
              || '<RetidoPis>' || v_pisCofinsRetido || '</RetidoPis>'
              || '<ValorPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetPis ELSE v_valorPis END || '</ValorPis>'
              || '<AliquotaCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoCofins ELSE v_aliquotaCofins END || '</AliquotaCofins>'
              || '<RetidoCofins>' || v_pisCofinsRetido || '</RetidoCofins>'
              || '<ValorCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetCofins ELSE v_valorCofins END || '</ValorCofins>'
              || '<AliquotaInss>' || v_retencaoInss || '</AliquotaInss>'
              || '<RetidoInss>1</RetidoInss>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<AliquotaIr>' || v_retencaoIrrf || '</AliquotaIr>'
              || '<RetidoIr>1</RetidoIr>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<AliquotaCsll>' || v_retencaoCsll || '</AliquotaCsll>'
              || '<RetidoCsll>1</RetidoCsll>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<AliquotaCpp>0.00</AliquotaCpp>'
              || '<RetidoCpp>1</RetidoCpp>'
              || '<ValorCpp>0.00</ValorCpp>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<RetidoOutrasRetencoes>1</RetidoOutrasRetencoes>'
              || '<AliquotaTotTributos>0.00</AliquotaTotTributos>'
              || '<ValTotTributos>0.00</ValTotTributos>'
--              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
--              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || CASE WHEN v_issRetido = '1' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' ELSE '' END
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<CodigoNbs>0</CodigoNbs>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
            || '<ListaItensServico>'
              || '<ItemServico>'
                || '<ItemListaServico>' || REPLACE (v_listaServicos, '.', '') || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<Descricao>' || v_descricaoServico || '</Descricao>'
                || '<Unidade>UN</Unidade>'
                || '<Tributavel>1</Tributavel>'
                || '<Quantidade>1</Quantidade>'
                || '<ValorUnitario>' || v_valorTotal || '</ValorUnitario>'
                || '<ValorDesconto>0.00</ValorDesconto>'
                || '<ValorLiquido>' || v_valorTotal || '</ValorLiquido>'
              || '</ItemServico>'
            || '</ListaItensServico>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || CASE WHEN v_estab_inscricaoMunicipal = ' ' THEN '' ELSE '<InscricaoMunicipal>' || v_estab_inscricaoMunicipal || '</InscricaoMunicipal>' END
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE '<InscricaoMunicipal>' || v_pess_inscricaoMunicipal || '</InscricaoMunicipal>' END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>'
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE '<Telefone>' || v_pess_fone || '</Telefone>' END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE '<Email>' || v_pess_email || '</Email>' END
            || '</Contato>' END
            || CASE WHEN v_pess_inscricaoEstadual = ' ' THEN '' ELSE '<InscricaoEstadual>' || v_pess_inscricaoEstadual || '</InscricaoEstadual>' END
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || CASE WHEN v_interm_inscricaoMunicipal = ' ' THEN '' ELSE '<InscricaoMunicipal>' || v_interm_inscricaoMunicipal || '</InscricaoMunicipal>' END
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
              || '<CodigoMunicipio>' || v_interm_municipio || '</CodigoMunicipio>'
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
          || '<ConstrucaoCivil>'
            || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
            || FUNC_ADD_TAG_XML ('Art', v_art)
          || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
--          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsEnvio>';

-- Município: 4304606 - Canoas - RS
-- Empresa: INFISC
-- Tecnologia: 3 - INFISC
-- Versão: 2.03
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4304606' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="' || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END || LPAD (p_loteWebService, 4, '0') || '">'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>RPS</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValTotTributos>0.00</ValTotTributos>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ResponsavelRetencao>1</ResponsavelRetencao>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
              || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '<Contato/>' ELSE '<Contato>'
                || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
                || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
              || '</Contato>' END
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
              || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4305108 - Caxias do Sul - RS
-- Empresa: INFISC
-- Tecnologia: 3 - INFISC
-- Versão: 2.03
-- Assinar: 
-- Síncrono
  ELSIF v_estab_municipio = '4305108' THEN

    -- NFS-e
    v_xml := '<envioLote versao="1.0">'
  || '<CNPJ>' || v_estab_cnpjCpfIdEstrangeiro || '</CNPJ>'
  || '<dhTrans>' || REPLACE (v_dataHoraEmissao, 'T', ' ' ) || '</dhTrans>'
  || '<NFS-e>'
    || '<infNFSe versao="1.1">'
      || '<Id>'
        || '<cNFS-e>' || p_loteWebService || '</cNFS-e>'
        || '<mod>90</mod>'
        || '<serie>' || v_serieFiscal || '</serie>'
        || '<nNFS-e>' || v_numeroRPS || '</nNFS-e>'
        || '<dEmi>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</dEmi>'
        || '<hEmi>' || CASE WHEN v_dataEmissao IS NULL THEN '00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI') END || '</hEmi>'
        || '<tpNF>1</tpNF>'
        || '<refNF>' || v_chaveNFe || '</refNF>'
        || '<tpImp>1</tpImp>'
        || '<tpEmis>N</tpEmis>'
        || '<cancelada>N</cancelada>'
        || '<canhoto>1</canhoto>'
      || '</Id>';

    -- Prestador
    v_xml := v_xml
      || '<prest>'
        || '<CNPJ>' || v_estab_cnpjCpfIdEstrangeiro || '</CNPJ>'
        || '<xNome>' || v_estab_nomeRazaoSocial || '</xNome>'
        || '<xFant>' || v_estab_apelidoFantasia || '</xFant>'
        || FUNC_ADD_TAG_XML ('IM', v_estab_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('xEmail', v_estab_email)
        || FUNC_ADD_TAG_XML ('xSite', v_estab_site)
        || '<end>'
          || FUNC_ADD_TAG_XML ('xLgr', v_estab_logradouro)
          || FUNC_ADD_TAG_XML ('nro', v_estab_numero)
          || FUNC_ADD_TAG_XML ('xCpl', v_estab_complemento)
          || FUNC_ADD_TAG_XML ('xBairro', v_estab_bairroDistrito)
          || FUNC_ADD_TAG_XML ('cMun', v_estab_municipio)
          || FUNC_ADD_TAG_XML ('xMun', v_estab_municipioDescricao)
          || FUNC_ADD_TAG_XML ('UF', v_estab_uf)
          || FUNC_ADD_TAG_XML ('CEP', v_estab_cep)
          || FUNC_ADD_TAG_XML ('cPais', v_estab_pais)
          || FUNC_ADD_TAG_XML ('xPais', v_estab_paisDescricao)
        || '</end>'
        || FUNC_ADD_TAG_XML ('fone', v_estab_fone)
        || FUNC_ADD_TAG_XML ('fone2', v_estab_fone2)
        || FUNC_ADD_TAG_XML ('IE', v_estab_inscricaoEstadual)
        || FUNC_ADD_TAG_XML ('regimeTrib', v_estab_regimeTributario)
      || '</prest>';

    -- Tomador
    v_xml := v_xml
      || '<TomS>'
        || '<'|| UPPER (v_pess_tipo) || '>' || v_pess_cnpjCpfIdEstrangeiro || '</'|| UPPER (v_pess_tipo) || '>'
        || FUNC_ADD_TAG_XML ('xNome', v_pess_nomeRazaoSocial)
        || '<ender>'
          || FUNC_ADD_TAG_XML ('xLgr', v_pess_logradouro)
          || FUNC_ADD_TAG_XML ('nro', v_pess_numero)
          || FUNC_ADD_TAG_XML ('xCpl', v_pess_complemento)
          || FUNC_ADD_TAG_XML ('xBairro', v_pess_bairroDistrito)
          || FUNC_ADD_TAG_XML ('cMun', v_pess_municipio)
          || FUNC_ADD_TAG_XML ('xMun', v_pess_municipioDescricao)
          || FUNC_ADD_TAG_XML ('UF', v_pess_uf)
          || FUNC_ADD_TAG_XML ('CEP', v_pess_cep)
          || FUNC_ADD_TAG_XML ('cPais', v_pess_pais)
          || FUNC_ADD_TAG_XML ('xPais', v_pess_paisDescricao)
        || '</ender>'
        || FUNC_ADD_TAG_XML ('xEmail', v_pess_email)
        || FUNC_ADD_TAG_XML ('IE', v_pess_inscricaoEstadual)
        || FUNC_ADD_TAG_XML ('IM', v_pess_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('fone', v_pess_fone)
        || FUNC_ADD_TAG_XML ('fone2', v_pess_fone2)
      || '</TomS>';

    -- Construção Civil
    v_xml := v_xml
      || '<dadosDaObra>'
        || FUNC_ADD_TAG_XML ('xLogObra', v_entr_logradouro)
        || FUNC_ADD_TAG_XML ('xComplObra', v_entr_complemento)
        || FUNC_ADD_TAG_XML ('vNumeroObra', v_entr_numero)
        || FUNC_ADD_TAG_XML ('xBairroObra', v_entr_bairroDistrito)
        || FUNC_ADD_TAG_XML ('xCepObra', v_entr_cep)
        || FUNC_ADD_TAG_XML ('cCidadeObra', v_entr_municipio)
        || FUNC_ADD_TAG_XML ('xCidadeObra', v_entr_municipioDescricao)
        || FUNC_ADD_TAG_XML ('xUfObra', v_entr_uf)
        || FUNC_ADD_TAG_XML ('cPaisObra', v_entr_pais)
        || FUNC_ADD_TAG_XML ('xPaisObra', v_entr_paisDescricao)
        || '<numeroArt>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</numeroArt>'
        || '<numeroCei>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</numeroCei>'
        || '<numeroProj/>'
        || '<numeroMatri/>'
      || '</dadosDaObra>';

    -- Transportadora
    v_xml := v_xml
      || '<transportadora>'
        || '<xNomeTrans>' || v_estab_nomeRazaoSocial || '</xNomeTrans>'
        || '<xCpfCnpjTrans>' || v_estab_cnpjCpfIdEstrangeiro || '</xCpfCnpjTrans>'
        || FUNC_ADD_TAG_XML ('xInscEstTrans', v_estab_inscricaoEstadual)
        || '<xPlacaTrans/>'
        || FUNC_ADD_TAG_XML ('xEndTrans', v_estab_logradouro)
        || FUNC_ADD_TAG_XML ('cMunTrans', v_estab_municipio)
        || FUNC_ADD_TAG_XML ('xMunTrans', v_estab_municipioDescricao)
        || FUNC_ADD_TAG_XML ('xUfTrans', v_estab_uf)
        || FUNC_ADD_TAG_XML ('cPaisTrans', v_estab_pais)
        || FUNC_ADD_TAG_XML ('xPaisTrans', v_estab_paisDescricao)
        || '<vTipoFreteTrans>0</vTipoFreteTrans>'
      || '</transportadora>';

    -- Itens
      v_xml := v_xml
      || '<det>'
        || '<nItem>1</nItem>'
        || '<serv>'
          || '<cServ>' || COALESCE (CASE WHEN v_codigoServicoMunicipio = ' ' THEN '0' ELSE v_codigoServicoMunicipio END, '0') || '</cServ>'
          || '<cLCServ>' || REPLACE (v_listaServicos, '.', '') || '</cLCServ>'
          || '<xServ>' || COALESCE (TRIM (SUBSTR (v_descricaoServico, 1, 256)), ' ') || '</xServ>'          
          || '<localTributacao>' || v_municipioIncidencia || '</localTributacao>'
          || '<localVerifResServ>1</localVerifResServ>'
          || '<uTrib>UN</uTrib>'
          || '<qTrib>1</qTrib>'
          || '<vUnit>' || v_valorTotal || '</vUnit>'
          || '<vServ>' || v_valorTotal || '</vServ>'
          || '<vDesc>0.00</vDesc>'
          || '<vBCISS>' || v_baseIssqn || '</vBCISS>'
          || '<pISS>' || v_aliquotaIssqn || '</pISS>'
          || '<vISS>' || v_valorIssqn || '</vISS>'
          || '<vBCINSS>' || v_baseRetInss || '</vBCINSS>'
          || '<pRetINSS>' || v_retencaoInss || '</pRetINSS>'
          || '<vRetINSS>' || v_valorRetInss || '</vRetINSS>'
          || '<vRed>0.00</vRed>'
          || '<vBCRetIR>' || v_baseRetIrrf || '</vBCRetIR>'
          || '<pRetIR>' || v_retencaoIrrf || '</pRetIR>'
          || '<vRetIR>' || v_valorRetIrrf || '</vRetIR>'
          || '<vBCCOFINS>' || v_baseRetCofins || '</vBCCOFINS>'
          || '<pRetCOFINS>' || v_retencaoCofins || '</pRetCOFINS>'
          || '<vRetCOFINS>' || v_valorRetCofins || '</vRetCOFINS>'
          || '<vBCCSLL>' || v_baseRetCsll || '</vBCCSLL>'
          || '<pRetCSLL>' || v_retencaoCsll || '</pRetCSLL>'
          || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
          || '<vBCPISPASEP>' || v_baseRetPis || '</vBCPISPASEP>'
          || '<pRetPISPASEP>' || v_retencaoPis || '</pRetPISPASEP>'
          || '<vRetPISPASEP>' || v_valorRetPis || '</vRetPISPASEP>'
        || '</serv>'
      || '</det>';

    -- Totais
    v_xml := v_xml
      || '<total>'
        || '<vServ>' || v_valorTotal  || '</vServ>'
        || '<vDesc>0.00</vDesc>'
        || '<vtNF>' || v_valorTotal || '</vtNF>'
        || '<vtLiq>' || v_valorTotal || '</vtLiq>'
        || '<Ret>'
          || '<vRetIR>' || v_valorRetIrrf || '</vRetIR>'
          || '<vRetPISPASEP>' || v_valorRetPis || '</vRetPISPASEP>'
          || '<vRetCOFINS>' || v_valorRetCofins || '</vRetCOFINS>'
          || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
          || '<vRetINSS>' || v_valorRetInss || '</vRetINSS>'
        || '</Ret>'
        || '<vtLiqFaturas>' || REPLACE (TO_CHAR (v_valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</vtLiqFaturas>'
        || '<ISS>'
          || '<vBCISS>' || v_baseIssqn || '</vBCISS>'
          || '<vISS>' || v_valorIssqn || '</vISS>'
        || '</ISS>'
      || '</total>';

    -- Faturas
    v_xml := v_xml
      || '<faturas>';
    v_sequencia := 0;
    v_saldo := v_valorLiquidoItem;
    FOR a IN (
      SELECT
        fin.vencimento,
        fin.valor
      FROM MODOCFISCALXPAGAMENTOS a
      JOIN MOFINANCEIROS fin
      ON fin.idPagamentoDocFiscal = a.idPagamentoDocFiscal
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
      AND a.pagamentoTroco = 'P'
      ORDER BY
        a.sequencia,
        fin.parcelaAtual)
    LOOP
      v_valor := a.valor;
      IF v_valor > v_saldo THEN
        v_valor := v_saldo;
      END IF;
      v_saldo := v_saldo - v_valor;
      IF v_valor > 0 THEN
        v_sequencia := v_sequencia + 1;
        v_xml := v_xml
        || '<fat>'
          || '<nItem>' || TO_CHAR (v_sequencia) || '</nItem>'
          || '<nFat>' || v_numeroRPS || '/' || TO_CHAR (v_sequencia) || '</nFat>'
          || '<dVenc>' || CASE WHEN a.vencimento IS NULL THEN '0000-00-00' ELSE TO_CHAR (a.vencimento, 'YYYY-MM-DD') END || '</dVenc>'
          || '<vFat>' || REPLACE (TO_CHAR (v_valor, 'FM9999999999990D00'), ',', '.') || '</vFat>'
        || '</fat>';
      END IF;
    END LOOP;
    v_xml := v_xml
      || '</faturas>';

    -- Outros
    v_xml := v_xml
      || '<infAdicLT>' || v_municipioIncidencia || '</infAdicLT>'
      || FUNC_ADD_TAG_XML ('infAdic',v_outrasInformacoes)
    || '</infNFSe>'
  || '</NFS-e>'
|| '</envioLote>';

-- Município: 4308607 - Garibaldi - RS
-- Empresa: INFISC
-- Tecnologia: 3 - INFISC
-- Versão: 2.03
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4308607' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="' || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END || LPAD (p_loteWebService, 4, '0') || '">'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>' || v_serieFiscal || '</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValTotTributos>0.00</ValTotTributos>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ResponsavelRetencao>1</ResponsavelRetencao>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
              || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '<Contato/>' ELSE '<Contato>'
                || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
                || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
              || '</Contato>' END
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
              || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4309100 - Gramado - RS
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: 2.04
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4309100' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="2.04">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<Prestador>'
      || '<CpfCnpj>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
      || '</CpfCnpj>'
    || '</Prestador>'
    || '<QuantidadeRps>1</QuantidadeRps>' 
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="1'
          || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
          || LPAD (p_loteWebService, 14, '0')
          || '">'          
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>1</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

  -- Serviço
  v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
          || '</Prestador>';

  -- Tomador (Cliente)
  v_xml := v_xml
          || '<TomadorServico>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>' END
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '</Contato>' END
          || '</TomadorServico>';

  -- Outros
  v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4309407 - Guaporé - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4309407' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
          || '<ConstrucaoCivil>'
            || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
            || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
          || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsEnvio>';

-- Município: 4309902 - Ibiraiaras - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4309902' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsEnvio>';

-- Município: 4312906 - Nova Bassano - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4312906' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4312906</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4312906</IdCidade>'            
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4313300 - Nova Prata - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4313300' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4313300</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4313300</IdCidade>'
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4313409 - Novo Hamburgo - RS
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: 2.04
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4313409' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="2.04">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<Prestador>'
      || '<CpfCnpj>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
      || '</CpfCnpj>'
    || '</Prestador>'
    || '<QuantidadeRps>1</QuantidadeRps>' 
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="1'
          || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
          || LPAD (p_loteWebService, 14, '0')
          || '">'          
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>1</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

  -- Serviço
  v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
          || '</Prestador>';

  -- Tomador (Cliente)
  v_xml := v_xml
          || '<TomadorServico>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>' END
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '</Contato>' END
          || '</TomadorServico>';

  -- Outros
  v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4314902 - Porto Alegre - RS
-- Empresa: BHISS
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: InfRps, LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4314902' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
      || '<LoteRps Id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps Id="rps:' || v_numeroRPS || TRIM(v_serieFiscal) || '">'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
              || CASE WHEN v_regimeEspecialTributacao = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao) END
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_estab_municipio || '</CodigoMunicipio>'
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
                  || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || '<Cep>' || v_pess_cep || '</Cep>'
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
    || '</EnviarLoteRpsEnvio>';

-- Município: 4318705 - São Leopoldo - RS
-- Empresa: THEMA
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4318705' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">'
      || '<LoteRps Id="L' || p_loteWebService || '">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps Id="R' || v_numeroRPS || '00000">'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>00000</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' ||
                CASE
                  -- 6.9 Prestação outro Município: Imposto recolhido pelo regime único de arrecadação 
                  -- Simples Nacional; Utilizar quando o prestador do serviço estiver enquadrado 
                  -- no Simples Nacional ou MEI 
                  WHEN v_optanteSimplesNacional = '1'
                    AND v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '69'
                  -- 5.9 Prestação no Município: Imposto recolhido pelo regime único de arrecadação 
                  -- Simples Nacional; Utilizar quando o prestador do serviço estiver enquadrado 
                  -- no Simples Nacional ou MEI 
                  WHEN v_optanteSimplesNacional = '1'
                  THEN '59'
                  -- 6.8 Prestação outro Município: Não tributável; Utilizar quando o serviço prestado não sofrer tributação  pelo ISS. 
                  WHEN v_indicadorIssqn IN ('2','3','4','5','6','7')
                    AND v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '68'
                  -- 5.8 Prestação no Município: Não tributável; Utilizar quando o serviço prestado não sofrer tributação pelo ISS.
                  WHEN v_indicadorIssqn IN ('2','3','4','5','6','7')
                  THEN '58'
                  -- 6.3 Prestação outro Município: Imposto devido fora de São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado não for devido 
                  -- em São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
                  WHEN v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                    AND v_issRetido = '1'
                  THEN '63'
                  -- 6.4 Prestação outro Município: Imposto devido fora de São Leopoldo, sem obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado não for devido 
                  -- em São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
                  WHEN v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '64'
                  -- 6.1 Prestação outro Município: Imposto devido em São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
--                  WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                    AND v_issRetido = '1'
--                  THEN '61'
                  -- 6.2 Prestação outro Município: Imposto devido em São Leopoldo, sem obrigação de 
                  -- retenção na fonte;
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
--                  WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                  THEN '62'
                  -- 5.1 Prestação no Município: Imposto devido em São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
                  WHEN v_issRetido = '1'
                  THEN '51'
                  -- 5.2 Prestação no Município: Imposto devido em São Leopoldo, sem obrigação de 
                  -- retenção na fonte;  
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
                  ELSE '52'
                  -- NÃO TRATADOS:
                  -- 7.8 Prestação no Exterior: Não tributável; Utilizar quando o serviço prestado não sofrer tributação
                END || '</NaturezaOperacao>'
--              || CASE WHEN v_regimeEspecialTributacao = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao) END
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<BaseCalculo>' || v_baseIssqn || '</BaseCalculo>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<ValorLiquidoNfse>' || REPLACE (TO_CHAR (v_valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</ValorLiquidoNfse>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || REPLACE (v_listaServicos, '.', '') || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
--                || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_estab_municipio || '</CodigoMunicipio>'
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
                  || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || '<Cep>' || v_pess_cep || '</Cep>'
                || '</Endereco>'
                || '<Contato>'
                  || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                  || FUNC_ADD_TAG_XML ('Email', v_pess_email)
                || '</Contato>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_interm_nomeRazaoSocial)
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
    || '</EnviarLoteRpsEnvio>';

-- Município: 4320800 - Soledade - RS
-- Empresa: GOV BR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4320800' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            --|| CASE WHEN v_issRetido = '2' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' END
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
          || '<ConstrucaoCivil>'
            || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
            || FUNC_ADD_TAG_XML ('Art', v_art)
          || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

  -- Município Inválido
  ELSE
    v_xml := 'Município Inválido';
  END IF;

  RETURN v_xml;
END;

/

CREATE TABLE PALISTASCRM_2501 AS SELECT * FROM PALISTASCRM;

ALTER TABLE PALISTACRMXESTABELEC DROP CONSTRAINT PALISTACRMXESTABELEC_FK1;
ALTER TABLE PALISTACRMXPERFISUSUARIOS DROP CONSTRAINT PALISTACRMXPERFISUSUARIOS_FK1;
ALTER TABLE PALISTACRMXUSUARIOS DROP CONSTRAINT PALISTACRMXUSUARIOS_FK1;
ALTER TABLE PALISTACRMXREGRAS DROP CONSTRAINT PALISTACRMXREGRAS_FK1;
ALTER TABLE PATIPOSACOESCRMPERMITIDAS DROP CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK7;
ALTER TABLE MOCRMS DROP CONSTRAINT MOCRMS_FK1;

DROP TABLE PALISTASCRM;

-- PALISTASCRM
CREATE TABLE PALISTASCRM
  (
    listaCRM                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao                VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                NUMERIC (11,0) DEFAULT 0 NOT NULL,
    vendedorFiltrar          CHAR (1) DEFAULT ' ' NOT NULL,
    vendasFiltrar            CHAR (1) DEFAULT ' ' NOT NULL,
    vendasDiasInicial        NUMERIC (6,0) DEFAULT 0 NOT NULL,
    vendasDiasFinal          NUMERIC (6,0) DEFAULT 0 NOT NULL,
    cadastroFiltrar          CHAR (1) DEFAULT ' ' NOT NULL,
    cadastroDiasInicial      NUMERIC (6,0) DEFAULT 0 NOT NULL,
    cadastroDiasFinal        NUMERIC (6,0) DEFAULT 0 NOT NULL,
    diasUltimaListaEncerrada NUMERIC (6,0) DEFAULT 0 NOT NULL,
    filtrarEstabelecimentos  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    produtoSelecionados      CLOB,
    produtoJoin              CLOB,
    produtoAndWhere          CLOB,
    funilCRM                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoPessoa               CHAR (2) DEFAULT '  ' NOT NULL,
    enviarSms                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    enviarWhatsApp           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    textoSmsWhatsApp         VARCHAR (4000) DEFAULT ' ' NOT NULL,
    exibirDataNascimento     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirDiasSemComprar     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalCompras       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalOrcamentos    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirDiasAtraso         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalAbertos       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalAVencer       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalVencidos      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoBloqueada NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorBloqueado     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoLiberada  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorLiberado      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoResgatada NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorResgatado     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PALISTASCRM ADD CONSTRAINT PALISTASCRM_PK1 PRIMARY KEY (listaCRM);
CREATE INDEX PALISTASCRM_K2 ON PALISTASCRM (descricao);
CREATE INDEX PALISTASCRM_K3 ON PALISTASCRM (ordenacao, descricao, listaCRM);
ALTER TABLE PALISTASCRM ADD CONSTRAINT PALISTASCRM_FK1 FOREIGN KEY (funilCRM) REFERENCES PAFUNISCRM (funilCRM);
ALTER TABLE PALISTASCRM ADD CONSTRAINT PALISTASCRM_FK2 FOREIGN KEY (tipoPessoa) REFERENCES SITIPOSPESSOA (tipoPessoa);

INSERT INTO PALISTASCRM (listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, funilCRM, tipoPessoa, enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, exibirTotalOrcamentos, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes) VALUES (             0, 'SELECIONE', 1,           0, ' ', ' ', 0, 0, ' ', 0, 0, 0, 0, NULL, NULL, NULL, 0, '  ', 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO PALISTASCRM (listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, funilCRM, tipoPessoa, enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, exibirTotalOrcamentos, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes) SELECT listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, funilCRM, 'CL', enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, exibirTotalOrcamentos, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes FROM PALISTASCRM_2501 WHERE listaCRM > 0;

COMMIT;

ALTER TABLE PALISTACRMXESTABELEC ADD CONSTRAINT PALISTACRMXESTABELEC_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXPERFISUSUARIOS ADD CONSTRAINT PALISTACRMXPERFISUSUARIOS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXUSUARIOS ADD CONSTRAINT PALISTACRMXUSUARIOS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXREGRAS ADD CONSTRAINT PALISTACRMXREGRAS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK7 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);

UPDATE SICFOPS SET cfopDevolucaoRetorno = 5902 WHERE cfop = 1201;
UPDATE SICFOPS SET cfopDevolucaoRetorno = 5902 WHERE cfop = 1202;
UPDATE SICFOPS SET cfopDevolucaoRetorno = 6902 WHERE cfop = 2201;
UPDATE SICFOPS SET cfopDevolucaoRetorno = 6902 WHERE cfop = 2202;

COMMIT;

UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'COALESCE ((SELECT MAX (munEndPess.uf) FROM CAENDERECOSPESSOA endPess JOIN SIMUNICIPIOS munEndPess ON munEndPess.municipio = endPess.municipio WHERE endPess.pessoa = pessoa.pessoa AND endPess.ativo = 1 AND endPess.principal = 1),''  '')' WHERE campoComposicaoCredito = 204;

COMMIT;


INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2025001003, '2025.1.3', TO_DATE ('28/05/2025', 'DD/MM/YYYY'), 1, 1, sysdate, 'BETA 1');

COMMIT;

-- FIM BETA 1 - 28/05/2025

create or replace PROCEDURE ADD_AVALMARG_EXCLUI (
  p_idAvaliaMargemProduto IN NUMBER)
IS
BEGIN
  DELETE MOAVALIAMARGEMPRODXDOCFISC
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
  DELETE MOAVALIAMARGEMPRODXPREDOC
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
  DELETE MOAVALIAMARGEMPRODXORCAM
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
  DELETE MOAVALIAMARGEMPRODXINCID
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
  DELETE MOAVALIAMARGENSPRODUTOS
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
END ADD_AVALMARG_EXCLUI;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_cancelando_Excluindo_Outros  IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  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_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := ' ';
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      a.orcamento,
      a.gradeProduto,
      a.cancelado,
      a.usarPrecoAVista,
      a.geraFinanceiro,
      a.controleQuantidade,
      a.loteMultiplo,
      a.quantidade,
      a.quantidadeConvertida,
      a.controleEntrega,
      a.pesoLiquido,
      a.pesoBruto,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorLiquidoItem,
      prod.tipoProduto,
      contrEntr.habilitaFrete,
      modDoc.somaFreteSeguroPrUnit
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = a.controleEntrega
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.idItemOrcamento = p_item_idItemOrcamento)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.estabelecimento,
      cab.pessoa,
      cab.enderecoEntregaPessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.transportadora,
      cab.enderecoTransportadora,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem
    INTO
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_estabelecimento,
      v_cab_pessoa,
      v_cab_enderecoEntregaPessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_transportadora,
      v_cab_enderecoTransportadora,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem
    FROM MOORCAMENTOS cab
    WHERE cab.orcamento = a.orcamento;
    v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
    v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOORCAMENTOXPROMOCOES
      WHERE orcamento = a.orcamento;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      IF a.controleEntrega <> 0
        AND a.habilitaFrete <> 0
        AND a.cancelado = 0
        AND a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem <> 0
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0,
          r_calcularImpostos,
          a.orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          a.somaFreteSeguroPrUnit,
          p_item_idItemOrcamento,
          0, -- p_item_pesoLiquido,
          0, -- p_item_pesoBruto,
          0, -- p_item_valorProdutoServicoBrut,
          0, -- p_item_valorDescontoItem,
          0, -- p_item_valorAcrescimoItem,
          0, -- p_item_controleEntrega,
          0, -- p_item_valorFreteGeral,
          0, -- p_contrEntr_habilitaFrete,
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_cab_valorFreteGeral,
          v_auxNumber);
      ELSE
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          a.somaFreteSeguroPrUnit);
      END IF;
      UPDATE MOORCAMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        transportadora                = v_cab_transportadora,
        enderecoTransportadora        = v_cab_enderecoTransportadora,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem
      WHERE orcamento = a.orcamento;
    END IF;
    FOR b IN (
      SELECT
        id,
        idItemOrcamentoReferenc,
        quantidade
      FROM MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      IF v_cab_tipoDocumento = 103 THEN
        UPDATE MOORCAMENTOXITENS c
        SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
        WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc;
      ELSIF v_cab_tipoDocumento = 201
        AND p_person_138_etapOrcEmProcesso <> 0
        AND p_person_139_etapOrcLiberado <> 0
        AND p_person_138_etapOrcEmProcesso <> p_person_139_etapOrcLiberado
      THEN
        FOR c IN (
          SELECT c.orcamento
          FROM MOORCAMENTOXITENS c
          JOIN MOORCAMENTOS d
          ON d.orcamento = c.orcamento
          WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc
          AND c.cancelado = 0
          AND d.tipoDocumento = 101
          AND d.etapaOrcamento = p_person_138_etapOrcEmProcesso
          GROUP BY c.orcamento)
        LOOP
          UPDATE MOORCAMENTOS d
          SET d.etapaOrcamento = p_person_139_etapOrcLiberado
          WHERE d.orcamento = c.orcamento;
          ADD_ORCAMENTO_CAB_ETAPA_CRIA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.orcamento,
            p_sys_usuarioLogado,
            p_person_139_etapOrcLiberado,
            ' ');
          ADD_RESERVA_ESTOQUE_ORC_CAB (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.orcamento);
        END LOOP;
      END IF;
      DELETE MOORCAMENTOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- Cancela / Exclui Transferências vinculadas.
    IF p_cancelando_Excluindo_Outros <> 'O' THEN
      FOR b IN (
        SELECT
          itemTransf.documentoTransferencia,
          docXTransf.entradaSaidaOriginal
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND (docXTransf2.entradaSaidaOriginal <> docXTransf.entradaSaidaOriginal
            OR docXTransf2.idItemOrcamento <> docXTransf.idItemOrcamento))
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOS docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia)
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXPREDOCUM docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND docXTransf2.entradaSaidaOriginal <> 'O')
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXDOCFISCAL docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND docXTransf2.entradaSaidaOriginal <> 'O')
        GROUP BY
          itemTransf.documentoTransferencia,
          docXTransf.entradaSaidaOriginal)
      LOOP
        IF b.entradaSaidaOriginal = 'O' THEN
          ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
        ELSIF p_cancelando_Excluindo_Outros = 'C' THEN
          ADD_DOCTRANSF_CAB_SIT_GRAVA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            b.documentoTransferencia,
            'C',
            0,
            'Cancelamento Automático',
            'ADD_ORCAMENTO_ITEM_EXCLUI');
        END IF;
      END LOOP;
      FOR b IN (
        SELECT
          docXTransf.idItemDocTransferencia,
          cabTransf.situacaoDocTransferencia
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
        ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND docXTransf.entradaSaidaOriginal = 'O')
      LOOP
        ADD_DOCTRANSF_ITEM_EXCLUI (
          b.idItemDocTransferencia,
          'C', -- p_cancela_Exclui_Reabre
          b.situacaoDocTransferencia,
          0, -- p_cab_quantidadeConvertida,
          0, -- p_cab_valorProdutoServico,
          /* Retornos */
          v_auxNumber, -- r_cab_quantidadeConvertida
          v_auxNumber); -- r_cab_valorProdutoServico
      END LOOP;
    END IF;
    -- Desvincula Painel de Compras
    FOR b IN (
      SELECT
        b.idGradePainelCompra,
        b.idItemPainelCompra,
        c.painelCompra
      FROM MOPAINELCOMPRAXGRADE b
      JOIN MOPAINELCOMPRAXITENS c
      ON c.idItemPainelCompra = b.idItemPainelCompra
      WHERE b.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOPAINELCOMPRAXGRADE c
      SET c.idItemOrcamento = 0
      WHERE c.idGradePainelCompra = b.idGradePainelCompra;
      UPDATE MOPAINELCOMPRAXITENS c
      SET c.situacaoPainelCompras = 'E'
      WHERE c.idItemPainelCompra = b.idItemPainelCompra
      AND c.situacaoPainelCompras <> 'E';
      UPDATE MOPAINEISCOMPRA c
      SET c.situacaoPainelCompras = 'E'
      WHERE c.painelCompra = b.painelCompra
      AND c.situacaoPainelCompras <> 'E';
    END LOOP;
    ADD_MOTIVO_ORCAMENTO_ITE_EXCL (
      p_item_idItemOrcamento,
      0,
      v_auxNumber);
    ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
      p_item_idItemOrcamento,
      '',
      v_auxVarchar);
    ADD_ORCAMENTO_ITEM_LISTA_EXCL (p_item_idItemOrcamento);
    DELETE MOORCAMENTOXPROMOCOES
    WHERE idItemOrcamento = p_item_idItemOrcamento;
    DELETE MOINGRESSOS
    WHERE idItemOrcamento = p_item_idItemOrcamento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXORCAMENTO docXDoc
      WHERE docXDoc.idItemOrcamento = p_item_idItemOrcamento
      AND docXDoc.idItemOrcamentoReferenc = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemOrcamento = p_item_idItemOrcamento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    IF p_cancelando_Excluindo_Outros = 'C' THEN
      ADD_ORCAMENTO_ITEM_PREV_CANC (p_item_idItemOrcamento);
      FOR a IN (
        SELECT
          entrega,
          quantidade
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_item_idItemOrcamento
        AND situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_SITUACAO_TROCA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_item_idItemOrcamento,
          a.entrega,
          a.quantidade,
          8,
          'ADD_ORCAMENTO_ITEM_EXCLUI - CANCELA');
      END LOOP;
      UPDATE MOORCAMENTOXITENS
      SET cancelado = 1
      WHERE idItemOrcamento = p_item_idItemOrcamento;
    ELSE
      DELETE MOAVALIAMARGEMPRODXORCAM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXCOMPOSICOESPR
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXNUMEROSSERIE
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXEMBALAGENSTIN
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXCENTROSCUSTOS
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXATIVIDADEPROJ
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamentoReferenc = p_item_idItemOrcamento;     
      DELETE MOPREDOCUMXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MODOCFISCALXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      FOR b IN (
        SELECT idAtividadePrevOrcamento
        FROM MOORCAMENTOXATIVIDADEPREV
        WHERE idItemOrcamento = p_item_idItemOrcamento)
      LOOP
        ADD_ORCAMENTO_ITEM_PREV_EXCLUI (
          b.idAtividadePrevOrcamento,
          '',
          '',
          v_auxVarchar,
          v_auxVarchar);
      END LOOP;
      DELETE MODISTRIBUICAODFEXORCAM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MODOCTRANSFXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOENTREGAXSITUACOES
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      FOR b IN (
        SELECT entrega
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_item_idItemOrcamento)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          b.entrega,
          CASE WHEN p_cancelando_Excluindo_Outros = 'C' THEN 0 ELSE 1 END,
          'ADD_ORCAMENTO_ITEM_EXCLUI');
      END LOOP;
      DELETE MOORCAMENTOXITENS
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemOrcamento
          FROM MOORCAMENTOXITENS b
          WHERE b.orcamento = a.orcamento
          AND b.idItemOrcamento <> p_item_idItemOrcamento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOORCAMENTOXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemOrcamento = b.idItemOrcamento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc 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_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  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_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      END IF;    
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento))
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXDOCFISCAL docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          b.documentoTransferencia,
          'C',
          0,
          'Cancelamento Automático',
          'ADD_PRE_DOC_ITEM_EXCLUI');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    FOR b IN (
      SELECT idProdutoXCusto
      FROM CAPRODUTOXCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      ADD_PRODUTO_CUSTO_EXCLUI (b.idProdutoXCusto);
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idAtendimento
      FROM MOPREDOCUMXATENDIMENTO
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      UPDATE MOATENDIMENTOS c SET
        c.situacaoAtendimento = 'P',
        c.dataAtendimento = NULL,
        c.cliente = 0,
        c.comissionadoB = 0,
        c.comissionadoC = 0
      WHERE c.idAtendimento = b.idAtendimento;
      DELETE MOPREDOCUMXATENDIMENTO c WHERE c.id = b.id;
    END LOOP;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXPREDOCUM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXDOCFISCAL docXDoc
      WHERE docXDoc.idItemPreDocumento > 0
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento > 0
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_354_estabProximoId,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOAVALIAMARGEMPRODXPREDOC
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc 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_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  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_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      END IF;    
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXDOCFISCAL docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal))
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          b.documentoTransferencia,
          'C',
          0,
          'Cancelamento Automático',
          'ADD_DOC_FISC_ITEM_EXCLUI');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    FOR b IN (
      SELECT idProdutoXCusto
      FROM CAPRODUTOXCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      ADD_PRODUTO_CUSTO_EXCLUI (b.idProdutoXCusto);
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idAtendimento
      FROM MODOCFISCALXATENDIMENTO
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      UPDATE MOATENDIMENTOS c SET
        c.situacaoAtendimento = 'P',
        c.dataAtendimento = NULL,
        c.cliente = 0,
        c.comissionadoB = 0,
        c.comissionadoC = 0
      WHERE c.idAtendimento = b.idAtendimento;
      DELETE MODOCFISCALXATENDIMENTO c
      WHERE c.id = b.id;
    END LOOP;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXPREDOCUM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXDOCFISCAL docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_354_estabProximoId,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MOAVALIAMARGEMPRODXDOCFISC
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalEntrada = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_ORCAMENTO_PAG_EXCLUI_CORR (
  p_idPagamentoOrcamento IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_ORCAMENTO_PAG_EXCL (
    p_idPagamentoOrcamento,
    0,
    v_auxNumber);
  FOR a IN (
    SELECT idPrevisaoFinanceira
    FROM MOPREVISOESFINANCEIRAS
    WHERE idPagamentoOrcamento = p_idPagamentoOrcamento)
  LOOP
    ADD_PREVFIN_EXCLUI (a.idPrevisaoFinanceira);
  END LOOP;
  DELETE MOORCAMENTOXPROMOCOES
  WHERE idPagamentoOrcamento = p_idPagamentoOrcamento;  
  DELETE MOLINKPAGAMENTOXORCAMENTO
  WHERE idPagamentoOrcamento = p_idPagamentoOrcamento;  
END ADD_ORCAMENTO_PAG_EXCLUI_CORR;

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_EXCLUI_CORREL (
  p_idPagamentoPreDocumento IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_PRE_DOC_PAG_EXCLUI (
    p_idPagamentoPreDocumento,
    0,
    v_auxNumber);
  FOR a IN (
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento)
  LOOP
    ADD_FINANC_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MOPREDOCUMXPROMOCOES
  WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  DELETE MOLINKPAGAMENTOXPREDOCUM
  WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  UPDATE MOTRANSACOESTEF
  SET idPagamentoPreDocumento = 0
  WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
END ADD_PRE_DOC_PAG_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_EXCLUI_CORREL (
  p_idPagamentoDocFiscal IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_DOC_FISC_PAG_EXCLUI (
    p_idPagamentoDocFiscal,
    0,
    v_auxNumber);
  FOR a IN (
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal)
  LOOP
    ADD_FINANC_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MODOCFISCALXPROMOCOES
  WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  DELETE MOLINKPAGAMENTOXDOCFISCAL
  WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  UPDATE MOTRANSACOESTEF
  SET idPagamentoDocFiscal = 0
  WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
END ADD_DOC_FISC_PAG_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_FINANC_EXCLUI_CORREL (
  p_idFinanceiro IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_FINANCEIRO_EXCLUI (
    p_idFinanceiro,
    0,
    v_auxNumber);
  -- 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.idFinanceiro = p_idFinanceiro);
  UPDATE MOARQUIVOCOBRANCAXFINANC SET
    idFinanceiro = 0,
    idBaixaFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOCONCILIACOESCARTOES SET
    idFinanceiro = 0,
    idBaixaFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOSPCREGISTROS
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOPREVFINANCXFINANCEIRO
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOTRANSACOESTEF
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOORCAMENTOXPAGAMENTOS
  SET idFinanceiroAdiantamento = 0
  WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  UPDATE MODOCUMENTOSTROCA
  SET idFinanceiroAdiantamento = 0
  WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  UPDATE MOLINKSPAGAMENTO
  SET idFinanceiroAdiantamento = 0
  WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  -- Exclui correlatos
  DELETE MOPREDOCUMXRESGATEPONTOS a
  WHERE EXISTS(
    SELECT 1
    FROM MOPONTUACOES b
    WHERE b.idPontuacao = a.idPontuacao
    AND b.idFinanceiro = p_idFinanceiro);
  DELETE MODOCFISCALXRESGATEPONTOS a
  WHERE EXISTS(
    SELECT 1
    FROM MOPONTUACOES b
    WHERE b.idPontuacao = a.idPontuacao
    AND b.idFinanceiro = p_idFinanceiro);
  DELETE MOPONTUACOES
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXBOLETO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCARTAO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCARTPROPRIO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCHEQUE
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXPIX
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXRATEIO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCOMISSOES
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXDOCUMENTOS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXARQUIVOS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXATIVIDADEPROJ
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MONEGDIVIDAXFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOREPARCXFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOHISTORICOCOBRANCA
  WHERE idFinanceiro = p_idFinanceiro;
  FOR a IN (
    SELECT evento
    FROM MOEVENTOS
    WHERE tabelaSistema = 'MOFINANCEIROS'
    AND id = p_idFinanceiro)
  LOOP
    ADD_EVENTO_EXCLUI (a.evento);
  END LOOP;
  -- Exclui correlatos com outra perna correlata que já deve ter sido excluída anteriormente
  DELETE MOFINANCEIROXCORRELATO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCORRELATO
  WHERE idFinanceiroCorrelato = p_idFinanceiro;
  DELETE MOFINANCEIROXBAIXAS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOBAIXAXNOVOFINANCEIRO
  WHERE idNovoFinanceiro = p_idFinanceiro;
  -- Exclui financeiro principal
  DELETE MOFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
END ADD_FINANC_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_AVALMARG_ORC (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idItemOrcamentoDe         IN NUMBER,
  p_idItemDocFiscalPara       IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT idAvaliaMargemProduto
    FROM MOAVALIAMARGEMPRODXORCAM
    WHERE idItemOrcamento = p_idItemOrcamentoDe)
  LOOP
    ADD_AVALMARG_DOC_FISC_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      a.idAvaliaMargemProduto,
      p_idItemDocFiscalPara,
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_AVALMARG_ORC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_ORCAMEN (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_ORCAM (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeBaixar > 0 THEN p_quantidadeBaixar ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_ORCAM (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_AVALMARG_ORC (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idItemOrcamento,
    p_item_idItemDocFiscal);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCFISCALXORCAMENTOITEM
  WHERE idItemDocFiscal = p_item_idItemDocFiscal
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MODOCFISCALXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXORCAMENTOITEM', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCFISCALXORCAMENTOITEM (
      id,
      idItemDocFiscal,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemDocFiscal,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_DOC_FISC_ITEM_BLOEST_ORC (
      p_sys_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      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_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_ORCAMEN (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_sys_usuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento);
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento,
      '',
      '',
      v_auxAlpha,
      v_auxAlpha);
  END IF;
END ADD_DOC_FISC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_AVALMARG_ORC (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idItemOrcamentoDe         IN NUMBER,
  p_idItemPreDocumentoPara    IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT idAvaliaMargemProduto
    FROM MOAVALIAMARGEMPRODXORCAM
    WHERE idItemOrcamento = p_idItemOrcamentoDe)
  LOOP
    ADD_AVALMARG_PRE_DOC_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      a.idAvaliaMargemProduto,
      p_idItemPreDocumentoPara,
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_AVALMARG_ORC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_ORCAMEN (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeBaixar > 0 THEN p_quantidadeBaixar ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_AVALMARG_ORC (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idItemOrcamento,
    p_item_idItemPreDocumento);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOPREDOCUMXORCAMENTOITEM
  WHERE idItemPreDocumento = p_item_idItemPreDocumento
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MOPREDOCUMXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXORCAMENTOITEM', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
    INSERT INTO MOPREDOCUMXORCAMENTOITEM (
      id,
      idItemPreDocumento,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemPreDocumento,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_PRE_DOC_ITEM_BLOEST_ORC (
      p_sys_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      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_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_ORCAMEN (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_sys_usuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento);
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento,
      '',
      '',
      v_auxAlpha,
      v_auxAlpha);
  END IF;
END ADD_PRE_DOC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ROT_EFET_ORCAMENTO (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_sessao                       IN NUMBER,
  p_idTerminalSiTef              IN VARCHAR2,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  p_serieFiscal                  IN VARCHAR2,
  p_subSerieFiscal               IN NUMBER,
  p_documentoFiscal              IN NUMBER,
  p_dataEmissao                  IN DATE,
  p_timezone                     IN VARCHAR2,
  p_dataEntradaSaida             IN DATE,
  p_comissionadoB                IN NUMBER,
  p_comissionadoC                IN NUMBER,
  p_novaEtapaOrcamento           IN NUMBER,
  p_versaoAplicativo             IN VARCHAR2,
  r_preDocumento                 OUT NUMBER)
IS
  v_tipoDocumento          NUMBER;
  v_fatoContabil           NUMBER;
  v_preDocumento           NUMBER;
  v_estabelecimento        NUMBER;
  v_pessoa                 NUMBER;
  v_colaboradorResponsavel NUMBER;
  CURSOR c_itens
  IS SELECT idItemOrcamento, CASE WHEN cancelado = 0 THEN FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXITENS', 'idItemPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL) ELSE 0 END idItemPreDocumento, sequencia, cancelado, pedidoCompraFornecedor, sequenciaPedidoCompraFornec, modeloDocumento, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, observacoesDigitadas, observacoes, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, operacaoFiscal, movimentaEstoque, geraFinanceiro, cfop, indicadorISSQN, aliquotaISSQN, retidoISSQN, tributadoForaMunicipio, incentivoFiscal, listaServicos, cnae, idServicoMunicipio, numeroProcessoAdministrativo, retencaoIRRF, retencaoINSS, retencaoPIS, retencaoCOFINS, retencaoCSLL, retencaoOutros, aliquotaII, aliquotaIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, stPIS, aliquotaPIS, valorAliquotaPIS, aliquotaPISST, valorAliquotaPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, stSimplesNacional, creditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, idBeneficio, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, aliquotaFCP, aliquotaFCPST, aliquotaFCPSTAnteriormente, aliquotaFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseISSQN, valorISSQN, baseRetIRRF, valorRetIRRF, baseRetINSS, valorRetINSS, baseRetPIS, valorRetPIS, baseRetCOFINS, valorRetCOFINS, baseRetCSLL, valorRetCSLL, baseRetOutros, valorRetOutros, baseII, valorII, baseIOF, valorIOF, baseIPI, valorIPI, basePIS, valorPIS, basePISST, valorPISST, baseCOFINS, valorCOFINS, baseCOFINSST, valorCOFINSST, baseCreditoSimplesNacional, valorCreditoSimplesNacional, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, baseICMSEfetivo, valorICMSEfetivo, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, baseFCP, valorFCP, baseFCPST, valorFCPST, baseFCPSTAnteriormente, valorFCPSTAnteriormente, baseFCPUFDestinatario, valorFCPUFDestinatario, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorBasePagamento, valorLiquidoItem
     FROM MOORCAMENTOXITENS
     WHERE orcamento = p_orcamento
     ORDER BY sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOS
    WHERE orcamento = p_orcamento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemOrcamento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOITENS a
    JOIN MOORCAMENTOXITENS b ON b.idItemOrcamento = a.idItemOrcamento
    WHERE b.orcamento = p_orcamento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'O'
      AND a.idCabecalho = p_orcamento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT (EXISTS(
        SELECT 1
        FROM MOMOTBLOQXORCAMENTOPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento));
BEGIN
  SELECT
    CASE
      WHEN orc.entradaSaida='E'
      THEN 401
      ELSE 301
    END,
    orc.estabelecimento,
    orc.pessoa,
    CASE
      WHEN orc.tipoDocumento = 102
        AND orc.colaboradorResponsavel <> 0
        AND EXISTS (
          SELECT 1
          FROM CAVENDEDORES vend
          WHERE vend.vendedor = orc.colaboradorResponsavel
          AND vend.ativo = 1)
      THEN orc.colaboradorResponsavel
      ELSE 0
    END
  INTO
    v_tipoDocumento,
    v_estabelecimento,
    v_pessoa,
    v_colaboradorResponsavel
  FROM MOORCAMENTOS orc
  WHERE orcamento = p_orcamento;
  v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MOFATOSCONTABEIS (fatoContabil, estabelecimento, data, ordenacao, situacaoTransacao, situacaoContabilizacao, sessao, observacoes) VALUES (v_fatoContabil, v_estabelecimento, p_dataEmissao, 0, 'A', 'N', p_sessao, ' ');
  v_preDocumento := FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMENTOS', 'preDocumento', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MOPREDOCUMENTOS (preDocumento, origemDocumento, tipoDocumento, tipoVenda, modeloDocumento, entradaSaida, devolucaoAnulacaoRetorno, finalidadeNota, atualizaCustoMedio, atualizaUltimaCompra, validoFaturamento, usarPrecoAVista, sessao, sessaoCaixa, fatoContabil, idTerminalSiTef, estabelecimentoOriginal, estabelecimento, enderecoRetiradaEstabeleciment, indicadorPresencaComprador, controlaSeparacaoConferencia, serieFiscal, subserieFiscal, documentoFiscal, dataEmissao, timezoneEmissao, dataEntradaSaida, pessoa, indicadorPessoa, indicadorDocumentoPessoa, cnpjCpfIdEstrangeiro, nomeRazaoSocial, fone, indicadorFone, operadoraTelefonia, autorizadoPessoa, enderecoEntregaPessoa, municipioFatoGerador, localDestinoOperacao, indicadorConsumidorFinal, projeto, contratoCompra, comissionadoB, comissionadoC, modalidadeFrete, tipoPagamentoFrete, transportadora, enderecoTransportadora, motorista, placa, vagao, balsa, quantidadeVolume, especieVolume, descricaoMarca, numeracaoVolume, codigoIntegracao, atendimento, statusPreDocumento, ultimoVendedorItem, quantidade, pesoLiquido, pesoBruto, valorProdutosBruto, valorProdutos, valorDescontoProdutos, valorAcrescimoProdutos, valorServicosBruto, valorServicos, valorDescontoServicos, valorAcrescimoServicos, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, condicaoPagamento, contaFinanceira, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorBasePagamento, valorAVistaMinimo, valorEntradaMinima, valorAVistaEntrada, valorPagamentoBruto, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorPagamentoLiquido, valorTroco, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, impostosEditados, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, valorCustoOperacao, valorCMV, versaoAplicativo)
  SELECT v_preDocumento,
    2,
    v_tipoDocumento,
    orc.tipoVenda,
    orc.modeloDocumento,
    orc.entradaSaida,
    0 devolucaoAnulacaoRetorno,
    orc.finalidadeNota,
    orc.atualizaCustoMedio,
    orc.atualizaUltimaCompra,
    orc.validoFaturamento,
    orc.usarPrecoAVista,
    p_sessao,
    p_sessaoCaixa,
    v_fatoContabil,
    p_idTerminalSiTef,
    orc.estabelecimento,
    orc.estabelecimento,
    orc.enderecoRetiradaEstabeleciment,
    orc.indicadorPresencaComprador,
    orc.controlaSeparacaoConferencia,
    p_serieFiscal,
    p_subserieFiscal,
    p_documentoFiscal,
    p_dataEmissao dataEmissao,
    p_timezone timezoneEmissao,
    p_dataEntradaSaida dataEntradaSaida,
    orc.pessoa,
    'F' indicadorPessoa,
    'C' indicadorDocumentoPessoa,
    ' ' cnpjCpfIdEstrangeiro,
    ' ' nomeRazaoSocial,
    ' ' fone,
    0 indicadorFone,
    0 operadoraTelefonia,
    orc.autorizadoPessoa,
    orc.enderecoEntregaPessoa,
    orc.municipioFatoGerador,
    orc.localDestinoOperacao,
    orc.indicadorConsumidorFinal,
    orc.projeto,
    orc.contratoCompra,
    p_comissionadoB comissionadoB,
    p_comissionadoC comissionadoC,
    CASE WHEN orc.modalidadeFrete = ' ' THEN '9' ELSE orc.modalidadeFrete END,
    CASE WHEN orc.tipoPagamentoFrete = ' ' THEN 'N' ELSE orc.tipoPagamentoFrete END,
    orc.transportadora,
    orc.enderecoTransportadora,
    orc.motorista,
    orc.placa,
    orc.vagao,
    orc.balsa,
    orc.quantidadeVolume,
    orc.especieVolume,
    orc.descricaoMarca,
    orc.numeracaoVolume,
    orc.codigoIntegracao,
    orc.atendimento,
    'E' statusPreDocumento,
    CASE WHEN orc.ultimoVendedorItem = 0 THEN v_colaboradorResponsavel ELSE orc.ultimoVendedorItem END,
    orc.quantidade,
    orc.pesoLiquido,
    orc.pesoBruto,
    orc.valorProdutosBruto,
    orc.valorProdutos,
    orc.valorDescontoProdutos,
    orc.valorAcrescimoProdutos,
    orc.valorServicosBruto,
    orc.valorServicos,
    orc.valorDescontoServicos,
    orc.valorAcrescimoServicos,
    orc.valorFreteItem,
    orc.valorSeguroItem,
    orc.valorAdicFreteMarinhaMerItem,
    orc.valorDespesasAduaneirasItem,
    orc.valorFreteGeral,
    orc.valorSeguroGeral,
    orc.valorDescontoGeral,
    orc.valorOutrasDespesasGeral,
    orc.valorAdicFreteMarinhaMerGeral,
    orc.valorDespesasAduaneirasGeral,
    orc.condicaoPagamento,
    orc.contaFinanceira,
    0 numeroParcelas,
    0 somaPrazoParcelas,
    0 valorXPrazoParcelas,
    0 prazoMedio,
    0 prazoMedioPonderado,
    orc.valorBasePagamento,
    orc.valorAVistaMinimo,
    0 valorEntradaMinima,
    0 valorAVistaEntrada,
    0 valorPagamentoBruto,
    0 valorDescontoPagamento,
    0 valorOutrasDespesasPagamento,
    0 valorJurosPagamento,
    0 valorPagamentoLiquido,
    0 valorTroco,
    orc.valorFreteTotal,
    orc.valorSeguroTotal,
    orc.valorDescontoTotal - CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END,
    orc.valorOutrasDespesasTotal - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    orc.valorAdicFreteMarinhaMerTotal,
    orc.valorDespesasAduaneirasTotal,
    orc.impostosEditados,
    orc.valorImpostosSomaPagamento,
    orc.valorImpostosDiminuiPagamento,
    orc.valorLiquidoItem + CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    p_versaoAplicativo
  FROM MOORCAMENTOS orc
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = orc.estabelecimento
  WHERE orcamento = p_orcamento;
  UPDATE MOORCAMENTOS SET etapaOrcamento = p_novaEtapaOrcamento WHERE orcamento = p_orcamento;
  INSERT INTO MOORCAMENTOXETAPAS (id, orcamento, data, usuario, etapaOrcamento, observacoes) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOORCAMENTOXETAPAS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), p_orcamento, sysdate, p_sys_usuarioLogado, p_novaEtapaOrcamento, ' ');
  INSERT INTO MOPREDOCUMXPERSPROJETO (idPersonProjetoPreDocumento, preDocumento, personalizacaoProjeto, conteudo) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPERSPROJETO', 'idPersonProjetoPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.personalizacaoProjeto, x.conteudo FROM MOORCAMENTOXPERSPROJETO x WHERE x.orcamento = p_orcamento;
  INSERT INTO MOPREDOCUMXINFOCOMPLENT (id, preDocumento, sequencia, geradoPeloSistema, imprimir, destaque, informacaoComplementar, descInformacaoComplementar) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXINFOCOMPLENT', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.sequencia, x.geradoPeloSistema, x.imprimir, x.destaque, x.informacaoComplementar, x.descInformacaoComplementar FROM MOORCAMENTOXINFOCOMPLENT x WHERE x.orcamento = p_orcamento;
  INSERT INTO MOPREDOCUMXPROMOCOES (id, preDocumento, cabecalhoItemPagamento, sequencia, idItemPreDocumento, idPagamentoPreDocumento, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.cabecalhoItemPagamento, x.sequencia, 0, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes FROM MOORCAMENTOXPROMOCOES x WHERE x.orcamento = p_orcamento AND x.idItemOrcamento = 0 AND x.idPagamentoOrcamento = 0;
  FOR itens IN c_itens
  LOOP
    IF itens.cancelado = 0
    THEN
      INSERT INTO MOPREDOCUMXITENS (idItemPreDocumento, preDocumento, sequencia, cancelado, pedidoCompraFornecedor, sequenciaPedidoCompraFornec, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorDescontoCustoOpItem, valorAcrescimoCustoOpItem, observacoesDigitadas, observacoes, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorAcrescimoExtempGeral, valorDescontoCustoOpGeral, valorAcrescimoCustoOpGeral, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, valorAcrescimoExtempTotal, valorDescontoCustoOpTotal, valorAcrescimoCustoOpTotal, percentualDevolucao, valorIPIDevolucao, operacaoFiscal, movimentaEstoque, geraFinanceiro, cfop, indicadorISSQN, aliquotaISSQN, retidoISSQN, tributadoForaMunicipio, incentivoFiscal, listaServicos, cnae, idServicoMunicipio, numeroProcessoAdministrativo, retencaoIRRF, retencaoINSS, retencaoPIS, retencaoCOFINS, retencaoCSLL, retencaoOutros, aliquotaII, aliquotaIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, stPIS, aliquotaPIS, valorAliquotaPIS, aliquotaPISST, valorAliquotaPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, stSimplesNacional, creditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, idBeneficio, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, aliquotaFCP, aliquotaFCPST, aliquotaFCPSTAnteriormente, aliquotaFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseISSQN, valorISSQN, baseRetIRRF, valorRetIRRF, baseRetINSS, valorRetINSS, baseRetPIS, valorRetPIS, baseRetCOFINS, valorRetCOFINS, baseRetCSLL, valorRetCSLL, baseRetOutros, valorRetOutros, baseII, valorII, baseIOF, valorIOF, baseIPI, valorIPI, basePIS, valorPIS, basePISST, valorPISST, baseCOFINS, valorCOFINS, baseCOFINSST, valorCOFINSST, baseCreditoSimplesNacional, valorCreditoSimplesNacional, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, baseICMSEfetivo, valorICMSEfetivo, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, baseFCP, valorFCP, baseFCPST, valorFCPST, baseFCPSTAnteriormente, valorFCPSTAnteriormente, baseFCPUFDestinatario, valorFCPUFDestinatario, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorBasePagamento, valorLiquidoItem, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV) VALUES (itens.idItemPreDocumento, v_preDocumento, itens.sequencia, itens.cancelado, itens.pedidoCompraFornecedor, itens.sequenciaPedidoCompraFornec, itens.modeloDocumento, v_estabelecimento, CASE WHEN itens.vendedor = 0 THEN v_colaboradorResponsavel ELSE itens.vendedor END, itens.gradeProduto, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.localEstoque, itens.pessoaParticipante, itens.controleQuantidade, itens.unidadeMedidaConversao, itens.conversorQuantidade, itens.loteMinimo, itens.loteMultiplo, itens.altura, itens.largura, itens.comprimento, itens.pecas, itens.quantidade, itens.quantidadeConvertida, 0, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoUnitarioBruto, itens.acrescimoUnitarioComposicao, itens.precoUnitario, itens.precoUnitarioConvertido, itens.valorProdutoServicoBruto, itens.valorProdutoServico, itens.percDescontoItem, itens.valorDescontoItem, itens.percAcrescimoItem, itens.valorAcrescimoItem, itens.valorFreteItem, itens.valorSeguroItem, itens.valorAdicFreteMarinhaMerItem, itens.valorDespesasAduaneirasItem, 0, 0, 0, 0, 0, 0, itens.observacoesDigitadas, itens.observacoes, itens.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, 0, 0, 0, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, 0, 0, 0, 0, 0, itens.operacaoFiscal, itens.movimentaEstoque, itens.geraFinanceiro, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.retidoISSQN, itens.tributadoForaMunicipio, itens.incentivoFiscal, itens.listaServicos, itens.cnae, itens.idServicoMunicipio, itens.numeroProcessoAdministrativo, itens.retencaoIRRF, itens.retencaoINSS, itens.retencaoPIS, itens.retencaoCOFINS, itens.retencaoCSLL, itens.retencaoOutros, itens.aliquotaII, itens.aliquotaIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.idBeneficio, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.aliquotaFCP, itens.aliquotaFCPST, itens.aliquotaFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseISSQN, itens.valorISSQN, itens.baseRetIRRF, itens.valorRetIRRF, itens.baseRetINSS, itens.valorRetINSS, itens.baseRetPIS, itens.valorRetPIS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.baseRetCSLL, itens.valorRetCSLL, itens.baseRetOutros, itens.valorRetOutros, itens.baseII, itens.valorII, itens.baseIOF, itens.valorIOF, itens.baseIPI, itens.valorIPI, itens.basePIS, itens.valorPIS, itens.basePISST, itens.valorPISST, itens.baseCOFINS, itens.valorCOFINS, itens.baseCOFINSST, itens.valorCOFINSST, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.baseFCP, itens.valorFCP, itens.baseFCPST, itens.valorFCPST, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorBasePagamento, itens.valorLiquidoItem, 0, 0, 0, 0);
      INSERT INTO MOPREDOCUMXCOMPOSICOESPR (id, idItemPreDocumento, composicaoPreco, selecionado, quantidade, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXCOMPOSICOESPR', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.composicaoPreco, x.selecionado, x.quantidade, x.observacoes FROM MOORCAMENTOXCOMPOSICOESPR x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXEMBALAGENSTIN (idEmbalagemTintaPreDocumento, idItemPreDocumento, embalagemTinta, quantidade, quantidadeSaldo, quantidadeConferida, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXEMBALAGENSTIN', 'idEmbalagemTintaPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.embalagemTinta, x.quantidade, x.quantidadeSaldo, x.quantidadeConferida, x.observacoes FROM MOORCAMENTOXEMBALAGENSTIN x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXNUMEROSSERIE (idNumeroSeriePreDocumento, idItemPreDocumento, gradeProduto, idNumeroSerie, devolvidoRetornado) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXNUMEROSSERIE', 'idNumeroSeriePreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.gradeProduto, x.idNumeroSerie, 0 FROM MOORCAMENTOXNUMEROSSERIE x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXCENTROSCUSTOS (idCentroCustoPreDocumento, idItemPreDocumento, idCentroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXCENTROSCUSTOS', 'idCentroCustoPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.idCentroCusto, x.percentualRateio FROM MOORCAMENTOXCENTROSCUSTOS x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXORCAMENTOITEM (id, idItemPreDocumento, idItemOrcamento, quantidade, efetivacao) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXORCAMENTOITEM', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, itens.idItemOrcamento, itens.quantidade, 1);
      INSERT INTO MOPREDOCUMXPROMOCOES (id, preDocumento, cabecalhoItemPagamento, sequencia, idItemPreDocumento, idPagamentoPreDocumento, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.cabecalhoItemPagamento, itens.sequencia, itens.idItemPreDocumento, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes FROM MOORCAMENTOXPROMOCOES x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOAVALIAMARGEMPRODXPREDOC (id, idAvaliaMargemProduto, idItemPreDocumento) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOAVALIAMARGEMPRODXPREDOC', 'id', 0, p_sys_estabelecimentoAtivo, NULL), x.idAvaliaMargemProduto, itens.idItemPreDocumento FROM MOAVALIAMARGEMPRODXORCAM x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      UPDATE MOCONSERTOS cons SET cons.situacaoConserto = 'R' WHERE cons.documentoTransferenciaFornec > 0 AND cons.situacaoConserto = 'E' AND EXISTS (SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec AND transfXDoc.entradaSaidaOriginal = 'E' AND transfXDoc.idItemOrcamento = itens.idItemOrcamento);
      FOR mot IN c_mot_item
      LOOP
        IF mot.idItemOrcamento = itens.idItemOrcamento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, itens.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXPREDOCUMITENS (id, idMotivoBloqueioDocumento, idItemPreDocumento) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXPREDOCUMITENS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, itens.idItemPreDocumento);
          INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END IF;
  END LOOP;
  UPDATE MOORCAMENTOXITENS SET quantidadeSaldo = 0 WHERE orcamento = p_orcamento AND cancelado = 0;
  FOR mot IN c_mot_cab
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, 0, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXPREDOCUMENTOS (id, idMotivoBloqueioDocumento, preDocumento) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXPREDOCUMENTOS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, v_preDocumento);
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  FOR mot IN c_mot_pag
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, a.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  ADD_RESERVA_ESTOQUE_ORC_CAB (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    p_orcamento);
  r_preDocumento := v_preDocumento;
END ADD_PRE_DOC_ROT_EFET_ORCAMENTO;

/

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

/

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

/

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

COMMIT;

-- FIM BETA 2 - 03/06/2025

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

/

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

/

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

/

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

/

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

/

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

COMMIT;

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

COMMIT;

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

COMMIT;

-- FIM BETA 3 - 04/06/2025

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

COMMIT;

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

/

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

/

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

/

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

/

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

/

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

/

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

/

COMMIT;

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

COMMIT;

-- FIM BETA 4 - 10/06/2025

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