    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAPRODUTOXFORNECEDORES prodXForn
    ON prodXForn.produto = a.produto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXForn.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          v_select := v_select || ') a) a';
          IF v_contadorSubSelects = 0 THEN
            v_select := 'SELECT
  0,
  '' '',
  '' '',
  0,
  '' '',
  0,
  '' '',
  0,
  0
FROM DUAL';
          END IF;
        END IF;
      END IF;
      EXECUTE IMMEDIATE v_select
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_idLoteEstoque,
        v_loteEstoque,
        v_idNumeroSerie,
        v_numeroSerie,
        v_quantidade,
        v_contaRegistros;
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_idLoteEstoque     := v_idLoteEstoque;
        r_loteEstoque       := v_loteEstoque;
        r_idNumeroSerie     := v_idNumeroSerie;
        r_numeroSerie       := v_numeroSerie;
        IF v_quantidade > 0 THEN
          r_quantidade      := v_quantidade;
        END IF;
      ELSE
        IF v_contaRegistros > 1 THEN
          r_abrirTelaOnline   := 1;
        ELSE
          r_mensagemErro      := 'Nenhum produto encontrado.';
          r_observacoesErro   := '-- Componente: TrocaGradeProduto
-- Select da pesquisa:
' || v_select;
          IF v_codigoDescricaoSemPontos <> ' ' THEN
            v_select := 'SELECT COUNT (1)
FROM (';
            v_contadorSubSelects := 0;
            -- Se digitou número
            IF LENGTH (TRIM (v_codigoDescricaoSemPontos)) <= 14 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoSemPontos) = 1 THEN
              IF p_config_31_pesqPeloIdProduto = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_32_pesqPeloEanGtin = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_34_pesqPeloIdGradePro = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.gradeProduto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_35_pesqPeloProdutoImp = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
                v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
                WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                  v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
                END LOOP;
                IF v_codigoDescricaoLoop <> ' ' THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
              IF p_config_36_pesqPeloCodFabrica = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
              IF p_config_424_pesqPeloIdLoteEst = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.idLoteEstoque = ' || RTRIM (v_codigoDescricaoSemPontos) || '
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            -- Se não digitou número
            ELSE
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.descricaoImpressa LIKE ''' || RTRIM (REPLACE (RTRIM (v_codigoDescricaoComPontos), ' ', '%')) || '%'''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF p_config_32_pesqPeloEanGtin = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_35_pesqPeloProdutoImp = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
                v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
                WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                  v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
                END LOOP;
                IF v_codigoDescricaoLoop <> ' ' THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
            END IF;
            -- Válido tanto para números quanto não números
            IF p_config_33_pesqPelaReferencia = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_37_pesqPeloCodAnterio = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_38_pesqPeloProdXPess IN ('S','T') THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXPESSOAS prodXPess
  ON prodXPess.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
  AND prodXPess.pessoa = 0' ELSE '
  AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXPess.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXPESSOAS prodXPess
  ON prodXPess.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
  AND prodXPess.pessoa = 0' ELSE '
  AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXPess.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_39_pesqPeloLote = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_40_pesqPeloNumSerie = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
  ON prodXNumSer.gradeProduto = a.gradeProduto
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXNumSer.ativo = 1
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
  ON prodXNumSer.gradeProduto = a.gradeProduto
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXNumSer.ativo = 1
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_429_pesqPeloProdXForn = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAPRODUTOXFORNECEDORES prodXForn
  ON prodXForn.produto = a.produto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXForn.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAPRODUTOXFORNECEDORES prodXForn
  ON prodXForn.produto = a.produto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXForn.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            v_select := v_select || '
) a';
            IF v_contadorSubSelects = 0 THEN
              v_select := 'SELECT 0 FROM DUAL';
            END IF;
            EXECUTE IMMEDIATE v_select
            INTO v_contaRegistros;            
            IF v_contaRegistros > 0 THEN
              r_mensagemErro      := 'Produto inativo.';
            END IF;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_GRADE_PRODUTO_TROCA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_EC (
  p_idFichaProdutoPrevOrcamento IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR (32000);
  v_bufferIdEstoque        VARCHAR (32000);
BEGIN
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_FIC_EX (
    p_idFichaProdutoPrevOrcamento,
    v_bufferIdReservaEstoque,
    v_bufferIdEstoque,
    v_bufferIdReservaEstoque,
    v_bufferIdEstoque);

END ADD_ORCAMENTO_ITEM_PREV_FIC_EC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_EC (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idFichaProdutoRealOrcamento IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR (32000);
  v_bufferIdEstoque        VARCHAR (32000);
BEGIN
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  FOR a IN (  
    SELECT
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntrega,
      item.modeloDocumento,
      ativPrev.dataInicio,
      ativPrev.dataTermino,
      fichReal.idFichaProdutoPrevOrcamento,
      fichReal.idFichaProdutoRealOrcamento
    FROM MOORCAMENTOXFICHAPRODREAL fichReal
    JOIN MOORCAMENTOXFICHAPRODPREV fichPrev
    ON fichPrev.idFichaProdutoPrevOrcamento = fichReal.idFichaProdutoPrevOrcamento
    JOIN MOORCAMENTOXATIVIDADEPREV ativPrev
    ON ativPrev.idAtividadePrevOrcamento = fichPrev.idAtividadePrevOrcamento
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = ativPrev.idItemOrcamento
    JOIN MOORCAMENTOS cab
    ON cab.orcamento = item.orcamento
    WHERE fichReal.idFichaProdutoRealOrcamento = p_idFichaProdutoRealOrcamento)
  LOOP
    ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
      a.idFichaProdutoRealOrcamento,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    IF a.idFichaProdutoPrevOrcamento > 0 THEN
      ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        a.estabelecimento,
        a.dataEmissao,
        a.dataEntrega,
        a.modeloDocumento,
        a.dataInicio,
        a.dataTermino,
        a.idFichaProdutoPrevOrcamento,
        v_bufferIdReservaEstoque,
        v_bufferIdReservaEstoque);
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_REAL_FIC_EC;

/

UPDATE SIPERSONALIZACOESCAMPOS SET descricao = 'Coluna "Orçamento / O.S." nos itens do "Recebimento Retaguarda"', nomeCampoSugestao = 'Orçamento / O.S.' WHERE personalizacaoCampo = 247;

COMMIT;

UPDATE PAPERSCAMPOSXCONTEUDOS SET nomeCampo = 'Orçamento / O.S.' WHERE personalizacaoCampo = 247 AND nomeCampo = 'Orçamento';

COMMIT;

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (260, 50001007, 'Coluna "Pedido Compra" nos itens do "Pagamento Fornecedores"', 1, 50001, 'A', '120', 'E', 0, 0, 1, 0, 0, 0, 'Pedido Compra', ' ', ' ', ' ');

COMMIT;

ALTER TABLE PADEMONSTRATIVOXCATEGORIA DROP CONSTRAINT PADEMONSTRATIVOXCATEGORIA_FK3;
ALTER TABLE PADEMONSTRATIVOXMULTIPLOS DROP CONSTRAINT PADEMONSTRATIVOXMULTIPLOS_FK2;

UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 523 WHERE idProcessamentoDemonstrativo = 522;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 522 WHERE idProcessamentoDemonstrativo = 521;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 521 WHERE idProcessamentoDemonstrativo = 520;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 513 WHERE idProcessamentoDemonstrativo = 512;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 512 WHERE idProcessamentoDemonstrativo = 511;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 511 WHERE idProcessamentoDemonstrativo = 510;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 97 WHERE idProcessamentoDemonstrativo = 98;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 7 WHERE idProcessamentoDemonstrativo = 6;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 6 WHERE idProcessamentoDemonstrativo = 5;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 5 WHERE idProcessamentoDemonstrativo = 4;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 4 WHERE idProcessamentoDemonstrativo = 3;
UPDATE PADEMONSTRATIVOXCATEGORIA SET idProcessamentoDemonstrativo = 3 WHERE idProcessamentoDemonstrativo = 2;

UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 523 WHERE idProcessamentoDemonstrativo = 522;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 522 WHERE idProcessamentoDemonstrativo = 521;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 521 WHERE idProcessamentoDemonstrativo = 520;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 513 WHERE idProcessamentoDemonstrativo = 512;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 512 WHERE idProcessamentoDemonstrativo = 511;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 511 WHERE idProcessamentoDemonstrativo = 510;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 97 WHERE idProcessamentoDemonstrativo = 98;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 7 WHERE idProcessamentoDemonstrativo = 6;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 6 WHERE idProcessamentoDemonstrativo = 5;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 5 WHERE idProcessamentoDemonstrativo = 4;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 4 WHERE idProcessamentoDemonstrativo = 3;
UPDATE PADEMONSTRATIVOXMULTIPLOS SET idProcessamentoDemonstrativo = 3 WHERE idProcessamentoDemonstrativo = 2;

UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 523 WHERE idProcessamentoDemonstrativo = 522;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 522 WHERE idProcessamentoDemonstrativo = 521;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 521 WHERE idProcessamentoDemonstrativo = 520;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 513 WHERE idProcessamentoDemonstrativo = 512;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 512 WHERE idProcessamentoDemonstrativo = 511;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 511 WHERE idProcessamentoDemonstrativo = 510;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 97 WHERE idProcessamentoDemonstrativo = 98;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 7 WHERE idProcessamentoDemonstrativo = 6;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 6 WHERE idProcessamentoDemonstrativo = 5;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 5 WHERE idProcessamentoDemonstrativo = 4;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 4 WHERE idProcessamentoDemonstrativo = 3;
UPDATE SIPROCESSAMENTOSDEMONST SET idProcessamentoDemonstrativo = 3 WHERE idProcessamentoDemonstrativo = 2;

INSERT INTO SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo, descricao, ativo, categoriaProcDemonstrativo, observacoes) values (2, '(+) Venda Bruta Serviços', 1, 1, ' ');
INSERT INTO SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo, descricao, ativo, categoriaProcDemonstrativo, observacoes) values (98, '(+) Venda Serviços Múltiplos Meios Pagamento', 1, 1, ' ');
INSERT INTO SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo, descricao, ativo, categoriaProcDemonstrativo, observacoes) values (510, '(+) Juros Recebidos por Conta Financeira', 1, 50, ' ');
INSERT INTO SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo, descricao, ativo, categoriaProcDemonstrativo, observacoes) values (520, '(-) Juros Pagos por Conta Financeira', 1, 50, ' ');
INSERT INTO SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo, descricao, ativo, categoriaProcDemonstrativo, observacoes) values (524, '(-) Tarifa Cartão', 1, 50, ' ');

COMMIT;

ALTER TABLE PADEMONSTRATIVOXCATEGORIA ADD CONSTRAINT PADEMONSTRATIVOXCATEGORIA_FK3 FOREIGN KEY (idProcessamentoDemonstrativo) REFERENCES SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo);
ALTER TABLE PADEMONSTRATIVOXMULTIPLOS ADD CONSTRAINT PADEMONSTRATIVOXMULTIPLOS_FK2 FOREIGN KEY (idProcessamentoDemonstrativo) REFERENCES SIPROCESSAMENTOSDEMONST (idProcessamentoDemonstrativo);

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (437, 'Posicionar na tela da nota fiscal eletrônica (NF-e) de saída antes de finalizar a efetivação', 1, 30001, 'A', '256', 'P', 0, 'M', ' ', ' ');
INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (438, 'Posicionar na tela da nota fiscal de serviçol eletrônica (NFS-e) antes de finalizar a efetivação', 1, 30001, 'A', '256', 'P', 0, 'M', ' ', ' ');
INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (439, 'Posicionar na tela do pré-documento de saída antes de finalizar a efetivação', 1, 30001, 'A', '256', 'P', 0, 'M', ' ', ' ');

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (182, 'M', 'Múltiplo Não e Normal Sim', 194, 1, 4, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (183, 'N', 'Não', 437, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (184, 'S', 'Sim', 437, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (185, 'P', 'Perguntar', 437, 1, 3, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (186, 'M', 'Múltiplo Não e Normal Sim', 437, 1, 4, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (187, 'N', 'Não', 438, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (188, 'S', 'Sim', 438, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (189, 'P', 'Perguntar', 438, 1, 3, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (190, 'M', 'Múltiplo Não e Normal Sim', 438, 1, 4, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (191, 'N', 'Não', 439, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (192, 'S', 'Sim', 439, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (193, 'P', 'Perguntar', 439, 1, 3, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (194, 'M', 'Múltiplo Não e Normal Sim', 439, 1, 4, ' ');

COMMIT;

create or replace PROCEDURE ADD_TEMPPAGAMENTOS_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoTEMPPAGAMENTOS IN NUMBER,
  p_origem                       IN CHAR,
  p_idCabecalho                  IN NUMBER,
  p_pagamentoTroco               IN CHAR,
  p_sequencia                    IN NUMBER,
  p_pagamentoRecebimento         IN CHAR,
  p_condicaoPagamento            IN NUMBER,
  p_cobranca                     IN NUMBER,
  p_valorPagamentoLiquido        IN NUMBER,
  p_contratoCompra               IN NUMBER,
  p_cartaoCredenciadoraCartao    IN NUMBER,
  p_cartaoBandeiraCartaoDebCred  IN NUMBER,
  p_cartaoTransacaoCartaoNSU     IN VARCHAR,
  p_cartaoAutorizacaoCartao      IN VARCHAR,
  p_cartaoTarifaCartao           IN NUMBER,
  p_cartaoProprio                IN VARCHAR,
  p_idFinanceiroAdiantamento     IN NUMBER)
IS
BEGIN
  MERGE INTO TEMPPAGAMENTOS a
  USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      p_contadorSessaoTEMPPAGAMENTOS contadorSessao,
      p_origem                       origem,
      p_idCabecalho                  idCabecalho,
      p_pagamentoTroco               pagamentoTroco,
      p_sequencia                    sequencia,
      p_pagamentoRecebimento         pagamentoRecebimento,
      p_condicaoPagamento            condicaoPagamento,
      p_cobranca                     cobranca,
      p_valorPagamentoLiquido        valorPagamentoLiquido,
      p_contratoCompra               contratoCompra,
      p_cartaoCredenciadoraCartao    cartaoCredenciadoraCartao,
      p_cartaoBandeiraCartaoDebCred  cartaoBandeiraCartaoDebCred,
      p_cartaoTransacaoCartaoNSU     cartaoTransacaoCartaoNSU,
      p_cartaoAutorizacaoCartao      cartaoAutorizacaoCartao,
      p_cartaoTarifaCartao           cartaoTarifaCartao,
      p_cartaoProprio                cartaoProprio,
      p_idFinanceiroAdiantamento     idFinanceiroAdiantamento
    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)
  WHEN MATCHED THEN UPDATE SET
    a.pagamentoRecebimento        = b.pagamentoRecebimento,
    a.condicaoPagamento           = b.condicaoPagamento,
    a.cobranca                    = b.cobranca,
    a.valorPagamentoLiquido       = b.valorPagamentoLiquido,
    a.contratoCompra              = b.contratoCompra,
    a.cartaoCredenciadoraCartao   = b.cartaoCredenciadoraCartao,
    a.cartaoBandeiraCartaoDebCred = b.cartaoBandeiraCartaoDebCred,
    a.cartaoTransacaoCartaoNSU    = b.cartaoTransacaoCartaoNSU,
    a.cartaoAutorizacaoCartao     = b.cartaoAutorizacaoCartao,
    a.cartaoTarifaCartao          = b.cartaoTarifaCartao,
    a.cartaoProprio               = b.cartaoProprio,
    a.idFinanceiroAdiantamento    = b.idFinanceiroAdiantamento
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    contadorSessao,
    origem,
    idCabecalho,
    pagamentoTroco,
    sequencia,
    pagamentoRecebimento,
    condicaoPagamento,
    cobranca,
    valorPagamentoLiquido,
    contratoCompra,
    cartaoCredenciadoraCartao,
    cartaoBandeiraCartaoDebCred,
    cartaoTransacaoCartaoNSU,
    cartaoAutorizacaoCartao,
    cartaoTarifaCartao,
    cartaoProprio,
    idFinanceiroAdiantamento)
  VALUES (
    b.sessaoClient,
    b.contadorSessao,
    b.origem,
    b.idCabecalho,
    b.pagamentoTroco,
    b.sequencia,
    b.pagamentoRecebimento,
    b.condicaoPagamento,
    b.cobranca,
    b.valorPagamentoLiquido,
    b.contratoCompra,
    b.cartaoCredenciadoraCartao,
    b.cartaoBandeiraCartaoDebCred,
    b.cartaoTransacaoCartaoNSU,
    b.cartaoAutorizacaoCartao,
    b.cartaoTarifaCartao,
    b.cartaoProprio,
    b.idFinanceiroAdiantamento);
END ADD_TEMPPAGAMENTOS_GRAVA;

/

DROP PROCEDURE ADD_FINANC_PAG_TEMPPAR_EFET;

create or replace PROCEDURE ADD_FINANC_TEMPPARCELAS_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_TEMPPARCELAS_EFET;

/

create or replace PROCEDURE ADD_FINANC_TEMPPAGAMENTOS_EFET (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_contadorSessaoTEMPPAGAMENTOS IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_cab_sessaoCaixa              IN NUMBER,
  p_cab_sessaoCaixaCheque        IN NUMBER,
  p_cab_fatoContabil             IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_data                     IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_autorizadoPessoa         IN NUMBER,
  p_cab_contaFinanceira          IN VARCHAR2,
  p_operacaoFinanceira           IN NUMBER,
  p_documento                    IN VARCHAR2,
  p_temp_sequencia               IN NUMBER,
  p_temp_carteiraFinanceira      IN NUMBER,
  p_2_contratosCompra            IN CLOB,
  p_3_contratosCompra            IN CLOB,
  p_23_idsFinanceiro             IN CLOB,
  p_29_contratosCompra           IN CLOB,
  p_36_contratosCompra           IN CLOB,
  p_46_idsFinanceiro             IN CLOB,
  r_2_contratosCompra            OUT CLOB,
  r_3_contratosCompra            OUT CLOB,
  r_23_idsFinanceiro             OUT CLOB,
  r_29_contratosCompra           OUT CLOB,
  r_36_contratosCompra           OUT CLOB,
  r_46_idsFinanceiro             OUT CLOB)
IS
  v_idsFinanceiroInseridos       CLOB;
BEGIN
  r_2_contratosCompra  := p_2_contratosCompra;
  r_3_contratosCompra  := p_3_contratosCompra;
  r_23_idsFinanceiro   := p_23_idsFinanceiro;
  r_29_contratosCompra := p_29_contratosCompra;
  r_36_contratosCompra := p_36_contratosCompra;
  r_46_idsFinanceiro   := p_46_idsFinanceiro;
  FOR a IN (
    SELECT
      tempPag.sequencia,
      tempPag.pagamentoRecebimento,
      tempPag.condicaoPagamento,
      tempPag.cobranca,
      tempPag.contratoCompra,
      tempPag.cartaoCredenciadoraCartao,
      tempPag.cartaoBandeiraCartaoDebCred,
      tempPag.cartaoTransacaoCartaoNSU,
      tempPag.cartaoAutorizacaoCartao,
      tempPag.cartaoTarifaCartao,
      tempPag.cartaoProprio,
      tempPag.idFinanceiroAdiantamento,
      cond.meioPagamento
    FROM TEMPPAGAMENTOS tempPag
    JOIN PACONDICOESPAGAMENTO cond
    ON cond.condicaoPagamento = tempPag.condicaoPagamento
    WHERE tempPag.sessaoClient = p_sessaoClient
    AND tempPag.contadorSessao = p_contadorSessaoTEMPPAGAMENTOS
    AND tempPag.origem = 'F'
    AND tempPag.idCabecalho = 0
    AND tempPag.pagamentoTroco = 'P'
    AND (p_temp_sequencia = 0
      OR tempPag.sequencia = p_temp_sequencia)
    ORDER BY tempPag.sequencia)
  LOOP
    ADD_FINANC_TEMPPARCELAS_EFET (
      p_sessaoClient,
      p_sys_estabelecimentoAtivo,
      p_config_349_prazoValidadePont,
      p_config_354_estabProximoId,
      p_contadorSessaoTEMPPARCELAS,
      a.pagamentoRecebimento,
      p_operacaoFinanceira,
      p_documento,
      p_temp_carteiraFinanceira,
      a.cartaoCredenciadoraCartao,
      a.cartaoBandeiraCartaoDebCred,
      a.cartaoTransacaoCartaoNSU,
      a.cartaoAutorizacaoCartao,
      a.cartaoTarifaCartao,
      a.cartaoProprio,
      0, -- p_idFinanceiroCorrelato
      a.idFinanceiroAdiantamento,
      0, -- p_idPagamentoPreDocumento
      0, -- p_idPagamentoDocFiscal
      'P', -- p_pag_pagamentoTroco
      a.sequencia,
      a.meioPagamento,
      a.condicaoPagamento,
      a.cobranca,
      CASE WHEN a.meioPagamento BETWEEN 41 AND 46 THEN p_cab_sessaoCaixaCheque ELSE p_cab_sessaoCaixa END, -- p_cab_sessaoCaixa
      p_cab_fatoContabil,
      p_cab_estabelecimento,
      p_cab_data, -- p_cab_dataEmissao
      p_cab_data, -- p_cab_dataEntradaSaida
      p_cab_pessoa,
      p_cab_autorizadoPessoa,
      a.contratoCompra,
      p_cab_contaFinanceira,
      v_idsFinanceiroInseridos);
    IF v_idsFinanceiroInseridos IS NOT NULL
      AND v_idsFinanceiroInseridos <> ' '
    THEN
      IF r_23_idsFinanceiro IS NULL
        OR r_23_idsFinanceiro = ' '
      THEN
        r_23_idsFinanceiro := v_idsFinanceiroInseridos;
      ELSE
        r_23_idsFinanceiro := r_23_idsFinanceiro || ',' || v_idsFinanceiroInseridos;
      END IF;
      IF a.pagamentoRecebimento = 'R'
        AND a.meioPagamento IN (51,52)
      THEN
        IF r_46_idsFinanceiro IS NULL
          OR r_46_idsFinanceiro = ' '
        THEN
          r_46_idsFinanceiro := v_idsFinanceiroInseridos;
        ELSE
          r_46_idsFinanceiro := r_46_idsFinanceiro || ',' || v_idsFinanceiroInseridos;
        END IF;
      END IF;
    END IF;
    IF a.contratoCompra <> 0 THEN
      IF a.meioPagamento IN (53,65) THEN
        IF r_2_contratosCompra IS NULL
          OR r_2_contratosCompra = ' '
        THEN
          r_2_contratosCompra := LPAD (a.contratoCompra, 14, '0');
        ELSIF INSTR (',' || TRIM (r_2_contratosCompra) || ',', ',' || LPAD (a.contratoCompra, 14, '0') || ',') = 0 THEN
          r_2_contratosCompra := r_2_contratosCompra || ',' || LPAD (a.contratoCompra, 14, '0');
        END IF;
      END IF;
      IF a.meioPagamento IN (53,54,55,56,58,61,62,63,65) THEN
        IF r_3_contratosCompra IS NULL
          OR r_3_contratosCompra = ' '
        THEN
          r_3_contratosCompra := LPAD (a.contratoCompra, 14, '0');
        ELSIF INSTR (',' || TRIM (r_3_contratosCompra) || ',', ',' || LPAD (a.contratoCompra, 14, '0') || ',') = 0 THEN
          r_3_contratosCompra := r_3_contratosCompra || ',' || LPAD (a.contratoCompra, 14, '0');
        END IF;
      END IF;
      IF a.meioPagamento = 64 THEN
        IF r_29_contratosCompra IS NULL
          OR r_29_contratosCompra = ' '
        THEN
          r_29_contratosCompra := LPAD (a.contratoCompra, 14, '0');
        ELSIF INSTR (',' || TRIM (r_29_contratosCompra) || ',', ',' || LPAD (a.contratoCompra, 14, '0') || ',') = 0 THEN
          r_29_contratosCompra := r_29_contratosCompra || ',' || LPAD (a.contratoCompra, 14, '0');
        END IF;
      END IF;
      IF a.meioPagamento IN (51,52) THEN
        IF r_36_contratosCompra IS NULL
          OR r_36_contratosCompra = ' '
        THEN
          r_36_contratosCompra := LPAD (a.contratoCompra, 14, '0');
        ELSIF INSTR (',' || TRIM (r_36_contratosCompra) || ',', ',' || LPAD (a.contratoCompra, 14, '0') || ',') = 0 THEN
          r_36_contratosCompra := r_36_contratosCompra || ',' || LPAD (a.contratoCompra, 14, '0');
        END IF;
      END IF;
    END IF;
  END LOOP;
END ADD_FINANC_TEMPPAGAMENTOS_EFET;

/

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_contadorSessaoTEMPPAGAMENTOS IN NUMBER,
  p_contadorSessaoTEMPPARCELAS   IN NUMBER,
  p_contadorSessaoTEMPSELECIONAD IN NUMBER,
  p_idNegociacaoDivida           IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  p_dataBaixa                    IN DATE,
  p_somaSel_valorJurosDeMora     IN NUMBER,
  p_somaSel_valorMulta           IN NUMBER,
  p_confirm_pagamentoRecebimento IN CHAR,
  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_confirm_troco_meioPagamento  IN NUMBER,
  p_confirm_troco_condicaoPagam  IN NUMBER,
  r_idNegociacaoDivida           OUT NUMBER,
  r_2_contratosCompra            OUT CLOB,
  r_3_contratosCompra            OUT CLOB,
  r_23_idsFinanceiro             OUT CLOB,
  r_29_contratosCompra           OUT CLOB,
  r_36_contratosCompra           OUT CLOB,
  r_46_idsFinanceiro             OUT CLOB)
IS
  v_fatoContabilContabilizar     NUMBER;
  v_fatoContabilNaoContabilizar  NUMBER;
  v_somaValorLiquidado           NUMBER;
  v_saldoJurosTotal              NUMBER;
  v_saldoMultaTotal              NUMBER;
  v_saldoDescontoInformado       NUMBER;
  v_saldoAcrescimoInformado      NUMBER;
  v_residuoValorBrutoIndexado    NUMBER (16, 15);
  v_residuoVariacaoIndexador     NUMBER (16, 15);
  v_residuoJurosDeMora           NUMBER (16, 15);
  v_residuoMulta                 NUMBER (16, 15);
  v_residuoTarifaCartao          NUMBER (16, 15);
  v_residuoDescontos             NUMBER (16, 15);
  v_residuoOutrosAcrescimos      NUMBER (16, 15);
  v_residuoDescontoInformado     NUMBER (16, 15);
  v_residuoAcrescimoInformado    NUMBER (16, 15);
  v_idBaixaFinanceiroAdiantament NUMBER;
  v_idsFinanceiroPagto           CLOB;
  v_idsFinanceiroTroco           CLOB;
  v_idsBaixaFinanceiroCheque     CLOB;
  v_carteiraFinanceiraPagto      NUMBER;
  v_idFinancAdtoExiste           NUMBER;
  v_adiant_contaFinanceira       VARCHAR (60);
  v_adiant_carteiraFinanceira    NUMBER;
  v_adiant_pagamentoRecebimento  CHAR (1);
  v_adiant_idBaixaFinanceiro     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_idNegociacaoDivida          := p_idNegociacaoDivida;
  r_2_contratosCompra           := ' ';
  r_3_contratosCompra           := ' ';
  r_23_idsFinanceiro            := ' ';
  r_29_contratosCompra          := ' ';
  r_36_contratosCompra          := ' ';
  r_46_idsFinanceiro            := ' ';
  v_fatoContabilContabilizar    := 0;
  v_fatoContabilNaoContabilizar := 0;
  v_somaValorLiquidado          := 0;
  v_saldoJurosTotal             := p_confirm_valorJurosTotal;
  v_saldoMultaTotal             := p_confirm_valorMultaTotal;
  v_saldoDescontoInformado      := p_confirm_valorDescontoInform;
  v_saldoAcrescimoInformado     := p_confirm_valorAcrescimoInform;
  v_residuoValorBrutoIndexado   := 0;
  v_residuoVariacaoIndexador    := 0;
  v_residuoJurosDeMora          := 0;
  v_residuoMulta                := 0;
  v_residuoTarifaCartao         := 0;
  v_residuoDescontos            := 0;
  v_residuoOutrosAcrescimos     := 0;
  v_residuoDescontoInformado    := 0;
  v_residuoAcrescimoInformado   := 0;
  UPDATE TEMPRECEBIMENTO SET
    saldoVariacaoIndexador = valorVariacaoIndexador,
    saldoJurosDeMora = valorJurosDeMora,
    saldoMulta = valorMulta,
    saldoTarifaCartao = valorTarifaCartao,
    saldoDescontos = valorDescontos,
    saldoOutrosAcrescimos = valorOutrosAcrescimos,
    saldoLiquido = valorLiquido
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessaoTEMPRECEBIMENT;
  FOR a IN (
    SELECT
      tempSel.sequencia,
      tempSel.linhaA observacoes,
      tempSel.campoA documento,
      tempSel.idA meioPagamento,
      tempSel.idB carteiraFinanceira,
      tempSel.idC idFinanceiroAdiantamento,
      tempSel.simNaoA informouCheque,
      tempSel.valorA valorPago,
      tempSel.blob idsFinanceiroCheque
    FROM TEMPSELECAODOCUMENTO tempSel
    WHERE tempSel.sessaoClient = p_sessaoClient
    AND tempSel.nomePublico = 'PagamentosRecebimentos'
    ORDER BY
      tempSel.quebra,
      tempSel.origem,
      tempSel.idCabecalho,
      tempSel.sequencia,
      tempSel.idItem)
  LOOP
    v_idBaixaFinanceiroAdiantament := 0;
    v_idsFinanceiroPagto           := ' ';
    v_idsFinanceiroTroco           := ' ';
    v_idsBaixaFinanceiroCheque     := ' ';
    IF a.idFinanceiroAdiantamento <> 0 THEN
      SELECT
        COALESCE (MAX (1), 0),
        COALESCE (MAX (adiant.contaFinanceira), ' '),
        COALESCE (MAX (adiant.carteiraFinanceira), 0),
        COALESCE (MAX (adiant.pagamentoRecebimento), ' ')
      INTO
        v_idFinancAdtoExiste,
        v_adiant_contaFinanceira,
        v_adiant_carteiraFinanceira,
        v_adiant_pagamentoRecebimento
      FROM MOFINANCEIROS adiant
      WHERE adiant.idFinanceiro = a.idFinanceiroAdiantamento;
    ELSE
      v_idFinancAdtoExiste           := 0;
      v_adiant_contaFinanceira       := ' ';
      v_adiant_carteiraFinanceira    := 0;
      v_adiant_pagamentoRecebimento  := ' ';
    END IF;
    FOR b IN (
      SELECT
        b.estabelecimento,
        b.pessoa,
        b.autorizadoPessoa,
        b.cobranca,
        b.carteiraFinanceira,
        b.situacaoContabilizacao
      FROM (
        SELECT
          ROW_NUMBER() OVER (ORDER BY tempRec.ordenacao) ordenacao,
          financ.estabelecimento,
          financ.pessoa,
          financ.autorizadoPessoa,
          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) b
      WHERE b.ordenacao = 1)
    LOOP
      IF b.situacaoContabilizacao = 'N'
      THEN
        IF v_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 b.estabelecimento
              ELSE p_sys_estabelecimentoAtivo
            END, -- p_estabelecimento
            p_dataBaixa,
            'N', -- p_situacaoContabilizacao
            v_fatoContabilNaoContabilizar);
        END IF;
      ELSE
        IF v_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 b.estabelecimento
              ELSE p_sys_estabelecimentoAtivo
            END, -- p_estabelecimento
            p_dataBaixa,
            'A', -- p_situacaoContabilizacao
            v_fatoContabilContabilizar);
        END IF;
      END IF;
      IF a.meioPagamento >= 17
        AND a.meioPagamento NOT IN (30,31,32,33,38,39,40)
        AND a.informouCheque = 0
      THEN
        ADD_FINANC_TEMPPAGAMENTOS_EFET (
          p_sessaoClient,
          p_sys_estabelecimentoAtivo,
          p_config_349_prazoValidadePont,
          p_config_354_estabProximoId,
          p_contadorSessaoTEMPPAGAMENTOS,
          p_contadorSessaoTEMPPARCELAS,
          0, -- p_cab_sessaoCaixa
          p_sessaoCaixa, -- p_cab_sessaoCaixaCheque
          CASE
            WHEN b.situacaoContabilizacao = 'N'
            THEN v_fatoContabilNaoContabilizar
            ELSE v_fatoContabilContabilizar
          END, -- p_cab_fatoContabil
          CASE
            WHEN p_config_226_baixarFinEstabOri = 1
            THEN b.estabelecimento
            ELSE p_sys_estabelecimentoAtivo
          END, -- p_cab_estabelecimento
          p_dataBaixa,
          b.cobranca, -- p_cab_pessoa
          CASE
            WHEN b.pessoa = b.cobranca
            THEN b.autorizadoPessoa
            ELSE 0
          END, -- p_cab_autorizadoPessoa
          ' ', -- p_cab_contaFinanceira
          CASE
            WHEN p_confirm_pagamentoRecebimento = 'P'
            THEN 72
            ELSE 32
          END, -- p_operacaoFinanceira
          a.documento,
          a.sequencia,
          a.carteiraFinanceira,
          r_2_contratosCompra,
          r_3_contratosCompra,
          ' ',
          r_29_contratosCompra,
          r_36_contratosCompra,
          r_46_idsFinanceiro,
          r_2_contratosCompra,
          r_3_contratosCompra,
          v_idsFinanceiroPagto,
          r_29_contratosCompra,
          r_36_contratosCompra,
          r_46_idsFinanceiro);
      END IF;
      IF a.idFinanceiroAdiantamento <> 0 THEN
        ADD_FINANC_BAIXA_ATUALIZA (
          p_sys_estabelecimentoAtivo,
          p_config_349_prazoValidadePont,
          p_config_354_estabProximoId,
          0, -- p_idBaixaFinanceiro
          0, -- p_sessaoCaixa,
          CASE
            WHEN b.situacaoContabilizacao = 'N'
            THEN v_fatoContabilNaoContabilizar
            ELSE v_fatoContabilContabilizar
          END, -- p_fatoContabil
          a.idFinanceiroAdiantamento, -- p_idFinanceiro
          CASE
            WHEN p_config_226_baixarFinEstabOri = 1
            THEN b.estabelecimento
            ELSE p_sys_estabelecimentoAtivo
          END, -- p_estabelecimento
          p_dataBaixa,
          v_adiant_contaFinanceira,
          v_adiant_pagamentoRecebimento,
          CASE
            WHEN v_adiant_pagamentoRecebimento = 'R'
            THEN 33
            ELSE 73
          END, -- p_operacaoFinanceira
          b.cobranca,
          a.meioPagamento,
          CASE
            WHEN a.carteiraFinanceira > 0
            THEN a.carteiraFinanceira
            WHEN v_idsFinanceiroPagto IS NOT NULL
              AND v_idsFinanceiroPagto <> ' '
              AND v_carteiraFinanceiraPagto > 0
            THEN v_carteiraFinanceiraPagto
            WHEN a.idFinanceiroAdiantamento > 0
            THEN v_adiant_carteiraFinanceira
            ELSE b.carteiraFinanceira
          END, -- p_carteiraFinanceira
          0, -- p_cotacao,
          0, -- p_valorBrutoIndexado,
          CASE
            WHEN v_somaValorLiquidado + a.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
            ELSE a.valorPago
          END, -- p_valorBruto
          0, -- p_valorVariacaoIndexador
          0, -- p_valorJurosDeMora
          0, -- p_valorMulta
          0, -- p_valorTarifaCartao
          0, -- p_valorDescontos
          0, -- p_valorOutrosAcrescimos
          CASE
            WHEN v_somaValorLiquidado + a.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
            ELSE a.valorPago
          END, -- p_valorLiquido,
          0, -- p_baixaAutomatica,
          0, -- p_unificadoReparcelado
          ' ', -- p_observacoes,
          0, -- p_idBaixaFinanceiroCorrel
          0, -- p_idNovoFinanceiro
          0, -- p_preDocumento
          0, -- p_idDocumentoFiscal
          v_idBaixaFinanceiroAdiantament,
          v_auxNumber, -- r_financ_saldo
          v_auxNumber, -- r_financ_saldoIndexado
          v_auxNumber); -- r_financ_efetivado
      END IF;
      IF a.informouCheque = 1
        AND a.idsFinanceiroCheque IS NOT NULL
        AND a.idsFinanceiroCheque <> ' '
      THEN
        FOR c IN (
          SELECT TO_NUMBER (REGEXP_SUBSTR(a.idsFinanceiroCheque, '[^,]+', 1, LEVEL)) AS idFinanceiro
          FROM DUAL
          CONNECT BY LEVEL <= REGEXP_COUNT (a.idsFinanceiroCheque, ',') + 1)
        LOOP
          FOR d IN(
            SELECT
              d.estabelecimento,
              d.contaFinanceira,
              d.pagamentoRecebimento,
              d.operacaoFinanceira,
              d.cobranca,
              d.carteiraFinanceira,
              d.saldo,
              d.cotacao,
              d.saldoIndexado
            FROM MOFINANCEIROS d
            WHERE d.idFinanceiro = c.idFinanceiro
            AND d.saldo > 0)
          LOOP
            ADD_FINANC_BAIXA_ATUALIZA (
              p_sys_estabelecimentoAtivo,
              p_config_349_prazoValidadePont,
              p_config_354_estabProximoId,
              0, -- p_idBaixaFinanceiro
              p_sessaoCaixa,
              CASE
                WHEN b.situacaoContabilizacao = 'N'
                THEN v_fatoContabilNaoContabilizar
                ELSE v_fatoContabilContabilizar
              END, -- p_fatoContabil
              c.idFinanceiro,
              CASE
                WHEN p_config_226_baixarFinEstabOri = 1
                THEN d.estabelecimento
                ELSE p_sys_estabelecimentoAtivo
              END, -- p_estabelecimento
              p_dataBaixa,
              d.contaFinanceira,
              d.pagamentoRecebimento,
              CASE
                WHEN d.pagamentoRecebimento = 'P'
                THEN
                  CASE
                    WHEN d.operacaoFinanceira = 31
                    THEN 74
                    ELSE 73
                  END
                ELSE
                  CASE
                    WHEN d.operacaoFinanceira = 71
                    THEN 34
                    ELSE 33
                  END
              END, -- p_operacaoFinanceira
              d.cobranca,
              a.meioPagamento,
              CASE
                WHEN a.carteiraFinanceira > 0
                THEN a.carteiraFinanceira
                WHEN v_idsFinanceiroPagto IS NOT NULL
                  AND v_idsFinanceiroPagto <> ' '
                  AND v_carteiraFinanceiraPagto > 0
                THEN v_carteiraFinanceiraPagto
                WHEN a.idFinanceiroAdiantamento > 0
                THEN v_adiant_carteiraFinanceira
                ELSE d.carteiraFinanceira
              END, -- p_carteiraFinanceira
              d.cotacao,
              d.saldoIndexado, -- p_valorBrutoIndexado
              d.saldo, -- p_valorBruto
              0, -- p_valorVariacaoIndexador
              0, -- p_valorJurosDeMora
              0, -- p_valorMulta
              0, -- p_valorTarifaCartao
              0, -- p_valorDescontos
              0, -- p_valorOutrosAcrescimos
              d.saldo, -- p_valorLiquido
              0, -- p_baixaAutomatica
              0, -- p_unificadoReparcelado
              a.observacoes,
              0, -- p_idBaixaFinanceiroCorrel
              0, -- p_idNovoFinanceiro
              0, -- p_preDocumento
              0, -- p_idDocumentoFiscal
              v_adiant_idBaixaFinanceiro,
              v_auxNumber, -- r_financ_saldo
              v_auxNumber, -- r_financ_saldoIndexado
              v_auxNumber); -- r_financ_efetivado
            IF v_idsBaixaFinanceiroCheque IS NULL
              OR v_idsBaixaFinanceiroCheque = ' '
            THEN
              v_idsBaixaFinanceiroCheque := LPAD (v_adiant_idBaixaFinanceiro, 14, '0');
            ELSE
              v_idsBaixaFinanceiroCheque := v_idsBaixaFinanceiroCheque || ',' || LPAD (v_adiant_idBaixaFinanceiro, 14, '0');
            END IF;
          END LOOP;
        END LOOP;
      END IF;
      IF v_somaValorLiquidado + a.valorPago > p_confirm_valorTotal
        AND p_confirm_troco_condicaoPagam <> 0
      THEN
        ADD_FINANC_TEMPPARCELAS_EFET (
          p_sessaoClient,
          p_sys_estabelecimentoAtivo,
          p_config_349_prazoValidadePont,
          p_config_354_estabProximoId,
          p_contadorSessaoTEMPPARCELAS,
          CASE
            WHEN p_confirm_pagamentoRecebimento = 'P'
            THEN 'R'
            ELSE 'P'
          END, -- p_pagamentoRecebimento
          CASE
            WHEN p_confirm_pagamentoRecebimento = 'P'
            THEN 71
            ELSE 74
          END, -- p_operacaoFinanceira
          ' ', -- p_documento
          0, -- p_carteiraFinanceira
          0, -- p_cartao_credenciadoraCartao
          0, -- p_cartao_bandeiraCartaoDebCred
          ' ', -- p_cartao_transacaoCartaoNSU
          ' ', -- p_cartao_autorizacaoCartao
          0, -- p_cartao_tarifaCartao
          ' ', -- p_cartaoProprio_cartaoProprio
          TO_NUMBER (REGEXP_SUBSTR (v_idsFinanceiroPagto, '[^,]+')), -- p_idFinanceiroCorrelato
          0, -- p_idFinanceiroAdiantamento
          0, -- p_idPagamentoPreDocumento
          0, -- p_idPagamentoDocFiscal
          'T', -- p_pag_pagamentoTroco
          1, -- p_pag_sequencia
          p_confirm_troco_meioPagamento,
          p_confirm_troco_condicaoPagam,
          b.cobranca,
          p_sessaoCaixa,
          CASE
            WHEN b.situacaoContabilizacao = 'N'
            THEN v_fatoContabilNaoContabilizar
            ELSE v_fatoContabilContabilizar
          END, -- p_fatoContabil
          CASE
            WHEN p_config_226_baixarFinEstabOri = 1
            THEN b.estabelecimento
            ELSE p_sys_estabelecimentoAtivo
          END, -- p_estabelecimento
          p_dataBaixa, -- p_cab_dataEmissao
          p_dataBaixa, -- p_cab_dataEntradaSaida
          b.cobranca, -- p_cab_pessoa
          CASE
            WHEN b.pessoa = b.cobranca
            THEN b.autorizadoPessoa
            ELSE 0
          END, -- p_cab_autorizadoPessoa
          0, -- p_cab_contratoCompra
          ' ', -- p_cab_contaFinanceira
          v_idsFinanceiroTroco);
      END IF;
    END LOOP;
    v_carteiraFinanceiraPagto := 0;
    IF a.carteiraFinanceira = 0
      AND v_idsFinanceiroPagto IS NOT NULL
      AND v_idsFinanceiroPagto <> ' '
    THEN
      SELECT COALESCE ( MAX (carteiraFinanceira), 0)
      INTO v_carteiraFinanceiraPagto
      FROM MOFINANCEIROS
      WHERE idFinanceiro = TO_NUMBER (REGEXP_SUBSTR (v_idsFinanceiroPagto, '[^,]+'));
    END IF;
    v_saldoBaixarPagamento :=
      CASE
        WHEN v_somaValorLiquidado
          + a.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
          - v_somaValorLiquidado
        ELSE a.valorPago
      END;
    FOR b 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             := b.saldo;
        v_novoResiduoValorBrutoIndexad := v_residuoValorBrutoIndexado;
        v_baixa_valorBrutoIndexado     := b.saldoIndexado;
        v_novoResiduoVariacaoIndexador := v_residuoVariacaoIndexador;
        v_baixa_valorVariacaoIndexador := b.saldoVariacaoIndexador;
        v_novoResiduoJurosDeMora := ROUND ((
          CASE
            WHEN p_somaSel_valorJurosDeMora = 0
            THEN 0
            ELSE b.saldoJurosDeMora
              * p_confirm_valorJurosTotal
              / p_somaSel_valorJurosDeMora
          END
          + v_residuoJurosDeMora
          - ROUND (
            CASE
              WHEN p_somaSel_valorJurosDeMora = 0
              THEN 0
              ELSE b.saldoJurosDeMora
                * p_confirm_valorJurosTotal
                / p_somaSel_valorJurosDeMora
            END
            + v_residuoJurosDeMora, 2)), 15);
        v_baixa_valorJurosTotal := ROUND (
          CASE
            WHEN p_somaSel_valorJurosDeMora = 0
            THEN 0
            ELSE b.saldoJurosDeMora
              * p_confirm_valorJurosTotal
              / p_somaSel_valorJurosDeMora
          END
          + v_residuoJurosDeMora, 2);
        IF v_baixa_valorJurosTotal > v_saldoJurosTotal
        THEN
          v_novoResiduoJurosDeMora := v_residuoJurosDeMora;
          v_baixa_valorJurosTotal  := v_saldoJurosTotal;
        END IF;
        v_novoResiduoMulta := ROUND ((
          CASE
            WHEN p_somaSel_valorMulta = 0
            THEN 0
            ELSE b.saldoMulta
              * p_confirm_valorMultaTotal
              / p_somaSel_valorMulta
          END
          + v_residuoMulta
          - ROUND (
            CASE
              WHEN p_somaSel_valorMulta = 0
              THEN 0
              ELSE b.saldoMulta
                * p_confirm_valorMultaTotal
                / p_somaSel_valorMulta
            END
            + v_residuoMulta, 2)), 15);
        v_baixa_valorMultaTotal := ROUND (
          CASE
            WHEN p_somaSel_valorMulta = 0
            THEN 0
            ELSE b.saldoMulta
              * p_confirm_valorMultaTotal
              / p_somaSel_valorMulta
          END
          + v_residuoMulta, 2);
        IF v_baixa_valorMultaTotal > v_saldoMultaTotal
        THEN
          v_novoResiduoMulta      := v_residuoMulta;
          v_baixa_valorMultaTotal := v_saldoMultaTotal;
        END IF;
        v_novoResiduoTarifaCartao     := v_residuoTarifaCartao;
        v_baixa_valorTarifaCartao     := b.saldoTarifaCartao;
        v_novoResiduoDescontos        := v_residuoDescontos;
        v_baixa_valorDescontos        := b.saldoDescontos;
        v_novoResiduoOutrosAcrescimos := v_residuoOutrosAcrescimos;
        v_baixa_valorOutrosAcrescimos := b.saldoOutrosAcrescimos;
        -- Calculo 1 - Liquidação Normal
        IF v_somaValorLiquidado
          + v_baixa_valorBruto
          + v_baixa_valorVariacaoIndexador
          + v_baixa_valorJurosTotal
          + v_baixa_valorMultaTotal
          - v_baixa_valorTarifaCartao
          - v_baixa_valorDescontos
          + v_baixa_valorOutrosAcrescimos
          - v_saldoDescontoInformado
          + v_saldoAcrescimoInformado
          = p_confirm_valorTotalPago
        THEN
          v_novoResiduoDescontoInformado := v_residuoDescontoInformado;
          v_baixa_valorDescontoInformado := v_saldoDescontoInformado;
          v_novoResiduoAcrescimoInformad := v_residuoAcrescimoInformado;
          v_baixa_valorAcrescimoInformad := v_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 + v_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
              + v_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
            + v_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
            + v_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
              + v_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
            + v_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
            + v_residuoVariacaoIndexador
            - ROUND (
              CASE
                WHEN v_baixa_valorLiquido = 0
                THEN 0
                ELSE v_baixa_valorVariacaoIndexador
                  * v_saldoBaixarPagamento
                  / v_baixa_valorLiquido
              END
              + v_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
            + v_residuoVariacaoIndexador, 2);
          v_novoResiduoJurosDeMora := ROUND ((
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorJurosTotal
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + v_residuoJurosDeMora
            - ROUND (
              CASE
                WHEN v_baixa_valorLiquido = 0
                THEN 0
                ELSE v_baixa_valorJurosTotal
                  * v_saldoBaixarPagamento
                  / v_baixa_valorLiquido
              END
              + v_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
            + v_residuoJurosDeMora, 2);
          IF v_baixa_valorJurosTotal > v_saldoJurosTotal
          THEN
            v_novoResiduoJurosDeMora := v_residuoJurosDeMora;
            v_baixa_valorJurosTotal  := v_saldoJurosTotal;
          END IF;
          v_novoResiduoMulta := ROUND ((
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorMultaTotal
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + v_residuoMulta
            - ROUND (
              CASE
                WHEN v_baixa_valorLiquido = 0
                THEN 0
                ELSE v_baixa_valorMultaTotal
                  * v_saldoBaixarPagamento
                  / v_baixa_valorLiquido
              END
              + v_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
            + v_residuoMulta, 2);
          IF v_baixa_valorMultaTotal > v_saldoMultaTotal
          THEN
            v_novoResiduoMulta      := v_residuoMulta;
            v_baixa_valorMultaTotal := v_saldoMultaTotal;
          END IF;
          v_novoResiduoTarifaCartao := ROUND ((
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0 ELSE v_baixa_valorTarifaCartao
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + v_residuoTarifaCartao
            - ROUND (
              CASE
                WHEN v_baixa_valorLiquido = 0
                THEN 0
                ELSE v_baixa_valorTarifaCartao
                  * v_saldoBaixarPagamento
                  / v_baixa_valorLiquido
              END
              + v_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
            + v_residuoTarifaCartao, 2);
          v_novoResiduoDescontos := ROUND ((
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorDescontos
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + v_residuoDescontos
            - ROUND (
              CASE
                WHEN v_baixa_valorLiquido = 0
                THEN 0
                ELSE v_baixa_valorDescontos
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
              END
              + v_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
            + v_residuoDescontos, 2);
          v_novoResiduoOutrosAcrescimos := ROUND ((
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorOutrosAcrescimos
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + v_residuoOutrosAcrescimos
            - ROUND (
              CASE
                WHEN v_baixa_valorLiquido = 0
                THEN 0
                ELSE v_baixa_valorOutrosAcrescimos
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
              END
              + v_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
            + v_residuoOutrosAcrescimos, 2);
          v_novoResiduoDescontoInformado := ROUND ((
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorDescontoInformado
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + v_residuoDescontoInformado
            - ROUND (
              CASE
                WHEN v_baixa_valorLiquido = 0
                THEN 0
                ELSE v_baixa_valorDescontoInformado
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
              END
              + v_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
            + v_residuoDescontoInformado, 2);
          v_novoResiduoAcrescimoInformad := ROUND ((
            CASE
              WHEN v_baixa_valorLiquido = 0
              THEN 0
              ELSE v_baixa_valorAcrescimoInformad
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
            END
            + v_residuoAcrescimoInformado
            - ROUND (
              CASE
                WHEN v_baixa_valorLiquido = 0
                THEN 0
                ELSE v_baixa_valorAcrescimoInformad
                * v_saldoBaixarPagamento
                / v_baixa_valorLiquido
              END
              + v_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
            + v_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 b.saldo = 0
              THEN 0
              ELSE b.saldoIndexado
                * v_baixa_valorBruto
                / b.saldo
            END
            + v_residuoValorBrutoIndexado
            -  ROUND (
              CASE
                WHEN b.saldo = 0
                THEN 0
                ELSE b.saldoIndexado
                  * v_baixa_valorBruto
                  / b.saldo
              END
              + v_residuoValorBrutoIndexado, 6)), 15);
          v_baixa_valorBrutoIndexado := ROUND (
            CASE
              WHEN b.saldo = 0
              THEN 0
              ELSE b.saldoIndexado
                * v_baixa_valorBruto
                / b.saldo
            END
            + v_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 v_somaValorLiquidado + v_baixa_valorLiquido > p_confirm_valorTotalPago
          OR v_baixa_valorBruto > b.saldo
          OR v_baixa_valorLiquido > v_saldoBaixarPagamento
          OR v_baixa_valorJurosTotal > v_saldoJurosTotal
          OR v_baixa_valorMultaTotal > v_saldoMultaTotal
          OR v_baixa_valorDescontoInformado > v_saldoDescontoInformado
          OR v_baixa_valorAcrescimoInformad > v_saldoAcrescimoInformado
        THEN
          v_novoResiduoVariacaoIndexador :=  ROUND ((b.valorVariacaoIndexador * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoVariacaoIndexador
            - ROUND (
              b.valorVariacaoIndexador * 
              CASE
                WHEN (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
                THEN 0
                ELSE
                  CASE
                    WHEN (v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado) > (b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2))
                    THEN b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2)
                    ELSE v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado
                  END
                  / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
              END
              + v_residuoVariacaoIndexador, 2)), 15);
          v_baixa_valorVariacaoIndexador := ROUND (
            b.valorVariacaoIndexador * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoVariacaoIndexador, 2);
          v_novoResiduoJurosDeMora :=  ROUND ((b.valorJurosDeMora * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoJurosDeMora
            - ROUND (
              b.valorJurosDeMora * 
              CASE
                WHEN (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
                THEN 0
                ELSE
                  CASE
                    WHEN (v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado) > (b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2))
                    THEN b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2)
                    ELSE v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado
                  END
                  / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
              END
              + v_residuoJurosDeMora, 2)), 15);
          v_baixa_valorJurosTotal := ROUND (
            b.valorJurosDeMora * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoJurosDeMora, 2);
          IF v_baixa_valorJurosTotal > v_saldoJurosTotal
          THEN
            v_novoResiduoJurosDeMora := v_residuoJurosDeMora;
            v_baixa_valorJurosTotal  := v_saldoJurosTotal;
          END IF;
          v_novoResiduoMulta :=  ROUND ((b.valorMulta * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoMulta
            - ROUND (
              b.valorMulta * 
              CASE
                WHEN (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
                THEN 0
                ELSE
                  CASE
                    WHEN (v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado) > (b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2))
                    THEN b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2)
                    ELSE v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado
                  END
                  / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
              END
              + v_residuoMulta, 2)), 15);
          v_baixa_valorMultaTotal := ROUND (
            b.valorMulta * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoMulta, 2);
          IF v_baixa_valorMultaTotal > v_saldoMultaTotal
          THEN
            v_novoResiduoMulta      := v_residuoMulta;
            v_baixa_valorMultaTotal := v_saldoMultaTotal;
          END IF;
          v_novoResiduoTarifaCartao :=  ROUND ((b.valorTarifaCartao * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoTarifaCartao
            - ROUND (
              b.valorTarifaCartao * 
              CASE
                WHEN (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
                THEN 0
                ELSE
                  CASE
                    WHEN (v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado) > (b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2))
                    THEN b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2)
                    ELSE v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado
                  END
                  / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
              END
              + v_residuoTarifaCartao, 2)), 15);
          v_baixa_valorTarifaCartao :=  ROUND (
            b.valorTarifaCartao * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoTarifaCartao, 2);
          v_novoResiduoDescontos :=  ROUND ((b.valorDescontos * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoDescontos
            - ROUND (
              b.valorDescontos * 
              CASE
                WHEN (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
                THEN 0
                ELSE
                  CASE
                    WHEN (v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado) > (b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2))
                    THEN b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2)
                    ELSE v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado
                  END
                  / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
              END
              + v_residuoDescontos, 2)), 15);
          v_baixa_valorDescontos :=  ROUND (
            b.valorDescontos * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoDescontos, 2);
          v_novoResiduoOutrosAcrescimos :=  ROUND ((b.valorOutrosAcrescimos * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoOutrosAcrescimos
            - ROUND (
              b.valorOutrosAcrescimos * 
              CASE
                WHEN (p_confirm_valorTotalPago
                + p_confirm_valorDescontoInform
                - p_confirm_valorAcrescimoInform) = 0
                THEN 0
                ELSE
                  CASE
                    WHEN (v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado) > (b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2))
                    THEN b.valorLiquido
                      - ROUND (b.valorJurosDeMora
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                          + p_confirm_valorDescontoInform
                          - p_confirm_valorAcrescimoInform)
                          + v_residuoJurosDeMora, 2)
                      - ROUND (b.valorMulta
                        * b.valorLiquido
                        / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoMulta, 2)
                    ELSE v_saldoBaixarPagamento
                      + v_saldoDescontoInformado
                      - v_saldoAcrescimoInformado
                  END
                  / (p_confirm_valorTotalPago
                    + p_confirm_valorDescontoInform
                    - p_confirm_valorAcrescimoInform)
              END
              + v_residuoOutrosAcrescimos, 2)), 15);
          v_baixa_valorOutrosAcrescimos := ROUND (
            b.valorOutrosAcrescimos * 
            CASE
              WHEN (p_confirm_valorTotalPago
              + p_confirm_valorDescontoInform
              - p_confirm_valorAcrescimoInform) = 0
              THEN 0
              ELSE
                CASE
                  WHEN (v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado) > (b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2))
                  THEN b.valorLiquido
                    - ROUND (b.valorJurosDeMora
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                        + p_confirm_valorDescontoInform
                        - p_confirm_valorAcrescimoInform)
                        + v_residuoJurosDeMora, 2)
                    - ROUND (b.valorMulta
                      * b.valorLiquido
                      / (p_confirm_valorTotalPago
                      + p_confirm_valorDescontoInform
                      - p_confirm_valorAcrescimoInform)
                      + v_residuoMulta, 2)
                  ELSE v_saldoBaixarPagamento
                    + v_saldoDescontoInformado
                    - v_saldoAcrescimoInformado
                END
                / (p_confirm_valorTotalPago
                  + p_confirm_valorDescontoInform
                  - p_confirm_valorAcrescimoInform)
            END
            + v_residuoOutrosAcrescimos, 2);
          v_novoResiduoDescontoInformado := v_residuoDescontoInformado;
          v_baixa_valorDescontoInformado := v_saldoDescontoInformado;
          v_novoResiduoAcrescimoInformad := v_residuoAcrescimoInformado;
          v_baixa_valorAcrescimoInformad := v_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 b.saldo = 0
              THEN 0
              ELSE b.saldoIndexado
                * v_baixa_valorBruto
                / b.saldo
            END
            + v_residuoValorBrutoIndexado
            -  ROUND (
              CASE
                WHEN b.saldo = 0
                THEN 0
                ELSE b.saldoIndexado
                  * v_baixa_valorBruto
                  / b.saldo
              END
              + v_residuoValorBrutoIndexado, 6)), 15);
          v_baixa_valorBrutoIndexado := ROUND (
            CASE
              WHEN b.saldo = 0
              THEN 0
              ELSE b.saldoIndexado
                * v_baixa_valorBruto
                / b.saldo
            END
            + v_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 v_somaValorLiquidado + v_baixa_valorLiquido <> p_confirm_valorTotalPago
            OR v_baixa_valorBruto > b.saldo
            OR v_baixa_valorLiquido <> v_saldoBaixarPagamento
            OR v_baixa_valorJurosTotal <> v_saldoJurosTotal
            OR v_baixa_valorMultaTotal <> v_saldoMultaTotal
            OR v_baixa_valorDescontoInformado <> v_saldoDescontoInformado
            OR v_baixa_valorAcrescimoInformad <> v_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 + v_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
                + v_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
              + v_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
              + v_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
                + v_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
              + v_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 > b.saldo
        THEN
          v_baixa_valorDescontoInformado := v_baixa_valorDescontoInformado - v_baixa_valorBruto + b.saldo;
          v_baixa_valorBruto := b.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 b.saldo = 0
              THEN 0
              ELSE b.saldoIndexado
                * v_baixa_valorBruto
                / b.saldo
            END
            + v_residuoValorBrutoIndexado
            -  ROUND (
              CASE
                WHEN b.saldo = 0
                THEN 0
                ELSE b.saldoIndexado
                  * v_baixa_valorBruto
                  / b.saldo
              END
              + v_residuoValorBrutoIndexado, 6)), 15);
          v_baixa_valorBrutoIndexado := ROUND (
            CASE
              WHEN b.saldo = 0
              THEN 0
              ELSE b.saldoIndexado
                * v_baixa_valorBruto
                / b.saldo
            END
            + v_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 b.situacaoContabilizacao = 'N'
          THEN
            IF v_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 b.estabelecimento
                  ELSE p_sys_estabelecimentoAtivo
                END, -- p_estabelecimento
                p_dataBaixa,
                'N', -- p_situacaoContabilizacao
                v_fatoContabilNaoContabilizar);
            END IF;
          ELSE
            IF v_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 b.estabelecimento
                  ELSE p_sys_estabelecimentoAtivo
                END, -- p_estabelecimento
                p_dataBaixa,
                'A', -- p_situacaoContabilizacao
                v_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 b.situacaoContabilizacao = 'N'
              THEN v_fatoContabilNaoContabilizar
              ELSE v_fatoContabilContabilizar
            END, -- p_fatoContabil
            b.id, -- p_idFinanceiro
            CASE
              WHEN p_config_226_baixarFinEstabOri = 1
              THEN b.estabelecimento
              ELSE p_sys_estabelecimentoAtivo
            END, -- p_estabelecimento
            p_dataBaixa,
            b.contaFinanceira,
            b.pagamentoRecebimento,
            CASE
              WHEN b.pagamentoRecebimento = 'P'
              THEN
                CASE
                  WHEN b.operacaoFinanceira = 31
                  THEN 74
                  ELSE 73
                END
              ELSE
                CASE
                  WHEN b.operacaoFinanceira = 71
                  THEN 34
                  ELSE 33
                END
            END, -- p_operacaoFinanceira
            b.cobranca,
            a.meioPagamento,
            CASE
              WHEN a.carteiraFinanceira > 0
              THEN a.carteiraFinanceira
              WHEN v_idsFinanceiroPagto IS NOT NULL
                AND v_idsFinanceiroPagto <> ' '
                AND v_carteiraFinanceiraPagto > 0
              THEN v_carteiraFinanceiraPagto
              WHEN a.idFinanceiroAdiantamento > 0
              THEN v_adiant_carteiraFinanceira
              ELSE b.carteiraFinanceira
            END, -- p_carteiraFinanceira
            b.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 v_idsFinanceiroPagto IS NOT NULL
                AND v_idsFinanceiroPagto <> ' '
              THEN 1
              ELSE 0
            END, -- p_unificadoReparcelado
            a.observacoes,
            v_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 a.meioPagamento < 50 THEN v_baixa_idBaixaFinanceiro ELSE b.pessoa END, 14, '0'),
            1);
          IF v_idsFinanceiroPagto IS NOT NULL
            AND v_idsFinanceiroPagto <> ' '
          THEN
            FOR b IN (
              SELECT TO_NUMBER (REGEXP_SUBSTR (v_idsFinanceiroPagto, '[^,]+', 1, LEVEL)) AS idFinanceiro
              FROM DUAL
              CONNECT BY LEVEL <= REGEXP_COUNT (v_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 v_idsFinanceiroTroco IS NOT NULL
            AND v_idsFinanceiroTroco <> ' '
          THEN
            FOR b IN (
              SELECT TO_NUMBER (REGEXP_SUBSTR(v_idsFinanceiroTroco, '[^,]+', 1, LEVEL)) AS idFinanceiro
              FROM DUAL
              CONNECT BY LEVEL <= REGEXP_COUNT (v_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 v_idsBaixaFinanceiroCheque IS NOT NULL
            AND v_idsBaixaFinanceiroCheque <> ' '
          THEN
            FOR b IN (
              SELECT TO_NUMBER (REGEXP_SUBSTR(v_idsBaixaFinanceiroCheque, '[^,]+', 1, LEVEL)) AS idBaixaFinanceiro
              FROM DUAL
              CONNECT BY LEVEL <= REGEXP_COUNT (v_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 = b.id;
          v_saldoBaixarPagamento      := v_saldoBaixarPagamento - v_baixa_valorLiquido;
          v_somaValorLiquidado        := v_somaValorLiquidado + v_baixa_valorLiquido;
          v_saldoJurosTotal           := v_saldoJurosTotal - v_baixa_valorJurosTotal;
          v_saldoMultaTotal           := v_saldoMultaTotal - v_baixa_valorMultaTotal;
          v_saldoDescontoInformado    := v_saldoDescontoInformado - v_baixa_valorDescontoInformado;
          v_saldoAcrescimoInformado   := v_saldoAcrescimoInformado - v_baixa_valorAcrescimoInformad;
          v_residuoValorBrutoIndexado := v_novoResiduoValorBrutoIndexad;
          v_residuoVariacaoIndexador  := v_novoResiduoVariacaoIndexador;
          v_residuoJurosDeMora        := v_novoResiduoJurosDeMora;
          v_residuoMulta              := v_novoResiduoMulta;
          v_residuoTarifaCartao       := v_novoResiduoTarifaCartao;
          v_residuoDescontos          := v_novoResiduoDescontos;
          v_residuoOutrosAcrescimos   := v_novoResiduoOutrosAcrescimos;
          v_residuoDescontoInformado  := v_novoResiduoDescontoInformado;
          v_residuoAcrescimoInformado := v_novoResiduoAcrescimoInformad;
        END IF;
      END IF;
    END LOOP;
    IF v_idsFinanceiroPagto IS NOT NULL
      AND v_idsFinanceiroPagto <> ' '
    THEN
      IF r_23_idsFinanceiro IS NULL
        OR r_23_idsFinanceiro = ' '
      THEN
        r_23_idsFinanceiro := v_idsFinanceiroPagto;
      ELSE
        r_23_idsFinanceiro := r_23_idsFinanceiro || ',' || v_idsFinanceiroPagto;
      END IF;
    END IF;
  END LOOP;
  IF r_idNegociacaoDivida <> 0 THEN
    UPDATE MONEGOCIACOESDIVIDAS
    SET situacaoAtendimento = 'E'
    WHERE idNegociacaoDivida = r_idNegociacaoDivida;
    r_idNegociacaoDivida := 0;
  END IF;
END ADD_FINANC_TEMPRECEBIMENTO_EF;

/

UPDATE SICONFIGURACOES SET tipoCampo = 'A', mascara = '256', exibirCampo = 'P' WHERE configuracao = 185;
UPDATE SICONFIGURACOES SET tipoCampo = 'A', mascara = '256', exibirCampo = 'P' WHERE configuracao = 186;

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (195, 'N', 'Não', 185, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (196, 'S', 'Simplificada', 185, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (197, 'C', 'Completa', 185, 1, 3, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (198, 'N', 'Não', 186, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (199, 'S', 'Simplificada', 186, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (200, 'C', 'Completa', 186, 1, 3, ' ');

COMMIT;

create or replace PROCEDURE ADD_FINANC_CARTAO_PROPR_GRAVA (
  p_idFinanceiro  IN NUMBER,
  p_cartaoProprio IN VARCHAR2)
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_ITEM_OPERACAO_FISCAL_BUSCA (
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_finalidadeNota           IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_vendaConsumidor          IN NUMBER,
  p_cab_enderecoEntregaPessoa    IN NUMBER,
  p_cab_municipioFatoGerador     IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_modDoc_movimentaEstoque      IN NUMBER,
  p_modDoc_geraFinanceiro        IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  p_endPess_enderecoPessoa       IN NUMBER,
  p_munEndPess_uf                IN CHAR,
  p_munEndEntr_uf                IN CHAR,
  p_item_operacaoFiscal          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_prod_tipoProduto             IN CHAR,
  p_prod_origemMercadoria        IN CHAR,
  p_prod_idNcm                   IN NUMBER,
  p_prod_listaServicos           IN NUMBER,
  p_movimentaEstoque             IN NUMBER,
  p_movimentaEstoqueFiscal       IN NUMBER,
  p_geraFinanceiro               IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_atualizarISSQN               IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR,
  p_atualizarRetencaoIRRF        IN NUMBER,
  p_item_retencaoIRRF            IN NUMBER,
  p_atualizarRetencaoINSS        IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_atualizarRetencaoPIS         IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_atualizarRetencaoCOFINS      IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_atualizarRetencaoCSLL        IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_atualizarRetencaoOutros      IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_atualizarII                  IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_atualizarIOF                 IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_atualizarIPI                 IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_atualizarPIS                 IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_atualizarPISST               IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_atualizarCOFINS              IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_atualizarCOFINSST            IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_atualizarSimplesNacional     IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_atualizarICMS                IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalidadeBaseCalcICMS  IN CHAR,
  p_item_reducaoBaseICMS         IN NUMBER,
  p_item_aliquotaICMS            IN NUMBER,
  p_item_diferimentoICMS         IN NUMBER,
  p_item_motivoDesoneracaoICMS   IN CHAR,
  p_item_idBeneficio             IN NUMBER,
  p_atualizarICMSST              IN NUMBER,
  p_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicST       IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_atualizarICMSSTAnteriorEfet  IN NUMBER,
  p_item_aliquotaSTSuportConsF   IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_atualizarICMSEscrituracao    IN NUMBER,
  p_item_stICMSEscrit            IN CHAR,
  p_item_reducaoBaseICMSEscrit   IN NUMBER,
  p_item_aliquotaICMSEscrit      IN NUMBER,
  p_atualizarICMSSTEscrituracao  IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscrit     IN NUMBER,
  p_item_aliquotaICMSSTEscrit    IN NUMBER,
  p_item_diferimentoICMSEscrit   IN NUMBER,
  p_item_somarICMSST             IN NUMBER,
  p_atualizarDIFAL               IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_atualizarFCP                 IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_atualizarImpostosEstimados   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  /* Retornos */
  r_encontrouRegistro            OUT NUMBER,
  r_movimentaEstoque             OUT NUMBER,
  r_movimentaEstoqueFiscal       OUT NUMBER,
  r_geraFinanceiro               OUT NUMBER,
  r_item_cfop                    OUT NUMBER,
  r_item_indicadorISSQN          OUT CHAR,
  r_item_aliquotaISSQN           OUT NUMBER,
  r_item_retidoISSQN             OUT NUMBER,
  r_item_tributadoForaMunicipio  OUT NUMBER,
  r_item_incentivoFiscal         OUT NUMBER,
  r_item_listaServicos           OUT NUMBER,
  r_item_cnae                    OUT NUMBER,
  r_item_idServicoMunicipio      OUT NUMBER,
  r_item_numeroProcessoAdministr OUT VARCHAR,
  r_item_retencaoIRRF            OUT NUMBER,
  r_item_retencaoINSS            OUT NUMBER,
  r_item_retencaoPIS             OUT NUMBER,
  r_item_retencaoCOFINS          OUT NUMBER,
  r_item_retencaoCSLL            OUT NUMBER,
  r_item_retencaoOutros          OUT NUMBER,
  r_item_aliquotaII              OUT NUMBER,
  r_item_aliquotaIOF             OUT NUMBER,
  r_item_codigoEnquadramentoIPI  OUT NUMBER,
  r_item_stIPI                   OUT CHAR,
  r_item_aliquotaIPI             OUT NUMBER,
  r_item_valorAliquotaIPI        OUT NUMBER,
  r_item_stPIS                   OUT CHAR,
  r_item_aliquotaPIS             OUT NUMBER,
  r_item_valorAliquotaPIS        OUT NUMBER,
  r_item_aliquotaPISST           OUT NUMBER,
  r_item_valorAliquotaPISST      OUT NUMBER,
  r_item_stCOFINS                OUT CHAR,
  r_item_aliquotaCOFINS          OUT NUMBER,
  r_item_valorAliquotaCOFINS     OUT NUMBER,
  r_item_aliquotaCOFINSST        OUT NUMBER,
  r_item_valorAliquotaCOFINSST   OUT NUMBER,
  r_item_stSimplesNacional       OUT CHAR,
  r_item_creditoSimplesNacional  OUT NUMBER,
  r_item_stICMS                  OUT CHAR,
  r_item_modalidadeBaseCalcICMS  OUT CHAR,
  r_item_reducaoBaseICMS         OUT NUMBER,
  r_item_aliquotaICMS            OUT NUMBER,
  r_item_diferimentoICMS         OUT NUMBER,
  r_item_motivoDesoneracaoICMS   OUT CHAR,
  r_item_idBeneficio             OUT NUMBER,
  r_item_modalBaseCalcICMSST     OUT CHAR,
  r_item_margemValorAdicST       OUT NUMBER,
  r_item_reducaoBaseST           OUT NUMBER,
  r_item_aliquotaICMSST          OUT NUMBER,
  r_item_aliquotaSTSuportConsF   OUT NUMBER,
  r_item_reducaoBaseICMSEfetivo  OUT NUMBER,
  r_item_aliquotaICMSEfetivo     OUT NUMBER,
  r_item_stICMSEscrit            OUT CHAR,
  r_item_reducaoBaseICMSEscrit   OUT NUMBER,
  r_item_aliquotaICMSEscrit      OUT NUMBER,
  r_item_margemValorAdicSTEscrit OUT NUMBER,
  r_item_reducaoBaseSTEscrit     OUT NUMBER,
  r_item_aliquotaICMSSTEscrit    OUT NUMBER,
  r_item_diferimentoICMSEscrit   OUT NUMBER,
  r_item_somarICMSST             OUT NUMBER,
  r_item_aliquotaICMSUFDestinat  OUT NUMBER,
  r_item_aliquotaICMSInterestad  OUT NUMBER,
  r_item_partilhaICMSInterestad  OUT NUMBER,
  r_item_aliquotaFCP             OUT NUMBER,
  r_item_aliquotaFCPST           OUT NUMBER,
  r_item_aliquotaFCPSTAnteriorm  OUT NUMBER,
  r_item_aliquotaFCPUFDestinat   OUT NUMBER,
  r_item_aliquotaEstImpFederais  OUT NUMBER,
  r_item_aliquotaEstImpEstaduais OUT NUMBER,
  r_item_aliquotaEstImpMunicipai OUT NUMBER)    
IS    
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2(60);  
  v_encontouDesoneracao          NUMBER;
  v_est_municipio                NUMBER;
      
BEGIN
  r_movimentaEstoque             := p_movimentaEstoque;
  r_movimentaEstoqueFiscal       := p_movimentaEstoqueFiscal;
  r_geraFinanceiro               := p_geraFinanceiro;
  r_item_cfop                    := p_item_cfop;
  r_item_indicadorISSQN          := p_item_indicadorISSQN;
  r_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  r_item_retidoISSQN             := p_item_retidoISSQN;
  r_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  r_item_incentivoFiscal         := p_item_incentivoFiscal;
  r_item_listaServicos           := p_item_listaServicos;
  r_item_cnae                    := p_item_cnae;
  r_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  r_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  r_item_retencaoIRRF            := p_item_retencaoIRRF;
  r_item_retencaoINSS            := p_item_retencaoINSS;
  r_item_retencaoPIS             := p_item_retencaoPIS;
  r_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  r_item_retencaoCSLL            := p_item_retencaoCSLL;
  r_item_retencaoOutros          := p_item_retencaoOutros;
  r_item_aliquotaII              := p_item_aliquotaII;
  r_item_aliquotaIOF             := p_item_aliquotaIOF;
  r_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  r_item_stIPI                   := p_item_stIPI;
  r_item_aliquotaIPI             := p_item_aliquotaIPI;
  r_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  r_item_stPIS                   := p_item_stPIS;
  r_item_aliquotaPIS             := p_item_aliquotaPIS;
  r_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  r_item_aliquotaPISST           := p_item_aliquotaPISST;
  r_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  r_item_stCOFINS                := p_item_stCOFINS;
  r_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  r_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  r_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  r_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  r_item_stSimplesNacional       := p_item_stSimplesNacional;
  r_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  r_item_stICMS                  := p_item_stICMS;
  r_item_modalidadeBaseCalcICMS  := p_item_modalidadeBaseCalcICMS;
  r_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  r_item_aliquotaICMS            := p_item_aliquotaICMS;
  r_item_diferimentoICMS         := p_item_diferimentoICMS;
  r_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  r_item_idBeneficio             := p_item_idBeneficio;
  r_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  r_item_margemValorAdicST       := p_item_margemValorAdicST;
  r_item_reducaoBaseST           := p_item_reducaoBaseST;
  r_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  r_item_aliquotaSTSuportConsF   := p_item_aliquotaSTSuportConsF;
  r_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  r_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  r_item_stICMSEscrit            := p_item_stICMSEscrit;
  r_item_reducaoBaseICMSEscrit   := p_item_reducaoBaseICMSEscrit;
  r_item_aliquotaICMSEscrit      := p_item_aliquotaICMSEscrit;
  r_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  r_item_reducaoBaseSTEscrit     := p_item_reducaoBaseSTEscrit;
  r_item_aliquotaICMSSTEscrit    := p_item_aliquotaICMSSTEscrit;
  r_item_diferimentoICMSEscrit   := p_item_diferimentoICMSEscrit;
  r_item_somarICMSST             := p_item_somarICMSST;
  r_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  r_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  r_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  r_item_aliquotaFCP             := p_item_aliquotaFCP;
  r_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  r_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  r_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  r_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  r_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  r_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  r_encontrouRegistro := 0;
  SELECT COALESCE (MAX (endPess.municipio), 0)
  INTO v_est_municipio
  FROM PAESTABELECIMENTOS est
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.pessoa = est.pessoaEstabelecimento
  WHERE est.estabelecimento = p_cab_estabelecimento
  AND endPess.principal = 1
  AND endPess.ativo = 1;
  FOR opFisc IN (
    SELECT
      opFisc.cfop,
      cfop.geraFinanceiro,
      COALESCE (opXMun.indicadorISSQN, '2') indicadorISSQN,
      COALESCE ((CASE WHEN COALESCE (opXMunFato.tributadoForaMunicipio, COALESCE (opXMun.tributadoForaMunicipio, 0)) = 1 THEN COALESCE (opXMunFato.aliquotaISSQN, opXMun.aliquotaISSQN) ELSE opXMun.aliquotaISSQN END), 0) aliquotaISSQN,
      COALESCE ((CASE WHEN COALESCE (opXMunFato.tributadoForaMunicipio, COALESCE (opXMun.tributadoForaMunicipio, 0)) = 1 THEN COALESCE (opXMunFato.retidoISSQN, opXMun.retidoISSQN) ELSE opXMun.retidoISSQN END), 0) retidoISSQN,
      COALESCE (opXMunFato.tributadoForaMunicipio, COALESCE (opXMun.tributadoForaMunicipio, 0)) tributadoForaMunicipio,
      COALESCE (opXMun.incentivoFiscal, 0) incentivoFiscal,
      COALESCE (opXMun.listaServicos, 0) listaServicos,
      COALESCE (opXMun.cnae, 0) cnae,
      CASE
        WHEN COALESCE (opXMun.idServicoMunicipio, 0) = 0
        THEN COALESCE ((
          SELECT MAX (servMunFato.idServicoMunicipio)
          FROM PASERVICOSMUNICIPIOS servMunFato
          WHERE servMunFato.municipioOrigem = v_est_municipio
          AND servMunFato.municipioDestino = p_cab_municipioFatoGerador
          AND servMunFato.ativo = 1), COALESCE ((
          SELECT MAX (servMunOrig.idServicoMunicipio)
          FROM PASERVICOSMUNICIPIOS servMunOrig
          WHERE servMunOrig.municipioOrigem = v_est_municipio
          AND servMunOrig.municipioDestino = 0
          AND servMunOrig.ativo = 1), 0))
        ELSE COALESCE (opXMun.idServicoMunicipio, 0)
      END idServicoMunicipio,
      COALESCE (opXMun.numeroProcessoAdministrativo, ' ') numeroProcessoAdministrativo,
      opFisc.retencaoIRRF,
      opFisc.retencaoINSS,
      opFisc.retencaoPIS,
      opFisc.retencaoCOFINS,
      opFisc.retencaoCSLL,
      opFisc.retencaoOutros,
      opFisc.aliquotaII,
      opFisc.aliquotaIOF,
      opFisc.codigoEnquadramentoIPI,
      opFisc.stIPI,
      opFisc.aliquotaIPI,
      opFisc.valorAliquotaIPI,
      opFisc.stPIS,
      opFisc.aliquotaPIS,
      opFisc.valorAliquotaPIS,
      opFisc.aliquotaPISST,
      opFisc.valorAliquotaPISST,
      opFisc.stCOFINS,
      opFisc.aliquotaCOFINS,
      opFisc.valorAliquotaCOFINS,
      opFisc.aliquotaCOFINSST,
      opFisc.valorAliquotaCOFINSST,
      opFisc.stSimplesNacional,
      opFisc.creditoSimplesNacional,
      opFisc.stICMS,
      opFisc.modalidadeBaseCalcICMS,
      opFisc.reducaoBaseICMS,
      opFisc.aliquotaICMS,
      opFisc.diferimentoICMS,
      opFisc.motivoDesoneracaoICMS,
      opFisc.idBeneficio,
      opFisc.modalidadeBaseCalcICMSST,
      opFisc.margemValorAdicionadoST,
      opFisc.reducaoBaseST,
      opFisc.aliquotaICMSST,
      opFisc.aliquotaSTSuportConsFinal,
      opFisc.reducaoBaseICMSEfetivo,
      opFisc.aliquotaICMSEfetivo,
      opFisc.aliquotaICMSUFDestinatario,
      opFisc.aliquotaICMSInterestadual,
      opFisc.partilhaICMSInterestadual,
      opFisc.aliquotaFCP,
      opFisc.aliquotaFCPST,
      opFisc.aliquotaFCPSTAnteriormente,
      opFisc.aliquotaFCPUFDestinatario
    FROM PAOPERACOESFISCAIS opFisc
    JOIN SICFOPS cfop
    ON cfop.cfop = opFisc.cfop
    LEFT JOIN PAOPERFISCALXMUNICIPIOS opXMun
    ON opXMun.operacaoFiscal = opFisc.operacaoFiscal
    AND opXMun.municipio = v_est_municipio
    AND opXMun.ativo = 1
    LEFT JOIN PAOPERFISCALXMUNICIPIOS opXMunFato
    ON opXMunFato.operacaoFiscal = opFisc.operacaoFiscal
    AND opXMunFato.municipio = p_cab_municipioFatoGerador
    AND opXMunFato.ativo = 1
    WHERE opFisc.operacaoFiscal = p_item_operacaoFiscal)
  LOOP
    IF p_buscarGeraFinanceiroEstoque = 1 OR p_cab_origemDocumento NOT IN (2,3,4,6,9,10,11,12,13) THEN
      r_movimentaEstoque       := p_modDoc_movimentaEstoque;
      r_movimentaEstoqueFiscal := p_modDoc_movimentaEstoque;
    END IF;
    IF p_buscarGeraFinanceiroEstoque = 1 OR p_cab_origemDocumento NOT IN (4,6,9,13) THEN
      r_geraFinanceiro := CASE WHEN p_modDoc_geraFinanceiro = 1 AND opFisc.geraFinanceiro = 1 THEN 1 ELSE 0 END;
    END IF;
    r_item_cfop := opFisc.cfop;
    IF p_atualizarISSQN = 1 THEN
      r_item_indicadorISSQN          := opFisc.indicadorISSQN;
      r_item_aliquotaISSQN           := opFisc.aliquotaISSQN;
      r_item_retidoISSQN             := opFisc.retidoISSQN;
      r_item_tributadoForaMunicipio  := opFisc.tributadoForaMunicipio;
      r_item_incentivoFiscal         := opFisc.incentivoFiscal;
      r_item_listaServicos           := opFisc.listaServicos;
      r_item_cnae                    := opFisc.cnae;
      r_item_idServicoMunicipio      := opFisc.idServicoMunicipio;
      r_item_numeroProcessoAdministr := opFisc.numeroProcessoAdministrativo;
    END IF;
    IF p_atualizarRetencaoIRRF = 1 THEN
      r_item_retencaoIRRF := opFisc.retencaoIRRF;
    END IF;
    IF p_atualizarRetencaoINSS = 1 THEN
      r_item_retencaoINSS := opFisc.retencaoINSS;
    END IF;
    IF p_atualizarRetencaoPIS = 1 THEN
      r_item_retencaoPIS := opFisc.retencaoPIS;
    END IF;
    IF p_atualizarRetencaoCOFINS = 1 THEN
      r_item_retencaoCOFINS := opFisc.retencaoCOFINS;
    END IF;
    IF p_atualizarRetencaoCSLL = 1 THEN
      r_item_retencaoCSLL := opFisc.retencaoCSLL;
    END IF;
    IF p_atualizarRetencaoOutros = 1 THEN
      r_item_retencaoOutros := opFisc.retencaoOutros;
    END IF;
    IF p_atualizarII = 1 THEN
      r_item_aliquotaII := opFisc.aliquotaII;
    END IF;
    IF p_atualizarIOF = 1 THEN
      r_item_aliquotaIOF := opFisc.aliquotaIOF;
    END IF;
    IF p_atualizarIPI = 1 THEN
      r_item_codigoEnquadramentoIPI := opFisc.codigoEnquadramentoIPI;
      r_item_stIPI                  := opFisc.stIPI;
      r_item_aliquotaIPI            := opFisc.aliquotaIPI;
      r_item_valorAliquotaIPI       := opFisc.valorAliquotaIPI;
    END IF;
    IF p_atualizarPIS = 1 THEN
      r_item_stPIS            := opFisc.stPIS;
      r_item_aliquotaPIS      := opFisc.aliquotaPIS;
      r_item_valorAliquotaPIS := opFisc.valorAliquotaPIS;
    END IF;
    IF p_atualizarPISST = 1 THEN
      r_item_aliquotaPISST      := opFisc.aliquotaPISST;
      r_item_valorAliquotaPISST := opFisc.valorAliquotaPISST;
    END IF;
    IF p_atualizarCOFINS = 1 THEN
      r_item_stCOFINS            := opFisc.stCOFINS;
      r_item_aliquotaCOFINS      := opFisc.aliquotaCOFINS;
      r_item_valorAliquotaCOFINS := opFisc.valorAliquotaCOFINS;
    END IF;
    IF p_atualizarCOFINSST = 1 THEN
      r_item_aliquotaCOFINSST      := opFisc.aliquotaCOFINSST;
      r_item_valorAliquotaCOFINSST := opFisc.valorAliquotaCOFINSST;
    END IF;
    IF p_atualizarSimplesNacional = 1 THEN
      r_item_stSimplesNacional      := opFisc.stSimplesNacional;
      r_item_creditoSimplesNacional := opFisc.creditoSimplesNacional;
    END IF;
    IF p_atualizarICMS = 1 THEN
      r_item_stICMS := opFisc.stICMS;
      ADD_ITEM_DESON_FISCAL_BUSCA (
        p_cab_tipoDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_pessoa,
        p_cab_vendaConsumidor,
        p_munEndEst_uf,
        p_munEndPess_uf,
        r_item_stICMS,
        p_gradProd_produto,
        p_prod_origemMercadoria,
        p_prod_idNcm,
        /* Retornos */
        v_encontouDesoneracao,
        r_item_modalidadeBaseCalcICMS,
        r_item_reducaoBaseICMS,
        r_item_aliquotaICMS,
        r_item_diferimentoICMS,
        r_item_motivoDesoneracaoICMS,
        r_item_idBeneficio,
        v_auxNumber);
      IF v_encontouDesoneracao = 0 THEN
        r_item_modalidadeBaseCalcICMS := opFisc.modalidadeBaseCalcICMS;
        r_item_reducaoBaseICMS        := opFisc.reducaoBaseICMS;
        r_item_aliquotaICMS           := opFisc.aliquotaICMS;
        r_item_diferimentoICMS        := opFisc.diferimentoICMS;
        r_item_motivoDesoneracaoICMS  := opFisc.motivoDesoneracaoICMS;
        r_item_idBeneficio            := opFisc.idBeneficio;
      ELSIF opFisc.idBeneficio <> 0 THEN
        r_item_idBeneficio            := opFisc.idBeneficio;
      END IF;
      IF r_item_aliquotaICMS = 0 AND r_item_stICMS in ('00','10','20','70') THEN
        SELECT COALESCE(MAX(aliquotaIcms),0)
        INTO r_item_aliquotaICMS
        FROM PAUFORIGEMXUFDESTINO
        WHERE ufOrigem =
          CASE
            WHEN p_cab_entradaSaida  = 'S'
            OR p_munEndPess_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_cab_tipoDocumento IN (503,504)
            THEN p_munEndEst_uf
            ELSE p_munEndPess_uf
          END
        AND ufDestino =
          CASE
            WHEN p_cab_entradaSaida  = 'E'
            OR p_munEndPess_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_cab_tipoDocumento IN (503,504)
            THEN p_munEndEst_uf
            ELSE p_munEndPess_uf
          END;
      END IF;
    END IF;
    IF p_atualizarICMSST = 1 THEN
      r_item_modalBaseCalcICMSST := opFisc.modalidadeBaseCalcICMSST;
      r_item_margemValorAdicST   := opFisc.margemValorAdicionadoST;
      r_item_reducaoBaseST       := opFisc.reducaoBaseST;
      r_item_aliquotaICMSST      := opFisc.aliquotaICMSST;
      r_item_somarICMSST         := 1;
    END IF;
    IF p_atualizarICMSSTAnteriorEfet = 1 THEN
      r_item_aliquotaSTSuportConsF  := opFisc.aliquotaSTSuportConsFinal;
      r_item_reducaoBaseICMSEfetivo := opFisc.reducaoBaseICMSEfetivo;
      r_item_aliquotaICMSEfetivo    := opFisc.aliquotaICMSEfetivo;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_stICMSEscrit          := CASE WHEN p_cab_nfFornecedor = 1 AND p_prod_tipoProduto IN('07','08') THEN '90' WHEN p_cab_nfFornecedor = 1 AND r_item_stICMS IN('10','30','70') OR p_cab_nfFornecedor = 1 AND r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN '60' WHEN r_item_stICMS <> ' ' THEN r_item_stICMS WHEN r_item_stSimplesNacional IN ('101','102') AND r_item_reducaoBaseICMS = 0 THEN '00' WHEN r_item_stSimplesNacional IN ('101','102') THEN '20' WHEN r_item_stSimplesNacional IN ('103','300') THEN '40' WHEN r_item_stSimplesNacional IN ('201','202','203') AND r_item_reducaoBaseICMS = 0 THEN '10' WHEN r_item_stSimplesNacional IN ('201','202','203') THEN '70' WHEN r_item_stSimplesNacional = '400' THEN '41' ELSE '90' END;
      r_item_reducaoBaseICMSEscrit := CASE WHEN p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','70') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203')) OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN 0 WHEN r_item_stICMS <> ' ' THEN r_item_reducaoBaseICMS ELSE 0 END;
      r_item_aliquotaICMSEscrit    := CASE WHEN p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','70') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203')) OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN 0 WHEN r_item_stICMS <> ' ' THEN r_item_aliquotaICMS WHEN r_item_stSimplesNacional IN ('101','201') THEN r_item_creditoSimplesNacional ELSE 0 END;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_margemValorAdicSTEscrit := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_margemValorAdicST END;
      r_item_reducaoBaseSTEscrit     := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_reducaoBaseST END;
      r_item_aliquotaICMSSTEscrit    := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_aliquotaICMSST END;
      r_item_diferimentoICMSEscrit   := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_diferimentoICMS END;
    END IF;
    IF p_atualizarDIFAL = 1 THEN
      IF p_cab_entradaSaida='S'
        AND NOT(p_cab_finalidadeNota IN('2','3'))
        AND p_cab_localDestinoOperacao = '2'
        AND p_cab_indicadorConsumidorFinal = '1'
        AND p_pess_indicadorInscricaoEstad = '9'
        AND (p_cab_pessoa = 0
          OR p_cab_vendaConsumidor = 1
          OR p_cab_enderecoEntregaPessoa = p_endPess_enderecoPessoa
          OR p_munEndEntr_uf <> p_munEndEst_uf)
        AND NOT (r_item_cfop IN(6552,6922,6929))
        AND (p_prod_tipoProduto <> '09'
          OR r_item_indicadorISSQN NOT IN ('1','2','3','4','5','6','7'))
        AND r_item_stSimplesNacional NOT IN ('300','400')
        AND r_item_stICMS NOT IN ('10','40','41','90') THEN
        r_item_aliquotaICMSUFDestinat := opFisc.aliquotaICMSUFDestinatario;
        r_item_aliquotaICMSInterestad := opFisc.aliquotaICMSInterestadual;
        r_item_partilhaICMSInterestad := opFisc.partilhaICMSInterestadual;
        IF r_item_aliquotaICMSUFDestinat = 0
          AND r_item_aliquotaICMSInterestad = 0
          AND r_item_partilhaICMSInterestad = 0
          AND (r_item_stSimplesNacional = ''
            OR r_item_stSimplesNacional = ' '
            OR r_item_stSimplesNacional = '  '
            OR r_item_stSimplesNacional = '   ')
        THEN
          SELECT COALESCE(MAX(aliquotaIcms),0)
          INTO r_item_aliquotaICMSUFDestinat
          FROM PAUFORIGEMXUFDESTINO
          WHERE ufOrigem = p_munEndPess_uf
          AND ufDestino = p_munEndPess_uf;
          IF p_prod_origemMercadoria = '0' THEN
            SELECT COALESCE(MAX(aliquotaIcms),0)
            INTO r_item_aliquotaICMSInterestad
            FROM PAUFORIGEMXUFDESTINO
            WHERE ufOrigem = p_munEndEst_uf
            AND ufDestino = p_munEndPess_uf;
          ELSE
            r_item_aliquotaICMSInterestad := 4;
          END IF;
          r_item_partilhaICMSInterestad := 100;
        END IF;
      ELSE
        r_item_aliquotaICMSUFDestinat := 0;
        r_item_aliquotaICMSInterestad := 0;
        r_item_partilhaICMSInterestad := 0;
      END IF;
    END IF;
    IF p_atualizarFCP = 1 THEN
      r_item_aliquotaFCP            := opFisc.aliquotaFCP;
      r_item_aliquotaFCPST          := opFisc.aliquotaFCPST;
      r_item_aliquotaFCPSTAnteriorm := opFisc.aliquotaFCPSTAnteriormente;
      r_item_aliquotaFCPUFDestinat  := opFisc.aliquotaFCPUFDestinatario;
    END IF;
    r_encontrouRegistro := 1;
  END LOOP;  
  IF r_encontrouRegistro = 1 THEN
    IF p_atualizarImpostosEstimados = 1 THEN
      r_item_aliquotaEstImpFederais  := 0;
      r_item_aliquotaEstImpEstaduais := 0;
      r_item_aliquotaEstImpMunicipai := 0;
      IF p_cab_entradaSaida = 'S' AND p_cab_devolucaoAnulacaoRetorno = 0 THEN
        ADD_BUSCA_IBPT (
          p_cab_dataEmissao,
          p_munEndEst_uf,
          p_prod_origemMercadoria,
          p_prod_idNcm,
          p_prod_listaServicos,
          /* Retornos */
          v_auxNumber,
          v_auxNumber,
          r_item_aliquotaEstImpFederais,
          r_item_aliquotaEstImpEstaduais,
          r_item_aliquotaEstImpMunicipai,
          v_auxVarchar,
          v_auxVarchar,
          v_auxVarchar
        );
      END IF;
    END IF;
  ELSE
    IF p_cab_origemDocumento NOT IN (2,3,4,6,9,10,11,12) THEN
      r_movimentaEstoque       := p_modDoc_movimentaEstoque;
      r_movimentaEstoqueFiscal := p_modDoc_movimentaEstoque;
      r_geraFinanceiro         := p_modDoc_geraFinanceiro;
    END IF;
    r_item_cfop := 0;
    IF p_atualizarISSQN = 1 THEN
      r_item_indicadorISSQN          := ' ';
      r_item_aliquotaISSQN           := 0;
      r_item_retidoISSQN             := 0;
      r_item_tributadoForaMunicipio  := 0;
      r_item_incentivoFiscal         := 0;
      r_item_listaServicos           := 0;
      r_item_cnae                    := 0;
      r_item_idServicoMunicipio      := 0;
      r_item_numeroProcessoAdministr := ' ';
    END IF;
    IF p_atualizarRetencaoIRRF = 1 THEN
      r_item_retencaoIRRF := 0;
    END IF;
    IF p_atualizarRetencaoINSS = 1 THEN
      r_item_retencaoINSS := 0;
    END IF;
    IF p_atualizarRetencaoPIS = 1 THEN
      r_item_retencaoPIS := 0;
    END IF;
    IF p_atualizarRetencaoCOFINS = 1 THEN
      r_item_retencaoCOFINS := 0;
    END IF;
    IF p_atualizarRetencaoCSLL = 1 THEN
      r_item_retencaoCSLL := 0;
    END IF;
    IF p_atualizarRetencaoOutros = 1 THEN
      r_item_retencaoOutros := 0;
    END IF;
    IF p_atualizarII = 1 THEN
      r_item_aliquotaII := 0;
    END IF;
    IF p_atualizarIOF = 1 THEN
      r_item_aliquotaIOF := 0;
    END IF;
    IF p_atualizarIPI = 1 THEN
      r_item_codigoEnquadramentoIPI := 0;
      r_item_stIPI            := '  ';
      r_item_aliquotaIPI      := 0;
      r_item_valorAliquotaIPI := 0;
    END IF;
    IF p_atualizarPIS = 1 THEN
      r_item_stPIS            := '  ';
      r_item_aliquotaPIS      := 0;
      r_item_valorAliquotaPIS := 0;
    END IF;
    IF p_atualizarPISST = 1 THEN
      r_item_aliquotaPISST      := 0;
      r_item_valorAliquotaPISST := 0;
    END IF;
    IF p_atualizarCOFINS = 1 THEN
      r_item_stCOFINS            := '  ';
      r_item_aliquotaCOFINS      := 0;
      r_item_valorAliquotaCOFINS := 0;
    END IF;
    IF p_atualizarCOFINSST = 1 THEN
      r_item_aliquotaCOFINSST      := 0;
      r_item_valorAliquotaCOFINSST := 0;
    END IF;
    IF p_atualizarSimplesNacional = 1 THEN
      r_item_stSimplesNacional      := '   ';
      r_item_creditoSimplesNacional := 0;
    END IF;
    IF p_atualizarICMS = 1 THEN
      r_item_stICMS                 := '  ';
      r_item_modalidadeBaseCalcICMS := ' ';
      r_item_reducaoBaseICMS        := 0;
      r_item_aliquotaICMS           := 0;
      r_item_diferimentoICMS        := 0;
      r_item_motivoDesoneracaoICMS  := '  ';
      r_item_idBeneficio            := 0;
    END IF;
    IF p_atualizarICMSST = 1 THEN
      r_item_modalBaseCalcICMSST := ' ';
      r_item_margemValorAdicST   := 0;
      r_item_reducaoBaseST       := 0;
      r_item_aliquotaICMSST      := 0;
      r_item_somarICMSST         := 0;
    END IF;
    IF p_atualizarICMSSTAnteriorEfet = 1 THEN
      r_item_aliquotaSTSuportConsF  := 0;
      r_item_reducaoBaseICMSEfetivo := 0;
      r_item_aliquotaICMSEfetivo    := 0;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_stICMSEscrit          := '  ';
      r_item_reducaoBaseICMSEscrit := 0;
      r_item_aliquotaICMSEscrit    := 0;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_margemValorAdicSTEscrit := 0;
      r_item_reducaoBaseSTEscrit     := 0;
      r_item_aliquotaICMSSTEscrit    := 0;
      r_item_diferimentoICMSEscrit   := 0;
    END IF;
    IF p_atualizarDIFAL = 1 THEN
      r_item_aliquotaICMSUFDestinat := 0;
      r_item_aliquotaICMSInterestad := 0;
      r_item_partilhaICMSInterestad := 0;
    END IF;
    IF p_atualizarFCP = 1 THEN
      r_item_aliquotaFCP            := 0;
      r_item_aliquotaFCPST          := 0;
      r_item_aliquotaFCPSTAnteriorm := 0;
      r_item_aliquotaFCPUFDestinat  := 0;
    END IF;
    IF p_atualizarImpostosEstimados = 1 THEN
      r_item_aliquotaEstImpFederais  := 0;
      r_item_aliquotaEstImpEstaduais := 0;
      r_item_aliquotaEstImpMunicipai := 0;
    END IF;
  END IF;
END ADD_ITEM_OPERACAO_FISCAL_BUSCA;

/

-- SISITUACOESWEBSERVICE
CREATE TABLE SISITUACOESWEBSERVICE
  (
    situacaoWebService CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao          NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao          VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SISITUACOESWEBSERVICE ADD CONSTRAINT SISITUACOESWEBSERVICE_PK1 PRIMARY KEY (situacaoWebService);
CREATE INDEX SISITUACOESWEBSERVICE_K2 ON SISITUACOESWEBSERVICE (descricao);
CREATE INDEX SISITUACOESWEBSERVICE_K3 ON SISITUACOESWEBSERVICE (ordenacao, situacaoWebService);

INSERT INTO SISITUACOESWEBSERVICE (situacaoWebService, ordenacao, descricao, ativo, observacoes) values (' ', 0, 'SELECIONE', 1, ' ');
INSERT INTO SISITUACOESWEBSERVICE (situacaoWebService, ordenacao, descricao, ativo, observacoes) values ('P', 1, 'Pendente', 1, ' ');
INSERT INTO SISITUACOESWEBSERVICE (situacaoWebService, ordenacao, descricao, ativo, observacoes) values ('S', 2, 'Sucesso', 1, ' ');
INSERT INTO SISITUACOESWEBSERVICE (situacaoWebService, ordenacao, descricao, ativo, observacoes) values ('F', 3, 'Falha', 1, ' ');
INSERT INTO SISITUACOESWEBSERVICE (situacaoWebService, ordenacao, descricao, ativo, observacoes) values ('C', 4, 'Cancelado', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SISITUACOESWEBSERVICE', 'Situações Web Service', 1, 534, 'SI', 'situacaoWebService', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesWebService', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (993, 'Situações Web Service', 1, 9090009930, 90, 'SIS', 0, 993, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesWebService', ' ', 0, 0, NULL, ' ');

COMMIT;

-- MOWEBSERVICEREQUISICOES
CREATE TABLE MOWEBSERVICEREQUISICOES
  (
    idWebServiceRequisicao NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataCriacao            DATE,
    servicoWebService      VARCHAR (60) DEFAULT ' ' NOT NULL,
    situacaoWebService     CHAR (1) DEFAULT ' ' NOT NULL,
    dataProcessamento      DATE,
    observacoes            VARCHAR (4000) DEFAULT ' ' NOT NULL,
    conteudo               CLOB
  );
ALTER TABLE MOWEBSERVICEREQUISICOES ADD CONSTRAINT MOWEBSERVICEREQUISICOES_PK1 PRIMARY KEY (idWebServiceRequisicao);
CREATE INDEX MOWEBSERVICEREQUISICOES_K2 ON MOWEBSERVICEREQUISICOES (dataCriacao DESC);
CREATE INDEX MOWEBSERVICEREQUISICOES_K3 ON MOWEBSERVICEREQUISICOES (situacaoWebService);
ALTER TABLE MOWEBSERVICEREQUISICOES ADD CONSTRAINT MOWEBSERVICEREQUISICOES_FK1 FOREIGN KEY (situacaoWebService) REFERENCES SISITUACOESWEBSERVICE (situacaoWebService);

INSERT INTO MOWEBSERVICEREQUISICOES (idWebServiceRequisicao, dataCriacao, servicoWebService, situacaoWebService, dataProcessamento, observacoes, conteudo) VALUES (0, NULL, ' ', ' ', NULL, ' ', NULL);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOWEBSERVICEREQUISICOES', 'WEB Service Requisições', 1, 50410, 'MO', 'idWebServiceRequisicao', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

create or replace PROCEDURE ADD_WEB_SERVICE_REQUIS_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idWebServiceRequisicao    IN NUMBER,
  p_dataCriacao               IN DATE,
  p_servicoWebService         IN VARCHAR2,
  p_situacaoWebService        IN CHAR,
  p_dataProcessamento         IN DATE,
  p_observacoes               IN VARCHAR2,
  p_conteudo                  IN CLOB,
  r_idWebServiceRequisicao    OUT NUMBER)
IS
BEGIN
  r_idWebServiceRequisicao := p_idWebServiceRequisicao;
  IF r_idWebServiceRequisicao = 0 THEN
    r_idWebServiceRequisicao := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOWEBSERVICEREQUISICOES',
      'idWebServiceRequisicao',
      14);
  END IF;
  MERGE INTO MOWEBSERVICEREQUISICOES a 
  USING (
    SELECT
      r_idWebServiceRequisicao idWebServiceRequisicao,
      p_dataCriacao            dataCriacao,
      p_servicoWebService      servicoWebService,
      p_situacaoWebService     situacaoWebService,
      p_dataProcessamento      dataProcessamento,
      p_observacoes            observacoes,
      p_conteudo               conteudo
    FROM DUAL) b
  ON (a.idWebServiceRequisicao = b.idWebServiceRequisicao)
  WHEN MATCHED THEN UPDATE SET
    a.dataCriacao        = b.dataCriacao,
    a.servicoWebService  = b.servicoWebService,
    a.situacaoWebService = b.situacaoWebService,
    a.dataProcessamento  = b.dataProcessamento,
    a.observacoes        = b.observacoes,
    a.conteudo           = b.conteudo
  WHEN NOT MATCHED THEN INSERT (
    idWebServiceRequisicao,
    dataCriacao,
    servicoWebService,
    situacaoWebService,
    dataProcessamento,
    observacoes,
    conteudo)
  VALUES (
    b.idWebServiceRequisicao,
    b.dataCriacao,
    b.servicoWebService,
    b.situacaoWebService,
    b.dataProcessamento,
    b.observacoes,
    b.conteudo);
END ADD_WEB_SERVICE_REQUIS_GRAVA;

/

create or replace FUNCTION FUNC_ADD_LINK_PAGAMENTO_JSON (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_docFis_PreD_Orc_Efef_Fin_Bai IN CHAR,
  p_estabelecimento              IN NUMBER,
  p_transacaoLinkPagamento       IN VARCHAR,
  p_pedidoLinkPagamento          IN VARCHAR,
  p_condicaoPagamento            IN NUMBER,
  p_baixa_atraso                 IN NUMBER,
  p_valorLiquido                 IN NUMBER)
  RETURN CLOB
IS
  v_json                 CLOB;
  v_categoriaAnterior    VARCHAR (30);
  v_categoria            VARCHAR (30);
  v_subCategoriaAnterior VARCHAR (30);
  v_subCategoria         VARCHAR (30);
  v_nomeCampo            VARCHAR (30);
BEGIN
  v_json := '{';
  FOR estXLink IN (
    SELECT
      chaveEstabLinkPag,
      codigoEstabLinkPag,
      nomeEstabLinkPag,
      mccEstabLinkPag,
      subadquirenteEstabLinkPag
    FROM PAESTABELECIMENTOXLINKPAG
    WHERE estabelecimento = p_estabelecimento)
  LOOP
    v_json := v_json || '
    "merchant_id": "' || estXLink.codigoEstabLinkPag || '",
    "merchant_key": "' || estXLink.chaveEstabLinkPag || '",';
    IF estXLink.nomeEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "soft_descriptor": "' || estXLink.nomeEstabLinkPag || '",';
    END IF;
    IF estXLink.mccEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "mcc": "' || estXLink.mccEstabLinkPag || '",';
    END IF;
    IF estXLink.subadquirenteEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "subacquirer_merchant_id": "' || estXLink.subadquirenteEstabLinkPag || '",';
    END IF;
  END LOOP;
  IF p_transacaoLinkPagamento <> ' ' THEN
    v_json := v_json || '
    "merchant_usn": "' || p_transacaoLinkPagamento || '",';
  END IF;
  IF p_pedidoLinkPagamento <> ' ' THEN
    v_json := v_json || '
    "order_id": "' || p_pedidoLinkPagamento || '",';
  END IF;
  v_json := v_json || '
    "amount": "' || REPLACE (REPLACE (TO_CHAR (p_valorLiquido, 'FM9999999999990D00'), ',', ''), '.', '') || '"';
  FOR regraLink IN (
    SELECT
      regraLink.idRegraLinkPagamento
    FROM (
      SELECT
        regraLink.idRegraLinkPagamento,
        ROW_NUMBER() OVER (
          ORDER BY
            regraLink.ordenacao,
            regraLink.condicaoPagamento,
            regraLink.usuario,
            regraLink.perfilUsuario,
            regraLink.estabelecimento,
            regraLink.atrasoDe,
            regraLink.atrasoAte,
            regraLink.idRegraLinkPagamento) ordenacao
      FROM PAREGRASLINKPAGAMENTO regraLink
      WHERE regraLink.idRegraLinkPagamento > 0
      AND regraLink.ativo = 1
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai = 'B'
        OR regraLink.validoVenda = 1)
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai <> 'B'
        OR regraLink.validoRecebimento = 1)
      AND (regraLink.condicaoPagamento = 0
        OR regraLink.condicaoPagamento = p_condicaoPagamento)
      AND (regraLink.usuario = 0
        OR regraLink.usuario = p_sys_usuarioLogado)
      AND (regraLink.perfilUsuario = 0
        OR regraLink.perfilUsuario = p_sys_perfilUsuarioLogado)
      AND (regraLink.estabelecimento = 0
        OR regraLink.estabelecimento = p_estabelecimento)
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai <> 'B'
        OR regraLink.atrasoDe <= p_baixa_atraso
        AND regraLink.atrasoAte >= p_baixa_atraso)) regraLink
    WHERE regraLink.ordenacao = 1)
  LOOP
    v_categoriaAnterior    := ' ';
    v_categoria            := ' ';
    v_subCategoriaAnterior := ' ';
    v_subCategoria         := ' ';
    v_nomeCampo            := ' ';
    FOR campRegr IN (
      SELECT
        campRegr.campoLinkPagamento,
        campLink.descricao,
        campRegr.conteudo
      FROM PAREGRALINKPAGAMXCAMPOS campRegr
      JOIN SICAMPOSLINKPAGAMENTO campLink
      ON campLink.campoLinkPagamento = campRegr.campoLinkPagamento
      WHERE campRegr.idRegraLinkPagamento = regraLink.idRegraLinkPagamento
      ORDER BY
        campRegr.campoLinkPagamento,
        campRegr.conteudo)
    LOOP
      IF INSTR (campRegr.descricao, '\') > 0 THEN
        v_categoria := TRIM (REGEXP_SUBSTR (campRegr.descricao, '[^\]+', 1, 1));
        IF INSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '\') > 0 THEN
          v_subCategoria := TRIM (REGEXP_SUBSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '[^\]+', 1, 1));
          v_nomeCampo    := TRIM (REGEXP_SUBSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '[^\]+', 1, 2));
        ELSE
          v_subCategoria := ' ';
          v_nomeCampo    := TRIM (REGEXP_SUBSTR (campRegr.descricao, '[^\]+', 1, 2));
        END IF;
      ELSE
        v_categoria    := ' ';
        v_subCategoria := ' ';
        v_nomeCampo    := campRegr.descricao;
      END IF;
      IF v_categoriaAnterior <> v_categoria THEN
        IF v_categoriaAnterior <> ' ' THEN
          IF v_subCategoriaAnterior <> ' ' THEN
            v_json := v_json || '
        ]';
          END IF;
          v_json := v_json || '
    },';
        ELSE
          v_json := v_json || ',';
        END IF;
        IF v_categoria <> ' ' THEN
          v_json := v_json || '
    "' || v_categoria || '": {';
          IF v_subCategoria <> ' ' THEN
          v_json := v_json || '
        "' || v_subCategoria || '":[';
          END IF;
        END IF;
      ELSIF v_subCategoriaAnterior <> v_subCategoria THEN
        IF v_subCategoriaAnterior <> ' ' THEN
          v_json := v_json || '
        ],';
        ELSE
          v_json := v_json || ',';
        END IF;
        IF v_subCategoria <> ' ' THEN
        v_json := v_json || '
        "' || v_subCategoria || '":[';
        END IF;
      END IF;
      IF v_categoria = v_categoriaAnterior AND v_subCategoria = v_subCategoriaAnterior THEN
        v_json := v_json || ',';
      END IF;
      IF v_subCategoria <> ' ' THEN
        v_json := v_json || '
            {"' || v_nomeCampo || '": "' || campRegr.conteudo || '"}';
      ELSIF v_categoria <> ' ' THEN
        v_json := v_json || '
        "' || v_nomeCampo || '": "' || campRegr.conteudo || '"';
      ELSE
        v_json := v_json || '
    "' || v_nomeCampo || '": "' || campRegr.conteudo || '"';
      END IF;
    v_categoriaAnterior    := v_categoria;
    v_subCategoriaAnterior := v_subCategoria;
    END LOOP;
    IF v_subCategoria <> ' ' THEN
      v_json := v_json || '
        ]';
    END IF;
    IF v_categoria <> ' ' THEN
      v_json := v_json || '
    }';
    END IF;
  END LOOP;
  v_json := v_json || '
}';
  RETURN v_json;
END;

/

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (440, 'Permite utilizar "Link de Pagamento" no recebimento crediário', 1, 40003, 'L', '1', 'E', 0, 'N', ' ', ' ');

COMMIT;

UPDATE SIMEIOSPAGAMENTO SET validoBaixa = 1 WHERE meioPagamento = 40;

COMMIT;

create or replace PROCEDURE ADD_GERA_TEMP_INVENTARIO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_335_cmvGerencIgualFis IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoFiscal         IN NUMBER,
  p_contadorSessaoGerencial      IN NUMBER,
  p_gerandoInventario            IN NUMBER,
  p_buscarPrecoUnitarioCMV       IN NUMBER,
  p_buscarPrecoUnitUltimaCompra  IN NUMBER,
  p_buscarPrecoCustoUltimaCompra IN NUMBER,
  p_buscarPrecoCustoUltimaFormac IN NUMBER,
  p_buscarICMS                   IN NUMBER,
  p_invEst_data                  IN DATE,
  p_invEst_motivoInventario      IN CHAR,
  p_inEstabelecimentos           IN VARCHAR2,
  p_produto                      IN NUMBER,
  p_prod_join                    IN VARCHAR2,
  p_prod_andWhere                IN VARCHAR2,
  p_filtroProduto                IN NUMBER,
  p_inventario_join              IN VARCHAR2,
  p_inventario_andWhere          IN VARCHAR2,
  p_movimentos_join              IN VARCHAR2,
  p_movimentos_andWhere          IN VARCHAR2,
  p_docFiscal_join               IN VARCHAR2,
  p_docFiscal_andWhere           IN VARCHAR2,
  p_docFiscalFilho_join          IN VARCHAR2,
  p_docFiscalFilho_andWhere      IN VARCHAR2,
  p_transfPendente_considerar    IN NUMBER,
  p_transfPendente_joinEntradas  IN VARCHAR2,
  p_transfPendente_andWhereEntra IN VARCHAR2,
  p_transfPendente_joinSaidas    IN VARCHAR2,
  p_transfPendente_andWhereSaida IN VARCHAR2)
IS
  v_prod_join     CLOB;
  v_prod_andWhere CLOB;
BEGIN
  v_prod_join := '
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_prod_join IS NULL OR p_prod_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_prod_join)
   END
|| CASE
     WHEN p_produto <> 0 OR p_filtroProduto = 0
     THEN ''
     ELSE '
    JOIN PAFILTROSPRODUTO filtrProd
    ON filtrProd.filtroProduto = ' || TO_CHAR(p_filtroProduto)
   END;
  v_prod_andWhere := '
      AND gradProd.produto '
|| CASE
     WHEN  p_produto = 0
     THEN '> 0'
       || CASE
            WHEN p_prod_andWhere IS NULL OR p_prod_andWhere = ' '
            THEN '
    AND prod.controleEstoque IN (1,5,11,12,13)'
            ELSE '
    ' || RTRIM(p_prod_andWhere)
          END
       || CASE
            WHEN p_filtroProduto = 0
            THEN ''
            ELSE '
    AND filtrProd.filtrarVendedores              = 0
    AND filtrProd.filtrarLocaisEstoque           = 0
    AND filtrProd.filtrarPersonalizacoes         = 0
    AND (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 = prod.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
          JOIN PASUBCATEGORIASPRODUTO subCatX
          ON subCatX.categoriaProduto = filtrProdX.categoriaProduto
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND subCatX.subcategoriaProduto = prod.subcategoriaProduto
          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
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.cor = gradProd.Cor
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.tamanho = gradProd.tamanho
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.idNcm = 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)))'
          END
     ELSE ' = ' || TO_CHAR(p_produto)
   END;
  IF p_contadorSessaoFiscal <> 0 THEN
    DELETE TEMPINVENTARIOESTXFISCAL
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoFiscal;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXFISCAL (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  produto,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  quantidade,
  precoUnitarioCMV,
  stICMS,
  baseICMS,
  valorICMS)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXFISC AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      gradProd.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          gradProd.produto
        ORDER BY
          invEst.estabelecimento ASC,
          gradProd.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXFISC itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE ((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'',''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      gradProd.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          gradProd.produto
        ORDER BY
          mov.estabelecimento ASC,
          gradProd.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoFiscal) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante),
  a.estabelecimento,
  a.produto,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  ''00'' stICMS,
  0 baseICMS,
  0 valorICMS
FROM (
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    itemInv.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS (
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
    WHERE dataInvFisc.estabelecimento = invEst.estabelecimento
    AND dataInvFisc.produto = gradProd.produto))
  AND NOT (EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    itemInv.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXFISC dataInvFisc
  ON dataInvFisc.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvFisc.produto = gradProd.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = dataInvFisc.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    mov.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOESTOQUES mov
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
  WHERE mov.operacaoInternaEstoque IN (1,102,900)
  AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE ((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemDoc.idItemDocFiscal id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    itemDoc.gradeProduto,
    itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXITENS itemDoc
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_docFiscal_join IS NULL OR p_docFiscal_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))
  AND NOT(EXISTS(
    SELECT 1
    FROM MODOCFISCALXPRODUTOFILHO filhoDoc
    WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_docFiscal_andWhere IS NULL OR p_docFiscal_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    filhoDoc.id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    filhoDoc.gradeProduto,
    filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXPRODUTOFILHO filhoDoc
  JOIN MODOCFISCALXITENS itemDoc
  ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = filhoDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE ((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        ' || TO_CHAR (p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR (p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR (p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        a.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN (a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXFISCAL a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        a.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXFISCAL b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS (
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarICMS = 1 THEN
      EXECUTE IMMEDIATE 'DECLARE
  v_stICMS           CHAR (2);
  v_baseICMS         NUMBER;
  v_valorICMS        NUMBER;
  v_existeEntrada    NUMBER;
  v_precoUnitarioCMV NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.produto,
      a.controleEstoque,'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
      a.gradeProduto,
      a.cor,
      a.tamanho,'
           ELSE ''
          END
      || '
      a.precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        a.produto,
        prod.controleEstoque'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento,
        MAX(a.precoUnitarioCMV) precoUnitarioCMV
      FROM TEMPINVENTARIOESTXFISCAL a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = a.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        a.produto,
        prod.controleEstoque'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    v_stICMS           := ''00'';
    v_baseICMS         := 0;
    v_valorICMS        := 0;
    v_existeEntrada    := 0;
    v_precoUnitarioCMV := 0;
    SELECT
      COALESCE (MAX (b.stICMS),''00''),
      COALESCE (MAX (b.baseICMS),0),
      COALESCE (MAX (b.valorICMS),0),
      COALESCE (MAX (b.existeEntrada),0)
    INTO
      v_stICMS,
      v_baseICMS,
      v_valorICMS,
      v_existeEntrada
    FROM (
      SELECT
        CASE
          WHEN b.nfFornecedor = 1
            AND b.stICMSEscrituracao <> ''  ''
          THEN b.stICMSEscrituracao
          WHEN b.stICMS <> ''  ''
          THEN b.stICMS
          ELSE ''90''
        END stICMS,
        ROUND((
          CASE
            WHEN b.nfFornecedor = 1
            AND (b.stICMSEscrituracao IN(''10'',''30'',''70'')
                OR b.stICMSEscrituracao = ''90''
                AND b.aliquotaICMSSTEscrituracao > 0)
              OR (b.nfFornecedor = 0
                OR b.stICMSEscrituracao = ''  ''
                OR b.stICMSEscrituracao = ''60'')
              AND (b.stICMS IN(''10'',''30'',''70'')
                OR b.stICMS = ''90''
                AND b.aliquotaICMSST > 0
                OR b.stSimplesNacional IN(''201'',''202'')
                OR b.stSimplesNacional = ''900''
                AND b.aliquotaICMSST > 0)
            THEN
              CASE
                WHEN b.nfFornecedor = 1 AND b.baseICMSSTEscrituracao <> 0
                THEN b.baseICMSSTEscrituracao
                WHEN b.baseICMSST <> 0
                THEN b.baseICMSST
                ELSE b.baseICMS
              END *
                CASE
                  WHEN b.valorCustoOperacao = 0 OR b.totalCustoOperacao = 0
                  THEN 1 / b.quantidade
                  ELSE (1 / b.quantidadeEstoque)
                    * (b.totalCustoOperacao / b.valorCustoOperacao)
                END
            ELSE 0
          END), 2) baseICMS,
        ROUND ((
          CASE
            WHEN b.nfFornecedor = 1
            AND (b.stICMSEscrituracao IN(''10'',''30'',''70'')
                OR b.stICMSEscrituracao = ''90''
                AND b.aliquotaICMSSTEscrituracao > 0)
              OR (b.nfFornecedor = 0
                OR b.stICMSEscrituracao = ''  ''
                OR b.stICMSEscrituracao = ''60'')
              AND (b.stICMS IN(''10'',''30'',''70'')
                OR b.stICMS = ''90''
                AND b.aliquotaICMSST > 0
                OR b.stSimplesNacional IN(''201'',''202'')
                OR b.stSimplesNacional = ''900''
                AND b.aliquotaICMSST > 0)
            THEN
              CASE
                WHEN b.nfFornecedor = 1 AND b.baseICMSSTEscrituracao <> 0
                THEN b.valorICMSEscrituracao + b.valorICMSSTEscrituracao
                ELSE b.valorICMS + b.valorICMSST
              END *
                CASE
                  WHEN b.valorCustoOperacao = 0 OR b.totalCustoOperacao = 0
                  THEN 1 / b.quantidade
                  ELSE (1 / b.quantidadeEstoque)
                    * (b.totalCustoOperacao / b.valorCustoOperacao)
                END
            ELSE 0
          END),2) valorICMS,
        1 existeEntrada,
        ROW_NUMBER() OVER (
          ORDER BY b.dataEntradaSaida DESC) ordenacao
      FROM (
        SELECT
          b.idDocumentoFiscal,
          b.estabelecimento,
          b.dataEntradaSaida,
          b.nfFornecedor,
          b.produto,
          b.stSimplesNacional,
          b.stICMS,
          b.aliquotaICMSST,
          b.stICMSEscrituracao,
          b.aliquotaICMSSTEscrituracao,
          SUM (b.quantidade) quantidade,
          SUM (b.baseICMS) baseICMS,
          SUM (b.valorICMS) valorICMS,
          SUM (b.baseICMSST) baseICMSST,
          SUM (b.valorICMSST) valorICMSST,
          SUM (b.valorICMSEscrituracao) valorICMSEscrituracao,
          SUM (b.baseICMSSTEscrituracao) baseICMSSTEscrituracao,
          SUM (b.valorICMSSTEscrituracao) valorICMSSTEscrituracao,
          SUM (b.valorCustoOperacao) valorCustoOperacao,
          SUM (b.quantidadeEstoque) quantidadeEstoque,
          SUM (b.totalCustoOperacao) totalCustoOperacao
        FROM (
          SELECT
            itemDoc.idDocumentoFiscal,
            cabDoc.estabelecimento,
            cabDoc.dataEntradaSaida,
            cabDoc.nfFornecedor,
            docXEst.idItemDocFiscal,
            est.produto,
            itemDoc.stSimplesNacional,
            itemDoc.stICMS,
            itemDoc.aliquotaICMSST,
            itemDoc.stICMSEscrituracao,
            itemDoc.aliquotaICMSSTEscrituracao,
            itemDoc.quantidade,
            itemDoc.baseICMS,
            itemDoc.valorICMS,
            itemDoc.baseICMSST,
            itemDoc.valorICMSST,
            itemDoc.valorICMSEscrituracao,
            itemDoc.baseICMSSTEscrituracao,
            itemDoc.valorICMSSTEscrituracao,
            itemDoc.valorCustoOperacao,
            SUM (est.quantidade) quantidadeEstoque,
            SUM (est.totalCustoOperacao) totalCustoOperacao
          FROM MOESTOQUES est
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = est.gradeProduto
          JOIN MODOCFISCALXESTOQUE docXEst
          ON docXEst.idEstoque = est.idEstoque
          JOIN MODOCFISCALXITENS itemDoc
          ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
          JOIN MODOCUMENTOSFISCAIS cabDoc
          ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
          WHERE est.entradaSaida = ''E''
          AND est.atualizaUltimaCompra = 1
          AND cabDoc.dataEntradaSaida < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
          AND (est.gradeProduto = itemDoc.gradeProduto
            OR NOT EXISTS (
              SELECT 1
              FROM CAGRADEPRODUTOXKITSCOMBOS kit
              WHERE kit.gradeProduto = itemDoc.gradeProduto
              AND kit.gradeProdutoFilho = est.gradeProduto
              AND kit.ativo = 1
              AND kit.manterUltimoCusto = 1))
          GROUP BY
            itemDoc.idDocumentoFiscal,
            cabDoc.estabelecimento,
            cabDoc.dataEntradaSaida,
            cabDoc.nfFornecedor,
            docXEst.idItemDocFiscal,
            est.produto,
            itemDoc.stSimplesNacional,
            itemDoc.stICMS,
            itemDoc.aliquotaICMSST,
            itemDoc.stICMSEscrituracao,
            itemDoc.aliquotaICMSSTEscrituracao,
            itemDoc.quantidade,
            itemDoc.baseICMS,
            itemDoc.valorICMS,
            itemDoc.baseICMSST,
            itemDoc.valorICMSST,
            itemDoc.valorICMSEscrituracao,
            itemDoc.baseICMSSTEscrituracao,
            itemDoc.valorICMSSTEscrituracao,
            itemDoc.valorCustoOperacao) b
      GROUP BY
        b.idDocumentoFiscal,
        b.estabelecimento,
        b.dataEntradaSaida,
        b.nfFornecedor,
        b.produto,
        b.stSimplesNacional,
        b.stICMS,
        b.aliquotaICMSST,
        b.stICMSEscrituracao,
        b.aliquotaICMSSTEscrituracao) b
      WHERE b.produto = a.produto
      AND (b.estabelecimento = a.estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = b.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = a.estabelecimento)'
        || CASE
             WHEN p_config_209_filtrarGrupoEcon = 1
             THEN '
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = b.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = a.estabelecimento)'
             ELSE ''
           END
        || ')) b
    WHERE b.ordenacao = 1;
    IF (v_existeEntrada = 0 OR v_stICMS = ''00'') AND v_valorICMS = 0 THEN
      v_stICMS   := ''00'';
      v_baseICMS := ROUND (FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        ' || TO_CHAR (p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR (p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR (p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        0, -- p_retornarPrecoBruto
        ' || TO_CHAR(p_gerandoInventario) || '),2);
      IF v_baseICMS = 0 THEN
        v_baseICMS := ROUND (FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR (p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || '),2);
      END IF;
      IF v_baseICMS = 0 THEN
        v_baseICMS := ROUND (FUNC_ADD_BUSCA_PRECO_FORMACAO (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ', -- p_item_personalizacao
        a.produto, -- p_gradProd_produto
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ', -- p_gradProd_cor
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ', -- p_gradProd_tamanho
        a.controleEstoque, -- p_prod_controleEstoque
        ' || TO_CHAR(p_gerandoInventario) || '),2); -- p_gerandoInventario
      END IF;
      IF v_baseICMS = 0 THEN
        v_baseICMS := a.precoUnitarioCmv;
      END IF;
      v_valorICMS := ROUND(v_baseICMS * 0.17,2);
    END IF;'
      || CASE
           WHEN p_invEst_motivoInventario = '02'
           THEN '
    IF v_valorICMS > 0 THEN
      v_precoUnitarioCMV := a.precoUnitarioCMV - v_valorICMS;
      IF v_precoUnitarioCMV < 0 THEN
        v_precoUnitarioCMV := 0;
      END IF;
    ELSE
      v_precoUnitarioCMV := a.precoUnitarioCMV;
    END IF;'
           ELSE '
    v_precoUnitarioCMV := a.precoUnitarioCMV;'
         END
      || '
    UPDATE TEMPINVENTARIOESTXFISCAL b SET
      b.stICMS           = v_stICMS,
      b.baseICMS         = v_baseICMS,
      b.valorICMS        = v_valorICMS'
      || CASE
           WHEN p_invEst_motivoInventario = '02'
           THEN ',
      b.precoUnitarioCMV = v_precoUnitarioCMV'
           ELSE ''
         END
      || '
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS (
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
  END IF;
  IF p_contadorSessaoGerencial <> 0 THEN
    DELETE TEMPINVENTARIOESTXGERENC
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoGerencial;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXGERENC (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  produto,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  localEstoque,
  personalizacao,
  idLoteEstoque,
  idNumeroSerie,
  quantidade,
  precoUnitarioCMV,
  precoUnitarioUltimaCompra,
  precoCustoUltimaCompra,
  precoCustoUltimaFormacao)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXITENS AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      itemInv.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          itemInv.produto
        ORDER BY
          invEst.estabelecimento ASC,
          itemInv.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE ((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      mov.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          mov.produto
        ORDER BY
          mov.estabelecimento ASC,
          mov.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE ((
      SELECT MAX (dataInvGer.data) + 1
      FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
      WHERE dataInvGer.estabelecimento = mov.estabelecimento
      AND dataInvGer.produto = mov.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoGerencial) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.localEstoque,
      a.personalizacao,
      a.idLoteEstoque,
      a.idNumeroSerie),
  a.estabelecimento,
  a.produto,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.localEstoque,
  a.personalizacao,
  a.idLoteEstoque,
  a.idNumeroSerie,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  0 precoUnitarioUltimaCompra,
  0 precoCustoUltimaCompra,
  0 precoCustoUltimaFormacao
FROM (
  SELECT DISTINCT
    itemInv.idItemInventarioEstoque id,
    invEst.estabelecimento,
    itemInv.localEstoque,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.personalizacao,
    itemInv.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN itemInv.idNumeroSerie ELSE 0 END idNumeroSerie,
    itemInv.quantidade,
    itemInv.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXITENS itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_join)
   END
|| '
  WHERE NOT EXISTS (
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
    WHERE dataInvGer.estabelecimento = invEst.estabelecimento
    AND dataInvGer.produto = itemInv.produto)
  AND NOT EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = itemInv.produto)'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.idItemInventarioEstoque id,
    invEst.estabelecimento,
    itemInv.localEstoque,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.personalizacao,
    itemInv.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN itemInv.idNumeroSerie ELSE 0 END idNumeroSerie,
    itemInv.quantidade,
    itemInv.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXITENS itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXITENS dataInvGer
  ON dataInvGer.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvGer.produto = itemInv.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_join)
   END
|| '
  WHERE NOT EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = itemInv.produto)'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.localEstoque,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.personalizacao,
    mov.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN mov.idNumeroSerie ELSE 0 END idNumeroSerie,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    mov.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOESTOQUES mov
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_movimentos_join)
   END
|| '
  WHERE mov.data < TO_DATE (''' || TO_CHAR (p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE ((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = mov.produto),
    COALESCE ((
      SELECT MAX (dataInvGer.data) + 1
      FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
      WHERE dataInvGer.estabelecimento = mov.estabelecimento
      AND dataInvGer.produto = mov.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_movimentos_andWhere)
   END
|| CASE
     WHEN p_transfPendente_considerar = 0
     THEN ''
     ELSE '
  UNION ALL
  SELECT DISTINCT
    itemTransf.idItemDocTransferencia id,
    cabTransf.estabelecimentoEntrada estabelecimento,
    itemTransf.localEstoqueEntrada localEstoque,
    locEst.indicadorPropriedadePosseItem,
    itemTransf.pessoaParticipanteEntrada pessoaParticipante,
    itemTransf.gradeProduto,
    itemTransf.personalizacao,
    itemTransf.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN COALESCE (numSerie.idNumeroSerie, 0) ELSE 0 END idNumeroSerie,
    itemTransf.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  JOIN PAETAPASTRANSFERENCIA etapTransf
  ON etapTransf.etapaTransferencia = cabTransf.etapaTransferencia
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemTransf.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemTransf.localEstoqueEntrada
  LEFT JOIN MODOCTRANSFXNUMEROSSERIE numSerie
  ON numSerie.idItemDocTransferencia = itemTransf.idItemDocTransferencia
  AND numSerie.gradeProduto = itemTransf.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_transfPendente_joinEntradas IS NULL OR p_transfPendente_joinEntradas = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_joinEntradas)
   END
|| '
  WHERE itemTransf.cancelado = 0
  AND itemTransf.validoEntrada = 1
  AND cabTransf.tipoDocumentoEntrada > 100
  AND etapTransf.situacaoDocTransferencia IN (''A'',''E'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabTransf.estabelecimentoEntrada IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_transfPendente_andWhereEntra IS NULL OR p_transfPendente_andWhereEntra = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_andWhereEntra)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemTransf.idItemDocTransferencia id,
    cabTransf.estabelecimentoSaida estabelecimento,
    itemTransf.localEstoqueSaida localEstoque,
    locEst.indicadorPropriedadePosseItem,
    itemTransf.pessoaParticipanteSaida pessoaParticipante,
    itemTransf.gradeProduto,
    itemTransf.personalizacao,
    itemTransf.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN COALESCE (numSerie.idNumeroSerie, 0) ELSE 0 END idNumeroSerie,
    (- itemTransf.quantidade) quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  JOIN PAETAPASTRANSFERENCIA etapTransf
  ON etapTransf.etapaTransferencia = cabTransf.etapaTransferencia
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemTransf.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemTransf.localEstoqueSaida
  LEFT JOIN MODOCTRANSFXNUMEROSSERIE numSerie
  ON numSerie.idItemDocTransferencia = itemTransf.idItemDocTransferencia
  AND numSerie.gradeProduto = itemTransf.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_transfPendente_joinSaidas IS NULL OR p_transfPendente_joinSaidas = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_joinSaidas)
   END
|| '
  WHERE itemTransf.cancelado = 0
  AND itemTransf.validoSaida = 1
  AND cabTransf.tipoDocumentoSaida > 100
  AND etapTransf.situacaoDocTransferencia IN (''A'',''E'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabTransf.estabelecimentoSaida IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_transfPendente_andWhereSaida IS NULL OR p_transfPendente_andWhereSaida = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_andWhereSaida)
   END
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.localEstoque,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.personalizacao,
  a.idLoteEstoque,
  a.idNumeroSerie,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1
      AND p_config_335_cmvGerencIgualFis = 1
      AND p_contadorSessaoFiscal <> 0
    THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      COALESCE ((
            SELECT MAX (b.precoUnitarioCMV)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '), 0) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN (a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    ELSIF p_buscarPrecoUnitarioCMV = 1
      AND p_config_335_cmvGerencIgualFis = 1
    THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
     ELSIF p_buscarPrecoUnitarioCMV = 1
     THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE ((
            SELECT MAX (b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN (a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
   END IF;
    IF p_buscarPrecoUnitUltimaCompra = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        0, -- p_retornarPrecoBruto
        ' || TO_CHAR (p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE((
            SELECT MAX (b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoUnitarioUltimaCompra
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioUltimaCompra = a.precoUnitarioUltimaCompra
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS (
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarPrecoCustoUltimaCompra = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
        ' || TO_CHAR (p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR (p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR (p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE ((
            SELECT MAX (b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoCustoUltimaCompra
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoCustoUltimaCompra = a.precoCustoUltimaCompra
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarPrecoCustoUltimaFormac = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_FORMACAO (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.controleEstoque, -- p_prod_controleEstoque
        ' || TO_CHAR(p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE((
            SELECT MAX (b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoCustoUltimaFormacao
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto,
        prod.controleEstoque'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto,
        prod.controleEstoque'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoCustoUltimaFormacao = a.precoCustoUltimaFormacao
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
  END IF;
END ADD_GERA_TEMP_INVENTARIO;

/

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (441, 'Ao aprovar link de pagamento, passar a etapa do orçamento para', 1, 30003, 'N', '4', 'P', 0, ' ', 'PAETAPASORCAMENTO', ' ');
INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (442, 'Ao aprovar link de pagamento, passar a etapa da ordem de servico para', 1, 30003, 'N', '4', 'P', 0, ' ', 'PAETAPASORCAMENTO', ' ');

COMMIT;

create or replace PROCEDURE ADD_LINKPAG_SITUACAO_TROCA (
  p_sessaoClient                 IN VARCHAR,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_195_umReciboParaCadaR IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_226_baixarFinEstabOri IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_436_modFinLinkPagamen IN NUMBER,
  p_config_441_etapaOrcamLinkPag IN NUMBER,
  p_config_442_etapaOrSerLinkPag IN NUMBER,
  p_idLinkPagamento              IN NUMBER,
  p_situacaoLinkPagamento        IN CHAR,
  p_observacoes                  IN VARCHAR)
IS
  v_contadorSessaoTEMPRECEBIMENT NUMBER;
  v_contadorSessaoTEMPPAGAMENTOS NUMBER;
  v_contadorSessaoTEMPPARCELAS   NUMBER;
  v_contadorSessaoTEMPSELECIONAD NUMBER;
  v_sessaoCaixa                  NUMBER;
  v_fatoContabil                 NUMBER;
  v_dataAtual                    DATE;
  v_idFinanceiroAdiantamento     NUMBER;
  v_parc_contador                NUMBER;
  v_parc_valorJurosDeMora        NUMBER;
  v_parc_valorMulta              NUMBER;
  v_parc_valorLiquido            NUMBER;
  v_2_contratosCompra            CLOB;
  v_3_contratosCompra            CLOB;
  v_23_idsFinanceiro             CLOB;
  v_29_contratosCompra           CLOB;
  v_36_contratosCompra           CLOB;
  v_46_idsFinanceiro             CLOB;
  v_auxNumber                    NUMBER;
BEGIN
  v_contadorSessaoTEMPRECEBIMENT := 1;
  v_contadorSessaoTEMPPAGAMENTOS := 1;
  v_contadorSessaoTEMPPARCELAS   := 1;
  v_contadorSessaoTEMPSELECIONAD := 1;
  v_sessaoCaixa                  := 0;
  v_fatoContabil                 := 0;
  v_dataAtual                    := SYSDATE;
  v_2_contratosCompra            := ' ';
  v_3_contratosCompra            := ' ';
  v_23_idsFinanceiro             := ' ';
  v_29_contratosCompra           := ' ';
  v_36_contratosCompra           := ' ';
  v_46_idsFinanceiro             := ' ';
  DELETE TEMPRECEBIMENTO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPRECEBIMENT;
  DELETE TEMPPAGAMENTOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPAGAMENTOS;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPARCELAS;
  DELETE TEMPSELECIONADOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPSELECIONAD; 
  DELETE TEMPSELECAODOCUMENTO
  WHERE sessaoClient = p_sessaoClient
  AND nomePublico = 'PagamentosRecebimentos';
  FOR linkPag IN (
    SELECT
      linkPag.idLinkPagamento,
      linkPag.estabelecimento,
      linkPag.pedidoLinkPagamento,
      linkPag.complemento,
      linkPag.cobranca,
      linkPag.carteiraFinanceira,
      linkPag.valorJurosTotal,
      linkPag.valorMultaTotal,
      linkPag.valorDescontoInformado,
      linkPag.valorAcrescimoInformado,
      linkPag.valor,
      linkPag.idFinanceiroAdiantamento,
      est.pessoaEstabelecimento est_pessoaEstabelecimento
    FROM MOLINKSPAGAMENTO linkPag
    JOIN PAESTABELECIMENTOS est
    ON linkPag.estabelecimento = est.estabelecimento
    WHERE linkPag.idLinkPagamento = p_idLinkPagamento)
  LOOP
    v_idFinanceiroAdiantamento := linkPag.idFinanceiroAdiantamento;
    -- SUCESSO
    IF p_situacaoLinkPagamento = 'S' THEN
      -- GERA CRÉDITO
      IF linkPag.idFinanceiroAdiantamento = 0
        AND p_config_436_modFinLinkPagamen <> 0
      THEN
        FOR modDoc IN (
          SELECT
            modDoc.operacaoFinanceira,
            modDoc.meioPagamento,
            modDoc.contaFinanceira,
            modDoc.carteiraFinanceira,
            modDoc.pessoa,
            modDoc.diasSomarData,
            modDoc.prazoPadrao,
            opFin.pagamentoRecebimento
          FROM PAMODELOSFINANCEIRO modDoc
          JOIN SIOPERACOESFINANCEIRAS opFin
          ON opFin.operacaoFinanceira = modDoc.operacaoFinanceira
          WHERE modDoc.modeloFinanceiro = p_config_436_modFinLinkPagamen)
        LOOP
          ADD_FATO_CONTABIL_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_fatoContabil,
            CASE
              WHEN p_config_226_baixarFinEstabOri = 1
              THEN linkPag.estabelecimento
              ELSE p_sys_estabelecimentoAtivo
            END, -- p_estabelecimento
            v_dataAtual,
            'A', -- p_situacaoContabilizacao
            v_fatoContabil);
          ADD_FINANC_ATUALIZA (
            p_sys_estabelecimentoAtivo,
            p_config_349_prazoValidadePont,
            p_config_354_estabProximoId,
            0, -- p_financ_idFinanceiro,
            v_sessaoCaixa,
            v_fatoContabil,
            linkPag.estabelecimento,
            v_dataAtual, -- p_financ_data
            v_dataAtual, -- p_financ_dataEmissao
            modDoc.prazoPadrao, -- p_financ_prazoPadrao,
            modDoc.prazoPadrao, -- p_financ_prazo,
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_vencimento
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_vencimentoNegociado
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_naoCobrarJurosMultaAt
            modDoc.contaFinanceira,
            modDoc.pagamentoRecebimento,
            modDoc.operacaoFinanceira,
            linkPag.complemento, -- p_financ_complemento
            0, -- p_financ_contratoCompra
            0, -- p_financ_idPagamentoPreDocumen
            0, -- p_financ_idPagamentoDocFiscal
            linkPag.pedidoLinkPagamento, -- p_financ_documento
            linkPag.pedidoLinkPagamento, -- p_financ_fatura
            1, -- p_financ_parcelaAtual
            1, -- p_financ_parcelasTotais
            CASE
              WHEN linkPag.cobranca > 0
              THEN linkPag.cobranca
              WHEN modDoc.pessoa > 0
              THEN modDoc.pessoa
              ELSE linkPag.est_pessoaEstabelecimento
            END, -- p_financ_pessoa
            0, -- p_financ_autorizadoPessoa
            CASE
              WHEN linkPag.cobranca > 0
              THEN linkPag.cobranca
              WHEN modDoc.pessoa > 0
              THEN modDoc.pessoa
              ELSE linkPag.est_pessoaEstabelecimento
            END, -- p_financ_cobranca
            modDoc.meioPagamento,
            modDoc.carteiraFinanceira,
            linkPag.valor, -- p_financ_valor
            0, -- p_financ_valorDesconto
            0, -- p_financ_valorAcrescimo
            linkPag.valor, -- p_financ_saldo
            ' ', -- p_financ_indexador
            0, -- p_financ_cotacao
            0, -- p_financ_valorIndexado
            0, -- p_financ_saldoIndexado
            0, -- p_financ_efetivado
            0, -- p_financ_tarifaDescontoAteVenc
            'S', -- p_financ_tipoPagamentoAntecipa
            0, -- p_financ_tarifaMensalDescontoA
            'S', -- p_financ_tipoJuroDeMora
            0, -- p_financ_tarifaMensalJuroDeMor
            0, -- p_financ_tarifaMulta
            0, -- p_financ_valorFixoMulta
            0, -- p_financ_desconsiderarSPC
            '   ', -- b_boleto_banco
            ' ', -- b_boleto_nossoNumero
            ' ', -- b_boleto_linhaDigitavelBoleto
            ' ', -- b_boleto_codigoBarrasBoleto
            ' ', -- b_boleto_contratoCobrancaBolet
            0, -- b_boleto_boletoImpresso
            0, -- b_boleto_remessaEnviada
            0, -- b_boleto_retornoProcessado
            0, -- p_cartao_credenciadoraCartao
            0, -- p_cartao_bandeiraCartaoDebCred
            ' ', -- p_cartao_transacaoCartaoNSU
            ' ', -- p_cartao_autorizacaoCartao
            0, -- p_cartao_tarifaCartao
            0, -- p_cartao_valorTarifaCartao
            ' ', -- p_cartaoProprio_cartaoProprio
            ' ', -- p_cheque_compensacao
            '   ', -- p_cheque_banco
            ' ', -- p_cheque_agenciaBanco
            0, -- p_cheque_c1
            ' ', -- p_cheque_contaBanco
            0, -- p_cheque_c2
            0, -- p_cheque_cheque
            0, -- p_cheque_c3
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_cheque_bomPara
            ' ', -- p_cheque_indicadorPessoa
            ' ', -- p_cheque_titular
            ' ', -- p_cheque_indicadorDocumentoPes
            ' ', -- p_cheque_cnpjCpfIdEstrangeiro
            ' ', -- p_cheque_fone
            NULL, -- p_cheque_desde
            ' ', -- p_cheque_autenticacao
            1, -- p_cheque_statusCheque
            NULL, -- p_cheque_dataPrimeiroDeposito
            NULL, -- p_cheque_dataCompensacaoDevolu
            NULL, -- p_cheque_dataSegundoDeposito
            NULL, -- p_cheque_dataSegundaComponsaca
            0, -- p_cheque_indicadorFone
            0, -- p_cheque_operadoraTelefonia
            ' ', -- p_cheque_observacoesFone
            0, -- p_pix_salvar
            '   ', -- p_pix_banco
            ' ', -- p_pix_txIdPix
            ' ', -- p_pix_locationPix
            ' ', -- p_pix_chavePix
            ' ', -- p_pix_qrCode
            NULL, -- p_pix_dataCriacao
            ' ', -- p_pix_timezoneCriacao
            0, -- p_pix_segundosExpiracao
            ' ', -- p_pix_nomeRazaoSocial
            ' ', -- p_pix_cnpjCpfIdEstrangeiro
            ' ', -- p_pix_statusPix
            0, -- p_pix_numeroRevisao
            ' ', -- p_pix_observacoes
            0, -- p_correl_id
            0, -- p_correl_idFinanceiroCorrelato
            CASE
              WHEN modDoc.operacaoFinanceira IN (34,74)
                AND modDoc.meioPagamento NOT IN (30,31,32,33,38,39,40)
              THEN 1
              ELSE 0
            END, -- p_baixaAutomatica
            0, -- p_idFinanceiroAdiantamento
            0, -- p_idPrevisaoFinanceira
            0, -- p_preDocumento
            0, -- p_idDocumentoFiscal 
            v_idFinanceiroAdiantamento,
            v_auxNumber, -- v_financ_saldo
            v_auxNumber, -- v_financ_saldoIndexado
            v_auxNumber, -- v_financ_efetivado
            v_auxNumber, -- v_correl_id
            v_auxNumber); -- v_idBaixaFinanceiroAdiantament
        END LOOP;
        -- Lê Adiantamento para Liquidar parcelas
        FOR adiant IN (
          SELECT
            adiant.idFinanceiro,
            adiant.complemento,
            adiant.documento,
            adiant.meioPagamento,
            adiant.carteiraFinanceira,
            adiant.saldo
          FROM MOFINANCEIROS adiant
          WHERE adiant.idFinanceiro = v_idFinanceiroAdiantamento
          AND adiant.saldo > 0
          AND adiant.efetivado = 0)
        LOOP
          -- Gera Temporário Parcelas
          v_parc_contador         := 0;
          v_parc_valorJurosDeMora := 0;
          v_parc_valorMulta       := 0;
          v_parc_valorLiquido     := 0;
          FOR linkParc IN (
            SELECT
              linkParc.id,
              linkParc.idLinkPagamento,
              linkParc.idFinanceiro,
              linkParc.cotacao,
              linkParc.valor,
              linkParc.saldo,
              linkParc.saldoIndexado,
              linkParc.valorVariacaoIndexador,
              linkParc.valorJurosDeMora,
              linkParc.valorMulta,
              linkParc.valorTarifaCartao,
              linkParc.valorDescontos,
              linkParc.valorOutrosAcrescimos,
              linkParc.valorLiquido,
              financ.pagamentoRecebimento
            FROM MOLINKPAGAMENTOXBAIXAS linkParc
            JOIN MOFINANCEIROS financ
            ON financ.idFinanceiro = linkParc.idFinanceiro
            WHERE linkParc.idLinkPagamento = linkPag.idLinkPagamento
            AND linkParc.idBaixaFinanceiro = 0
            ORDER BY linkParc.id)
          LOOP
            v_parc_contador         := v_parc_contador + 1;
            v_parc_valorJurosDeMora := v_parc_valorJurosDeMora + linkParc.valorJurosDeMora;
            v_parc_valorMulta       := v_parc_valorMulta + linkParc.valorMulta;
            v_parc_valorLiquido     := v_parc_valorLiquido + linkParc.valorLiquido;
            INSERT INTO TEMPRECEBIMENTO (
              sessaoClient,
              contadorSessao,
              origem,
              id,
              ordenacao,
              quebra,
              selecionado,
              legenda,
              pagamentoRecebimento,
              cotacao,
              valor,
              saldo,
              saldoIndexado,
              valorVariacaoIndexador,
              valorJurosDeMora,
              valorMulta,
              valorTarifaCartao,
              valorDescontos,
              valorOutrosAcrescimos,
              valorLiquido)
            VALUES (
              p_sessaoClient,
              v_contadorSessaoTEMPRECEBIMENT,
              'F',
              linkParc.idFinanceiro,
              LPAD (v_parc_contador, 14, '0'),
              LPAD (linkParc.id, 14, '0'),
              1,
              0,
              linkParc.pagamentoRecebimento,
              linkParc.cotacao,
              linkParc.valor,
              linkParc.saldo,
              linkParc.saldoIndexado,
              linkParc.valorVariacaoIndexador,
              linkParc.valorJurosDeMora,
              linkParc.valorMulta,
              linkParc.valorTarifaCartao,
              linkParc.valorDescontos,
              linkParc.valorOutrosAcrescimos,
              linkParc.valorLiquido);
          END LOOP;
          IF v_parc_contador > 0 THEN
            INSERT INTO TEMPSELECAODOCUMENTO (
              sessaoClient,
              nomePublico,
              quebra,
              origem,
              idCabecalho,
              sequencia,
              idItem,
              quebraB,
              linhaA,
              campoA,
              idA,
              idB,
              idC,
              idD,
              valorA,
              simNaoA,
              BLOB)
            VALUES (
              p_sessaoClient,
              'PagamentosRecebimentos',
              ' ',
              ' ',
              0,
              1,
              0,
              ' ',
              adiant.complemento,
              adiant.documento,
              adiant.meioPagamento,
              adiant.carteiraFinanceira,
              adiant.idFinanceiro,
              0,
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END,
              0,
              NULL);
            -- Efetua Liquidação
            ADD_FINANC_TEMPRECEBIMENTO_EF (
              p_sessaoClient,
              p_sys_estabelecimentoAtivo,
              p_config_195_umReciboParaCadaR,
              p_config_226_baixarFinEstabOri,
              p_config_349_prazoValidadePont,
              p_config_354_estabProximoId,
              v_contadorSessaoTEMPRECEBIMENT,
              v_contadorSessaoTEMPPAGAMENTOS,
              v_contadorSessaoTEMPPARCELAS,
              v_contadorSessaoTEMPSELECIONAD,
              0, -- p_idNegociacaoDivida
              v_sessaoCaixa,
              v_dataAtual, -- p_dataBaixa
              v_parc_valorJurosDeMora,
              v_parc_valorMulta,
              'R', -- p_confirm_pagamentoRecebimento
              v_parc_valorLiquido,
              linkPag.valorJurosTotal,
              linkPag.valorMultaTotal,
              linkPag.valorDescontoInformado,
              linkPag.valorAcrescimoInformado,
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END, -- p_confirm_valorTotal
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END, -- p_confirm_valorTotalPago
              0, -- p_confirm_troco_meioPagamento
              0, -- p_confirm_troco_condicaoPagam
              v_auxNumber,
              v_2_contratosCompra,
              v_3_contratosCompra,
              v_23_idsFinanceiro,
              v_29_contratosCompra,
              v_36_contratosCompra,
              v_46_idsFinanceiro);
          END IF;
          FOR tempSel IN (
            SELECT
              tempSel.id idBaixaFinanceiro,
              finXBaix.idFinanceiro
            FROM TEMPSELECIONADOS tempSel
            JOIN MOFINANCEIROXBAIXAS finXBaix
            ON finXBaix.idBaixaFinanceiro = tempSel.id
            WHERE tempSel.sessaoClient = p_sessaoClient
            AND tempSel.contadorSessao = v_contadorSessaoTEMPSELECIONAD
            AND tempSel.id > 0)
          LOOP
            UPDATE MOLINKPAGAMENTOXBAIXAS x
            SET x.idBaixaFinanceiro = tempSel.idBaixaFinanceiro
            WHERE x.idLinkPagamento = linkPag.idLinkPagamento
            AND x.idFinanceiro = tempSel.idFinanceiro
            AND x.idBaixaFinanceiro = 0;
          END LOOP;
        END LOOP;
      END IF;
      FOR orc IN (
        SELECT
          orc.orcamento,
          orc.tipoDocumento,
          orc.etapaOrcamento
        FROM MOLINKPAGAMENTOXORCAMENTO linkXOrc
        JOIN MOORCAMENTOXPAGAMENTOS orcXPag
        ON orcXPag.idPagamentoOrcamento = linkXOrc.idPagamentoOrcamento
        JOIN MOORCAMENTOS orc
        ON orc.orcamento = orcXPag.orcamento
        WHERE linkXOrc.idLinkPagamento = linkPag.idLinkPagamento)
      LOOP
        IF orc.tipoDocumento = 102
          AND p_config_442_etapaOrSerLinkPag <> 0
          AND orc.etapaOrcamento <> p_config_442_etapaOrSerLinkPag
        THEN
          ADD_ORCAMENTO_CAB_ETAPA_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_138_etapOrcEmProcesso,
            p_person_139_etapOrcLiberado,
            p_person_190_modeloFrete,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            orc.orcamento,
            p_sys_usuarioLogado, -- p_usuario
            p_config_442_etapaOrSerLinkPag, -- p_novaEtapaOrcamento
            ' ', -- p_justificativaCancelamento
            0, -- p_cancelandoOrcamento
            0); -- p_colaboradorRespRecebimento
        ELSIF (orc.tipoDocumento <> 102
          OR p_config_442_etapaOrSerLinkPag = 0)
          AND p_config_441_etapaOrcamLinkPag <> 0
          AND orc.etapaOrcamento <> p_config_441_etapaOrcamLinkPag
        THEN
          ADD_ORCAMENTO_CAB_ETAPA_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_138_etapOrcEmProcesso,
            p_person_139_etapOrcLiberado,
            p_person_190_modeloFrete,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            orc.orcamento,
            p_sys_usuarioLogado, -- p_usuario
            p_config_441_etapaOrcamLinkPag, -- p_novaEtapaOrcamento
            ' ', -- p_justificativaCancelamento
            0, -- p_cancelandoOrcamento
            0); -- p_colaboradorRespRecebimento
        END IF;
      END LOOP;
    END IF;
    UPDATE MOLINKSPAGAMENTO x SET
      x.situacaoLinkPagamento = p_situacaoLinkPagamento,
      x.idFinanceiroAdiantamento = v_idFinanceiroAdiantamento,
      x.observacoes = p_observacoes
    WHERE x.idLinkPagamento = p_idLinkPagamento;
  END LOOP;
  DELETE TEMPRECEBIMENTO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPRECEBIMENT;
  DELETE TEMPPAGAMENTOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPAGAMENTOS;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPARCELAS;
  DELETE TEMPSELECIONADOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPSELECIONAD; 
  DELETE TEMPSELECAODOCUMENTO
  WHERE sessaoClient = p_sessaoClient
  AND nomePublico = 'PagamentosRecebimentos';
END ADD_LINKPAG_SITUACAO_TROCA;

/

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

/

create or replace PROCEDURE ADD_WEB_SERVICE (
  p_servicoWebService IN VARCHAR,
  p_conteudo          IN CLOB)
IS
  sys_estabelecimentoAtivo  NUMBER;
  config_354_estabProximoId NUMBER;
  v_idWebServiceRequisicao  NUMBER;
  v_situacaoWebService      CHAR (1);
  v_observacoes             VARCHAR (4000);
 PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  -- CRIA REQUISIÇÃO
  sys_estabelecimentoAtivo  := 0;
  config_354_estabProximoId := 0;
  ADD_WEB_SERVICE_REQUIS_GRAVA (
    sys_estabelecimentoAtivo,
    config_354_estabProximoId,
    0, -- p_idWebServiceRequisicao
    SYSDATE, -- p_dataCriacao
    p_servicoWebService,
    'P', -- p_situacaoWebService,
    NULL, -- p_dataProcessamento
    ' ', -- p_observacoes
    p_conteudo,
  v_idWebServiceRequisicao);
  COMMIT;
  -- PROCESSA REQUISIÇÃO
  v_situacaoWebService := 'F';
  v_observacoes := 'Serviço não localizado.';
  IF p_servicoWebService = 'SiTefLinkPagamento' THEN
    ADD_WS_SITEF_LINK_PAGAMENTO (
      p_conteudo,
      v_situacaoWebService,
      v_observacoes);
  ELSE
    v_idWebServiceRequisicao := v_idWebServiceRequisicao;
  END IF;
  UPDATE MOWEBSERVICEREQUISICOES SET
    situacaoWebService = v_situacaoWebService,
    observacoes = v_observacoes
  WHERE idWebServiceRequisicao = v_idWebServiceRequisicao;
  COMMIT;
END ADD_WEB_SERVICE;

/

create or replace FUNCTION FUNC_ADD_LINK_PAGAMENTO_JSON (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_docFis_PreD_Orc_Efef_Fin_Bai IN CHAR,
  p_estabelecimento              IN NUMBER,
  p_transacaoLinkPagamento       IN VARCHAR,
  p_pedidoLinkPagamento          IN VARCHAR,
  p_condicaoPagamento            IN NUMBER,
  p_baixa_atraso                 IN NUMBER,
  p_valorLiquido                 IN NUMBER)
  RETURN CLOB
IS
  v_json                 CLOB;
  v_categoriaAnterior    VARCHAR (30);
  v_categoria            VARCHAR (30);
  v_subCategoriaAnterior VARCHAR (30);
  v_subCategoria         VARCHAR (30);
  v_nomeCampo            VARCHAR (30);
BEGIN
  v_json := '{';
  FOR estXLink IN (
    SELECT
      chaveEstabLinkPag,
      codigoEstabLinkPag,
      nomeEstabLinkPag,
      mccEstabLinkPag,
      subadquirenteEstabLinkPag
    FROM PAESTABELECIMENTOXLINKPAG
    WHERE estabelecimento = p_estabelecimento)
  LOOP
    v_json := v_json || '
    "merchant_id": "' || estXLink.codigoEstabLinkPag || '",
    "merchant_key": "' || estXLink.chaveEstabLinkPag || '",';
    IF estXLink.nomeEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "soft_descriptor": "' || estXLink.nomeEstabLinkPag || '",';
    END IF;
    IF estXLink.mccEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "mcc": "' || estXLink.mccEstabLinkPag || '",';
    END IF;
    IF estXLink.subadquirenteEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "subacquirer_merchant_id": "' || estXLink.subadquirenteEstabLinkPag || '",';
    END IF;
  END LOOP;
  IF p_transacaoLinkPagamento <> ' ' THEN
    v_json := v_json || '
    "merchant_usn": "' || p_transacaoLinkPagamento || '",';
  END IF;
  IF p_pedidoLinkPagamento <> ' ' THEN
    v_json := v_json || '
    "order_id": "' || p_pedidoLinkPagamento || '",';
  END IF;
  v_json := v_json || '
    "amount": "' || REPLACE (REPLACE (TO_CHAR (p_valorLiquido, 'FM9999999999990D00'), ',', ''), '.', '') || '",
    "payment_link": "true"';
  FOR regraLink IN (
    SELECT
      regraLink.idRegraLinkPagamento
    FROM (
      SELECT
        regraLink.idRegraLinkPagamento,
        ROW_NUMBER() OVER (
          ORDER BY
            regraLink.ordenacao,
            regraLink.condicaoPagamento,
            regraLink.usuario,
            regraLink.perfilUsuario,
            regraLink.estabelecimento,
            regraLink.atrasoDe,
            regraLink.atrasoAte,
            regraLink.idRegraLinkPagamento) ordenacao
      FROM PAREGRASLINKPAGAMENTO regraLink
      WHERE regraLink.idRegraLinkPagamento > 0
      AND regraLink.ativo = 1
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai = 'B'
        OR regraLink.validoVenda = 1)
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai <> 'B'
        OR regraLink.validoRecebimento = 1)
      AND (regraLink.condicaoPagamento = 0
        OR regraLink.condicaoPagamento = p_condicaoPagamento)
      AND (regraLink.usuario = 0
        OR regraLink.usuario = p_sys_usuarioLogado)
      AND (regraLink.perfilUsuario = 0
        OR regraLink.perfilUsuario = p_sys_perfilUsuarioLogado)
      AND (regraLink.estabelecimento = 0
        OR regraLink.estabelecimento = p_estabelecimento)
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai <> 'B'
        OR regraLink.atrasoDe <= p_baixa_atraso
        AND regraLink.atrasoAte >= p_baixa_atraso)) regraLink
    WHERE regraLink.ordenacao = 1)
  LOOP
    v_categoriaAnterior    := ' ';
    v_categoria            := ' ';
    v_subCategoriaAnterior := ' ';
    v_subCategoria         := ' ';
    v_nomeCampo            := ' ';
    FOR campRegr IN (
      SELECT
        campRegr.campoLinkPagamento,
        campLink.descricao,
        campRegr.conteudo
      FROM PAREGRALINKPAGAMXCAMPOS campRegr
      JOIN SICAMPOSLINKPAGAMENTO campLink
      ON campLink.campoLinkPagamento = campRegr.campoLinkPagamento
      WHERE campRegr.idRegraLinkPagamento = regraLink.idRegraLinkPagamento
      ORDER BY
        campRegr.campoLinkPagamento,
        campRegr.conteudo)
    LOOP
      IF INSTR (campRegr.descricao, '\') > 0 THEN
        v_categoria := TRIM (REGEXP_SUBSTR (campRegr.descricao, '[^\]+', 1, 1));
        IF INSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '\') > 0 THEN
          v_subCategoria := TRIM (REGEXP_SUBSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '[^\]+', 1, 1));
          v_nomeCampo    := TRIM (REGEXP_SUBSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '[^\]+', 1, 2));
        ELSE
          v_subCategoria := ' ';
          v_nomeCampo    := TRIM (REGEXP_SUBSTR (campRegr.descricao, '[^\]+', 1, 2));
        END IF;
      ELSE
        v_categoria    := ' ';
        v_subCategoria := ' ';
        v_nomeCampo    := campRegr.descricao;
      END IF;
      IF v_categoriaAnterior <> v_categoria THEN
        IF v_categoriaAnterior <> ' ' THEN
          IF v_subCategoriaAnterior <> ' ' THEN
            v_json := v_json || '
        ]';
          END IF;
          v_json := v_json || '
    },';
        ELSE
          v_json := v_json || ',';
        END IF;
        IF v_categoria <> ' ' THEN
          v_json := v_json || '
    "' || v_categoria || '": {';
          IF v_subCategoria <> ' ' THEN
          v_json := v_json || '
        "' || v_subCategoria || '":[';
          END IF;
        END IF;
      ELSIF v_subCategoriaAnterior <> v_subCategoria THEN
        IF v_subCategoriaAnterior <> ' ' THEN
          v_json := v_json || '
        ],';
        ELSE
          v_json := v_json || ',';
        END IF;
        IF v_subCategoria <> ' ' THEN
        v_json := v_json || '
        "' || v_subCategoria || '":[';
        END IF;
      END IF;
      IF v_categoria = v_categoriaAnterior AND v_subCategoria = v_subCategoriaAnterior THEN
        v_json := v_json || ',';
      END IF;
      IF v_subCategoria <> ' ' THEN
        v_json := v_json || '
            {"' || v_nomeCampo || '": "' || campRegr.conteudo || '"}';
      ELSIF v_categoria <> ' ' THEN
        v_json := v_json || '
        "' || v_nomeCampo || '": "' || campRegr.conteudo || '"';
      ELSE
        v_json := v_json || '
    "' || v_nomeCampo || '": "' || campRegr.conteudo || '"';
      END IF;
    v_categoriaAnterior    := v_categoria;
    v_subCategoriaAnterior := v_subCategoria;
    END LOOP;
    IF v_subCategoria <> ' ' THEN
      v_json := v_json || '
        ]';
    END IF;
    IF v_categoria <> ' ' THEN
      v_json := v_json || '
    }';
    END IF;
  END LOOP;
  v_json := v_json || '
}';
  RETURN v_json;
END;

/

DELETE PAREGRALINKPAGAMXCAMPOS WHERE campoLinkPagamento = 100;
DELETE SICAMPOSLINKPAGAMENTO WHERE campoLinkPagamento = 100;

COMMIT;

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2025001004, '2025.1.4', TO_DATE ('17/06/2025', 'DD/MM/YYYY'), 1, 1, sysdate, 'BETA 1');

COMMIT;

-- FIM BETA 1 - 17/06/2025

