SET DEFINE OFF;

DELETE PAMENUXPERMISSOES WHERE menu = 420;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 420;
DELETE MOACESSOSMENU WHERE menu = 420;
DELETE SIMENUS WHERE menu = 420;

create or replace FUNCTION FUNC_ADD_BUSCA_MODALIDADE_FRET (
  p_person_190_modeloFrete       IN CHAR,
  p_modalidadeFrete              IN CHAR,
  p_a_valorFreteItem             IN NUMBER,
  p_valorFreteItem               IN NUMBER,
  p_a_valorFreteGeral            IN NUMBER,
  p_valorFreteGeral              IN NUMBER,
  p_modDoc_somaFreteSeguroPrUnit IN NUMBER)
  RETURN CHAR
IS
  v_modalidadeFrete CHAR (1);
BEGIN
  IF p_modalidadeFrete = ' ' THEN
    v_modalidadeFrete := '9';
  ELSE
    v_modalidadeFrete := p_modalidadeFrete;
  END IF;
  IF NOT (p_person_190_modeloFrete IS NULL)
    AND p_person_190_modeloFrete <> ' '
    AND p_modDoc_somaFreteSeguroPrUnit = 0
  THEN
    IF p_a_valorFreteItem + p_a_valorFreteGeral <= 0
      AND p_valorFreteItem + p_valorFreteGeral > 0
    THEN
      v_modalidadeFrete := p_person_190_modeloFrete;
    ELSIF p_a_valorFreteItem + p_a_valorFreteGeral > 0
      AND p_valorFreteItem + p_valorFreteGeral <= 0
    THEN
      v_modalidadeFrete := '9';
    END IF;
  END IF;
  RETURN v_modalidadeFrete;
END FUNC_ADD_BUSCA_MODALIDADE_FRET;

/

create or replace FUNCTION FUNC_ADD_DATA_PRIMEIRA_COMPRA (
  p_config_209_filtrarGrupoEcon IN NUMBER,
  p_dataInicial                 IN DATE,
  p_dataFinal                   IN DATE,
  p_produto                     IN NUMBER,
  p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataPrimeiraCompra DATE;
BEGIN
  v_dataPrimeiraCompra := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MIN(TRUNC(a.dataEntradaSaida))
    INTO v_dataPrimeiraCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND 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 = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto)
    SELECT MIN(TRUNC(a.dataEntradaSaida))
    INTO v_dataPrimeiraCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND 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 = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  END IF;
  RETURN v_dataPrimeiraCompra;
END;
/

create or replace FUNCTION FUNC_ADD_DATA_ULTIMA_COMPRA (
  p_config_209_filtrarGrupoEcon IN NUMBER,
  p_dataInicial                 IN DATE,
  p_dataFinal                   IN DATE,
  p_produto                     IN NUMBER,
  p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataUltimaCompra   DATE;
BEGIN
  v_dataUltimaCompra := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND 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 = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto
      AND gradProd.gradeProduto > 0)
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND 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 = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  END IF;
  RETURN v_dataUltimaCompra;
END;

/

create or replace FUNCTION FUNC_ADD_DATA_ULTIMA_VENDA (
  p_config_209_filtrarGrupoEcon IN NUMBER,
  p_dataInicial                 IN DATE,
  p_dataFinal                   IN DATE,
  p_produto                     IN NUMBER,
  p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataUltimaVenda    DATE;
BEGIN
  v_dataUltimaVenda := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaVenda
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND 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 = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto
      AND gradProd.gradeProduto > 0)
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaVenda
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND 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 = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  END IF;
  RETURN v_dataUltimaVenda;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_RESERVAS_PROD (
    p_config_82_considLenteDispon IN NUMBER,
    p_config_83_considLenteEstoqu IN NUMBER,
    p_config_160_permiteTransfSem IN CHAR,
    p_produto                     IN NUMBER,
    p_cor                         IN NUMBER,
    p_tamanho                     IN VARCHAR,
    p_gradeProduto                IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_documentoDesconsiderar      IN CHAR, -- O = Orçamento, T = Transferencia
    p_idDocumentoDesconsiderar    IN NUMBER,
    p_entradaSaida                IN CHAR)
RETURN NUMBER
IS
  v_quantidadeReservas           NUMBER(15,6);
  v_quantidadeOrcamento          NUMBER(15,6);
  v_quantidadeTransferencia      NUMBER(15,6);
  v_quantidadeTransfDigitacao    NUMBER(15,6);
BEGIN
  v_quantidadeReservas           := 0;
  v_quantidadeOrcamento          := 0;
  v_quantidadeTransferencia      := 0;
  v_quantidadeTransfDigitacao    := 0;
  SELECT COALESCE((
    SELECT SUM(a.quantidadeSaldo)
    FROM (
      SELECT
        CASE
          WHEN prod.controleEstoque IN (1,5,11)
          THEN COALESCE((
            SELECT SUM(a.quantidadeSaldo)
            FROM MORESERVASESTOQUE a
            JOIN PALOCAISESTOQUE locEst
            ON locEst.localEstoque = a.localEstoque
            WHERE a.entradaSaida = '' || p_entradaSaida || ''
            AND a.gradeProduto = gradProd.gradeProduto
            AND (p_idLoteEstoque = 0
              OR a.idLoteEstoque = p_idLoteEstoque)
            AND (p_estabelecimento = 0
              OR a.estabelecimento = p_estabelecimento)
            AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
            AND a.pessoaParticipante = p_pessoaParticipante
            AND (p_localEstoque = 0
              AND locEst.validoEstoqueTotal = 1
              OR a.localEstoque = p_localEstoque)
            AND (p_personalizacao = 0
              OR a.personalizacao = p_personalizacao)
            AND (p_idEnderecoEstoque = 0
              OR a.idEnderecoEstoque = p_idEnderecoEstoque)
            AND (p_idNumeroSerie = 0
              OR a.idNumeroSerie = p_idNumeroSerie)),0)
          WHEN prod.controleEstoque IN (3,4)
          THEN TRUNC ((
            SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
            FROM (
              SELECT kit.gradeProduto,
                kit.gradeProdutoFilho,
                kit.quantidade quantidadeKit,
                ( SELECT SUM (a.quantidadeSaldo)
                  FROM MORESERVASESTOQUE a
                  JOIN PALOCAISESTOQUE locEst
                  ON locEst.localEstoque = a.localEstoque
                  WHERE a.entradaSaida = '' || p_entradaSaida || ''
                  AND a.gradeProduto = kit.gradeProdutoFilho
                  AND (p_idLoteEstoque = 0
                    OR a.idLoteEstoque = p_idLoteEstoque)
                  AND (p_estabelecimento = 0
                    OR a.estabelecimento = p_estabelecimento)
                  AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                  AND a.pessoaParticipante = p_pessoaParticipante
                  AND (p_localEstoque = 0
                    AND locEst.validoEstoqueTotal = 1
                    OR a.localEstoque = p_localEstoque)
                  AND (p_personalizacao = 0
                    OR a.personalizacao = p_personalizacao)
                  AND (p_idEnderecoEstoque = 0
                    OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                  AND (p_idNumeroSerie = 0
                    OR a.idNumeroSerie = p_idNumeroSerie)) quantidadeSaldo
              FROM CAGRADEPRODUTOXKITSCOMBOS kit
              WHERE kit.quantidade > 0
              AND kit.gradeProduto <> kit.gradeProdutoFilho
              GROUP BY
                kit.gradeProduto,
                kit.gradeProdutoFilho,
                kit.quantidade) a
            WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
          ELSE 0
        END quantidadeSaldo
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA uniMed
      ON uniMed.unidadeMedida = prod.unidadeMedida
      WHERE p_gradeProduto = 0
      AND gradProd.produto = p_produto
      AND (p_cor = 0
        OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
      OR p_gradeProduto <> 0
      AND gradProd.gradeProduto = p_gradeProduto) a),0)
  INTO v_quantidadeReservas
  FROM DUAL;
  IF p_documentoDesconsiderar = 'O'
    AND p_idDocumentoDesconsiderar > 0
  THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MORESERVASESTOQUE a
                JOIN MOORCAMENTOXRESERVAESTOQ b
                ON b.idReservaEstoque = a.idReservaEstoque
                JOIN PALOCAISESTOQUE locEst
                ON locEst.localEstoque = a.localEstoque
                JOIN MOORCAMENTOXITENS itemOrc
                ON itemOrc.idItemOrcamento = b.idItemOrcamento
                WHERE a.entradaSaida = '' || p_entradaSaida || ''
                AND a.gradeProduto = gradProd.gradeProduto
                AND itemOrc.orcamento = p_idDocumentoDesconsiderar
                AND (p_idLoteEstoque = 0
                  OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0
                  OR a.estabelecimento = p_estabelecimento)
                AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                AND a.pessoaParticipante = p_pessoaParticipante
                AND (p_localEstoque = 0
                  AND locEst.validoEstoqueTotal = 1
                  OR a.localEstoque = p_localEstoque)
                AND (p_personalizacao = 0
                  OR a.personalizacao = p_personalizacao)
                AND (p_idEnderecoEstoque = 0
                  OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                AND (p_idNumeroSerie = 0
                  OR a.idNumeroSerie = p_idNumeroSerie)),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  ( SELECT SUM (a.quantidadeSaldo)
                    FROM MORESERVASESTOQUE a
                    JOIN MOORCAMENTOXRESERVAESTOQ b
                    ON b.idReservaEstoque = a.idReservaEstoque
                    JOIN PALOCAISESTOQUE locEst
                    ON locEst.localEstoque = a.localEstoque
                    JOIN MOORCAMENTOXITENS itemOrc
                    ON itemOrc.idItemOrcamento = b.idItemOrcamento
                    WHERE a.entradaSaida = '' || p_entradaSaida || ''
                    AND a.gradeProduto = kit.gradeProdutoFilho
                    AND itemOrc.orcamento = p_idDocumentoDesconsiderar
                    AND (p_idLoteEstoque = 0
                      OR a.idLoteEstoque = p_idLoteEstoque)
                    AND (p_estabelecimento = 0
                      OR a.estabelecimento = p_estabelecimento)
                    AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND a.pessoaParticipante = p_pessoaParticipante
                    AND (p_localEstoque = 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoque = p_localEstoque)
                    AND (p_personalizacao = 0
                      OR a.personalizacao = p_personalizacao)
                    AND (p_idEnderecoEstoque = 0
                      OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                    AND (p_idNumeroSerie = 0
                      OR a.idNumeroSerie = p_idNumeroSerie)) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                GROUP BY
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade) a
              WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed
        ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0
          OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL
          OR p_tamanho = ' '
          OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto) a),0)
    INTO v_quantidadeOrcamento
    FROM DUAL;
  END IF;
  IF p_documentoDesconsiderar = 'T'
    AND p_idDocumentoDesconsiderar > 0
  THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN COALESCE((
              SELECT SUM(a.quantidadeSaldo)
              FROM MORESERVASESTOQUE a
              JOIN MODOCTRANSFXRESERVAESTOQ b
              ON b.idReservaEstoque = a.idReservaEstoque
              JOIN PALOCAISESTOQUE locEst
              ON locEst.localEstoque = a.localEstoque
              JOIN MODOCUMENTOTRANSFXITENS itemTransf
              ON itemTransf.idItemDocTransferencia = b.idItemDocTransferencia
              WHERE a.entradaSaida = '' || p_entradaSaida || ''
              AND a.gradeProduto = gradProd.gradeProduto
              AND itemTransf.documentoTransferencia = p_idDocumentoDesconsiderar
              AND (p_idLoteEstoque = 0
                OR a.idLoteEstoque = p_idLoteEstoque)
              AND (p_estabelecimento = 0
                OR a.estabelecimento = p_estabelecimento)
              AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
              AND a.pessoaParticipante = p_pessoaParticipante
              AND (p_localEstoque = 0
                AND locEst.validoEstoqueTotal = 1
                OR a.localEstoque = p_localEstoque)
              AND (p_personalizacao = 0
                OR a.personalizacao = p_personalizacao)
              AND (p_idEnderecoEstoque = 0
                OR a.idEnderecoEstoque = p_idEnderecoEstoque)
              AND (p_idNumeroSerie = 0
                OR a.idNumeroSerie = p_idNumeroSerie)),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  ( SELECT SUM (a.quantidadeSaldo)
                    FROM MORESERVASESTOQUE a
                    JOIN MODOCTRANSFXRESERVAESTOQ b
                    ON b.idReservaEstoque = a.idReservaEstoque
                    JOIN PALOCAISESTOQUE locEst
                    ON locEst.localEstoque = a.localEstoque
                    JOIN MODOCUMENTOTRANSFXITENS itemTransf
                    ON itemTransf.idItemDocTransferencia = b.idItemDocTransferencia
                    WHERE a.entradaSaida = '' || p_entradaSaida || ''
                    AND a.gradeProduto = kit.gradeProdutoFilho
                    AND itemTransf.documentoTransferencia = p_idDocumentoDesconsiderar
                    AND (p_idLoteEstoque = 0
                      OR a.idLoteEstoque = p_idLoteEstoque)
                    AND (p_estabelecimento = 0
                      OR a.estabelecimento = p_estabelecimento)
                    AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND a.pessoaParticipante = p_pessoaParticipante
                    AND (p_localEstoque = 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoque = p_localEstoque)
                    AND (p_personalizacao = 0
                      OR a.personalizacao = p_personalizacao)
                    AND (p_idEnderecoEstoque = 0
                      OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                    AND (p_idNumeroSerie = 0
                      OR a.idNumeroSerie = p_idNumeroSerie)
                  ) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                GROUP BY
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade) a
              WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed
        ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0
          OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL
          OR p_tamanho = ' '
          OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto) a),0)
    INTO v_quantidadeTransferencia
    FROM DUAL;
  END IF;
  IF p_config_160_permiteTransfSem IN ('A','B')
    AND p_entradaSaida = 'S'
    AND p_idEnderecoEstoque = 0
    AND p_idNumeroSerie = 0
  THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MODOCUMENTOTRANSFXITENS a
                JOIN MODOCUMENTOSTRANSFERENCIA docTransf
                ON docTransf.documentoTransferencia = a.documentoTransferencia
                JOIN PAMODELOSDOCUMENTO modDoc
                ON modDoc.modeloDocumento = docTransf.modeloDocumento
                JOIN PALOCAISESTOQUE locEst
                ON locEst.localEstoque = a.localEstoqueSaida
                WHERE a.validoSaida = 1
                AND a.documentoTransferencia <> p_idDocumentoDesconsiderar
                AND a.gradeProduto = gradProd.gradeProduto
                AND docTransf.tipoDocumentoSaida > 100
                AND docTransf.situacaoDocTransferencia = 'E'
                AND modDoc.movimentaEstoque = 1
                AND (p_idLoteEstoque = 0
                  OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0
                  OR docTransf.estabelecimentoSaida = p_estabelecimento)
                AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                AND a.pessoaParticipanteSaida = p_pessoaParticipante
                AND (p_localEstoque = 0
                  AND locEst.validoEstoqueTotal = 1
                  OR a.localEstoqueSaida = p_localEstoque)
                AND (p_personalizacao = 0
                  OR a.personalizacao = p_personalizacao)
                AND (prod.controleEstoque IN (1,5)
                  OR prod.controleEstoque = 11
                  AND CASE
                        WHEN docTransf.tipoDocumentoSaida = 101
                        THEN p_config_82_considLenteDispon
                        ELSE p_config_83_considLenteEstoqu
                      END = 1)),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  ( SELECT SUM (a.quantidadeSaldo)
                    FROM MODOCUMENTOTRANSFXITENS a
                    JOIN MODOCUMENTOSTRANSFERENCIA docTransf
                    ON docTransf.documentoTransferencia = a.documentoTransferencia
                    JOIN PAMODELOSDOCUMENTO modDoc
                    ON modDoc.modeloDocumento = docTransf.modeloDocumento
                    JOIN PALOCAISESTOQUE locEst
                    ON locEst.localEstoque = a.localEstoqueSaida
                    WHERE a.validoSaida = 1
                    AND a.documentoTransferencia <> p_idDocumentoDesconsiderar
                    AND a.gradeProduto = kit.gradeProdutoFilho
                    AND docTransf.tipoDocumentoSaida > 100
                    AND docTransf.situacaoDocTransferencia = 'E'
                    AND modDoc.movimentaEstoque = 1
                    AND (p_idLoteEstoque = 0
                      OR a.idLoteEstoque = p_idLoteEstoque)
                    AND (p_estabelecimento = 0
                      OR docTransf.estabelecimentoSaida = p_estabelecimento)
                    AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND a.pessoaParticipanteSaida = p_pessoaParticipante
                    AND (p_localEstoque = 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoqueSaida = p_localEstoque)
                    AND (p_personalizacao = 0
                      OR a.personalizacao = p_personalizacao)) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                GROUP BY
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade) a
              WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed
        ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0
          OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL
          OR p_tamanho = ' '
          OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto) a),0)
    INTO v_quantidadeTransfDigitacao
    FROM DUAL;
  END IF;
  RETURN v_quantidadeReservas - v_quantidadeOrcamento - v_quantidadeTransferencia + v_quantidadeTransfDigitacao;
END;

/

create or replace FUNCTION BUSCA_RESERVAS_ESTOQUE(
    p_config_82_considLenteDispon IN NUMBER,
    p_config_83_considLenteEstoqu IN NUMBER,
    p_config_160_permiteTransfSem IN CHAR,
    p_produto                     IN NUMBER,
    p_cor                         IN NUMBER,
    p_tamanho                     IN VARCHAR,
    p_gradeProduto                IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_orcamentoDesconsiderar      IN NUMBER,
    p_transferenciaDesconsiderar  IN NUMBER,
    p_entradaSaida                IN CHAR)
RETURN NUMBER
IS
  v_quantidadeReservas NUMBER(15,6);
BEGIN
  v_quantidadeReservas := FUNC_ADD_BUSCA_RESERVAS_PROD(
    p_config_82_considLenteDispon,
    p_config_83_considLenteEstoqu,
    p_config_160_permiteTransfSem,
    p_produto,
    p_cor,
    p_tamanho,
    p_gradeProduto,
    p_idLoteEstoque,
    p_estabelecimento,
    CASE
      WHEN p_indicadorPropriedadePosseIt IS NULL
        OR p_indicadorPropriedadePosseIt = ' '
      THEN '0'
      ELSE p_indicadorPropriedadePosseIt
    END,
    p_pessoaParticipante,
    p_localEstoque,
    0, -- p_personalizacao
    p_idEnderecoEstoque,
    p_idNumeroSerie,
    CASE
      WHEN p_orcamentoDesconsiderar > 0
      THEN 'O'
      WHEN p_transferenciaDesconsiderar > 0
      THEN 'T'
      ELSE ''
    END, -- p_documentoDesconsiderar
    CASE
      WHEN p_orcamentoDesconsiderar > 0
      THEN p_orcamentoDesconsiderar
      WHEN p_transferenciaDesconsiderar > 0
      THEN p_transferenciaDesconsiderar
      ELSE 0
    END, -- p_idDocumentoDesconsiderar,
    p_entradaSaida);
  RETURN v_quantidadeReservas;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_FISCAL (
    p_dataPosicaoEstoque          IN DATE,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_gradeProduto                IN NUMBER,
    p_inventarioEstoqueDesconsid  IN NUMBER)
  RETURN NUMBER
IS
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeFiscal          NUMBER;
  v_quantidadeFiscalFilho     NUMBER;
BEGIN
  v_quantidadeInventario  := 0;
  v_quantidadeEstoque     := 0;
  v_quantidadeFiscal      := 0;
  v_quantidadeFiscalFilho := 0;
  -- v_idInventarioEstoque / v_dataInventario
  SELECT
    TO_NUMBER(SUBSTR(a.ordenacao,9,14)), 
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD')
  INTO
    v_idInventarioEstoque,
    v_dataInventario
  FROM (
    SELECT
      COALESCE(MAX(TO_CHAR(TRUNC(inv.data),'YYYYMMDD')
        || LPAD (inv.inventarioEstoque,14,'0')),'1900010100000000000000') ordenacao
    FROM MOINVENTARIOSESTOQUE inv
    WHERE inv.estabelecimento = p_estabelecimento
    AND inv.inventarioEstoque <> 0
    AND inv.inventarioEstoque <> p_inventarioEstoqueDesconsid
    AND inv.data < TRUNC(p_dataPosicaoEstoque)
      + CASE
          WHEN p_inventarioEstoqueDesconsid = 0
            AND inv.motivoInventarioEstoque = '01'
          THEN 1
          ELSE 0
        END
    AND (inv.motivoInventarioEstoque = '01'
      OR EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        JOIN CAGRADESPRODUTO gradProd2
        ON gradProd2.produto = gradProd.produto
        WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
        AND gradProd2.gradeProduto = p_gradeProduto))) a;
  -- v_dataPosicaoEstoqueInicial
  SELECT COALESCE((
    SELECT MAX (est.data)
      FROM MOESTOQUES est
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = est.gradeProduto
      JOIN CAGRADESPRODUTO gradProd2
      ON gradProd2.produto = gradProd.produto
      WHERE gradProd2.gradeProduto = p_gradeProduto
      AND est.estabelecimento = p_estabelecimento
      AND est.operacaoInternaEstoque = 1
      AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
      AND (v_idInventarioEstoque <= 0
    OR est.data >= TRUNC(v_dataInventario)+1)),
    CASE
      WHEN v_idInventarioEstoque > 0
        AND NOT (v_dataInventario IS NULL)
      THEN TRUNC (v_dataInventario) + 1
      ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
    END)
  INTO v_dataPosicaoEstoqueInicial
  FROM DUAL;
  -- v_quantidadeInventario
  IF v_idInventarioEstoque > 0 THEN
    SELECT COALESCE((
      SELECT SUM (est.quantidade)
      FROM MOINVENTARIOESTOQUEXFISC est
      WHERE est.inventarioEstoque = v_idInventarioEstoque
      AND est.gradeProduto = p_gradeProduto
      AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND est.pessoaParticipante = p_pessoaParticipante),0)
    INTO v_quantidadeInventario
    FROM DUAL;
  END IF;
  -- v_quantidadeEstoque
  IF TRUNC (v_dataPosicaoEstoqueInicial) <= TRUNC (p_dataPosicaoEstoque) THEN
    SELECT COALESCE((
      SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
      FROM MOESTOQUES est
      WHERE est.gradeProduto = p_gradeProduto
      AND est.estabelecimento = p_estabelecimento
      AND est.data >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
      AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND est.pessoaParticipante = p_pessoaParticipante
      AND est.operacaoInternaEstoque IN (1,102,900)),0)
    INTO v_quantidadeEstoque
    FROM DUAL;
    SELECT COALESCE((
      SELECT SUM (itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = 'S' THEN (-1) ELSE 1 END)
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      WHERE itemDoc.gradeProduto = p_gradeProduto
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.estabelecimento = p_estabelecimento
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND cabDoc.dataEntradaSaida < TRUNC (p_dataPosicaoEstoque) + 1
      AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND itemDoc.pessoaParticipante = p_pessoaParticipante
      AND NOT(EXISTS(
        SELECT 1
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))),0)
    INTO v_quantidadeFiscal
    FROM DUAL;
    SELECT COALESCE((
      SELECT SUM (filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = 'S' THEN (-1) ELSE 1 END)
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      WHERE filhoDoc.gradeProduto = p_gradeProduto
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.estabelecimento = p_estabelecimento
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND cabDoc.dataEntradaSaida < TRUNC (p_dataPosicaoEstoque) + 1
      AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND itemDoc.pessoaParticipante = p_pessoaParticipante),0)
    INTO v_quantidadeFiscalFilho
    FROM DUAL;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    + v_quantidadeFiscal
    + v_quantidadeFiscalFilho;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_GERENC (
    p_dataPosicaoEstoque          IN DATE,   -- Obrigatório
    p_estabelecimento             IN NUMBER, -- Obrigatório
    p_indicadorPropriedadePosseIt IN CHAR,   -- Enviar ' ' para todos
    p_pessoaParticipante          IN NUMBER, -- Enviar -1 para todos
    p_localEstoque                IN NUMBER, -- Enviar -1 para todos
    p_gradeProduto                IN NUMBER, -- Obrigatório
    p_personalizacao              IN NUMBER, -- Enviar -1 para todos
    p_idLoteEstoque               IN NUMBER, -- Enviar -1 para todos
    p_idEnderecoEstoque           IN NUMBER, -- Enviar -1 para todos
    p_idNumeroSerie               IN NUMBER, -- Enviar -1 para todos
    p_gradProd_produto            IN NUMBER, -- Obrigatório
    p_prod_controleEstoque        IN NUMBER, -- Obrigatório
    p_documentoDesconsiderar      IN CHAR,   -- D = Documento Fiscal, I = Inventário Estoque, P = Pré-Documento
    p_idDocumentoDesconsiderar    IN NUMBER) -- D = idDocumentoFiscal, I = inventarioEstoque, P = preDocumento
  RETURN NUMBER
IS
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeDocumentoFiscal NUMBER;
  v_quantidadePreDocumento    NUMBER;
BEGIN
  v_quantidadeInventario      := 0;
  v_quantidadeEstoque         := 0;
  v_quantidadeDocumentoFiscal := 0;
  v_quantidadePreDocumento    := 0;
  -- KIT / COMBO
  IF p_prod_controleEstoque IN (3,4) THEN
    -- Busca estoque do item filho com menor estoque
    SELECT COALESCE((
      SELECT MIN (TRUNC((FUNC_ADD_BUSCA_ESTOQUE_GERENC(
        p_dataPosicaoEstoque,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        kit.gradeProdutoFilho,
        0,
        0,
        p_idEnderecoEstoque,
        0,
        gradProdFilho.produto,
        prodFilho.controleEstoque,
        p_documentoDesconsiderar,
        p_idDocumentoDesconsiderar) / kit.quantidade), uniMedPai.casasDecimaisUnidadeMedida))
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProdFilho
      ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prodFilho
      ON prodFilho.produto = gradProdFilho.produto
      JOIN CAGRADESPRODUTO gradProdPai
      ON gradProdPai.gradeProduto = kit.gradeProduto
      JOIN CAPRODUTOS prodPai
      ON prodPai.produto = gradProdPai.produto
      JOIN SIUNIDADESMEDIDA uniMedPai
      ON uniMedPai.unidadeMedida = prodPai.unidadeMedida
      WHERE kit.gradeProduto = p_gradeProduto
      AND kit.ativo = 1
      AND kit.quantidade > 0
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND prodFilho.controleEstoque IN (1,3,4,5,11,12)),0)
    INTO v_quantidadeEstoque
    FROM DUAL;
  -- DEMAIS PRODUTOS (EXCETO KIT / COMBO)
  ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN
    -- v_idInventarioEstoque / v_dataInventario
    SELECT
      TO_NUMBER(SUBSTR(a.ordenacao,9,14)), 
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD')
    INTO
      v_idInventarioEstoque,
      v_dataInventario
    FROM (
      SELECT
        COALESCE(MAX(TO_CHAR(TRUNC(inv.data),'YYYYMMDD')
          || LPAD (inv.inventarioEstoque,14,'0')),'1900010100000000000000') ordenacao
      FROM MOINVENTARIOSESTOQUE inv
      WHERE inv.estabelecimento = p_estabelecimento
      AND inv.inventarioEstoque <> 0
      AND (p_documentoDesconsiderar <> 'I'
        OR inv.inventarioEstoque <> p_idDocumentoDesconsiderar)
      AND inv.data < TRUNC(p_dataPosicaoEstoque)
        + CASE WHEN p_documentoDesconsiderar <> 'I' AND inv.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      AND (inv.motivoInventarioEstoque = '01'
        OR EXISTS(
          SELECT 1
          FROM MOINVENTARIOESTOQUEXITENS itemInv
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = itemInv.gradeProduto
          WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
          AND gradProd.produto = p_gradProd_produto))) a;
    -- v_dataPosicaoEstoqueInicial
    SELECT COALESCE((
      SELECT MAX (est.data)
        FROM MOESTOQUES est
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = est.gradeProduto
        WHERE gradProd.produto = p_gradProd_produto
        AND est.estabelecimento = p_estabelecimento
        AND est.operacaoInternaEstoque = 1
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (v_idInventarioEstoque <= 0
		  OR est.data >= TRUNC(v_dataInventario)+1)),
      CASE
        WHEN v_idInventarioEstoque > 0 AND NOT (v_dataInventario IS NULL)
        THEN TRUNC (v_dataInventario) + 1
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END)
    INTO v_dataPosicaoEstoqueInicial
    FROM DUAL;
    -- v_quantidadeInventario
    IF v_idInventarioEstoque > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade)
        FROM MOINVENTARIOESTOQUEXITENS est
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = est.gradeProduto
        WHERE est.inventarioEstoque = v_idInventarioEstoque
        AND est.gradeProduto = p_gradeProduto
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idEnderecoEstoque < 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeInventario
      FROM DUAL;
    END IF;
    -- v_quantidadeEstoque
    IF TRUNC (v_dataPosicaoEstoqueInicial) <= TRUNC (p_dataPosicaoEstoque) THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOESTOQUES est
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data >= TRUNC (v_dataPosicaoEstoqueInicial)
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idEnderecoEstoque < 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
    END IF;
    -- v_quantidadeDocumentoFiscal
    IF p_documentoDesconsiderar = 'D' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MODOCFISCALXITENS itemDoc
        JOIN MODOCFISCALXESTOQUE docXEst
        ON docXEst.idItemDocFiscal = itemDoc.idItemDocFiscal
        JOIN MOESTOQUES est
        ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.idDocumentoFiscal = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idEnderecoEstoque < 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeDocumentoFiscal
      FROM DUAL;
    END IF;
    -- v_quantidadePreDocumento
    IF p_documentoDesconsiderar = 'P' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOPREDOCUMXITENS itemDoc
        JOIN MOPREDOCUMXESTOQUE docXEst
        ON docXEst.idItemPreDocumento = itemDoc.idItemPreDocumento
        JOIN MOESTOQUES est
        ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.preDocumento = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idEnderecoEstoque < 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadePreDocumento
      FROM DUAL;
    END IF;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    - v_quantidadeDocumentoFiscal
    - v_quantidadePreDocumento;
END;

/

create or replace FUNCTION BUSCA_QUANTIDADE_ESTOQUE (
    p_produto                     IN NUMBER,
    p_cor                         IN NUMBER,
    p_tamanho                     IN VARCHAR,
    p_gradeProduto                IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_preDocumentoDesconsiderar   IN NUMBER,
    p_idDocumentoFiscalDesconsid  IN NUMBER,
    p_dataPosicaoEstoque          IN DATE)
  RETURN NUMBER
IS
  v_quantidadeEstoque NUMBER (15,6);
BEGIN
  SELECT COALESCE((
    SELECT SUM (FUNC_ADD_BUSCA_ESTOQUE_GERENC(
      p_dataPosicaoEstoque,
      est.estabelecimento,
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END,
      p_pessoaParticipante,
      CASE
        WHEN p_localEstoque = 0
        THEN -1
        ELSE p_localEstoque
      END,
      gradprod.gradeProduto,
      CASE
        WHEN p_personalizacao = 0
        THEN -1
        ELSE p_personalizacao
      END,
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idEnderecoEstoque = 0
        THEN -1
        ELSE p_idEnderecoEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      gradprod.produto,
      prod.controleEstoque,
      CASE
        WHEN p_idDocumentoFiscalDesconsid > 0
        THEN 'D'
        WHEN p_preDocumentoDesconsiderar > 0
        THEN 'P'
        ELSE ' '
      END,
      CASE
        WHEN p_idDocumentoFiscalDesconsid > 0
        THEN p_idDocumentoFiscalDesconsid
        WHEN p_preDocumentoDesconsiderar > 0
        THEN p_preDocumentoDesconsiderar
        ELSE 0
      END))
    FROM CAGRADESPRODUTO gradprod
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAESTABELECIMENTOS est
    ON 1=1
    WHERE (gradProd.gradeProduto = p_gradeProduto
      AND p_gradeProduto <> 0
      OR gradProd.produto = p_produto
      AND p_gradeProduto = 0
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = p_tamanho))
    AND (est.estabelecimento = p_estabelecimento
      AND p_estabelecimento > 0
      OR est.estabelecimento > 0
      AND est.ativo = 1
      AND p_estabelecimento = 0)),0)
  INTO v_quantidadeEstoque
  FROM DUAL;
  RETURN v_quantidadeEstoque;
END;

/

create or replace PROCEDURE ADD_TROCA_PESSOA(
    p_pessoaDe   IN NUMBER,
    p_pessoaPara IN NUMBER)
IS
  v_existe NUMBER;
BEGIN
  -- Pessoa Fisica
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOASFISICAS
  WHERE pessoa = p_pessoaPara;
  IF v_existe = 0 THEN
    INSERT INTO CAPESSOASFISICAS (
      pessoa,
      sexo,
      rg,
      ufRg,
      orgaoEmissorRg,
      dataEmissaoRg,
      dataValidadeIdEstrangeiro,
      mae,
      pai,
      nacionalidade,
      municipioNaturalidade,
      tipoImovel,
      valorImovel,
      valorAluguelFinanciamento,
      desdeImovel,
      comprovouResidencia,
      comprovanteResidencia,
      escolaridade,
      ocupacaoPessoa,
      remuneracao,
      outrosRendimentos,
      comprovouRendimento,
      comprovanteRendimento,
      empregoRazaoSocial,
      empregoCnpjCpfIdEstrangeiro,
      empregoFone,
      empregoAdmissao,
      empregoCep,
      empregoTipoLogradouro,
      empregoLogradouro,
      empregoNumero,
      empregoComplemento,
      empregoBairroDistrito,
      empregoMunicipio,
      empregoPais,
      empregoObservacoes,
      estadoCivil,
      numeroDependentes,
      conjugeNome,
      conjugeCpf,
      conjugeRemuneracao,
      conjugeComprovouRendim,
      conjugeComprovanteRendim,
      conjugeFone,
      possuiCartaoCredito,
      bandeiraCartaoDebCred,
      ultimosDigitosCartaoCred,
      credscoreData,
      credscoreNota,
      rendaPresumidaData,
      rendaPresumidaValor,
      consultaSpcData,
      estaNoSpc,
      registroSpcData,
      registroSpcValor,
      estaNoSpcLoja,
      estaEmCobranca,
      protestado)
    SELECT p_pessoaPara,
      sexo,
      rg,
      ufRg,
      orgaoEmissorRg,
      dataEmissaoRg,
      dataValidadeIdEstrangeiro,
      mae,
      pai,
      nacionalidade,
      municipioNaturalidade,
      tipoImovel,
      valorImovel,
      valorAluguelFinanciamento,
      desdeImovel,
      comprovouResidencia,
      comprovanteResidencia,
      escolaridade,
      ocupacaoPessoa,
      remuneracao,
      outrosRendimentos,
      comprovouRendimento,
      comprovanteRendimento,
      empregoRazaoSocial,
      empregoCnpjCpfIdEstrangeiro,
      empregoFone,
      empregoAdmissao,
      empregoCep,
      empregoTipoLogradouro,
      empregoLogradouro,
      empregoNumero,
      empregoComplemento,
      empregoBairroDistrito,
      empregoMunicipio,
      empregoPais,
      empregoObservacoes,
      estadoCivil,
      numeroDependentes,
      conjugeNome,
      conjugeCpf,
      conjugeRemuneracao,
      conjugeComprovouRendim,
      conjugeComprovanteRendim,
      conjugeFone,
      possuiCartaoCredito,
      bandeiraCartaoDebCred,
      ultimosDigitosCartaoCred,
      credscoreData,
      credscoreNota,
      rendaPresumidaData,
      rendaPresumidaValor,
      consultaSpcData,
      estaNoSpc,
      registroSpcData,
      registroSpcValor,
      estaNoSpcLoja,
      estaEmCobranca,
      protestado
    FROM CAPESSOASFISICAS
    WHERE pessoa = p_pessoaDe;
  END IF;
  -- Transportadora
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CATRANSPORTADORAS a
    SET a.ativo            = 1
    WHERE a.transportadora = p_pessoaPara
    AND a.ativo            = 0
    AND EXISTS
      (SELECT 1
      FROM CATRANSPORTADORAS b
      WHERE b.transportadora = p_pessoaDe
      AND b.ativo            = 1
      );
  ELSE
    INSERT INTO CATRANSPORTADORAS (
      transportadora,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CATRANSPORTADORAS
    WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedor
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAVENDEDORES a
    SET a.ativo      = 1
    WHERE a.vendedor = p_pessoaPara
    AND a.ativo      = 0
    AND EXISTS
      (SELECT 1 FROM CAVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.ativo = 1
      );
  ELSE
    INSERT INTO CAVENDEDORES (
      vendedor,
      ativo)
    SELECT
      p_pessoaPara,
      ativo
    FROM CAVENDEDORES
    WHERE vendedor = p_pessoaDe;
  END IF;
  -- Comissionado B
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSB
  WHERE comissionadoB = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOMISSIONADOSB a
    SET a.ativo           = 1
    WHERE a.comissionadoB = p_pessoaPara
    AND a.ativo           = 0
    AND EXISTS
      (SELECT 1
      FROM CACOMISSIONADOSB b
      WHERE b.comissionadoB = p_pessoaDe
      AND b.ativo           = 1
      );
  ELSE
    INSERT INTO CACOMISSIONADOSB (
      comissionadoB,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CACOMISSIONADOSB
    WHERE comissionadoB = p_pessoaDe;
  END IF;
  -- Comissionado C
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSC
  WHERE comissionadoC = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOMISSIONADOSC a
    SET a.ativo           = 1
    WHERE a.comissionadoC = p_pessoaPara
    AND a.ativo           = 0
    AND EXISTS
      (SELECT 1
      FROM CACOMISSIONADOSC b
      WHERE b.comissionadoC = p_pessoaDe
      AND b.ativo           = 1
      );
  ELSE
    INSERT INTO CACOMISSIONADOSC (
      comissionadoC,
      ativo,
      percentualComissaoB,
      percentualComissaoC)
    SELECT p_pessoaPara,
      ativo,
      percentualComissaoB,
      percentualComissaoC
    FROM CACOMISSIONADOSC
    WHERE comissionadoC = p_pessoaDe;
  END IF;
  -- Colaborador
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOLABORADORES
  WHERE colaborador = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOLABORADORES a
    SET a.ativo         = 1
    WHERE a.colaborador = p_pessoaPara
    AND a.ativo         = 0
    AND EXISTS
      (SELECT 1
      FROM CACOLABORADORES b
      WHERE b.colaborador = p_pessoaDe
      AND b.ativo         = 1
      );
  ELSE
    INSERT INTO CACOLABORADORES (
      colaborador,
      ativo,
      permiteDescontoEmFolha)
    SELECT p_pessoaPara,
      ativo,
      permiteDescontoEmFolha
    FROM CACOLABORADORES
    WHERE colaborador = p_pessoaDe;
  END IF;
  -- Usuário
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAUSUARIOS
  WHERE usuario = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAUSUARIOS a
    SET a.login = COALESCE((SELECT MAX(b.login)
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe),' '),
      a.senha = COALESCE((SELECT MAX(b.senha)
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe),' '),
      a.ativo     = 1
    WHERE a.usuario = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CAUSUARIOS (
      usuario,
      ativo,
      login,
      senha,
      perfilUsuario)
    SELECT p_pessoaPara,
      ativo,
      login,
      senha,
      perfilUsuario
    FROM CAUSUARIOS
    WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnico
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CATECNICOS a
    SET a.ativo     = 1
    WHERE a.tecnico = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CATECNICOS b
      WHERE b.tecnico = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CATECNICOS (
      tecnico,
      ativo,
      equipeTecnica)
    SELECT p_pessoaPara,
      ativo,
      equipeTecnica
    FROM CATECNICOS
    WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separador
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CASEPARADORES a
    SET a.ativo       = 1
    WHERE a.separador = p_pessoaPara
    AND a.ativo       = 0
    AND EXISTS
      (SELECT 1
      FROM CASEPARADORES b
      WHERE b.separador = p_pessoaDe
      AND b.ativo       = 1
      );
  ELSE
    INSERT INTO CASEPARADORES (
      separador,
      ativo)
    SELECT
      p_pessoaPara,
      ativo
    FROM CASEPARADORES
    WHERE separador = p_pessoaDe;
  END IF;
  -- Profissional Registrado
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAPROFISSIONAISREGISTRAD a
    SET a.ativo                    = 1
    WHERE a.profissionalRegistrado = p_pessoaPara
    AND a.ativo                    = 0
    AND EXISTS
      (SELECT 1
      FROM CAPROFISSIONAISREGISTRAD b
      WHERE b.profissionalRegistrado = p_pessoaDe
      AND b.ativo                    = 1
      );
  ELSE
    INSERT INTO CAPROFISSIONAISREGISTRAD (
      profissionalRegistrado,
      ativo,
      conselhoClasseProfissional,
      uf,
      registroConselhoClassePro)
    SELECT p_pessoaPara,
      ativo,
      conselhoClasseProfissional,
      uf,
      registroConselhoClassePro
    FROM CAPROFISSIONAISREGISTRAD
    WHERE profissionalRegistrado = p_pessoaDe;
  END IF;
  -- Credenciadora Cartão
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACREDENCIADORASCARTAO a
    SET a.ativo                 = 1
    WHERE a.credenciadoraCartao = p_pessoaPara
    AND a.ativo                 = 0
    AND EXISTS
      (SELECT 1
      FROM CACREDENCIADORASCARTAO b
      WHERE b.credenciadoraCartao = p_pessoaDe
      AND b.ativo                 = 1
      );
  ELSE
    INSERT INTO CACREDENCIADORASCARTAO (
      credenciadoraCartao,
      ativo,
      credenciadoraTef)
    SELECT p_pessoaPara,
      ativo,
      credenciadoraTef
    FROM CACREDENCIADORASCARTAO
    WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Orgão Federal / Estadual / Municipal
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAORGAOSFEDERESTADMUNIC
  WHERE orgaoFederalEstadualMunicipal = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAORGAOSFEDERESTADMUNIC a
    SET a.ativo                           = 1
    WHERE a.orgaoFederalEstadualMunicipal = p_pessoaPara
    AND a.ativo                           = 0
    AND EXISTS
      (SELECT 1
      FROM CAORGAOSFEDERESTADMUNIC b
      WHERE b.orgaoFederalEstadualMunicipal = p_pessoaDe
      AND b.ativo                           = 1
      );
  ELSE
    INSERT INTO CAORGAOSFEDERESTADMUNIC (
        orgaoFederalEstadualMunicipal,
        ativo,
        federalEstadualMunicipal)
    SELECT p_pessoaPara,
      ativo,
      federalEstadualMunicipal
    FROM CAORGAOSFEDERESTADMUNIC
    WHERE orgaoFederalEstadualMunicipal = p_pessoaDe;
  END IF;
  -- Pessoa Estabelecimento
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAPESSOAESTABELECIMENTOS a
    SET a.ativo                   = 1
    WHERE a.pessoaEstabelecimento = p_pessoaPara
    AND a.ativo                   = 0
    AND EXISTS
      (SELECT 1
      FROM CAPESSOAESTABELECIMENTOS b
      WHERE b.pessoaEstabelecimento = p_pessoaDe
      AND b.ativo                   = 1
      );
  ELSE
    INSERT INTO CAPESSOAESTABELECIMENTOS (
      pessoaEstabelecimento,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CAPESSOAESTABELECIMENTOS
    WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Cliente
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACLIENTES a
    SET a.ativo     = 1
    WHERE a.cliente = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CACLIENTES b
      WHERE b.cliente = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CACLIENTES (
      cliente,
      ativo,
      permiteVendaACredito,
      permiteVendaConsignada,
      permiteVendaContaCorrente,
      convenio,
      classificacaoPessoa,
      pontuacaoCredito,
      limiteCredito,
      creditoPorParcela,
      percAcrescimoCredito,
      percEntradaMinima,
      condicaoPagamento,
      diaFixoVencimento)
    SELECT p_pessoaPara,
      ativo,
      permiteVendaACredito,
      permiteVendaConsignada,
      permiteVendaContaCorrente,
      convenio,
      classificacaoPessoa,
      pontuacaoCredito,
      limiteCredito,
      creditoPorParcela,
      percAcrescimoCredito,
      percEntradaMinima,
      condicaoPagamento,
      diaFixoVencimento
    FROM CACLIENTES
    WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedor
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAFORNECEDORES a
    SET a.ativo        = 1
    WHERE a.fornecedor = p_pessoaPara
    AND a.ativo        = 0
    AND EXISTS
      (SELECT 1
      FROM CAFORNECEDORES b
      WHERE b.fornecedor = fornecedor
      AND b.ativo        = 1
      );
  ELSE
    INSERT INTO CAFORNECEDORES (
      fornecedor,
      ativo,
      condicaoPagamento,
      prazoEntrega,
      valorMinimoPedidoCompra)
    SELECT p_pessoaPara,
      ativo,
      condicaoPagamento,
      prazoEntrega,
      valorMinimoPedidoCompra
    FROM CAFORNECEDORES
    WHERE fornecedor = p_pessoaDe;
  END IF;
  -- Botões
  UPDATE CAAUTORIZADOSPESSOA       a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAAUTORIZADOSPESSOA b WHERE b.pessoa = p_pessoaPara AND b.pessoaAutorizada = a.pessoaAutorizada));
  UPDATE CAAUTORIZADOSPESSOA       a SET a.pessoaAutorizada = p_pessoaPara WHERE a.pessoaAutorizada = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAAUTORIZADOSPESSOA b WHERE b.pessoaAutorizada = p_pessoaPara AND b.pessoa = a.pessoa));
  UPDATE CAREFERBANCARIASPESSOA    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAREFERBANCARIASPESSOA b WHERE b.pessoa = p_pessoaPara AND b.banco = a.banco AND b.agenciaBanco = a.agenciaBanco AND b.contaBanco = a.contaBanco));
  UPDATE CAREFERCOMERCIAISPESSOA   a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAREFERCOMERCIAISPESSOA b WHERE b.pessoa = p_pessoaPara AND b.empresa = a.empresa));
  UPDATE CAREFERPESSOAISPESSOA     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAREFERPESSOAISPESSOA b WHERE b.pessoa = p_pessoaPara AND b.contato = a.contato));
  UPDATE CAPESSOAXARQUIVOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE CAPESSOAXBIOMETRIAS       a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAPESSOAXBIOMETRIAS b WHERE b.pessoa = p_pessoaPara AND b.dedo = a.dedo));
  UPDATE CAPESSOASXESTABELECIMTOS  a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAPESSOASXESTABELECIMTOS b WHERE b.pessoa = p_pessoaPara AND b.estabelecimento = a.estabelecimento));
  UPDATE CAPESSOASXESTABELECIMTOS  a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAPESSOASXESTABELECIMTOS b WHERE b.pessoa = p_pessoaDe AND b.estabelecimento = a.estabelecimento AND b.ativo = 1);
  -- Parâmetros
  UPDATE PAREGRASFRETE             a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAREGRASFRETE b WHERE b.pessoa = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.uf = a.uf AND b.mesorregiaoGeografica = a.mesorregiaoGeografica AND b.microrregiaoGeografica = a.microrregiaoGeografica AND b.municipio = a.municipio AND b.bairroDistrito = a.bairroDistrito AND b.exclusivoPessoaA = a.exclusivoPessoaA AND b.exclusivoPessoaB = a.exclusivoPessoaB AND b.exclusivoPessoaC = a.exclusivoPessoaC AND b.exclusivoPessoaD = a.exclusivoPessoaD AND b.exclusivoPessoaE = a.exclusivoPessoaE));
  UPDATE PAPROJETOS                  SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAFILTROCABECXPESSOAS     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAFILTROCABECXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.filtroCabecalho = a.filtroCabecalho));
  UPDATE PAFILTROCABECXPESSOAS     a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAFILTROCABECXPESSOAS b WHERE b.pessoa = p_pessoaDe AND b.filtroCabecalho = a.filtroCabecalho AND b.ativo = 1);
  UPDATE PACARTOESPROPRIOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAMODELOSFINANCEIRO         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAOPERACOESFISCAIS          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAMVAS                    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMVAS b WHERE b.pessoa = p_pessoaPara AND b.idNcm = a.idNcm AND b.produto = a.produto AND b.origemMercadoria = a.origemMercadoria AND b.estabelecimento = a.estabelecimento AND b.ufOrigem = a.ufOrigem));
  -- Cadastros
  UPDATE CAGRADEPRODUTOXPESSOAS    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAGRADEPRODUTOXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.gradeProduto = a.gradeProduto AND b.codigoProduto = a.codigoProduto));
  UPDATE CARECEITASLENTESCLIENTE     SET paciente = p_pessoaPara WHERE paciente = p_pessoaDe;
  -- Movimentações
  UPDATE MOHISTORICOCREDITO          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOCONTABEIS                 SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOS                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOPREDOCUMENTOS             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREDOCUMXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOPREDOCUMXPAGAMENTOS       SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST     SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSFISCAIS         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCFISCALXNFREF           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCFISCALXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCFISCALXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MODOCFISCALXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOVALESDESCONTO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOFINANCEIROXCOMISSOES      SET comissionado = p_pessoaPara WHERE comissionado = p_pessoaDe;
  UPDATE MOFINANCEIROXBAIXAS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MONEGOCIACOESDIVIDAS        SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCELAMENTOS           SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCXPAGAMENTOS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSPCREGISTROS              SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOHISTORICOCOBRANCA         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOHISTORICOCRM              SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPONTUACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSEPARACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXITENS   SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXFISC    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOESTOQUES                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTROCA           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCTROCAXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOBALANCOS                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTRANSFERENCIA   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOCONSERTOS                 SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  UPDATE MORESERVASESTOQUE           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOMOTIVOSBLOQUEIOS          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOLOTESINGRESSO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOEVENTOS                   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  -- Transportadoras
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAREGRASFRETE               SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Cadastros
    UPDATE CAPLACAS                    SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.filtroProduto = a.filtroProduto));
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.filtroProduto = a.filtroProduto AND b.ativo = 1);
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaPara AND b.tabelaPreco = a.tabelaPreco));
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.tabelaPreco = a.tabelaPreco AND b.ativo = 1);
    UPDATE PAMETAXCONTEUDOS            SET comissionado = p_pessoaPara WHERE comissionado = p_pessoaDe;
    UPDATE PAMETAXCOMISSIONADO       a SET a.comissionado = p_pessoaPara WHERE a.comissionado = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMETAXCOMISSIONADO b WHERE b.comissionado = p_pessoaPara AND b.idMetaXConteudo = a.idMetaXConteudo));
    UPDATE PAMETAXCOMISSIONADO       a SET a.ativo = 1 WHERE a.comissionado = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAMETAXCOMISSIONADO b WHERE b.comissionado = p_pessoaDe AND b.idMetaXConteudo = a.idMetaXConteudo AND b.ativo = 1);
    UPDATE PAMETAXVENDEDOR           a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMETAXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.idMetaXConteudo = a.idMetaXConteudo));
    UPDATE PAMETAXVENDEDOR           a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAMETAXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.idMetaXConteudo = a.idMetaXConteudo AND b.ativo = 1);
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.vendedor = p_pessoaPara AND b.cliente = a.cliente));
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.vendedor = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOS                SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MOORCAMENTOXITENS           SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MOPREDOCUMXITENS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MODOCFISCALXITENS           SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOVALESDESCONTO             SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSTROCA           SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MODOCTROCAXITENS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOMOTIVOSBLOQUEIOS          SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
  END IF;
  -- Comissionado B
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSB
  WHERE comissionadoB = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
  END IF;
  -- Comissionado C
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSC
  WHERE comissionadoC = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
  END IF;
  -- Colaboradores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOLABORADORES
  WHERE colaborador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAINDICADORES               SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MOPLANEJAMENTOATIVIDADES    SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET colaboradorResponsavelRetirada = p_pessoaPara WHERE colaboradorResponsavelRetirada = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET colaboradorResponsavelRecebim  = p_pessoaPara WHERE colaboradorResponsavelRecebim  = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOENTREGAS                  SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET comprador = p_pessoaPara WHERE comprador = p_pessoaDe;
    UPDATE MOLOTESINGRESSO             SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
  END IF;
  -- Usuários
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAUSUARIOS
  WHERE usuario = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAFILTROCABECXUSUARIOS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAFILTROCABECXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.filtroCabecalho = a.filtroCabecalho));
    UPDATE PAFILTROCABECXUSUARIOS    a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAFILTROCABECXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.filtroCabecalho = a.filtroCabecalho AND b.ativo = 1);
    UPDATE PACONFIGURACAOXCONTEUDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACONFIGURACAOXCONTEUDOS b WHERE b.usuario = p_pessoaPara AND b.configuracao = a.configuracao AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAPERSCAMPOSXCONTEUDOS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAPERSCAMPOSXCONTEUDOS b WHERE b.usuario = p_pessoaPara AND b.personalizacaoCampo = a.personalizacaoCampo AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMEMORIASISTEMAXUSUARIOS a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMEMORIASISTEMAXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.memoriaSistema = a.memoriaSistema));
    UPDATE PAMENUXPERMISSOES         a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMENUXPERMISSOES b WHERE b.usuario = p_pessoaPara AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMENUXLAYOUTPESQUISA     a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMENUXLAYOUTPESQUISA b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo));
    UPDATE PACARTEIRASFINPERMITIDAS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACARTEIRASFINPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.carteiraFinanceira = a.carteiraFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PACARTEIRASFINPERMITIDAS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PACARTEIRASFINPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.carteiraFinanceira = a.carteiraFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAVALIDACOESPESSOA        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAVALIDACOESPESSOA b WHERE b.usuario = p_pessoaPara AND b.campoValidarPessoa = a.campoValidarPessoa AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.localValidarCampoPessoa = a.localValidarCampoPessoa AND b.meioPagamento = a.meioPagamento));
    UPDATE PACONTROLESENTREGA          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASENTREGA             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PALISTACOBRANCAXUSUARIOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PALISTACOBRANCAXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.listaCobranca = a.listaCobranca));
    UPDATE PALISTACOBRANCAXUSUARIOS  a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PALISTACOBRANCAXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.listaCobranca = a.listaCobranca AND b.ativo = 1);
    UPDATE PALISTACRMXUSUARIOS       a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PALISTACRMXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.listaCRM = a.listaCRM));
    UPDATE PALISTACRMXUSUARIOS       a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PALISTACRMXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.listaCRM = a.listaCRM AND b.ativo = 1);
    UPDATE PAREGRASCREDITO             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAMOTORCREDITO              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAGERADORESRELPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAGERADORESRELPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.categoriaGeradorRelatorio = a.categoriaGeradorRelatorio AND b.geradorRelatorio = a.geradorRelatorio AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAGERADORESRELPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAGERADORESRELPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.categoriaGeradorRelatorio = a.categoriaGeradorRelatorio AND b.geradorRelatorio = a.geradorRelatorio AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMOTIVOSBLOQPERMITIDOS   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMOTIVOSBLOQPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.motivoBloqueioDocumento = a.motivoBloqueioDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAETAPASORCAMENTODEPARA   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAETAPASORCAMENTODEPARA b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.etapaOrcamentoDe = a.etapaOrcamentoDe AND b.etapaOrcamentoPara = a.etapaOrcamentoPara));
    UPDATE PAETAPASORCAMENTOPERMITID a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAETAPASORCAMENTOPERMITID b WHERE b.usuario = p_pessoaPara AND b.etapaOrcamento = a.etapaOrcamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAETAPASORCAMENTOPERMITID a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAETAPASORCAMENTOPERMITID b WHERE b.usuario = p_pessoaPara AND b.etapaOrcamento = a.etapaOrcamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAEMAILS                  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAEMAILS b WHERE b.usuario = p_pessoaPara AND b.tipoEmail = a.tipoEmail AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAEMAILS                  a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAEMAILS b WHERE b.usuario = p_pessoaDe AND b.tipoEmail = a.tipoEmail AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.ativo = 1);
    UPDATE PAIMAGENSSISTEMA          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAIMAGENSSISTEMA b WHERE b.usuario = p_pessoaPara AND b.tipoImagemSistema = a.tipoImagemSistema AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo));
    UPDATE PAIMPRESSORAXDOCUMENTO    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAIMPRESSORAXDOCUMENTO b WHERE b.usuario = p_pessoaPara AND b.tipoDocumentoImpresso = a.tipoDocumentoImpresso AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo AND b.enderecoMAC = a.enderecoMAC AND b.etapaOrcamento = a.etapaOrcamento));
    UPDATE PACAIXASUSUARIOS          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACAIXASUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo AND b.enderecoMAC = a.enderecoMAC));
    UPDATE PAMEIOSPAGAMENTOAUTOEFET  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMEIOSPAGAMENTOAUTOEFET b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMEIOSPAGAMENTOAUTOEFET  a SET a.autoEfetivar = 1 WHERE a.usuario = p_pessoaPara AND a.autoEfetivar = 0 AND EXISTS(SELECT 1 FROM PAMEIOSPAGAMENTOAUTOEFET b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.autoEfetivar = 1);
    UPDATE PAREGRASCAIXAS            a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAREGRASCAIXAS b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAREGRASMARGEMCONTRIBUIC  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAREGRASMARGEMCONTRIBUIC b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PACATEGORIASPRODUTOSVENDA   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASFAIXASATRASO        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    -- Cadastros
    UPDATE CAPRODUTOS                  SET usuarioInclusao = p_pessoaPara WHERE usuarioInclusao = p_pessoaDe;
    UPDATE CAPRODUTOS                  SET usuarioAlteracao = p_pessoaPara WHERE usuarioAlteracao = p_pessoaDe;
    UPDATE CATABELAPRECOXALTERACOES    SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE CAPRODUTOXCONTROLEENTREGA   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    -- Movimentações
    UPDATE MOCATEGORIASMENUUSUARIO   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM MOCATEGORIASMENUUSUARIO b WHERE b.usuario = p_pessoaPara AND b.guia = a.guia AND b.categoriaMenu = a.categoriaMenu));
    UPDATE MOACESSOSMENU             a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM MOACESSOSMENU b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu));
    UPDATE MOSESSOES                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOSPCCONSULTAS              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOORCAMENTOXETAPAS          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOORCAMENTOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOSESSOESCAIXA              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPREDOCUMXSTATUS           SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPREDOCUMXBLOQUEIOSEST     SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCFISCALXSITUACOES       SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MODOCFISCALXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MONEGOCIACOESDIVIDAS        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOREPARCELAMENTOS           SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOHISTORICOCOBRANCA         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOHISTORICOCRM              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPONTUACOES                SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOARQUIVOSCOBRANCA          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOARQUIVOSCONCILIACOES      SET usuarioImportacao = p_pessoaPara WHERE usuarioImportacao = p_pessoaDe;
    UPDATE MOCONCILIACOESCARTOES       SET usuarioProcessamento = p_pessoaPara WHERE usuarioProcessamento = p_pessoaDe;
    UPDATE MOSEPARACAOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCTRANSFXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOENTREGAXSITUACOES         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOMOTBLOQXLIBERACOES        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOEVENTOS                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnicos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CATECNICOSXCLIENTES       a SET a.tecnico = p_pessoaPara WHERE a.tecnico = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaPara AND b.cliente = a.cliente));
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.tecnico = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXATIVIDADEPREV   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
    UPDATE MOORCAMENTOXATIVIDADEREAL   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separadores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOSEPARACOES                SET separador = p_pessoaPara WHERE separador = p_pessoaDe;
  END IF;
  -- Profissionais Registrados
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAESTABELECIMENTOS          SET contador = p_pessoaPara WHERE contador = p_pessoaDe;
    -- Cadastros
    UPDATE CARECEITASLENTESCLIENTE     SET medico = p_pessoaPara WHERE medico = p_pessoaDe;
  END IF;
  -- Credenciadoras Cartões
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.credenciadoraCartao = p_pessoaPara WHERE a.credenciadoraCartao = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred));
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.ativo = 1 WHERE a.credenciadoraCartao = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaDe AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred AND b.ativo = 1);
    -- Movimentações
    UPDATE MOFINANCEIROXCARTAO         SET credenciadoraCartao = p_pessoaPara WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Estabelecimentos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE PAESTABELECIMENTOS          SET pessoaEstabelecimento = p_pessoaPara WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Clientes
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.vendedor = a.vendedor));
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.vendedor = a.vendedor AND b.ativo = 1);
    UPDATE CATECNICOSXCLIENTES       a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.tecnico = a.tecnico));
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.tecnico = a.tecnico AND b.ativo = 1);
    UPDATE CARECEITASLENTESCLIENTE     SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.fornecedor = p_pessoaPara WHERE a.fornecedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaPara AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto));
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.ativo = 1 WHERE a.fornecedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaDe AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXRECEITASOCUL    SET laboratorio = p_pessoaPara WHERE laboratorio = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINELCOMPRAXITENS        SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
  END IF;  
END ADD_TROCA_PESSOA;

/

UPDATE SIMENUS SET nomePublico = 'PesqEventos' WHERE menu = 306;

COMMIT;

create or replace PROCEDURE ADD_ENTREGA_SITUACAO_ORCAMENTO(
  p_entrega             IN NUMBER,
  p_idItemOrcamento     IN NUMBER,
  p_quantidade          IN NUMBER,
  p_situacaoEntrega     IN NUMBER,
  r_novaSituacaoEntrega OUT NUMBER)
IS
  v_cancelado            NUMBER;
  v_quantidadeConvertida NUMBER;
  v_situacaoEntrega      NUMBER;
  v_situacaoOrcamento    NUMBER;
  v_quantidadeProgramada NUMBER;
  v_quantidadeEntregue   NUMBER;
  v_quantidadeDevolvida  NUMBER;
  v_quantidadeCancelada  NUMBER;
BEGIN
  SELECT
    item.cancelado,
    item.quantidadeConvertida,
    item.situacaoEntrega,
    etapOrc.situacaoOrcamento
  INTO
    v_cancelado,
    v_quantidadeConvertida,
    v_situacaoEntrega,
    v_situacaoOrcamento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  JOIN PAETAPASORCAMENTO etapOrc
  ON etapOrc.etapaOrcamento = cab.etapaOrcamento
  WHERE item.idItemOrcamento = p_idItemOrcamento;
  r_novaSituacaoEntrega := v_situacaoEntrega;
  IF v_situacaoOrcamento = 90 OR v_cancelado = 1 THEN
    r_novaSituacaoEntrega := 7;
  ELSE
    SELECT
      COALESCE (SUM (CASE WHEN entr.situacaoEntrega BETWEEN 3 AND 5 THEN entr.quantidade ELSE 0 END),0) quantidadeProgramada,
      COALESCE (SUM (CASE WHEN entr.situacaoEntrega = 5 THEN entr.quantidade ELSE 0 END),0) quantidadeEntregue,
      COALESCE (SUM (CASE WHEN entr.situacaoEntrega = 6 THEN entr.quantidade ELSE 0 END),0) quantidadeDevolvida,
      COALESCE (SUM (CASE WHEN entr.situacaoEntrega = 7 THEN entr.quantidade ELSE 0 END),0) quantidadeCancelada
    INTO
      v_quantidadeProgramada,
      v_quantidadeEntregue,
      v_quantidadeDevolvida,
      v_quantidadeCancelada
    FROM MOENTREGAS entr
    WHERE entr.idItemOrcamento = p_idItemOrcamento
    AND entr.entrega <> p_entrega;
    r_novaSituacaoEntrega :=
      CASE
        WHEN (CASE WHEN p_situacaoEntrega = 7 THEN p_quantidade ELSE 0 END + v_quantidadeCancelada) <> 0 AND (CASE WHEN p_situacaoEntrega = 7 THEN p_quantidade ELSE 0 END + v_quantidadeCancelada) = v_quantidadeConvertida
        THEN 7
        WHEN (CASE WHEN p_situacaoEntrega = 5 THEN p_quantidade ELSE 0 END + v_quantidadeEntregue) >= v_quantidadeConvertida
        THEN 5
        WHEN (CASE WHEN p_situacaoEntrega IN (3,4,5) THEN p_quantidade ELSE 0 END + v_quantidadeProgramada) < v_quantidadeConvertida
        THEN
          CASE
            WHEN v_situacaoEntrega = 8
            THEN 8
            WHEN (CASE WHEN p_situacaoEntrega = 6 THEN p_quantidade ELSE 0 END + v_quantidadeDevolvida) > 0
            THEN 6
            WHEN (CASE WHEN p_situacaoEntrega IN (3,4,5) THEN p_quantidade ELSE 0 END + v_quantidadeProgramada) = 0 AND v_situacaoOrcamento <= 60
            THEN 1
            ELSE 2
          END
        WHEN (CASE WHEN p_situacaoEntrega = 5 THEN p_quantidade ELSE 0 END + v_quantidadeEntregue) < (CASE WHEN p_situacaoEntrega IN (3,4,5) THEN p_quantidade ELSE 0 END + v_quantidadeProgramada)
        THEN 3
        ELSE 4
      END;
  END IF;
  IF v_situacaoEntrega <> r_novaSituacaoEntrega THEN
    UPDATE MOORCAMENTOXITENS
    SET situacaoEntrega = r_novaSituacaoEntrega
    WHERE idItemOrcamento = p_idItemOrcamento;
  END IF;
END ADD_ENTREGA_SITUACAO_ORCAMENTO;

/

create or replace PROCEDURE ADD_ENTREGA_SITUACAO_CRIA(
  p_usuarioLogado        IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamento      IN NUMBER,
  p_entrega              IN NUMBER,
  p_situacaoEntrega      IN NUMBER,
  p_observacoes          IN VARCHAR)
IS
BEGIN
  INSERT INTO MOENTREGAXSITUACOES (
    id,
    idItemOrcamento,
    entrega,
    data,
    usuario,
    situacaoEntrega,
    observacoes)
  VALUES (
    FUNC_ADD_BUSCA_PROXIMO_ID('MOENTREGAXSITUACOES', 'id', 14, p_estabelecimentoAtivo, NULL),
    p_idItemOrcamento,
    p_entrega,
    SYSDATE,
    p_usuarioLogado,
    p_situacaoEntrega,
    p_observacoes);
END ADD_ENTREGA_SITUACAO_CRIA;

/

create or replace PROCEDURE ADD_ENTREGA_CRIA(
  p_usuarioLogado               IN NUMBER,
  p_estabelecimentoAtivo        IN NUMBER,
  p_modeloDocumento             IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_dataEntrega                 IN DATE,
  p_horaEntregaFinal            IN CHAR,
  p_motorista                   IN NUMBER,
  p_placa                       IN VARCHAR,
  p_rota                        IN NUMBER,
  p_idItemOrcamento             IN NUMBER,
  p_idItemPreDocumentoRemessa   IN NUMBER,
  p_idItemDocFiscalRemessa      IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_situacaoEntrega             IN NUMBER,
  p_observacoes                 IN VARCHAR,
  p_atualizarSittuacaoOrcamento IN NUMBER)
IS
  v_entrega             NUMBER;
  v_novaSituacaoEntrega NUMBER;
BEGIN
  v_entrega := FUNC_ADD_BUSCA_PROXIMO_ID('MOENTREGAS', 'entrega', 14, p_estabelecimentoAtivo, NULL);
  INSERT INTO MOENTREGAS (
    entrega,
    modeloDocumento,
    controlaSeparacaoConferencia,
    estabelecimento,
    dataEntrega,
    horaEntregaFinal,
    motorista,
    placa,
    rota,
    idItemOrcamento,
    idItemPreDocumentoRemessa,
    idItemDocFiscalRemessa,
    quantidade,
    situacaoEntrega,
    observacoes)
  VALUES (
    v_entrega,
    p_modeloDocumento,
    0,
    p_estabelecimento,
    p_dataEntrega,
    p_horaEntregaFinal,
    p_motorista,
    p_placa,
    p_rota,
    p_idItemOrcamento,
    p_idItemPreDocumentoRemessa,
    p_idItemDocFiscalRemessa,
    p_quantidade,
    p_situacaoEntrega,
    p_observacoes);
  ADD_ENTREGA_SITUACAO_CRIA(
    p_usuarioLogado,
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    v_entrega,
    p_situacaoEntrega,
    'ADD_ENTREGA_CRIA');
  IF p_atualizarSittuacaoOrcamento = 1 THEN
    ADD_ENTREGA_SITUACAO_ORCAMENTO(
      v_entrega,
      p_idItemOrcamento,
      p_quantidade,
      p_situacaoEntrega,
      v_novaSituacaoEntrega);
  END IF;
END ADD_ENTREGA_CRIA;

/

create or replace PROCEDURE ADD_ENTREGA_SITUACAO_TROCA (
  p_usuarioLogado               IN NUMBER,
  p_estabelecimentoAtivo        IN NUMBER,
  p_idItemOrcamento             IN NUMBER,
  p_entrega                     IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_situacaoEntrega             IN NUMBER,
  p_origem                      IN VARCHAR,
  p_atualizarSittuacaoOrcamento IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  IF p_entrega > 0 THEN
    UPDATE MOENTREGAS SET
      situacaoEntrega = p_situacaoEntrega,
      quantidade = quantidade
    WHERE entrega = p_entrega;
    ADD_ENTREGA_SITUACAO_CRIA (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_idItemOrcamento,
      p_entrega,
      p_situacaoEntrega,
      CASE
        WHEN p_origem IS NULL
          OR p_origem = ' '
        THEN ''
        ELSE TRIM(p_origem) || ' - '
      END || 'ADD_ENTREGA_SITUACAO_TROCA - p_entrega = '
      || TO_CHAR(p_entrega)
      || ' - idItemOrcamento = '
      || TO_CHAR(p_idItemOrcamento)
      || ' - Atualizar Sittuacao Orcamento = '
      || TO_CHAR(p_atualizarSittuacaoOrcamento));
    IF p_atualizarSittuacaoOrcamento = 1 THEN
      ADD_ENTREGA_SITUACAO_ORCAMENTO(
        p_entrega,
        p_idItemOrcamento,
        p_quantidade,
        p_situacaoEntrega,
        v_auxNumber);
    END IF;
  ELSIF p_atualizarSittuacaoOrcamento = 1
    AND p_idItemOrcamento > 0
  THEN
    UPDATE MOORCAMENTOXITENS
    SET situacaoEntrega = p_situacaoEntrega
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_ENTREGA_SITUACAO_CRIA (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_idItemOrcamento,
      p_entrega,
      p_situacaoEntrega,
      CASE
        WHEN p_origem IS NULL
          OR p_origem = ' '
        THEN ''
        ELSE TRIM(p_origem) || ' - '
      END || 'ADD_ENTREGA_SITUACAO_TROCA - SEM ENTREGA - idItemOrcamento = '
      || TO_CHAR(p_idItemOrcamento));
  END IF;
END ADD_ENTREGA_SITUACAO_TROCA;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_ETAPA_CRIA (
  p_usuarioLogado        IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER,
  p_orcamento            IN NUMBER,
  p_usuario              IN NUMBER,
  p_etapaOrcamento       IN NUMBER,
  p_observacoes          IN VARCHAR)
IS
BEGIN
  INSERT INTO MOORCAMENTOXETAPAS (
    id,
    orcamento,
    data,
    usuario,
    etapaOrcamento,
    observacoes)
  VALUES (
    FUNC_ADD_BUSCA_PROXIMO_ID('MOORCAMENTOXETAPAS', 'id', 14, p_estabelecimentoAtivo, NULL),
    p_orcamento,
    SYSDATE,
    CASE WHEN p_usuario = 0 THEN p_usuarioLogado ELSE p_usuario END,
    p_etapaOrcamento,
    p_observacoes);
END ADD_ORCAMENTO_CAB_ETAPA_CRIA;

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_STATUS_CRIA (
  p_usuarioLogado        IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER,
  p_preDocumento         IN NUMBER,
  p_usuario              IN NUMBER,
  p_statusPreDocumento   IN CHAR,
  p_observacoes          IN VARCHAR)
IS
BEGIN
  INSERT INTO MOPREDOCUMXSTATUS (
    id,
    preDocumento,
    data,
    usuario,
    statusPreDocumento,
    observacoes)
  VALUES (
    FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXSTATUS', 'id', 14, p_estabelecimentoAtivo, NULL),
    p_preDocumento,
    SYSDATE,
    CASE WHEN p_usuario = 0 THEN p_usuarioLogado ELSE p_usuario END,
    p_statusPreDocumento,
    p_observacoes);
END ADD_PRE_DOC_CAB_STATUS_CRIA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_SITUACAO_CRIA (
  p_usuarioLogado           IN NUMBER,
  p_estabelecimentoAtivo    IN NUMBER,
  p_idDocumentoFiscal       IN NUMBER,
  p_usuario                 IN NUMBER,
  p_situacaoDocumentoFiscal IN NUMBER,
  p_observacoes             IN VARCHAR)
IS
BEGIN
  INSERT INTO MODOCFISCALXSITUACOES (
    id,
    idDocumentoFiscal,
    data,
    usuario,
    situacaoDocumentoFiscal,
    observacoes)
  VALUES (
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXSITUACOES', 'id', 14, p_estabelecimentoAtivo, NULL),
    p_idDocumentoFiscal,
    SYSDATE,
    CASE WHEN p_usuario = 0 THEN p_usuarioLogado ELSE p_usuario END,
    p_situacaoDocumentoFiscal,
    p_observacoes);
END ADD_DOC_FISC_CAB_SITUACAO_CRIA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_ENDER_GRAVA (
    p_estabelecimentoAtivo         IN NUMBER,
    p_idEnderecoEstoqueDocFiscal   IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idEnderecoEstoque            IN NUMBER,
    p_quantidade                   IN NUMBER,
    p_quantidadeDevolvidaRetornada IN NUMBER,
    p_observacoes                  IN NUMBER,
    /* Retornos */
    r_idEnderecoEstoqueDocFiscal   OUT NUMBER)
IS
BEGIN
  r_idEnderecoEstoqueDocFiscal := p_idEnderecoEstoqueDocFiscal;
  IF r_idEnderecoEstoqueDocFiscal = 0 THEN
    r_idEnderecoEstoqueDocFiscal :=
      FUNC_ADD_BUSCA_PROXIMO_ID(
        'MODOCFISCALXENDERECOESTOQ',
        'idEnderecoEstoqueDocFiscal',
        14,
        p_estabelecimentoAtivo,
        NULL);
  END IF;
  MERGE INTO MODOCFISCALXENDERECOESTOQ a USING (
    SELECT
      r_idEnderecoEstoqueDocFiscal   idEnderecoEstoqueDocFiscal,
      p_idItemDocFiscal              idItemDocFiscal,
      p_idEnderecoEstoque            idEnderecoEstoque,
      p_quantidade                   quantidade,
      p_quantidadeDevolvidaRetornada quantidadeDevolvidaRetornada,
      p_observacoes                  observacoes
    FROM DUAL) b
  ON (a.idEnderecoEstoqueDocFiscal = b.idEnderecoEstoqueDocFiscal)
  WHEN MATCHED THEN UPDATE SET
    a.idItemDocFiscal              = b.idItemDocFiscal,
    a.idEnderecoEstoque            = b.idEnderecoEstoque,
    a.quantidade                   = b.quantidade,
    a.quantidadeDevolvidaRetornada = b.quantidadeDevolvidaRetornada,
    a.observacoes                  = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idEnderecoEstoqueDocFiscal,
    idItemDocFiscal,
    idEnderecoEstoque,
    quantidade,
    quantidadeDevolvidaRetornada,
    observacoes)
  VALUES (
    b.idEnderecoEstoqueDocFiscal,
    b.idItemDocFiscal,
    b.idEnderecoEstoque,
    b.quantidade,
    b.quantidadeDevolvidaRetornada,
    b.observacoes);
END ADD_DOC_FISC_ITEM_ENDER_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_ENDER_GRAVA (
    p_estabelecimentoAtivo         IN NUMBER,
    p_idEnderecoEstoquePreDocument IN NUMBER,
    p_idItemPreDocumento           IN NUMBER,
    p_idEnderecoEstoque            IN NUMBER,
    p_quantidade                   IN NUMBER,
    p_quantidadeDevolvidaRetornada IN NUMBER,
    p_observacoes                  IN NUMBER,
    /* Retornos */
    r_idEnderecoEstoquePreDocument   OUT NUMBER)
IS
BEGIN
  r_idEnderecoEstoquePreDocument := p_idEnderecoEstoquePreDocument;
  IF r_idEnderecoEstoquePreDocument = 0 THEN
    r_idEnderecoEstoquePreDocument :=
      FUNC_ADD_BUSCA_PROXIMO_ID(
        'MOPREDOCUMXENDERECOESTOQ',
        'idEnderecoEstoquePreDocumento',
        14,
        p_estabelecimentoAtivo,
        NULL);
  END IF;
  MERGE INTO MOPREDOCUMXENDERECOESTOQ a USING (
    SELECT
      r_idEnderecoEstoquePreDocument idEnderecoEstoquePreDocumento,
      p_idItemPreDocumento           idItemPreDocumento,
      p_idEnderecoEstoque            idEnderecoEstoque,
      p_quantidade                   quantidade,
      p_quantidadeDevolvidaRetornada quantidadeDevolvidaRetornada,
      p_observacoes                  observacoes
    FROM DUAL) b
  ON (a.idEnderecoEstoquePreDocumento = b.idEnderecoEstoquePreDocumento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemPreDocumento           = b.idItemPreDocumento,
    a.idEnderecoEstoque            = b.idEnderecoEstoque,
    a.quantidade                   = b.quantidade,
    a.quantidadeDevolvidaRetornada = b.quantidadeDevolvidaRetornada,
    a.observacoes                  = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idEnderecoEstoquePreDocumento,
    idItemPreDocumento,
    idEnderecoEstoque,
    quantidade,
    quantidadeDevolvidaRetornada,
    observacoes)
  VALUES (
    b.idEnderecoEstoquePreDocumento,
    b.idItemPreDocumento,
    b.idEnderecoEstoque,
    b.quantidade,
    b.quantidadeDevolvidaRetornada,
    b.observacoes);
END ADD_PRE_DOC_ITEM_ENDER_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_COMP_GRAVA (
    p_estabelecimentoAtivo IN NUMBER,
    p_id                   IN NUMBER,
    p_idItemDocFiscal      IN NUMBER,
    p_composicaoPreco      IN NUMBER,
    p_selecionado          IN NUMBER,
    p_quantidade           IN NUMBER,
    p_observacoes          IN VARCHAR2,
    /* Retornos */
    r_id                   OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXCOMPOSICOESPR', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MODOCFISCALXCOMPOSICOESPR a 
  USING (
    SELECT
      r_id              id,
      p_idItemDocFiscal idItemDocFiscal,
      p_composicaoPreco composicaoPreco,
      p_selecionado     selecionado,
      p_quantidade      quantidade,
      p_observacoes     observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idItemDocFiscal = b.idItemDocFiscal,
    a.composicaoPreco = b.composicaoPreco,
    a.selecionado     = b.selecionado,
    a.quantidade      = b.quantidade,
    a.observacoes     = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idItemDocFiscal,
    composicaoPreco,
    selecionado,
    quantidade,
    observacoes)
  VALUES (
    b.id,
    b.idItemDocFiscal,
    b.composicaoPreco,
    b.selecionado,
    b.quantidade,
    b.observacoes);
END ADD_DOC_FISC_ITEM_COMP_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_COMP_GRAVA (
    p_estabelecimentoAtivo IN NUMBER,
    p_id                   IN NUMBER,
    p_idItemPreDocumento   IN NUMBER,
    p_composicaoPreco      IN NUMBER,
    p_selecionado          IN NUMBER,
    p_quantidade           IN NUMBER,
    p_observacoes          IN VARCHAR2,
    /* Retornos */
    r_id                   OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXCOMPOSICOESPR', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOPREDOCUMXCOMPOSICOESPR a 
  USING (
    SELECT
      r_id                 id,
      p_idItemPreDocumento idItemPreDocumento,
      p_composicaoPreco    composicaoPreco,
      p_selecionado        selecionado,
      p_quantidade         quantidade,
      p_observacoes        observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idItemPreDocumento = b.idItemPreDocumento,
    a.composicaoPreco    = b.composicaoPreco,
    a.selecionado        = b.selecionado,
    a.quantidade         = b.quantidade,
    a.observacoes        = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idItemPreDocumento,
    composicaoPreco,
    selecionado,
    quantidade,
    observacoes)
  VALUES (
    b.id,
    b.idItemPreDocumento,
    b.composicaoPreco,
    b.selecionado,
    b.quantidade,
    b.observacoes);
END ADD_PRE_DOC_ITEM_COMP_GRAVA;

/

DROP PROCEDURE ADD_ORCAMENTO_COMPPRECO_EXCLUI;

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_COMP_EXCLUI (
  p_idItemOrcamento      IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)  
IS  
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT id
    FROM MOORCAMENTOXCOMPOSICOESPR
    WHERE idItemOrcamento = p_idItemOrcamento)
  LOOP
  r_atualizarObservacoes := 1;
  DELETE MOORCAMENTOXCOMPOSICOESPR b
  WHERE b.id = a.id;
  END LOOP;
END ADD_ORCAMENTO_ITEM_COMP_EXCLUI;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_COMP_EXCLUI (
  p_idItemPreDocumento   IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)  
IS  
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT id
    FROM MOPREDOCUMXCOMPOSICOESPR
    WHERE idItemPreDocumento = p_idItemPreDocumento)
  LOOP
  r_atualizarObservacoes := 1;
  DELETE MOPREDOCUMXCOMPOSICOESPR b
  WHERE b.id = a.id;
  END LOOP;
END ADD_PRE_DOC_ITEM_COMP_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_COMP_EXCLUI (
  p_idItemDocFiscal      IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)  
IS  
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT id
    FROM MODOCFISCALXCOMPOSICOESPR
    WHERE idItemDocFiscal = p_idItemDocFiscal)
  LOOP
  r_atualizarObservacoes := 1;
  DELETE MODOCFISCALXCOMPOSICOESPR b
  WHERE b.id = a.id;
  END LOOP;
END ADD_DOC_FISC_ITEM_COMP_EXCLUI;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_COMP_ORC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemOrcamentoPara  IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_ORCAMENTO_ITEM_COMP_EXCLUI (
    p_idItemOrcamentoPara,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM MOORCAMENTOXCOMPOSICOESPR
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    ADD_ORCAMENTO_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemOrcamentoPara,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_auxNumber);
  END LOOP;
END ADD_ORCAMENTO_ITEM_COMP_ORC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_COMP_ORCAMEN (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemOrcamentoDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_COMP_EXCLUI (
    p_idItemPreDocumentoPara,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM MOORCAMENTOXCOMPOSICOESPR
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    ADD_PRE_DOC_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_COMP_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_COMP_ORCAMEN (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_COMP_EXCLUI (
    p_idItemDocFiscalPara,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM MOORCAMENTOXCOMPOSICOESPR
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    ADD_DOC_FISC_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_COMP_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_COMP_PRE_DOC (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemPreDocumentoDe   IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_COMP_EXCLUI (
    p_idItemPreDocumentoPara,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM MOPREDOCUMXCOMPOSICOESPR
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    ADD_PRE_DOC_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_COMP_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_COMP_PRE_DOC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemPreDocumentoDe IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_COMP_EXCLUI (
    p_idItemDocFiscalPara,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM MOPREDOCUMXCOMPOSICOESPR
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    ADD_DOC_FISC_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_COMP_PRE_DOC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_COMP_DOC_FIS (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemDocFiscalDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_COMP_EXCLUI (
    p_idItemPreDocumentoPara,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM MODOCFISCALXCOMPOSICOESPR
    WHERE idItemDocFiscal = p_idItemDocFiscalDe
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    ADD_PRE_DOC_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_COMP_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_COMP_DOC_FIS (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemDocFiscalDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_COMP_EXCLUI (
    p_idItemDocFiscalPara,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM MODOCFISCALXCOMPOSICOESPR
    WHERE idItemDocFiscal = p_idItemDocFiscalDe
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    ADD_DOC_FISC_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_COMP_DOC_FIS;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_COMP_TEMP (
  p_uniqueMachineID      IN VARCHAR2,
  p_estabelecimentoAtivo IN NUMBER,
  p_nomeTempComposicao   IN VARCHAR2,
  p_temp_sequencia       IN NUMBER,
  p_idItemOrcamento      IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_idItem               NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_ORCAMENTO_ITEM_COMP_EXCLUI (
    p_idItemOrcamento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      sequenciaComposicao,
      idItem,
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM TEMPCOMPOSICAOPRECO
    WHERE uniqueMachineID = p_uniqueMachineID
    AND nomeTempComposicao = p_nomeTempComposicao
    AND sequencia = p_temp_sequencia
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    v_idItem := 0;
    ADD_ORCAMENTO_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      a.idItem,
      p_idItemOrcamento,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_idItem);
    IF v_idItem <> a.idItem THEN
      UPDATE TEMPCOMPOSICAOPRECO a
      SET a.idItem = v_idItem
      WHERE a.uniqueMachineID = p_uniqueMachineID
      AND a.nomeTempComposicao = p_nomeTempComposicao
      AND a.sequencia = p_temp_sequencia
      AND a.sequenciaComposicao = a.sequenciaComposicao;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_COMP_TEMP;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_COMP_TEMP (
  p_uniqueMachineID      IN VARCHAR2,
  p_estabelecimentoAtivo IN NUMBER,
  p_nomeTempComposicao   IN VARCHAR2,
  p_temp_sequencia       IN NUMBER,
  p_idItemPreDocumento   IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_idItem               NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_COMP_EXCLUI (
    p_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      sequenciaComposicao,
      idItem,
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM TEMPCOMPOSICAOPRECO
    WHERE uniqueMachineID = p_uniqueMachineID
    AND nomeTempComposicao = p_nomeTempComposicao
    AND sequencia = p_temp_sequencia
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    v_idItem := 0;
    ADD_PRE_DOC_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      a.idItem,
      p_idItemPreDocumento,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_idItem);
    IF v_idItem <> a.idItem THEN
      UPDATE TEMPCOMPOSICAOPRECO a
      SET a.idItem = v_idItem
      WHERE a.uniqueMachineID = p_uniqueMachineID
      AND a.nomeTempComposicao = p_nomeTempComposicao
      AND a.sequencia = p_temp_sequencia
      AND a.sequenciaComposicao = a.sequenciaComposicao;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_COMP_TEMP;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_COMP_TEMP (
  p_uniqueMachineID      IN VARCHAR2,
  p_estabelecimentoAtivo IN NUMBER,
  p_nomeTempComposicao   IN VARCHAR2,
  p_temp_sequencia       IN NUMBER,
  p_idItemDocFiscal      IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_idItem               NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_COMP_EXCLUI (
    p_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  FOR a IN (
    SELECT
      sequenciaComposicao,
      idItem,
      composicaoPreco,
      selecionado,
      quantidade,
      observacoes
    FROM TEMPCOMPOSICAOPRECO
    WHERE uniqueMachineID = p_uniqueMachineID
    AND nomeTempComposicao = p_nomeTempComposicao
    AND sequencia = p_temp_sequencia
    AND selecionado = 1)
  LOOP
    r_atualizarObservacoes := 1;
    v_idItem := 0;
    ADD_DOC_FISC_ITEM_COMP_GRAVA (
      p_estabelecimentoAtivo,
      a.idItem,
      p_idItemDocFiscal,
      a.composicaoPreco,
      a.selecionado,
      a.quantidade,
      a.observacoes,
      v_idItem);
    IF v_idItem <> a.idItem THEN
      UPDATE TEMPCOMPOSICAOPRECO a
      SET a.idItem = v_idItem
      WHERE a.uniqueMachineID = p_uniqueMachineID
      AND a.nomeTempComposicao = p_nomeTempComposicao
      AND a.sequencia = p_temp_sequencia
      AND a.sequenciaComposicao = a.sequenciaComposicao;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_COMP_TEMP;

/

DROP PROCEDURE ADD_MORESERVASESTOQUE_EXCLUI;

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_EXCLUI (
  p_idReservaEstoque IN NUMBER)
IS
BEGIN
  DELETE MOORCAMENTOXRESERVAESTOQ
  WHERE idReservaEstoque = p_idReservaEstoque;
  DELETE MODOCTRANSFXRESERVAESTOQ
  WHERE idReservaEstoque = p_idReservaEstoque;
  DELETE MORESERVASESTOQUE
  WHERE idReservaEstoque = p_idReservaEstoque;
END ADD_RESERVA_ESTOQUE_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
  p_idItemOrcamento        IN NUMBER,
  p_bufferIdReservaEstoque IN VARCHAR,
  /* Retornos */
  r_bufferIdReservaEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT a.idReservaEstoque
    FROM MOORCAMENTOXRESERVAESTOQ a
    JOIN MORESERVASESTOQUE b
    ON b.idReservaEstoque = a.idReservaEstoque
    WHERE a.idItemOrcamento = p_idItemOrcamento)
  LOOP
    r_bufferIdReservaEstoque :=
      CASE
        WHEN r_bufferIdReservaEstoque IS NULL
          OR r_bufferIdReservaEstoque = ''
          OR r_bufferIdReservaEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdReservaEstoque) || ';'
      END
      || LPAD(a.idReservaEstoque,14,'0');
    ADD_RESERVA_ESTOQUE_EXCLUI (a.idReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_ORC_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
  p_idItemDocTransferencia IN NUMBER,
  p_bufferIdReservaEstoque IN VARCHAR,
  /* Retornos */
  r_bufferIdReservaEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT a.idReservaEstoque
    FROM MODOCTRANSFXRESERVAESTOQ a
    JOIN MORESERVASESTOQUE b
    ON b.idReservaEstoque = a.idReservaEstoque
    WHERE a.idItemDocTransferencia = p_idItemDocTransferencia)
  LOOP
    r_bufferIdReservaEstoque :=
      CASE
        WHEN r_bufferIdReservaEstoque IS NULL
          OR r_bufferIdReservaEstoque = ''
          OR r_bufferIdReservaEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdReservaEstoque) || ';'
      END
      || LPAD(a.idReservaEstoque,14,'0');
    ADD_RESERVA_ESTOQUE_EXCLUI (a.idReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_TRA_EXCLUI;

/

DROP PROCEDURE ADD_MOESTOQUES_EXCLUI;

create or replace PROCEDURE ADD_ESTOQUE_EXCLUI (
  p_idEstoque IN NUMBER)
IS
BEGIN
  UPDATE MODOCTROCAXITENS
  SET idEstoque = 0
  WHERE idEstoque = p_idEstoque;
  DELETE MOPREDOCUMXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MODOCFISCALXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOSEPARACAOXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOBALANCOXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MODOCTRANSFXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOESTOQUES
  WHERE idEstoque = p_idEstoque;
END ADD_ESTOQUE_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_EXCLUI (
  p_idItemPreDocumento IN NUMBER,
  p_bufferIdEstoque    IN VARCHAR,
  /* Retornos */
  r_bufferIdEstoque    OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT a.idEstoque
    FROM MOPREDOCUMXESTOQUE a
    JOIN MOESTOQUES b
    ON b.idEstoque = a.idEstoque
    WHERE a.idItemPreDocumento = p_idItemPreDocumento)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_EXCLUI (
  p_idItemDocFiscal IN NUMBER,
  p_bufferIdEstoque IN VARCHAR,
  /* Retornos */
  r_bufferIdEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT a.idEstoque
    FROM MODOCFISCALXESTOQUE a
    JOIN MOESTOQUES b
    ON b.idEstoque = a.idEstoque
    WHERE a.idItemDocFiscal = p_idItemDocFiscal)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_SEPARACAO_EXCLUI (
  p_idItemSeparacao IN NUMBER,
  p_bufferIdEstoque IN VARCHAR,
  /* Retornos */
  r_bufferIdEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT a.idEstoque
    FROM MOSEPARACAOXESTOQUE a
    JOIN MOESTOQUES b
    ON b.idEstoque = a.idEstoque
    WHERE a.idItemSeparacao = p_idItemSeparacao)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
  END LOOP;
END ADD_ESTOQUE_SEPARACAO_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_BALANCO_EXCLUI (
  p_divergenciaBalanco IN NUMBER,
  p_bufferIdEstoque    IN VARCHAR,
  /* Retornos */
  r_bufferIdEstoque    OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT a.idEstoque
    FROM MOBALANCOXESTOQUE a
    JOIN MOESTOQUES b
    ON b.idEstoque = a.idEstoque
    WHERE a.divergenciaBalanco = p_divergenciaBalanco)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_BALANCO_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_TRANSF_EXCLUI (
  p_idItemDocTransferencia IN NUMBER,
  p_bufferIdEstoque        IN VARCHAR,
  /* Retornos */
  r_bufferIdEstoque        OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT a.idEstoque
    FROM MODOCTRANSFXESTOQUE a
    JOIN MOESTOQUES b
    ON b.idEstoque = a.idEstoque
    WHERE a.idItemDocTransferencia = p_idItemDocTransferencia)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_TRANSF_EXCLUI;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_ATUALIZ(
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemSeparacao              IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  ADD_ESTOQUE_SEPARACAO_EXCLUI (
    p_idItemSeparacao,
    v_bufferIdEstoque,
    v_bufferIdEstoque);
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemSeparacao,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEstS.indicadorPropriedadePosseItem locEst_indicProprPosseSaida,
      COALESCE (estXLocS.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderSaida,
      locEstE.indicadorPropriedadePosseItem locEst_indicProprPosseEntrada,
      COALESCE (estXLocE.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderEntrada
    FROM MOSEPARACAOXITENS item
    JOIN MOSEPARACOES cab
    ON cab.separacao = item.separacao
    JOIN PAETAPASSEPARACAO etap
    ON etap.etapaSeparacao = cab.etapaSeparacao
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEstS
    ON locEstS.localEstoque = item.localEstoqueSaida
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocS
    ON estXLocS.estabelecimento = cab.estabelecimento
    AND estXLocS.localEstoque = item.localEstoqueSaida
    JOIN PALOCAISESTOQUE locEstE
    ON locEstE.localEstoque = item.localEstoqueEntrada
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocE
    ON estXLocE.estabelecimento = cab.estabelecimento
    AND estXLocE.localEstoque = item.localEstoqueEntrada
    WHERE item.idItemSeparacao = p_idItemSeparacao
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND etap.situacaoSeparacao = 'F')
  LOOP
    ADD_SEPARACAO_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemSeparacao,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoqueSaida,
      a.pessoaParticipanteSaida,
      a.localEstoqueEntrada,
      a.pessoaParticipanteEntrada,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseSaida,
      a.estXLoc_solicitaEnderSaida,
      a.locEst_indicProprPosseEntrada,
      a.estXLoc_solicitaEnderEntrada,
      v_bufferIdEstoque);
  END LOOP;
END ADD_SEPARACAO_ITEM_EST_ATUALIZ;

/

create or replace PROCEDURE ADD_SEPARACAO_CAB_EST_ATUALIZA(
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_separacao                    IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  FOR a IN (
    SELECT idItemSeparacao
    FROM MOSEPARACAOXITENS
    WHERE separacao = p_separacao)
  LOOP
    ADD_ESTOQUE_SEPARACAO_EXCLUI (
      a.idItemSeparacao,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemSeparacao,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEstS.indicadorPropriedadePosseItem locEst_indicProprPosseSaida,
      COALESCE (estXLocS.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderSaida,
      locEstE.indicadorPropriedadePosseItem locEst_indicProprPosseEntrada,
      COALESCE (estXLocE.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderEntrada
    FROM MOSEPARACAOXITENS item
    JOIN MOSEPARACOES cab
    ON cab.separacao = item.separacao
    JOIN PAETAPASSEPARACAO etap
    ON etap.etapaSeparacao = cab.etapaSeparacao
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEstS
    ON locEstS.localEstoque = item.localEstoqueSaida
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocS
    ON estXLocS.estabelecimento = cab.estabelecimento
    AND estXLocS.localEstoque = item.localEstoqueSaida
    JOIN PALOCAISESTOQUE locEstE
    ON locEstE.localEstoque = item.localEstoqueEntrada
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocE
    ON estXLocE.estabelecimento = cab.estabelecimento
    AND estXLocE.localEstoque = item.localEstoqueEntrada
    WHERE item.separacao = p_separacao
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND etap.situacaoSeparacao = 'F')
  LOOP
    ADD_SEPARACAO_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemSeparacao,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoqueSaida,
      a.pessoaParticipanteSaida,
      a.localEstoqueEntrada,
      a.pessoaParticipanteEntrada,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseSaida,
      a.estXLoc_solicitaEnderSaida,
      a.locEst_indicProprPosseEntrada,
      a.estXLoc_solicitaEnderEntrada,
      v_bufferIdEstoque);
  END LOOP;
END ADD_SEPARACAO_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_ATUALIZA(
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  ADD_ESTOQUE_PRE_DOC_EXCLUI (
    p_idItemPreDocumento,
    v_bufferIdEstoque,
    v_bufferIdEstoque);
  FOR a IN (
    SELECT
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc
    ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade + item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.idItemPreDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_ITEM_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_preDocumento                 IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  FOR a IN (
    SELECT idItemPreDocumento
    FROM MOPREDOCUMXITENS
    WHERE preDocumento = p_preDocumento)
  LOOP
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      a.idItemPreDocumento,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc
    ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.idItemPreDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_ATUALIZA(
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  ADD_ESTOQUE_DOC_FISC_EXCLUI (
    p_idItemDocFiscal,
    v_bufferIdEstoque,
    v_bufferIdEstoque);
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc
    ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.idItemDocFiscal,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_EST_ATUALIZA(
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  FOR a IN (
    SELECT idItemDocFiscal
    FROM MODOCFISCALXITENS
    WHERE idDocumentoFiscal = p_idDocumentoFiscal)
  LOOP
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      a.idItemDocFiscal,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc
    ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal
    AND transfXDoc.entradaSaidaOriginal IN('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.idItemDocFiscal,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_CAB_EST_ATUALIZA;

/

DROP PROCEDURE ADD_DOC_FISC_CAB_ATUALIZA_ENTRADA;

create or replace PROCEDURE ADD_DOC_FISC_CAB_ATUALIZA_ENTR(
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_serieFiscal                  IN VARCHAR2,
  p_subserieFiscal               IN NUMBER,
  p_documentoFiscal              IN NUMBER,
  p_dataEmissao                  IN DATE,
  p_timezoneEmissao              IN VARCHAR2,
  p_dataEntradaSaida             IN DATE,
  p_chaveNfe                     IN VARCHAR)
IS
BEGIN
  FOR a IN (
  SELECT DISTINCT itemDocE.idDocumentoFiscal
  FROM MODOCFISCALXITENS itemDocS
  JOIN MODOCTRANSFXDOCFISCAL transfXDocS
  ON transfXDocS.idItemDocFiscal = itemDocS.idItemDocFiscal
  JOIN MODOCTRANSFXDOCFISCAL transfXDocE
  ON transfXDocE.idItemDocTransferencia = transfXDocS.idItemDocTransferencia
  JOIN MODOCFISCALXITENS itemDocE
  ON itemDocE.idItemDocFiscal = transfXDocE.idItemDocFiscal
  WHERE itemDocS.idDocumentoFiscal = p_idDocumentoFiscal
  AND transfXDocS.entradaSaidaOriginal = 'S'
  AND transfXDocE.entradaSaidaOriginal = 'E'
  AND itemDocE.idDocumentoFiscal > 0)
  LOOP
    UPDATE MODOCUMENTOSFISCAIS b SET
      b.serieFiscal      = p_serieFiscal,
      b.subserieFiscal   = p_subserieFiscal,
      b.documentoFiscal  = p_documentoFiscal,
      b.dataEmissao      = p_dataEmissao,
      b.timezoneEmissao  = p_timezoneEmissao,
      b.dataEntradaSaida = p_dataEntradaSaida,
      b.chaveNfe         = p_chaveNfe
    WHERE b.idDocumentoFiscal = a.idDocumentoFiscal;
    ADD_DOC_FISC_CAB_EST_ATUALIZA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      a.idDocumentoFiscal,
      p_estabelecimentoAtivo);
    ADD_DOC_FISC_CAB_FIL_ATUALIZA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      a.idDocumentoFiscal,
      p_estabelecimentoAtivo);
  END LOOP;
END ADD_DOC_FISC_CAB_ATUALIZA_ENTR;

/

DROP PROCEDURE ADD_MOSEPARACAOXITENS_EXCLUI;

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EXCLUI (
  p_idItemSeparacao IN NUMBER)
IS
  v_auxAlpha VARCHAR (32000);
BEGIN
  ADD_ESTOQUE_SEPARACAO_EXCLUI (
    p_idItemSeparacao,
    '',
    v_auxAlpha);
  DELETE MOSEPARACAOXNUMEROSSERIE
  WHERE idItemSeparacao = p_idItemSeparacao;
  DELETE MOSEPARACAOXENDERECOESTOQ
  WHERE idItemSeparacao = p_idItemSeparacao;
  DELETE MOSEPARACAOXITENS
  WHERE idItemSeparacao = p_idItemSeparacao;
END ADD_SEPARACAO_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_ORC_EXCLUI (
  p_idItemOrcamento IN NUMBER)
IS
BEGIN
  FOR a IN (
    SELECT idItemSeparacao
    FROM MOSEPARACAOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento)
  LOOP
    ADD_SEPARACAO_ITEM_EXCLUI (a.idItemSeparacao);
  END LOOP;
END ADD_SEPARACAO_ITEM_ORC_EXCLUI;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_PRE_EXCLUI (
  p_idItemPreDocumento IN NUMBER)
IS
BEGIN
  FOR a IN (
    SELECT idItemSeparacao
    FROM MOSEPARACAOXITENS
    WHERE idItemPreDocumento = p_idItemPreDocumento)
  LOOP
    ADD_SEPARACAO_ITEM_EXCLUI (a.idItemSeparacao);
  END LOOP;
END ADD_SEPARACAO_ITEM_PRE_EXCLUI;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_DOC_EXCLUI (
  p_idItemDocFiscal IN NUMBER)
IS
BEGIN
  FOR a IN (
    SELECT idItemSeparacao
    FROM MOSEPARACAOXITENS
    WHERE idItemDocFiscal = p_idItemDocFiscal)
  LOOP
    ADD_SEPARACAO_ITEM_EXCLUI (a.idItemSeparacao);
  END LOOP;
END ADD_SEPARACAO_ITEM_DOC_EXCLUI;

/

DROP PROCEDURE ADD_MOVALESDESCONTO_EXCLUI;

create or replace PROCEDURE ADD_VALEDESCONTO_EXCLUI (
  p_idValeDesconto IN NUMBER)
IS
BEGIN
  DELETE MOVALEDESCXPREDOCUM
  WHERE idValeDesconto = p_idValeDesconto;
  DELETE MOVALEDESCXITEMPREDOCUM
  WHERE idValeDesconto = p_idValeDesconto;
  DELETE MOVALEDESCXDOCFISCAL
  WHERE idValeDesconto = p_idValeDesconto;
  DELETE MOVALEDESCXITEMDOCFISCAL
  WHERE idValeDesconto = p_idValeDesconto;
  DELETE MOVALESDESCONTO
  WHERE idValeDesconto = p_idValeDesconto;
END ADD_VALEDESCONTO_EXCLUI;

/

create or replace PROCEDURE ADD_VALEDESCONTO_PRE_CAB_EXCL (
  p_preDocumento         IN NUMBER,
  p_bufferIdValeDesconto IN VARCHAR,
  /* Retornos */
  r_bufferIdValeDesconto OUT VARCHAR)
IS
BEGIN
  r_bufferIdValeDesconto := p_bufferIdValeDesconto;
  FOR a IN (
    SELECT a.idValeDesconto
    FROM MOVALEDESCXPREDOCUM a
    JOIN MOVALESDESCONTO b
    ON b.idValeDesconto = a.idValeDesconto
    WHERE a.preDocumento = p_preDocumento)
  LOOP
    r_bufferIdValeDesconto :=
      CASE
        WHEN r_bufferIdValeDesconto IS NULL
          OR r_bufferIdValeDesconto = ''
          OR r_bufferIdValeDesconto = ' '
        THEN ''
        ELSE TRIM (r_bufferIdValeDesconto) || ';'
      END
      || LPAD(a.idValeDesconto,14,'0');
    ADD_VALEDESCONTO_EXCLUI (a.idValeDesconto);
  END LOOP;
END ADD_VALEDESCONTO_PRE_CAB_EXCL;

/

create or replace PROCEDURE ADD_VALEDESCONTO_PRE_ITE_EXCL (
  p_idItemPreDocumento   IN NUMBER,
  p_bufferIdValeDesconto IN VARCHAR,
  /* Retornos */
  r_bufferIdValeDesconto OUT VARCHAR)
IS
BEGIN
  r_bufferIdValeDesconto := p_bufferIdValeDesconto;
  FOR a IN (
    SELECT a.idValeDesconto
    FROM MOVALEDESCXITEMPREDOCUM a
    JOIN MOVALESDESCONTO b
    ON b.idValeDesconto = a.idValeDesconto
    WHERE a.idItemPreDocumento = p_idItemPreDocumento)
  LOOP
    r_bufferIdValeDesconto :=
      CASE
        WHEN r_bufferIdValeDesconto IS NULL
          OR r_bufferIdValeDesconto = ''
          OR r_bufferIdValeDesconto = ' '
        THEN ''
        ELSE TRIM (r_bufferIdValeDesconto) || ';'
      END
      || LPAD(a.idValeDesconto,14,'0');
    ADD_VALEDESCONTO_EXCLUI (a.idValeDesconto);
  END LOOP;
END ADD_VALEDESCONTO_PRE_ITE_EXCL;

/

create or replace PROCEDURE ADD_VALEDESCONTO_DOC_CAB_EXCL (
  p_idDocumentoFiscal    IN NUMBER,
  p_bufferIdValeDesconto IN VARCHAR,
  /* Retornos */
  r_bufferIdValeDesconto OUT VARCHAR)
IS
BEGIN
  r_bufferIdValeDesconto := p_bufferIdValeDesconto;
  FOR a IN (
    SELECT a.idValeDesconto
    FROM MOVALEDESCXDOCFISCAL a
    JOIN MOVALESDESCONTO b
    ON b.idValeDesconto = a.idValeDesconto
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal)
  LOOP
    r_bufferIdValeDesconto :=
      CASE
        WHEN r_bufferIdValeDesconto IS NULL
          OR r_bufferIdValeDesconto = ''
          OR r_bufferIdValeDesconto = ' '
        THEN ''
        ELSE TRIM (r_bufferIdValeDesconto) || ';'
      END
      || LPAD(a.idValeDesconto,14,'0');
    ADD_VALEDESCONTO_EXCLUI (a.idValeDesconto);
  END LOOP;
END ADD_VALEDESCONTO_DOC_CAB_EXCL;

/

create or replace PROCEDURE ADD_VALEDESCONTO_DOC_ITE_EXCL (
  p_idItemDocFiscal      IN NUMBER,
  p_bufferIdValeDesconto IN VARCHAR,
  /* Retornos */
  r_bufferIdValeDesconto OUT VARCHAR)
IS
BEGIN
  r_bufferIdValeDesconto := p_bufferIdValeDesconto;
  FOR a IN (
    SELECT a.idValeDesconto
    FROM MOVALEDESCXITEMDOCFISCAL a
    JOIN MOVALESDESCONTO b
    ON b.idValeDesconto = a.idValeDesconto
    WHERE a.idItemDocFiscal = p_idItemDocFiscal)
  LOOP
    r_bufferIdValeDesconto :=
      CASE
        WHEN r_bufferIdValeDesconto IS NULL
          OR r_bufferIdValeDesconto = ''
          OR r_bufferIdValeDesconto = ' '
        THEN ''
        ELSE TRIM (r_bufferIdValeDesconto) || ';'
      END
      || LPAD(a.idValeDesconto,14,'0');
    ADD_VALEDESCONTO_EXCLUI (a.idValeDesconto);
  END LOOP;
END ADD_VALEDESCONTO_DOC_ITE_EXCL;

/

DROP PROCEDURE ADD_CAPRODUTOXCUSTOS_EXCLUI;

create or replace PROCEDURE ADD_PRODUTO_CUSTO_EXCLUI (
  p_idProdutoXCusto IN NUMBER)
IS
BEGIN
  DELETE CATABELAPRECOXFORMACOESPR
  WHERE idProdutoXCustoAtual = p_idProdutoXCusto;
  DELETE CATABELAPRECOXFORMACOESPR
  WHERE idProdutoXCustoNovo = p_idProdutoXCusto;
  DELETE CAPRODUTOXCUSTOS
  WHERE idProdutoXCusto = p_idProdutoXCusto;
END ADD_PRODUTO_CUSTO_EXCLUI;

/

create or replace PROCEDURE ADD_PRODUTO_CUSTO_DATA_EXCLUI (
  p_produto IN NUMBER,
  p_data    IN DATE)
IS
BEGIN
  FOR a IN (
    SELECT idProdutoXCusto
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_produto
    AND TRUNC (data) >= TRUNC (p_data))
  LOOP
    ADD_PRODUTO_CUSTO_EXCLUI (a.idProdutoXCusto);
  END LOOP;
END ADD_PRODUTO_CUSTO_DATA_EXCLUI;

/


DROP PROCEDURE ADD_MOCONSERTOS_EXCLUI;

create or replace PROCEDURE ADD_CONSERTO_EXCLUI (
  p_idConserto IN NUMBER)
IS
BEGIN
  DELETE MOEVENTOS
  WHERE idConserto = p_idConserto;
  DELETE MOCONSERTOS
  WHERE idConserto = p_idConserto;
END ADD_CONSERTO_EXCLUI;

/

DROP PROCEDURE ADD_MODOCTRANSFXITENS_E_CORREL;

create or replace PROCEDURE ADD_DOCTRANSF_ITEM_EXCLUI (
  p_idItemDocTransferencia       IN NUMBER,
  p_cancela_Exclui_Reabre        IN CHAR,
  p_cab_situacaoDocTransferencia IN CHAR,
  p_cab_quantidadeConvertida     IN NUMBER,
  p_cab_valorProdutoServico      IN NUMBER,
  /* Retornos */
  r_cab_quantidadeConvertida     OUT NUMBER,
  r_cab_valorProdutoServico      OUT NUMBER)
IS
  v_auxAlpha VARCHAR (32000);
BEGIN
  r_cab_quantidadeConvertida := p_cab_quantidadeConvertida;
  r_cab_valorProdutoServico := p_cab_valorProdutoServico;
  IF p_cancela_Exclui_Reabre = 'R' THEN
    UPDATE MODOCUMENTOTRANSFXITENS
    SET quantidadeSaldo = quantidade
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND cancelado = 0;
  ELSE
    FOR a IN (
      SELECT
        quantidadeConvertida,
        valorProdutoServico
      FROM MODOCUMENTOTRANSFXITENS
      WHERE idItemDocTransferencia = p_idItemDocTransferencia
      AND cancelado = 0)
    LOOP
      r_cab_quantidadeConvertida := r_cab_quantidadeConvertida - a.quantidadeConvertida;
      r_cab_valorProdutoServico := r_cab_valorProdutoServico - a.valorProdutoServico;
    END LOOP;
  END IF;  
  IF p_cancela_Exclui_Reabre = 'E' THEN
    FOR a IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocTransferencia = p_idItemDocTransferencia)
    LOOP
      ADD_CONSERTO_EXCLUI (a.idConserto);
    END LOOP;
    ADD_ESTOQUE_TRANSF_EXCLUI (
      p_idItemDocTransferencia,
      '',
      v_auxAlpha);
    ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
      p_idItemDocTransferencia,
      '',
      v_auxAlpha);
    DELETE MODOCTRANSFXNUMEROSSERIE
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCTRANSFXORCAMENTOITEM
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MOPREDOCUMXCONFERENCIAS
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCFISCALXCONFERENCIAS
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCUMENTOTRANSFXITENS
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
  ELSE
    ADD_ESTOQUE_TRANSF_EXCLUI (
      p_idItemDocTransferencia,
      '',
      v_auxAlpha);
    IF p_cancela_Exclui_Reabre = 'C'
      OR p_cab_situacaoDocTransferencia <> 'E'
    THEN
      ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
        p_idItemDocTransferencia,
        '',
        v_auxAlpha);
    END IF;
    DELETE MODOCTRANSFXORCAMENTOITEM
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND entradaSaidaOriginal <> 'O';
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND entradaSaidaOriginal <> 'O';
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND entradaSaidaOriginal <> 'O';
    IF p_cancela_Exclui_Reabre = 'C' THEN
      UPDATE MODOCUMENTOTRANSFXITENS SET
        cancelado = 1,
        quantidadeSaldo = 0
      WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    END IF;
  END IF;
END ADD_DOCTRANSF_ITEM_EXCLUI;
	
/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_EXCLUI (
  p_documentoTransferencia IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  DELETE MODOCTRANSFXBLOQUEIOSEST
  WHERE documentoTransferencia = p_documentoTransferencia;
  DELETE MOORCAMENTOXCONFERENCIAS
  WHERE documentoTransferencia = p_documentoTransferencia;
  DELETE MOPREDOCUMXCONFERENCIAS
  WHERE documentoTransferencia = p_documentoTransferencia;
  DELETE MODOCFISCALXCONFERENCIAS
  WHERE documentoTransferencia = p_documentoTransferencia;
  DELETE MODOCTRANSFXCONFERENCIAS
  WHERE documentoTransferencia = p_documentoTransferencia;
  FOR a IN (
    SELECT idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS
    WHERE documentoTransferencia = p_documentoTransferencia)
  LOOP
    ADD_DOCTRANSF_ITEM_EXCLUI (
      a.idItemDocTransferencia,
      'E',
      ' ',
      0,
      0,
      v_auxNumber,
      v_auxNumber);
  END LOOP;
  UPDATE MOCONSERTOS
  SET documentoTransferenciaLojaCd = 0
  WHERE documentoTransferenciaLojaCd = p_documentoTransferencia;
  UPDATE MOCONSERTOS
  SET documentoTransferenciaFornec = 0
  WHERE documentoTransferenciaFornec = p_documentoTransferencia;
  UPDATE MOCONSERTOS
  SET documentoTransferenciaCdLoja = 0
  WHERE documentoTransferenciaCdLoja = p_documentoTransferencia;
  DELETE MODOCUMENTOSTRANSFERENCIA
  WHERE documentoTransferencia = p_documentoTransferencia;
END ADD_DOCTRANSF_CAB_EXCLUI;

/

create or replace PROCEDURE ADD_DOCTRANSF_ITEM_RES_ITEM(
    p_bufferIdReservaEstoque       IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_estabelecimentoSaida     IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_tipoDocumentoSaida       IN NUMBER,
    p_cab_situacaoDocTransferencia IN CHAR,
    p_modDoc_movimentaEstoque      IN NUMBER,
    p_item_idItemDocTransferencia  IN NUMBER,
    p_item_cancelado               IN NUMBER,
    p_item_validoSaida             IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_localEstoqueSaida       IN NUMBER,
    p_item_pessoaParticipanteSaida IN NUMBER,
    p_item_quantidadeSaldo         IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    /* Retornos */
    r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_idReservaEstoque NUMBER;  
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
    p_item_idItemDocTransferencia,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  FOR grade IN (
    SELECT
      p_cab_dataEmissao dataEmissao,
      p_item_quantidadeSaldo quantidadeSaldo,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = p_item_localEstoqueSaida
    WHERE gradProd.gradeProduto = p_item_gradeProduto
    AND p_cab_tipoDocumentoSaida > 100
    AND p_cab_situacaoDocTransferencia = 'A'
    AND p_modDoc_movimentaEstoque = 1
    AND p_item_cancelado = 0
    AND p_item_validoSaida = 1
    AND p_item_quantidadeSaldo <> 0)
  LOOP
    IF grade.controleEstoque=12 AND p_item_idFormulaTinta>0 THEN
      ADD_RESERVA_ESTOQUE_FORM_TINTA(
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        p_cab_estabelecimentoSaida,
        grade.dataEmissao,
        grade.dataEmissao, -- grade.dataEntrega,
        0, -- p_item_idItemOrcamento,
        p_item_idItemDocTransferencia,
        p_item_idFormulaTinta,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        0, -- p_item_idEnderecoEstoque
        grade.quantidadeSaldo,
        p_item_observacoes,
        grade.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque);
    ELSIF grade.controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT(
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        p_cab_estabelecimentoSaida,
        grade.dataEmissao,
        grade.dataEmissao, -- grade.dataEntrega,
        0, -- p_item_idItemOrcamento
        p_item_idItemDocTransferencia,
        p_item_gradeProduto,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        0, -- p_item_idEnderecoEstoque
        grade.quantidadeSaldo,
        p_item_observacoes,
        grade.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque);
    ELSIF grade.controleEstoque IN (1,5,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA(
        0,
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimentoSaida,
        grade.dataEmissao, --p_data
        p_item_gradeProduto,
        p_cab_modeloDocumento,
        'S', -- p_cab_entradaSaida,
        grade.indicadorPropriedadePosseItem,
        p_item_pessoaParticipanteSaida,
        p_item_localEstoqueSaida,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        0, -- p_idEnderecoEstoque
        0, -- p_idNumeroSerie
        grade.quantidadeSaldo,
        p_item_observacoes,
        0, -- p_item_idItemOrcamento
        p_item_idItemDocTransferencia,
        v_idReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP;  
END ADD_DOCTRANSF_ITEM_RES_ITEM;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_RESERVA_GRAV(
  p_documentoTransferencia IN NUMBER,
  p_estabelecimentoAtivo   IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR a IN (
    SELECT idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS
    WHERE documentoTransferencia = p_documentoTransferencia)
  LOOP
    ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
      a.idItemDocTransferencia,
      v_bufferIdReservaEstoque,
      v_bufferIdReservaEstoque);
  END LOOP;
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimentoSaida,
      cab.dataEmissao,
      cab.tipoDocumentoSaida,
      cab.situacaoDocTransferencia,
      modDoc.movimentaEstoque,
      item.idItemDocTransferencia,
      item.cancelado,
      item.validoSaida,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.quantidadeSaldo,
      item.observacoes
    FROM MODOCUMENTOTRANSFXITENS item
    JOIN MODOCUMENTOSTRANSFERENCIA cab
    ON cab.documentoTransferencia = item.documentoTransferencia
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    WHERE item.documentoTransferencia = p_documentoTransferencia
    AND cab.tipoDocumentoSaida > 100
    AND cab.situacaoDocTransferencia = 'A'
    AND modDoc.movimentaEstoque = 1
    AND item.cancelado = 0
    AND item.validoSaida = 1
    AND item.quantidadeSaldo <> 0)
  LOOP
    ADD_DOCTRANSF_ITEM_RES_ITEM(
      v_bufferIdReservaEstoque, 
      p_estabelecimentoAtivo, 
      a.modeloDocumento,
      a.estabelecimentoSaida,
      a.dataEmissao,
      a.tipoDocumentoSaida,
      a.situacaoDocTransferencia,
      a.movimentaEstoque,
      a.idItemDocTransferencia,
      a.cancelado,
      a.validoSaida,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoqueSaida,
      a.pessoaParticipanteSaida,
      a.quantidadeSaldo,
      a.observacoes,
      v_bufferIdReservaEstoque);
  END LOOP;
END ADD_DOCTRANSF_CAB_RESERVA_GRAV;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_SIT_GRAVA (
  p_estabelecimentoAtivo     IN NUMBER,
  p_documentoTransferencia   IN NUMBER,
  p_situacaoDocTransferencia IN CHAR,
  p_motivoCancelamento       IN VARCHAR)
IS
  v_situacaoDocTransferencia CHAR (1);
  v_observacoes              VARCHAR (4000);
  v_auxNumber                NUMBER;
BEGIN
  SELECT
    situacaoDocTransferencia,
    observacoes
  INTO
    v_situacaoDocTransferencia,
    v_observacoes
  FROM  MODOCUMENTOSTRANSFERENCIA
  WHERE documentoTransferencia = p_documentoTransferencia;
  IF v_observacoes <> ' '
    AND p_motivoCancelamento <> ' '
  THEN
    v_observacoes := RTRIM(SUBSTR(RTRIM(v_observacoes) || ' - ' || p_motivoCancelamento, 1, 4000));
  ELSIF p_motivoCancelamento <> ' ' THEN
    v_observacoes := p_motivoCancelamento;
  END IF;
  IF v_situacaoDocTransferencia = 'F'
    AND NOT (p_situacaoDocTransferencia IN ('C','F'))
  THEN
    FOR a IN (
      SELECT idItemDocTransferencia
      FROM MODOCUMENTOTRANSFXITENS
      WHERE documentoTransferencia = p_documentoTransferencia
      AND cancelado = 0)
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        a.idItemDocTransferencia,
        'R',
        p_situacaoDocTransferencia,
        0,
        0,
        v_auxNumber,
        v_auxNumber);
    END LOOP;
  END IF;
  UPDATE MODOCUMENTOSTRANSFERENCIA SET
    situacaoDocTransferencia = p_situacaoDocTransferencia,
    observacoes = v_observacoes
  WHERE documentoTransferencia = p_documentoTransferencia;
  ADD_DOCTRANSF_CAB_RESERVA_GRAV(
    p_documentoTransferencia,
    p_estabelecimentoAtivo);
END ADD_DOCTRANSF_CAB_SIT_GRAVA;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_ENCERRA_REC (
  p_usuarioLogado              IN NUMBER,
  p_estabelecimentoAtivo       IN NUMBER,
  p_documentoTransferencia     IN NUMBER,
  p_colaboradorRespRecebimento IN NUMBER)
IS
  v_colaborador NUMBER;
BEGIN
  FOR a IN (
    SELECT
      colaboradorResponsavelRetirada,
      colaboradorResponsavelRecebim
    FROM MODOCUMENTOSTRANSFERENCIA cabTransf
    WHERE documentoTransferencia = p_documentoTransferencia
    AND (colaboradorResponsavelRetirada = 0
      OR colaboradorResponsavelRecebim = 0))
  LOOP
    v_colaborador :=0;
    IF p_colaboradorRespRecebimento <> 0 THEN
      SELECT COALESCE (MAX (colaborador),0)
      INTO v_colaborador
      FROM CACOLABORADORES
      WHERE colaborador = p_colaboradorRespRecebimento
      AND ativo = 1;
    END IF;
    IF p_usuarioLogado <> 0 THEN
      SELECT COALESCE (MAX (colaborador),0)
      INTO v_colaborador
      FROM CACOLABORADORES
      WHERE colaborador = p_usuarioLogado
      AND ativo = 1;
    END IF;
    IF a.colaboradorResponsavelRetirada = 0 THEN
      IF v_colaborador <> 0 THEN
        UPDATE MODOCUMENTOSTRANSFERENCIA
        SET colaboradorResponsavelRetirada = v_colaborador
        WHERE documentoTransferencia = p_documentoTransferencia;
      END IF;
      UPDATE MODOCUMENTOSTRANSFERENCIA
      SET dataRetirada = SYSDATE
      WHERE documentoTransferencia = p_documentoTransferencia;
    END IF;
    IF a.colaboradorResponsavelRecebim = 0 THEN
      IF v_colaborador <> 0 THEN
        UPDATE MODOCUMENTOSTRANSFERENCIA
        SET colaboradorResponsavelRecebim = v_colaborador
        WHERE documentoTransferencia = p_documentoTransferencia;
      END IF;
      UPDATE MODOCUMENTOSTRANSFERENCIA
      SET dataRecebimento = SYSDATE
      WHERE documentoTransferencia = p_documentoTransferencia;
    END IF;
  END LOOP;
END ADD_DOCTRANSF_CAB_ENCERRA_REC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_ITEM (
  p_item_idItemOrcamento         IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  /* Retornos */
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_idReservaEstoque          NUMBER;
  v_quantidadeEnderecoEstoque NUMBER;
  v_quantidadeNumerosSerie    NUMBER;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
    p_item_idItemOrcamento,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  FOR a IN (
    SELECT
      cabOrc.modeloDocumento,
      cabOrc.entradaSaida,
      CASE
        WHEN prod.estabelecimentoFaturamento > 0
        THEN prod.estabelecimentoFaturamento
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoSaida > 0
        THEN contrEntr.estabelecimentoSaida
        ELSE cabOrc.estabelecimento
      END estabelecimento,
      cabOrc.dataEmissao,
      cabOrc.dataEntrega,
      itemOrc.idItemOrcamento,
      itemOrc.gradeProduto,
      itemOrc.personalizacao,
      itemOrc.idFormulaTinta,
      itemOrc.idLoteEstoque,
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.localEstoqueSaida > 0
        THEN contrEntr.localEstoqueSaida
        ELSE itemOrc.localEstoque
      END localEstoque,
      itemOrc.pessoaParticipante,
      itemOrc.quantidadeSaldo,
      itemOrc.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
    FROM MOORCAMENTOXITENS itemOrc
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemOrc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque =
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.localEstoqueSaida > 0
        THEN contrEntr.localEstoqueSaida
        ELSE itemOrc.localEstoque
      END 
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = 
      CASE
        WHEN prod.estabelecimentoFaturamento > 0
        THEN prod.estabelecimentoFaturamento
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoSaida > 0
        THEN contrEntr.estabelecimentoSaida
        ELSE cabOrc.estabelecimento
      END
    AND estXLoc.localEstoque =
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.localEstoqueSaida > 0
        THEN contrEntr.localEstoqueSaida
        ELSE itemOrc.localEstoque
      END 
    WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND itemOrc.quantidadeSaldo > 0
    AND etapOrc.situacaoOrcamento BETWEEN 41 AND 89
    UNION ALL
    SELECT
      cabOrc.modeloDocumento,
      cabOrc.entradaSaida,
      doc.estabelecimento,
      doc.dataEmissao,
      doc.dataEntradaSaida dataEntrega,
      itemOrc.idItemOrcamento,
      itemDoc.gradeProduto,
      itemDoc.personalizacao,
      itemDoc.idFormulaTinta,
      itemDoc.idLoteEstoque,
      itemDoc.localEstoque,
      itemDoc.pessoaParticipante,
      ( itemDoc.quantidade
        - itemDoc.quantidadeDevolvidaRetornada
        - COALESCE ((
            SELECT SUM (entr.quantidade *
              CASE
                WHEN itemDoc.quantidadeConvertida = 0
                THEN 1
                ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
              END)
            FROM MOENTREGAS entr
            WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
            AND entr.situacaoEntrega IN (4,5,7)),0)) quantidadeSaldo,
      itemDoc.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
    FROM MOORCAMENTOXITENS itemOrc
    JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
    ON docXOrc.idItemOrcamento = itemOrc.idItemOrcamento
    JOIN MOPREDOCUMXITENS itemDoc
    ON itemDoc.idItemPreDocumento = docXOrc.idItemPreDocumento
    JOIN MOPREDOCUMENTOS doc
    ON doc.preDocumento = itemDoc.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = itemDoc.localEstoque 
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = doc.estabelecimento
    AND estXLoc.localEstoque = itemDoc.localEstoque
    WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND itemOrc.quantidadeSaldo = 0
    AND etapOrc.situacaoOrcamento BETWEEN 64 AND 89
    AND itemOrc.controleEntrega > 0
    AND contrEntr.reservaEstoque = 1
    AND docXOrc.quantidade > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 0
    AND doc.entradaSaida = 'S'
    AND doc.devolucaoAnulacaoRetorno = 0
    AND doc.statusPreDocumento <> 'C'
    AND ( itemDoc.quantidade
      - itemDoc.quantidadeDevolvidaRetornada
      - COALESCE ((
          SELECT SUM (entr.quantidade *
            CASE
              WHEN itemDoc.quantidadeConvertida = 0
              THEN 1
              ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
            END)
          FROM MOENTREGAS entr
          WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
          AND entr.situacaoEntrega IN (4,5,7)),0)) > 0
    UNION ALL
    SELECT
      cabOrc.modeloDocumento,
      cabOrc.entradaSaida,
      doc.estabelecimento,
      doc.dataEmissao,
      doc.dataEntradaSaida dataEntrega,
      itemOrc.idItemOrcamento,
      itemDoc.gradeProduto,
      itemDoc.personalizacao,
      itemDoc.idFormulaTinta,
      itemDoc.idLoteEstoque,
      itemDoc.localEstoque,
      itemDoc.pessoaParticipante,
      ( itemDoc.quantidade
        - itemDoc.quantidadeDevolvidaRetornada
        - COALESCE ((
            SELECT SUM (entr.quantidade *
              CASE
                WHEN itemDoc.quantidadeConvertida = 0
                THEN 1
                ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
              END)
            FROM MOENTREGAS entr
            WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
            AND entr.situacaoEntrega IN (4,5,7)),0)) quantidadeSaldo,
      itemDoc.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
    FROM MOORCAMENTOXITENS itemOrc
    JOIN MODOCFISCALXORCAMENTOITEM docXOrc
    ON docXOrc.idItemOrcamento = itemOrc.idItemOrcamento
    JOIN MODOCFISCALXITENS itemDoc
    ON itemDoc.idItemDocFiscal = docXOrc.idItemDocFiscal
    JOIN MODOCUMENTOSFISCAIS doc
    ON doc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = itemDoc.localEstoque 
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = doc.estabelecimento
    AND estXLoc.localEstoque = itemDoc.localEstoque
    WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND itemOrc.quantidadeSaldo = 0
    AND etapOrc.situacaoOrcamento BETWEEN 64 AND 89
    AND itemOrc.controleEntrega > 0
    AND contrEntr.reservaEstoque = 1
    AND docXOrc.quantidade > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 0
    AND doc.entradaSaida = 'S'
    AND doc.devolucaoAnulacaoRetorno = 0
    AND doc.situacaoDocumentoFiscal <= 23
    AND ( itemDoc.quantidade
      - itemDoc.quantidadeDevolvidaRetornada
      - COALESCE ((
          SELECT SUM (entr.quantidade *
            CASE
              WHEN itemDoc.quantidadeConvertida = 0
              THEN 1
              ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
            END)
          FROM MOENTREGAS entr
          WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
          AND entr.situacaoEntrega IN (4,5,7)),0)) > 0)
  LOOP
    v_quantidadeEnderecoEstoque := 0;
    v_quantidadeNumerosSerie    := 0;
    IF a.solicitaEnderecoEstoque = 1
      AND a.controleEstoque IN (1,3,4,5,11,12)
    THEN
      ADD_ORCAMENTO_ITEM_RES_ENDEREC(
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        a.modeloDocumento,
        a.entradaSaida,
        a.estabelecimento,
        a.dataEmissao,
        a.dataEntrega,
        a.idItemOrcamento,
        a.gradeProduto,
        a.personalizacao,
        a.idFormulaTinta,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidadeSaldo,
        a.observacoes,
        a.controlaNumeroSerie,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque,
        v_quantidadeEnderecoEstoque);
    END IF;
    IF a.quantidadeSaldo > v_quantidadeEnderecoEstoque THEN
      IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
        ADD_RESERVA_ESTOQUE_FORM_TINTA(
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          a.modeloDocumento,
          a.entradaSaida,
          a.estabelecimento,
          a.dataEmissao,
          a.dataEntrega,
          a.idItemOrcamento,
          0, -- p_idItemDocTransferencia
          a.idFormulaTinta,
          a.localEstoque,
          a.pessoaParticipante,
          0, -- p_item_idEnderecoEstoque
          a.quantidadeSaldo - v_quantidadeEnderecoEstoque,
          a.observacoes,
          a.indicadorPropriedadePosseItem,
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (3,4) THEN
        ADD_ORCAMENTO_ITEM_RES_KIT(
          r_bufferIdReservaEstoque,
          p_estabelecimentoAtivo,
          a.modeloDocumento,
          a.entradaSaida,
          a.estabelecimento,
          a.dataEmissao,
          a.dataEntrega,
          a.idItemOrcamento,
          a.gradeProduto,
          a.localEstoque,
          a.pessoaParticipante,
          0, -- p_item_idEnderecoEstoque
          a.quantidadeSaldo - v_quantidadeEnderecoEstoque,
          a.observacoes,
          0, -- p_end_idEnderecoEstoqueOrcam
          a.indicadorPropriedadePosseItem,
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (1,5,11,12) THEN
        v_quantidadeNumerosSerie := 0;
        IF a.controlaNumeroSerie > 0 THEN
          ADD_ORCAMENTO_ITEM_RES_N_SERIE(
            r_bufferIdReservaEstoque, 
            p_estabelecimentoAtivo, 
            a.modeloDocumento,
            a.entradaSaida,
            a.estabelecimento,
            a.dataEmissao,
            a.dataEntrega,
            a.idItemOrcamento,
            a.gradeProduto,
            a.personalizacao,
            a.idLoteEstoque,
            a.localEstoque,
            a.pessoaParticipante,
            0, -- p_item_idEnderecoEstoque
            a.observacoes,
            0, -- p_end_idEnderecoEstoqueOrcam
            a.indicadorPropriedadePosseItem,
            r_bufferIdReservaEstoque,
            v_quantidadeNumerosSerie);
        END IF;
        IF a.quantidadeSaldo - v_quantidadeEnderecoEstoque > v_quantidadeNumerosSerie THEN
          ADD_RESERVA_ESTOQUE_GRAVA(
            0,
            r_bufferIdReservaEstoque, 
            p_estabelecimentoAtivo, 
            a.estabelecimento,
            CASE
              WHEN a.dataEntrega IS NULL
                OR a.dataEntrega < a.dataEmissao
              THEN a.dataEmissao
              ELSE a.dataEntrega
            END, -- p_data
            a.gradeProduto,
            a.modeloDocumento,
            a.entradaSaida,
            a.indicadorPropriedadePosseItem,
            a.pessoaParticipante,
            a.localEstoque,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idEnderecoEstoque
            0, -- p_idNumeroSerie
            a.quantidadeSaldo - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
            a.observacoes,
            a.idItemOrcamento,
            0, -- p_idItemDocTransferencia
            v_idReservaEstoque,
            r_bufferIdReservaEstoque);
        END IF;
      END IF;
    END IF;
  END LOOP;  
END ADD_ORCAMENTO_ITEM_RES_ITEM;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_RESERVA_GRAV (
  p_orcamento            IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR a IN (
    SELECT idItemOrcamento
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_orcamento
      ORDER BY sequencia)
  LOOP
    ADD_ORCAMENTO_ITEM_RES_ITEM(
      a.idItemOrcamento,
      p_estabelecimentoAtivo, 
      v_bufferIdReservaEstoque, 
      v_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_CAB_RESERVA_GRAV;

/

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

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_COMPR_GRAVA (
  p_idItemOrcamento             IN NUMBER,
  p_pedidoCompraFornecedor      IN VARCHAR2,
  p_sequenciaPedidoCompraFornec IN NUMBER)
IS
BEGIN
  MERGE INTO MOORCAMENTOXPEDIDOCOMPRA a USING (
    SELECT
      p_idItemOrcamento             idItemOrcamento,
      p_pedidoCompraFornecedor      pedidoCompraFornecedor,
      p_sequenciaPedidoCompraFornec sequenciaPedidoCompraFornec
    FROM DUAL) b
  ON (a.idItemOrcamento = b.idItemOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.pedidoCompraFornecedor      = b.pedidoCompraFornecedor,
    a.sequenciaPedidoCompraFornec = b.sequenciaPedidoCompraFornec
  WHEN NOT MATCHED THEN INSERT (
    idItemOrcamento,
    pedidoCompraFornecedor,
    sequenciaPedidoCompraFornec)
  VALUES (
    b.idItemOrcamento,
    b.pedidoCompraFornecedor,
    b.sequenciaPedidoCompraFornec);
END ADD_ORCAMENTO_ITEM_COMPR_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_COMPRA_GRAVA (
  p_idItemPreDocumento          IN NUMBER,
  p_pedidoCompraFornecedor      IN VARCHAR2,
  p_sequenciaPedidoCompraFornec IN NUMBER)
IS
BEGIN
  MERGE INTO MOPREDOCUMXPEDIDOCOMPRA a USING (
    SELECT
      p_idItemPreDocumento          idItemPreDocumento,
      p_pedidoCompraFornecedor      pedidoCompraFornecedor,
      p_sequenciaPedidoCompraFornec sequenciaPedidoCompraFornec
    FROM DUAL) b
  ON (a.idItemPreDocumento = b.idItemPreDocumento)
  WHEN MATCHED THEN UPDATE SET
    a.pedidoCompraFornecedor      = b.pedidoCompraFornecedor,
    a.sequenciaPedidoCompraFornec = b.sequenciaPedidoCompraFornec
  WHEN NOT MATCHED THEN INSERT (
    idItemPreDocumento,
    pedidoCompraFornecedor,
    sequenciaPedidoCompraFornec)
  VALUES (
    b.idItemPreDocumento,
    b.pedidoCompraFornecedor,
    b.sequenciaPedidoCompraFornec);
END ADD_PRE_DOC_ITEM_COMPRA_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_COMPRA_GRAVA (
  p_idItemDocFiscal             IN NUMBER,
  p_pedidoCompraFornecedor      IN VARCHAR2,
  p_sequenciaPedidoCompraFornec IN NUMBER)
IS
BEGIN
  MERGE INTO MODOCFISCALXPEDIDOCOMPRA a USING (
    SELECT
      p_idItemDocFiscal             idItemDocFiscal,
      p_pedidoCompraFornecedor      pedidoCompraFornecedor,
      p_sequenciaPedidoCompraFornec sequenciaPedidoCompraFornec
    FROM DUAL) b
  ON (a.idItemDocFiscal = b.idItemDocFiscal)
  WHEN MATCHED THEN UPDATE SET
    a.pedidoCompraFornecedor      = b.pedidoCompraFornecedor,
    a.sequenciaPedidoCompraFornec = b.sequenciaPedidoCompraFornec
  WHEN NOT MATCHED THEN INSERT (
    idItemDocFiscal,
    pedidoCompraFornecedor,
    sequenciaPedidoCompraFornec)
  VALUES (
    b.idItemDocFiscal,
    b.pedidoCompraFornecedor,
    b.sequenciaPedidoCompraFornec);
END ADD_DOC_FISC_ITEM_COMPRA_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_AMB_GRAVA (
  p_idItemOrcamento IN NUMBER,
  p_ambiente        IN NUMBER,
  p_observacoes     IN VARCHAR2)
IS
BEGIN
  MERGE INTO MOORCAMENTOXAMBIENTES a USING (
    SELECT
      p_idItemOrcamento idItemOrcamento,
      p_ambiente        ambiente,
      p_observacoes     observacoes
    FROM DUAL) b
  ON (a.idItemOrcamento = b.idItemOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.ambiente    = b.ambiente,
    a.observacoes = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idItemOrcamento,
    ambiente,
    observacoes)
  VALUES (
    b.idItemOrcamento,
    b.ambiente,
    b.observacoes);
END ADD_ORCAMENTO_ITEM_AMB_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_N_SER_ORC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemOrcamentoPara  IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    r_atualizarObservacoes := 1;
    ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemOrcamentoPara,
      0,
      a.gradeProduto,
      a.idNumeroSerie,
      0,
      /* Retornos */
      v_auxNumber);
    IF p_efetivar = 1 THEN
      UPDATE MOORCAMENTOXNUMEROSSERIE b
      SET b.efetivado = 1
      WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_N_SER_ORC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemOrcamentoDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    r_atualizarObservacoes := 1;
    ADD_PRE_DOC_ITEM_N_SER_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      0,
      a.gradeProduto,
      a.idNumeroSerie,
      0,
      /* Retornos */
      v_auxNumber);
    IF p_efetivar = 1 THEN
      UPDATE MOORCAMENTOXNUMEROSSERIE b
      SET b.efetivado = 1
      WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_N_SER_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_ORCAM (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    r_atualizarObservacoes := 1;
    ADD_DOC_FISC_ITEM_N_SER_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      0,
      a.gradeProduto,
      a.idNumeroSerie,
      0,
      /* Retornos */
      v_auxNumber);
    IF p_efetivar = 1 THEN
      UPDATE MOORCAMENTOXNUMEROSSERIE b
      SET b.efetivado = 1
      WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_N_SER_ORCAM;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_PRE_DOC (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemPreDocumentoDe   IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT
      idNumeroSeriePreDocumento,
      gradeProduto,
      idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    r_atualizarObservacoes := 1;
    ADD_PRE_DOC_ITEM_N_SER_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      0,
      a.gradeProduto,
      a.idNumeroSerie,
      0,
      /* Retornos */
      v_auxNumber);
    IF p_efetivar = 1 THEN
      UPDATE MOPREDOCUMXNUMEROSSERIE b
      SET b.devolvidoRetornado = 1
      WHERE b.idNumeroSeriePreDocumento = a.idNumeroSeriePreDocumento;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_N_SER_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_PRE (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemPreDocumentoDe IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT
      idNumeroSeriePreDocumento,
      gradeProduto,
      idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    r_atualizarObservacoes := 1;
    ADD_DOC_FISC_ITEM_N_SER_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      0,
      a.gradeProduto,
      a.idNumeroSerie,
      0,
      /* Retornos */
      v_auxNumber);
    IF p_efetivar = 1 THEN
      UPDATE MOPREDOCUMXNUMEROSSERIE b
      SET b.devolvidoRetornado = 1
      WHERE b.idNumeroSeriePreDocumento = a.idNumeroSeriePreDocumento;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_N_SER_PRE;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_DOC_FIS (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemDocFiscalDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT
      idNumeroSerieDocFiscal,
      gradeProduto,
      idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_idItemDocFiscalDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    r_atualizarObservacoes := 1;
    ADD_PRE_DOC_ITEM_N_SER_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      0,
      a.gradeProduto,
      a.idNumeroSerie,
      0,
      /* Retornos */
      v_auxNumber);
    IF p_efetivar = 1 THEN
      UPDATE MODOCFISCALXNUMEROSSERIE b
      SET b.devolvidoRetornado = 1
      WHERE b.idNumeroSerieDocFiscal = a.idNumeroSerieDocFiscal;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_N_SER_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_DOC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemDocFiscalDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  FOR a IN (
    SELECT
      idNumeroSerieDocFiscal,
      gradeProduto,
      idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_idItemDocFiscalDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    r_atualizarObservacoes := 1;
    ADD_DOC_FISC_ITEM_N_SER_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      0,
      a.gradeProduto,
      a.idNumeroSerie,
      0,
      /* Retornos */
      v_auxNumber);
    IF p_efetivar = 1 THEN
      UPDATE MODOCFISCALXNUMEROSSERIE b
      SET b.devolvidoRetornado = 1
      WHERE b.idNumeroSerieDocFiscal = a.idNumeroSerieDocFiscal;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_N_SER_DOC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_CUSTO_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idCentroCustoOrcamento IN NUMBER,
  p_idItemOrcamento        IN NUMBER,
  p_centroCusto            IN VARCHAR2,
  p_percentualRateio       IN NUMBER,
  /* Retornos */
  r_idCentroCustoOrcamento OUT NUMBER)
IS
BEGIN
  r_idCentroCustoOrcamento := p_idCentroCustoOrcamento;
  IF r_idCentroCustoOrcamento = 0 THEN
    r_idCentroCustoOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXCENTROSCUSTOS', 'idCentroCustoOrcamento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOORCAMENTOXCENTROSCUSTOS a 
  USING (
    SELECT
      r_idCentroCustoOrcamento idCentroCustoOrcamento,
      p_idItemOrcamento        idItemOrcamento,
      p_centroCusto            centroCusto,
      p_percentualRateio       percentualRateio
    FROM DUAL) b
  ON (a.idCentroCustoOrcamento = b.idCentroCustoOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemOrcamento  = b.idItemOrcamento,
    a.centroCusto      = b.centroCusto,
    a.percentualRateio = b.percentualRateio
  WHEN NOT MATCHED THEN INSERT (
    idCentroCustoOrcamento,
    idItemOrcamento,
    centroCusto,
    percentualRateio)
  VALUES (
    b.idCentroCustoOrcamento,
    b.idItemOrcamento,
    b.centroCusto,
    b.percentualRateio);
END ADD_ORCAMENTO_ITEM_CUSTO_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_CUSTO_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idCentroCustoPreDocumento IN NUMBER,
  p_idItemPreDocumento        IN NUMBER,
  p_centroCusto               IN VARCHAR2,
  p_percentualRateio          IN NUMBER,
  /* Retornos */
  r_idCentroCustoPreDocumento OUT NUMBER)
IS
BEGIN
  r_idCentroCustoPreDocumento := p_idCentroCustoPreDocumento;
  IF r_idCentroCustoPreDocumento = 0 THEN
    r_idCentroCustoPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXCENTROSCUSTOS', 'idCentroCustoPreDocumento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOPREDOCUMXCENTROSCUSTOS a 
  USING (
    SELECT
      r_idCentroCustoPreDocumento idCentroCustoPreDocumento,
      p_idItemPreDocumento        idItemPreDocumento,
      p_centroCusto               centroCusto,
      p_percentualRateio          percentualRateio
    FROM DUAL) b
  ON (a.idCentroCustoPreDocumento = b.idCentroCustoPreDocumento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemPreDocumento = b.idItemPreDocumento,
    a.centroCusto        = b.centroCusto,
    a.percentualRateio   = b.percentualRateio
  WHEN NOT MATCHED THEN INSERT (
    idCentroCustoPreDocumento,
    idItemPreDocumento,
    centroCusto,
    percentualRateio)
  VALUES (
    b.idCentroCustoPreDocumento,
    b.idItemPreDocumento,
    b.centroCusto,
    b.percentualRateio);
END ADD_PRE_DOC_ITEM_CUSTO_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_CUSTO_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idCentroCustoDocFiscal IN NUMBER,
  p_idItemDocFiscal        IN NUMBER,
  p_centroCusto            IN VARCHAR2,
  p_percentualRateio       IN NUMBER,
  /* Retornos */
  r_idCentroCustoDocFiscal OUT NUMBER)
IS
BEGIN
  r_idCentroCustoDocFiscal := p_idCentroCustoDocFiscal;
  IF r_idCentroCustoDocFiscal = 0 THEN
    r_idCentroCustoDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MODOCFISCALXCENTROSCUSTOS a 
  USING (
    SELECT
      r_idCentroCustoDocFiscal idCentroCustoDocFiscal,
      p_idItemDocFiscal        idItemDocFiscal,
      p_centroCusto            centroCusto,
      p_percentualRateio       percentualRateio
    FROM DUAL) b
  ON (a.idCentroCustoDocFiscal = b.idCentroCustoDocFiscal)
  WHEN MATCHED THEN UPDATE SET
    a.idItemDocFiscal  = b.idItemDocFiscal,
    a.centroCusto      = b.centroCusto,
    a.percentualRateio = b.percentualRateio
  WHEN NOT MATCHED THEN INSERT (
    idCentroCustoDocFiscal,
    idItemDocFiscal,
    centroCusto,
    percentualRateio)
  VALUES (
    b.idCentroCustoDocFiscal,
    b.idItemDocFiscal,
    b.centroCusto,
    b.percentualRateio);
END ADD_DOC_FISC_ITEM_CUSTO_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_CUSTO_ORC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemOrcamentoPara  IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      centroCusto,
      percentualRateio
    FROM MOORCAMENTOXCENTROSCUSTOS
    WHERE idItemOrcamento = p_idItemOrcamentoDe)
  LOOP
    ADD_ORCAMENTO_ITEM_CUSTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemOrcamentoPara,
      a.centroCusto,
      a.percentualRateio,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_ORCAMENTO_ITEM_CUSTO_ORC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_CUSTO_ORCAMEN (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemOrcamentoDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      centroCusto,
      percentualRateio
    FROM MOORCAMENTOXCENTROSCUSTOS
    WHERE idItemOrcamento = p_idItemOrcamentoDe)
  LOOP
    ADD_PRE_DOC_ITEM_CUSTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      a.centroCusto,
      a.percentualRateio,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_CUSTO_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_CUSTO_ORCAM (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      centroCusto,
      percentualRateio
    FROM MOORCAMENTOXCENTROSCUSTOS
    WHERE idItemOrcamento = p_idItemOrcamentoDe)
  LOOP
    ADD_DOC_FISC_ITEM_CUSTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      a.centroCusto,
      a.percentualRateio,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_CUSTO_ORCAM;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_CUSTO_PRE_DOC (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemPreDocumentoDe   IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      centroCusto,
      percentualRateio
    FROM MOPREDOCUMXCENTROSCUSTOS
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe)
  LOOP
    ADD_PRE_DOC_ITEM_CUSTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      a.centroCusto,
      a.percentualRateio,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_CUSTO_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_CUSTO_PRE (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemPreDocumentoDe IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      centroCusto,
      percentualRateio
    FROM MOPREDOCUMXCENTROSCUSTOS
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe)
  LOOP
    ADD_DOC_FISC_ITEM_CUSTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      a.centroCusto,
      a.percentualRateio,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_CUSTO_PRE;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_CUSTO_DOC_FIS (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemDocFiscalDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      centroCusto,
      percentualRateio
    FROM MODOCFISCALXCENTROSCUSTOS
    WHERE idItemDocFiscal = p_idItemDocFiscalDe)
  LOOP
    ADD_PRE_DOC_ITEM_CUSTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemPreDocumentoPara,
      a.centroCusto,
      a.percentualRateio,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_CUSTO_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_CUSTO_DOC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemDocFiscalDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      centroCusto,
      percentualRateio
    FROM MODOCFISCALXCENTROSCUSTOS
    WHERE idItemDocFiscal = p_idItemDocFiscalDe)
  LOOP
    ADD_DOC_FISC_ITEM_CUSTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemDocFiscalPara,
      a.centroCusto,
      a.percentualRateio,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_CUSTO_DOC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_entradaSaidaOriginal   IN CHAR,
  p_idItemDocTransferencia IN NUMBER,
  p_idItemOrcamento        IN NUMBER,
  p_quantidade             IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCTRANSFXORCAMENTOITEM
  WHERE idItemDocTransferencia = p_idItemDocTransferencia
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    UPDATE MODOCTRANSFXORCAMENTOITEM SET
      entradaSaidaOriginal = p_entradaSaidaOriginal,
      quantidade = p_quantidade
    WHERE id = v_id;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCTRANSFXORCAMENTOITEM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCTRANSFXORCAMENTOITEM (
      id,
      entradaSaidaOriginal,
      idItemDocTransferencia,
      idItemOrcamento,
      quantidade)
    VALUES (
      v_id,
      p_entradaSaidaOriginal,
      p_idItemDocTransferencia,
      p_idItemOrcamento,
      p_quantidade);
  END IF;
END ADD_ORCAMENTO_ITEM_TRANS_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_TRANS_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_entradaSaidaOriginal   IN CHAR,
  p_idItemDocTransferencia IN NUMBER,
  p_idItemPreDocumento     IN NUMBER,
  p_quantidade             IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCTRANSFXPREDOCUM
  WHERE idItemDocTransferencia = p_idItemDocTransferencia
  AND idItemPreDocumento = p_idItemPreDocumento;
  IF v_id > 0 THEN
    UPDATE MODOCTRANSFXPREDOCUM SET
      entradaSaidaOriginal = p_entradaSaidaOriginal,
      quantidade = p_quantidade
    WHERE id = v_id;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCTRANSFXPREDOCUM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCTRANSFXPREDOCUM (
      id,
      entradaSaidaOriginal,
      idItemDocTransferencia,
      idItemPreDocumento,
      quantidade)
    VALUES (
      v_id,
      p_entradaSaidaOriginal,
      p_idItemDocTransferencia,
      p_idItemPreDocumento,
      p_quantidade);
  END IF;
END ADD_PRE_DOC_ITEM_TRANS_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_TRANS_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_entradaSaidaOriginal   IN CHAR,
  p_idItemDocTransferencia IN NUMBER,
  p_idItemDocFiscal        IN NUMBER,
  p_quantidade             IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCTRANSFXDOCFISCAL
  WHERE idItemDocTransferencia = p_idItemDocTransferencia
  AND idItemDocFiscal = p_idItemDocFiscal;
  IF v_id > 0 THEN
    UPDATE MODOCTRANSFXDOCFISCAL SET
      entradaSaidaOriginal = p_entradaSaidaOriginal,
      quantidade = p_quantidade
    WHERE id = v_id;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCTRANSFXDOCFISCAL', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCTRANSFXDOCFISCAL (
      id,
      entradaSaidaOriginal,
      idItemDocTransferencia,
      idItemDocFiscal,
      quantidade)
    VALUES (
      v_id,
      p_entradaSaidaOriginal,
      p_idItemDocTransferencia,
      p_idItemDocFiscal,
      p_quantidade);
  END IF;
END ADD_DOC_FISC_ITEM_TRANS_GRAVA;

/

create or replace PROCEDURE ADD_ESTOQUE_TRANS_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_entradaSaidaOriginal   IN CHAR,
  p_idItemDocTransferencia IN NUMBER,
  p_idEstoque              IN NUMBER,
  p_quantidade             IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCTRANSFXESTOQUE
  WHERE idItemDocTransferencia = p_idItemDocTransferencia
  AND idEstoque = p_idEstoque;
  IF v_id > 0 THEN
    UPDATE MODOCTRANSFXESTOQUE SET
      entradaSaidaOriginal = p_entradaSaidaOriginal,
      quantidade = p_quantidade
    WHERE id = v_id;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCTRANSFXESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCTRANSFXESTOQUE (
      id,
      entradaSaidaOriginal,
      idItemDocTransferencia,
      idEstoque,
      quantidade)
    VALUES (
      v_id,
      p_entradaSaidaOriginal,
      p_idItemDocTransferencia,
      p_idEstoque,
      p_quantidade);
  END IF;
END ADD_ESTOQUE_TRANS_GRAVA;

/

create or replace PROCEDURE ADD_INV_EST_BALANCO_GRAVA (
  p_estabelecimentoAtivo    IN NUMBER,
  p_divergenciaBalanco      IN NUMBER,
  p_idItemInventarioEstoque IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOBALANCOXINVENTESTOQUE
  WHERE divergenciaBalanco = p_divergenciaBalanco
  AND idItemInventarioEstoque = p_idItemInventarioEstoque;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOBALANCOXINVENTESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOBALANCOXINVENTESTOQUE (
      id,
      divergenciaBalanco,
      idItemInventarioEstoque)
    VALUES (
      v_id,
      p_divergenciaBalanco,
      p_idItemInventarioEstoque);
  END IF;
END ADD_INV_EST_BALANCO_GRAVA;

/

create or replace PROCEDURE ADD_ESTOQUE_BALANCO_GRAVA (
  p_estabelecimentoAtivo IN NUMBER,
  p_divergenciaBalanco   IN NUMBER,
  p_idEstoque            IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOBALANCOXESTOQUE
  WHERE divergenciaBalanco = p_divergenciaBalanco
  AND idEstoque = p_idEstoque;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOBALANCOXESTOQUE', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOBALANCOXESTOQUE (
      id,
      divergenciaBalanco,
      idEstoque)
    VALUES (
      v_id,
      p_divergenciaBalanco,
      p_idEstoque);
  END IF;
END ADD_ESTOQUE_BALANCO_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_BALANC_GRAVA (
  p_estabelecimentoAtivo IN NUMBER,
  p_divergenciaBalanco   IN NUMBER,
  p_idItemDocFiscal      IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOBALANCOXDOCFISCAL
  WHERE divergenciaBalanco = p_divergenciaBalanco
  AND idItemDocFiscal = p_idItemDocFiscal;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOBALANCOXDOCFISCAL', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOBALANCOXDOCFISCAL (
      id,
      divergenciaBalanco,
      idItemDocFiscal)
    VALUES (
      v_id,
      p_divergenciaBalanco,
      p_idItemDocFiscal);
  END IF;
END ADD_DOC_FISC_ITEM_BALANC_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemListaEvento    IN NUMBER,
  p_idItemOrcamento      IN NUMBER,
  p_quantidade           IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOLISTAEVENTOXORC
  WHERE idItemListaEvento = p_idItemListaEvento
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidade <> 0 THEN
      UPDATE MOLISTAEVENTOXORC
      SET quantidade = quantidade + p_quantidade
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOLISTAEVENTOXORC', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOLISTAEVENTOXORC (
      id,
      idItemListaEvento,
      idItemOrcamento,
      quantidade)
    VALUES (
      v_id,
      p_idItemListaEvento,
      p_idItemOrcamento,
      p_quantidade);
  END IF;
  IF p_quantidade <> 0 THEN
    UPDATE MOLISTAEVENTOXITENS
    SET quantidade = quantidade - p_quantidade
    WHERE idItemListaEvento = p_idItemListaEvento;
  END IF;
END ADD_ORCAMENTO_ITEM_LISTA_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_LISTA_EXCL (
  p_idItemOrcamento IN NUMBER)
IS
BEGIN
  FOR a IN (
    SELECT
      id,
      idItemListaEvento,
      quantidade
    FROM MOLISTAEVENTOXORC
    WHERE idItemOrcamento = p_idItemOrcamento)
  LOOP
    IF a.quantidade <> 0 THEN
      UPDATE MOLISTAEVENTOXITENS b
      SET b.quantidade = b.quantidade + a.quantidade
      WHERE b.idItemListaEvento = a.idItemListaEvento;
    END IF;
    DELETE MOLISTAEVENTOXORC b
    WHERE b.id = a.id;
  END LOOP;
END ADD_ORCAMENTO_ITEM_LISTA_EXCL;

/

create or replace PROCEDURE ADD_ENTREGA_EXCLUI(
  p_usuarioLogado          IN NUMBER,
  p_estabelecimentoAtivo   IN NUMBER,
  p_entrega                IN NUMBER,
  p_excluintoItemOrcamento IN NUMBER,
  p_origemExclusao         IN VARCHAR)
IS
  v_novaSituacaoEntrega NUMBER;
BEGIN
  IF p_excluintoItemOrcamento = 1 THEN
    DELETE MOENTREGAXSITUACOES
    WHERE entrega = p_entrega;
  ELSE
    FOR a IN (
      SELECT idItemOrcamento
      FROM MOENTREGAS
      WHERE entrega = p_entrega)
    LOOP
      ADD_ENTREGA_SITUACAO_ORCAMENTO(
        p_entrega,
        a.idItemOrcamento,
        0,
        0,
        v_novaSituacaoEntrega);
      UPDATE MOENTREGAXSITUACOES SET
        entrega = 0,
        observacoes = 'Entrega "'
          || TO_CHAR(p_entrega)
          || '" excluída '
          || TO_CHAR (SYSDATE,'DD/MM/YYYY')
          || ' às '
          || TO_CHAR (SYSDATE,'HH24:MI:SS')
      WHERE entrega = p_entrega;
      ADD_ENTREGA_SITUACAO_CRIA(
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.idItemOrcamento,
        0,
        v_novaSituacaoEntrega,
        'Alterada a situação devido a exclusão da entrega '
        || TO_CHAR(p_entrega)
        || ' - Origem: '
        || Trim(p_origemExclusao));
    END LOOP;
  END IF;
  DELETE MOENTREGAS
  WHERE entrega = p_entrega;
END ADD_ENTREGA_EXCLUI;

/

create or replace PROCEDURE ADD_ENTREGA_REABRE (
  p_usuarioLogado        IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamento      IN NUMBER,
  p_origemChamada        IN VARCHAR)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT entrega
    FROM MOENTREGAS
    WHERE idItemOrcamento = p_idItemOrcamento
    AND situacaoEntrega <= 3)
  LOOP
    ADD_ENTREGA_EXCLUI (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      a.entrega,
      0,
      CASE
        WHEN p_origemChamada IS NULL
          OR p_origemChamada = ' '
        THEN ''
        ELSE TRIM(p_origemChamada) || ' - '
      END || 'ADD_ENTREGA_REABRE');
  END LOOP;
  FOR a IN (
    SELECT situacaoEntrega
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento)
  LOOP
    IF a.situacaoEntrega > 1 THEN
      ADD_ENTREGA_SITUACAO_CRIA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_idItemOrcamento,
        0,
        1,
        CASE
          WHEN p_origemChamada IS NULL
            OR p_origemChamada = ' '
          THEN ''
          ELSE TRIM(p_origemChamada) || ' - '
        END || 'ADD_ENTREGA_REABRE');
      UPDATE MOORCAMENTOXITENS
      SET situacaoEntrega = 1
      WHERE idItemOrcamento = p_idItemOrcamento;
    END IF;
  END LOOP;
END ADD_ENTREGA_REABRE;

/

DROP PROCEDURE ADD_MOMOTIVOSBLOQUEIOS_EXCLUI;

create or replace PROCEDURE ADD_MOTIVO_BLOQUEIO_EXCLUI (
  p_idMotivoBloqueioDocumento   IN NUMBER)
IS
BEGIN
  DELETE MOMOTBLOQXORCAMENTOS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXORCAMENTOITENS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXORCAMENTOPAGAM
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXPREDOCUMENTOS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXPREDOCUMITENS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXPREDOCUMPAGAM
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXDOCUMENTOSFISC
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXDOCFISCALITENS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXDOCFISCALPAGAM
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXFINANCEIROS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXPREVISOESFINANC
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXLIBERACOES
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTIVOSBLOQUEIOS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
END ADD_MOTIVO_BLOQUEIO_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_ORCAMENTO_CAB_EXCL (
  p_orcamento                 IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXORCAMENTOS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.orcamento = p_orcamento
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_ORCAMENTO_CAB_EXCL;

/

create or replace PROCEDURE ADD_MOTIVO_ORCAMENTO_ITE_EXCL (
  p_idItemOrcamento           IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXORCAMENTOITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemOrcamento = p_idItemOrcamento
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_ORCAMENTO_ITE_EXCL;

/

create or replace PROCEDURE ADD_MOTIVO_ORCAMENTO_PAG_EXCL (
  p_idPagamentoOrcamento      IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXORCAMENTOPAGAM a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idPagamentoOrcamento = p_idPagamentoOrcamento
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_ORCAMENTO_PAG_EXCL;

/

create or replace PROCEDURE ADD_MOTIVO_PRE_DOC_CAB_EXCLUI (
  p_preDocumento              IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXPREDOCUMENTOS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.preDocumento = p_preDocumento
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_PRE_DOC_CAB_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
  p_idItemPreDocumento        IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemPreDocumento = p_idItemPreDocumento
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_PRE_DOC_ITE_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_PRE_DOC_PAG_EXCLUI (
  p_idPagamentoPreDocumento   IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXPREDOCUMPAGAM a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idPagamentoPreDocumento = p_idPagamentoPreDocumento
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_PRE_DOC_PAG_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_DOC_FISC_CAB_EXCLUI (
  p_idDocumentoFiscal         IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXDOCUMENTOSFISC a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_DOC_FISC_CAB_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
  p_idItemDocFiscal           IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXDOCFISCALITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemDocFiscal = p_idItemDocFiscal
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_DOC_FISC_ITE_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_DOC_FISC_PAG_EXCLUI (
  p_idPagamentoDocFiscal      IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXDOCFISCALPAGAM a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idPagamentoDocFiscal = p_idPagamentoDocFiscal
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_DOC_FISC_PAG_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_FINANCEIRO_EXCLUI (
  p_idFinanceiro              IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXFINANCEIROS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idFinanceiro = p_idFinanceiro
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_FINANCEIRO_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_PREV_FINANC_EXCLUI (
  p_idPrevisaoFinanceira      IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER)
IS
BEGIN
  r_idMotivoBloqueioDocumento := 0;
  FOR a IN (
    SELECT a.idMotivoBloqueioDocumento
    FROM MOMOTBLOQXPREVISOESFINANC a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idPrevisaoFinanceira = p_idPrevisaoFinanceira
    AND (p_motivoBloqueioDocumento = 0
      OR b.motivoBloqueioDocumento = p_motivoBloqueioDocumento))
  LOOP
    r_idMotivoBloqueioDocumento := a.idMotivoBloqueioDocumento;
    ADD_MOTIVO_BLOQUEIO_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
END ADD_MOTIVO_PREV_FINANC_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_LIBERACOES_EXCLUI (
  p_idMotivoBloqueioDocumento IN NUMBER,
  /* Retornos */
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := 0;
  FOR a IN (
    SELECT id
    FROM MOMOTBLOQXLIBERACOES
    WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento)
  LOOP
    r_id := a.id;
    DELETE MOMOTBLOQXLIBERACOES b WHERE b.id = a.id;
  END LOOP;
END ADD_MOTIVO_LIBERACOES_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_LIBERACAO_EXCLUI (
  p_id IN NUMBER)
IS
BEGIN
  DELETE MOMOTBLOQXLIBERACOES WHERE id = p_id;
END ADD_MOTIVO_LIBERACAO_EXCLUI;

/

create or replace PROCEDURE ADD_MOTIVO_ORCAMENTO_CAB_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_orcamento                 IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXORCAMENTOS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND orcamento = p_orcamento;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXORCAMENTOS', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXORCAMENTOS (
      id,
      idMotivoBloqueioDocumento,
      orcamento)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_orcamento);
  END IF;
END ADD_MOTIVO_ORCAMENTO_CAB_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_ORCAMENTO_ITE_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idItemOrcamento           IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXORCAMENTOITENS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXORCAMENTOITENS', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXORCAMENTOITENS (
      id,
      idMotivoBloqueioDocumento,
      idItemOrcamento)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idItemOrcamento);
  END IF;
END ADD_MOTIVO_ORCAMENTO_ITE_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_ORCAMENTO_PAG_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idPagamentoOrcamento      IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXORCAMENTOPAGAM
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idPagamentoOrcamento = p_idPagamentoOrcamento;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXORCAMENTOPAGAM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXORCAMENTOPAGAM (
      id,
      idMotivoBloqueioDocumento,
      idPagamentoOrcamento)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idPagamentoOrcamento);
  END IF;
END ADD_MOTIVO_ORCAMENTO_PAG_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_PRE_DOC_CAB_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_preDocumento              IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXPREDOCUMENTOS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND preDocumento = p_preDocumento;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXPREDOCUMENTOS', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXPREDOCUMENTOS (
      id,
      idMotivoBloqueioDocumento,
      preDocumento)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_preDocumento);
  END IF;
END ADD_MOTIVO_PRE_DOC_CAB_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_PRE_DOC_ITE_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idItemPreDocumento        IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXPREDOCUMITENS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idItemPreDocumento = p_idItemPreDocumento;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXPREDOCUMITENS', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXPREDOCUMITENS (
      id,
      idMotivoBloqueioDocumento,
      idItemPreDocumento)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idItemPreDocumento);
  END IF;
END ADD_MOTIVO_PRE_DOC_ITE_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_PRE_DOC_PAG_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idPagamentoPreDocumento   IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXPREDOCUMPAGAM
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXPREDOCUMPAGAM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXPREDOCUMPAGAM (
      id,
      idMotivoBloqueioDocumento,
      idPagamentoPreDocumento)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idPagamentoPreDocumento);
  END IF;
END ADD_MOTIVO_PRE_DOC_PAG_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_DOC_FISC_CAB_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idDocumentoFiscal         IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXDOCUMENTOSFISC
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idDocumentoFiscal = p_idDocumentoFiscal;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXDOCUMENTOSFISC', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXDOCUMENTOSFISC (
      id,
      idMotivoBloqueioDocumento,
      idDocumentoFiscal)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idDocumentoFiscal);
  END IF;
END ADD_MOTIVO_DOC_FISC_CAB_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_DOC_FISC_ITE_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idItemDocFiscal           IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXDOCFISCALITENS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idItemDocFiscal = p_idItemDocFiscal;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXDOCFISCALITENS', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXDOCFISCALITENS (
      id,
      idMotivoBloqueioDocumento,
      idItemDocFiscal)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idItemDocFiscal);
  END IF;
END ADD_MOTIVO_DOC_FISC_ITE_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_DOC_FISC_PAG_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idPagamentoDocFiscal      IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXDOCFISCALPAGAM
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXDOCFISCALPAGAM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXDOCFISCALPAGAM (
      id,
      idMotivoBloqueioDocumento,
      idPagamentoDocFiscal)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idPagamentoDocFiscal);
  END IF;
END ADD_MOTIVO_DOC_FISC_PAG_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_FINANCEIRO_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idFinanceiro              IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXFINANCEIROS
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idFinanceiro = p_idFinanceiro;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXFINANCEIROS', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXFINANCEIROS (
      id,
      idMotivoBloqueioDocumento,
      idFinanceiro)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idFinanceiro);
  END IF;
END ADD_MOTIVO_FINANCEIRO_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_PREV_FINANC_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_idPrevisaoFinanceira      IN NUMBER)
IS
  v_id NUMBER;
BEGIN
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOMOTBLOQXPREVISOESFINANC
  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento
  AND idPrevisaoFinanceira = p_idPrevisaoFinanceira;
  IF v_id <= 0 THEN
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOMOTBLOQXPREVISOESFINANC', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOMOTBLOQXPREVISOESFINANC (
      id,
      idMotivoBloqueioDocumento,
      idPrevisaoFinanceira)
    VALUES (
      v_id,
      p_idMotivoBloqueioDocumento,
      p_idPrevisaoFinanceira);
  END IF;
END ADD_MOTIVO_PREV_FINANC_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_LIBERACAO_GRAVA (
    p_estabelecimentoAtivo      IN NUMBER,
    p_id                        IN NUMBER,
    p_idMotivoBloqueioDocumento IN NUMBER,
    p_usuario                   IN NUMBER,
    p_dataLiberacao             IN DATE,
    p_valorLiberado             IN NUMBER,
    p_percentualLiberado        IN NUMBER,
    p_percentualAlcada          IN NUMBER,
    p_situacaoLiberacao         IN CHAR,
    p_observacoes               IN VARCHAR,
    p_gravarPeloMotivo          IN NUMBER,
    /* Retornos */
    r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF p_id <= 0 AND p_gravarPeloMotivo = 1 THEN
    SELECT COALESCE (MAX (id),0)
    INTO r_id
    FROM MOMOTBLOQXLIBERACOES
    WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  END IF;
  IF r_id <= 0 THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOMOTBLOQXLIBERACOES a 
  USING (
    SELECT
      r_id                        id,
      p_idMotivoBloqueioDocumento idMotivoBloqueioDocumento,
      p_usuario                   usuario,
      p_dataLiberacao             dataLiberacao,
      p_valorLiberado             valorLiberado,
      p_percentualLiberado        percentualLiberado,
      p_percentualAlcada          percentualAlcada,
      p_situacaoLiberacao         situacaoLiberacao,
      p_observacoes               observacoes
    FROM DUAL
  ) b ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idMotivoBloqueioDocumento = b.idMotivoBloqueioDocumento,
    a.usuario                   = b.usuario,
    a.dataLiberacao             = b.dataLiberacao,
    a.valorLiberado             = b.valorLiberado,
    a.percentualLiberado        = b.percentualLiberado,
    a.percentualAlcada          = b.percentualAlcada,
    a.situacaoLiberacao         = b.situacaoLiberacao,
    a.observacoes               = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idMotivoBloqueioDocumento,
    usuario,
    dataLiberacao,
    valorLiberado,
    percentualLiberado,
    percentualAlcada,
    situacaoLiberacao,
    observacoes)
  VALUES (
    b.id,
    b.idMotivoBloqueioDocumento,
    b.usuario,
    b.dataLiberacao,
    b.valorLiberado,
    b.percentualLiberado,
    b.percentualAlcada,
    b.situacaoLiberacao,
    b.observacoes);
END ADD_MOTIVO_LIBERACAO_GRAVA;

/

create or replace PROCEDURE ADD_MOTIVO_LIBERACAO_LIBERACAO (
  p_estabelecimentoAtivo         IN NUMBER,
  p_idMotivoBloqueioDocumentoDe  IN NUMBER,
  p_idMotivoBloqueioDocumentPara IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes
    FROM MOMOTBLOQXLIBERACOES
    WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumentoDe)
  LOOP
    ADD_MOTIVO_LIBERACAO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idMotivoBloqueioDocumentPara,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes,
      0,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_MOTIVO_LIBERACAO_LIBERACAO;

/

create or replace PROCEDURE ADD_MOTIVO_BLOQUEIO_GRAVA (
  p_estabelecimentoAtivo      IN NUMBER,
  p_idMotivoBloqueioDocumento IN NUMBER,
  p_origem                    IN CHAR,
  p_idCabecalho               IN NUMBER,
  p_tipoDocumento             IN NUMBER,
  p_idDocumento               IN NUMBER,
  p_estabelecimento           IN NUMBER,
  p_pessoa                    IN NUMBER,
  p_cabecalhoItemPagamento    IN CHAR,
  p_sequencia                 IN NUMBER,
  p_condicaoPagamento         IN NUMBER,
  p_vendedor                  IN NUMBER,
  p_gradeProduto              IN NUMBER,
  p_unidadeMedidaConversao    IN VARCHAR,
  p_quantidadeConvertida      IN NUMBER,
  p_valorLiquido              IN NUMBER,
  p_motivoBloqueioDocumento   IN NUMBER,
  p_dataBloqueio              IN DATE,
  p_baseBloqueado             IN NUMBER,
  p_valorBloqueado            IN NUMBER,
  p_percentualBloqueado       IN NUMBER,
  p_situacaoLiberacao         IN CHAR,
  p_observacoes               IN VARCHAR,
  p_usuarioLiberacao          IN NUMBER,
  p_observacoesLiberacao      IN VARCHAR,
  p_orcamento                 IN NUMBER,
  p_idItemOrcamento           IN NUMBER,
  p_idPagamentoOrcamento      IN NUMBER,
  p_preDocumento              IN NUMBER,
  p_idItemPreDocumento        IN NUMBER,
  p_idPagamentoPreDocumento   IN NUMBER,
  p_idDocumentoFiscal         IN NUMBER,
  p_idItemDocFiscal           IN NUMBER,
  p_idPagamentoDocFiscal      IN NUMBER,
  p_idFinanceiro              IN NUMBER,
  p_idPrevisaoFinanceira      IN NUMBER,
  /* Retornos */
  r_idMotivoBloqueioDocumento OUT NUMBER,
  r_idLiberacao               OUT NUMBER)
IS
  v_mot_dataBloqueio      DATE;
  v_mot_valorBloqueado    NUMBER;
  v_mot_situacaoLiberacao CHAR(1);
  v_mot_observacoes       VARCHAR (4000);
BEGIN
  r_idLiberacao := 0;
  r_idMotivoBloqueioDocumento := p_idMotivoBloqueioDocumento;
  v_mot_dataBloqueio := p_dataBloqueio;
  v_mot_valorBloqueado := p_valorBloqueado;
  v_mot_situacaoLiberacao := CASE WHEN p_situacaoLiberacao = ' ' THEN 'P' ELSE p_situacaoLiberacao END;
  v_mot_observacoes := p_observacoes;
  IF p_idMotivoBloqueioDocumento <= 0 THEN
    SELECT
      COALESCE(MAX(idMotivoBloqueioDocumento),0),
      COALESCE(MAX(dataBloqueio),p_dataBloqueio),
      COALESCE(MAX(valorBloqueado),p_valorBloqueado),
      COALESCE(MAX(situacaoLiberacao), CASE WHEN p_situacaoLiberacao = ' ' THEN 'P' ELSE p_situacaoLiberacao END),
      COALESCE(MAX(observacoes),p_observacoes)
    INTO
      r_idMotivoBloqueioDocumento,
      v_mot_dataBloqueio,
      v_mot_valorBloqueado,
      v_mot_situacaoLiberacao,
      v_mot_observacoes
    FROM MOMOTIVOSBLOQUEIOS
    WHERE origem = p_origem
    AND idCabecalho = p_idCabecalho
    AND cabecalhoItemPagamento = p_cabecalhoItemPagamento
    AND sequencia = p_sequencia
    AND motivoBloqueioDocumento = p_motivoBloqueioDocumento;
    IF r_idMotivoBloqueioDocumento > 0
      AND (p_valorBloqueado > v_mot_valorBloqueado
        OR v_mot_situacaoLiberacao IN(' ','P','S'))
    THEN
      v_mot_dataBloqueio := p_dataBloqueio;
      v_mot_valorBloqueado := p_valorBloqueado;
      v_mot_situacaoLiberacao := CASE WHEN p_situacaoLiberacao = ' ' THEN 'P' ELSE p_situacaoLiberacao END;
      v_mot_observacoes := p_observacoes;
    END IF;
  END IF;
  IF r_idMotivoBloqueioDocumento > 0
    AND v_mot_situacaoLiberacao IN(' ','A','P','S')
  THEN
    DELETE MOMOTBLOQXLIBERACOES WHERE idMotivoBloqueioDocumento = r_idMotivoBloqueioDocumento;
  END IF;
  IF r_idMotivoBloqueioDocumento <= 0 THEN
    r_idMotivoBloqueioDocumento := FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOMOTIVOSBLOQUEIOS a USING (
    SELECT
      r_idMotivoBloqueioDocumento idMotivoBloqueioDocumento,
      p_origem origem,
      p_idCabecalho idCabecalho,
      p_tipoDocumento tipoDocumento,
      p_idDocumento idDocumento,
      p_estabelecimento estabelecimento,
      p_pessoa pessoa,
      p_cabecalhoItemPagamento cabecalhoItemPagamento,
      p_sequencia sequencia,
      p_condicaoPagamento condicaoPagamento,
      p_vendedor vendedor,
      p_gradeProduto gradeProduto,
      p_unidadeMedidaConversao unidadeMedidaConversao,
      p_quantidadeConvertida quantidadeConvertida,
      p_valorLiquido valorLiquido,
      p_motivoBloqueioDocumento motivoBloqueioDocumento,
      v_mot_dataBloqueio dataBloqueio,
      p_baseBloqueado baseBloqueado,
      p_valorBloqueado valorBloqueado,
      p_percentualBloqueado percentualBloqueado,
      v_mot_situacaoLiberacao situacaoLiberacao,
      v_mot_observacoes observacoes
    FROM DUAL) b ON (a.idMotivoBloqueioDocumento = b.idMotivoBloqueioDocumento)
  WHEN MATCHED THEN UPDATE SET
    a.origem = b.origem,
    a.idCabecalho = b.idCabecalho,
    a.tipoDocumento = b.tipoDocumento,
    a.idDocumento = b.idDocumento,
    a.estabelecimento = b.estabelecimento,
    a.pessoa = b.pessoa,
    a.cabecalhoItemPagamento = b.cabecalhoItemPagamento,
    a.sequencia = b.sequencia,
    a.condicaoPagamento = b.condicaoPagamento,
    a.vendedor = b.vendedor,
    a.gradeProduto = b.gradeProduto,
    a.unidadeMedidaConversao = b.unidadeMedidaConversao,
    a.quantidadeConvertida = b.quantidadeConvertida,
    a.valorLiquido = b.valorLiquido,
    a.motivoBloqueioDocumento = b.motivoBloqueioDocumento,
    a.dataBloqueio = b.dataBloqueio,
    a.baseBloqueado = b.baseBloqueado,
    a.valorBloqueado = b.valorBloqueado,
    a.percentualBloqueado = b.percentualBloqueado,
    a.situacaoLiberacao = b.situacaoLiberacao,
    a.observacoes = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idMotivoBloqueioDocumento,
    origem,
    idCabecalho,
    tipoDocumento,
    idDocumento,
    estabelecimento,
    pessoa,
    cabecalhoItemPagamento,
    sequencia,
    condicaoPagamento,
    vendedor,
    gradeProduto,
    unidadeMedidaConversao,
    quantidadeConvertida,
    valorLiquido,
    motivoBloqueioDocumento,
    dataBloqueio,
    baseBloqueado,
    valorBloqueado,
    percentualBloqueado,
    situacaoLiberacao,
    observacoes)
  VALUES (
    b.idMotivoBloqueioDocumento,
    b.origem,
    b.idCabecalho,
    b.tipoDocumento,
    b.idDocumento,
    b.estabelecimento,
    b.pessoa,
    b.cabecalhoItemPagamento,
    b.sequencia,
    b.condicaoPagamento,
    b.vendedor,
    b.gradeProduto,
    b.unidadeMedidaConversao,
    b.quantidadeConvertida,
    b.valorLiquido,
    b.motivoBloqueioDocumento,
    b.dataBloqueio,
    b.baseBloqueado,
    b.valorBloqueado,
    b.percentualBloqueado,
    b.situacaoLiberacao,
    b.observacoes);
  IF p_orcamento > 0 THEN
    ADD_MOTIVO_ORCAMENTO_CAB_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_orcamento);
  END IF;
  IF p_idItemOrcamento > 0 THEN
    ADD_MOTIVO_ORCAMENTO_ITE_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idItemOrcamento);
  END IF;
  IF p_idPagamentoOrcamento > 0 THEN
    ADD_MOTIVO_ORCAMENTO_PAG_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idPagamentoOrcamento);
  END IF;
  IF p_preDocumento > 0 THEN
    ADD_MOTIVO_PRE_DOC_CAB_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_preDocumento);
  END IF;
  IF p_idItemPreDocumento > 0 THEN
    ADD_MOTIVO_PRE_DOC_ITE_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idItemPreDocumento);
  END IF;
  IF p_idPagamentoPreDocumento > 0 THEN
    ADD_MOTIVO_PRE_DOC_PAG_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idPagamentoPreDocumento);
  END IF;
  IF p_idDocumentoFiscal > 0 THEN
    ADD_MOTIVO_DOC_FISC_CAB_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idDocumentoFiscal);
  END IF;
  IF p_idItemDocFiscal > 0 THEN
    ADD_MOTIVO_DOC_FISC_ITE_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idItemDocFiscal);
  END IF;
  IF p_idPagamentoDocFiscal > 0 THEN
    ADD_MOTIVO_DOC_FISC_PAG_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idPagamentoDocFiscal);
  END IF;
  IF p_idFinanceiro > 0 THEN
    ADD_MOTIVO_FINANCEIRO_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idFinanceiro);
  END IF;
  IF p_idPrevisaoFinanceira > 0 THEN
    ADD_MOTIVO_PREV_FINANC_GRAVA (
      p_estabelecimentoAtivo,
      r_idMotivoBloqueioDocumento,
      p_idPrevisaoFinanceira);
  END IF;
  IF p_situacaoLiberacao IN('L','N')
    AND p_usuarioLiberacao <> 0
  THEN
    ADD_MOTIVO_LIBERACAO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      r_idMotivoBloqueioDocumento,
      p_usuarioLiberacao,
      SYSDATE,
      p_valorBloqueado,
      p_percentualBloqueado,
      0,
      p_situacaoLiberacao,
      p_observacoesLiberacao,
      1,
      r_idLiberacao);
  END IF;
END ADD_MOTIVO_BLOQUEIO_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_MOT_ORCAMEN (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_idMotivoBloqueioDocumento NUMBER;
  v_auxNumber                 NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idMotivoBloqueioDocumento,
      b.cabecalhoItemPagamento,
      b.motivoBloqueioDocumento,
      b.dataBloqueio,
      b.baseBloqueado,
      b.valorBloqueado,
      b.percentualBloqueado,
      b.situacaoLiberacao,
      b.observacoes
    FROM MOMOTBLOQXORCAMENTOITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemOrcamento = p_idItemOrcamento)
  LOOP
    ADD_MOTIVO_BLOQUEIO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      'P',
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      CASE WHEN p_cab_documentoFiscal = 0 THEN p_cab_preDocumento ELSE p_cab_documentoFiscal END,
      p_cab_estabelecimento,
      CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
      a.cabecalhoItemPagamento,
      p_item_sequencia,
      0,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes,
      0,
      ' ',
      0,
      0,
      0,
      0,
      p_item_idItemPreDocumento,
      0,
      0,
      0,
      0,
      0,
      0,
      v_idMotivoBloqueioDocumento,
      v_auxNumber);
    ADD_MOTIVO_LIBERACAO_LIBERACAO (
      p_estabelecimentoAtivo,
      a.idMotivoBloqueioDocumento,
      v_idMotivoBloqueioDocumento);
  END LOOP;
END ADD_PRE_DOC_ITEM_MOT_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_MOT_ORCAMEN (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_idMotivoBloqueioDocumento NUMBER;
  v_auxNumber                 NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idMotivoBloqueioDocumento,
      b.cabecalhoItemPagamento,
      b.motivoBloqueioDocumento,
      b.dataBloqueio,
      b.baseBloqueado,
      b.valorBloqueado,
      b.percentualBloqueado,
      b.situacaoLiberacao,
      b.observacoes
    FROM MOMOTBLOQXORCAMENTOITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemOrcamento = p_idItemOrcamento)
  LOOP
    ADD_MOTIVO_BLOQUEIO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      'D',
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
      a.cabecalhoItemPagamento,
      p_item_sequencia,
      0,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes,
      0,
      ' ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      p_item_idItemDocFiscal,
      0,
      0,
      0,
      v_idMotivoBloqueioDocumento,
      v_auxNumber);
    ADD_MOTIVO_LIBERACAO_LIBERACAO (
      p_estabelecimentoAtivo,
      a.idMotivoBloqueioDocumento,
      v_idMotivoBloqueioDocumento);
  END LOOP;
END ADD_DOC_FISC_ITEM_MOT_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_MOT_PRE_DOC (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemPreDocumentoReferenc   IN NUMBER)
IS
  v_idMotivoBloqueioDocumento NUMBER;
  v_auxNumber                 NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idMotivoBloqueioDocumento,
      b.cabecalhoItemPagamento,
      b.motivoBloqueioDocumento,
      b.dataBloqueio,
      b.baseBloqueado,
      b.valorBloqueado,
      b.percentualBloqueado,
      b.situacaoLiberacao,
      b.observacoes
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemPreDocumento = p_idItemPreDocumentoReferenc)
  LOOP
    ADD_MOTIVO_BLOQUEIO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      'P',
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      CASE WHEN p_cab_documentoFiscal = 0 THEN p_cab_preDocumento ELSE p_cab_documentoFiscal END,
      p_cab_estabelecimento,
      CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
      a.cabecalhoItemPagamento,
      p_item_sequencia,
      0,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes,
      0,
      ' ',
      0,
      0,
      0,
      0,
      p_item_idItemPreDocumento,
      0,
      0,
      0,
      0,
      0,
      0,
      v_idMotivoBloqueioDocumento,
      v_auxNumber);
    ADD_MOTIVO_LIBERACAO_LIBERACAO (
      p_estabelecimentoAtivo,
      a.idMotivoBloqueioDocumento,
      v_idMotivoBloqueioDocumento);
  END LOOP;
END ADD_PRE_DOC_ITEM_MOT_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_MOT_PRE_DOC (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemPreDocumentoReferenc   IN NUMBER)
IS
  v_idMotivoBloqueioDocumento NUMBER;
  v_auxNumber                 NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idMotivoBloqueioDocumento,
      b.cabecalhoItemPagamento,
      b.motivoBloqueioDocumento,
      b.dataBloqueio,
      b.baseBloqueado,
      b.valorBloqueado,
      b.percentualBloqueado,
      b.situacaoLiberacao,
      b.observacoes
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemPreDocumento = p_idItemPreDocumentoReferenc)
  LOOP
    ADD_MOTIVO_BLOQUEIO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      'D',
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
      a.cabecalhoItemPagamento,
      p_item_sequencia,
      0,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes,
      0,
      ' ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      p_item_idItemDocFiscal,
      0,
      0,
      0,
      v_idMotivoBloqueioDocumento,
      v_auxNumber);
    ADD_MOTIVO_LIBERACAO_LIBERACAO (
      p_estabelecimentoAtivo,
      a.idMotivoBloqueioDocumento,
      v_idMotivoBloqueioDocumento);
  END LOOP;
END ADD_DOC_FISC_ITEM_MOT_PRE_DOC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_MOT_DOC_FIS (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemDocFiscalReferenciado  IN NUMBER)
IS
  v_idMotivoBloqueioDocumento NUMBER;
  v_auxNumber                 NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idMotivoBloqueioDocumento,
      b.cabecalhoItemPagamento,
      b.motivoBloqueioDocumento,
      b.dataBloqueio,
      b.baseBloqueado,
      b.valorBloqueado,
      b.percentualBloqueado,
      b.situacaoLiberacao,
      b.observacoes
    FROM MOMOTBLOQXDOCFISCALITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemDocFiscal = p_idItemDocFiscalReferenciado)
  LOOP
    ADD_MOTIVO_BLOQUEIO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      'P',
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      CASE WHEN p_cab_documentoFiscal = 0 THEN p_cab_preDocumento ELSE p_cab_documentoFiscal END,
      p_cab_estabelecimento,
      CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
      a.cabecalhoItemPagamento,
      p_item_sequencia,
      0,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes,
      0,
      ' ',
      0,
      0,
      0,
      0,
      p_item_idItemPreDocumento,
      0,
      0,
      0,
      0,
      0,
      0,
      v_idMotivoBloqueioDocumento,
      v_auxNumber);
    ADD_MOTIVO_LIBERACAO_LIBERACAO (
      p_estabelecimentoAtivo,
      a.idMotivoBloqueioDocumento,
      v_idMotivoBloqueioDocumento);
  END LOOP;
END ADD_PRE_DOC_ITEM_MOT_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_MOT_DOC_FIS (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemDocFiscalReferenciado  IN NUMBER)
IS
  v_idMotivoBloqueioDocumento NUMBER;
  v_auxNumber                 NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idMotivoBloqueioDocumento,
      b.cabecalhoItemPagamento,
      b.motivoBloqueioDocumento,
      b.dataBloqueio,
      b.baseBloqueado,
      b.valorBloqueado,
      b.percentualBloqueado,
      b.situacaoLiberacao,
      b.observacoes
    FROM MOMOTBLOQXDOCFISCALITENS a
    JOIN MOMOTIVOSBLOQUEIOS b
    ON b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento
    WHERE a.idItemDocFiscal = p_idItemDocFiscalReferenciado)
  LOOP
    ADD_MOTIVO_BLOQUEIO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      'D',
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
      a.cabecalhoItemPagamento,
      p_item_sequencia,
      0,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes,
      0,
      ' ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      p_item_idItemDocFiscal,
      0,
      0,
      0,
      v_idMotivoBloqueioDocumento,
      v_auxNumber);
    ADD_MOTIVO_LIBERACAO_LIBERACAO (
      p_estabelecimentoAtivo,
      a.idMotivoBloqueioDocumento,
      v_idMotivoBloqueioDocumento);
  END LOOP;
END ADD_DOC_FISC_ITEM_MOT_DOC_FIS;

/

create or replace PROCEDURE ADD_EVENTO_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_evento                 IN NUMBER,
  p_pessoa                 IN NUMBER,
  p_projeto                IN VARCHAR,
  p_orcamento              IN NUMBER,
  p_preDocumento           IN NUMBER,
  p_idDocumentoFiscal      IN NUMBER,
  p_idFinanceiro           IN NUMBER,
  p_separacao              IN NUMBER,
  p_balanco                IN NUMBER,
  p_documentoTransferencia IN NUMBER,
  p_idConserto             IN NUMBER,
  p_painelCompra           IN NUMBER,
  p_sessaoCaixa            IN VARCHAR,
  p_data                   IN DATE,
  p_usuario                IN NUMBER,
  p_sistema                IN NUMBER,
  p_tipoEvento             IN NUMBER,
  p_foneSms                IN VARCHAR,
  p_deEmail                IN VARCHAR,
  p_paraEmail              IN VARCHAR,
  p_comCopiaEmail          IN VARCHAR,
  p_comCopiaOcultaEmail    IN VARCHAR,
  p_assuntoEmailSms        IN VARCHAR,
  p_corpoEmail             IN VARCHAR,
  p_tipoArquivoAnexoA      IN NUMBER,
  p_arquivoAnexoA          IN VARCHAR,
  p_tipoArquivoAnexoB      IN NUMBER,
  p_arquivoAnexoB          IN VARCHAR,
  p_tipoArquivoAnexoC      IN NUMBER,
  p_arquivoAnexoC          IN VARCHAR,
  p_tipoArquivoAnexoD      IN NUMBER,
  p_arquivoAnexoD          IN VARCHAR,
  p_tipoArquivoAnexoE      IN NUMBER,
  p_arquivoAnexoE          IN VARCHAR,
  p_tipoArquivoAnexoF      IN NUMBER,
  p_arquivoAnexoF          IN VARCHAR,
  p_tipoArquivoAnexoG      IN NUMBER,
  p_arquivoAnexoG          IN VARCHAR,
  p_tipoArquivoAnexoH      IN NUMBER,
  p_arquivoAnexoH          IN VARCHAR,
  p_tipoArquivoAnexoI      IN NUMBER,
  p_arquivoAnexoI          IN VARCHAR,
  p_tipoArquivoAnexoJ      IN NUMBER,
  p_arquivoAnexoJ          IN VARCHAR,
  /* Retornos */
  r_evento                 OUT NUMBER)
IS
BEGIN
  r_evento := p_evento;
  IF r_evento <= 0 THEN
    r_evento := FUNC_ADD_BUSCA_PROXIMO_ID('MOEVENTOS', 'evento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOEVENTOS a USING (
    SELECT
      r_evento                 evento,
      p_pessoa                 pessoa,
      p_projeto                projeto,
      p_orcamento              orcamento,
      p_preDocumento           preDocumento,
      p_idDocumentoFiscal      idDocumentoFiscal,
      p_idFinanceiro           idFinanceiro,
      p_separacao              separacao,
      p_balanco                balanco,
      p_documentoTransferencia documentoTransferencia,
      p_idConserto             idConserto,
      p_painelCompra           painelCompra,
      p_sessaoCaixa            sessaoCaixa,
      p_data                   data,
      p_usuario                usuario,
      p_sistema                sistema,
      p_tipoEvento             tipoEvento,
      p_foneSms                foneSms,
      p_deEmail                deEmail,
      p_paraEmail              paraEmail,
      p_comCopiaEmail          comCopiaEmail,
      p_comCopiaOcultaEmail    comCopiaOcultaEmail,
      p_assuntoEmailSms        assuntoEmailSms,
      p_corpoEmail             corpoEmail,
      p_tipoArquivoAnexoA      tipoArquivoAnexoA,
      p_arquivoAnexoA          arquivoAnexoA,
      p_tipoArquivoAnexoB      tipoArquivoAnexoB,
      p_arquivoAnexoB          arquivoAnexoB,
      p_tipoArquivoAnexoC      tipoArquivoAnexoC,
      p_arquivoAnexoC          arquivoAnexoC,
      p_tipoArquivoAnexoD      tipoArquivoAnexoD,
      p_arquivoAnexoD          arquivoAnexoD,
      p_tipoArquivoAnexoE      tipoArquivoAnexoE,
      p_arquivoAnexoE          arquivoAnexoE,
      p_tipoArquivoAnexoF      tipoArquivoAnexoF,
      p_arquivoAnexoF          arquivoAnexoF,
      p_tipoArquivoAnexoG      tipoArquivoAnexoG,
      p_arquivoAnexoG          arquivoAnexoG,
      p_tipoArquivoAnexoH      tipoArquivoAnexoH,
      p_arquivoAnexoH          arquivoAnexoH,
      p_tipoArquivoAnexoI      tipoArquivoAnexoI,
      p_arquivoAnexoI          arquivoAnexoI,
      p_tipoArquivoAnexoJ      tipoArquivoAnexoJ,
      p_arquivoAnexoJ          arquivoAnexoJ
    FROM DUAL) b ON (a.evento = b.evento)
  WHEN MATCHED THEN UPDATE SET
    a.pessoa                 = b.pessoa,
    a.projeto                = b.projeto,
    a.orcamento              = b.orcamento,
    a.preDocumento           = b.preDocumento,
    a.idDocumentoFiscal      = b.idDocumentoFiscal,
    a.idFinanceiro           = b.idFinanceiro,
    a.separacao              = b.separacao,
    a.balanco                = b.balanco,
    a.documentoTransferencia = b.documentoTransferencia,
    a.idConserto             = b.idConserto,
    a.painelCompra           = b.painelCompra,
    a.sessaoCaixa            = b.sessaoCaixa,
    a.data                   = b.data,
    a.usuario                = b.usuario,
    a.sistema                = b.sistema,
    a.tipoEvento             = b.tipoEvento,
    a.foneSms                = b.foneSms,
    a.deEmail                = b.deEmail,
    a.paraEmail              = b.paraEmail,
    a.comCopiaEmail          = b.comCopiaEmail,
    a.comCopiaOcultaEmail    = b.comCopiaOcultaEmail,
    a.assuntoEmailSms        = b.assuntoEmailSms,
    a.corpoEmail             = b.corpoEmail,
    a.tipoArquivoAnexoA      = b.tipoArquivoAnexoA,
    a.arquivoAnexoA          = b.arquivoAnexoA,
    a.tipoArquivoAnexoB      = b.tipoArquivoAnexoB,
    a.arquivoAnexoB          = b.arquivoAnexoB,
    a.tipoArquivoAnexoC      = b.tipoArquivoAnexoC,
    a.arquivoAnexoC          = b.arquivoAnexoC,
    a.tipoArquivoAnexoD      = b.tipoArquivoAnexoD,
    a.arquivoAnexoD          = b.arquivoAnexoD,
    a.tipoArquivoAnexoE      = b.tipoArquivoAnexoE,
    a.arquivoAnexoE          = b.arquivoAnexoE,
    a.tipoArquivoAnexoF      = b.tipoArquivoAnexoF,
    a.arquivoAnexoF          = b.arquivoAnexoF,
    a.tipoArquivoAnexoG      = b.tipoArquivoAnexoG,
    a.arquivoAnexoG          = b.arquivoAnexoG,
    a.tipoArquivoAnexoH      = b.tipoArquivoAnexoH,
    a.arquivoAnexoH          = b.arquivoAnexoH,
    a.tipoArquivoAnexoI      = b.tipoArquivoAnexoI,
    a.arquivoAnexoI          = b.arquivoAnexoI,
    a.tipoArquivoAnexoJ      = b.tipoArquivoAnexoJ,
    a.arquivoAnexoJ          = b.arquivoAnexoJ
  WHEN NOT MATCHED THEN INSERT (
    evento,
    pessoa,
    projeto,
    orcamento,
    preDocumento,
    idDocumentoFiscal,
    idFinanceiro,
    separacao,
    balanco,
    documentoTransferencia,
    idConserto,
    painelCompra,
    sessaoCaixa,
    data,
    usuario,
    sistema,
    tipoEvento,
    foneSms,
    deEmail,
    paraEmail,
    comCopiaEmail,
    comCopiaOcultaEmail,
    assuntoEmailSms,
    corpoEmail,
    tipoArquivoAnexoA,
    arquivoAnexoA,
    tipoArquivoAnexoB,
    arquivoAnexoB,
    tipoArquivoAnexoC,
    arquivoAnexoC,
    tipoArquivoAnexoD,
    arquivoAnexoD,
    tipoArquivoAnexoE,
    arquivoAnexoE,
    tipoArquivoAnexoF,
    arquivoAnexoF,
    tipoArquivoAnexoG,
    arquivoAnexoG,
    tipoArquivoAnexoH,
    arquivoAnexoH,
    tipoArquivoAnexoI,
    arquivoAnexoI,
    tipoArquivoAnexoJ,
    arquivoAnexoJ)
  VALUES (
    b.evento,
    b.pessoa,
    b.projeto,
    b.orcamento,
    b.preDocumento,
    b.idDocumentoFiscal,
    b.idFinanceiro,
    b.separacao,
    b.balanco,
    b.documentoTransferencia,
    b.idConserto,
    b.painelCompra,
    b.sessaoCaixa,
    b.data,
    b.usuario,
    b.sistema,
    b.tipoEvento,
    b.foneSms,
    b.deEmail,
    b.paraEmail,
    b.comCopiaEmail,
    b.comCopiaOcultaEmail,
    b.assuntoEmailSms,
    b.corpoEmail,
    b.tipoArquivoAnexoA,
    b.arquivoAnexoA,
    b.tipoArquivoAnexoB,
    b.arquivoAnexoB,
    b.tipoArquivoAnexoC,
    b.arquivoAnexoC,
    b.tipoArquivoAnexoD,
    b.arquivoAnexoD,
    b.tipoArquivoAnexoE,
    b.arquivoAnexoE,
    b.tipoArquivoAnexoF,
    b.arquivoAnexoF,
    b.tipoArquivoAnexoG,
    b.arquivoAnexoG,
    b.tipoArquivoAnexoH,
    b.arquivoAnexoH,
    b.tipoArquivoAnexoI,
    b.arquivoAnexoI,
    b.tipoArquivoAnexoJ,
    b.arquivoAnexoJ);
END ADD_EVENTO_GRAVA;

/

create or replace PROCEDURE ADD_CONSERTO_CANCELA (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_idConserto                   IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      cliente,
      documentoTransferenciaLojaCd,
      documentoTransferenciaFornec,
      documentoTransferenciaCdLoja
    FROM MOCONSERTOS
    WHERE idConserto = p_idConserto
    AND situacaoConserto <> 'C')
  LOOP
    IF a.documentoTransferenciaLojaCd <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_estabelecimentoAtivo,
        a.documentoTransferenciaLojaCd,
        'C',
        'Cancelamento Automático.');
    END IF;
    IF a.documentoTransferenciaFornec <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_estabelecimentoAtivo,
        a.documentoTransferenciaFornec,
        'C',
        'Cancelamento Automático.');
    END IF;
    IF a.documentoTransferenciaCdLoja <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_estabelecimentoAtivo,
        a.documentoTransferenciaCdLoja,
        'C',
        'Cancelamento Automático.');
    END IF;
    ADD_EVENTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      a.cliente,
      ' ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      p_idConserto,
      0,
      0,
      SYSDATE,
      p_usuarioLogado,
      1,
      p_person_184_tipoEventoCancCon,
      ' ',
      ' ',
      ' ',
      ' ',
      ' ',
      'Cancelamento Automático.',
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      /* Retornos */
      v_auxNumber);
    UPDATE MOCONSERTOS
    SET situacaoConserto = 'C'
    WHERE idConserto = p_idConserto;
  END LOOP;
END ADD_CONSERTO_CANCELA;

/

DROP PROCEDURE ADD_MOFINANCEIROS_EXCLUICORREL;
DROP PROCEDURE ADD_MOFINANCEIROXBAIXAS_CORREL;
DROP PROCEDURE ADD_MOFINANCEIROS_AJUSTA_SALDO;
DROP PROCEDURE ADD_MOFINANCEIROS_VOLTA_SALDO;
DROP PROCEDURE ADD_MOFINANCEIROS_EXCLUI_LOOP;
DROP PROCEDURE ADD_MOFINANCEIROS_EXCLUI;
DROP PROCEDURE ADD_MOFINANCEIROXBAIXAS_EXCLUI;

create or replace PROCEDURE ADD_FINANC_EXCLUI_CORREL (
  p_idFinanceiro IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_FINANCEIRO_EXCLUI (
    p_idFinanceiro,
    0,
    v_auxNumber);
  -- Desvincula Financeiro
  UPDATE MOARQUIVOSCONCILIACOES a
  SET a.situacaoConciliacao = 'I'
  WHERE a.situacaoConciliacao = 'F'
  AND EXISTS (
    SELECT 1
    FROM MOCONCILIACOESCARTOES b
    WHERE b.idArquivoConciliacao = a.idArquivoConciliacao
    AND b.idFinanceiro = p_idFinanceiro);
  UPDATE MOARQUIVOCOBRANCAXFINANC SET
    idFinanceiro = 0,
    idBaixaFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOCONCILIACOESCARTOES SET
    idFinanceiro = 0,
    idBaixaFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOSPCREGISTROS
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOPREVFINANCXFINANCEIRO
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOTRANSACOESTEF
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOORCAMENTOXPAGAMENTOS
  SET idFinanceiroAdiantamento = 0
  WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  UPDATE MODOCUMENTOSTROCA
  SET idFinanceiroAdiantamento = 0
  WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  -- Exclui correlatos
  DELETE MOPREDOCUMXRESGATEPONTOS a
  WHERE EXISTS(
    SELECT 1
    FROM MOPONTUACOES b
    WHERE b.idPontuacao = a.idPontuacao
    AND b.idFinanceiro = p_idFinanceiro);
  DELETE MODOCFISCALXRESGATEPONTOS a
  WHERE EXISTS(
    SELECT 1
    FROM MOPONTUACOES b
    WHERE b.idPontuacao = a.idPontuacao
    AND b.idFinanceiro = p_idFinanceiro);
  DELETE MOPONTUACOES
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXBOLETO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCARTAO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCARTPROPRIO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCHEQUE
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXPIX
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXRATEIO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCOMISSOES
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXDOCUMENTOS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXARQUIVOS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MONEGDIVIDAXFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOREPARCXFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOHISTORICOCOBRANCA
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOEVENTOS
  WHERE idFinanceiro = p_idFinanceiro;
  -- Exclui correlatos com outra perna correlata que já deve ter sido excluída anteriormente
  DELETE MOFINANCEIROXCORRELATO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCORRELATO
  WHERE idFinanceiroCorrelato = p_idFinanceiro;
  DELETE MOFINANCEIROXBAIXAS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOBAIXAXNOVOFINANCEIRO
  WHERE idNovoFinanceiro = p_idFinanceiro;
  -- Exclui financeiro principal
  DELETE MOFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
END ADD_FINANC_EXCLUI_CORREL;

/

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

/

create or replace PROCEDURE ADD_FINANC_SALDO_AJUSTA (
  p_config_349_prazoValidadePont IN NUMBER,
  p_excluindo                    IN NUMBER,
  p_baixa_idBaixaFinanceiro      IN NUMBER,
  p_baixa_idFinanceiro           IN NUMBER,
  p_baixa_dataHora               IN DATE,
  p_baixa_cotacao                IN NUMBER,
  p_baixa_valorBrutoIndexado     IN NUMBER,
  p_baixa_valorBruto             IN NUMBER,
  p_baixa_valorTarifaCartao      IN NUMBER,
  /* Retornos */
  r_financ_saldo                 OUT NUMBER,
  r_financ_saldoIndexado         OUT NUMBER,
  r_financ_efetivado             OUT NUMBER)
IS
  v_idFinanceiro  NUMBER;
  v_cotacao       NUMBER;
  v_valorIndexado NUMBER;
  v_saldo         NUMBER;
  v_saldoIndexado NUMBER;
  v_efetivado     NUMBER;
BEGIN
  SELECT
    COALESCE(MAX(a.idFinanceiro),0),
    COALESCE(MAX(a.cotacao),0),
    COALESCE(MAX(a.valorIndexado),0),
    COALESCE(MAX(a.saldo),0),
    COALESCE(MAX(a.saldoIndexado),0)
  INTO
    v_idFinanceiro,
    v_cotacao,
    v_valorIndexado,
    v_saldo,
    v_saldoIndexado
  FROM (
    SELECT
      financ.idFinanceiro,
      financ.cotacao,
      financ.valorIndexado,
      ( financ.valor
        - COALESCE(tarifa.valorTarifaCartao,0)
        - COALESCE((
            SELECT SUM(
              CASE
                WHEN financ.cotacao = baixa.cotacao
                  OR financ.cotacao = 0
                  OR financ.valorIndexado = 0
                  OR baixa.valorBrutoIndexado = 0
                THEN baixa.valorBruto
                ELSE ROUND (baixa.valorBrutoIndexado * financ.cotacao,2)
              END
              + baixa.valorTarifaCartao)
            FROM MOFINANCEIROXBAIXAS baixa
            WHERE baixa.idFinanceiro = financ.idFinanceiro
            AND baixa.idBaixaFinanceiro <> p_baixa_idBaixaFinanceiro),0)) saldo,
      ( financ.valorIndexado
        - COALESCE((
            SELECT SUM(baixa.valorBrutoIndexado)
            FROM MOFINANCEIROXBAIXAS baixa
            WHERE baixa.idFinanceiro = financ.idFinanceiro
            AND baixa.idBaixaFinanceiro <> p_baixa_idBaixaFinanceiro),0)) saldoIndexado
    FROM MOFINANCEIROS financ
    LEFT JOIN MOFINANCEIROXCARTAO tarifa
    ON tarifa.idFinanceiro = financ.idFinanceiro
    WHERE financ.idFinanceiro = p_baixa_idFinanceiro) a;
  IF v_idFinanceiro > 0 THEN
    IF p_excluindo = 0 THEN
      IF v_cotacao = p_baixa_cotacao
        OR v_cotacao = 0
        OR v_valorIndexado  = 0
        OR p_baixa_valorBrutoIndexado = 0
      THEN
        v_saldo := v_saldo - p_baixa_valorBruto;
      ELSE
        v_saldo := v_saldo - ROUND(p_baixa_valorBrutoIndexado * v_cotacao,2);
      END IF;
      v_saldoIndexado := v_saldoIndexado - p_baixa_valorBrutoIndexado;
    END IF;
    IF v_saldo < 0 THEN
      v_saldo := 0;
    END IF;
    IF v_saldoIndexado < 0 THEN
      v_saldoIndexado := 0;
    END IF;
    v_efetivado := CASE WHEN v_saldo = 0 THEN 1 ELSE 0 END;
    UPDATE MOFINANCEIROS SET
      saldo = v_saldo,
      saldoIndexado = v_saldoIndexado,
      efetivado = v_efetivado
    WHERE idFinanceiro = p_baixa_idFinanceiro;
    IF v_efetivado = 1 AND p_excluindo = 0 THEN
      UPDATE MOPONTUACOES SET
        situacaoPontuacao = 'L',
        dataLiberacao = p_baixa_dataHora,
        vencimento =
          CASE
            WHEN p_baixa_dataHora IS NULL
            THEN NULL
            ELSE TRUNC(p_baixa_dataHora) + p_config_349_prazoValidadePont
          END
      WHERE idFinanceiro = p_baixa_idFinanceiro
      AND situacaoPontuacao = 'B';
    END IF;
  END IF;
  r_financ_saldo := v_saldo;
  r_financ_saldoIndexado := v_saldoIndexado;
  r_financ_efetivado := v_efetivado;
END ADD_FINANC_SALDO_AJUSTA;

/

create or replace PROCEDURE ADD_FINANC_SALDO_RETORNA (
  p_baixa_idFinanceiro       IN NUMBER,
  p_baixa_cotacao            IN NUMBER,
  p_baixa_valorBrutoIndexado IN NUMBER,
  p_baixa_valorBruto         IN NUMBER)
IS
  v_idFinanceiro  NUMBER;
  v_saldo         NUMBER;
  v_cotacao       NUMBER;
  v_valorIndexado NUMBER;
  v_saldoIndexado NUMBER;
BEGIN
  SELECT
    COALESCE(MAX(idFinanceiro),0),
    COALESCE(MAX(saldo),0),
    COALESCE(MAX(cotacao),0),
    COALESCE(MAX(valorIndexado),0),
    COALESCE(MAX(saldoIndexado),0)
  INTO
    v_idFinanceiro,
    v_saldo,
    v_cotacao,
    v_valorIndexado,
    v_saldoIndexado
  FROM MOFINANCEIROS
  WHERE idFinanceiro = p_baixa_idFinanceiro;
  IF v_idFinanceiro > 0 THEN
    UPDATE MOFINANCEIROS SET
      saldo = v_saldo
        + CASE
            WHEN v_cotacao = p_baixa_cotacao
              OR v_cotacao = 0
            THEN p_baixa_valorBruto
            ELSE ROUND(p_baixa_valorBrutoIndexado * v_cotacao,2)
          END,
      saldoIndexado = v_saldoIndexado + p_baixa_valorBrutoIndexado,
      efetivado = 0
    WHERE idFinanceiro = p_baixa_idFinanceiro;
  END IF;
END ADD_FINANC_SALDO_RETORNA;

/

create or replace PROCEDURE ADD_FINANC_EXCLUI_LOOP (
  p_idFinanceiro                 IN NUMBER,
  p_idsFinanceirosDesconsiderar  IN CLOB,
  p_idsBaixasDesconsiderar       IN CLOB,
  r_idsFinanceirosDesconsiderar  OUT CLOB,
  r_idsBaixasDesconsiderar       OUT CLOB)
IS
  v_auxNumber NUMBER;
BEGIN
  r_idsFinanceirosDesconsiderar := p_idsFinanceirosDesconsiderar;
  r_idsBaixasDesconsiderar := p_idsBaixasDesconsiderar;  
  -- Somente se não processou o financeiro ainda
  IF r_idsFinanceirosDesconsiderar IS NULL
    OR r_idsFinanceirosDesconsiderar = ' '
    OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(p_idFinanceiro,14,'0') || ',') = 0
  THEN
    IF r_idsFinanceirosDesconsiderar IS NULL
      OR r_idsFinanceirosDesconsiderar = ' '
    THEN
      r_idsFinanceirosDesconsiderar := LPAD(p_idFinanceiro,14,'0');
    ELSE
      r_idsFinanceirosDesconsiderar := r_idsFinanceirosDesconsiderar || ',' || LPAD(p_idFinanceiro,14,'0');
    END IF;
    FOR a IN (
      SELECT idFinanceiroCorrelato idFinanceiro
      FROM MOFINANCEIROXCORRELATO
      WHERE idFinanceiroCorrelato > 0
      AND idFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT idFinanceiro
      FROM MOFINANCEIROXCORRELATO
      WHERE idFinanceiro > 0
      AND idFinanceiroCorrelato = p_idFinanceiro
      UNION ALL
      SELECT a.idNovoFinanceiro idFinanceiro
      FROM MOBAIXAXNOVOFINANCEIRO a
      JOIN MOFINANCEIROXBAIXAS b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      WHERE a.idNovoFinanceiro > 0
      AND b.idFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT a.idFinanceiro
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXNOVOFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      WHERE a.idFinanceiro > 0
      AND b.idNovoFinanceiro = p_idFinanceiro
      AND a.baixaAutomatica = 1
      UNION ALL
      SELECT a.idFinanceiro
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      JOIN MOFINANCEIROXBAIXAS c
      ON c.idBaixaFinanceiro = b.idBaixaFinanceiroCorrel
      WHERE a.idFinanceiro > 0
      AND c.idFinanceiro = p_idFinanceiro
      AND a.baixaAutomatica = 1
      UNION ALL
      SELECT a.idFinanceiro
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
      JOIN MOFINANCEIROXBAIXAS c
      ON c.idBaixaFinanceiro = b.idBaixaFinanceiro
      WHERE a.idFinanceiro > 0
      AND c.idFinanceiro = p_idFinanceiro
      AND a.baixaAutomatica = 1)
    LOOP
      IF r_idsFinanceirosDesconsiderar IS NULL
        OR r_idsFinanceirosDesconsiderar = ' '
        OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0
      THEN
        ADD_FINANC_EXCLUI_LOOP (
          a.idFinanceiro,
          r_idsFinanceirosDesconsiderar,
          r_idsBaixasDesconsiderar,
          r_idsFinanceirosDesconsiderar,
          r_idsBaixasDesconsiderar);
      END IF;
    END LOOP;
    FOR a IN (
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      WHERE a.idBaixaFinanceiro > 0
      AND a.idFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXNOVOFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      WHERE a.idBaixaFinanceiro > 0
      AND b.idNovoFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      JOIN MOFINANCEIROXBAIXAS c
      ON c.idBaixaFinanceiro = b.idBaixaFinanceiroCorrel
      WHERE a.idBaixaFinanceiro > 0
      AND c.idFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
      JOIN MOFINANCEIROXBAIXAS c
      ON c.idBaixaFinanceiro = b.idBaixaFinanceiro
      WHERE a.idBaixaFinanceiro > 0
      AND c.idFinanceiro = p_idFinanceiro)
    LOOP
      -- Somente se não processou a baixa ainda
      IF r_idsBaixasDesconsiderar IS NULL
        OR r_idsBaixasDesconsiderar = ' '
        OR INSTR(',' || r_idsBaixasDesconsiderar || ',', ',' || LPAD(a.idBaixaFinanceiro,14,'0') || ',') = 0
      THEN
        IF r_idsBaixasDesconsiderar IS NULL
          OR r_idsBaixasDesconsiderar = ' '
        THEN
          r_idsBaixasDesconsiderar := LPAD(a.idBaixaFinanceiro,14,'0');
        ELSE
          r_idsBaixasDesconsiderar := r_idsBaixasDesconsiderar || ',' || LPAD(a.idBaixaFinanceiro,14,'0');
        END IF;
        -- Se não excluiu Financeiro, volta Saldo
        IF r_idsFinanceirosDesconsiderar IS NULL
          OR r_idsFinanceirosDesconsiderar = ' '
          OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0
        THEN
          ADD_FINANC_SALDO_AJUSTA (
            0, -- p_config_349_prazoValidadePont
            1, -- p_excluindo
            a.idBaixaFinanceiro,
            a.idFinanceiro,
            a.data,
            a.cotacao,
            a.valorBrutoIndexado,
            a.valorBruto,
            a.valorTarifaCartao,
            v_auxNumber, -- r_financ_saldo
            v_auxNumber, -- r_financ_saldoIndexado
            v_auxNumber); -- r_financ_efetivado
        END IF;
        ADD_FINANC_BAIXA_EXCLUI_CORREL (a.idBaixaFinanceiro);
      END IF;
    END LOOP;
    ADD_FINANC_EXCLUI_CORREL (p_idFinanceiro);
  END IF;
END ADD_FINANC_EXCLUI_LOOP;

/

create or replace PROCEDURE ADD_FINANC_EXCLUI (
  p_idFinanceiro IN NUMBER)
IS
  v_auxCLOB CLOB;
BEGIN
  v_auxCLOB := NULL;
  ADD_FINANC_EXCLUI_LOOP (
    p_idFinanceiro,
    v_auxCLOB,
    v_auxCLOB,
    v_auxCLOB,
    v_auxCLOB);
END ADD_FINANC_EXCLUI;

/

create or replace PROCEDURE ADD_FINANC_BAIXA_EXCLUI (
  p_idBaixaFinanceiro IN NUMBER)
IS
  v_idsFinanceirosDesconsiderar CLOB;
  v_idsBaixasDesconsiderar      CLOB;
  v_auxNumber                   NUMBER;
BEGIN
  v_idsFinanceirosDesconsiderar := ' ';
  v_idsBaixasDesconsiderar := ' '; 
  FOR a IN (
    SELECT a.idNovoFinanceiro idFinanceiro
    FROM MOBAIXAXNOVOFINANCEIRO a
    WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
    AND a.baixaAutomatica = 1)
  LOOP
    IF v_idsFinanceirosDesconsiderar IS NULL
      OR v_idsFinanceirosDesconsiderar = ' '
      OR INSTR(',' || v_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0
    THEN
      ADD_FINANC_EXCLUI_LOOP (
        a.idFinanceiro,
        v_idsFinanceirosDesconsiderar,
        v_idsBaixasDesconsiderar,
        v_idsFinanceirosDesconsiderar,
        v_idsBaixasDesconsiderar);
    END IF;
  END LOOP;
  FOR a IN (
    SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      WHERE b.idBaixaFinanceiroCorrel = p_idBaixaFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
      WHERE b.idBaixaFinanceiro = p_idBaixaFinanceiro)
  LOOP
    -- Somente se não processou a baixa ainda
    IF v_idsBaixasDesconsiderar IS NULL
      OR v_idsBaixasDesconsiderar = ' '
      OR INSTR(',' || v_idsBaixasDesconsiderar || ',', ',' || LPAD(a.idBaixaFinanceiro,14,'0') || ',') = 0
    THEN
      IF v_idsBaixasDesconsiderar IS NULL
        OR v_idsBaixasDesconsiderar = ' '
      THEN
        v_idsBaixasDesconsiderar := LPAD(a.idBaixaFinanceiro,14,'0');
      ELSE
        v_idsBaixasDesconsiderar := v_idsBaixasDesconsiderar || ',' || LPAD(a.idBaixaFinanceiro,14,'0');
      END IF;
      -- Se não excluiu Financeiro, volta Saldo
      IF v_idsFinanceirosDesconsiderar IS NULL
        OR v_idsFinanceirosDesconsiderar = ' '
        OR INSTR(',' || v_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0
      THEN
        ADD_FINANC_SALDO_AJUSTA (
          0, -- p_config_349_prazoValidadePont
          1, -- p_excluindo
          a.idBaixaFinanceiro,
          a.idFinanceiro,
          a.data,
          a.cotacao,
          a.valorBrutoIndexado,
          a.valorBruto,
          a.valorTarifaCartao,
          v_auxNumber, -- r_financ_saldo
          v_auxNumber, -- r_financ_saldoIndexado
          v_auxNumber); -- r_financ_efetivado
      END IF;
      ADD_FINANC_BAIXA_EXCLUI_CORREL (a.idBaixaFinanceiro);
    END IF;
  END LOOP;
END ADD_FINANC_BAIXA_EXCLUI;

/

DROP PROCEDURE ADD_MODOCTROCAXITENS_EXCLUI;

create or replace PROCEDURE ADD_DOCTROCA_ITEM_EXCLUI (
  p_idItemDocTroca IN NUMBER)
IS
  v_quantidade              NUMBER;
  v_idItemPreDocumentoSaida NUMBER;
  v_idItemDocFiscalSaida    NUMBER;
  v_idEstoque               NUMBER;
