SET DEFINE OFF;

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
  CURSOR c_estoqueExcluir IS 
    SELECT id
    FROM MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_idItemDocFiscal
    ORDER BY id;
  CURSOR c_item IS 
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    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 PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23;
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdProdutoFilho := CASE WHEN (v_bufferIdProdutoFilho IS NULL OR v_bufferIdProdutoFilho = '' OR v_bufferIdProdutoFilho = ' ') THEN '' ELSE RTRIM (v_bufferIdProdutoFilho) || ';' END || TO_CHAR (LPAD(estoqueExcluir.id,14,'0'));
    DELETE MODOCFISCALXPRODUTOFILHO a WHERE a.id = estoqueExcluir.id;
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_DOC_FISC_ITEM_FIL_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      item.atualizaCustoMedio,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemPreDocumento           IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
  CURSOR c_estoqueExcluir IS 
    SELECT id
    FROM MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_idItemPreDocumento
    ORDER BY id;
  CURSOR c_item IS 
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    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 PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F');
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdProdutoFilho := CASE WHEN (v_bufferIdProdutoFilho IS NULL OR v_bufferIdProdutoFilho = '' OR v_bufferIdProdutoFilho = ' ') THEN '' ELSE RTRIM (v_bufferIdProdutoFilho) || ';' END || TO_CHAR (LPAD(estoqueExcluir.id,14,'0'));
    DELETE MOPREDOCUMXPRODUTOFILHO a WHERE a.id = estoqueExcluir.id;
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_PRE_DOC_ITEM_FIL_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      item.atualizaCustoMedio,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_FIL_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idDocumentoFiscal            IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
  CURSOR c_estoqueExcluir IS
    SELECT a.id
    FROM MODOCFISCALXPRODUTOFILHO a
    JOIN MODOCFISCALXITENS b
    ON b.idItemDocFiscal = a.idItemDocFiscal
    WHERE b.idDocumentoFiscal = p_idDocumentoFiscal
    ORDER BY a.id;
  CURSOR c_item
  IS 
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    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 PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23;
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdProdutoFilho := CASE WHEN (v_bufferIdProdutoFilho IS NULL OR v_bufferIdProdutoFilho = '' OR v_bufferIdProdutoFilho = ' ') THEN '' ELSE RTRIM (v_bufferIdProdutoFilho) || ';' END || TO_CHAR (LPAD(estoqueExcluir.id,14,'0'));
    DELETE MODOCFISCALXPRODUTOFILHO a WHERE a.id = estoqueExcluir.id;
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_DOC_FISC_ITEM_FIL_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      item.atualizaCustoMedio,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_DOC_FISC_CAB_FIL_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_FIL_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_preDocumento                 IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
  CURSOR c_estoqueExcluir IS
    SELECT a.id
    FROM MOPREDOCUMXPRODUTOFILHO a
    JOIN MOPREDOCUMXITENS b
    ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    ORDER BY a.id;
  CURSOR c_item
  IS 
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    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 PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F');
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdProdutoFilho := CASE WHEN (v_bufferIdProdutoFilho IS NULL OR v_bufferIdProdutoFilho = '' OR v_bufferIdProdutoFilho = ' ') THEN '' ELSE RTRIM (v_bufferIdProdutoFilho) || ';' END || TO_CHAR (LPAD(estoqueExcluir.id,14,'0'));
    DELETE MOPREDOCUMXPRODUTOFILHO a WHERE a.id = estoqueExcluir.id;
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_PRE_DOC_ITEM_FIL_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      item.atualizaCustoMedio,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_PRE_DOC_CAB_FIL_ATUALIZA;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataInicial                  IN DATE,
    p_dataFinal                    IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_retornarPrecoBruto           IN NUMBER,
    p_especial                     IN NUMBER -- 1 = Gerando Inventário
    )
  RETURN NUMBER
IS 
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  -- Data / Preço Inventário
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((CASE WHEN itemEst.precoUnitarioUltimaCompra < 0 THEN 0 ELSE itemEst.precoUnitarioUltimaCompra * 10000000 END),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE itemEst.precoUnitarioUltimaCompra > 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >=
      CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal)
    + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
    - CASE WHEN p_especial = 1 THEN 1 ELSE 0 END
    AND (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 = invEst.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 = invEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))) a;
  -- Preço pós Inventário
  SELECT COALESCE ((
    SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
    FROM (
      SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
        || LPAD(((CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END
        ) * 10000000),15,'0') dataPreco,
        CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END preco
      FROM MODOCFISCALXITENS item
      JOIN CAGRADESPRODUTO grad
      ON grad.gradeProduto = item.gradeProduto
      JOIN MODOCUMENTOSFISCAIS doc
      ON doc.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.cancelado = 0
      AND grad.produto = p_gradProd_produto
      AND (item.quantidade = 0
        AND item.precoUnitario > 0
        OR item.quantidade > 0
        AND item.valorProdutoServico > CASE WHEN p_retornarPrecoBruto = 1 THEN 0 ELSE item.valorDescontoTotal END)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_cor = 0
        OR grad.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' '
        OR grad.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR item.personalizacao = p_item_personalizacao)
      AND doc.entradaSaida = 'E'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.situacaoDocumentoFiscal IN (21,22,23)
      AND doc.atualizaUltimaCompra = 1
      AND doc.dataEntradaSaida >=
        CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND doc.dataEntradaSaida < TRUNC(p_dataFinal)+1
      AND (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 = doc.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 = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)))
      GROUP BY
        COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000'),
        item.idDocumentoFiscal
      UNION ALL
      SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
        || LPAD(((CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END
        ) * 10000000),15,'0') dataPreco,
        CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END preco
      FROM MOPREDOCUMXITENS item
      JOIN CAGRADESPRODUTO grad
      ON grad.gradeProduto = item.gradeProduto
      JOIN MOPREDOCUMENTOS doc
      ON doc.preDocumento = item.preDocumento
      WHERE item.cancelado = 0
      AND grad.produto = p_gradProd_produto
      AND (item.quantidade = 0
        AND item.precoUnitario > 0
        OR item.quantidade > 0
        AND item.valorProdutoServico > CASE WHEN p_retornarPrecoBruto = 1 THEN 0 ELSE item.valorDescontoTotal END)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_cor = 0
        OR grad.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' '
        OR grad.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR item.personalizacao = p_item_personalizacao)
      AND doc.entradaSaida = 'E'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.statusPreDocumento IN ('A','F')
      AND doc.atualizaUltimaCompra = 1
      AND doc.dataEntradaSaida >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      AND (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 = doc.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 = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)))
      GROUP BY
        COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000'),
        item.preDocumento) a
    WHERE a.preco > 0
  ),0)
  INTO v_preco
  FROM DUAL;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (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 = preco.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 = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO(
    p_config_209_filtrarGrupoEcon IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_dataInicial                 IN DATE,
    p_dataFinal                   IN DATE,
    p_item_personalizacao         IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_gradProd_cor                IN NUMBER,
    p_gradProd_tamanho            IN VARCHAR,
    p_especial                     IN NUMBER -- 1 = Gerando Inventário
    )
  RETURN NUMBER
IS
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoCustoUltimaFormacao * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE itemEst.precoCustoUltimaFormacao > 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >= CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal)
      + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      - CASE WHEN p_especial = 1 THEN 1 ELSE 0 END
    AND (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 = invEst.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 = invEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))) a;
  SELECT COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO v_preco
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(data,'YYYYMMDD'),'19000101')
      || LPAD((novoPrecoCusto * 10000000),15,'0'))) ordenacao
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    and novoPrecoCusto > 0
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR personalizacao = p_item_personalizacao)
    AND data >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
    AND data < TRUNC(p_dataFinal) + 1
    AND ativo = 1) a;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.precoCustoInicial > 0
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = preco.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAESTABELECIMENTOS est2
      ON est2.estabelecimento = p_estabelecimento
      JOIN CAPESSOAS pessEst2
      ON pessEst2.pessoa = est2.pessoaEstabelecimento
      WHERE preco.produto = p_gradProd_produto
      AND preco.precoCustoInicial > 0
      AND preco.ativo = 1
      AND (p_config_209_filtrarGrupoEcon = 0
        AND est.pessoaEstabelecimento = est2.pessoaEstabelecimento
        OR p_config_209_filtrarGrupoEcon = 1
        AND pessEst.grupoEconomico = pessEst2.grupoEconomico);
    END IF;  
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.precoCustoInicial > 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  IF v_preco = 0 THEN
    SELECT
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
      COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
    INTO
      v_dataInventario,
      v_precoInventario
    FROM (
      SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
        || LPAD((itemEst.precoUnitarioUltimaCompra * 10000000),15,'0'))) ordenacao
      FROM MOINVENTARIOESTOQUEXITENS itemEst
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemEst.inventarioEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemEst.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE itemEst.precoUnitarioUltimaCompra > 0
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' '
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR itemEst.personalizacao = p_item_personalizacao)
      AND invEst.data >= CASE
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
    SELECT COALESCE ((
      SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
      FROM (
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MODOCFISCALXITENS item
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = item.gradeProduto
        JOIN MODOCUMENTOSFISCAIS doc
        ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        WHERE item.cancelado = 0
        AND grad.produto = p_gradProd_produto
        AND item.precoUnitario > CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR tamanho = p_gradProd_tamanho)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
        AND (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 = doc.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 = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))
        UNION ALL
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MOPREDOCUMXITENS item
        JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
        JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
        WHERE item.cancelado = 0
        AND grad.produto = p_gradProd_produto
        AND item.precoUnitario > CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR tamanho = p_gradProd_tamanho)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
        AND (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 = doc.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 = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))) a),0)
    INTO v_preco
    FROM DUAL;    
    IF v_preco = 0 THEN
      v_preco := v_precoInventario;
    END IF;
    IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = p_estabelecimento
      AND preco.precoUltimaCompraInicial > 0
      AND preco.ativo = 1;  
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.precoUltimaCompraInicial > 0
        AND preco.ativo = 1
        AND (p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR 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 = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)));
      END IF;
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.estabelecimento = 0
        AND preco.precoUltimaCompraInicial > 0
        AND preco.ativo = 1;
      END IF;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace PROCEDURE ADD_GERA_TEMP_COMPRAS_VENDAS (
  p_uniqueMachineID              IN VARCHAR2,
  p_contadorSessao               IN NUMBER,
  p_originalEstabelec            IN CHAR,
  p_compraVendaPedcomprOrcamento IN CHAR,
  p_diaMesTotal                  IN CHAR,
  p_periodoInicial               IN DATE,
  p_periodoFinal                 IN DATE,
  p_inEstabelecimentos           IN VARCHAR2,
  p_inLocaisEstoque              IN VARCHAR2,
  p_joinProdutos                 IN VARCHAR2,
  p_andWhereProdutos             IN VARCHAR2,
  p_joinDocumentos               IN VARCHAR2,
  p_andWhereDocumentos           IN VARCHAR2)
IS
BEGIN
  DELETE TEMPCOMPRASVENDAS
  WHERE  uniqueMachineID = p_uniqueMachineID
  AND contadorSessao = p_contadorSessao;
  EXECUTE IMMEDIATE
    CASE
      -- MOPREDOCUMENTOS // MODOCUMENTOSFISCAIS
      WHEN p_compraVendaPedcomprOrcamento IN ('C','V')
      THEN 'INSERT INTO TEMPCOMPRASVENDAS (
    uniqueMachineID,
    contadorSessao,
    gradeProduto,
    estabelecimento,
    localEstoque,
    periodoInicial,
    periodoFinal,
    quantidade)
  SELECT
    ''' || CASE WHEN p_uniqueMachineID IS NULL OR p_uniqueMachineID = ' ' THEN ' ' ELSE RTRIM(p_uniqueMachineID) END || ''',
    ' || TO_CHAR(p_contadorSessao) || ',
    a.gradeProduto,
    a.estabelecimento,
    a.localEstoque,
    ' || CASE p_diaMesTotal WHEN 'D' THEN 'TRUNC(a.dataEntradaSaida)' WHEN 'M' THEN 'TRUNC(a.dataEntradaSaida,''MM'')' ELSE 'TO_DATE(''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')' END || ' periodoInicial,
    ' || CASE p_diaMesTotal WHEN 'D' THEN 'TRUNC(a.dataEntradaSaida)' WHEN 'M' THEN 'TRUNC(LAST_DAY(a.dataEntradaSaida))' ELSE 'TO_DATE(''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')' END || ' periodoFinal,
    SUM(a.quantidade) quantidade
  FROM (
    SELECT DISTINCT
      item.idItemPreDocumento id,
      item.idItemPreDocumento id2,
      item.gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemPreDocumento > 0
    AND item.cancelado = 0
    AND item.geraFinanceiro = 1
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.statusPreDocumento IN (''A'',''F'')
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      item.idItemDocFiscal id,
      item.idItemDocFiscal id2,
      item.gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemDocFiscal > 0
    AND item.cancelado = 0
    AND item.geraFinanceiro = 1
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.situacaoDocumentoFiscal IN (21,22,23)
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      docXEst.idItemPreDocumento id,
      item.idEstoque id2,
      item.gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM MOESTOQUES item
    JOIN MOPREDOCUMXESTOQUE docXEst ON docXEst.idEstoque = item.idEstoque
    JOIN MOPREDOCUMXITENS itemDoc ON itemDoc.idItemPreDocumento = docXEst.idItemPreDocumento
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = itemDoc.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE docXEst.idItemPreDocumento > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 1
    AND itemDoc.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.statusPreDocumento IN (''A'',''F'')
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      docXEst.idItemDocFiscal id,
      item.idEstoque id2,
      item.gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM MOESTOQUES item
    JOIN MODOCFISCALXESTOQUE docXEst ON docXEst.idEstoque = item.idEstoque
    JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE docXEst.idItemDocFiscal > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 1
    AND itemDoc.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.situacaoDocumentoFiscal IN (21,22,23)
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      item.idItemPreDocumento id,
      kit.id id2,
      kit.gradeProdutoFilho gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      kit.quantidade * item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN MOPREDOCUMXITENS item ON item.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = kit.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemPreDocumento > 0
    AND item.cancelado = 0
    AND item.movimentaEstoque = 0
    AND item.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.statusPreDocumento IN (''A'',''F'')
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      item.idItemDocFiscal id,
      kit.id id2,
      kit.gradeProdutoFilho gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      kit.quantidade * item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN MODOCFISCALXITENS item ON item.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = kit.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemDocFiscal > 0
    AND item.cancelado = 0
    AND item.movimentaEstoque = 0
    AND item.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.situacaoDocumentoFiscal IN (21,22,23)
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
  ) a
  GROUP BY
    a.gradeProduto,
    a.estabelecimento,
    a.localEstoque'
    || CASE p_diaMesTotal
        WHEN 'D'
        THEN ',
    TRUNC(a.dataEntradaSaida),
    TRUNC(a.dataEntradaSaida)'
        WHEN 'M'
        THEN ',
    TRUNC(a.dataEntradaSaida,''MM''),
    TRUNC(LAST_DAY(a.dataEntradaSaida))'
        ELSE ''
      END
      -- MOORCAMENTOS
      ELSE 'INSERT INTO TEMPCOMPRASVENDAS (
    uniqueMachineID,
    contadorSessao,
    gradeProduto,
    estabelecimento,
    localEstoque,
    periodoInicial,
    periodoFinal,
    quantidade)
  SELECT
    ''' || CASE WHEN p_uniqueMachineID IS NULL OR p_uniqueMachineID = ' ' THEN ' ' ELSE RTRIM(p_uniqueMachineID) END || ''',
    ' || TO_CHAR(p_contadorSessao) || ',
    a.gradeProduto,
    a.estabelecimento,
    a.localEstoque,
    ' || CASE p_diaMesTotal WHEN 'D' THEN 'TRUNC(a.dataEntrega)' WHEN 'M' THEN 'TRUNC(a.dataEntrega,''MM'')' ELSE 'TO_DATE(''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')' END || ' periodoInicial,
    ' || CASE p_diaMesTotal WHEN 'D' THEN 'TRUNC(a.dataEntrega)' WHEN 'M' THEN 'TRUNC(LAST_DAY(a.dataEntrega))' ELSE 'TO_DATE(''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')' END || ' periodoFinal,
    SUM(a.quantidadeSaldo) quantidade
  FROM (
    SELECT DISTINCT
      item.idItemOrcamento id,
      item.idItemOrcamento id2,
      item.gradeProduto,
      doc.estabelecimento,
      item.localEstoque,
      doc.dataEntrega,
      item.quantidadeSaldo
    FROM MOORCAMENTOXITENS item
    JOIN MOORCAMENTOS doc ON doc.orcamento = item.orcamento
    JOIN PAETAPASORCAMENTO etap ON etap.etapaOrcamento = doc.etapaOrcamento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemOrcamento > 0
    AND item.cancelado = 0
    AND item.geraFinanceiro = 1
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'P' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'P' THEN 'E' ELSE 'S' END || '''
    AND etap.situacaoOrcamento = 60
    AND TRUNC(doc.dataEntrega) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND doc.estabelecimento = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(doc.estabelecimento)) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      docXEst.idItemOrcamento id,
      item.idReservaEstoque id2,
      item.gradeProduto,
      doc.estabelecimento,
      item.localEstoque,
      doc.dataEntrega,
      item.quantidadeSaldo
    FROM MORESERVASESTOQUE item
    JOIN MOORCAMENTOXRESERVAESTOQ docXEst ON docXEst.idReservaEstoque = item.idReservaEstoque
    JOIN MOORCAMENTOXITENS itemDoc ON itemDoc.idItemOrcamento = docXEst.idItemOrcamento
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MOORCAMENTOS doc ON doc.orcamento = itemDoc.orcamento
    JOIN PAETAPASORCAMENTO etap ON etap.etapaOrcamento = doc.etapaOrcamento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE docXEst.idItemOrcamento > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 1
    AND itemDoc.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'P' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'P' THEN 'E' ELSE 'S' END || '''
    AND etap.situacaoOrcamento = 60
    AND TRUNC(doc.dataEntrega) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND doc.estabelecimento = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(doc.estabelecimento)) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
  ) a
  GROUP BY
    a.gradeProduto,
    a.estabelecimento,
    a.localEstoque'
    || CASE p_diaMesTotal
        WHEN 'D'
        THEN ',
    TRUNC(a.dataEntrega),
    TRUNC(a.dataEntrega)'
        WHEN 'M'
        THEN ',
    TRUNC(a.dataEntrega,''MM''),
    TRUNC(LAST_DAY(a.dataEntrega))'
        ELSE ''
      END
    END;
END ADD_GERA_TEMP_COMPRAS_VENDAS;

/

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);
  CURSOR c_estoqueExcluir
  IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MOPREDOCUMXESTOQUE b ON b.idEstoque = a.idEstoque
    WHERE b.idItemPreDocumento = p_idItemPreDocumento
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    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');
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (estoqueExcluir.idEstoque);
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.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,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.casasDecimaisUnidadeMedida,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_ITEM_EST_ATUALIZA;

/

DECLARE
  config_209_filtrarGrupoEcon  NUMBER;
  config_362_calcCustoPorGrade NUMBER;
  v_contador                   NUMBER;
  v_auxAlpha                   VARCHAR2 (32000);
  CURSOR c_item IS 
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    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 PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idDocumentoFiscal > 0
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23
    AND (prod.controleEstoque = 12
      AND item.idFormulaTinta > 0
      OR prod.controleEstoque IN (3,4));
BEGIN
  config_209_filtrarGrupoEcon  := CASE WHEN FUNC_ADD_BUSCA_CONFIG (209,0,0,0) = 'S' THEN 1 ELSE 0 END;
  config_362_calcCustoPorGrade := CASE WHEN FUNC_ADD_BUSCA_CONFIG (209,0,0,0) = 'S' THEN 1 ELSE 0 END;
  v_contador                   := 0;
  DELETE MODOCFISCALXPRODUTOFILHO WHERE id > 0;
  FOR item IN c_item
  LOOP
    ADD_DOC_FISC_ITEM_FIL_GRAVA(
      config_209_filtrarGrupoEcon,
      config_362_calcCustoPorGrade,
      '',
      0,
      item.atualizaCustoMedio,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      v_auxAlpha);
    v_contador := v_contador + 1;
    IF v_contador = 100 THEN
      v_contador := 0;
      COMMIT;
    END IF;  
  END LOOP;
  IF v_contador > 0 THEN
    COMMIT;
  END IF;  
END;

/

DECLARE
  config_209_filtrarGrupoEcon  NUMBER;
  config_362_calcCustoPorGrade NUMBER;
  v_contador                   NUMBER;
  v_auxAlpha                   VARCHAR2 (32000);
  CURSOR c_item IS 
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    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 PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.preDocumento > 0
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F')
    AND (prod.controleEstoque = 12
      AND item.idFormulaTinta > 0
      OR prod.controleEstoque IN (3,4));
BEGIN
  config_209_filtrarGrupoEcon  := CASE WHEN FUNC_ADD_BUSCA_CONFIG (209,0,0,0) = 'S' THEN 1 ELSE 0 END;
  config_362_calcCustoPorGrade := CASE WHEN FUNC_ADD_BUSCA_CONFIG (209,0,0,0) = 'S' THEN 1 ELSE 0 END;
  v_contador                   := 0;
  DELETE MOPREDOCUMXPRODUTOFILHO WHERE id > 0;
  FOR item IN c_item
  LOOP
    ADD_PRE_DOC_ITEM_FIL_GRAVA(
      config_209_filtrarGrupoEcon,
      config_362_calcCustoPorGrade,
      '',
      0,
      item.atualizaCustoMedio,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      v_auxAlpha);
    v_contador := v_contador + 1;
    IF v_contador = 100 THEN
      v_contador := 0;
      COMMIT;
    END IF;  
  END LOOP;
  IF v_contador > 0 THEN
    COMMIT;
  END IF;  
END;

/

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (142, '46', '46 - AmoH', 204, 1, 46, ' ');

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (403, 'Ao trocar cliente, sugerir vendedor do cadastro', 1, 30001, 'A', '256', 'P', 0, 'N', ' ', ' ');

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (143, 'N', 'Não', 403, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (144, 'S', 'Sim', 403, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (145, 'P', 'Perguntar', 403, 1, 3, ' ');

COMMIT;

UPDATE SIUNIDADESMEDIDA SET casasDecimaisUnidadeMedida = 1 WHERE unidadeMedida = 'CX';

COMMIT;

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2023002008, '2023.2.8', TO_DATE('07/03/2023','DD/MM/YYYY'), 1, 1, sysdate, ' ');

COMMIT;

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

/*
*/